jiateng_ws/widgets/report_dialog.py

180 lines
6.4 KiB
Python
Raw Normal View History

2025-08-16 13:37:42 +08:00
from PySide6.QtWidgets import QMessageBox, QFileDialog, QLineEdit, QTableWidgetItem
2025-06-24 11:21:33 +08:00
from PySide6.QtCore import Qt
from ui.report_dialog_ui import ReportDialogUI
import pandas as pd
from datetime import datetime
import logging
2025-08-16 13:37:42 +08:00
import os
from dao.report_dao import ReportDAO
2025-06-24 11:21:33 +08:00
class ReportDialog(ReportDialogUI):
def __init__(self, parent=None):
super().__init__(parent)
self.init_signals()
2025-08-16 13:37:42 +08:00
self.current_data = [] # 存储当前查询的数据
2025-06-24 11:21:33 +08:00
def init_signals(self):
"""初始化信号连接"""
# 查询按钮点击事件
self.query_button.clicked.connect(self.on_query)
# 导出按钮点击事件
self.export_button.clicked.connect(self.on_export)
# 关闭按钮点击事件
self.close_button.clicked.connect(self.close)
2025-08-16 13:37:42 +08:00
# 清空条件按钮点击事件
self.clear_button.clicked.connect(self.on_clear)
def on_clear(self):
"""清空条件按钮点击处理"""
# 重置日期为默认值
self.start_date.setDate(datetime.now().date().addMonths(-1))
self.end_date.setDate(datetime.now().date())
# 清空其他输入框
self.customer_edit.clear()
self.material_edit.clear()
self.spec_edit.clear()
2025-09-24 14:26:29 +08:00
# 清空表格和汇总信息
self.report_table.setRowCount(0)
self.update_summary([])
2025-06-24 11:21:33 +08:00
def on_query(self):
"""查询按钮点击处理"""
try:
# 获取查询条件
2025-08-16 13:37:42 +08:00
start_date = self.start_date.date().toString("yyyy-MM-dd")
end_date = self.end_date.date().toString("yyyy-MM-dd")
customer = self.customer_edit.text().strip()
material = self.material_edit.text().strip()
spec = self.spec_edit.text().strip()
2025-06-24 11:21:33 +08:00
2025-08-16 13:37:42 +08:00
# 使用ReportDAO获取数据
report_dao = ReportDAO()
data = report_dao.get_production_report(
start_date=start_date,
end_date=end_date,
customer=customer if customer else None,
material=material if material else None,
spec=spec if spec else None
)
2025-06-24 11:21:33 +08:00
2025-08-16 13:37:42 +08:00
# 保存当前数据用于导出
self.current_data = data
2025-06-24 11:21:33 +08:00
# 更新表格显示
self.update_table(data)
2025-08-16 13:37:42 +08:00
# 显示查询结果数量
if data:
if self.statusBar():
self.statusBar().showMessage(f"查询到 {len(data)} 条记录")
else:
if self.statusBar():
self.statusBar().showMessage("未查询到符合条件的记录")
QMessageBox.information(self, "提示", "未查询到符合条件的记录")
2025-06-24 11:21:33 +08:00
except Exception as e:
logging.error(f"查询报表数据失败: {str(e)}")
QMessageBox.warning(self, "错误", f"查询数据失败: {str(e)}")
def update_table(self, data):
"""更新表格数据
Args:
data: 包含报表数据的列表
"""
# 清空表格
self.report_table.setRowCount(0)
2025-08-16 13:37:42 +08:00
if not data:
2025-09-24 14:26:29 +08:00
# 如果没有数据,清空汇总信息
self.update_summary([])
2025-08-16 13:37:42 +08:00
return
2025-06-24 11:21:33 +08:00
# 添加数据行
for row_idx, row_data in enumerate(data):
self.report_table.insertRow(row_idx)
2025-08-16 13:37:42 +08:00
# 按照表头顺序添加数据
headers = ["日期", "客户", "订单号", "轴数", "材质", "规格", "净重"]
for col_idx, header in enumerate(headers):
value = row_data.get(header, "")
2025-06-24 11:21:33 +08:00
item = QTableWidgetItem(str(value))
item.setTextAlignment(Qt.AlignCenter)
self.report_table.setItem(row_idx, col_idx, item)
2025-09-24 14:26:29 +08:00
# 更新汇总信息
self.update_summary(data)
def update_summary(self, data):
"""更新汇总信息
Args:
data: 包含报表数据的列表
"""
if not data:
# 重置汇总信息
self.total_axes_value.setText("0")
self.total_weight_value.setText("0.00 kg")
self.record_count_value.setText("0")
return
# 计算总轴数
total_axes = sum(row.get("轴数", 0) for row in data)
# 计算总净重
total_weight = sum(float(row.get("净重", 0)) for row in data)
# 计算记录数
record_count = len(data)
# 更新显示
self.total_axes_value.setText(str(total_axes))
self.total_weight_value.setText(f"{total_weight:.2f} kg")
self.record_count_value.setText(str(record_count))
2025-06-24 11:21:33 +08:00
def on_export(self):
"""导出按钮点击处理"""
try:
2025-08-16 13:37:42 +08:00
if not self.current_data:
2025-06-24 11:21:33 +08:00
QMessageBox.warning(self, "警告", "没有数据可以导出")
return
# 创建DataFrame
2025-08-16 13:37:42 +08:00
df = pd.DataFrame(self.current_data)
# 让用户选择保存路径
default_name = f"统计报表_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx"
filename, _ = QFileDialog.getSaveFileName(
self, "保存报表", default_name, "Excel 文件 (*.xlsx);;所有文件 (*)"
)
2025-06-24 11:21:33 +08:00
2025-08-16 13:37:42 +08:00
if not filename: # 用户取消了保存
return
# 确保文件名有正确的扩展名
if not filename.endswith('.xlsx'):
filename += '.xlsx'
2025-06-24 11:21:33 +08:00
# 导出到Excel
df.to_excel(filename, index=False, engine='openpyxl')
2025-08-16 13:37:42 +08:00
# 显示成功消息并打开文件所在目录
2025-06-24 11:21:33 +08:00
QMessageBox.information(self, "成功", f"报表已导出到: {filename}")
2025-08-16 13:37:42 +08:00
# 打开文件所在目录
os.system(f'explorer /select,"{os.path.normpath(filename)}"')
2025-06-24 11:21:33 +08:00
except Exception as e:
logging.error(f"导出报表失败: {str(e)}")
2025-08-16 13:37:42 +08:00
QMessageBox.warning(self, "错误", f"导出报表失败: {str(e)}")
def statusBar(self):
"""获取状态栏,如果父窗口有状态栏则使用父窗口的状态栏"""
if self.parent() and hasattr(self.parent(), 'statusBar'):
return self.parent().statusBar()
return None