Spaces:
Paused
Paused
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()
|