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": { "electricity": {
"auto_start": false, "auto_start": true,
"interval_minutes": 30 "interval_minutes": 30
} }
} }

Binary file not shown.

View File

@ -2,7 +2,7 @@ from pymodbus.client import ModbusTcpClient
import time import time
client = ModbusTcpClient('localhost', port=5020) client = ModbusTcpClient('localhost', port=5020)
client.connect() client.connect()
client.write_registers(address=11, values=[25700]) client.write_registers(address=11, values=[19200])
# client.write_registers(address=3, values=[0]) # client.write_registers(address=3, values=[0])
# time.sleep(2) # time.sleep(2)
# client.write_registers(address=0, values=[0]) # 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=24, values=[1])
# client.write_registers(address=2, values=[0]) # client.write_registers(address=2, values=[0])
client.write_registers(address=13, values=[1]) client.write_registers(address=13, values=[0])
# time.sleep(2) # time.sleep(2)
# client.write_registers(address=20, values=[0]) # client.write_registers(address=20, values=[0])
# time.sleep(3) # time.sleep(3)

View File

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

View File

@ -175,6 +175,73 @@ class ReportDialogUI(QDialog):
# 添加到主布局 # 添加到主布局
self.main_layout.addWidget(self.report_table) 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): def create_button_section(self):
"""创建按钮区域""" """创建按钮区域"""

View File

@ -248,6 +248,8 @@ class MainWindow(MainWindowUI):
# 加载库房和线材类型数据 # 加载库房和线材类型数据
self.load_warehouse_data() self.load_warehouse_data()
self.load_wire_type_data() self.load_wire_type_data()
self.gc_dycz = {}
logging.info("主窗口初始化时已启动Modbus监控系统") logging.info("主窗口初始化时已启动Modbus监控系统")
@ -981,6 +983,7 @@ class MainWindow(MainWindowUI):
# 保存工程号对应的强度数据 # 保存工程号对应的强度数据
self._order_strength_data[gc_note] = self._current_gc_qd self._order_strength_data[gc_note] = self._current_gc_qd
self._current_gc_sc_gch = gc_info.get("sc_gch", "") # 保存sc_gch字段 self._current_gc_sc_gch = gc_info.get("sc_gch", "") # 保存sc_gch字段
self.gc_dycz[gc_note] = gc_info.get("dycz","")
# 先获取当前 info_table 已有的数据 # 先获取当前 info_table 已有的数据
order_info = {} order_info = {}
for field_name, label in self.info_values.items(): for field_name, label in self.info_values.items():
@ -1010,6 +1013,8 @@ class MainWindow(MainWindowUI):
order_info[order_info_key] = "" order_info[order_info_key] = ""
else: else:
order_info[order_info_key] = "" 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'): elif hasattr(label, 'text'):
# 其他有text方法的控件 # 其他有text方法的控件
order_info[order_info_key] = label.text() order_info[order_info_key] = label.text()
@ -1026,6 +1031,7 @@ class MainWindow(MainWindowUI):
continue continue
# 更新/补充 qd 字段 # 更新/补充 qd 字段
order_info["qd"] = self._current_gc_qd order_info["qd"] = self._current_gc_qd
# 再调用 update_info_table # 再调用 update_info_table
self.update_info_table(order_info) self.update_info_table(order_info)
self.add_new_inspection_row(gc_note, self._current_order_code) self.add_new_inspection_row(gc_note, self._current_order_code)
@ -1076,7 +1082,7 @@ class MainWindow(MainWindowUI):
logging.info(f"已生成虚拟工程号并直接添加: {virtual_gc_note}") logging.info(f"已生成虚拟工程号并直接添加: {virtual_gc_note}")
# 确保完整加载所有检验数据,包括线径数据 # 确保完整加载所有检验数据,包括线径数据
self._safe_load_data() # self._safe_load_data()
except Exception as e: except Exception as e:
logging.error(f"生成虚拟工程号失败: {str(e)}") logging.error(f"生成虚拟工程号失败: {str(e)}")
@ -1101,10 +1107,10 @@ class MainWindow(MainWindowUI):
enabled_configs = self.inspection_manager.get_enabled_configs() enabled_configs = self.inspection_manager.get_enabled_configs()
# 断开单元格变更信号,避免加载过程中触发保存 # 断开单元格变更信号,避免加载过程中触发保存
try: # try:
self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed) # self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed)
except: # except:
pass # pass
# 计算新行的行索引(添加到末尾) # 计算新行的行索引(添加到末尾)
data_start_row = self.process_table.rowCount() 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.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) 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) unfinished_data = inspection_dao.get_inspection_data_unfinished(tray_id, package_id)
# 检查信号是否已连接,并断开单元格变更信号 # 检查信号是否已连接,并断开单元格变更信号
try: # try:
signal_was_connected = self.process_table.receivers(self.process_table.cellChanged) > 0 # signal_was_connected = self.process_table.receivers(self.process_table.cellChanged) > 0
if signal_was_connected: # if signal_was_connected:
self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed) # self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed)
logging.debug("已断开单元格变更信号") # logging.debug("已断开单元格变更信号")
except Exception as e: # except Exception as e:
logging.debug(f"断开单元格变更信号失败: {str(e)}") # logging.debug(f"断开单元格变更信号失败: {str(e)}")
signal_was_connected = False # signal_was_connected = False
# 清空表格现有数据行,只保留表头 # 清空表格现有数据行,只保留表头
while self.process_table.rowCount() > 2: while self.process_table.rowCount() > 2:
@ -1608,13 +1614,13 @@ class MainWindow(MainWindowUI):
# 确保表格完全清空,只保留表头行 # 确保表格完全清空,只保留表头行
self.process_table.setRowCount(2) # 只保留表头的两行 self.process_table.setRowCount(2) # 只保留表头的两行
# 只有在之前信号已连接的情况下才重新连接 # # 只有在之前信号已连接的情况下才重新连接
if signal_was_connected: # if signal_was_connected:
try: # try:
self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) # self.process_table.cellChanged.connect(self.handle_inspection_cell_changed)
logging.debug("已重新连接单元格变更信号") # logging.debug("已重新连接单元格变更信号")
except Exception as e: # except Exception as e:
logging.warning(f"重新连接单元格变更信号失败: {str(e)}") # logging.warning(f"重新连接单元格变更信号失败: {str(e)}")
# 加载包装记录 # 加载包装记录
return return
@ -1770,13 +1776,13 @@ class MainWindow(MainWindowUI):
# 设置表格为可编辑状态 # 设置表格为可编辑状态
self.process_table.setEditTriggers(QTableWidget.DoubleClicked | QTableWidget.EditKeyPressed) self.process_table.setEditTriggers(QTableWidget.DoubleClicked | QTableWidget.EditKeyPressed)
# 只有在之前信号已连接的情况下才重新连接 # # 只有在之前信号已连接的情况下才重新连接
if signal_was_connected: # if signal_was_connected:
try: # try:
self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) # self.process_table.cellChanged.connect(self.handle_inspection_cell_changed)
logging.debug("已重新连接单元格变更信号") # logging.debug("已重新连接单元格变更信号")
except Exception as e: # except Exception as e:
logging.warning(f"重新连接单元格变更信号失败: {str(e)}") # logging.warning(f"重新连接单元格变更信号失败: {str(e)}")
except Exception as e: except Exception as e:
logging.error(f"加载未完成的检验数据失败: {str(e)}") logging.error(f"加载未完成的检验数据失败: {str(e)}")
@ -2440,10 +2446,10 @@ class MainWindow(MainWindowUI):
except Exception as e: except Exception as e:
logging.error(f"处理称重数据时发生错误: {str(e)}") logging.error(f"处理称重数据时发生错误: {str(e)}")
# 确保重新连接信号 # 确保重新连接信号
try: # try:
self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) # # self.process_table.cellChanged.connect(self.handle_inspection_cell_changed)
except: # except:
pass # pass
def _check_weight_stability(self, original_weight_kg): def _check_weight_stability(self, original_weight_kg):
""" """
@ -2682,11 +2688,11 @@ class MainWindow(MainWindowUI):
modbus.close_client(client) modbus.close_client(client)
logging.info("无轴重要求已写入D10=1通知PLC称重合格") logging.info("无轴重要求已写入D10=1通知PLC称重合格")
# 暂时断开信号连接避免触发cellChanged信号 # # 暂时断开信号连接避免触发cellChanged信号
try: # try:
self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed) # self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed)
except: # except:
pass # pass
# 设置称重值单元格(显示千克) # 设置称重值单元格(显示千克)
weight_item = QTableWidgetItem(str(weight_kg)) weight_item = QTableWidgetItem(str(weight_kg))
@ -2809,7 +2815,7 @@ class MainWindow(MainWindowUI):
info['mzl'] = weight_kg info['mzl'] = weight_kg
info['printsl'] = 1 info['printsl'] = 1
info['pono'] = info.get("pono") or order_info.get('ddmo') 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._current_gc_qd
# 找到对应工程的强度,并从字典中移除 # 找到对应工程的强度,并从字典中移除
# info['qd'] = self._order_strength_data.pop(gc_note) # 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.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 self._current_processing_row = None
@ -2862,10 +2868,10 @@ class MainWindow(MainWindowUI):
except Exception as e: except Exception as e:
logging.error(f"处理称重数据时发生错误: {str(e)}") logging.error(f"处理称重数据时发生错误: {str(e)}")
# 确保重新连接信号 # 确保重新连接信号
try: # try:
self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) # self.process_table.cellChanged.connect(self.handle_inspection_cell_changed)
except: # except:
pass # pass
finally: finally:
# 释放处理锁 # 释放处理锁
self._processing_weight_lock = False self._processing_weight_lock = False
@ -2944,11 +2950,11 @@ class MainWindow(MainWindowUI):
# 生成贴标号(托盘号+轴号),优先使用当前行的轴号 # 生成贴标号(托盘号+轴号),优先使用当前行的轴号
axios_num = self.get_current_row_axios_num(data_row) axios_num = self.get_current_row_axios_num(data_row)
# 断开单元格变更信号,避免程序自动写入时触发 # # 断开单元格变更信号,避免程序自动写入时触发
try: # try:
self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed) # self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed)
except: # except:
pass # pass
# 创建并设置贴标单元格 # 创建并设置贴标单元格
label_item = QTableWidgetItem(str(axios_num)) label_item = QTableWidgetItem(str(axios_num))
@ -3003,16 +3009,16 @@ class MainWindow(MainWindowUI):
# 更新包装记录统计数据 # 更新包装记录统计数据
self.update_package_statistics() 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: except Exception as e:
logging.error(f"处理贴标完成信号失败: {str(e)}") logging.error(f"处理贴标完成信号失败: {str(e)}")
# 确保信号重新连接 # 确保信号重新连接
try: # try:
self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) # self.process_table.cellChanged.connect(self.handle_inspection_cell_changed)
except: # except:
pass # pass
@Slot(bool, str) @Slot(bool, str)
def handle_modbus_status_change(self, is_connected, message): def handle_modbus_status_change(self, is_connected, message):
@ -4017,11 +4023,11 @@ class MainWindow(MainWindowUI):
self._last_processed_gc_note = order_id self._last_processed_gc_note = order_id
logging.info(f"记录最近处理线径数据的工程号: {order_id}") logging.info(f"记录最近处理线径数据的工程号: {order_id}")
# 暂时断开信号连接避免触发cellChanged信号 # # 暂时断开信号连接避免触发cellChanged信号
try: # try:
self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed) # self.process_table.cellChanged.disconnect(self.handle_inspection_cell_changed)
except: # except:
pass # pass
# 格式化值并设置单元格 # 格式化值并设置单元格
formatted_value = str(value) formatted_value = str(value)
@ -4056,10 +4062,10 @@ class MainWindow(MainWindowUI):
# 不需要在这里主动触发数据重新加载因为handle_inspection_cell_changed会处理 # 不需要在这里主动触发数据重新加载因为handle_inspection_cell_changed会处理
# 重新连接信号 # 重新连接信号
try: # try:
self.process_table.cellChanged.connect(self.handle_inspection_cell_changed) # self.process_table.cellChanged.connect(self.handle_inspection_cell_changed)
except Exception as e: # except Exception as e:
logging.warning(f"重新连接cellChanged信号失败: {str(e)}") # logging.warning(f"重新连接cellChanged信号失败: {str(e)}")
logging.info(f"成功设置{data_type}{formatted_value} 到工程号 {order_id} 的行 {data_row}") 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.material_edit.clear()
self.spec_edit.clear() self.spec_edit.clear()
# 清空表格和汇总信息
self.report_table.setRowCount(0)
self.update_summary([])
def on_query(self): def on_query(self):
"""查询按钮点击处理""" """查询按钮点击处理"""
try: try:
@ -87,6 +91,8 @@ class ReportDialog(ReportDialogUI):
self.report_table.setRowCount(0) self.report_table.setRowCount(0)
if not data: if not data:
# 如果没有数据,清空汇总信息
self.update_summary([])
return return
# 添加数据行 # 添加数据行
@ -100,6 +106,36 @@ class ReportDialog(ReportDialogUI):
item = QTableWidgetItem(str(value)) item = QTableWidgetItem(str(value))
item.setTextAlignment(Qt.AlignCenter) item.setTextAlignment(Qt.AlignCenter)
self.report_table.setItem(row_idx, col_idx, item) 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): def on_export(self):
"""导出按钮点击处理""" """导出按钮点击处理"""