Reza-galaxy21 commited on
Commit
8b5ee8b
·
verified ·
1 Parent(s): 6cf419b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +74 -60
app.py CHANGED
@@ -1,76 +1,90 @@
1
  import gradio as gr
 
2
  import os
3
  import json
4
- from utils import parse_excel_file, save_to_json
5
 
6
- DATA_FILE = "material_db.json"
 
 
7
 
8
- def is_duplicate(record, all_data):
9
- for item in all_data:
10
- if (
11
- item.get("project_description") == record.get("project_description")
12
- and item.get("materials") == record.get("materials")
13
- ):
14
- return True
15
- return False
16
 
17
- def process_excel(file, description):
18
- if file is None:
19
- return "❌ لطفاً یک فایل اکسل بارگذاری کنید.", ""
20
 
 
21
  try:
22
- # ۱. پردازش فایل اکسل
23
- materials = parse_excel_file(file.name)
24
- record = {
25
- "project_description": description.strip(),
26
- "materials": materials
27
- }
28
-
29
- # ۲. بارگذاری داده‌های قبلی
30
- all_data = []
31
- if os.path.exists(DATA_FILE):
32
- with open(DATA_FILE, "r", encoding="utf-8") as f:
33
- try:
34
- existing_data = json.load(f)
35
- if isinstance(existing_data, list):
36
- all_data = existing_data
37
- else:
38
- all_data = [existing_data]
39
- except json.JSONDecodeError:
40
- pass # فایل خالی یا خراب
41
-
42
- # ۳. بررسی تکراری بودن
43
- if is_duplicate(record, all_data):
44
- return "⚠️ پروژه‌ای با همین توصیف و مواد قبلاً ثبت شده است.", ""
45
-
46
- # ۴. ذخیره در فایل JSON
47
- all_data.append(record)
48
- save_to_json(all_data, DATA_FILE)
49
-
50
- return f"✅ اطلاعات برای «{len(materials)}» ماده با موفقیت ذخیره شد.\n📝 توصیف پروژه: {description}", json.dumps(record, indent=2, ensure_ascii=False)
51
-
52
  except Exception as e:
53
- return str(e), ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
 
55
- with gr.Blocks(title="کتابخانه پروژه‌های برآورد") as demo:
56
- gr.Markdown("## 📦 ابزار ساخت کتابخانه مواد پروژه")
57
 
58
- with gr.Tabs():
59
- with gr.TabItem("📤 ثبت پروژه جدید"):
60
- gr.Markdown("در این بخش فایل اکسل خود را بارگذاری کنید و توصیف پروژه را بنویسید.")
61
- with gr.Row():
62
- excel_input = gr.File(label="فایل اکسل", file_types=[".xlsx"])
63
- description_input = gr.Textbox(label="توصیف پروژه", lines=3, placeholder="مثلاً: برآورد نصب چراغ روشنایی با لامپ 70 وات...")
64
 
65
- with gr.Row():
66
- submit_btn = gr.Button("📥 ذخیره در کتابخانه")
67
-
68
- output_msg = gr.Textbox(label="وضعیت ذخیره‌سازی", interactive=False)
69
- output_json = gr.Code(label="📦 خروجی ذخیره‌شده", language="json")
70
 
71
- submit_btn.click(fn=process_excel, inputs=[excel_input, description_input], outputs=[output_msg, output_json])
72
 
73
- with gr.TabItem("📚 مشاهده توضیحات (در نسخه‌های بعدی)"):
74
- gr.Markdown("در نسخه‌های آینده، اینجا می‌تونید پروژه‌های ثبت‌شده رو ببینید و تحلیل GPT بگیرید.")
 
75
 
76
  demo.launch()
 
1
  import gradio as gr
2
+ import pandas as pd
3
  import os
4
  import json
 
5
 
6
+ # 📁 مسیر پوشه و فایل داده‌ها
7
+ DATA_FOLDER = "data"
8
+ DATA_FILE = os.path.join(DATA_FOLDER, "material_db.json")
9
 
10
+ # اگر پوشه وجود نداره، بساز
11
+ os.makedirs(DATA_FOLDER, exist_ok=True)
 
 
 
 
 
 
12
 
 
 
 
13
 
14
+ def extract_materials_from_excel(file):
15
  try:
16
+ df = pd.read_excel(file.name)
17
+ materials = []
18
+ for _, row in df.iterrows():
19
+ material = row.to_dict()
20
+ if all(pd.notna(val) for val in material.values()):
21
+ materials.append(material)
22
+ return materials
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  except Exception as e:
24
+ print("خطای خواندن فایل:", e)
25
+ return []
26
+
27
+
28
+ def generate_conditions(materials):
29
+ return [f"{m['نام کالا']} به مقدار {m['مقدار']}" for m in materials if 'نام کالا' in m and 'مقدار' in m]
30
+
31
+
32
+ def is_duplicate(record, data_list):
33
+ return any(rec["توصیف پروژه"] == record["توصیف پروژه"] and rec["مواد"] == record["مواد"] for rec in data_list)
34
+
35
+
36
+ def save_to_json(record):
37
+ all_data = []
38
+ if os.path.exists(DATA_FILE):
39
+ with open(DATA_FILE, "r", encoding="utf-8") as f:
40
+ try:
41
+ existing_data = json.load(f)
42
+ if isinstance(existing_data, list):
43
+ all_data = existing_data
44
+ else:
45
+ all_data = [existing_data]
46
+ except json.JSONDecodeError:
47
+ print("⚠️ فایل JSON خراب بود. فایل جدید ساخته خواهد شد.")
48
+ all_data = []
49
+
50
+ if is_duplicate(record, all_data):
51
+ return False, "⚠️ پروژه‌ای با همین توصیف و مواد قبلاً ثبت شده است."
52
+
53
+ all_data.append(record)
54
+ with open(DATA_FILE, "w", encoding="utf-8") as f:
55
+ json.dump(all_data, f, ensure_ascii=False, indent=2)
56
+ return True, "✅ پروژه با موفقیت ذخیره شد."
57
+
58
+
59
+ def process_excel(file, description):
60
+ if not file or not description:
61
+ return "لطفاً فایل و توصیف پروژه را وارد کنید.", ""
62
+
63
+ materials = extract_materials_from_excel(file)
64
+ if not materials:
65
+ return "خطا در استخراج مواد از فایل. لطفاً فایل اکسل معتبر وارد کنید.", ""
66
+
67
+ conditions = generate_conditions(materials)
68
+ record = {"توصیف پروژه": description, "مواد": materials}
69
+
70
+ success, message = save_to_json(record)
71
+ return message, "\n".join(conditions)
72
+
73
 
74
+ with gr.Blocks(title="نسخه 0.0.2 - ثبت پروژه و استخراج مواد") as demo:
75
+ gr.Markdown("## 📦 ثبت پروژه بر اساس فایل اکسل")
76
 
77
+ with gr.Row():
78
+ file_input = gr.File(label="فایل اکسل مواد", file_types=[".xlsx"])
79
+ description_input = gr.Textbox(label="توصیف پروژه", placeholder="مثلاً برآورد تعمیرات شبکه روستایی ...")
 
 
 
80
 
81
+ output_message = gr.Textbox(label="وضعیت ذخیره‌سازی", interactive=False)
82
+ output_conditions = gr.Textbox(label="شرط‌های استخراج شده", lines=6)
 
 
 
83
 
84
+ process_btn = gr.Button("📥 پردازش و ذخیره")
85
 
86
+ process_btn.click(fn=process_excel,
87
+ inputs=[file_input, description_input],
88
+ outputs=[output_message, output_conditions])
89
 
90
  demo.launch()