2025-06-16 17:17:55 +08:00
|
|
|
|
from ui.loading_dialog_ui import LoadingDialogUI
|
|
|
|
|
|
from apis.tary_api import TaryApi
|
|
|
|
|
|
from PySide6.QtCore import Qt, Signal
|
|
|
|
|
|
from PySide6.QtWidgets import QMessageBox, QDialog
|
|
|
|
|
|
import logging
|
2025-06-17 14:12:34 +08:00
|
|
|
|
from utils.app_mode import AppMode
|
|
|
|
|
|
from utils.pallet_type_manager import PalletTypeManager
|
2025-06-19 23:27:38 +08:00
|
|
|
|
from apis.gc_api import GcApi
|
2025-06-16 17:17:55 +08:00
|
|
|
|
class LoadingDialog(LoadingDialogUI):
|
2025-06-19 23:27:38 +08:00
|
|
|
|
|
2025-06-16 17:17:55 +08:00
|
|
|
|
# 定义一个信号,用于向主窗口传递托盘号
|
|
|
|
|
|
tray_code_signal = Signal(str, str, str, str)
|
2025-06-19 23:27:38 +08:00
|
|
|
|
# 定义一个信号,用于向主窗口传递订单号
|
|
|
|
|
|
order_code_signal = Signal(str)
|
2025-06-16 17:17:55 +08:00
|
|
|
|
|
2025-06-19 23:27:38 +08:00
|
|
|
|
def __init__(self, parent=None,user_id=None,user_name=None,corp_id=None):
|
2025-06-16 17:17:55 +08:00
|
|
|
|
"""初始化加载对话框"""
|
|
|
|
|
|
super().__init__()
|
|
|
|
|
|
self.parent = parent
|
2025-06-19 23:27:38 +08:00
|
|
|
|
self.user_id = user_id
|
|
|
|
|
|
self.user_name = user_name
|
|
|
|
|
|
self.corp_id = corp_id
|
2025-06-16 17:17:55 +08:00
|
|
|
|
# 彻底禁用对话框的回车键关闭功能
|
|
|
|
|
|
self.setModal(True)
|
|
|
|
|
|
# 禁用所有按钮的默认行为
|
|
|
|
|
|
self.confirm_button.setAutoDefault(False)
|
|
|
|
|
|
self.confirm_button.setDefault(False)
|
|
|
|
|
|
self.cancel_button.setAutoDefault(False)
|
|
|
|
|
|
self.cancel_button.setDefault(False)
|
|
|
|
|
|
|
|
|
|
|
|
# 设置对话框特性,按下Escape键才能关闭
|
|
|
|
|
|
self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint)
|
|
|
|
|
|
|
|
|
|
|
|
# 绑定事件
|
|
|
|
|
|
self.setup_connections()
|
|
|
|
|
|
|
|
|
|
|
|
def setup_connections(self):
|
|
|
|
|
|
"""设置事件连接"""
|
|
|
|
|
|
# 托盘号输入框回车事件触发查询
|
2025-06-19 23:27:38 +08:00
|
|
|
|
self.order_input.returnPressed.connect(self.handle_order_return_pressed)
|
2025-06-16 17:17:55 +08:00
|
|
|
|
|
|
|
|
|
|
# 确认按钮点击事件
|
|
|
|
|
|
self.confirm_button.clicked.connect(self.accept)
|
|
|
|
|
|
|
|
|
|
|
|
# 取消按钮点击事件
|
|
|
|
|
|
self.cancel_button.clicked.connect(self.reject)
|
2025-06-19 23:27:38 +08:00
|
|
|
|
def handle_order_return_pressed(self):
|
|
|
|
|
|
"""处理订单输入框的回车事件"""
|
|
|
|
|
|
logging.info("订单输入框回车事件触发")
|
|
|
|
|
|
# 获取当前订单号值
|
|
|
|
|
|
order_code = self.order_input.text().strip()
|
|
|
|
|
|
if not order_code:
|
|
|
|
|
|
QMessageBox.warning(self, "提示", "请输入订单号")
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
# 发送订单号到主窗口
|
|
|
|
|
|
from widgets.main_window import MainWindow
|
|
|
|
|
|
main_window = self.parent
|
|
|
|
|
|
if main_window and isinstance(main_window, MainWindow):
|
|
|
|
|
|
logging.info(f"发送订单号到主窗口: {order_code}")
|
|
|
|
|
|
self.order_code_signal.emit(order_code)
|
|
|
|
|
|
|
|
|
|
|
|
#判断是否是接口,如果不是接口直接添加如果是则走接口
|
|
|
|
|
|
# 如果开启接口模式,则需要调用接口同步到业务库
|
|
|
|
|
|
order_info = None
|
2025-06-22 01:28:35 +08:00
|
|
|
|
self.on_order_query(order_code)
|
2025-06-19 23:27:38 +08:00
|
|
|
|
|
|
|
|
|
|
# 阻止事件继续传播
|
|
|
|
|
|
return True
|
2025-06-22 01:28:35 +08:00
|
|
|
|
|
|
|
|
|
|
def on_order_query(self,order_code):
|
|
|
|
|
|
"""查询订单信息,同时生成托盘号,并且回显到页面上"""
|
2025-06-16 17:17:55 +08:00
|
|
|
|
try:
|
2025-06-17 14:12:34 +08:00
|
|
|
|
if AppMode.is_api():
|
2025-06-22 01:28:35 +08:00
|
|
|
|
# 调用接口
|
|
|
|
|
|
gc_api = GcApi()
|
|
|
|
|
|
# 防止response为None导致异常
|
|
|
|
|
|
# 获取工程号信息,并且初始化数据
|
|
|
|
|
|
order_response = gc_api.get_order_info(order_code)
|
|
|
|
|
|
# 生成托盘号
|
|
|
|
|
|
if(order_response.get("status",False)):
|
|
|
|
|
|
# 将接口数据保存到数据库,用于后续的关联使用
|
|
|
|
|
|
from dao.inspection_dao import InspectionDAO
|
|
|
|
|
|
inspection_dao = InspectionDAO()
|
|
|
|
|
|
order_info = order_response.get("data", {})[0]
|
|
|
|
|
|
# 设置轴数
|
|
|
|
|
|
order_info['user_id'] = self.user_id
|
|
|
|
|
|
order_info['user_name'] = self.user_name
|
|
|
|
|
|
order_info['data_corp'] = self.corp_id
|
|
|
|
|
|
inspection_dao.save_order_info(order_code,order_info)
|
|
|
|
|
|
self.axis_value.setText(order_info['zx_name'])
|
|
|
|
|
|
self.quantity_value.setText(str(order_info['sl']))
|
|
|
|
|
|
self.weight_value.setText(str(order_info['sl']))
|
|
|
|
|
|
xpack_response = gc_api.get_xpack(order_code)
|
|
|
|
|
|
if(xpack_response.get("status",False)):
|
|
|
|
|
|
xpack = xpack_response['xpack']
|
|
|
|
|
|
self.tray_input.setText(xpack)
|
2025-06-22 02:03:27 +08:00
|
|
|
|
self.pallet_tier_value.setText('3')
|
|
|
|
|
|
# 发送托盘号到主窗
|
|
|
|
|
|
from widgets.main_window import MainWindow
|
|
|
|
|
|
main_window = self.parent
|
|
|
|
|
|
if main_window and isinstance(main_window, MainWindow):
|
|
|
|
|
|
# 检查托盘号是否已存在
|
|
|
|
|
|
existed = False
|
|
|
|
|
|
for i in range(main_window.tray_edit.count()):
|
|
|
|
|
|
if main_window.tray_edit.itemText(i) == xpack:
|
|
|
|
|
|
existed = True
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
|
|
# 如果不存在,则添加
|
|
|
|
|
|
if not existed:
|
|
|
|
|
|
logging.info(f"添加托盘号到主窗口: {xpack}")
|
|
|
|
|
|
main_window.tray_edit.addItem(xpack)
|
|
|
|
|
|
|
|
|
|
|
|
# 设置当前选中的托盘号
|
|
|
|
|
|
main_window.tray_edit.setCurrentText(xpack)
|
|
|
|
|
|
logging.info(f"设置主窗口当前托盘号: {xpack}")
|
2025-06-16 17:17:55 +08:00
|
|
|
|
|
2025-06-22 01:28:35 +08:00
|
|
|
|
return order_info
|
2025-06-16 17:17:55 +08:00
|
|
|
|
except Exception as e:
|
2025-06-22 01:28:35 +08:00
|
|
|
|
logging.error(f"查询订单信息异常: {str(e)}")
|
|
|
|
|
|
return None
|
2025-06-16 17:17:55 +08:00
|
|
|
|
|
|
|
|
|
|
def keyPressEvent(self, event):
|
|
|
|
|
|
"""重写键盘事件处理,防止回车关闭对话框"""
|
|
|
|
|
|
# 如果按下回车键
|
|
|
|
|
|
if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
|
|
|
|
|
|
logging.info(f"捕获到回车键事件,当前焦点部件: {self.focusWidget()}")
|
|
|
|
|
|
|
|
|
|
|
|
# 如果焦点在托盘输入框上,触发查询
|
2025-06-17 14:12:34 +08:00
|
|
|
|
# 注释掉此处的on_tray_query调用,因为已经通过returnPressed信号处理了
|
2025-06-16 17:17:55 +08:00
|
|
|
|
if self.focusWidget() == self.tray_input:
|
2025-06-17 14:12:34 +08:00
|
|
|
|
# self.on_tray_query() - 通过returnPressed信号已经处理,这里不需要再调用
|
2025-06-16 17:17:55 +08:00
|
|
|
|
event.accept() # 消费掉这个事件
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
# 如果焦点在确认按钮上,则允许默认行为(确认)
|
|
|
|
|
|
if self.focusWidget() == self.confirm_button:
|
|
|
|
|
|
return super().keyPressEvent(event)
|
|
|
|
|
|
|
|
|
|
|
|
# 其他情况下,阻止回车事件传播
|
|
|
|
|
|
event.accept() # 消费掉这个事件
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
# 其他键位事件交给父类处理
|
|
|
|
|
|
super().keyPressEvent(event)
|
|
|
|
|
|
|
|
|
|
|
|
def accept(self):
|
|
|
|
|
|
"""重写接受方法,确保在确认前所有数据都已处理"""
|
|
|
|
|
|
logging.info("确认按钮被点击或回车触发确认")
|
|
|
|
|
|
|
2025-06-22 01:28:35 +08:00
|
|
|
|
# 检查托盘层数是否有值
|
|
|
|
|
|
tier_value = self.pallet_tier_value.text().strip()
|
|
|
|
|
|
if not tier_value:
|
|
|
|
|
|
QMessageBox.warning(self, "提示", "请输入托盘层数")
|
|
|
|
|
|
return
|
2025-06-22 02:21:01 +08:00
|
|
|
|
|
|
|
|
|
|
# 获取包装号
|
|
|
|
|
|
pallet_code = self.tray_input.text().strip()
|
|
|
|
|
|
if not pallet_code:
|
|
|
|
|
|
QMessageBox.warning(self, "提示", "请输入包装号")
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 保存托盘档案信息
|
|
|
|
|
|
from utils.pallet_type_manager import PalletTypeManager
|
|
|
|
|
|
pallet_manager = PalletTypeManager.get_instance()
|
|
|
|
|
|
success = pallet_manager.save_pallet_archives(
|
|
|
|
|
|
pallet_code=pallet_code,
|
|
|
|
|
|
tier=int(tier_value),
|
|
|
|
|
|
user_id=self.user_id,
|
|
|
|
|
|
user_name=self.user_name
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
if not success:
|
|
|
|
|
|
QMessageBox.warning(self, "提示", "保存托盘档案失败")
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
logging.info(f"已保存托盘档案:包装号={pallet_code}, 层数={tier_value}")
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
logging.error(f"保存托盘档案时发生错误: {str(e)}")
|
|
|
|
|
|
QMessageBox.warning(self, "错误", f"保存托盘档案失败: {str(e)}")
|
|
|
|
|
|
return
|
2025-06-22 01:28:35 +08:00
|
|
|
|
|
2025-06-16 17:17:55 +08:00
|
|
|
|
# 确保主窗口启动了监听
|
|
|
|
|
|
from widgets.main_window import MainWindow
|
|
|
|
|
|
main_window = self.parent
|
|
|
|
|
|
if main_window and isinstance(main_window, MainWindow):
|
|
|
|
|
|
# 确保主窗口已启动监听
|
|
|
|
|
|
try:
|
|
|
|
|
|
if not hasattr(main_window, 'modbus_monitor') or not main_window.modbus_monitor.is_running():
|
|
|
|
|
|
main_window.setup_modbus_monitor()
|
|
|
|
|
|
logging.info("已在LoadingDialog确认时启动Modbus监控")
|
|
|
|
|
|
|
|
|
|
|
|
# 启动串口监听
|
|
|
|
|
|
main_window.serial_manager.auto_open_configured_ports()
|
|
|
|
|
|
|
|
|
|
|
|
# 启动键盘监听器
|
|
|
|
|
|
main_window.serial_manager.start_keyboard_listener()
|
|
|
|
|
|
logging.info("已在LoadingDialog确认时启动键盘监听器")
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
logging.error(f"LoadingDialog确认时启动监听失败: {str(e)}")
|
|
|
|
|
|
|
|
|
|
|
|
# 调用父类的accept方法关闭对话框
|
|
|
|
|
|
super().accept()
|
|
|
|
|
|
|
|
|
|
|
|
def reject(self):
|
|
|
|
|
|
"""重写拒绝方法"""
|
|
|
|
|
|
logging.info("取消按钮被点击或ESC触发取消")
|
|
|
|
|
|
# 调用父类的reject方法关闭对话框
|
|
|
|
|
|
super().reject()
|