Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| import json | |
| from utils import parse_excel_file, save_to_json | |
| DATA_FILE = "material_db.json" | |
| def is_duplicate(record, all_data): | |
| for item in all_data: | |
| if ( | |
| item.get("project_description") == record.get("project_description") | |
| and item.get("materials") == record.get("materials") | |
| ): | |
| return True | |
| return False | |
| def process_excel(file, description): | |
| if file is None: | |
| return "❌ لطفاً یک فایل اکسل بارگذاری کنید.", "" | |
| try: | |
| # ۱. پردازش فایل اکسل | |
| materials = parse_excel_file(file.name) | |
| record = { | |
| "project_description": description.strip(), | |
| "materials": materials | |
| } | |
| # ۲. بارگذاری دادههای قبلی | |
| all_data = [] | |
| if os.path.exists(DATA_FILE): | |
| with open(DATA_FILE, "r", encoding="utf-8") as f: | |
| try: | |
| existing_data = json.load(f) | |
| if isinstance(existing_data, list): | |
| all_data = existing_data | |
| else: | |
| all_data = [existing_data] | |
| except json.JSONDecodeError: | |
| pass # فایل خالی یا خراب | |
| # ۳. بررسی تکراری بودن | |
| if is_duplicate(record, all_data): | |
| return "⚠️ پروژهای با همین توصیف و مواد قبلاً ثبت شده است.", "" | |
| # ۴. ذخیره در فایل JSON | |
| all_data.append(record) | |
| save_to_json(all_data, DATA_FILE) | |
| return f"✅ اطلاعات برای «{len(materials)}» ماده با موفقیت ذخیره شد.\n📝 توصیف پروژه: {description}", json.dumps(record, indent=2, ensure_ascii=False) | |
| except Exception as e: | |
| return str(e), "" | |
| with gr.Blocks(title="کتابخانه پروژههای برآورد") as demo: | |
| gr.Markdown("## 📦 ابزار ساخت کتابخانه مواد پروژه") | |
| with gr.Tabs(): | |
| with gr.TabItem("📤 ثبت پروژه جدید"): | |
| gr.Markdown("در این بخش فایل اکسل خود را بارگذاری کنید و توصیف پروژه را بنویسید.") | |
| with gr.Row(): | |
| excel_input = gr.File(label="فایل اکسل", file_types=[".xlsx"]) | |
| description_input = gr.Textbox(label="توصیف پروژه", lines=3, placeholder="مثلاً: برآورد نصب چراغ روشنایی با لامپ 70 وات...") | |
| with gr.Row(): | |
| submit_btn = gr.Button("📥 ذخیره در کتابخانه") | |
| output_msg = gr.Textbox(label="وضعیت ذخیرهسازی", interactive=False) | |
| output_json = gr.Code(label="📦 خروجی ذخیرهشده", language="json") | |
| submit_btn.click(fn=process_excel, inputs=[excel_input, description_input], outputs=[output_msg, output_json]) | |
| with gr.TabItem("📚 مشاهده توضیحات (در نسخههای بعدی)"): | |
| gr.Markdown("در نسخههای آینده، اینجا میتونید پروژههای ثبتشده رو ببینید و تحلیل GPT بگیرید.") | |
| demo.launch() | |