Spaces:
Paused
Paused
| 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 | |