feat:新增一键生成虚拟订单号功能

This commit is contained in:
zhu-mengmeng 2025-07-20 18:15:31 +08:00
parent d81765e7d2
commit 3246e8981f
5 changed files with 116 additions and 53 deletions

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=[11322]) client.write_registers(address=11, values=[14322])
# 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])

View File

@ -187,6 +187,29 @@ class MainWindowUI(QMainWindow):
self.order_layout.addWidget(self.order_label) self.order_layout.addWidget(self.order_label)
self.order_layout.addWidget(self.order_edit) self.order_layout.addWidget(self.order_edit)
# 添加虚拟工程号按钮
self.virtual_order_button = QPushButton("虚拟工程号")
self.virtual_order_button.setFixedHeight(30)
self.virtual_order_button.setFixedWidth(100)
self.virtual_order_button.setFont(QFont("微软雅黑", 10))
self.virtual_order_button.setStyleSheet("""
QPushButton {
background-color: #e3f2fd;
border: 1px solid #2196f3;
border-radius: 3px;
padding: 2px 5px;
color: #1976d2;
}
QPushButton:hover {
background-color: #bbdefb;
}
QPushButton:pressed {
background-color: #90caf9;
}
""")
self.order_layout.addWidget(self.virtual_order_button)
self.order_layout.addStretch() # 添加弹性空间,将组件推到左侧 self.order_layout.addStretch() # 添加弹性空间,将组件推到左侧
self.task_layout.addLayout(self.order_layout) self.task_layout.addLayout(self.order_layout)

View File

@ -296,6 +296,9 @@ class MainWindow(MainWindowUI):
self.stop_button.clicked.connect(self.handle_stop) self.stop_button.clicked.connect(self.handle_stop)
self.delete_row_button.clicked.connect(self.handle_delete_row) self.delete_row_button.clicked.connect(self.handle_delete_row)
# 连接虚拟工程号按钮事件
self.virtual_order_button.clicked.connect(self.handle_virtual_order)
# 连接托盘完成按钮事件 # 连接托盘完成按钮事件
self.tray_complete_button.clicked.connect(self.handle_tray_complete) self.tray_complete_button.clicked.connect(self.handle_tray_complete)
@ -977,6 +980,32 @@ class MainWindow(MainWindowUI):
logging.warning("工程号为空") logging.warning("工程号为空")
QMessageBox.warning(self, "输入提示", "请输入有效的工程号") QMessageBox.warning(self, "输入提示", "请输入有效的工程号")
def handle_virtual_order(self):
"""处理虚拟工程号按钮点击事件"""
try:
# 获取当前订单代码
order_code = self._current_order_code
if not order_code:
QMessageBox.warning(self, "提示", "请先选择订单")
return
# 生成基于时间戳的虚拟工程号
import datetime
timestamp = datetime.datetime.now()
virtual_gc_note = f"{timestamp.strftime('%Y%m%d_%H%M%S')}"
# 直接添加虚拟工程号到微丝产线表格,跳过接口调用
self.add_new_inspection_row(virtual_gc_note, order_code)
# 清空工程号输入框
self.order_edit.clear()
logging.info(f"已生成虚拟工程号并直接添加: {virtual_gc_note}")
except Exception as e:
logging.error(f"生成虚拟工程号失败: {str(e)}")
QMessageBox.critical(self, "错误", f"生成虚拟工程号失败: {str(e)}")
def test_rapid_scanning(self): def test_rapid_scanning(self):
"""测试快速连续扫码的场景,确保最新扫码的工程号始终在最后""" """测试快速连续扫码的场景,确保最新扫码的工程号始终在最后"""
logging.info("开始测试快速连续扫码场景") logging.info("开始测试快速连续扫码场景")
@ -1548,12 +1577,13 @@ class MainWindow(MainWindowUI):
finally: finally:
self._loading_data_in_progress = False self._loading_data_in_progress = False
def load_finished_record_to_package_record(self, order_id, gc_note, tray_id): def load_finished_record_to_package_record(self, order_id, gc_note, tray_id, axios_num=None):
"""加载已完成检验数据到包装记录 """加载已完成检验数据到包装记录
Args: Args:
order_id: 工程号 order_id: 工程号
tray_id: 托盘号 tray_id: 托盘号
axios_num: 轴号如果为None则使用数据库中的轴号
""" """
try: try:
from dao.inspection_dao import InspectionDAO from dao.inspection_dao import InspectionDAO
@ -1566,8 +1596,13 @@ class MainWindow(MainWindowUI):
logging.warning(f"未找到工程号 {gc_note} 托盘号 {tray_id} 的检验数据") logging.warning(f"未找到工程号 {gc_note} 托盘号 {tray_id} 的检验数据")
return return
# 获取轴号并保存 # 使用传入的轴号,如果没有传入则使用数据库中的轴号
if axios_num is not None:
label_value = axios_num
logging.info(f"使用传入的轴号: {label_value}")
else:
label_value = self.get_axios_num_by_order_id(self._current_order_code) label_value = self.get_axios_num_by_order_id(self._current_order_code)
logging.info(f"使用数据库中的轴号: {label_value}")
# 从检验数据中获取贴标和称重数据 # 从检验数据中获取贴标和称重数据
weight_value = "" weight_value = ""
@ -1579,7 +1614,7 @@ class MainWindow(MainWindowUI):
net_weight_value = item['value'] net_weight_value = item['value']
# 只要贴标字段有值,就可以写入包装记录 # 只要贴标字段有值,就可以写入包装记录
if label_value == None or label_value == "": if label_value is None or label_value == "":
logging.warning(f"工程号 {order_id} 托盘号 {tray_id} 的贴标字段为空,不添加到包装记录") logging.warning(f"工程号 {order_id} 托盘号 {tray_id} 的贴标字段为空,不添加到包装记录")
return return
@ -1588,7 +1623,7 @@ class MainWindow(MainWindowUI):
finish_time = datetime.now() finish_time = datetime.now()
# 将数据写入到数据库表 inspection_pack_data # 将数据写入到数据库表 inspection_pack_data
inspection_dao.save_package_record(order_id, tray_id, str(label_value+1), weight_value,net_weight_value, finish_time,gc_note) inspection_dao.save_package_record(order_id, tray_id, str(label_value), weight_value, net_weight_value, finish_time, gc_note)
# 回显数据,但避免循环调用 # 回显数据,但避免循环调用
if not getattr(self, '_loading_data_in_progress'): if not getattr(self, '_loading_data_in_progress'):
@ -2566,9 +2601,12 @@ class MainWindow(MainWindowUI):
inspection_dao.update_product_status(self._current_order_code, gc_note, tray_id, 'labeled') inspection_dao.update_product_status(self._current_order_code, gc_note, tray_id, 'labeled')
logging.info(f"工程号 {gc_note} 的贴标已完成状态更新为labeled") logging.info(f"工程号 {gc_note} 的贴标已完成状态更新为labeled")
# 调用加载到包装记录的方法 # 获取当前行的轴号,用于保存到包装记录
self.load_finished_record_to_package_record(self._current_order_code,gc_note, tray_id) current_axios_num = self.get_current_row_axios_num(data_row)
logging.info(f"贴标完成,已将工程号 {gc_note} 的记录加载到包装记录")
# 调用加载到包装记录的方法,传入正确的轴号
self.load_finished_record_to_package_record(self._current_order_code, gc_note, tray_id, current_axios_num)
logging.info(f"贴标完成,已将工程号 {gc_note} 的记录加载到包装记录,轴号: {current_axios_num}")
# 删除当前处理的行 # 删除当前处理的行
self.process_table.removeRow(data_row) self.process_table.removeRow(data_row)
@ -3826,7 +3864,7 @@ class MainWindow(MainWindowUI):
background-color: #ffcdd2; background-color: #ffcdd2;
} }
""") """)
self.delete_row_button.clicked.connect(self.handle_delete_row) # 删除按钮的信号连接已在 connect_signals 函数中处理,这里不需要重复连接
# 打印托盘号按钮 # 打印托盘号按钮
self.print_tray_button = QPushButton("打印托盘号") self.print_tray_button = QPushButton("打印托盘号")
@ -3908,7 +3946,6 @@ class MainWindow(MainWindowUI):
if current_row >= 2: # 确保不是表头行 if current_row >= 2: # 确保不是表头行
selected_rows = [self.process_table.model().index(current_row, 0)] selected_rows = [self.process_table.model().index(current_row, 0)]
else: else:
QMessageBox.warning(self, "提示", "请先选择要删除的微丝产线数据行")
return return
# 确认删除 # 确认删除
@ -3993,7 +4030,6 @@ class MainWindow(MainWindowUI):
if current_row >= 0: # 包装记录表格没有表头行 if current_row >= 0: # 包装记录表格没有表头行
selected_rows = [self.record_table.model().index(current_row, 0)] selected_rows = [self.record_table.model().index(current_row, 0)]
else: else:
QMessageBox.warning(self, "提示", "请先选择要删除的包装记录行")
return return
# 确认删除 # 确认删除

View File

@ -270,47 +270,51 @@ class OrderQueryDialog(OrderQueryDialogUI):
# 处理查询结果 # 处理查询结果
results = [] results = []
for row in rows: for row in rows:
# 将元组转换为字典 # 将元组转换为字典,使用安全的索引访问
try:
order_data = { order_data = {
"note": row[0], "note": row[0] if len(row) > 0 else "",
"mo": row[1], "mo": row[1] if len(row) > 1 else "",
"customer": row[2], "customer": row[2] if len(row) > 2 else "",
"customerexp": row[3], "customerexp": row[3] if len(row) > 3 else "",
"khno": row[4], "khno": row[4] if len(row) > 4 else "",
"ddzl": row[5], "ddzl": row[5] if len(row) > 5 else "",
"khjq": row[6], "khjq": row[6] if len(row) > 6 else "",
"code": row[7], "code": row[7] if len(row) > 7 else "",
"type": row[8], "type": row[8] if len(row) > 8 else "",
"cz": row[9], "cz": row[9] if len(row) > 9 else "",
"size": row[10], "size": row[10] if len(row) > 10 else "",
"cd": row[11], "cd": row[11] if len(row) > 11 else "",
"maxsl": row[12], "maxsl": row[12] if len(row) > 12 else "",
"spack": row[13], "spack": row[13] if len(row) > 13 else "",
"zx_name": row[14], "zx_name": row[14] if len(row) > 14 else "",
"zx_code": row[15], "zx_code": row[15] if len(row) > 15 else "",
"zx_zl": row[16], "zx_zl": row[16] if len(row) > 16 else "",
"template_name": row[17], "template_name": row[17] if len(row) > 17 else "",
"bqlb": row[18], "bqlb": row[18] if len(row) > 18 else "",
"dycz": row[19], "dycz": row[19] if len(row) > 19 else "",
"luno": row[20], "luno": row[20] if len(row) > 20 else "",
"corp": row[21], "corp": row[21] if len(row) > 21 else "",
"sl": row[22], "sl": row[22] if len(row) > 22 else "",
"tccd": row[23], "tccd": row[23] if len(row) > 23 else "",
"bccd": row[24], "bccd": row[24] if len(row) > 24 else "",
"ysl": row[25], "ysl": row[25] if len(row) > 25 else "",
"qfqd": row[26], "qfqd": row[26] if len(row) > 26 else "",
"yzgg": row[27], "yzgg": row[27] if len(row) > 27 else "",
"tqd": row[28], "tqd": row[28] if len(row) > 28 else "",
"bqd": row[29], "bqd": row[29] if len(row) > 29 else "",
"bzfs": row[30], "bzfs": row[30] if len(row) > 30 else "",
"ddyq": row[31], "ddyq": row[31] if len(row) > 31 else "",
"remarks_hb": row[32], "remarks_hb": row[32] if len(row) > 32 else "",
"bz_tqd": row[33], "bz_tqd": row[33] if len(row) > 33 else "",
"bz_bqd": row[34], "bz_bqd": row[34] if len(row) > 34 else "",
"zzyq": row[35], "zzyq": row[35] if len(row) > 35 else "",
"rq": row[36] "rq": row[36] if len(row) > 36 else ""
} }
results.append(order_data) results.append(order_data)
except Exception as e:
logging.error(f"处理查询结果行时出错: {str(e)}, 行数据: {row}")
continue
# 保存查询结果 # 保存查询结果
self.query_results = results self.query_results = results