From 275ad1a7201f0e3de0f5779561da402ffa8f7365 Mon Sep 17 00:00:00 2001 From: zhu-mengmeng <15588200382@163.com> Date: Wed, 24 Sep 2025 14:26:29 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/app_config.json | 2 +- db/jtDB.db | Bin 1458176 -> 1507328 bytes from pymodbus.py | 4 +- ui/main_window_ui.py | 2 +- ui/report_dialog_ui.py | 67 +++++++++++++++++++ widgets/main_window.py | 138 ++++++++++++++++++++------------------- widgets/report_dialog.py | 36 ++++++++++ 7 files changed, 179 insertions(+), 70 deletions(-) diff --git a/config/app_config.json b/config/app_config.json index a33730b..f49e74a 100644 --- a/config/app_config.json +++ b/config/app_config.json @@ -123,7 +123,7 @@ } }, "electricity": { - "auto_start": false, + "auto_start": true, "interval_minutes": 30 } } \ No newline at end of file diff --git a/db/jtDB.db b/db/jtDB.db index ac20ea38e363204fe6ada4bdc6bd373d1f474c5b..407c866ebe0c3a5c1eb74fc42b4aa416c37a1fe2 100644 GIT binary patch delta 50113 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 delta 3661 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 0 - if signal_was_connected: - self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed) - logging.debug("已断开单元格变更信号") - except Exception as e: - logging.debug(f"断开单元格变更信号失败: {str(e)}") - signal_was_connected = False + # try: + # signal_was_connected = self.process_table.receivers(self.process_table.cellChanged) > 0 + # if signal_was_connected: + # self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed) + # logging.debug("已断开单元格变更信号") + # except Exception as e: + # logging.debug(f"断开单元格变更信号失败: {str(e)}") + # signal_was_connected = False # 清空表格现有数据行,只保留表头 while self.process_table.rowCount() > 2: @@ -1608,13 +1614,13 @@ class MainWindow(MainWindowUI): # 确保表格完全清空,只保留表头行 self.process_table.setRowCount(2) # 只保留表头的两行 - # 只有在之前信号已连接的情况下才重新连接 - if signal_was_connected: - try: - self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) - logging.debug("已重新连接单元格变更信号") - except Exception as e: - logging.warning(f"重新连接单元格变更信号失败: {str(e)}") + # # 只有在之前信号已连接的情况下才重新连接 + # if signal_was_connected: + # try: + # self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) + # logging.debug("已重新连接单元格变更信号") + # except Exception as e: + # logging.warning(f"重新连接单元格变更信号失败: {str(e)}") # 加载包装记录 return @@ -1770,13 +1776,13 @@ class MainWindow(MainWindowUI): # 设置表格为可编辑状态 self.process_table.setEditTriggers(QTableWidget.DoubleClicked | QTableWidget.EditKeyPressed) - # 只有在之前信号已连接的情况下才重新连接 - if signal_was_connected: - try: - self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) - logging.debug("已重新连接单元格变更信号") - except Exception as e: - logging.warning(f"重新连接单元格变更信号失败: {str(e)}") + # # 只有在之前信号已连接的情况下才重新连接 + # if signal_was_connected: + # try: + # self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) + # logging.debug("已重新连接单元格变更信号") + # except Exception as e: + # logging.warning(f"重新连接单元格变更信号失败: {str(e)}") except Exception as e: logging.error(f"加载未完成的检验数据失败: {str(e)}") @@ -2440,10 +2446,10 @@ class MainWindow(MainWindowUI): except Exception as e: logging.error(f"处理称重数据时发生错误: {str(e)}") # 确保重新连接信号 - try: - self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) - except: - pass + # try: + # # self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) + # except: + # pass def _check_weight_stability(self, original_weight_kg): """ @@ -2682,11 +2688,11 @@ class MainWindow(MainWindowUI): modbus.close_client(client) logging.info("无轴重要求,已写入D10=1,通知PLC称重合格") - # 暂时断开信号连接,避免触发cellChanged信号 - try: - self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed) - except: - pass + # # 暂时断开信号连接,避免触发cellChanged信号 + # try: + # self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed) + # except: + # pass # 设置称重值单元格(显示千克) weight_item = QTableWidgetItem(str(weight_kg)) @@ -2809,7 +2815,7 @@ class MainWindow(MainWindowUI): info['mzl'] = weight_kg info['printsl'] = 1 info['pono'] = info.get("pono") or order_info.get('ddmo') - info["dycz"] = info.get("cz") + info["dycz"] = self.gc_dycz.pop(gc_note,"") or info.get("cz") # info['qd'] = self._current_gc_qd # 找到对应工程的强度,并从字典中移除 # info['qd'] = self._order_strength_data.pop(gc_note) @@ -2853,8 +2859,8 @@ class MainWindow(MainWindowUI): # 保存贴标数据到数据库 self.save_inspection_data(self._current_order_code, gc_note, tray_id, 11, 11, str(axios_num), "pass") - # 重新连接信号 - self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) + # # 重新连接信号 + # self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) # 清除当前处理行的跟踪,因为称重完成后需要等待贴标 self._current_processing_row = None @@ -2862,10 +2868,10 @@ class MainWindow(MainWindowUI): except Exception as e: logging.error(f"处理称重数据时发生错误: {str(e)}") # 确保重新连接信号 - try: - self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) - except: - pass + # try: + # self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) + # except: + # pass finally: # 释放处理锁 self._processing_weight_lock = False @@ -2944,11 +2950,11 @@ class MainWindow(MainWindowUI): # 生成贴标号(托盘号+轴号),优先使用当前行的轴号 axios_num = self.get_current_row_axios_num(data_row) - # 断开单元格变更信号,避免程序自动写入时触发 - try: - self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed) - except: - pass + # # 断开单元格变更信号,避免程序自动写入时触发 + # try: + # self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed) + # except: + # pass # 创建并设置贴标单元格 label_item = QTableWidgetItem(str(axios_num)) @@ -3003,16 +3009,16 @@ class MainWindow(MainWindowUI): # 更新包装记录统计数据 self.update_package_statistics() - # 重新连接单元格变更信号 - self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) + # # 重新连接单元格变更信号 + # self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) except Exception as e: logging.error(f"处理贴标完成信号失败: {str(e)}") # 确保信号重新连接 - try: - self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) - except: - pass + # try: + # self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) + # except: + # pass @Slot(bool, str) def handle_modbus_status_change(self, is_connected, message): @@ -4017,11 +4023,11 @@ class MainWindow(MainWindowUI): self._last_processed_gc_note = order_id logging.info(f"记录最近处理线径数据的工程号: {order_id}") - # 暂时断开信号连接,避免触发cellChanged信号 - try: - self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed) - except: - pass + # # 暂时断开信号连接,避免触发cellChanged信号 + # try: + # self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed) + # except: + # pass # 格式化值并设置单元格 formatted_value = str(value) @@ -4056,10 +4062,10 @@ class MainWindow(MainWindowUI): # 不需要在这里主动触发数据重新加载,因为handle_inspection_cell_changed会处理 # 重新连接信号 - try: - self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) - except Exception as e: - logging.warning(f"重新连接cellChanged信号失败: {str(e)}") + # try: + # self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) + # except Exception as e: + # logging.warning(f"重新连接cellChanged信号失败: {str(e)}") logging.info(f"成功设置{data_type}值 {formatted_value} 到工程号 {order_id} 的行 {data_row}") diff --git a/widgets/report_dialog.py b/widgets/report_dialog.py index 407c659..c9423c7 100644 --- a/widgets/report_dialog.py +++ b/widgets/report_dialog.py @@ -38,6 +38,10 @@ class ReportDialog(ReportDialogUI): self.material_edit.clear() self.spec_edit.clear() + # 清空表格和汇总信息 + self.report_table.setRowCount(0) + self.update_summary([]) + def on_query(self): """查询按钮点击处理""" try: @@ -87,6 +91,8 @@ class ReportDialog(ReportDialogUI): self.report_table.setRowCount(0) if not data: + # 如果没有数据,清空汇总信息 + self.update_summary([]) return # 添加数据行 @@ -100,6 +106,36 @@ class ReportDialog(ReportDialogUI): item = QTableWidgetItem(str(value)) item.setTextAlignment(Qt.AlignCenter) self.report_table.setItem(row_idx, col_idx, item) + + # 更新汇总信息 + 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)) def on_export(self): """导出按钮点击处理"""