Spaces:
Paused
Paused
Update web/pages/home.py
Browse files- web/pages/home.py +70 -58
web/pages/home.py
CHANGED
|
@@ -1,81 +1,93 @@
|
|
| 1 |
import streamlit as st
|
| 2 |
import pandas as pd
|
|
|
|
| 3 |
import plotly.express as px
|
|
|
|
|
|
|
| 4 |
|
| 5 |
def show_home_page():
|
| 6 |
"""
|
| 7 |
-
عرض الصفحة الرئيسية
|
| 8 |
"""
|
| 9 |
-
#
|
| 10 |
-
|
| 11 |
-
page_title="نظام تحليل المناقصات",
|
| 12 |
-
page_icon="📊",
|
| 13 |
-
layout="wide",
|
| 14 |
-
initial_sidebar_state="expanded"
|
| 15 |
-
)
|
| 16 |
-
|
| 17 |
-
# العنوان الرئيسي
|
| 18 |
-
st.title("نظام تحليل المناقصات مع سلاسل الإمداد والمحتوى المحلي")
|
| 19 |
-
st.markdown("---")
|
| 20 |
|
| 21 |
-
# عرض
|
| 22 |
-
|
|
|
|
| 23 |
|
| 24 |
with col1:
|
| 25 |
-
st.metric(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
|
| 27 |
with col2:
|
| 28 |
-
st.metric(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
|
| 30 |
with col3:
|
| 31 |
-
st.metric(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
|
| 33 |
-
|
| 34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
|
| 36 |
-
#
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
'
|
| 40 |
-
|
| 41 |
-
|
| 42 |
|
| 43 |
-
|
|
|
|
|
|
|
| 44 |
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
color_continuous_scale='Viridis',
|
| 52 |
-
title='توزيع المناقصات حسب القطاع والمحتوى المحلي'
|
| 53 |
)
|
| 54 |
-
|
| 55 |
st.plotly_chart(fig, use_container_width=True)
|
| 56 |
|
| 57 |
-
#
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
analysis_type = st.selectbox(
|
| 65 |
-
"نوع التحليل",
|
| 66 |
-
["تحليل المناقصات", "تحليل المحتوى المحلي", "تحليل سلاسل الإمداد"]
|
| 67 |
-
)
|
| 68 |
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
|
| 76 |
-
#
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
show_home_page()
|
|
|
|
| 1 |
import streamlit as st
|
| 2 |
import pandas as pd
|
| 3 |
+
import numpy as np
|
| 4 |
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 |
+
عرض الصفحة الرئيسية مع لوحة المعلومات
|
| 11 |
"""
|
| 12 |
+
# بيانات توضيحية للمناقصات النشطة
|
| 13 |
+
active_tenders = create_sample_tenders_data()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
|
| 15 |
+
# عرض المؤشرات الرئيسية
|
| 16 |
+
st.subheader("المؤشرات الرئيسية")
|
| 17 |
+
col1, col2, col3, col4 = st.columns(4)
|
| 18 |
|
| 19 |
with col1:
|
| 20 |
+
st.metric(
|
| 21 |
+
label="المناقصات النشطة",
|
| 22 |
+
value=f"{len(active_tenders)}",
|
| 23 |
+
delta="3 ↑"
|
| 24 |
+
)
|
| 25 |
|
| 26 |
with col2:
|
| 27 |
+
st.metric(
|
| 28 |
+
label="متوسط المحتوى المحلي",
|
| 29 |
+
value="67.8%",
|
| 30 |
+
delta="2.5% ↑"
|
| 31 |
+
)
|
| 32 |
|
| 33 |
with col3:
|
| 34 |
+
st.metric(
|
| 35 |
+
label="العطاءات الفائزة",
|
| 36 |
+
value="12",
|
| 37 |
+
delta="2 ↑"
|
| 38 |
+
)
|
| 39 |
|
| 40 |
+
with col4:
|
| 41 |
+
st.metric(
|
| 42 |
+
label="قيمة المشاريع (مليون ريال)",
|
| 43 |
+
value="463.5",
|
| 44 |
+
delta="85.2 ↑"
|
| 45 |
+
)
|
| 46 |
|
| 47 |
+
# عرض المناقصات النشطة
|
| 48 |
+
st.subheader("المناقصات النشطة")
|
| 49 |
+
st.dataframe(
|
| 50 |
+
active_tenders[['رقم المناقصة', 'الجهة', 'اسم المشروع', 'القيمة التقديرية (مليون)', 'الموعد النهائي', 'حالة المناقصة']],
|
| 51 |
+
use_container_width=True
|
| 52 |
+
)
|
| 53 |
|
| 54 |
+
# توزيع المناقصات حسب القطاع
|
| 55 |
+
st.subheader("توزيع المناقصات حسب القطاع")
|
| 56 |
+
sectors_df = active_tenders.groupby('القطاع').size().reset_index(name='عدد المناقصات')
|
| 57 |
|
| 58 |
+
fig = px.pie(
|
| 59 |
+
sectors_df,
|
| 60 |
+
values='عدد المناقصات',
|
| 61 |
+
names='القطاع',
|
| 62 |
+
color_discrete_sequence=px.colors.qualitative.Bold,
|
| 63 |
+
title="توزيع المناقصات حسب القطاع"
|
|
|
|
|
|
|
| 64 |
)
|
| 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:
|
| 72 |
+
st.subheader("المناقصات المقبلة")
|
| 73 |
+
upcoming_df = active_tenders[active_tenders['الموعد النهائي'] > datetime.now().date()]
|
| 74 |
+
upcoming_df = upcoming_df.sort_values('الموعد النهائي')
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
|
| 76 |
+
for _, row in upcoming_df.head(5).iterrows():
|
| 77 |
+
with st.container():
|
| 78 |
+
st.markdown(f"""
|
| 79 |
+
**{row['اسم المشروع']}**
|
| 80 |
+
**الجهة:** {row['الجهة']}
|
| 81 |
+
**القيمة التقديرية:** {row['القيمة التقديرية (مليون)']} مليون ريال
|
| 82 |
+
**الموعد النهائي:** {row['الموعد النهائي'].strftime('%Y/%m/%d')}
|
| 83 |
+
""")
|
| 84 |
+
st.markdown("---")
|
| 85 |
+
|
| 86 |
+
with col2:
|
| 87 |
+
st.subheader("توقعات النجاح")
|
| 88 |
|
| 89 |
+
# بيانات توضيحية لتوقعات النجاح
|
| 90 |
+
prediction_data = {
|
| 91 |
+
'المشروع': [
|
| 92 |
+
'تطوير البنية التحتية في المنطقة الشرقية',
|
| 93 |
+
'إنشاء مبا
|
|
|