Spaces:
Paused
Paused
File size: 8,515 Bytes
dbd2bdf e5b37a0 dbd2bdf e5b37a0 dbd2bdf dff2d03 dbd2bdf e5b37a0 dbd2bdf e5b37a0 dbd2bdf e5b37a0 dbd2bdf e5b37a0 dbd2bdf e5b37a0 dbd2bdf e5b37a0 dbd2bdf e5b37a0 dbd2bdf e5b37a0 dbd2bdf e5b37a0 dbd2bdf e5b37a0 dbd2bdf e5b37a0 dbd2bdf dff2d03 e5b37a0 dbd2bdf e5b37a0 dbd2bdf e5b37a0 dff2d03 |
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 |
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from datetime import datetime, timedelta
def create_sample_tenders_data():
"""
إنشاء بيانات توضيحية للمناقصات
"""
# تواريخ عشوائية خلال الشهرين القادمين
today = datetime.now().date()
dates = [today + timedelta(days=np.random.randint(1, 60)) for _ in range(20)]
# حالات المناقصات
statuses = ['جديدة', 'قيد التحليل', 'جاهزة للتقديم', 'تم التقديم', 'انتهت']
# الجهات
agencies = [
'وزارة الإسكان', 'وزارة النقل', 'أمانة الرياض', 'الهيئة الملكية',
'وزارة الصحة', 'وزارة التعليم', 'شركة أرامكو', 'شركة سابك',
'هيئة المدن الصناعية', 'الهيئة العامة للترفيه'
]
# القطاعات
sectors = ['البنية التحتية', 'المباني', 'الطرق', 'الطاقة', 'المياه', 'الصحة', 'التعليم', 'الصناعة']
# إنشاء البيانات
data = {
'رقم المناقصة': [f"T-{2025}-{np.random.randint(1000, 9999)}" for _ in range(20)],
'الجهة': [np.random.choice(agencies) for _ in range(20)],
'اسم المشروع': [
'إنشاء طريق دائري', 'تطوير شبكة مياه', 'بناء مدرسة', 'تجديد مستشفى',
'إنشاء حديقة عامة', 'تطوير منطقة صناعية', 'صيانة طرق', 'بناء مركز تجاري',
'تطوير بنية تحتية', 'إنشاء محطة تحلية', 'بناء مجمع سكني', 'تطوير مركز أبحاث',
'صيانة شبكة كهرباء', 'إنشاء ملاعب رياضية', 'تطوير مطار', 'إنشاء مبنى إداري',
'تطوير شبكة اتصالات', 'بناء مركز ثقافي', 'إنشاء محطة طاقة شمسية', 'تطوير منطقة ساحلية'
],
'القيمة التقديرية (مليون)': np.random.uniform(10, 200, 20).round(1),
'الموعد النهائي': dates,
'حالة المناقصة': [np.random.choice(statuses, p=[0.3, 0.3, 0.2, 0.1, 0.1]) for _ in range(20)],
'المحتوى المحلي المطلوب': [np.random.randint(30, 70) for _ in range(20)],
'القطاع': [np.random.choice(sectors) for _ in range(20)]
}
return pd.DataFrame(data)
def show_home_page():
"""
عرض الصفحة الرئيسية مع لوحة المعلومات
"""
# بيانات توضيحية للمناقصات النشطة
active_tenders = create_sample_tenders_data()
# عرض المؤشرات الرئيسية
st.subheader("المؤشرات الرئيسية")
col1, col2, col3, col4 = st.columns(4)
with col1:
st.metric(
label="المناقصات النشطة",
value=f"{len(active_tenders)}",
delta="3 ↑"
)
with col2:
st.metric(
label="متوسط المحتوى المحلي",
value="67.8%",
delta="2.5% ↑"
)
with col3:
st.metric(
label="العطاءات الفائزة",
value="12",
delta="2 ↑"
)
with col4:
st.metric(
label="قيمة المشاريع (مليون ريال)",
value="463.5",
delta="85.2 ↑"
)
# عرض المناقصات النشطة
st.subheader("المناقصات النشطة")
st.dataframe(
active_tenders[['رقم المناقصة', 'الجهة', 'اسم المشروع', 'القيمة التقديرية (مليون)', 'الموعد النهائي', 'حالة المناقصة']],
use_container_width=True
)
# توزيع المناقصات حسب القطاع
st.subheader("توزيع المناقصات حسب القطاع")
sectors_df = active_tenders.groupby('القطاع').size().reset_index(name='عدد المناقصات')
fig = px.pie(
sectors_df,
values='عدد المناقصات',
names='القطاع',
color_discrete_sequence=px.colors.qualitative.Bold,
title="توزيع المناقصات حسب القطاع"
)
fig.update_traces(textposition='inside', textinfo='percent+label')
st.plotly_chart(fig, use_container_width=True)
# المناقصات المقبلة والتوقعات
col1, col2 = st.columns(2)
with col1:
st.subheader("المناقصات المقبلة")
upcoming_df = active_tenders[active_tenders['الموعد النهائي'] > datetime.now().date()]
upcoming_df = upcoming_df.sort_values('الموعد النهائي')
for _, row in upcoming_df.head(5).iterrows():
with st.container():
st.markdown(f"""
**{row['اسم المشروع']}**
**الجهة:** {row['الجهة']}
**القيمة التقديرية:** {row['القيمة التقديرية (مليون)']} مليون ريال
**الموعد النهائي:** {row['الموعد النهائي'].strftime('%Y/%m/%d')}
""")
st.markdown("---")
with col2:
st.subheader("توقعات النجاح")
# بيانات توضيحية لتوقعات النجاح
prediction_data = {
'المشروع': [
'تطوير البنية التحتية في المنطقة الشرقية',
'إنشاء مباني سكنية في الرياض',
'صيانة الطرق في المدينة المنورة',
'توسعة شبكة المياه في جدة',
'إنشاء مركز بيانات في الدمام'
],
'احتمالية النجاح': [85, 72, 63, 91, 77]
}
for i, proj in enumerate(prediction_data['المشروع']):
prob = prediction_data['احتمالية النجاح'][i]
color = "green" if prob >= 80 else "orange" if prob >= 60 else "red"
st.markdown(f"**{proj}**")
st.progress(prob/100)
st.markdown(f"<span style='color:{color}'><b>احتمالية النجاح: {prob}%</b></span>", unsafe_allow_html=True)
st.markdown("---")
# توزيع المناقصات حسب الشهر (كمثال على رسم بياني إضافي)
st.subheader("توزيع المناقصات حسب الشهر")
# إضافة شهر كعمود في DataFrame
active_tenders['الشهر'] = active_tenders['الموعد النهائي'].apply(lambda x: x.strftime('%Y-%m'))
monthly_df = active_tenders.groupby('الشهر').size().reset_index(name='عدد المناقصات')
fig = px.bar(
monthly_df,
x='الشهر',
y='عدد المناقصات',
color='عدد المناقصات',
color_continuous_scale='Viridis',
title="توزيع المناقصات حسب الشهر"
)
st.plotly_chart(fig, use_container_width=True)
# روابط سريعة للعمليات الشائعة
st.subheader("روابط سريعة")
col1, col2, col3 = st.columns(3)
with col1:
if st.button("تحليل مناقصة جديدة", key="new_analysis"):
st.session_state.page = "تحليل المناقصات"
st.experimental_rerun()
with col2:
if st.button("البحث في قاعدة الموردين", key="search_vendors"):
st.session_state.page = "الموردون والمقاولون"
st.experimental_rerun()
with col3:
if st.button("تقرير المحتوى المحلي", key="local_content_report"):
st.session_state.page = "المحتوى المحلي"
st.experimental_rerun()
# اختبار مستقل للصفحة
if __name__ == "__main__":
st.set_page_config(
page_title="نظام تحليل المناقصات - الصفحة الرئيسية",
page_icon="📊",
layout="wide",
)
show_home_page() |