Spaces:
Sleeping
Sleeping
import re | |
import os | |
import json | |
import numpy as np | |
from typing import Dict, List, Any | |
from datetime import datetime | |
# استيراد نماذج الذكاء الاصطناعي | |
from modules.ai_models import LLMProcessor | |
class RequirementAnalyzer: | |
""" | |
فئة لتحليل متطلبات المناقصة وتقييمها | |
""" | |
def __init__(self, use_ai: bool = True): | |
""" | |
تهيئة محلل المتطلبات | |
""" | |
self.use_ai = use_ai | |
# تحميل قاعدة بيانات المتطلبات القياسية | |
self.standard_requirements = self._load_standard_requirements() | |
# تحميل معايير التقييم | |
self.evaluation_criteria = self._load_evaluation_criteria() | |
# إنشاء معالج نماذج الذكاء الاصطناعي إذا تم تفعيله | |
if self.use_ai: | |
self.llm_processor = LLMProcessor() | |
def _load_standard_requirements(self) -> Dict[str, List[Dict[str, Any]]]: | |
""" | |
تحميل قاعدة بيانات المتطلبات القياسية | |
""" | |
return { | |
"عام": [ | |
{ | |
"id": "G001", | |
"title": "شهادات الاعتماد", | |
"description": "يجب أن يكون المورد/المقاول حاصل على الشهادات والاعتمادات الضرورية للعمل", | |
"importance": "عالية", | |
"category": "إدارية" | |
}, | |
{ | |
"id": "G002", | |
"title": "الخبرة السابقة", | |
"description": "يجب أن يكون لدى المورد/المقاول خبرة سابقة في أعمال مماثلة", | |
"importance": "عالية", | |
"category": "فنية" | |
} | |
] | |
} | |
def _load_evaluation_criteria(self) -> Dict[str, Dict[str, Any]]: | |
""" | |
تحميل معايير التقييم للمتطلبات | |
""" | |
return { | |
"فنية": { | |
"weight": 0.6, | |
"subcriteria": { | |
"جودة الحلول المقترحة": 0.3, | |
"الخبرة في مشاريع مماثلة": 0.25, | |
"الكوادر الفنية": 0.25, | |
"المنهجية وخطة العمل": 0.2 | |
} | |
}, | |
"مالية": { | |
"weight": 0.3, | |
"subcriteria": { | |
"السعر الإجمالي": 0.7, | |
"تفاصيل التكاليف": 0.2, | |
"شروط الدفع": 0.1 | |
} | |
} | |
} | |
def analyze(self, extracted_data: Dict[str, Any]) -> Dict[str, Any]: | |
""" | |
تحليل البيانات المستخرجة وتقييم المتطلبات | |
""" | |
analysis_results = { | |
"requirements": [], | |
"compliance": {}, | |
"gaps": [], | |
"risks": [], | |
"recommendations": [], | |
"evaluation": {} | |
} | |
# استخراج المتطلبات من البيانات المستخرجة | |
requirements = extracted_data.get("requirements", []) | |
# تحليل الامتثال للمتطلبات القياسية | |
compliance_results = self._analyze_compliance(requirements) | |
analysis_results["compliance"] = compliance_results | |
# تحديد الفجوات في المتطلبات | |
gaps = self._identify_gaps(requirements, extracted_data) | |
analysis_results["gaps"] = gaps | |
# تحليل المخاطر المتعلقة بالمتطلبات | |
risks = self._analyze_risks(requirements, extracted_data) | |
analysis_results["risks"] = risks | |
# إعداد التوصيات | |
recommendations = self._generate_recommendations(requirements, compliance_results, gaps, risks, extracted_data) | |
analysis_results["recommendations"] = recommendations | |
return analysis_results | |
def _analyze_compliance(self, requirements: List[Dict[str, Any]]) -> Dict[str, Any]: | |
""" | |
تحليل امتثال المتطلبات للمعايير القياسية | |
""" | |
compliance_results = { | |
"compliant": [], | |
"missing": [], | |
"compliance_rate": 0.0 | |
} | |
standard_reqs = self.standard_requirements["عام"] | |
for std_req in standard_reqs: | |
found = any(std_req["title"].lower() in req.get("title", "").lower() for req in requirements) | |
if found: | |
compliance_results["compliant"].append(std_req) | |
else: | |
compliance_results["missing"].append(std_req) | |
total_std_reqs = len(standard_reqs) | |
if total_std_reqs > 0: | |
compliance_results["compliance_rate"] = round( | |
len(compliance_results["compliant"]) / total_std_reqs * 100, 2 | |
) | |
return compliance_results | |
def _identify_gaps(self, requirements: List[Dict[str, Any]], extracted_data: Dict[str, Any]) -> List[Dict[str, Any]]: | |
""" | |
تحديد الفجوات في المتطلبات | |
""" | |
gaps = [] | |
for missing_req in self.standard_requirements.get("عام", []): | |
if not any(missing_req["title"].lower() in req.get("title", "").lower() for req in requirements): | |
gaps.append({ | |
"type": "متطلب قياسي مفقود", | |
"requirement": missing_req, | |
"severity": "عالية" | |
}) | |
return gaps | |
def _analyze_risks(self, requirements: List[Dict[str, Any]], extracted_data: Dict[str, Any]) -> List[Dict[str, Any]]: | |
""" | |
تحليل المخاطر المتعلقة بالمتطلبات | |
""" | |
risks = [] | |
# مخاطر وجود متطلبات غامضة | |
vague_requirements = [req for req in requirements if len(req.get("description", "")) < 30] | |
if vague_requirements: | |
risks.append({ | |
"title": "متطلبات غير واضحة", | |
"severity": "عالية", | |
"impact": "قد يؤدي إلى نزاعات وتأخير في التنفيذ" | |
}) | |
return risks | |
def _generate_recommendations(self, requirements: List[Dict[str, Any]], compliance_results: Dict[str, Any], | |
gaps: List[Dict[str, Any]], risks: List[Dict[str, Any]], | |
extracted_data: Dict[str, Any]) -> List[Dict[str, Any]]: | |
""" | |
إعداد توصيات لتحسين المتطلبات | |
""" | |
recommendations = [] | |
# توصيات لسد الفجوات | |
for gap in gaps: | |
recommendations.append({ | |
"title": f"معالجة فجوة: {gap['type']}", | |
"priority": "عالية" | |
}) | |
# توصيات لمعالجة المخاطر | |
for risk in risks: | |
recommendations.append({ | |
"title": f"معالجة خطر: {risk['title']}", | |
"priority": "عالية" | |
}) | |
return recommendations | |