This commit is contained in:
zhu-mengmeng 2025-09-24 14:26:29 +08:00
parent b5420880f7
commit 275ad1a720
7 changed files with 179 additions and 70 deletions

View File

@ -123,7 +123,7 @@
}
},
"electricity": {
"auto_start": false,
"auto_start": true,
"interval_minutes": 30
}
}

Binary file not shown.

View File

@ -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)

View File

@ -20,7 +20,7 @@ class MainWindowUI(QMainWindow):
"炉号": "luno",
"轴型": "zx_name",
"标签": "template_name",
"打印材质": "cz",
"打印材质": "dycz",
"底托类型": "spack_type",
"强度范围": "qx",
"强度": "qd",

View File

@ -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):
"""创建按钮区域"""

View File

@ -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}")

View File

@ -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):
"""导出按钮点击处理"""