#!/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 للذكاء الاصطناعي © 2025 شركة شبه الجزيرة للمقاولات
جميع الحقوق محفوظة
نظام WAHBi للذكاء الاصطناعي هو نظام متكامل لتحليل العقود والمناقصات وإدارة المشاريع، مصمم خصيصاً لشركات المقاولات والبناء. يستخدم النظام تقنيات الذكاء الاصطناعي المتقدمة لتحليل المستندات واستخراج المعلومات المهمة وتقييم المخاطر ودعم اتخاذ القرار.
هذا النظام يعمل لشركة شبه الجزيرة للمقاولات
جميع الحقوق محفوظة 2025
اسم المستند | نوع التحليل | تاريخ التحليل | الحالة | الإجراءات |
---|---|---|---|---|
عقد إنشاء طريق سريع
|
تحليل شامل | 2025-03-25 | مكتمل | |
جداول كميات مشروع صرف صحي
|
تحليل جداول الكميات | 2025-03-23 | مكتمل | |
شروط وأحكام عقد بناء مدارس
|
تحليل الشروط والأحكام | 2025-03-20 | مكتمل | |
ملحق عقد مشروع كباري
|
تحليل شامل | 2025-03-18 | قيد المعالجة |
استخدم هذه الوحدة لإنشاء تقارير تحليلية متقدمة عن المشاريع والمناقصات والأداء العام. يوفر النظام رؤى وتحليلات متعمقة تساعدك على فهم أداء مشاريعك وتحسين عمليات صنع القرار.
تقارير تفصيلية عن حالة المشاريع وتقدمها ومؤشرات الأداء الرئيسية والمشكلات المحتملة.
تحليل مالي للمشاريع يتضمن الإيرادات والتكاليف والأرباح والتدفقات النقدية والانحرافات عن الميزانية.
تحليل شامل للمناقصات النشطة والمنتهية ونسب الفوز والمنافسين ومقارنة الأسعار.
{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("المساعد الذكي هو واجهة تفاعلية مدعومة بتقنيات الذكاء الاصطناعي لمساعدتك في جميع أنشطة إدارة المشاريع والعقود. يمكنك طرح أسئلة بلغتك الطبيعية والحصول على إجابات فورية، أو طلب مساعدة في مهام محددة مثل تحليل بنود العقد أو تقدير التكاليف.
يرجى المحاولة مرة أخرى لاحقاً أو التواصل مع فريق الدعم الفني إذا استمرت المشكلة.