|
|
|
""" |
|
وحدة مساعد الذكاء الاصطناعي |
|
""" |
|
|
|
import streamlit as st |
|
import pandas as pd |
|
import numpy as np |
|
import matplotlib.pyplot as plt |
|
import plotly.express as px |
|
import plotly.graph_objects as go |
|
import seaborn as sns |
|
from datetime import datetime |
|
import time |
|
import os |
|
import sys |
|
import json |
|
import requests |
|
from pathlib import Path |
|
import io |
|
import base64 |
|
import re |
|
from PIL import Image |
|
import PyPDF2 |
|
import docx |
|
import anthropic |
|
import tempfile |
|
|
|
|
|
current_dir = os.path.dirname(os.path.abspath(__file__)) |
|
parent_dir = os.path.dirname(os.path.dirname(current_dir)) |
|
if parent_dir not in sys.path: |
|
sys.path.append(parent_dir) |
|
|
|
class AIAssistantApp: |
|
"""تطبيق مساعد الذكاء الاصطناعي""" |
|
|
|
def __init__(self): |
|
"""تهيئة تطبيق مساعد الذكاء الاصطناعي""" |
|
self.uploaded_files = {} |
|
self.analysis_results = {} |
|
|
|
|
|
if 'ai_api_key' not in st.session_state: |
|
st.session_state.ai_api_key = os.environ.get('AI_API_KEY', '') |
|
|
|
if 'anthropic_api_key' not in st.session_state: |
|
st.session_state.anthropic_api_key = os.environ.get('ANTHROPIC_API_KEY', '') |
|
|
|
|
|
if 'chat_history' not in st.session_state: |
|
st.session_state.chat_history = [] |
|
|
|
def run(self): |
|
"""تشغيل تطبيق مساعد الذكاء الاصطناعي""" |
|
|
|
from config_manager import ConfigManager |
|
|
|
|
|
config_manager = ConfigManager() |
|
config_manager.set_page_config_if_needed( |
|
page_title="مساعد الذكاء الاصطناعي", |
|
page_icon="🤖", |
|
layout="wide" |
|
) |
|
|
|
|
|
st.title("مساعد الذكاء الاصطناعي") |
|
|
|
|
|
tabs = st.tabs([ |
|
"المحادثة مع الذكاء الاصطناعي", |
|
"تحليل المستندات", |
|
"تحليل العقود", |
|
"تقدير التكاليف", |
|
"تحليل المخاطر" |
|
]) |
|
|
|
|
|
with tabs[0]: |
|
self._render_chat_tab() |
|
|
|
with tabs[1]: |
|
self._render_document_analysis_tab() |
|
|
|
with tabs[2]: |
|
self._render_contract_analysis_tab() |
|
|
|
with tabs[3]: |
|
self._render_cost_estimation_tab() |
|
|
|
with tabs[4]: |
|
self._render_risk_analysis_tab() |
|
|
|
def _render_chat_tab(self): |
|
"""عرض تبويب المحادثة مع الذكاء الاصطناعي""" |
|
st.markdown("### المحادثة مع الذكاء الاصطناعي") |
|
|
|
st.markdown(""" |
|
يمكنك استخدام هذه الأداة للتواصل مع نماذج الذكاء الاصطناعي المتقدمة للحصول على المساعدة في: |
|
- الاستفسارات حول مشاريع البناء والمقاولات |
|
- تحليل بيانات المشاريع |
|
- الحصول على توصيات وأفضل الممارسات |
|
- حل المشكلات الفنية |
|
- أي استفسارات أخرى متعلقة بالمشاريع |
|
""") |
|
|
|
|
|
ai_model = st.selectbox( |
|
"اختر نموذج الذكاء الاصطناعي:", |
|
["ai", "anthropic"], |
|
index=0 |
|
) |
|
|
|
|
|
chat_container = st.container() |
|
with chat_container: |
|
for message in st.session_state.chat_history: |
|
if message["role"] == "user": |
|
st.markdown(f"**أنت**: {message['content']}") |
|
else: |
|
st.markdown(f"**الذكاء الاصطناعي**: {message['content']}") |
|
|
|
|
|
with st.form(key="chat_form", clear_on_submit=True): |
|
user_input = st.text_area("اكتب رسالتك هنا:", height=100) |
|
submit_button = st.form_submit_button("إرسال") |
|
|
|
if submit_button and user_input: |
|
|
|
st.session_state.chat_history.append({"role": "user", "content": user_input}) |
|
|
|
|
|
with st.spinner("جاري التفكير..."): |
|
ai_response = self._get_ai_response(user_input, ai_model) |
|
|
|
|
|
st.session_state.chat_history.append({"role": "assistant", "content": ai_response}) |
|
|
|
|
|
st.rerun() |
|
|
|
|
|
if st.button("مسح المحادثة"): |
|
st.session_state.chat_history = [] |
|
st.rerun() |
|
|
|
def _get_ai_response(self, user_input, model): |
|
"""الحصول على رد من نموذج الذكاء الاصطناعي""" |
|
try: |
|
if model == "ai": |
|
|
|
api_key = st.session_state.ai_api_key |
|
if not api_key: |
|
return "لم يتم تكوين مفتاح API لنموذج ai. يرجى تكوين المفتاح في الإعدادات." |
|
|
|
|
|
messages = [] |
|
for message in st.session_state.chat_history: |
|
messages.append({ |
|
"role": message["role"], |
|
"content": message["content"] |
|
}) |
|
|
|
|
|
messages.append({ |
|
"role": "user", |
|
"content": user_input |
|
}) |
|
|
|
|
|
headers = { |
|
"Authorization": f"Bearer {api_key}", |
|
"Content-Type": "application/json" |
|
} |
|
|
|
payload = { |
|
"model": "gpt-4", |
|
"messages": messages, |
|
"temperature": 0.7 |
|
} |
|
|
|
response = requests.post( |
|
"https://api.openai.com/v1/chat/completions", |
|
headers=headers, |
|
json=payload |
|
) |
|
|
|
if response.status_code == 200: |
|
return response.json()["choices"][0]["message"]["content"] |
|
else: |
|
return f"حدث خطأ أثناء الاتصال بنموذج ai: {response.text}" |
|
|
|
elif model == "anthropic": |
|
|
|
api_key = st.session_state.anthropic_api_key |
|
if not api_key: |
|
return "لم يتم تكوين مفتاح API لنموذج anthropic. يرجى تكوين المفتاح في الإعدادات." |
|
|
|
|
|
messages = [] |
|
for message in st.session_state.chat_history: |
|
messages.append({ |
|
"role": message["role"], |
|
"content": message["content"] |
|
}) |
|
|
|
|
|
client = anthropic.Anthropic(api_key=api_key) |
|
|
|
|
|
response = client.messages.create( |
|
model="claude-2", |
|
max_tokens=1000, |
|
temperature=0.7, |
|
system="أنت مساعد ذكي متخصص في مجال البناء والمقاولات في المملكة العربية السعودية. تقدم معلومات دقيقة وموثوقة.", |
|
messages=messages + [{"role": "user", "content": user_input}] |
|
) |
|
|
|
return response.content[0].text |
|
|
|
else: |
|
return "النموذج المحدد غير مدعوم." |
|
|
|
except Exception as e: |
|
return f"حدث خطأ أثناء الاتصال بنموذج الذكاء الاصطناعي: {str(e)}" |
|
|
|
def _render_document_analysis_tab(self): |
|
"""عرض تبويب تحليل المستندات""" |
|
st.markdown("### تحليل المستندات") |
|
|
|
st.markdown(""" |
|
يمكنك استخدام هذه الأداة لتحليل المستندات والتقارير باستخدام الذكاء الاصطناعي. |
|
الأداة تدعم تحليل الملفات التالية: |
|
- ملفات PDF |
|
- ملفات Word |
|
- ملفات النصوص TXT |
|
""") |
|
|
|
|
|
doc_tabs = st.tabs([ |
|
"تحميل المستندات", |
|
"استخراج النص", |
|
"تحليل المحتوى", |
|
"الملخص والتوصيات" |
|
]) |
|
|
|
|
|
with doc_tabs[0]: |
|
st.markdown("#### تحميل المستندات") |
|
|
|
uploaded_file = st.file_uploader( |
|
"اختر ملفًا للتحليل (PDF, DOCX, TXT):", |
|
type=["pdf", "docx", "txt"], |
|
key="document_file_uploader" |
|
) |
|
|
|
if uploaded_file: |
|
|
|
file_details = { |
|
"filename": uploaded_file.name, |
|
"filetype": uploaded_file.type, |
|
"filesize": uploaded_file.size |
|
} |
|
|
|
st.write(f"**تم تحميل الملف:** {file_details['filename']}") |
|
st.write(f"**نوع الملف:** {file_details['filetype']}") |
|
st.write(f"**حجم الملف:** {file_details['filesize']} بايت") |
|
|
|
|
|
self.uploaded_files["document"] = uploaded_file |
|
|
|
st.success("تم تحميل الملف بنجاح. انتقل إلى تبويب 'استخراج النص' للمتابعة.") |
|
|
|
|
|
with doc_tabs[1]: |
|
st.markdown("#### استخراج النص") |
|
|
|
if "document" not in self.uploaded_files: |
|
st.info("الرجاء تحميل مستند أولاً من تبويب 'تحميل المستندات'.") |
|
else: |
|
if st.button("استخراج النص من المستند"): |
|
with st.spinner("جاري استخراج النص..."): |
|
|
|
extracted_text = self._extract_text_from_file(self.uploaded_files["document"]) |
|
|
|
|
|
if "analysis_results" not in st.session_state: |
|
st.session_state.analysis_results = {} |
|
|
|
st.session_state.analysis_results["extracted_text"] = extracted_text |
|
|
|
|
|
st.markdown("##### النص المستخرج:") |
|
st.text_area("", extracted_text, height=400, disabled=True) |
|
|
|
st.success("تم استخراج النص بنجاح. انتقل إلى تبويب 'تحليل المحتوى' للمتابعة.") |
|
|
|
|
|
if "analysis_results" in st.session_state and "extracted_text" in st.session_state.analysis_results: |
|
st.markdown("##### النص المستخرج:") |
|
st.text_area("", st.session_state.analysis_results["extracted_text"], height=400, disabled=True) |
|
|
|
|
|
with doc_tabs[2]: |
|
st.markdown("#### تحليل المحتوى") |
|
|
|
if "analysis_results" not in st.session_state or "extracted_text" not in st.session_state.analysis_results: |
|
st.info("الرجاء استخراج النص أولاً من تبويب 'استخراج النص'.") |
|
else: |
|
|
|
ai_model = st.selectbox( |
|
"اختر نموذج الذكاء الاصطناعي للتحليل:", |
|
["ai", "anthropic"], |
|
index=0, |
|
key="doc_analysis_model" |
|
) |
|
|
|
analysis_type = st.selectbox( |
|
"اختر نوع التحليل:", |
|
[ |
|
"تحليل عام", |
|
"استخراج المعلومات الرئيسية", |
|
"تحديد الكلمات المفتاحية", |
|
"تحليل المتطلبات الفنية", |
|
"تحليل التكاليف والأسعار" |
|
] |
|
) |
|
|
|
if st.button("تحليل المحتوى"): |
|
with st.spinner("جاري تحليل المحتوى..."): |
|
|
|
if analysis_type == "تحليل عام": |
|
prompt = "قم بتحليل النص التالي وتقديم ملخص شامل له:\n\n" |
|
elif analysis_type == "استخراج المعلومات الرئيسية": |
|
prompt = "استخرج المعلومات الرئيسية والنقاط المهمة من النص التالي:\n\n" |
|
elif analysis_type == "تحديد الكلمات المفتاحية": |
|
prompt = "حدد الكلمات المفتاحية والمصطلحات المهمة في النص التالي:\n\n" |
|
elif analysis_type == "تحليل المتطلبات الفنية": |
|
prompt = "استخرج المتطلبات الفنية والمواصفات من النص التالي:\n\n" |
|
elif analysis_type == "تحليل التكاليف والأسعار": |
|
prompt = "استخرج جميع المعلومات المتعلقة بالتكاليف والأسعار من النص التالي:\n\n" |
|
|
|
|
|
prompt += st.session_state.analysis_results["extracted_text"] |
|
|
|
|
|
analysis_result = self._get_ai_response(prompt, ai_model) |
|
|
|
|
|
st.session_state.analysis_results["content_analysis"] = analysis_result |
|
|
|
|
|
st.markdown("##### نتيجة التحليل:") |
|
st.markdown(analysis_result) |
|
|
|
st.success("تم تحليل المحتوى بنجاح. انتقل إلى تبويب 'الملخص والتوصيات' للمتابعة.") |
|
|
|
|
|
if "content_analysis" in st.session_state.analysis_results: |
|
st.markdown("##### نتيجة التحليل:") |
|
st.markdown(st.session_state.analysis_results["content_analysis"]) |
|
|
|
|
|
with doc_tabs[3]: |
|
st.markdown("#### الملخص والتوصيات") |
|
|
|
if "analysis_results" not in st.session_state or "content_analysis" not in st.session_state.analysis_results: |
|
st.info("الرجاء تحليل المحتوى أولاً من تبويب 'تحليل المحتوى'.") |
|
else: |
|
|
|
ai_model = st.selectbox( |
|
"اختر نموذج الذكاء الاصطناعي للتوصيات:", |
|
["ai", "anthropic"], |
|
index=0, |
|
key="doc_summary_model" |
|
) |
|
|
|
if st.button("إنشاء ملخص وتوصيات"): |
|
with st.spinner("جاري إنشاء الملخص والتوصيات..."): |
|
|
|
prompt = f""" |
|
بناءً على التحليل التالي للمستند: |
|
|
|
{st.session_state.analysis_results['content_analysis']} |
|
|
|
قم بإنشاء: |
|
1. ملخص موجز للمستند (لا يزيد عن 3 فقرات) |
|
2. النقاط الرئيسية (5-7 نقاط) |
|
3. توصيات عملية (3-5 توصيات) |
|
4. الخطوات التالية المقترحة |
|
""" |
|
|
|
|
|
summary_result = self._get_ai_response(prompt, ai_model) |
|
|
|
|
|
st.session_state.analysis_results["summary_recommendations"] = summary_result |
|
|
|
|
|
st.markdown("##### الملخص والتوصيات:") |
|
st.markdown(summary_result) |
|
|
|
|
|
if "summary_recommendations" in st.session_state.analysis_results: |
|
st.markdown("##### الملخص والتوصيات:") |
|
st.markdown(st.session_state.analysis_results["summary_recommendations"]) |
|
|
|
|
|
report_file_name = f"تحليل_المستند_{datetime.now().strftime('%Y%m%d_%H%M%S')}" |
|
|
|
col1, col2, col3 = st.columns(3) |
|
|
|
with col1: |
|
|
|
report_content = f""" |
|
# تقرير تحليل المستند |
|
|
|
**تاريخ التحليل:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} |
|
|
|
## النص المستخرج |
|
{st.session_state.analysis_results['extracted_text'][:1000]}... |
|
|
|
## نتيجة التحليل |
|
{st.session_state.analysis_results['content_analysis']} |
|
|
|
## الملخص والتوصيات |
|
{st.session_state.analysis_results['summary_recommendations']} |
|
""" |
|
|
|
st.download_button( |
|
label="تصدير التقرير (PDF)", |
|
data=report_content.encode('utf-8'), |
|
file_name=f"{report_file_name}.pdf", |
|
mime="application/pdf", |
|
key="export_doc_report_pdf" |
|
) |
|
|
|
with col2: |
|
|
|
st.download_button( |
|
label="تصدير التقرير (Word)", |
|
data=report_content.encode('utf-8'), |
|
file_name=f"{report_file_name}.docx", |
|
mime="application/vnd.openxmlformats-officedocument.wordprocessingml.document", |
|
key="export_doc_report_word" |
|
) |
|
|
|
with col3: |
|
|
|
st.download_button( |
|
label="تصدير التقرير (TXT)", |
|
data=report_content.encode('utf-8'), |
|
file_name=f"{report_file_name}.txt", |
|
mime="text/plain", |
|
key="export_doc_report_txt" |
|
) |
|
|
|
def _render_contract_analysis_tab(self): |
|
"""عرض تبويب تحليل العقود""" |
|
st.markdown("### تحليل العقود") |
|
|
|
st.markdown(""" |
|
يمكنك استخدام هذه الأداة لتحليل العقود واستخراج البنود المهمة باستخدام الذكاء الاصطناعي. |
|
الأداة تدعم تحليل الملفات التالية: |
|
- ملفات PDF |
|
- ملفات Word |
|
- ملفات النصوص TXT |
|
""") |
|
|
|
|
|
contract_tabs = st.tabs([ |
|
"تحميل العقد", |
|
"استخراج البنود", |
|
"تحليل المخاطر", |
|
"التقرير النهائي" |
|
]) |
|
|
|
|
|
with contract_tabs[0]: |
|
st.markdown("#### تحميل العقد") |
|
|
|
uploaded_file = st.file_uploader( |
|
"اختر ملف العقد للتحليل (PDF, DOCX, TXT):", |
|
type=["pdf", "docx", "txt"], |
|
key="contract_file_uploader" |
|
) |
|
|
|
if uploaded_file: |
|
|
|
file_details = { |
|
"filename": uploaded_file.name, |
|
"filetype": uploaded_file.type, |
|
"filesize": uploaded_file.size |
|
} |
|
|
|
st.write(f"**تم تحميل الملف:** {file_details['filename']}") |
|
st.write(f"**نوع الملف:** {file_details['filetype']}") |
|
st.write(f"**حجم الملف:** {file_details['filesize']} بايت") |
|
|
|
|
|
self.uploaded_files["contract"] = uploaded_file |
|
|
|
st.success("تم تحميل العقد بنجاح. انتقل إلى تبويب 'استخراج البنود' للمتابعة.") |
|
|
|
|
|
with contract_tabs[1]: |
|
st.markdown("#### استخراج البنود") |
|
|
|
if "contract" not in self.uploaded_files: |
|
st.info("الرجاء تحميل عقد أولاً من تبويب 'تحميل العقد'.") |
|
else: |
|
if st.button("استخراج بنود العقد"): |
|
with st.spinner("جاري استخراج بنود العقد..."): |
|
|
|
contract_text = self._extract_text_from_file(self.uploaded_files["contract"]) |
|
|
|
|
|
if "contract_analysis" not in st.session_state: |
|
st.session_state.contract_analysis = {} |
|
|
|
st.session_state.contract_analysis["contract_text"] = contract_text |
|
|
|
|
|
ai_model = "ai" |
|
|
|
|
|
prompt = """ |
|
استخرج البنود الرئيسية من العقد التالي وصنفها حسب النوع (مثل: بنود مالية، بنود قانونية، بنود فنية، إلخ). |
|
لكل بند، قدم: |
|
1. رقم البند (إن وجد) |
|
2. عنوان البند |
|
3. ملخص موجز للبند |
|
4. تصنيف البند |
|
|
|
نص العقد: |
|
""" |
|
prompt += contract_text |
|
|
|
|
|
clauses_result = self._get_ai_response(prompt, ai_model) |
|
|
|
|
|
st.session_state.contract_analysis["extracted_clauses"] = clauses_result |
|
|
|
|
|
st.markdown("##### البنود المستخرجة:") |
|
st.markdown(clauses_result) |
|
|
|
st.success("تم استخراج بنود العقد بنجاح. انتقل إلى تبويب 'تحليل المخاطر' للمتابعة.") |
|
|
|
|
|
if "contract_analysis" in st.session_state and "extracted_clauses" in st.session_state.contract_analysis: |
|
st.markdown("##### البنود المستخرجة:") |
|
st.markdown(st.session_state.contract_analysis["extracted_clauses"]) |
|
|
|
|
|
with contract_tabs[2]: |
|
st.markdown("#### تحليل المخاطر") |
|
|
|
if "contract_analysis" not in st.session_state or "extracted_clauses" not in st.session_state.contract_analysis: |
|
st.info("الرجاء استخراج بنود العقد أولاً من تبويب 'استخراج البنود'.") |
|
else: |
|
if st.button("تحليل المخاطر في العقد"): |
|
with st.spinner("جاري تحليل المخاطر..."): |
|
|
|
ai_model = "anthropic" |
|
|
|
|
|
prompt = f""" |
|
بناءً على البنود المستخرجة من العقد: |
|
|
|
{st.session_state.contract_analysis['extracted_clauses']} |
|
|
|
قم بتحليل المخاطر المحتملة في هذا العقد، وتصنيفها إلى: |
|
1. مخاطر عالية (تتطلب اهتمامًا فوريًا) |
|
2. مخاطر متوسطة (تتطلب مراقبة) |
|
3. مخاطر منخفضة (تتطلب وعيًا) |
|
|
|
لكل مخاطرة، قدم: |
|
- وصف المخاطرة |
|
- البند المرتبط بها |
|
- التأثير المحتمل |
|
- توصيات للتخفيف من المخاطرة |
|
""" |
|
|
|
|
|
risk_analysis = self._get_ai_response(prompt, ai_model) |
|
|
|
|
|
st.session_state.contract_analysis["risk_analysis"] = risk_analysis |
|
|
|
|
|
st.markdown("##### تحليل المخاطر:") |
|
st.markdown(risk_analysis) |
|
|
|
st.success("تم تحليل المخاطر بنجاح. انتقل إلى تبويب 'التقرير النهائي' للمتابعة.") |
|
|
|
|
|
if "risk_analysis" in st.session_state.contract_analysis: |
|
st.markdown("##### تحليل المخاطر:") |
|
st.markdown(st.session_state.contract_analysis["risk_analysis"]) |
|
|
|
|
|
with contract_tabs[3]: |
|
st.markdown("#### التقرير النهائي") |
|
|
|
if "contract_analysis" not in st.session_state or "risk_analysis" not in st.session_state.contract_analysis: |
|
st.info("الرجاء تحليل المخاطر أولاً من تبويب 'تحليل المخاطر'.") |
|
else: |
|
if st.button("إنشاء التقرير النهائي"): |
|
with st.spinner("جاري إنشاء التقرير النهائي..."): |
|
|
|
ai_model = "ai" |
|
|
|
|
|
prompt = f""" |
|
بناءً على تحليل العقد وتحليل المخاطر: |
|
|
|
البنود المستخرجة: |
|
{st.session_state.contract_analysis['extracted_clauses']} |
|
|
|
تحليل المخاطر: |
|
{st.session_state.contract_analysis['risk_analysis']} |
|
|
|
قم بإنشاء تقرير نهائي يتضمن: |
|
1. ملخص تنفيذي للعقد |
|
2. أهم البنود وتأثيرها |
|
3. ملخص المخاطر الرئيسية |
|
4. التوصيات والاقتراحات |
|
5. الخطوات التالية الموصى بها |
|
""" |
|
|
|
|
|
final_report = self._get_ai_response(prompt, ai_model) |
|
|
|
|
|
st.session_state.contract_analysis["final_report"] = final_report |
|
|
|
|
|
st.markdown("##### التقرير النهائي:") |
|
st.markdown(final_report) |
|
|
|
|
|
if "final_report" in st.session_state.contract_analysis: |
|
st.markdown("##### التقرير النهائي:") |
|
st.markdown(st.session_state.contract_analysis["final_report"]) |
|
|
|
|
|
report_file_name = f"تحليل_العقد_{datetime.now().strftime('%Y%m%d_%H%M%S')}" |
|
|
|
col1, col2, col3 = st.columns(3) |
|
|
|
with col1: |
|
|
|
report_content = f""" |
|
# تقرير تحليل العقد |
|
|
|
**تاريخ التحليل:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} |
|
|
|
## البنود المستخرجة |
|
{st.session_state.contract_analysis['extracted_clauses']} |
|
|
|
## تحليل المخاطر |
|
{st.session_state.contract_analysis['risk_analysis']} |
|
|
|
## التقرير النهائي |
|
{st.session_state.contract_analysis['final_report']} |
|
""" |
|
|
|
st.download_button( |
|
label="تصدير التقرير (PDF)", |
|
data=report_content.encode('utf-8'), |
|
file_name=f"{report_file_name}.pdf", |
|
mime="application/pdf", |
|
key="export_contract_report_pdf" |
|
) |
|
|
|
with col2: |
|
|
|
st.download_button( |
|
label="تصدير التقرير (Word)", |
|
data=report_content.encode('utf-8'), |
|
file_name=f"{report_file_name}.docx", |
|
mime="application/vnd.openxmlformats-officedocument.wordprocessingml.document", |
|
key="export_contract_report_word" |
|
) |
|
|
|
with col3: |
|
|
|
st.download_button( |
|
label="تصدير التقرير (TXT)", |
|
data=report_content.encode('utf-8'), |
|
file_name=f"{report_file_name}.txt", |
|
mime="text/plain", |
|
key="export_contract_report_txt" |
|
) |
|
|
|
def _render_cost_estimation_tab(self): |
|
"""عرض تبويب تقدير التكاليف باستخدام نماذج هجين فيس""" |
|
|
|
st.markdown("### تقدير التكاليف") |
|
|
|
st.markdown(""" |
|
يمكنك استخدام هذه الأداة لتقدير تكاليف المشاريع باستخدام نماذج الذكاء الاصطناعي المتقدمة من بيئة هجين فيس. |
|
الأداة تدعم تحليل الملفات التالية: |
|
- ملفات PDF (كراسات الشروط، المواصفات الفنية) |
|
- ملفات DWG (المخططات الهندسية) |
|
- ملفات Excel (جداول الكميات، التكاليف) |
|
- ملفات Word (العقود، المستندات) |
|
- ملفات النصوص TXT |
|
- ملفات الصور (PNG, JPG) للمخططات والرسومات |
|
""") |
|
|
|
|
|
cost_tabs = st.tabs([ |
|
"تحميل الملفات", |
|
"تقدير التكاليف", |
|
"تحليل البنود", |
|
"المقارنة مع السوق", |
|
"التقارير" |
|
]) |
|
|
|
|
|
with cost_tabs[0]: |
|
st.markdown("#### تحميل ملفات المشروع") |
|
|
|
uploaded_files = st.file_uploader( |
|
"اختر ملفات المشروع للتحليل:", |
|
type=["pdf", "dwg", "xlsx", "xls", "docx", "doc", "txt", "png", "jpg", "jpeg"], |
|
accept_multiple_files=True, |
|
key="cost_files_uploader" |
|
) |
|
|
|
if uploaded_files: |
|
|
|
if "cost_files" not in st.session_state: |
|
st.session_state.cost_files = [] |
|
|
|
for uploaded_file in uploaded_files: |
|
file_details = { |
|
"filename": uploaded_file.name, |
|
"filetype": uploaded_file.type, |
|
"filesize": uploaded_file.size, |
|
"file": uploaded_file |
|
} |
|
|
|
|
|
if not any(f["filename"] == file_details["filename"] for f in st.session_state.cost_files): |
|
st.session_state.cost_files.append(file_details) |
|
|
|
|
|
st.markdown("##### الملفات المرفوعة:") |
|
|
|
for i, file in enumerate(st.session_state.cost_files): |
|
col1, col2, col3, col4 = st.columns([3, 2, 2, 1]) |
|
|
|
with col1: |
|
st.write(f"{i+1}. {file['filename']}") |
|
|
|
with col2: |
|
st.write(f"النوع: {self._detect_file_type(file['filename'])}") |
|
|
|
with col3: |
|
st.write(f"الحجم: {file['filesize']} بايت") |
|
|
|
with col4: |
|
if st.button("حذف", key=f"delete_file_{i}"): |
|
st.session_state.cost_files.pop(i) |
|
st.rerun() |
|
|
|
st.success(f"تم تحميل {len(st.session_state.cost_files)} ملف بنجاح. انتقل إلى تبويب 'تقدير التكاليف' للمتابعة.") |
|
|
|
|
|
with cost_tabs[1]: |
|
st.markdown("#### تقدير التكاليف") |
|
|
|
if "cost_files" not in st.session_state or not st.session_state.cost_files: |
|
st.info("الرجاء تحميل ملفات المشروع أولاً من تبويب 'تحميل الملفات'.") |
|
else: |
|
|
|
st.markdown("##### معلومات المشروع") |
|
|
|
col1, col2 = st.columns(2) |
|
|
|
with col1: |
|
project_name = st.text_input("اسم المشروع:", key="project_name") |
|
project_location = st.text_input("موقع المشروع:", key="project_location") |
|
|
|
with col2: |
|
project_type = st.selectbox( |
|
"نوع المشروع:", |
|
[ |
|
"سكني", |
|
"تجاري", |
|
"صناعي", |
|
"بنية تحتية", |
|
"طرق", |
|
"أخرى" |
|
], |
|
key="project_type" |
|
) |
|
|
|
project_area = st.number_input("مساحة المشروع (م²):", min_value=0, key="project_area") |
|
|
|
|
|
ai_model = st.selectbox( |
|
"اختر نموذج الذكاء الاصطناعي للتقدير:", |
|
["ai", "anthropic"], |
|
index=0, |
|
key="cost_estimation_model" |
|
) |
|
|
|
if st.button("تقدير التكاليف"): |
|
with st.spinner("جاري تقدير التكاليف..."): |
|
|
|
all_texts = [] |
|
|
|
for file_info in st.session_state.cost_files: |
|
try: |
|
text = self._extract_text_from_file(file_info["file"]) |
|
all_texts.append(f"من ملف {file_info['filename']}:\n{text[:2000]}") |
|
except Exception as e: |
|
st.warning(f"تعذر استخراج النص من الملف {file_info['filename']}: {str(e)}") |
|
|
|
combined_text = "\n\n".join(all_texts) |
|
|
|
|
|
prompt = f""" |
|
أنت خبير في تقدير تكاليف مشاريع البناء والمقاولات في المملكة العربية السعودية. |
|
|
|
معلومات المشروع: |
|
- اسم المشروع: {project_name} |
|
- موقع المشروع: {project_location} |
|
- نوع المشروع: {project_type} |
|
- مساحة المشروع: {project_area} م² |
|
|
|
بناءً على المعلومات التالية المستخرجة من ملفات المشروع، قم بتقدير: |
|
1. التكلفة الإجمالية التقديرية للمشروع |
|
2. تفصيل التكاليف حسب البنود الرئيسية (مواد، عمالة، معدات، إلخ) |
|
3. تكلفة المتر المربع |
|
4. المدة الزمنية المتوقعة للتنفيذ |
|
5. العوامل التي قد تؤثر على التكلفة |
|
|
|
المعلومات المستخرجة من الملفات: |
|
{combined_text} |
|
|
|
قدم النتائج بتنسيق منظم وواضح، مع تفصيل الافتراضات التي اعتمدت عليها في التقدير. |
|
""" |
|
|
|
|
|
cost_estimation = self._get_ai_response(prompt, ai_model) |
|
|
|
|
|
if "cost_analysis" not in st.session_state: |
|
st.session_state.cost_analysis = {} |
|
|
|
st.session_state.cost_analysis["cost_estimation"] = cost_estimation |
|
|
|
|
|
st.markdown("##### نتيجة تقدير التكاليف:") |
|
st.markdown(cost_estimation) |
|
|
|
st.success("تم تقدير التكاليف بنجاح. انتقل إلى تبويب 'تحليل البنود' للمتابعة.") |
|
|
|
|
|
if "cost_analysis" in st.session_state and "cost_estimation" in st.session_state.cost_analysis: |
|
st.markdown("##### نتيجة تقدير التكاليف:") |
|
st.markdown(st.session_state.cost_analysis["cost_estimation"]) |
|
|
|
|
|
report_file_name = f"تقدير_التكاليف_{datetime.now().strftime('%Y%m%d_%H%M%S')}" |
|
|
|
col1, col2 = st.columns(2) |
|
|
|
with col1: |
|
|
|
report_content = f""" |
|
# تقرير تقدير التكاليف |
|
|
|
**تاريخ التقدير:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} |
|
|
|
## معلومات المشروع |
|
- **اسم المشروع:** {project_name} |
|
- **موقع المشروع:** {project_location} |
|
- **نوع المشروع:** {project_type} |
|
- **مساحة المشروع:** {project_area} م² |
|
|
|
## نتيجة تقدير التكاليف |
|
{st.session_state.cost_analysis['cost_estimation']} |
|
""" |
|
|
|
st.download_button( |
|
label="تصدير التقرير (PDF)", |
|
data=report_content.encode('utf-8'), |
|
file_name=f"{report_file_name}.pdf", |
|
mime="application/pdf", |
|
key="export_cost_report_pdf" |
|
) |
|
|
|
with col2: |
|
|
|
st.download_button( |
|
label="تصدير البيانات (Excel)", |
|
data=report_content.encode('utf-8'), |
|
file_name=f"{report_file_name}.xlsx", |
|
mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", |
|
key="export_cost_report_excel" |
|
) |
|
|
|
|
|
with cost_tabs[2]: |
|
st.markdown("#### تحليل البنود") |
|
|
|
if "cost_analysis" not in st.session_state or "cost_estimation" not in st.session_state.cost_analysis: |
|
st.info("الرجاء تقدير التكاليف أولاً من تبويب 'تقدير التكاليف'.") |
|
else: |
|
if st.button("تحليل بنود التكاليف"): |
|
with st.spinner("جاري تحليل البنود..."): |
|
|
|
ai_model = "anthropic" |
|
|
|
|
|
prompt = f""" |
|
بناءً على تقدير التكاليف التالي: |
|
|
|
{st.session_state.cost_analysis['cost_estimation']} |
|
|
|
قم بتحليل بنود التكاليف بالتفصيل: |
|
1. استخرج جميع بنود التكاليف وقيمها |
|
2. صنف البنود حسب النوع (مواد، عمالة، معدات، إلخ) |
|
3. حدد البنود ذات التكلفة الأعلى والتي تشكل نسبة كبيرة من التكلفة الإجمالية |
|
4. اقترح بدائل أو طرق لتقليل تكلفة البنود الرئيسية |
|
5. قدم توصيات لتحسين كفاءة التكلفة |
|
|
|
قدم النتائج بتنسيق جدولي منظم وواضح. |
|
""" |
|
|
|
|
|
items_analysis = self._get_ai_response(prompt, ai_model) |
|
|
|
|
|
st.session_state.cost_analysis["items_analysis"] = items_analysis |
|
|
|
|
|
st.markdown("##### نتيجة تحليل البنود:") |
|
st.markdown(items_analysis) |
|
|
|
st.success("تم تحليل البنود بنجاح. انتقل إلى تبويب 'المقارنة مع السوق' للمتابعة.") |
|
|
|
|
|
if "items_analysis" in st.session_state.cost_analysis: |
|
st.markdown("##### نتيجة تحليل البنود:") |
|
st.markdown(st.session_state.cost_analysis["items_analysis"]) |
|
|
|
|
|
with cost_tabs[3]: |
|
st.markdown("#### المقارنة مع السوق") |
|
|
|
if "cost_analysis" not in st.session_state or "items_analysis" not in st.session_state.cost_analysis: |
|
st.info("الرجاء تحليل البنود أولاً من تبويب 'تحليل البنود'.") |
|
else: |
|
if st.button("مقارنة التكاليف مع السوق"): |
|
with st.spinner("جاري مقارنة التكاليف مع السوق..."): |
|
|
|
ai_model = "ai" |
|
|
|
|
|
prompt = f""" |
|
أنت خبير في أسعار مواد البناء والمقاولات في المملكة العربية السعودية. |
|
|
|
بناءً على تقدير التكاليف وتحليل البنود التاليين: |
|
|
|
تقدير التكاليف: |
|
{st.session_state.cost_analysis['cost_estimation']} |
|
|
|
تحليل البنود: |
|
{st.session_state.cost_analysis['items_analysis']} |
|
|
|
قم بمقارنة هذه التكاليف مع متوسط أسعار السوق السعودي الحالية (2025): |
|
1. قارن تكلفة المتر المربع مع متوسط السوق للمشاريع المماثلة |
|
2. قارن أسعار المواد الرئيسية (الخرسانة، حديد التسليح، الإسمنت، إلخ) مع أسعار السوق |
|
3. قارن تكاليف العمالة مع متوسط السوق |
|
4. حدد البنود التي تختلف تكلفتها بشكل كبير عن متوسط السوق (أعلى أو أقل) |
|
5. قدم توصيات للحصول على أفضل الأسعار |
|
|
|
استخدم بيانات حقيقية عن أسعار السوق السعودي الحالية قدر الإمكان. |
|
""" |
|
|
|
|
|
market_comparison = self._get_ai_response(prompt, ai_model) |
|
|
|
|
|
st.session_state.cost_analysis["market_comparison"] = market_comparison |
|
|
|
|
|
st.markdown("##### نتيجة المقارنة مع السوق:") |
|
st.markdown(market_comparison) |
|
|
|
st.success("تمت المقارنة مع السوق بنجاح. انتقل إلى تبويب 'التقارير' للمتابعة.") |
|
|
|
|
|
if "market_comparison" in st.session_state.cost_analysis: |
|
st.markdown("##### نتيجة المقارنة مع السوق:") |
|
st.markdown(st.session_state.cost_analysis["market_comparison"]) |
|
|
|
|
|
with cost_tabs[4]: |
|
st.markdown("#### التقارير") |
|
|
|
if "cost_analysis" not in st.session_state or "market_comparison" not in st.session_state.cost_analysis: |
|
st.info("الرجاء مقارنة التكاليف مع السوق أولاً من تبويب 'المقارنة مع السوق'.") |
|
else: |
|
if st.button("إنشاء التقرير النهائي"): |
|
with st.spinner("جاري إنشاء التقرير النهائي..."): |
|
|
|
ai_model = "anthropic" |
|
|
|
|
|
prompt = f""" |
|
بناءً على التحليلات التالية: |
|
|
|
تقدير التكاليف: |
|
{st.session_state.cost_analysis['cost_estimation']} |
|
|
|
تحليل البنود: |
|
{st.session_state.cost_analysis['items_analysis']} |
|
|
|
المقارنة مع السوق: |
|
{st.session_state.cost_analysis['market_comparison']} |
|
|
|
قم بإنشاء تقرير نهائي شامل يتضمن: |
|
1. ملخص تنفيذي |
|
2. نظرة عامة على المشروع |
|
3. ملخص التكاليف الإجمالية والتفصيلية |
|
4. مقارنة مع متوسط السوق |
|
5. فرص تحسين التكلفة |
|
6. المخاطر المحتملة وتأثيرها على التكلفة |
|
7. التوصيات النهائية |
|
8. الخطوات التالية |
|
|
|
قدم التقرير بتنسيق احترافي ومنظم. |
|
""" |
|
|
|
|
|
final_report = self._get_ai_response(prompt, ai_model) |
|
|
|
|
|
st.session_state.cost_analysis["final_report"] = final_report |
|
|
|
|
|
st.markdown("##### التقرير النهائي:") |
|
st.markdown(final_report) |
|
|
|
|
|
if "final_report" in st.session_state.cost_analysis: |
|
st.markdown("##### التقرير النهائي:") |
|
st.markdown(st.session_state.cost_analysis["final_report"]) |
|
|
|
|
|
report_file_name = f"تقرير_تقدير_التكاليف_{datetime.now().strftime('%Y%m%d_%H%M%S')}" |
|
|
|
col1, col2, col3 = st.columns(3) |
|
|
|
with col1: |
|
|
|
report_content = f""" |
|
# التقرير النهائي لتقدير التكاليف |
|
|
|
**تاريخ التقرير:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} |
|
|
|
{st.session_state.cost_analysis['final_report']} |
|
""" |
|
|
|
st.download_button( |
|
label="تنزيل التقرير (PDF)", |
|
data=report_content.encode('utf-8'), |
|
file_name=f"{report_file_name}.pdf", |
|
mime="application/pdf", |
|
key="download_report_pdf" |
|
) |
|
|
|
with col2: |
|
|
|
st.download_button( |
|
label="تنزيل التقرير (Excel)", |
|
data=report_content.encode('utf-8'), |
|
file_name=f"{report_file_name}.xlsx", |
|
mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", |
|
key="download_report_excel" |
|
) |
|
|
|
with col3: |
|
|
|
st.download_button( |
|
label="تنزيل التقرير (Word)", |
|
data=report_content.encode('utf-8'), |
|
file_name=f"{report_file_name}.docx", |
|
mime="application/vnd.openxmlformats-officedocument.wordprocessingml.document", |
|
key="download_report_word" |
|
) |
|
|
|
def _render_risk_analysis_tab(self): |
|
"""عرض تبويب تحليل المخاطر""" |
|
st.markdown("### تحليل المخاطر") |
|
|
|
st.markdown(""" |
|
يمكنك استخدام هذه الأداة لتحليل المخاطر المحتملة في المشاريع باستخدام الذكاء الاصطناعي. |
|
""") |
|
|
|
|
|
risk_tabs = st.tabs([ |
|
"تحديد المخاطر", |
|
"تقييم المخاطر", |
|
"خطة الاستجابة", |
|
"التقرير النهائي" |
|
]) |
|
|
|
|
|
with risk_tabs[0]: |
|
st.markdown("#### تحديد المخاطر") |
|
|
|
|
|
st.markdown("##### معلومات المشروع") |
|
|
|
col1, col2 = st.columns(2) |
|
|
|
with col1: |
|
project_name = st.text_input("اسم المشروع:", key="risk_project_name") |
|
project_location = st.text_input("موقع المشروع:", key="risk_project_location") |
|
|
|
with col2: |
|
project_type = st.selectbox( |
|
"نوع المشروع:", |
|
[ |
|
"سكني", |
|
"تجاري", |
|
"صناعي", |
|
"بنية تحتية", |
|
"طرق", |
|
"أخرى" |
|
], |
|
key="risk_project_type" |
|
) |
|
|
|
project_budget = st.number_input("ميزانية المشروع (ريال سعودي):", min_value=0, key="risk_project_budget") |
|
|
|
|
|
project_description = st.text_area("وصف المشروع:", height=150, key="risk_project_description") |
|
|
|
|
|
ai_model = st.selectbox( |
|
"اختر نموذج الذكاء الاصطناعي:", |
|
["ai", "anthropic"], |
|
index=0, |
|
key="risk_identification_model" |
|
) |
|
|
|
if st.button("تحديد المخاطر المحتملة"): |
|
with st.spinner("جاري تحديد المخاطر..."): |
|
|
|
prompt = f""" |
|
أنت خبير في تحليل المخاطر لمشاريع البناء والمقاولات في المملكة العربية السعودية. |
|
|
|
معلومات المشروع: |
|
- اسم المشروع: {project_name} |
|
- موقع المشروع: {project_location} |
|
- نوع المشروع: {project_type} |
|
- ميزانية المشروع: {project_budget} ريال سعودي |
|
- وصف المشروع: {project_description} |
|
|
|
قم بتحديد المخاطر المحتملة لهذا المشروع، مصنفة حسب الفئات التالية: |
|
1. المخاطر الفنية |
|
2. المخاطر المالية |
|
3. المخاطر التعاقدية والقانونية |
|
4. المخاطر البيئية |
|
5. المخاطر المتعلقة بالموارد البشرية |
|
6. المخاطر المتعلقة بالجدول الزمني |
|
7. المخاطر المتعلقة بالموردين والمقاولين من الباطن |
|
8. المخاطر المتعلقة بالسوق والاقتصاد |
|
|
|
لكل مخاطرة، قدم: |
|
- وصف المخاطرة |
|
- الأسباب المحتملة |
|
- التأثير المحتمل على المشروع |
|
|
|
قدم قائمة شاملة بالمخاطر المحتملة مع مراعاة خصوصية السوق السعودي والظروف المحلية. |
|
""" |
|
|
|
|
|
identified_risks = self._get_ai_response(prompt, ai_model) |
|
|
|
|
|
if "risk_analysis" not in st.session_state: |
|
st.session_state.risk_analysis = {} |
|
|
|
st.session_state.risk_analysis["project_info"] = { |
|
"name": project_name, |
|
"location": project_location, |
|
"type": project_type, |
|
"budget": project_budget, |
|
"description": project_description |
|
} |
|
|
|
st.session_state.risk_analysis["identified_risks"] = identified_risks |
|
|
|
|
|
st.markdown("##### المخاطر المحددة:") |
|
st.markdown(identified_risks) |
|
|
|
st.success("تم تحديد المخاطر بنجاح. انتقل إلى تبويب 'تقييم المخاطر' للمتابعة.") |
|
|
|
|
|
if "risk_analysis" in st.session_state and "identified_risks" in st.session_state.risk_analysis: |
|
st.markdown("##### المخاطر المحددة:") |
|
st.markdown(st.session_state.risk_analysis["identified_risks"]) |
|
|
|
|
|
with risk_tabs[1]: |
|
st.markdown("#### تقييم المخاطر") |
|
|
|
if "risk_analysis" not in st.session_state or "identified_risks" not in st.session_state.risk_analysis: |
|
st.info("الرجاء تحديد المخاطر أولاً من تبويب 'تحديد المخاطر'.") |
|
else: |
|
if st.button("تقييم المخاطر المحددة"): |
|
with st.spinner("جاري تقييم المخاطر..."): |
|
|
|
ai_model = "anthropic" |
|
|
|
|
|
prompt = f""" |
|
بناءً على المخاطر المحددة التالية: |
|
|
|
{st.session_state.risk_analysis['identified_risks']} |
|
|
|
قم بتقييم كل مخاطرة من حيث: |
|
1. احتمالية الحدوث (منخفضة، متوسطة، عالية) |
|
2. التأثير (منخفض، متوسط، عالي) |
|
3. درجة الخطورة الإجمالية (منخفضة، متوسطة، عالية، حرجة) |
|
|
|
قدم النتائج في شكل جدول منظم يتضمن: |
|
- وصف المخاطرة |
|
- الفئة |
|
- احتمالية الحدوث |
|
- التأثير |
|
- درجة الخطورة الإجمالية |
|
- الأولوية (من 1 إلى 5، حيث 1 هي الأعلى) |
|
|
|
ثم قم بترتيب المخاطر حسب الأولوية، مع التركيز على المخاطر ذات الأولوية العالية. |
|
""" |
|
|
|
|
|
risk_assessment = self._get_ai_response(prompt, ai_model) |
|
|
|
|
|
st.session_state.risk_analysis["risk_assessment"] = risk_assessment |
|
|
|
|
|
st.markdown("##### تقييم المخاطر:") |
|
st.markdown(risk_assessment) |
|
|
|
st.success("تم تقييم المخاطر بنجاح. انتقل إلى تبويب 'خطة الاستجابة' للمتابعة.") |
|
|
|
|
|
if "risk_assessment" in st.session_state.risk_analysis: |
|
st.markdown("##### تقييم المخاطر:") |
|
st.markdown(st.session_state.risk_analysis["risk_assessment"]) |
|
|
|
|
|
with risk_tabs[2]: |
|
st.markdown("#### خطة الاستجابة للمخاطر") |
|
|
|
if "risk_analysis" not in st.session_state or "risk_assessment" not in st.session_state.risk_analysis: |
|
st.info("الرجاء تقييم المخاطر أولاً من تبويب 'تقييم المخاطر'.") |
|
else: |
|
if st.button("إنشاء خطة الاستجابة للمخاطر"): |
|
with st.spinner("جاري إنشاء خطة الاستجابة..."): |
|
|
|
ai_model = "ai" |
|
|
|
|
|
prompt = f""" |
|
بناءً على تقييم المخاطر التالي: |
|
|
|
{st.session_state.risk_analysis['risk_assessment']} |
|
|
|
قم بإنشاء خطة استجابة للمخاطر تتضمن: |
|
|
|
1. لكل مخاطرة ذات أولوية عالية (1-2): |
|
- استراتيجية الاستجابة (تجنب، نقل، تخفيف، قبول) |
|
- إجراءات محددة للتعامل مع المخاطرة |
|
- المسؤول عن تنفيذ الإجراءات |
|
- الموارد المطلوبة |
|
- المؤشرات التي تدل على حدوث المخاطرة |
|
- خطة الطوارئ في حال حدوث المخاطرة |
|
|
|
2. للمخاطر ذات الأولوية المتوسطة (3): |
|
- استراتيجية الاستجابة |
|
- إجراءات رئيسية للتعامل مع المخاطرة |
|
- المسؤول عن المتابعة |
|
|
|
3. للمخاطر ذات الأولوية المنخفضة (4-5): |
|
- استراتيجية الاستجابة العامة |
|
- إجراءات المراقبة |
|
|
|
قدم خطة استجابة شاملة وعملية، مع مراعاة الموارد المتاحة وظروف المشروع. |
|
""" |
|
|
|
|
|
response_plan = self._get_ai_response(prompt, ai_model) |
|
|
|
|
|
st.session_state.risk_analysis["response_plan"] = response_plan |
|
|
|
|
|
st.markdown("##### خطة الاستجابة للمخاطر:") |
|
st.markdown(response_plan) |
|
|
|
st.success("تم إنشاء خطة الاستجابة بنجاح. انتقل إلى تبويب 'التقرير النهائي' للمتابعة.") |
|
|
|
|
|
if "response_plan" in st.session_state.risk_analysis: |
|
st.markdown("##### خطة الاستجابة للمخاطر:") |
|
st.markdown(st.session_state.risk_analysis["response_plan"]) |
|
|
|
|
|
with risk_tabs[3]: |
|
st.markdown("#### التقرير النهائي") |
|
|
|
if "risk_analysis" not in st.session_state or "response_plan" not in st.session_state.risk_analysis: |
|
st.info("الرجاء إنشاء خطة الاستجابة أولاً من تبويب 'خطة الاستجابة'.") |
|
else: |
|
if st.button("إنشاء التقرير النهائي لتحليل المخاطر"): |
|
with st.spinner("جاري إنشاء التقرير النهائي..."): |
|
|
|
ai_model = "anthropic" |
|
|
|
|
|
prompt = f""" |
|
بناءً على المعلومات التالية: |
|
|
|
معلومات المشروع: |
|
- اسم المشروع: {st.session_state.risk_analysis['project_info']['name']} |
|
- موقع المشروع: {st.session_state.risk_analysis['project_info']['location']} |
|
- نوع المشروع: {st.session_state.risk_analysis['project_info']['type']} |
|
- ميزانية المشروع: {st.session_state.risk_analysis['project_info']['budget']} ريال سعودي |
|
- وصف المشروع: {st.session_state.risk_analysis['project_info']['description']} |
|
|
|
المخاطر المحددة: |
|
{st.session_state.risk_analysis['identified_risks']} |
|
|
|
تقييم المخاطر: |
|
{st.session_state.risk_analysis['risk_assessment']} |
|
|
|
خطة الاستجابة للمخاطر: |
|
{st.session_state.risk_analysis['response_plan']} |
|
|
|
قم بإنشاء تقرير نهائي شامل لتحليل المخاطر يتضمن: |
|
1. ملخص تنفيذي |
|
2. نظرة عامة على المشروع |
|
3. منهجية تحليل المخاطر |
|
4. ملخص المخاطر الرئيسية |
|
5. تقييم المخاطر وترتيبها حسب الأولوية |
|
6. خطة الاستجابة للمخاطر |
|
7. إجراءات المراقبة والتحكم |
|
8. التوصيات النهائية |
|
9. الخطوات التالية |
|
|
|
قدم التقرير بتنسيق احترافي ومنظم. |
|
""" |
|
|
|
|
|
final_report = self._get_ai_response(prompt, ai_model) |
|
|
|
|
|
st.session_state.risk_analysis["final_report"] = final_report |
|
|
|
|
|
st.markdown("##### التقرير النهائي لتحليل المخاطر:") |
|
st.markdown(final_report) |
|
|
|
|
|
if "final_report" in st.session_state.risk_analysis: |
|
st.markdown("##### التقرير النهائي لتحليل المخاطر:") |
|
st.markdown(st.session_state.risk_analysis["final_report"]) |
|
|
|
|
|
report_file_name = f"تقرير_تحليل_المخاطر_{datetime.now().strftime('%Y%m%d_%H%M%S')}" |
|
|
|
col1, col2, col3 = st.columns(3) |
|
|
|
with col1: |
|
|
|
report_content = f""" |
|
# التقرير النهائي لتحليل المخاطر |
|
|
|
**تاريخ التقرير:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} |
|
|
|
{st.session_state.risk_analysis['final_report']} |
|
""" |
|
|
|
st.download_button( |
|
label="تنزيل التقرير (PDF)", |
|
data=report_content.encode('utf-8'), |
|
file_name=f"{report_file_name}.pdf", |
|
mime="application/pdf", |
|
key="download_risk_report_pdf" |
|
) |
|
|
|
with col2: |
|
|
|
st.download_button( |
|
label="تنزيل التقرير (Word)", |
|
data=report_content.encode('utf-8'), |
|
file_name=f"{report_file_name}.docx", |
|
mime="application/vnd.openxmlformats-officedocument.wordprocessingml.document", |
|
key="download_risk_report_word" |
|
) |
|
|
|
with col3: |
|
|
|
st.download_button( |
|
label="تنزيل التقرير (Excel)", |
|
data=report_content.encode('utf-8'), |
|
file_name=f"{report_file_name}.xlsx", |
|
mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", |
|
key="download_risk_report_excel" |
|
) |
|
|
|
def _extract_text_from_file(self, file): |
|
"""استخراج النص من الملف""" |
|
try: |
|
|
|
file_name = file.name |
|
file_extension = file_name.split('.')[-1].lower() |
|
|
|
|
|
if file_extension == 'pdf': |
|
|
|
pdf_reader = PyPDF2.PdfReader(file) |
|
text = "" |
|
for page in pdf_reader.pages: |
|
text += page.extract_text() + "\n" |
|
return text |
|
|
|
elif file_extension in ['docx', 'doc']: |
|
|
|
doc = docx.Document(file) |
|
text = "" |
|
for para in doc.paragraphs: |
|
text += para.text + "\n" |
|
return text |
|
|
|
elif file_extension == 'txt': |
|
|
|
return file.getvalue().decode('utf-8') |
|
|
|
elif file_extension in ['png', 'jpg', 'jpeg']: |
|
|
|
return "استخراج النص من الصور غير مدعوم حاليًا." |
|
|
|
elif file_extension in ['xlsx', 'xls']: |
|
|
|
return "استخراج النص من ملفات Excel غير مدعوم حاليًا." |
|
|
|
elif file_extension == 'dwg': |
|
|
|
return "استخراج النص من ملفات DWG غير مدعوم حاليًا." |
|
|
|
else: |
|
return f"نوع الملف {file_extension} غير مدعوم." |
|
|
|
except Exception as e: |
|
return f"حدث خطأ أثناء استخراج النص: {str(e)}" |
|
|
|
def _detect_file_type(self, file_name): |
|
"""تحديد نوع الملف بناءً على الامتداد""" |
|
extension = file_name.split('.')[-1].lower() |
|
|
|
if extension in ['pdf']: |
|
return 'application/pdf' |
|
elif extension in ['dwg']: |
|
return 'application/acad' |
|
elif extension in ['xlsx', 'xls']: |
|
return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' |
|
elif extension in ['docx', 'doc']: |
|
return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' |
|
elif extension in ['txt']: |
|
return 'text/plain' |
|
elif extension in ['png']: |
|
return 'image/png' |
|
elif extension in ['jpg', 'jpeg']: |
|
return 'image/jpeg' |
|
else: |
|
return 'application/octet-stream' |
|
|