From b5420880f7f0a772995b4e4688b4543c2bee5155 Mon Sep 17 00:00:00 2001 From: zhu-mengmeng <15588200382@163.com> Date: Sat, 16 Aug 2025 13:37:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8A=A5=E8=A1=A8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/app_config.json | 2 +- dao/report_dao.py | 170 +++++++++++++++++++++++++++++++++++++++ db/jtDB.db | Bin 1458176 -> 1458176 bytes ui/report_dialog_ui.py | 104 ++++++++++++++++++------ widgets/report_dialog.py | 113 +++++++++++++++++--------- 5 files changed, 325 insertions(+), 64 deletions(-) create mode 100644 dao/report_dao.py diff --git a/config/app_config.json b/config/app_config.json index f49e74a..a33730b 100644 --- a/config/app_config.json +++ b/config/app_config.json @@ -123,7 +123,7 @@ } }, "electricity": { - "auto_start": true, + "auto_start": false, "interval_minutes": 30 } } \ No newline at end of file diff --git a/dao/report_dao.py b/dao/report_dao.py new file mode 100644 index 0000000..13f5460 --- /dev/null +++ b/dao/report_dao.py @@ -0,0 +1,170 @@ +import logging +from datetime import datetime +from utils.sql_utils import SQLUtils + +class ReportDAO: + """报表数据访问对象,处理报表相关的数据库操作""" + + def __init__(self): + """初始化数据访问对象""" + # 不再在初始化时创建数据库连接,而是在需要时创建 + pass + + def get_production_report(self, start_date, end_date, customer=None, material=None, spec=None): + """获取生产报表数据 + + Args: + start_date: 开始日期,格式为 'YYYY-MM-DD' + end_date: 结束日期,格式为 'YYYY-MM-DD' + customer: 客户名称,用于模糊查询,可选 + material: 材质,用于模糊查询,可选 + spec: 规格,用于模糊查询,可选 + + Returns: + list: 包含报表数据的字典列表 + """ + try: + # 构建SQL查询 + sql = """ + SELECT DATE(pack_time) AS 日期 + , customerexp AS 客户 + , t1.order_id AS 订单号 + , COUNT(DISTINCT t1.gc_note) AS '轴数' + , t2.cz AS '材质' + , t2.size AS '规格' + , ROUND(SUM(t1.net_weight), 2) AS '净重' + FROM wsbz_inspection_pack_data t1 + LEFT JOIN wsbz_order_info t2 ON t1.order_id = t2.ddmo + WHERE pack_time BETWEEN ? AND ? + """ + + params = [f"{start_date} 00:00:00", f"{end_date} 23:59:59"] + + # 添加可选的筛选条件 + if customer: + sql += " AND customerexp LIKE ?" + params.append(f"%{customer}%") + + if material: + sql += " AND t2.cz LIKE ?" + params.append(f"%{material}%") + + if spec: + sql += " AND t2.size LIKE ?" + params.append(f"%{spec}%") + + # 添加分组条件 + sql += " GROUP BY DATE(pack_time), t2.cz, t2.size, customerexp" + + # 执行查询 + with SQLUtils('sqlite', database='db/jtDB.db') as db: + db.cursor.execute(sql, params) + results = db.cursor.fetchall() + + # 获取列名 + columns = [desc[0] for desc in db.cursor.description] + + # 转换为字典列表 + data = [] + for row in results: + row_dict = {} + for i, col in enumerate(columns): + row_dict[col] = row[i] + data.append(row_dict) + + return data + + except Exception as e: + logging.error(f"获取生产报表数据失败: {str(e)}") + raise e + + def get_daily_report(self, date): + """获取指定日期的日报表 + + Args: + date: 日期,格式为 'YYYY-MM-DD' + + Returns: + list: 包含报表数据的字典列表 + """ + return self.get_production_report(date, date) + + def get_monthly_report(self, year, month): + """获取指定月份的月报表 + + Args: + year: 年份,如 2024 + month: 月份,如 8 + + Returns: + list: 包含报表数据的字典列表 + """ + # 计算月初和月末 + start_date = f"{year}-{month:02d}-01" + + # 计算月末日期 + if month == 12: + next_year = year + 1 + next_month = 1 + else: + next_year = year + next_month = month + 1 + + end_date = f"{next_year}-{next_month:02d}-01" + + # 使用日期范围查询 + return self.get_production_report(start_date, end_date) + + def get_yearly_report(self, year): + """获取指定年份的年报表 + + Args: + year: 年份,如 2024 + + Returns: + list: 包含报表数据的字典列表 + """ + start_date = f"{year}-01-01" + end_date = f"{year+1}-01-01" + + # 使用日期范围查询 + return self.get_production_report(start_date, end_date) + + def get_customer_report(self, start_date, end_date, customer): + """获取指定客户的报表 + + Args: + start_date: 开始日期,格式为 'YYYY-MM-DD' + end_date: 结束日期,格式为 'YYYY-MM-DD' + customer: 客户名称 + + Returns: + list: 包含报表数据的字典列表 + """ + return self.get_production_report(start_date, end_date, customer=customer) + + def get_material_report(self, start_date, end_date, material): + """获取指定材质的报表 + + Args: + start_date: 开始日期,格式为 'YYYY-MM-DD' + end_date: 结束日期,格式为 'YYYY-MM-DD' + material: 材质 + + Returns: + list: 包含报表数据的字典列表 + """ + return self.get_production_report(start_date, end_date, material=material) + + def get_spec_report(self, start_date, end_date, spec): + """获取指定规格的报表 + + Args: + start_date: 开始日期,格式为 'YYYY-MM-DD' + end_date: 结束日期,格式为 'YYYY-MM-DD' + spec: 规格 + + Returns: + list: 包含报表数据的字典列表 + """ + return self.get_production_report(start_date, end_date, spec=spec) diff --git a/db/jtDB.db b/db/jtDB.db index fcdd03a60b8c0005060fde5aa474606caf40b34f..ac20ea38e363204fe6ada4bdc6bd373d1f474c5b 100644 GIT binary patch delta 1608 zcmcIjO=uKn7@nDLW_L2bU%LCbb{jX7CY2^>-1&BPSF;6oLW)Y-Lt^)!huB;^q@c7! zP%rMTmdPbTB&;t&{uB$PT4HJA(C8tyrH9huUZjP_5Wzz&1y?-@{rh(5VOBOo{Bmq%XW(*-psWA`t^BJq{n;-5>zM=D^Zdd|*K>K# z6+9PtuIRav=LS4Cc-56BL0acH?k1G8t#SX_FY=$FWN;kMVnj*z_v89t>)opAGCaD1g5$7xoNaJNEbG^E3LRsAWf#Ci3s$ZU2aWkm~$ ze{mz+RSpcSd?ZU(q=GaoS#Sa?J^trd*(+9qbg>{7Y!C(K=}>NPI5(U~**k0}*`Khh zUo`yzb)1BqjxNNd&hB1eC|5I}JNlksKmVNebnZDFW+z$M3@U@hpfeZ@roTaO*N1^` z&?U~i4?C^k4^S@PV=`JtKcnmD66`7BwC@%18v@)vg^e_gE@0GI-&%COk(g^FW_{*M z+C-oKgabS#55e9=oRm#4Pnw6!ec&zPd;Zb$_*0$FvLU|>mzS`y>;GAXQLoTA;Q40c zTr+YO?p(m($<-yy(8}-%Lx>>^t4rh^%TPNw^D}eAcx+rS2KBr8l%CRVYbUg=>P_{S z+VNF~`?rE}#kXMO3t`g$d&;y$os5&n*r{z!|8^(s3{|V^vztm!?n$oLTMOf#xke^L z@thdrpr;(pfO{qQE}UK^McAmAG8i|A?eDrleifj+xm6#mEm?FSgu2<_>lZIN--MfM z!p-`Jzb9u^v`x*;1k0nWtBR73l#(Ln$PMMwOez^EIZc(M9VsQAR_sKECL$%;RI!~% z$!=5a%FtOUkmPK8vcp fP?q**^a9fl$!Sr{FSpevL+GU>^A{hHvG@K1Q_8IN delta 640 zcmXAmO-NKx6vyvLP+DCx(2W5mQ7^2u=$rXbgikk>JZV1ueQd9Dba;_;LQ{a%_9Zwuf?c zcy6Y?7tcK(S?LKpX<%|vf>Tj^z&)94#?Ra<$p!pyf;${LTynVVaK+)O!vhZ2mU%D> zY8fH44y9x??yY_bZY!#e5Ee5IvexWIIp}SaL-A_mBCbKRJTw5;w@3##eyGcB<-<_S z6CG~X(ngQ}3cU%FZ8U&(k@QN+LCiKi1{zwCVsjiw_|e1YsBOR-iv6L6M?V$ z4=oYc6y`BuwpC1B5#|}0tQZk>5~a{GQis(J<)5+!v0Uf^40AmUS1G9io02vqt{!fM zyhIrMWF+Q&qohuOHH*Y?xYEr1rWzt;P^6?F#t6;&j0kjrAut7DLB#VJwXOwT$U7*q z13fYA9h7XEhE#^0@WwOrsN^PiAB=vk4tam>P@`Tc;JXOuNboES%+oHoKTm&XJ5pJC zFD-kw7U&}ryCQWO#yW!`C@xYxTU?@osGv$vEwG@t#QGXcJ&hudBmLpO;l*&T`Q4l} zj~koDxN$^Z*VBb2eo2=HGwsm-RI2f2R@qHOnN>y+w3V!G;CbyFOchxME`PL|q5Cy6 zyq?!=Yj5Eclxm}