WAHBi-AI-V2 / app.py
EGYADMIN's picture
Update app.py
25257a4 verified
raw
history blame
9.87 kB
"""
نظام تحليل المناقصات وسلاسل الإمداد والتوقعات المستقبلية
تطبيق خاص بشركة شبه الجزيرة للمقاولات
مهندس التطوير: م. تامر الجوهري
"""
import os
import sys
import yaml
import json
import logging
from datetime import datetime
from pathlib import Path
import streamlit as st
# إعداد الصفحة مسبقًا (يجب أن يكون هذا أول أمر في Streamlit)
st.set_page_config(
page_title="نظام تحليل المناقصات - شركة شبه الجزيرة للمقاولات",
page_icon="📊",
layout="wide",
initial_sidebar_state="expanded",
)
# استيراد باقي المكتبات (بعد set_page_config)
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
# إضافة المجلد الرئيسي للمسار
current_dir = Path(__file__).parent
sys.path.append(str(current_dir))
# استيراد المكونات الضرورية
from web.pages.home import show_home_page
from web.pages.tender_analysis import show_tender_analysis
from web.pages.requirements_analysis import show_requirements_analysis
from web.pages.cost_estimation import show_cost_estimation
from web.pages.risk_analysis import show_risk_analysis
from web.pages.timeline import show_timeline
from web.pages.local_content import show_local_content
from web.pages.supply_chain import show_supply_chain
from web.pages.procurement import show_procurement
from web.pages.vendors import show_vendors
from web.pages.future_projects import show_future_projects
from web.pages.success_prediction import show_success_prediction
from web.pages.reports import show_reports
from web.pages.ai_settings import show_ai_settings
from web.components.sidebar import create_sidebar
from web.components.header import create_header
from utils.file_handler import setup_logging
from utils.permissions import initialize_permissions
from utils.ai_helper import initialize_ai_helper
# إعداد التسجيل
setup_logging()
logger = logging.getLogger("TenderAnalysisSystem")
# تحميل الإعدادات
def load_config():
config_path = os.path.join(current_dir, "config", "config.yaml")
if os.path.exists(config_path):
with open(config_path, 'r', encoding='utf-8') as f:
return yaml.safe_load(f)
return {}
# تهيئة حالة الجلسة
def initialize_session():
if 'config' not in st.session_state:
st.session_state.config = load_config()
if 'page' not in st.session_state:
st.session_state.page = "الرئيسية"
if 'uploaded_files' not in st.session_state:
st.session_state.uploaded_files = []
if 'analysis_results' not in st.session_state:
st.session_state.analysis_results = {}
if 'current_tender' not in st.session_state:
st.session_state.current_tender = None
if 'user_info' not in st.session_state:
st.session_state.user_info = {
"company": "شركة شبه الجزيرة للمقاولات",
"user_name": "المستخدم الحالي",
"role": "مدير النظام" # تغيير الدور الافتراضي إلى مدير النظام للوصول إلى جميع الصلاحيات
}
if 'latest_predictions' not in st.session_state:
st.session_state.latest_predictions = None
# نطاق التاريخ الافتراضي
if 'date_range' not in st.session_state:
today = datetime.today()
st.session_state.date_range = {
"start_date": today.replace(month=1, day=1),
"end_date": today
}
# تهيئة نظام الصلاحيات
initialize_permissions()
# تهيئة مساعد الذكاء الاصطناعي
initialize_ai_helper()
# تحديد ما إذا كان الجهاز موبايل
if 'is_mobile' not in st.session_state:
st.session_state.is_mobile = False
# إضافة دعم الموبايل
def setup_mobile_support():
# إضافة CSS للموبايل
mobile_css_path = os.path.join(current_dir, "web", "styles", "mobile.css")
if os.path.exists(mobile_css_path):
with open(mobile_css_path) as f:
st.markdown(f"<style>{f.read()}</style>", unsafe_allow_html=True)
# إضافة سكريبت للكشف عن الموبايل وإضافة القائمة
mobile_script = """
<script>
// الكشف عن الموبايل
function detectMobile() {
return (window.innerWidth <= 768) ||
(navigator.userAgent.match(/Android/i) ||
navigator.userAgent.match(/webOS/i) ||
navigator.userAgent.match(/iPhone/i) ||
navigator.userAgent.match(/iPad/i) ||
navigator.userAgent.match(/iPod/i) ||
navigator.userAgent.match(/BlackBerry/i) ||
navigator.userAgent.match(/Windows Phone/i));
}
// إرسال حالة الموبايل إلى Streamlit
if (detectMobile()) {
const data = {
is_mobile: true
};
window.parent.postMessage({
type: "streamlit:setComponentValue",
value: data
}, "*");
}
</script>
"""
st.markdown(mobile_script, unsafe_allow_html=True)
# إضافة سكريبت القائمة للموبايل
mobile_menu_path = os.path.join(current_dir, "web", "scripts", "mobile_menu.js")
if os.path.exists(mobile_menu_path):
with open(mobile_menu_path) as f:
st.markdown(f"<script>{f.read()}</script>", unsafe_allow_html=True)
# التطبيق الرئيسي
def main():
# تهيئة الجلسة
initialize_session()
# إضافة CSS المخصص
with open(os.path.join(current_dir, "web", "styles", "main.css")) as f:
st.markdown(f"<style>{f.read()}</style>", unsafe_allow_html=True)
# إضافة CSS للغة العربية
with open(os.path.join(current_dir, "web", "styles", "rtl.css")) as f:
st.markdown(f"<style>{f.read()}</style>", unsafe_allow_html=True)
# إضافة دعم الموبايل
setup_mobile_support()
# إضافة متغير من نوع Streamlit Component لقراءة حالة الموبايل
mobile_detector = st.empty()
mobile_data = mobile_detector.text_input("", key="mobile_detector", label_visibility="collapsed")
try:
if mobile_data:
mobile_data_json = json.loads(mobile_data)
st.session_state.is_mobile = mobile_data_json.get('is_mobile', False)
except:
pass
# إنشاء الشريط الجانبي
selected_page = create_sidebar()
# إنشاء رأس الصفحة
create_header()
# إضافة زر القائمة للموبايل في حالة تم الكشف عن جهاز موبايل
if st.session_state.is_mobile:
st.markdown('<div id="mobile-menu-container"></div>', unsafe_allow_html=True)
# عرض الصفحة المحددة
if selected_page == "الرئيسية":
show_home_page()
elif selected_page == "تحليل المناقصات":
show_tender_analysis()
elif selected_page == "تحليل المتطلبات":
show_requirements_analysis()
elif selected_page == "تقدير التكاليف":
show_cost_estimation()
elif selected_page == "تحليل المخاطر":
show_risk_analysis()
elif selected_page == "الجدول الزمني":
show_timeline()
elif selected_page == "المحتوى المحلي":
show_local_content()
elif selected_page == "سلاسل الإمداد":
show_supply_chain()
elif selected_page == "المشتريات":
show_procurement()
elif selected_page == "الموردون والمقاولون":
show_vendors()
elif selected_page == "المشاريع المستقبلية":
show_future_projects()
elif selected_page == "توقع احتمالية النجاح":
from utils.permissions import check_permission
if check_permission("access_ai"):
show_success_prediction()
else:
st.error("ليس لديك صلاحية للوصول إلى هذه الصفحة")
elif selected_page == "التقارير":
show_reports()
elif selected_page == "إعدادات الذكاء الاصطناعي":
from utils.permissions import check_permission
if check_permission("configure_system"):
show_ai_settings()
else:
st.error("ليس لديك صلاحية للوصول إلى هذه الصفحة")
# إضافة أيقونة تبديل وضع الموبايل/سطح المكتب
if st.session_state.is_mobile:
st.markdown(
"""
<style>
.desktop-switch {
position: fixed;
bottom: 10px;
right: 10px;
background-color: #4a86e8;
color: white;
width: 40px;
height: 40px;
border-radius: 50%;
text-align: center;
line-height: 40px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
z-index: 9999;
cursor: pointer;
}
</style>
<div class="desktop-switch" onclick="window.open(window.location.href, '_blank')">🖥️</div>
""",
unsafe_allow_html=True
)
# تسجيل زيارة الصفحة
logger.info(f"تمت زيارة صفحة {selected_page}")
if __name__ == "__main__":
main()