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