File size: 11,389 Bytes
fb20480
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
وحدة الخرائط المتكاملة
"""

import streamlit as st
import folium
from streamlit_folium import folium_static
import pandas as pd
import random

class MapsApp:
    """
    وحدة الخرائط المتكاملة للنظام
    """
    
    def __init__(self):
        """
        تهيئة وحدة الخرائط
        """
        # تهيئة حالة الجلسة الخاصة بالخرائط إذا لم تكن موجودة
        if 'map_projects' not in st.session_state:
            # إنشاء بيانات تجريبية للمشاريع
            st.session_state.map_projects = self._generate_sample_projects()
    
    def run(self):
        """
        تشغيل وحدة الخرائط
        """
        st.markdown("<h2 class='module-title'>وحدة الخرائط المتكاملة</h2>", unsafe_allow_html=True)
        
        # إنشاء تبويبات للخرائط المختلفة
        tabs = st.tabs(["خريطة المشاريع", "خريطة المناقصات", "تحليل المناطق"])
        
        with tabs[0]:
            self._render_projects_map()
        
        with tabs[1]:
            self._render_tenders_map()
        
        with tabs[2]:
            self._render_region_analysis()
    
    def _render_projects_map(self):
        """
        عرض خريطة المشاريع
        """
        st.markdown("### خريطة المشاريع النشطة")
        st.markdown("عرض جميع المشاريع النشطة على الخريطة مع معلومات تفصيلية")
        
        # إنشاء خريطة مركزها المملكة العربية السعودية
        m = folium.Map(location=[24.7136, 46.6753], zoom_start=5)
        
        # إضافة المشاريع إلى الخريطة
        for project in st.session_state.map_projects:
            popup_html = f"""
            <div style="direction: rtl; text-align: right; width: 200px;">
                <h4>{project['name']}</h4>
                <p><strong>العميل:</strong> {project['client']}</p>
                <p><strong>القيمة:</strong> {project['value']} ريال</p>
                <p><strong>الحالة:</strong> {project['status']}</p>
            </div>
            """
            
            # تحديد لون المؤشر بناءً على حالة المشروع
            icon_color = 'green' if project['status'] == 'نشط' else 'orange' if project['status'] == 'قيد التنفيذ' else 'red'
            
            folium.Marker(
                location=[project['lat'], project['lng']],
                popup=folium.Popup(popup_html, max_width=300),
                tooltip=project['name'],
                icon=folium.Icon(color=icon_color, icon='info-sign')
            ).add_to(m)
        
        # عرض الخريطة
        folium_static(m, width=800, height=500)
        
        # عرض جدول المشاريع
        st.markdown("### قائمة المشاريع")
        
        # تحويل البيانات إلى DataFrame
        df = pd.DataFrame(st.session_state.map_projects)
        df = df[['name', 'client', 'city', 'value', 'status']]
        df.columns = ['اسم المشروع', 'العميل', 'المدينة', 'القيمة (ريال)', 'الحالة']
        
        # عرض الجدول
        st.dataframe(df, use_container_width=True)
    
    def _render_tenders_map(self):
        """
        عرض خريطة المناقصات
        """
        st.markdown("### خريطة المناقصات المتاحة")
        st.markdown("عرض المناقصات المتاحة حالياً على الخريطة مع تحليل التوزيع الجغرافي")
        
        # إنشاء خريطة مركزها المملكة العربية السعودية
        m = folium.Map(location=[24.7136, 46.6753], zoom_start=5)
        
        # إضافة طبقة الكثافة الحرارية للمناقصات
        heat_data = [[p['lat'], p['lng']] for p in st.session_state.map_projects]
        
        # إضافة المناقصات إلى الخريطة
        for project in st.session_state.map_projects:
            if project['status'] == 'مناقصة':
                popup_html = f"""
                <div style="direction: rtl; text-align: right; width: 200px;">
                    <h4>{project['name']}</h4>
                    <p><strong>العميل:</strong> {project['client']}</p>
                    <p><strong>القيمة التقديرية:</strong> {project['value']} ريال</p>
                    <p><strong>تاريخ الإغلاق:</strong> {project.get('closing_date', '2025-05-15')}</p>
                </div>
                """
                
                folium.Marker(
                    location=[project['lat'], project['lng']],
                    popup=folium.Popup(popup_html, max_width=300),
                    tooltip=project['name'],
                    icon=folium.Icon(color='blue', icon='info-sign')
                ).add_to(m)
        
        # عرض الخريطة
        folium_static(m, width=800, height=500)
        
        # عرض إحصائيات المناقصات حسب المنطقة
        st.markdown("### توزيع المناقصات حسب المنطقة")
        
        # تحليل بسيط للمناقصات حسب المدينة
        tenders = [p for p in st.session_state.map_projects if p['status'] == 'مناقصة']
        city_counts = {}
        for tender in tenders:
            city = tender['city']
            if city in city_counts:
                city_counts[city] += 1
            else:
                city_counts[city] = 1
        
        # تحويل البيانات إلى DataFrame
        df = pd.DataFrame(list(city_counts.items()), columns=['المدينة', 'عدد المناقصات'])
        
        # عرض الرسم البياني
        st.bar_chart(df.set_index('المدينة'))
    
    def _render_region_analysis(self):
        """
        عرض تحليل المناطق
        """
        st.markdown("### تحليل المناطق الجغرافية")
        st.markdown("تحليل توزيع المشاريع والمناقصات حسب المناطق مع مؤشرات الأداء")
        
        # إنشاء بيانات تحليلية للمناطق
        regions = {
            'الرياض': {'projects': 12, 'tenders': 8, 'success_rate': 75},
            'مكة المكرمة': {'projects': 8, 'tenders': 5, 'success_rate': 60},
            'المدينة المنورة': {'projects': 5, 'tenders': 3, 'success_rate': 65},
            'القصيم': {'projects': 4, 'tenders': 2, 'success_rate': 50},
            'المنطقة الشرقية': {'projects': 10, 'tenders': 7, 'success_rate': 70},
            'عسير': {'projects': 6, 'tenders': 4, 'success_rate': 55},
            'تبوك': {'projects': 3, 'tenders': 2, 'success_rate': 80},
            'حائل': {'projects': 2, 'tenders': 1, 'success_rate': 45},
            'الحدود الشمالية': {'projects': 1, 'tenders': 1, 'success_rate': 40},
            'جازان': {'projects': 3, 'tenders': 2, 'success_rate': 60},
            'نجران': {'projects': 2, 'tenders': 1, 'success_rate': 50},
            'الباحة': {'projects': 1, 'tenders': 1, 'success_rate': 55},
            'الجوف': {'projects': 2, 'tenders': 1, 'success_rate': 60}
        }
        
        # تحويل البيانات إلى DataFrame
        df = pd.DataFrame({
            'المنطقة': list(regions.keys()),
            'المشاريع النشطة': [r['projects'] for r in regions.values()],
            'المناقصات الحالية': [r['tenders'] for r in regions.values()],
            'نسبة النجاح (%)': [r['success_rate'] for r in regions.values()]
        })
        
        # عرض الجدول
        st.dataframe(df, use_container_width=True)
        
        # عرض الرسم البياني للمشاريع والمناقصات
        st.markdown("### توزيع المشاريع والمناقصات حسب المنطقة")
        
        chart_data = pd.DataFrame({
            'المنطقة': list(regions.keys()),
            'المشاريع النشطة': [r['projects'] for r in regions.values()],
            'المناقصات الحالية': [r['tenders'] for r in regions.values()]
        })
        
        st.bar_chart(chart_data.set_index('المنطقة'))
        
        # عرض خريطة المملكة مع تلوين المناطق حسب نسبة النجاح
        st.markdown("### خريطة نسب النجاح حسب المناطق")
        st.markdown("*قريباً: سيتم إضافة خريطة تفاعلية للمملكة مع تلوين المناطق حسب نسب النجاح*")
    
    def _generate_sample_projects(self):
        """
        إنشاء بيانات تجريبية للمشاريع
        """
        # قائمة المدن السعودية مع إحداثياتها
        cities = {
            'الرياض': {'lat': 24.7136, 'lng': 46.6753},
            'جدة': {'lat': 21.4858, 'lng': 39.1925},
            'مكة المكرمة': {'lat': 21.3891, 'lng': 39.8579},
            'المدينة المنورة': {'lat': 24.5247, 'lng': 39.5692},
            'الدمام': {'lat': 26.4207, 'lng': 50.0888},
            'الخبر': {'lat': 26.2172, 'lng': 50.1971},
            'تبوك': {'lat': 28.3998, 'lng': 36.5715},
            'أبها': {'lat': 18.2164, 'lng': 42.5053},
            'بريدة': {'lat': 26.3292, 'lng': 43.9708},
            'جازان': {'lat': 16.8892, 'lng': 42.5611}
        }
        
        # قائمة العملاء
        clients = [
            'وزارة النقل',
            'وزارة الإسكان',
            'وزارة التعليم',
            'وزارة الصحة',
            'أمانة منطقة الرياض',
            'أمانة محافظة جدة',
            'الهيئة الملكية لمدينة الرياض',
            'شركة أرامكو السعودية',
            'شركة سابك',
            'الهيئة السعودية للمدن الصناعية'
        ]
        
        # قائمة حالات المشاريع
        statuses = ['نشط', 'قيد التنفيذ', 'مناقصة', 'مكتمل']
        
        # إنشاء قائمة المشاريع
        projects = []
        for i in range(30):
            city_name = random.choice(list(cities.keys()))
            city_data = cities[city_name]
            
            # إضافة تغيير طفيف للإحداثيات لتجنب تراكب المؤشرات
            lat_offset = random.uniform(-0.1, 0.1)
            lng_offset = random.uniform(-0.1, 0.1)
            
            project = {
                'id': i + 1,
                'name': f'مشروع {i + 1}',
                'client': random.choice(clients),
                'city': city_name,
                'lat': city_data['lat'] + lat_offset,
                'lng': city_data['lng'] + lng_offset,
                'value': random.randint(1000000, 100000000),
                'status': random.choice(statuses)
            }
            projects.append(project)
        
        return projects