Spaces:
Sleeping
Sleeping
Update web/pages/home.py
Browse files- web/pages/home.py +105 -2
web/pages/home.py
CHANGED
|
@@ -5,6 +5,47 @@ import plotly.express as px
|
|
| 5 |
import plotly.graph_objects as go
|
| 6 |
from datetime import datetime, timedelta
|
| 7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
def show_home_page():
|
| 9 |
"""
|
| 10 |
عرض الصفحة الرئيسية مع لوحة المعلومات
|
|
@@ -65,7 +106,7 @@ def show_home_page():
|
|
| 65 |
fig.update_traces(textposition='inside', textinfo='percent+label')
|
| 66 |
st.plotly_chart(fig, use_container_width=True)
|
| 67 |
|
| 68 |
-
# المناقصات المقبلة
|
| 69 |
col1, col2 = st.columns(2)
|
| 70 |
|
| 71 |
with col1:
|
|
@@ -90,4 +131,66 @@ def show_home_page():
|
|
| 90 |
prediction_data = {
|
| 91 |
'المشروع': [
|
| 92 |
'تطوير البنية التحتية في المنطقة الشرقية',
|
| 93 |
-
'إنشاء
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
import plotly.graph_objects as go
|
| 6 |
from datetime import datetime, timedelta
|
| 7 |
|
| 8 |
+
def create_sample_tenders_data():
|
| 9 |
+
"""
|
| 10 |
+
إنشاء بيانات توضيحية للمناقصات
|
| 11 |
+
"""
|
| 12 |
+
# تواريخ عشوائية خلال الشهرين القادمين
|
| 13 |
+
today = datetime.now().date()
|
| 14 |
+
dates = [today + timedelta(days=np.random.randint(1, 60)) for _ in range(20)]
|
| 15 |
+
|
| 16 |
+
# حالات المناقصات
|
| 17 |
+
statuses = ['جديدة', 'قيد التحليل', 'جاهزة للتقديم', 'تم التقديم', 'انتهت']
|
| 18 |
+
|
| 19 |
+
# الجهات
|
| 20 |
+
agencies = [
|
| 21 |
+
'وزارة الإسكان', 'وزارة النقل', 'أمانة الرياض', 'الهيئة الملكية',
|
| 22 |
+
'وزارة الصحة', 'وزارة التعليم', 'شركة أرامكو', 'شركة سابك',
|
| 23 |
+
'هيئة المدن الصناعية', 'الهيئة العامة للترفيه'
|
| 24 |
+
]
|
| 25 |
+
|
| 26 |
+
# القطاعات
|
| 27 |
+
sectors = ['البنية التحتية', 'المباني', 'الطرق', 'الطاقة', 'المياه', 'الصحة', 'التعليم', 'الصناعة']
|
| 28 |
+
|
| 29 |
+
# إنشاء البيانات
|
| 30 |
+
data = {
|
| 31 |
+
'رقم المناقصة': [f"T-{2025}-{np.random.randint(1000, 9999)}" for _ in range(20)],
|
| 32 |
+
'الجهة': [np.random.choice(agencies) for _ in range(20)],
|
| 33 |
+
'اسم المشروع': [
|
| 34 |
+
'إنشاء طريق دائري', 'تطوير شبكة مياه', 'بناء مدرسة', 'تجديد مستشفى',
|
| 35 |
+
'إنشاء حديقة عامة', 'تطوير منطقة صناعية', 'صيانة طرق', 'بناء مركز تجاري',
|
| 36 |
+
'تطوير بنية تحتية', 'إنشاء محطة تحلية', 'بناء مجمع سكني', 'تطوير مركز أبحاث',
|
| 37 |
+
'صيانة شبكة كهرباء', 'إنشاء ملاعب رياضية', 'تطوير مطار', 'إنشاء مبنى إداري',
|
| 38 |
+
'تطوير شبكة اتصالات', 'بناء مركز ثقافي', 'إنشاء محطة طاقة شمسية', 'تطوير منطقة ساحلية'
|
| 39 |
+
],
|
| 40 |
+
'القيمة التقديرية (مليون)': np.random.uniform(10, 200, 20).round(1),
|
| 41 |
+
'الموعد النهائي': dates,
|
| 42 |
+
'حالة المناقصة': [np.random.choice(statuses, p=[0.3, 0.3, 0.2, 0.1, 0.1]) for _ in range(20)],
|
| 43 |
+
'المحتوى المحلي المطلوب': [np.random.randint(30, 70) for _ in range(20)],
|
| 44 |
+
'القطاع': [np.random.choice(sectors) for _ in range(20)]
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
return pd.DataFrame(data)
|
| 48 |
+
|
| 49 |
def show_home_page():
|
| 50 |
"""
|
| 51 |
عرض الصفحة الرئيسية مع لوحة المعلومات
|
|
|
|
| 106 |
fig.update_traces(textposition='inside', textinfo='percent+label')
|
| 107 |
st.plotly_chart(fig, use_container_width=True)
|
| 108 |
|
| 109 |
+
# المناقصات المقبلة والتوقعات
|
| 110 |
col1, col2 = st.columns(2)
|
| 111 |
|
| 112 |
with col1:
|
|
|
|
| 131 |
prediction_data = {
|
| 132 |
'المشروع': [
|
| 133 |
'تطوير البنية التحتية في المنطقة الشرقية',
|
| 134 |
+
'إنشاء مباني سكنية في الرياض',
|
| 135 |
+
'صيانة الطرق في المدينة المنورة',
|
| 136 |
+
'توسعة شبكة المياه في جدة',
|
| 137 |
+
'إنشاء مركز بيانات في الدمام'
|
| 138 |
+
],
|
| 139 |
+
'احتمالية النجاح': [85, 72, 63, 91, 77]
|
| 140 |
+
}
|
| 141 |
+
|
| 142 |
+
for i, proj in enumerate(prediction_data['المشروع']):
|
| 143 |
+
prob = prediction_data['احتمالية النجاح'][i]
|
| 144 |
+
color = "green" if prob >= 80 else "orange" if prob >= 60 else "red"
|
| 145 |
+
|
| 146 |
+
st.markdown(f"**{proj}**")
|
| 147 |
+
st.progress(prob/100)
|
| 148 |
+
st.markdown(f"<span style='color:{color}'><b>احتمالية النجاح: {prob}%</b></span>", unsafe_allow_html=True)
|
| 149 |
+
st.markdown("---")
|
| 150 |
+
|
| 151 |
+
# توزيع المناقصات حسب الشهر (كمثال على رسم بياني إضافي)
|
| 152 |
+
st.subheader("توزيع المناقصات حسب الشهر")
|
| 153 |
+
|
| 154 |
+
# إضافة شهر كعمود في DataFrame
|
| 155 |
+
active_tenders['الشهر'] = active_tenders['الموعد النهائي'].apply(lambda x: x.strftime('%Y-%m'))
|
| 156 |
+
monthly_df = active_tenders.groupby('الشهر').size().reset_index(name='عدد المناقصات')
|
| 157 |
+
|
| 158 |
+
fig = px.bar(
|
| 159 |
+
monthly_df,
|
| 160 |
+
x='الشهر',
|
| 161 |
+
y='عدد المناقصات',
|
| 162 |
+
color='عدد المناقصات',
|
| 163 |
+
color_continuous_scale='Viridis',
|
| 164 |
+
title="توزيع المناقصات حسب الشهر"
|
| 165 |
+
)
|
| 166 |
+
|
| 167 |
+
st.plotly_chart(fig, use_container_width=True)
|
| 168 |
+
|
| 169 |
+
# روابط سريعة للعمليات الشائعة
|
| 170 |
+
st.subheader("روابط سريعة")
|
| 171 |
+
|
| 172 |
+
col1, col2, col3 = st.columns(3)
|
| 173 |
+
|
| 174 |
+
with col1:
|
| 175 |
+
if st.button("تحليل مناقصة جديدة", key="new_analysis"):
|
| 176 |
+
st.session_state.page = "تحليل المناقصات"
|
| 177 |
+
st.experimental_rerun()
|
| 178 |
+
|
| 179 |
+
with col2:
|
| 180 |
+
if st.button("البحث في قاعدة الموردين", key="search_vendors"):
|
| 181 |
+
st.session_state.page = "الموردون والمقاولون"
|
| 182 |
+
st.experimental_rerun()
|
| 183 |
+
|
| 184 |
+
with col3:
|
| 185 |
+
if st.button("تقرير المحتوى المحلي", key="local_content_report"):
|
| 186 |
+
st.session_state.page = "المحتوى المحلي"
|
| 187 |
+
st.experimental_rerun()
|
| 188 |
+
|
| 189 |
+
# اختبار مستقل للصفحة
|
| 190 |
+
if __name__ == "__main__":
|
| 191 |
+
st.set_page_config(
|
| 192 |
+
page_title="نظام تحليل المناقصات - الصفحة الرئيسية",
|
| 193 |
+
page_icon="📊",
|
| 194 |
+
layout="wide",
|
| 195 |
+
)
|
| 196 |
+
show_home_page()
|