File size: 17,151 Bytes
4500ed3 cb73ab3 4500ed3 e7d9317 4500ed3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 |
import streamlit as st
import sys
import os
# إضافة مسار الوحدات الجديدة
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
# استيراد إطار التكامل
from pricing_system.integration_framework import IntegrationFramework
# استيراد الوحدات الأصلية
from modules.pricing.pricing_app import PricingApp
from modules.resources.resources_app import ResourcesApp
class IntegratedApp:
"""
التطبيق المتكامل الذي يجمع بين النظام القديم والنظام الجديد
"""
def __init__(self):
"""
تهيئة التطبيق المتكامل
"""
# تهيئة حالة الجلسة إذا لم تكن موجودة
if 'integrated_app_initialized' not in st.session_state:
st.session_state.integrated_app_initialized = True
st.session_state.current_module = "pricing" # القيمة الافتراضية
# إنشاء مثيلات من الوحدات الأصلية
self.pricing_app = PricingApp()
self.resources_app = ResourcesApp()
# إنشاء مثيل من إطار التكامل
self.integration_framework = IntegrationFramework()
# ربط الوحدات مع إطار التكامل
self.integration_framework.connect_pricing_app(self.pricing_app)
self.integration_framework.connect_resources_app(self.resources_app)
def run(self):
"""
تشغيل التطبيق المتكامل
"""
# عرض شعار التطبيق والعنوان
st.sidebar.image("logo.png", width=200)
st.sidebar.title("نظام تحليل المناقصات")
# عرض قائمة الوحدات الرئيسية
main_modules = ["التسعير", "الموارد", "المشاريع", "التقارير", "الإعدادات"]
selected_module = st.sidebar.radio("اختر الوحدة:", main_modules)
# تحديد الوحدة الحالية
if selected_module == "التسعير":
st.session_state.current_module = "pricing"
elif selected_module == "الموارد":
st.session_state.current_module = "resources"
elif selected_module == "المشاريع":
st.session_state.current_module = "projects"
elif selected_module == "التقارير":
st.session_state.current_module = "reports"
elif selected_module == "الإعدادات":
st.session_state.current_module = "settings"
# عرض الوحدة المختارة
if st.session_state.current_module == "pricing":
self.pricing_app.render()
elif st.session_state.current_module == "resources":
self.resources_app.render()
elif st.session_state.current_module == "projects":
self._render_projects_module()
elif st.session_state.current_module == "reports":
self._render_reports_module()
elif st.session_state.current_module == "settings":
self._render_settings_module()
def _render_projects_module(self):
"""
عرض وحدة المشاريع
"""
st.title("إدارة المشاريع")
# عرض قائمة المشاريع
st.subheader("قائمة المشاريع")
# بيانات المشاريع النموذجية
projects = [
{"name": "مشروع البنية التحتية للحي السكني", "client": "وزارة الإسكان", "status": "قيد التنفيذ"},
{"name": "مشروع تطوير شبكة الصرف الصحي", "client": "وزارة البيئة والمياه والزراعة", "status": "مكتمل"},
{"name": "مشروع إنشاء طريق سريع", "client": "وزارة النقل", "status": "قيد التخطيط"},
{"name": "مشروع بناء جسر", "client": "أمانة المنطقة الشرقية", "status": "قيد التنفيذ"},
{"name": "مشروع تصريف مياه السيول", "client": "وزارة البيئة والمياه والزراعة", "status": "قيد التخطيط"}
]
# عرض المشاريع في جدول
for i, project in enumerate(projects):
col1, col2, col3, col4 = st.columns([3, 2, 2, 1])
with col1:
st.write(project["name"])
with col2:
st.write(project["client"])
with col3:
status_color = "green" if project["status"] == "مكتمل" else "blue" if project["status"] == "قيد التنفيذ" else "orange"
st.markdown(f"<span style='color:{status_color}'>{project['status']}</span>", unsafe_allow_html=True)
with col4:
if st.button("عرض", key=f"view_project_{i}"):
st.session_state.selected_project = project
# إضافة مشروع جديد
st.subheader("إضافة مشروع جديد")
with st.form("add_project_form"):
project_name = st.text_input("اسم المشروع")
project_client = st.text_input("الجهة المالكة")
project_location = st.text_input("الموقع")
project_type = st.selectbox(
"نوع المشروع",
["بنية تحتية", "صرف صحي", "طرق", "سيول", "كباري", "مباني", "أخرى"]
)
project_budget = st.number_input("الميزانية التقديرية (ريال)", min_value=0.0, step=100000.0)
col1, col2 = st.columns(2)
with col1:
project_start_date = st.date_input("تاريخ البدء")
with col2:
project_end_date = st.date_input("تاريخ الانتهاء المتوقع")
project_description = st.text_area("وصف المشروع")
submit_button = st.form_submit_button("إضافة المشروع")
if submit_button:
if project_name and project_client:
st.success(f"تمت إضافة مشروع {project_name} بنجاح")
else:
st.error("يرجى إدخال اسم المشروع والجهة المالكة")
def _render_reports_module(self):
"""
عرض وحدة التقارير
"""
st.title("التقارير")
# أنواع التقارير
report_types = [
"تقرير ملخص المشروع",
"تقرير تحليل التكاليف",
"تقرير سيناريوهات التسعير",
"تقرير المحتوى المحلي",
"تقرير الإدارات المساندة",
"تقرير المقارنة التنافسية",
"تقرير الموارد المستخدمة"
]
# اختيار نوع التقرير
selected_report = st.selectbox("اختر نوع التقرير", report_types)
# اختيار المشروع
projects = [
"مشروع البنية التحتية للحي السكني",
"مشروع تطوير شبكة الصرف الصحي",
"مشروع إنشاء طريق سريع",
"مشروع بناء جسر",
"مشروع تصريف مياه السيول"
]
selected_project = st.selectbox("اختر المشروع", projects)
# خيارات التقرير
st.subheader("خيارات التقرير")
col1, col2 = st.columns(2)
with col1:
include_charts = st.checkbox("تضمين الرسوم البيانية", value=True)
include_details = st.checkbox("تضمين التفاصيل", value=True)
with col2:
report_format = st.radio("تنسيق التقرير", ["PDF", "Excel", "Word"])
include_logo = st.checkbox("تضمين الشعار", value=True)
# إنشاء التقرير
if st.button("إنشاء التقرير"):
st.success(f"تم إنشاء {selected_report} لـ {selected_project} بنجاح")
# عرض نموذج للتقرير
st.subheader("معاينة التقرير")
if selected_report == "تقرير ملخص المشروع":
st.write("**معلومات المشروع:**")
st.write(f"- اسم المشروع: {selected_project}")
st.write("- الجهة المالكة: وزارة الإسكان")
st.write("- الموقع: الرياض")
st.write("- تاريخ البدء: 2023-01-15")
st.write("- تاريخ الانتهاء المتوقع: 2024-06-30")
st.write("- الميزانية التقديرية: 25,000,000 ريال")
st.write("**ملخص التكاليف:**")
st.write("- إجمالي التكاليف المباشرة: 18,500,000 ريال")
st.write("- إجمالي التكاليف غير المباشرة: 3,700,000 ريال")
st.write("- هامش الربح: 2,800,000 ريال")
st.write("- إجمالي سعر المشروع: 25,000,000 ريال")
if include_charts:
st.subheader("الرسوم البيانية")
st.bar_chart({"التكاليف المباشرة": 18.5, "التكاليف غير المباشرة": 3.7, "هامش الربح": 2.8})
elif selected_report == "تقرير المحتوى المحلي":
st.write("**تحليل المحتوى المحلي:**")
st.write("- نسبة المحتوى المحلي: 42.5%")
st.write("- النسبة المستهدفة: 40.0%")
st.write("- الفائض: 2.5%")
st.write("**تفاصيل المحتوى المحلي حسب نوع الموارد:**")
st.write("- المواد: 35.2%")
st.write("- المعدات: 48.7%")
st.write("- العمالة: 52.3%")
st.write("- مقاولي الباطن: 38.1%")
if include_charts:
st.subheader("الرسوم البيانية")
st.bar_chart({"المواد": 35.2, "المعدات": 48.7, "العمالة": 52.3, "مقاولي الباطن": 38.1})
# خيارات تصدير التقرير
st.download_button(
label=f"تحميل التقرير بتنسيق {report_format}",
data="تقرير نموذجي".encode("utf-8"), # ✅ الحل الصحيح
file_name=f"{selected_report}_{selected_project}.{report_format.lower()}",
mime="application/octet-stream"
)
def _render_settings_module(self):
"""
عرض وحدة الإعدادات
"""
st.title("الإعدادات")
tab1, tab2, tab3, tab4 = st.tabs(["إعدادات عامة", "إعدادات المستخدم", "إعدادات النظام", "النسخ الاحتياطي"])
with tab1:
st.subheader("الإعدادات العامة")
# إعدادات اللغة
st.write("**إعدادات اللغة:**")
language = st.selectbox("اللغة", ["العربية", "English"])
# إعدادات العرض
st.write("**إعدادات العرض:**")
theme = st.selectbox("السمة", ["الافتراضية", "داكنة", "فاتحة"])
sidebar_position = st.radio("موضع الشريط الجانبي", ["يمين", "يسار"])
# إعدادات التنبيهات
st.write("**إعدادات التنبيهات:**")
enable_notifications = st.checkbox("تفعيل التنبيهات", value=True)
notification_sound = st.checkbox("تفعيل صوت التنبيهات", value=True)
if st.button("حفظ الإعدادات العامة"):
st.success("تم حفظ الإعدادات العامة بنجاح")
with tab2:
st.subheader("إعدادات المستخدم")
# معلومات المستخدم
st.write("**معلومات المستخدم:**")
user_name = st.text_input("اسم المستخدم", value="محمد أحمد")
user_email = st.text_input("البريد الإلكتروني", value="[email protected]")
user_phone = st.text_input("رقم الهاتف", value="0555555555")
# تغيير كلمة المرور
st.write("**تغيير كلمة المرور:**")
current_password = st.text_input("كلمة المرور الحالية", type="password")
new_password = st.text_input("كلمة المرور الجديدة", type="password")
confirm_password = st.text_input("تأكيد كلمة المرور الجديدة", type="password")
if st.button("حفظ إعدادات المستخدم"):
if new_password and new_password == confirm_password:
st.success("تم حفظ إعدادات المستخدم بنجاح")
elif new_password and new_password != confirm_password:
st.error("كلمة المرور الجديدة وتأكيدها غير متطابقين")
else:
st.success("تم حفظ إعدادات المستخدم بنجاح")
with tab3:
st.subheader("إعدادات النظام")
# إعدادات قاعدة البيانات
st.write("**إعدادات قاعدة البيانات:**")
db_type = st.selectbox("نوع قاعدة البيانات", ["SQLite", "MySQL", "PostgreSQL"])
db_host = st.text_input("عنوان الخادم", value="localhost")
db_port = st.text_input("المنفذ", value="3306")
db_name = st.text_input("اسم قاعدة البيانات", value="tender_analysis_db")
# إعدادات النسخ الاحتياطي التلقائي
st.write("**إعدادات النسخ الاحتياطي التلقائي:**")
auto_backup = st.checkbox("تفعيل النسخ الاحتياطي التلقائي", value=True)
backup_frequency = st.selectbox("تكرار النسخ الاحتياطي", ["يومي", "أسبوعي", "شهري"])
backup_time = st.time_input("وقت النسخ الاحتياطي")
if st.button("حفظ إعدادات النظام"):
st.success("تم حفظ إعدادات النظام بنجاح")
with tab4:
st.subheader("النسخ الاحتياطي")
# إنشاء نسخة احتياطية
st.write("**إنشاء نسخة احتياطية:**")
backup_type = st.radio("نوع النسخ الاحتياطي", ["كامل", "جزئي"])
if backup_type == "جزئي":
st.multiselect(
"اختر البيانات المراد نسخها",
["المشاريع", "المناقصات", "الموارد", "التسعير", "المستخدمين", "الإعدادات"]
)
if st.button("إنشاء نسخة احتياطية"):
st.success("تم إنشاء النسخة الاحتياطية بنجاح")
st.download_button(
label="تحميل النسخة الاحتياطية",
data="تحميل النسخة الاحتياطية".encode("utf-8"), # ✅ الحل الصحيح
file_name="backup_2025-04-01.zip",
mime="application/zip"
)
# استعادة نسخة احتياطية
st.write("**استعادة نسخة احتياطية:**")
uploaded_file = st.file_uploader("اختر ملف النسخة الاحتياطية", type=["zip"])
if uploaded_file is not None:
if st.button("استعادة النسخة الاحتياطية"):
st.success("تم استعادة النسخة الاحتياطية بنجاح")
# تشغيل التطبيق المتكامل
if __name__ == "__main__":
app = IntegratedApp()
app.run()
|