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 ac20ea3..407c866 100644 Binary files a/db/jtDB.db and b/db/jtDB.db differ diff --git a/from pymodbus.py b/from pymodbus.py index 340e121..70af323 100644 --- a/from pymodbus.py +++ b/from pymodbus.py @@ -2,7 +2,7 @@ from pymodbus.client import ModbusTcpClient import time client = ModbusTcpClient('localhost', port=5020) client.connect() -client.write_registers(address=11, values=[25700]) +client.write_registers(address=11, values=[19200]) # client.write_registers(address=3, values=[0]) # time.sleep(2) # client.write_registers(address=0, values=[0]) @@ -13,7 +13,7 @@ client.write_registers(address=11, values=[25700]) # 贴标完成 # client.write_registers(address=24, values=[1]) # client.write_registers(address=2, values=[0]) -client.write_registers(address=13, values=[1]) +client.write_registers(address=13, values=[0]) # time.sleep(2) # client.write_registers(address=20, values=[0]) # time.sleep(3) diff --git a/ui/main_window_ui.py b/ui/main_window_ui.py index 4c280d2..3b2db9a 100644 --- a/ui/main_window_ui.py +++ b/ui/main_window_ui.py @@ -20,7 +20,7 @@ class MainWindowUI(QMainWindow): "炉号": "luno", "轴型": "zx_name", "标签": "template_name", - "打印材质": "cz", + "打印材质": "dycz", "底托类型": "spack_type", "强度范围": "qx", "强度": "qd", diff --git a/ui/report_dialog_ui.py b/ui/report_dialog_ui.py index c8b56fd..49be748 100644 --- a/ui/report_dialog_ui.py +++ b/ui/report_dialog_ui.py @@ -175,6 +175,73 @@ class ReportDialogUI(QDialog): # 添加到主布局 self.main_layout.addWidget(self.report_table) + + # 创建汇总区域 + self.create_summary_section() + + def create_summary_section(self): + """创建汇总区域""" + # 汇总容器 + self.summary_frame = QFrame() + self.summary_frame.setFrameShape(QFrame.StyledPanel) + self.summary_frame.setStyleSheet(""" + QFrame { + background-color: #f8f9fa; + border: 1px solid #dee2e6; + border-radius: 4px; + } + """) + + self.summary_layout = QHBoxLayout(self.summary_frame) + self.summary_layout.setContentsMargins(15, 10, 15, 10) + self.summary_layout.setSpacing(20) + + # 汇总标题 + self.summary_title = QLabel("汇总统计") + self.summary_title.setFont(self.title_font) + self.summary_title.setStyleSheet("color: #495057; font-weight: bold;") + + # 总轴数 + self.total_axes_label = QLabel("总轴数:") + self.total_axes_label.setFont(self.normal_font) + self.total_axes_label.setStyleSheet("color: #495057; font-weight: bold;") + self.total_axes_value = QLabel("0") + self.total_axes_value.setFont(self.normal_font) + self.total_axes_value.setStyleSheet("color: #007bff; font-weight: bold;") + self.total_axes_value.setMinimumWidth(80) + + # 总净重 + self.total_weight_label = QLabel("总净重:") + self.total_weight_label.setFont(self.normal_font) + self.total_weight_label.setStyleSheet("color: #495057; font-weight: bold;") + self.total_weight_value = QLabel("0.00 ") + self.total_weight_value.setFont(self.normal_font) + self.total_weight_value.setStyleSheet("color: #28a745; font-weight: bold;") + self.total_weight_value.setMinimumWidth(100) + + # 记录数 + self.record_count_label = QLabel("记录数:") + self.record_count_label.setFont(self.normal_font) + self.record_count_label.setStyleSheet("color: #495057; font-weight: bold;") + self.record_count_value = QLabel("0") + self.record_count_value.setFont(self.normal_font) + self.record_count_value.setStyleSheet("color: #6c757d; font-weight: bold;") + self.record_count_value.setMinimumWidth(60) + + # 添加到汇总布局 + self.summary_layout.addWidget(self.summary_title) + self.summary_layout.addStretch() + self.summary_layout.addWidget(self.total_axes_label) + self.summary_layout.addWidget(self.total_axes_value) + self.summary_layout.addSpacing(20) + self.summary_layout.addWidget(self.total_weight_label) + self.summary_layout.addWidget(self.total_weight_value) + self.summary_layout.addSpacing(20) + self.summary_layout.addWidget(self.record_count_label) + self.summary_layout.addWidget(self.record_count_value) + + # 添加到主布局 + self.main_layout.addWidget(self.summary_frame) def create_button_section(self): """创建按钮区域""" diff --git a/widgets/main_window.py b/widgets/main_window.py index dbf6a46..1a2966f 100644 --- a/widgets/main_window.py +++ b/widgets/main_window.py @@ -248,6 +248,8 @@ class MainWindow(MainWindowUI): # 加载库房和线材类型数据 self.load_warehouse_data() self.load_wire_type_data() + + self.gc_dycz = {} logging.info("主窗口初始化时已启动Modbus监控系统") @@ -981,6 +983,7 @@ class MainWindow(MainWindowUI): # 保存工程号对应的强度数据 self._order_strength_data[gc_note] = self._current_gc_qd self._current_gc_sc_gch = gc_info.get("sc_gch", "") # 保存sc_gch字段 + self.gc_dycz[gc_note] = gc_info.get("dycz","") # 先获取当前 info_table 已有的数据 order_info = {} for field_name, label in self.info_values.items(): @@ -1010,6 +1013,8 @@ class MainWindow(MainWindowUI): order_info[order_info_key] = "" else: order_info[order_info_key] = "" + elif field_name == "打印材质": + order_info[order_info_key] = self.gc_dycz.pop(gc_note,"") or label.text() elif hasattr(label, 'text'): # 其他有text方法的控件 order_info[order_info_key] = label.text() @@ -1026,6 +1031,7 @@ class MainWindow(MainWindowUI): continue # 更新/补充 qd 字段 order_info["qd"] = self._current_gc_qd + # 再调用 update_info_table self.update_info_table(order_info) self.add_new_inspection_row(gc_note, self._current_order_code) @@ -1076,7 +1082,7 @@ class MainWindow(MainWindowUI): logging.info(f"已生成虚拟工程号并直接添加: {virtual_gc_note}") # 确保完整加载所有检验数据,包括线径数据 - self._safe_load_data() + # self._safe_load_data() except Exception as e: logging.error(f"生成虚拟工程号失败: {str(e)}") @@ -1101,10 +1107,10 @@ class MainWindow(MainWindowUI): enabled_configs = self.inspection_manager.get_enabled_configs() # 断开单元格变更信号,避免加载过程中触发保存 - 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 # 计算新行的行索引(添加到末尾) data_start_row = self.process_table.rowCount() @@ -1167,10 +1173,10 @@ class MainWindow(MainWindowUI): self.process_table.setItem(data_start_row, col_index, item) # 设置表格为可编辑状态 - self.process_table.setEditTriggers(QTableWidget.DoubleClicked | QTableWidget.EditKeyPressed) + # self.process_table.setEditTriggers(QTableWidget.DoubleClicked | QTableWidget.EditKeyPressed) - # 重新连接单元格内容变更信号 - self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) + # # 重新连接单元格内容变更信号 + # self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) # 选中新添加的行 self.process_table.selectRow(data_start_row) @@ -1590,14 +1596,14 @@ class MainWindow(MainWindowUI): unfinished_data = inspection_dao.get_inspection_data_unfinished(tray_id, package_id) # 检查信号是否已连接,并断开单元格变更信号 - 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 + # 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): """导出按钮点击处理"""