EGYADMIN commited on
Commit
ee08f53
·
verified ·
1 Parent(s): 62a43ef

Create modules/requirement_analyzer.py

Browse files
modules/modules/requirement_analyzer.py ADDED
@@ -0,0 +1,211 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import re
2
+ import os
3
+ import json
4
+ import numpy as np
5
+ from typing import Dict, List, Any, Union, Tuple, Optional
6
+ from datetime import datetime
7
+
8
+ # استيراد نماذج الذكاء الاصطناعي
9
+ from modules.ai_models import LLMProcessor
10
+
11
+ class RequirementAnalyzer:
12
+ """
13
+ فئة لتحليل متطلبات المناقصة وتقييمها
14
+ """
15
+
16
+ def __init__(self, use_ai: bool = True):
17
+ """
18
+ تهيئة محلل المتطلبات
19
+
20
+ المعاملات:
21
+ ----------
22
+ use_ai : bool, optional
23
+ استخدام الذكاء الاصطناعي للتحليل المتقدم (افتراضي: True)
24
+ """
25
+ self.use_ai = use_ai
26
+
27
+ # تحميل قاعدة بيانات المتطلبات القياسية
28
+ self.standard_requirements = self._load_standard_requirements()
29
+
30
+ # تحميل معايير التقييم
31
+ self.evaluation_criteria = self._load_evaluation_criteria()
32
+
33
+ # إنشاء معالج نماذج اللغة الكبيرة إذا تم تفعيل استخدام الذكاء الاصطناعي
34
+ if self.use_ai:
35
+ self.llm_processor = LLMProcessor()
36
+
37
+ def _load_standard_requirements(self) -> Dict[str, List[Dict[str, Any]]]:
38
+ """
39
+ تحميل قاعدة بيانات المتطلبات القياسية
40
+ """
41
+ # في التطبيق الفعلي، قد تُحمل هذه البيانات من ملف أو قاعدة بيانات
42
+ return {
43
+ "عام": [
44
+ {
45
+ "id": "G001",
46
+ "title": "شهادات الاعتماد",
47
+ "description": "يجب أن يكون المورد/المقاول حاصل على الشهادات والاعتمادات الضرورية للعمل",
48
+ "importance": "عالية",
49
+ "category": "إدارية"
50
+ },
51
+ {
52
+ "id": "G002",
53
+ "title": "الخبرة السابقة",
54
+ "description": "يجب أن يكون لدى المورد/المقاول خبرة سابقة في أعمال مماثلة",
55
+ "importance": "عالية",
56
+ "category": "فنية"
57
+ }
58
+ ],
59
+ "إنشاءات": [
60
+ {
61
+ "id": "C001",
62
+ "title": "تصنيف المقاولين",
63
+ "description": "يجب أن يكون المقاول مصنف لدى وزارة الشؤون البلدية والقروية والإسكان في المجال والدرجة المطلوبة",
64
+ "importance": "عالية",
65
+ "category": "إدارية"
66
+ },
67
+ {
68
+ "id": "C002",
69
+ "title": "جودة المواد",
70
+ "description": "يجب أن تكون جميع المواد المستخدمة مطابقة للمواصفات القياسية السعودية",
71
+ "importance": "عالية",
72
+ "category": "فنية"
73
+ }
74
+ ],
75
+ "تقنية معلومات": [
76
+ {
77
+ "id": "IT001",
78
+ "title": "شهادة NITCS",
79
+ "description": "يجب أن يكون المورد حاصل على شهادة المركز الوطني للتصديق الرقمي",
80
+ "importance": "عالية",
81
+ "category": "إدارية"
82
+ },
83
+ {
84
+ "id": "IT002",
85
+ "title": "متطلبات الأمن السيبراني",
86
+ "description": "يجب الالتزام بمتطلبات الأمن السيبراني وفق ضوابط الهيئة الوطنية للأمن السيبراني",
87
+ "importance": "عالية",
88
+ "category": "فنية"
89
+ }
90
+ ]
91
+ }
92
+
93
+ def _load_evaluation_criteria(self) -> Dict[str, Dict[str, Any]]:
94
+ """
95
+ تحميل معايير التقييم للمتطلبات
96
+ """
97
+ # في التطبيق الفعلي، قد تُحمل هذه البيانات من ملف أو قاعدة بيانات
98
+ return {
99
+ "فنية": {
100
+ "weight": 0.6,
101
+ "subcriteria": {
102
+ "جودة الحلول المقترحة": 0.3,
103
+ "الخبرة في مشاريع مماثلة": 0.25,
104
+ "الكوادر الفنية": 0.25,
105
+ "المنهجية وخطة العمل": 0.2
106
+ }
107
+ },
108
+ "مالية": {
109
+ "weight": 0.3,
110
+ "subcriteria": {
111
+ "السعر الإجمالي": 0.7,
112
+ "تفاصيل التكاليف": 0.2,
113
+ "شروط الدفع": 0.1
114
+ }
115
+ },
116
+ "المحتوى المحلي": {
117
+ "weight": 0.1,
118
+ "subcriteria": {
119
+ "نسبة المحتوى المحلي": 0.7,
120
+ "توظيف الكوادر السعودية": 0.3
121
+ }
122
+ }
123
+ }
124
+
125
+ def analyze(self, extracted_data: Dict[str, Any]) -> Dict[str, Any]:
126
+ """
127
+ تحليل البيانات المستخرجة وتقييم المتطلبات
128
+
129
+ المعاملات:
130
+ ----------
131
+ extracted_data : Dict[str, Any]
132
+ البيانات المستخرجة من المستند
133
+
134
+ المخرجات:
135
+ --------
136
+ Dict[str, Any]
137
+ نتائج تحليل المتطلبات
138
+ """
139
+ analysis_results = {
140
+ "requirements": [],
141
+ "compliance": {},
142
+ "gaps": [],
143
+ "risks": [],
144
+ "recommendations": [],
145
+ "evaluation": {}
146
+ }
147
+
148
+ # استخراج المتطلبات من البيانات المستخرجة
149
+ if "requirements" in extracted_data:
150
+ requirements = extracted_data["requirements"]
151
+ else:
152
+ requirements = []
153
+
154
+ # تصنيف وتنظيم المتطلبات
155
+ categorized_reqs = self._categorize_requirements(requirements)
156
+ analysis_results["categorized_requirements"] = categorized_reqs
157
+
158
+ # تحليل الامتثال للمتطلبات القياسية
159
+ compliance_results = self._analyze_compliance(requirements)
160
+ analysis_results["compliance"] = compliance_results
161
+
162
+ # تحديد الفجوات في المتطلبات
163
+ gaps = self._identify_gaps(requirements, extracted_data)
164
+ analysis_results["gaps"] = gaps
165
+
166
+ # تحليل المخاطر المتعلقة بالمتطلبات
167
+ risks = self._analyze_risks(requirements, extracted_data)
168
+ analysis_results["risks"] = risks
169
+
170
+ # إعداد التوصيات
171
+ recommendations = self._generate_recommendations(
172
+ requirements, compliance_results, gaps, risks, extracted_data
173
+ )
174
+ analysis_results["recommendations"] = recommendations
175
+
176
+ # إعداد تقييم المتطلبات
177
+ if "project_type" in extracted_data:
178
+ project_type = extracted_data["project_type"]
179
+ else:
180
+ project_type = "عام"
181
+
182
+ evaluation = self._evaluate_requirements(requirements, project_type)
183
+ analysis_results["evaluation"] = evaluation
184
+
185
+ # استخدام الذكاء الاصطناعي للتحليل المتقدم إذا كان مفعلاً
186
+ if self.use_ai and requirements:
187
+ ai_analysis = self._analyze_with_ai(requirements, extracted_data)
188
+ analysis_results["ai_analysis"] = ai_analysis
189
+
190
+ # تضمين المتطلبات الكاملة في النتيجة
191
+ analysis_results["requirements"] = requirements
192
+
193
+ return analysis_results
194
+
195
+ def _categorize_requirements(self, requirements: List[Dict[str, Any]]) -> Dict[str, List[Dict[str, Any]]]:
196
+ """
197
+ تصنيف المتطلبات حسب الفئات
198
+ """
199
+ categorized = {}
200
+
201
+ # تصنيف المتطلبات حسب الفئة
202
+ for req in requirements:
203
+ category = req.get("category", "عامة")
204
+
205
+ if category not in categorized:
206
+ categorized[category] = []
207
+
208
+ categorized[category].append(req)
209
+
210
+ # تصنيف ثانوي حسب الأهمية
211
+ for category