# -*- coding: utf-8 -*- """ خدمة استخراج البنود من المستندات هذا الملف يحتوي على الفئة المسؤولة عن استخراج البنود والجداول من المستندات. """ import os import logging class ItemExtractor: """فئة استخراج البنود من المستندات""" def __init__(self, config=None): """ تهيئة مستخرج البنود المعلمات: config (dict): إعدادات مستخرج البنود """ self.config = config or {} self.logger = logging.getLogger(__name__) def extract(self, file_path): """ استخراج البنود من ملف المعلمات: file_path (str): مسار الملف العوائد: list: قائمة البنود المستخرجة """ self.logger.info(f"جاري استخراج البنود من الملف: {file_path}") try: # في البيئة الحقيقية، استخدم تحليل متقدم للمستند # محاكاة الاستخراج للعرض file_name = os.path.basename(file_path) # تحديد نوع الملف _, ext = os.path.splitext(file_path) ext = ext.lower() if ext == '.pdf': return self._extract_items_from_pdf(file_path) elif ext in ('.doc', '.docx'): return self._extract_items_from_docx(file_path) else: return [{"بند": "نوع الملف غير مدعوم", "قيمة": 0}] except Exception as e: self.logger.error(f"خطأ في استخراج البنود: {str(e)}") return [{"بند": "حدث خطأ أثناء الاستخراج", "قيمة": 0, "خطأ": str(e)}] def _extract_items_from_pdf(self, file_path): """ استخراج البنود من ملف PDF المعلمات: file_path (str): مسار ملف PDF العوائد: list: قائمة البنود المستخرجة """ # في البيئة الحقيقية، استخدم تحليل متقدم للمستند # محاكاة الاستخراج للعرض return [ {"بند": "أعمال الخرسانة", "وحدة": "م3", "كمية": 250, "سعر الوحدة": 1200, "الإجمالي": 300000}, {"بند": "أعمال التشطيبات", "وحدة": "م2", "كمية": 1500, "سعر الوحدة": 350, "الإجمالي": 525000}, {"بند": "أعمال الكهرباء", "وحدة": "نقطة", "كمية": 120, "سعر الوحدة": 200, "الإجمالي": 24000}, {"بند": "أعمال السباكة", "وحدة": "نقطة", "كمية": 75, "سعر الوحدة": 300, "الإجمالي": 22500}, {"بند": "أعمال الألمنيوم", "وحدة": "م2", "كمية": 85, "سعر الوحدة": 1500, "الإجمالي": 127500} ] def _extract_items_from_docx(self, file_path): """ استخراج البنود من ملف Word المعلمات: file_path (str): مسار ملف Word العوائد: list: قائمة البنود المستخرجة """ # في البيئة الحقيقية، استخدم تحليل متقدم للمستند # محاكاة الاستخراج للعرض return [ {"بند": "استشارات هندسية", "وحدة": "ساعة", "كمية": 120, "سعر الوحدة": 500, "الإجمالي": 60000}, {"بند": "تصميم معماري", "وحدة": "م2", "كمية": 1800, "سعر الوحدة": 100, "الإجمالي": 180000}, {"بند": "تصميم إنشائي", "وحدة": "م2", "كمية": 1800, "سعر الوحدة": 80, "الإجمالي": 144000}, {"بند": "تصميم كهربائي", "وحدة": "م2", "كمية": 1800, "سعر الوحدة": 40, "الإجمالي": 72000}, {"بند": "تصميم ميكانيكي", "وحدة": "م2", "كمية": 1800, "سعر الوحدة": 40, "الإجمالي": 72000} ] def extract_tables(self, document): """ استخراج الجداول من مستند المعلمات: document (dict): المستند المحلل العوائد: list: قائمة الجداول المستخرجة """ self.logger.info("جاري استخراج الجداول من المستند") try: # في البيئة الحقيقية، استخدم تحليل متقدم للمستند # محاكاة الاستخراج للعرض return [ { "عنوان": "جدول البنود والتكاليف", "بيانات": [ {"بند": "أعمال الخرسانة", "وحدة": "م3", "كمية": 250, "سعر الوحدة": 1200, "الإجمالي": 300000}, {"بند": "أعمال التشطيبات", "وحدة": "م2", "كمية": 1500, "سعر الوحدة": 350, "الإجمالي": 525000}, {"بند": "أعمال الكهرباء", "وحدة": "نقطة", "كمية": 120, "سعر الوحدة": 200, "الإجمالي": 24000}, {"بند": "أعمال السباكة", "وحدة": "نقطة", "كمية": 75, "سعر الوحدة": 300, "الإجمالي": 22500}, {"بند": "أعمال الألمنيوم", "وحدة": "م2", "كمية": 85, "سعر الوحدة": 1500, "الإجمالي": 127500} ] }, { "عنوان": "جدول المعلومات العامة", "بيانات": [ {"اسم المشروع": "مبنى سكني", "المالك": "شركة الإسكان", "الموقع": "الرياض", "المساحة": "2500 م2"}, {"اسم المشروع": "مبنى تجاري", "المالك": "شركة التطوير", "الموقع": "جدة", "المساحة": "3500 م2"} ] } ] except Exception as e: self.logger.error(f"خطأ في استخراج الجداول: {str(e)}") return [{"عنوان": "حدث خطأ أثناء الاستخراج", "بيانات": []}]