#!/usr/bin/env python # -*- coding: utf-8 -*- """ نظام واهبي للذكاء الاصطناعي لتحليل العقود والمناقصات تطبيق Streamlit الرئيسي الذي يجمع جميع الوحدات والمكونات """ import os import sys import streamlit as st import pandas as pd import numpy as np # تهيئة حالة الجلسة لكل وحدات النظام if 'page' not in st.session_state: st.session_state.page = 'home' if 'analysis_type' not in st.session_state: st.session_state.analysis_type = None if 'show_document_upload' not in st.session_state: st.session_state.show_document_upload = False if 'report_type' not in st.session_state: st.session_state.report_type = None if 'show_report_form' not in st.session_state: st.session_state.show_report_form = False if 'analysis_result' not in st.session_state: st.session_state.analysis_result = None if 'current_document' not in st.session_state: st.session_state.current_document = None if 'current_document_text' not in st.session_state: st.session_state.current_document_text = None if 'loaded_files' not in st.session_state: st.session_state.loaded_files = [] if 'notifications' not in st.session_state: st.session_state.notifications = [] # وظيفة لتهيئة حزم NLTK المطلوبة عند بدء التطبيق def initialize_nltk_resources(): """تنزيل وتهيئة موارد NLTK المطلوبة""" try: # محاولة تنزيل حزم NLTK الأساسية import nltk # تحديد المسار المخصص لتنزيل NLTK data nltk_data_path = os.path.join(os.path.expanduser("~"), "nltk_data") os.makedirs(nltk_data_path, exist_ok=True) nltk.data.path.append(nltk_data_path) # قائمة بالحزم المطلوبة required_packages = ['punkt', 'stopwords', 'wordnet', 'omw-1.4'] for package in required_packages: try: if package == 'punkt': nltk.data.find('tokenizers/punkt') elif package == 'stopwords': nltk.data.find('corpora/stopwords') elif package == 'wordnet': nltk.data.find('corpora/wordnet') else: nltk.data.find(f'corpora/{package}') except LookupError: print(f"تنزيل حزمة NLTK: {package}") nltk.download(package, download_dir=nltk_data_path, quiet=False) print("تم تهيئة موارد NLTK بنجاح.") except Exception as e: print(f"خطأ في تهيئة NLTK: {e}") st.error(f"حدث خطأ أثناء تهيئة موارد NLTK: {e}") # تهيئة موارد NLTK عند بدء التطبيق initialize_nltk_resources() # مسار نسبي للملفات الثابتة (للتأكد من العمل في بيئات مختلفة) def get_static_path(file_path): """مسار ملف ثابت يعمل سواء كان التشغيل من المجلد الرئيسي أو من المجلد الفرعي""" # قائمة المسارات المحتملة possible_paths = [ # المسار المباشر (في حالة تشغيل التطبيق من نفس المجلد) file_path, # المسار النسبي من مجلد التطبيق (tender-analysis-system) os.path.join(os.path.dirname(__file__), file_path), # المسار النسبي من المجلد الأعلى os.path.join(os.path.dirname(os.path.dirname(__file__)), "tender-analysis-system", file_path), ] # اختبار كل مسار محتمل for path in possible_paths: if os.path.exists(path): return path # إذا لم يتم العثور على الملف، إعادة المسار الأصلي return file_path # إعداد إعدادات الصفحة try: st.set_page_config( page_title="نظام WAHBi للذكاء الاصطناعي | التعاقدات والمناقصات", page_icon="📊", layout="wide", initial_sidebar_state="expanded" ) except Exception as e: print(f"خطأ في إعداد الصفحة: {e}") # يحدث هذا غالبًا عند استخدام st.set_page_config أكثر من مرة # استيراد ملفات CSS الجديدة try: # تحديد مسارات الملفات main_css_path = get_static_path("utils/css/main.css") rtl_css_path = get_static_path("utils/css/rtl.css") enhanced_css_path = get_static_path("utils/css/enhanced.css") # تحميل ملف CSS الرئيسي if os.path.exists(main_css_path): with open(main_css_path, "r", encoding='utf-8') as f: main_css = f.read() st.markdown(f"", unsafe_allow_html=True) print(f"تم تحميل ملف CSS الرئيسي بنجاح من: {main_css_path}") else: print(f"تعذر العثور على ملف CSS الرئيسي: {main_css_path}") # تحميل ملف دعم الاتجاه من اليمين إلى اليسار if os.path.exists(rtl_css_path): with open(rtl_css_path, "r", encoding='utf-8') as f: rtl_css = f.read() st.markdown(f"", unsafe_allow_html=True) print(f"تم تحميل ملف CSS للتوجيه RTL بنجاح من: {rtl_css_path}") else: print(f"تعذر العثور على ملف CSS للتوجيه RTL: {rtl_css_path}") # تحميل ملف التحسينات المتقدمة if os.path.exists(enhanced_css_path): with open(enhanced_css_path, "r", encoding='utf-8') as f: enhanced_css = f.read() st.markdown(f"", unsafe_allow_html=True) print(f"تم تحميل ملف CSS المحسن بنجاح من: {enhanced_css_path}") else: print(f"تعذر العثور على ملف CSS المحسن: {enhanced_css_path}") except Exception as e: st.warning(f"حدث خطأ أثناء تحميل ملفات CSS: {str(e)}") print(f"خطأ في تحميل ملفات CSS: {str(e)}") # إضافة Font Awesome وأي أصول خارجية أخرى st.markdown(""" """, unsafe_allow_html=True) # إضافة CSS المخصص st.markdown(""" """, unsafe_allow_html=True) # استيراد المكونات والوحدات from utils.components.sidebar import render_sidebar from utils.helpers import create_directory_if_not_exists, get_data_folder # استيراد وحدات التطبيق from modules.pricing.pricing_app import PricingApp from modules.projects.projects_app import ProjectsApp from modules.resources.resources_app import ResourcesApp from modules.risk_assessment.risk_assessment_app import RiskAssessmentApp from modules.project_tracker.tracker_app import TrackerApp from modules.maps.maps_app import MapsApp from modules.notifications.notifications_app import NotificationsApp from modules.voice_narration.voice_narration_app import VoiceNarrationApp from modules.achievements.achievements_app import AchievementsApp from modules.ai_finetuning.finetuning_app import FinetuningApp from modules.document_comparison.comparison_app import DocumentComparisonApp from modules.document_analysis.document_analysis_app import DocumentAnalysisApp # إنشاء مجلدات البيانات الضرورية create_directory_if_not_exists(get_data_folder()) create_directory_if_not_exists(os.path.join(get_data_folder(), "projects")) create_directory_if_not_exists(os.path.join(get_data_folder(), "documents")) create_directory_if_not_exists(os.path.join(get_data_folder(), "analysis")) def main(): """الدالة الرئيسية للتطبيق""" # تقديم الشريط الجانبي وتلقي الوحدة المختارة selected_module = render_sidebar() # إذا كان المستخدم غير مصرح له، قم بإظهار شاشة تسجيل الدخول if "is_authenticated" in st.session_state and not st.session_state.is_authenticated: render_login_screen() return # إظهار الوحدة المختارة if selected_module == "الرئيسية": render_homepage() elif selected_module == "إدارة المشاريع": projects_app = ProjectsApp() projects_app.render() elif selected_module == "التسعير المتكاملة": pricing_app = PricingApp() pricing_app.render() elif selected_module == "الموارد والتكاليف": resources_app = ResourcesApp() resources_app.render() elif selected_module == "تحليل المستندات": # استخدام فئة تحليل المستندات الكاملة document_analysis_app = DocumentAnalysisApp() document_analysis_app.render() elif selected_module == "مقارنة المستندات": # تقديم واجهة مقارنة المستندات comparison_app = DocumentComparisonApp() comparison_app.render() elif selected_module == "تقييم مخاطر العقود": risk_app = RiskAssessmentApp() risk_app.render() elif selected_module == "التقارير والتحليلات": # تقديم واجهة التقارير والتحليلات render_reports_and_analytics() elif selected_module == "متتبع حالة المشروع": tracker_app = TrackerApp() tracker_app.render() elif selected_module == "خريطة المشاريع": maps_app = MapsApp() maps_app.render() elif selected_module == "نظام الإشعارات": notifications_app = NotificationsApp() notifications_app.render() elif selected_module == "الترجمة الصوتية": voice_app = VoiceNarrationApp() voice_app.render() elif selected_module == "نظام الإنجازات": achievements_app = AchievementsApp() achievements_app.render() elif selected_module == "المساعد الذكي": # تقديم واجهة المساعد الذكي render_ai_assistant() elif selected_module == "ضبط نماذج الذكاء الاصطناعي": finetuning_app = FinetuningApp() finetuning_app.render() else: st.error("الوحدة المطلوبة غير موجودة") def render_login_screen(): """عرض شاشة تسجيل الدخول""" st.markdown("

نظام WAHBi للذكاء الاصطناعي

", unsafe_allow_html=True) st.markdown("""

تسجيل الدخول

يرجى إدخال بيانات الاعتماد الخاصة بك للوصول إلى النظام.

""", unsafe_allow_html=True) col1, col2, col3 = st.columns([1, 2, 1]) with col2: username = st.text_input("اسم المستخدم") password = st.text_input("كلمة المرور", type="password") if st.button("تسجيل الدخول"): # تنفيذ منطق المصادقة if username == "admin" and password == "admin": # بيانات اعتماد مؤقتة للتطوير st.session_state.is_authenticated = True st.session_state.user_info = { "id": 1, "username": "admin", "full_name": "مدير النظام", "email": "admin@example.com", "role": "مدير", "department": "الإدارة", "last_login": "2023-01-01 09:00:00" } st.rerun() else: st.error("اسم المستخدم أو كلمة المرور غير صحيحة") st.markdown("""

نظام WAHBi للذكاء الاصطناعي © 2025 شركة شبه الجزيرة للمقاولات

جميع الحقوق محفوظة

""", unsafe_allow_html=True) def render_homepage(): """عرض الصفحة الرئيسية للتطبيق""" st.markdown("

نظام WAHBi للذكاء الاصطناعي

", unsafe_allow_html=True) st.markdown("
نظام متكامل لتحليل العقود والمناقصات باستخدام تقنيات الذكاء الاصطناعي المتقدمة
", unsafe_allow_html=True) # عرض مؤشرات الأداء الرئيسية col1, col2, col3, col4 = st.columns(4) with col1: st.markdown("""
24
المناقصات النشطة
+3 هذا الشهر
""", unsafe_allow_html=True) with col2: st.markdown("""
8
مشاريع قيد التنفيذ
+2 هذا الشهر
""", unsafe_allow_html=True) with col3: st.markdown("""
12
مستندات قيد التحليل
65% مكتمل
""", unsafe_allow_html=True) with col4: st.markdown("""
5
تنبيهات تتطلب الاهتمام
-2 آخر أسبوع
""", unsafe_allow_html=True) # عرض المشاريع الأخيرة والوصول السريع col1, col2 = st.columns([2, 1]) with col1: st.markdown("### المناقصات الأخيرة") st.markdown("""
إنشاء طريق سريع بمنطقة الرياض
رقم المناقصة: TR-2025-134
الجهة المالكة: وزارة النقل
تاريخ الإغلاق: 15 أبريل 2025
85%
نسبة الإنجاز
متوسطة
المخاطر
مرتفعة
الأولوية
تطوير شبكة الصرف الصحي بالمنطقة الشرقية
رقم المناقصة: WS-2025-089
الجهة المالكة: وزارة المياه
تاريخ الإغلاق: 22 أبريل 2025
62%
نسبة الإنجاز
مرتفعة
المخاطر
مرتفعة
الأولوية
بناء 3 مدارس بمنطقة مكة المكرمة
رقم المناقصة: ED-2025-112
الجهة المالكة: وزارة التعليم
تاريخ الإغلاق: 5 مايو 2025
38%
نسبة الإنجاز
منخفضة
المخاطر
متوسطة
الأولوية
""", unsafe_allow_html=True) with col2: st.markdown("### الوصول السريع") st.markdown("""
تحليل مستند جديد حساب تكاليف مشروع تقييم مخاطر العقد استعراض خريطة المشاريع إنشاء تقارير تحليلية
""", unsafe_allow_html=True) st.markdown("### آخر التنبيهات") st.markdown("""
انتهاء موعد تقديم المناقصة
مشروع إنشاء الطريق السريع - متبقي 3 أيام
منذ 2 ساعة
تغيير في شروط المناقصة
تم تحديث مستندات مشروع شبكة الصرف الصحي
منذ 5 ساعات
إكمال تحليل المستند
اكتمل تحليل عقد بناء المدارس بنجاح
منذ يوم واحد
""", unsafe_allow_html=True) # معلومات حول النظام st.markdown("---") st.markdown("""

حول النظام

نظام WAHBi للذكاء الاصطناعي هو نظام متكامل لتحليل العقود والمناقصات وإدارة المشاريع، مصمم خصيصاً لشركات المقاولات والبناء. يستخدم النظام تقنيات الذكاء الاصطناعي المتقدمة لتحليل المستندات واستخراج المعلومات المهمة وتقييم المخاطر ودعم اتخاذ القرار.

""", unsafe_allow_html=True) # معلومات الشركة st.markdown("""

هذا النظام يعمل لشركة شبه الجزيرة للمقاولات

جميع الحقوق محفوظة 2025

""", unsafe_allow_html=True) # تم حذف دالة render_document_analysis() لأن الوظيفة أصبحت منفذة عبر كلاس DocumentAnalysisApp # التحليلات الأخيرة st.markdown("### التحليلات الأخيرة") st.markdown("""
اسم المستند نوع التحليل تاريخ التحليل الحالة الإجراءات
عقد إنشاء طريق سريع
PDF، 2.4 MB
تحليل شامل 2025-03-25 مكتمل
جداول كميات مشروع صرف صحي
XLSX، 1.7 MB
تحليل جداول الكميات 2025-03-23 مكتمل
شروط وأحكام عقد بناء مدارس
PDF، 1.1 MB
تحليل الشروط والأحكام 2025-03-20 مكتمل
ملحق عقد مشروع كباري
PDF، 890 KB
تحليل شامل 2025-03-18 قيد المعالجة
""", unsafe_allow_html=True) # إحصائيات التحليل st.markdown("### إحصائيات التحليل") col1, col2 = st.columns(2) with col1: st.markdown("""

توزيع أنواع المستندات

عقود ومناقصات
45%
جداول كميات
30%
شروط وأحكام
15%
مستندات أخرى
10%
""", unsafe_allow_html=True) with col2: st.markdown("""

إحصائيات التحليل الشهرية

42
مستند تم تحليله
38
تحليل ناجح
4
تحليل غير مكتمل

متوسط وقت المعالجة

تحليل شامل
2:30
جداول الكميات
1:45
الشروط والأحكام
2:00
""", unsafe_allow_html=True) def render_reports_and_analytics(): """عرض واجهة التقارير والتحليلات""" st.markdown("

التقارير والتحليلات

", unsafe_allow_html=True) st.markdown("""

استخدم هذه الوحدة لإنشاء تقارير تحليلية متقدمة عن المشاريع والمناقصات والأداء العام. يوفر النظام رؤى وتحليلات متعمقة تساعدك على فهم أداء مشاريعك وتحسين عمليات صنع القرار.

""", unsafe_allow_html=True) # أنواع التقارير st.markdown("### أنواع التقارير") col1, col2, col3 = st.columns(3) with col1: st.markdown("""
تقارير المشاريع

تقارير تفصيلية عن حالة المشاريع وتقدمها ومؤشرات الأداء الرئيسية والمشكلات المحتملة.

""", unsafe_allow_html=True) if st.button("إنشاء تقرير", key="btn_project_report"): # هنا سيتم استدعاء وحدة إنشاء تقارير المشاريع st.session_state.report_type = "project" st.session_state.show_report_form = True st.rerun() with col2: st.markdown("""
تقارير الأداء المالي

تحليل مالي للمشاريع يتضمن الإيرادات والتكاليف والأرباح والتدفقات النقدية والانحرافات عن الميزانية.

""", unsafe_allow_html=True) if st.button("إنشاء تقرير", key="btn_financial_report"): # هنا سيتم استدعاء وحدة إنشاء تقارير الأداء المالي st.session_state.report_type = "financial" st.session_state.show_report_form = True st.rerun() with col3: st.markdown("""
تقارير المناقصات

تحليل شامل للمناقصات النشطة والمنتهية ونسب الفوز والمنافسين ومقارنة الأسعار.

""", unsafe_allow_html=True) if st.button("إنشاء تقرير", key="btn_tender_report"): # هنا سيتم استدعاء وحدة إنشاء تقارير المناقصات st.session_state.report_type = "tender" st.session_state.show_report_form = True st.rerun() # لوحة البيانات st.markdown("### لوحة البيانات التنفيذية") col1, col2 = st.columns([2, 1]) with col1: st.markdown("#### أداء المشاريع حسب القطاع") # إنشاء بيانات تجريبية للرسم البياني sectors = ['البنية التحتية', 'السكني', 'التعليمي', 'الصحي', 'النقل'] performance = [85, 72, 64, 90, 78] # إنشاء رسم بياني شريطي chart_data = pd.DataFrame({'القطاع': sectors, 'الأداء (%)': performance}) st.bar_chart(chart_data.set_index('القطاع'), use_container_width=True) # عرض بيان توضيحي st.caption("مقارنة أداء المشاريع عبر القطاعات المختلفة (نسبة الإنجاز)") with col2: st.markdown("#### المؤشرات الرئيسية") # نسبة المشاريع المتأخرة st.markdown("##### نسبة المشاريع المتأخرة") delayed_projects = 15 st.progress(delayed_projects / 100) st.markdown(f"

{delayed_projects}%

", unsafe_allow_html=True) # متوسط هامش الربح st.markdown("##### متوسط هامش الربح") profit_margin = 22 st.progress(profit_margin / 100) st.markdown(f"

{profit_margin}%

", unsafe_allow_html=True) # معدل نجاح المناقصات st.markdown("##### معدل نجاح المناقصات") tender_success = 35 st.progress(tender_success / 100) st.markdown(f"

{tender_success}%

", unsafe_allow_html=True) # تقارير الأداء st.markdown("### تقارير الأداء الأخيرة") # التقرير الأول with st.container(): col1, col2 = st.columns([3, 1]) with col1: st.markdown("#### التقرير الشهري لمشاريع الربع الأول 2025") st.markdown("تقرير شامل يوضح أداء جميع المشاريع النشطة خلال الربع الأول من عام 2025، بما في ذلك تحليل التكاليف والجدول الزمني والمخاطر.") st.markdown("**تاريخ الإنشاء:** 15 مارس 2025") with col2: st.markdown("
", unsafe_allow_html=True) # إضافة مسافة col2_1, col2_2 = st.columns(2) with col2_1: if st.button("عرض", key="view_report1"): st.session_state.view_report = "quarterly_q1_2025" st.session_state.show_report_viewer = True with col2_2: if st.button("تنزيل", key="download_report1"): st.info("جاري تحميل التقرير...") st.markdown("---") # التقرير الثاني with st.container(): col1, col2 = st.columns([3, 1]) with col1: st.markdown("#### تحليل أداء المناقصات 2024-2025") st.markdown("تحليل مقارن لنتائج المناقصات بين عامي 2024 و 2025، يوضح التحسن في معدلات النجاح وتحليل أسباب الخسارة وفرص التحسين.") st.markdown("**تاريخ الإنشاء:** 28 فبراير 2025") with col2: st.markdown("
", unsafe_allow_html=True) # إضافة مسافة col2_1, col2_2 = st.columns(2) with col2_1: if st.button("عرض", key="view_report2"): st.session_state.view_report = "tenders_analysis_2024_2025" st.session_state.show_report_viewer = True with col2_2: if st.button("تنزيل", key="download_report2"): st.info("جاري تحميل التقرير...") st.markdown("---") # التقرير الثالث with st.container(): col1, col2 = st.columns([3, 1]) with col1: st.markdown("#### تقرير المخاطر المالية للمشاريع الجارية") st.markdown("تقرير تفصيلي حول المخاطر المالية للمشاريع الجارية، بما في ذلك تحليل التدفقات النقدية والمستحقات المتأخرة والمطالبات المحتملة.") st.markdown("**تاريخ الإنشاء:** 10 فبراير 2025") with col2: st.markdown("
", unsafe_allow_html=True) # إضافة مسافة col2_1, col2_2 = st.columns(2) with col2_1: if st.button("عرض", key="view_report3"): st.session_state.view_report = "financial_risks_2025" st.session_state.show_report_viewer = True with col2_2: if st.button("تنزيل", key="download_report3"): st.info("جاري تحميل التقرير...") def render_ai_assistant(): """عرض واجهة المساعد الذكي باستخدام المكون الجديد""" try: from modules.ai_assistant.assistant_app import AssistantApp # عرض العنوان والوصف st.markdown("

المساعد الذكي

", unsafe_allow_html=True) st.markdown("""

المساعد الذكي هو واجهة تفاعلية مدعومة بتقنيات الذكاء الاصطناعي لمساعدتك في جميع أنشطة إدارة المشاريع والعقود. يمكنك طرح أسئلة بلغتك الطبيعية والحصول على إجابات فورية، أو طلب مساعدة في مهام محددة مثل تحليل بنود العقد أو تقدير التكاليف.

""", unsafe_allow_html=True) # استدعاء المساعد الذكي الجديد ai_assistant = AssistantApp() ai_assistant.render() except Exception as e: st.error(f"حدث خطأ في تحميل المساعد الذكي: {str(e)}") st.markdown("""

😞 عذراً، واجهنا مشكلة في تحميل المساعد الذكي

يرجى المحاولة مرة أخرى لاحقاً أو التواصل مع فريق الدعم الفني إذا استمرت المشكلة.

""", unsafe_allow_html=True) # تشغيل التطبيق عند تنفيذ الملف مباشرة if __name__ == "__main__": main()