144 lines
5.3 KiB
Python
144 lines
5.3 KiB
Python
from PySide6.QtWidgets import QMessageBox, QFileDialog, QLineEdit, QTableWidgetItem
|
|
from PySide6.QtCore import Qt
|
|
from ui.report_dialog_ui import ReportDialogUI
|
|
import pandas as pd
|
|
from datetime import datetime
|
|
import logging
|
|
import os
|
|
from dao.report_dao import ReportDAO
|
|
|
|
class ReportDialog(ReportDialogUI):
|
|
def __init__(self, parent=None):
|
|
super().__init__(parent)
|
|
self.init_signals()
|
|
self.current_data = [] # 存储当前查询的数据
|
|
|
|
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)
|
|
|
|
# 清空条件按钮点击事件
|
|
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()
|
|
|
|
def on_query(self):
|
|
"""查询按钮点击处理"""
|
|
try:
|
|
# 获取查询条件
|
|
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()
|
|
|
|
# 使用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
|
|
)
|
|
|
|
# 保存当前数据用于导出
|
|
self.current_data = data
|
|
|
|
# 更新表格显示
|
|
self.update_table(data)
|
|
|
|
# 显示查询结果数量
|
|
if data:
|
|
if self.statusBar():
|
|
self.statusBar().showMessage(f"查询到 {len(data)} 条记录")
|
|
else:
|
|
if self.statusBar():
|
|
self.statusBar().showMessage("未查询到符合条件的记录")
|
|
QMessageBox.information(self, "提示", "未查询到符合条件的记录")
|
|
|
|
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)
|
|
|
|
if not data:
|
|
return
|
|
|
|
# 添加数据行
|
|
for row_idx, row_data in enumerate(data):
|
|
self.report_table.insertRow(row_idx)
|
|
|
|
# 按照表头顺序添加数据
|
|
headers = ["日期", "客户", "订单号", "轴数", "材质", "规格", "净重"]
|
|
for col_idx, header in enumerate(headers):
|
|
value = row_data.get(header, "")
|
|
item = QTableWidgetItem(str(value))
|
|
item.setTextAlignment(Qt.AlignCenter)
|
|
self.report_table.setItem(row_idx, col_idx, item)
|
|
|
|
def on_export(self):
|
|
"""导出按钮点击处理"""
|
|
try:
|
|
if not self.current_data:
|
|
QMessageBox.warning(self, "警告", "没有数据可以导出")
|
|
return
|
|
|
|
# 创建DataFrame
|
|
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);;所有文件 (*)"
|
|
)
|
|
|
|
if not filename: # 用户取消了保存
|
|
return
|
|
|
|
# 确保文件名有正确的扩展名
|
|
if not filename.endswith('.xlsx'):
|
|
filename += '.xlsx'
|
|
|
|
# 导出到Excel
|
|
df.to_excel(filename, index=False, engine='openpyxl')
|
|
|
|
# 显示成功消息并打开文件所在目录
|
|
QMessageBox.information(self, "成功", f"报表已导出到: {filename}")
|
|
|
|
# 打开文件所在目录
|
|
os.system(f'explorer /select,"{os.path.normpath(filename)}"')
|
|
|
|
except Exception as e:
|
|
logging.error(f"导出报表失败: {str(e)}")
|
|
QMessageBox.warning(self, "错误", f"导出报表失败: {str(e)}")
|
|
|
|
def statusBar(self):
|
|
"""获取状态栏,如果父窗口有状态栏则使用父窗口的状态栏"""
|
|
if self.parent() and hasattr(self.parent(), 'statusBar'):
|
|
return self.parent().statusBar()
|
|
return None |