feat: 更新托盘信息获取逻辑,修改托盘料字段名称,优化加载对话框和主窗口托盘号处理,添加了 API 和本地数据源的支持

This commit is contained in:
zhu-mengmeng 2025-06-17 14:12:34 +08:00
parent 507a345d43
commit c091a55cb0
11 changed files with 296 additions and 218 deletions

View File

@ -60,7 +60,7 @@ class TaryApi:
"tp_note": tray_info.get("tp_note", ""), # 托盘号 "tp_note": tray_info.get("tp_note", ""), # 托盘号
"product_name": tray_info.get("zx_name", ""), # 产品名称 "product_name": tray_info.get("zx_name", ""), # 产品名称
"axis_type": tray_info.get("zx", ""), # 轴型 "axis_type": tray_info.get("zx", ""), # 轴型
"material": str(tray_info.get("cs", "")), # 托盘料 "tier": str(tray_info.get("cs", "")), # 托盘料
"weight": str(tray_info.get("zl", "")), # 重量 "weight": str(tray_info.get("zl", "")), # 重量
"quantity": "" # 数量先空下 "quantity": "" # 数量先空下
} }

View File

@ -7,7 +7,8 @@
"enable_keyboard_listener": false, "enable_keyboard_listener": false,
"enable_camera": false "enable_camera": false
}, },
"base_url":"http://192.168.0.133:8080" "base_url": "http://localhost:8084",
"mode": "standalone"
}, },
"apis": { "apis": {
"get_tray_info": "/apjt/xcsc/tpda/getByTp_note/" "get_tray_info": "/apjt/xcsc/tpda/getByTp_note/"
@ -50,7 +51,8 @@
"serial": { "serial": {
"keyboard": { "keyboard": {
"trigger_key": "Key.page_up" "trigger_key": "Key.page_up"
},"mdz":{ },
"mdz": {
"bit": 10, "bit": 10,
"code": "mdz", "code": "mdz",
"data_bits": 8, "data_bits": 8,
@ -61,7 +63,8 @@
"ser": "COM5", "ser": "COM5",
"stop_bits": 1, "stop_bits": 1,
"timeout": 1 "timeout": 1
},"cz":{ },
"cz": {
"bit": 10, "bit": 10,
"code": "cz", "code": "cz",
"data_bits": 8, "data_bits": 8,

View File

@ -14,53 +14,20 @@ class PalletTypeDAO:
if hasattr(self, 'db'): if hasattr(self, 'db'):
self.db.close() self.db.close()
def get_all_pallet_types(self, include_disabled=False): def get_pallet_code(self):
"""获取所有托盘类型 """获取托盘号"""
Args:
include_disabled: 是否包含禁用的类型
Returns:
list: 托盘类型列表
"""
try: try:
if include_disabled:
sql = """ sql = """
SELECT id, type_name, operation_type, description, enabled, sort_order SELECT DISTINCT pallet_code
FROM wsbz_pallet_types FROM wsbz_pallet_archives
WHERE is_deleted = FALSE WHERE is_deleted = FALSE
ORDER BY sort_order
""" """
params = () self.db.cursor.execute(sql)
else:
sql = """
SELECT id, type_name, operation_type, description, enabled, sort_order
FROM wsbz_pallet_types
WHERE is_deleted = FALSE AND enabled = TRUE
ORDER BY sort_order
"""
params = ()
self.db.cursor.execute(sql, params)
results = self.db.cursor.fetchall() results = self.db.cursor.fetchall()
return [row[0] for row in results]
pallet_types = []
for row in results:
pallet_type = {
'id': row[0],
'type_name': row[1],
'operation_type': row[2],
'description': row[3],
'enabled': bool(row[4]),
'sort_order': row[5]
}
pallet_types.append(pallet_type)
return pallet_types
except Exception as e: except Exception as e:
logging.error(f"获取托盘类型失败: {str(e)}") logging.error(f"获取托盘号失败: {str(e)}")
return [] return []
def get_pallet_type_by_pallet_id(self, pallet_code): def get_pallet_type_by_pallet_id(self, pallet_code):
"""根据托盘号获取托盘类型 """根据托盘号获取托盘类型
@ -84,7 +51,37 @@ class PalletTypeDAO:
except Exception as e: except Exception as e:
logging.error(f"获取托盘类型失败: {str(e)}") logging.error(f"获取托盘类型失败: {str(e)}")
return None return None
def get_pallet_info_by_pallet_id(self, pallet_code):
"""根据托盘号获取托盘信息
Args:
pallet_code: 托盘号
Returns:
dict: 托盘信息未找到则返回None
"""
try:
sql = """
SELECT pallet_code,
pallet_name,
description,
axios_name,
axios_type,
tier,
size,
amount,
weight
FROM wsbz_pallet_archives t1
WHERE pallet_code = ? AND t1.is_deleted = FALSE
"""
params = (pallet_code,)
self.db.cursor.execute(sql, params)
row = self.db.cursor.fetchone()
if row:
return row
except Exception as e:
logging.error(f"获取托盘类型失败: {str(e)}")
return None
def get_pallet_types_by_operation(self, operation_type, include_disabled=False): def get_pallet_types_by_operation(self, operation_type, include_disabled=False):
"""根据操作类型获取托盘类型 """根据操作类型获取托盘类型

Binary file not shown.

View File

@ -9,7 +9,7 @@ class LoadingDialogUI(QDialog):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.setWindowTitle("上料操作") self.setWindowTitle("上料操作")
self.setFixedSize(600, 300) self.setFixedSize(600, 250)
# 设置字体 # 设置字体
self.normal_font = QFont("微软雅黑", 12) self.normal_font = QFont("微软雅黑", 12)
@ -87,43 +87,6 @@ class LoadingDialogUI(QDialog):
row1 = QHBoxLayout() row1 = QHBoxLayout()
row1.setSpacing(0) row1.setSpacing(0)
order_layout = QHBoxLayout()
order_layout.setSpacing(0)
self.order_label = QLabel("订单号")
self.order_label.setFont(self.normal_font)
self.order_label.setStyleSheet(label_style)
self.order_label.setFixedWidth(100)
self.order_label.setFixedHeight(45)
self.order_input = QLineEdit()
self.order_input.setFont(self.normal_font)
self.order_input.setPlaceholderText("请扫描订单号")
self.order_input.setStyleSheet(input_style)
self.order_input.setFixedHeight(45)
order_layout.addWidget(self.order_label)
order_layout.addWidget(self.order_input, 1)
product_layout = QHBoxLayout()
product_layout.setSpacing(0)
self.product_label = QLabel("产品")
self.product_label.setFont(self.normal_font)
self.product_label.setStyleSheet(label_style)
self.product_label.setFixedWidth(100)
self.product_label.setFixedHeight(45)
self.product_value = QLabel("")
self.product_value.setFont(self.normal_font)
self.product_value.setStyleSheet(value_style)
self.product_value.setFixedHeight(45)
product_layout.addWidget(self.product_label)
product_layout.addWidget(self.product_value, 1)
row1.addLayout(order_layout, 1)
row1.addLayout(product_layout, 1)
container_layout.addLayout(row1)
# 第二行:托盘号 # 第二行:托盘号
row2 = QHBoxLayout() row2 = QHBoxLayout()
row2.setSpacing(0) row2.setSpacing(0)
@ -164,24 +127,24 @@ class LoadingDialogUI(QDialog):
axis_layout.addWidget(self.axis_label) axis_layout.addWidget(self.axis_label)
axis_layout.addWidget(self.axis_value, 1) axis_layout.addWidget(self.axis_value, 1)
material_layout = QHBoxLayout() tier_layout = QHBoxLayout()
material_layout.setSpacing(0) tier_layout.setSpacing(0)
self.pallet_material_label = QLabel("托盘料") self.pallet_tier_label = QLabel("托盘料")
self.pallet_material_label.setFont(self.normal_font) self.pallet_tier_label.setFont(self.normal_font)
self.pallet_material_label.setStyleSheet(label_style) self.pallet_tier_label.setStyleSheet(label_style)
self.pallet_material_label.setFixedWidth(100) self.pallet_tier_label.setFixedWidth(100)
self.pallet_material_label.setFixedHeight(40) self.pallet_tier_label.setFixedHeight(40)
self.pallet_material_value = QLabel("--") self.pallet_tier_value = QLabel("--")
self.pallet_material_value.setFont(self.normal_font) self.pallet_tier_value.setFont(self.normal_font)
self.pallet_material_value.setStyleSheet(value_style) self.pallet_tier_value.setStyleSheet(value_style)
self.pallet_material_value.setFixedHeight(40) self.pallet_tier_value.setFixedHeight(40)
material_layout.addWidget(self.pallet_material_label) tier_layout.addWidget(self.pallet_tier_label)
material_layout.addWidget(self.pallet_material_value, 1) tier_layout.addWidget(self.pallet_tier_value, 1)
row3.addLayout(axis_layout, 1) row3.addLayout(axis_layout, 1)
row3.addLayout(material_layout, 1) row3.addLayout(tier_layout, 1)
container_layout.addLayout(row3) container_layout.addLayout(row3)
# 第四行:数量和重量 # 第四行:数量和重量

View File

@ -223,12 +223,9 @@ class MainWindowUI(QMainWindow):
self.tray_edit.setMaxVisibleItems(10) # 设置下拉框最多显示10个项目 self.tray_edit.setMaxVisibleItems(10) # 设置下拉框最多显示10个项目
self.tray_edit.completer().setCaseSensitivity(Qt.CaseInsensitive) # 设置补全不区分大小写 self.tray_edit.completer().setCaseSensitivity(Qt.CaseInsensitive) # 设置补全不区分大小写
self.tray_edit.completer().setFilterMode(Qt.MatchContains) # 设置模糊匹配模式 self.tray_edit.completer().setFilterMode(Qt.MatchContains) # 设置模糊匹配模式
self.tray_edit.addItem("托盘1") # 允许清空选择
self.tray_edit.addItem("托盘2") self.tray_edit.setCurrentText("")
self.tray_edit.addItem("托盘3")
self.tray_edit.addItem("托盘4")
self.tray_edit.addItem("托盘5")
self.tray_edit.addItem("托盘6")
self.tray_layout.addWidget(self.tray_edit) self.tray_layout.addWidget(self.tray_edit)
self.left_layout.addWidget(self.tray_frame) self.left_layout.addWidget(self.tray_frame)

View File

@ -123,24 +123,24 @@ class UnloadingDialogUI(QDialog):
axis_layout.addWidget(self.axis_label) axis_layout.addWidget(self.axis_label)
axis_layout.addWidget(self.axis_value, 1) axis_layout.addWidget(self.axis_value, 1)
material_layout = QHBoxLayout() tier_layout = QHBoxLayout()
material_layout.setSpacing(0) tier_layout.setSpacing(0)
self.pallet_material_label = QLabel("托盘料") self.pallet_tier_label = QLabel("托盘料")
self.pallet_material_label.setFont(self.normal_font) self.pallet_tier_label.setFont(self.normal_font)
self.pallet_material_label.setStyleSheet(label_style) self.pallet_tier_label.setStyleSheet(label_style)
self.pallet_material_label.setFixedWidth(100) self.pallet_tier_label.setFixedWidth(100)
self.pallet_material_label.setFixedHeight(40) self.pallet_tier_label.setFixedHeight(40)
self.pallet_material_value = QLabel("--") self.pallet_tier_value = QLabel("--")
self.pallet_material_value.setFont(self.normal_font) self.pallet_tier_value.setFont(self.normal_font)
self.pallet_material_value.setStyleSheet(value_style) self.pallet_tier_value.setStyleSheet(value_style)
self.pallet_material_value.setFixedHeight(40) self.pallet_tier_value.setFixedHeight(40)
material_layout.addWidget(self.pallet_material_label) tier_layout.addWidget(self.pallet_tier_label)
material_layout.addWidget(self.pallet_material_value, 1) tier_layout.addWidget(self.pallet_tier_value, 1)
row2.addLayout(axis_layout, 1) row2.addLayout(axis_layout, 1)
row2.addLayout(material_layout, 1) row2.addLayout(tier_layout, 1)
container_layout.addLayout(row2) container_layout.addLayout(row2)
# 第三行:数量和重量 # 第三行:数量和重量

View File

@ -17,31 +17,8 @@ class PalletTypeManager:
"""初始化托盘类型管理器""" """初始化托盘类型管理器"""
self.dao = PalletTypeDAO() self.dao = PalletTypeDAO()
self.pallet_types = [] self.pallet_types = []
self.reload_pallet_types()
def reload_pallet_types(self):
"""重新加载托盘类型"""
try:
self.pallet_types = self.dao.get_all_pallet_types(include_disabled=True)
logging.info(f"已加载{len(self.pallet_types)}个托盘类型")
return True
except Exception as e:
logging.error(f"加载托盘类型失败: {str(e)}")
return False
def get_all_pallet_types(self, include_disabled=False):
"""获取所有托盘类型
Args:
include_disabled: 是否包含禁用的类型
Returns:
list: 托盘类型列表
"""
if include_disabled:
return self.pallet_types
else:
return [pallet_type for pallet_type in self.pallet_types if pallet_type['enabled']]
def get_pallet_types_by_operation(self, operation_type, include_disabled=False): def get_pallet_types_by_operation(self, operation_type, include_disabled=False):
"""根据操作类型获取托盘类型 """根据操作类型获取托盘类型
@ -210,3 +187,22 @@ class PalletTypeManager:
return result return result
else: else:
return None return None
# 获取托盘号
def get_pallet_code(self):
"""获取托盘号"""
result = self.dao.get_pallet_code()
if result:
return result
else:
return None
def get_pallet_info_by_pallet_id(self, pallet_code):
"""根据托盘号获取托盘信息
Args:
pallet_code: 托盘号
"""
result = self.dao.get_pallet_info_by_pallet_id(pallet_code)
if result:
return result
else:
return None

View File

@ -3,7 +3,8 @@ from apis.tary_api import TaryApi
from PySide6.QtCore import Qt, Signal from PySide6.QtCore import Qt, Signal
from PySide6.QtWidgets import QMessageBox, QDialog from PySide6.QtWidgets import QMessageBox, QDialog
import logging import logging
from utils.app_mode import AppMode
from utils.pallet_type_manager import PalletTypeManager
class LoadingDialog(LoadingDialogUI): class LoadingDialog(LoadingDialogUI):
# 定义一个信号,用于向主窗口传递托盘号 # 定义一个信号,用于向主窗口传递托盘号
tray_code_signal = Signal(str, str, str, str) tray_code_signal = Signal(str, str, str, str)
@ -13,9 +14,6 @@ class LoadingDialog(LoadingDialogUI):
super().__init__() super().__init__()
self.parent = parent self.parent = parent
# 初始化API
self.tary_api = TaryApi()
# 彻底禁用对话框的回车键关闭功能 # 彻底禁用对话框的回车键关闭功能
self.setModal(True) self.setModal(True)
# 禁用所有按钮的默认行为 # 禁用所有按钮的默认行为
@ -34,7 +32,8 @@ class LoadingDialog(LoadingDialogUI):
"""设置事件连接""" """设置事件连接"""
# 托盘号输入框回车事件触发查询 # 托盘号输入框回车事件触发查询
self.tray_input.returnPressed.connect(self.handle_tray_return_pressed) self.tray_input.returnPressed.connect(self.handle_tray_return_pressed)
self.tray_input.editingFinished.connect(self.on_tray_query) # 移除editingFinished事件避免重复触发查询
# self.tray_input.editingFinished.connect(self.on_tray_query)
# 确认按钮点击事件 # 确认按钮点击事件
self.confirm_button.clicked.connect(self.accept) self.confirm_button.clicked.connect(self.accept)
@ -59,9 +58,36 @@ class LoadingDialog(LoadingDialogUI):
return return
logging.info(f"查询托盘号: {tray_code}") logging.info(f"查询托盘号: {tray_code}")
if AppMode.is_api():
self.tary_api = TaryApi()
# 调用API获取托盘信息 # 调用API获取托盘信息
response = self.tary_api.get_tary_info(tray_code) response = self.tary_api.get_tary_info(tray_code)
else:
pallet_type_manager = PalletTypeManager.get_instance()
pallet_info = pallet_type_manager.get_pallet_info_by_pallet_id(tray_code)
# 检查返回的数据类型并进行适当处理
if pallet_info is None:
response = {
"success": False,
"message": "未找到托盘信息"
}
else:
# 如果返回的是元组(数据库查询结果),将其转换为字典
# 根据dao/pallet_type_dao.py中get_pallet_info_by_pallet_id方法的SQL查询
# 返回的字段顺序为pallet_code, pallet_name, description, axios_name, axios_type, tier, size, amount, weight
response = {
"success": True,
"data": {
"tp_note": pallet_info[0] if len(pallet_info) > 0 else "",
"product_name": pallet_info[1] if len(pallet_info) > 1 else "",
"axis_type": pallet_info[4] if len(pallet_info) > 4 else "",
"tier": str(pallet_info[5]) if len(pallet_info) > 5 else "",
"weight": str(pallet_info[8]) if len(pallet_info) > 8 else "",
"quantity": ""
}
}
logging.info(f"托盘信息响应: {response}") logging.info(f"托盘信息响应: {response}")
logging.info(f"response.success={response.get('success')}, response.data存在={response.get('data') is not None}") logging.info(f"response.success={response.get('success')}, response.data存在={response.get('data') is not None}")
@ -72,20 +98,17 @@ class LoadingDialog(LoadingDialogUI):
# 显示托盘相关信息 - 只更新轴型、托盘料和重量,不更新订单号和产品 # 显示托盘相关信息 - 只更新轴型、托盘料和重量,不更新订单号和产品
axis_type = str(tray_data.get("axis_type", "--")) axis_type = str(tray_data.get("axis_type", "--"))
material = str(tray_data.get("material", "--")) tier = str(tray_data.get("tier", "--"))
weight = str(tray_data.get("weight", "--")) weight = str(tray_data.get("weight", "--"))
logging.info(f"显示托盘信息: 轴型={axis_type}, 托盘料={material}, 重量={weight}") logging.info(f"显示托盘信息: 轴型={axis_type}, 托盘料={tier}, 重量={weight}")
# 只设置轴型、托盘料和重量字段,不设置产品名称 # 只设置轴型、托盘料和重量字段,不设置产品名称
self.axis_value.setText(axis_type) self.axis_value.setText(axis_type)
self.pallet_material_value.setText(material) self.pallet_tier_value.setText(tier)
self.quantity_value.setText("") # 数量为空 self.quantity_value.setText("") # 数量为空
self.weight_value.setText(f"{weight} kg") self.weight_value.setText(f"{weight} kg")
# 不再根据托盘号设置订单号
# self.order_input.setText(tray_code)
# 发送托盘号到主窗口 # 发送托盘号到主窗口
from widgets.main_window import MainWindow from widgets.main_window import MainWindow
main_window = self.parent main_window = self.parent
@ -106,8 +129,6 @@ class LoadingDialog(LoadingDialogUI):
main_window.tray_edit.setCurrentText(tray_code) main_window.tray_edit.setCurrentText(tray_code)
logging.info(f"设置主窗口当前托盘号: {tray_code}") logging.info(f"设置主窗口当前托盘号: {tray_code}")
# 成功获取信息后,将焦点设置到订单号输入框上
self.order_input.setFocus()
else: else:
# 获取托盘信息失败 # 获取托盘信息失败
error_msg = response.get("message", "获取托盘信息失败") error_msg = response.get("message", "获取托盘信息失败")
@ -124,8 +145,9 @@ class LoadingDialog(LoadingDialogUI):
logging.info(f"捕获到回车键事件,当前焦点部件: {self.focusWidget()}") logging.info(f"捕获到回车键事件,当前焦点部件: {self.focusWidget()}")
# 如果焦点在托盘输入框上,触发查询 # 如果焦点在托盘输入框上,触发查询
# 注释掉此处的on_tray_query调用因为已经通过returnPressed信号处理了
if self.focusWidget() == self.tray_input: if self.focusWidget() == self.tray_input:
self.on_tray_query() # self.on_tray_query() - 通过returnPressed信号已经处理这里不需要再调用
event.accept() # 消费掉这个事件 event.accept() # 消费掉这个事件
return return

View File

@ -124,8 +124,8 @@ class MainWindow(MainWindowUI):
# 设置中央部件为堆叠部件 # 设置中央部件为堆叠部件
self.setCentralWidget(self.stacked_widget) self.setCentralWidget(self.stacked_widget)
# 添加托盘类型选择下拉框 # # 添加托盘类型选择下拉框
self.add_pallet_type_selectors() # self.add_pallet_type_selectors()
# 连接信号和槽 # 连接信号和槽
self.connect_signals() self.connect_signals()
@ -170,49 +170,52 @@ class MainWindow(MainWindowUI):
# 注册串口数据回调函数 # 注册串口数据回调函数
self.register_serial_callbacks() self.register_serial_callbacks()
def add_pallet_type_selectors(self): # 加载托盘号列表
"""添加托盘类型选择下拉框""" self.load_pallet_codes()
# 创建上料托盘类型选择下拉框
self.input_pallet_type_label = QLabel("上料托盘类型:")
self.input_pallet_type_label.setFont(self.normal_font)
self.input_pallet_type_label.setVisible(False)
self.material_form_layout.addRow(self.input_pallet_type_label)
self.input_pallet_type_combo = QComboBox() # def add_pallet_type_selectors(self):
self.input_pallet_type_combo.setFont(self.normal_font) # """添加托盘类型选择下拉框"""
self.input_pallet_type_combo.setVisible(False) # # 创建上料托盘类型选择下拉框
self.material_form_layout.addRow("", self.input_pallet_type_combo) # self.input_pallet_type_label = QLabel("上料托盘类型:")
# self.input_pallet_type_label.setFont(self.normal_font)
# self.input_pallet_type_label.setVisible(False)
# self.material_form_layout.addRow(self.input_pallet_type_label)
# 创建下料托盘类型选择下拉框 # self.input_pallet_type_combo = QComboBox()
self.output_pallet_type_label = QLabel("下料托盘类型:") # self.input_pallet_type_combo.setFont(self.normal_font)
self.output_pallet_type_label.setFont(self.normal_font) # self.input_pallet_type_combo.setVisible(False)
self.output_pallet_type_label.setVisible(False) # self.material_form_layout.addRow("", self.input_pallet_type_combo)
self.output_form_layout.addRow(self.output_pallet_type_label)
self.output_pallet_type_combo = QComboBox() # # 创建下料托盘类型选择下拉框
self.output_pallet_type_combo.setFont(self.normal_font) # self.output_pallet_type_label = QLabel("下料托盘类型:")
self.output_pallet_type_combo.setVisible(False) # self.output_pallet_type_label.setFont(self.normal_font)
self.output_form_layout.addRow("", self.output_pallet_type_combo) # self.output_pallet_type_label.setVisible(False)
# self.output_form_layout.addRow(self.output_pallet_type_label)
# 加载托盘类型数据 # self.output_pallet_type_combo = QComboBox()
self.update_pallet_types() # self.output_pallet_type_combo.setFont(self.normal_font)
# self.output_pallet_type_combo.setVisible(False)
# self.output_form_layout.addRow("", self.output_pallet_type_combo)
def update_pallet_types(self): # # 加载托盘类型数据
"""更新托盘类型下拉框""" # self.update_pallet_types()
# 重新加载托盘类型数据
self.pallet_type_manager.reload_pallet_types()
# 更新上料托盘类型 # def update_pallet_types(self):
input_types = self.pallet_type_manager.get_pallet_types_by_operation("input") # """更新托盘类型下拉框"""
self.input_pallet_type_combo.clear() # # 重新加载托盘类型数据
for pallet_type in input_types: # self.pallet_type_manager.reload_pallet_types()
self.input_pallet_type_combo.addItem(pallet_type['type_name'], pallet_type['id'])
# 更新下料托盘类型 # # 更新上料托盘类型
output_types = self.pallet_type_manager.get_pallet_types_by_operation("output") # input_types = self.pallet_type_manager.get_pallet_types_by_operation("input")
self.output_pallet_type_combo.clear() # self.input_pallet_type_combo.clear()
for pallet_type in output_types: # for pallet_type in input_types:
self.output_pallet_type_combo.addItem(pallet_type['type_name'], pallet_type['id']) # self.input_pallet_type_combo.addItem(pallet_type['type_name'], pallet_type['id'])
# # 更新下料托盘类型
# output_types = self.pallet_type_manager.get_pallet_types_by_operation("output")
# self.output_pallet_type_combo.clear()
# for pallet_type in output_types:
# self.output_pallet_type_combo.addItem(pallet_type['type_name'], pallet_type['id'])
def load_config(self): def load_config(self):
"""加载配置文件""" """加载配置文件"""
@ -299,8 +302,54 @@ class MainWindow(MainWindowUI):
if not self.camera_display.camera_manager.isGrabbing: if not self.camera_display.camera_manager.isGrabbing:
self.camera_display.start_display() self.camera_display.start_display()
# 加载托盘号列表
self.load_pallet_codes()
logging.info("显示主页面") logging.info("显示主页面")
def load_pallet_codes(self):
"""从托盘类型管理器加载托盘号并更新到tray_edit"""
try:
# 获取当前文本,以便保留用户选择
current_text = self.tray_edit.currentText()
# 清空当前项目
self.tray_edit.clear()
# 获取托盘号
pallet_codes = self.pallet_type_manager.get_pallet_code()
if pallet_codes and len(pallet_codes) > 0:
# 添加托盘号到下拉框
for code in pallet_codes:
self.tray_edit.addItem(code)
# 如果有之前的选择,尝试恢复它
if current_text:
index = self.tray_edit.findText(current_text)
if index >= 0:
self.tray_edit.setCurrentIndex(index)
logging.info(f"已加载托盘号,共 {len(pallet_codes)}")
else:
# 如果没有托盘号,添加默认项
default_codes = ["托盘1", "托盘2", "托盘3", "托盘4", "托盘5", "托盘6"]
for code in default_codes:
self.tray_edit.addItem(code)
logging.warning("未找到托盘号,使用默认值")
# 尝试恢复之前的选择
if current_text:
index = self.tray_edit.findText(current_text)
if index >= 0:
self.tray_edit.setCurrentIndex(index)
except Exception as e:
logging.error(f"加载托盘号失败: {str(e)}")
# 如果加载失败,添加默认项
self.tray_edit.clear()
default_codes = ["托盘1", "托盘2", "托盘3", "托盘4", "托盘5", "托盘6"]
for code in default_codes:
self.tray_edit.addItem(code)
def show_settings_page(self): def show_settings_page(self):
"""显示设置页面""" """显示设置页面"""
# 创建设置窗口 # 创建设置窗口
@ -325,15 +374,15 @@ class MainWindow(MainWindowUI):
# 更新串口管理器配置 # 更新串口管理器配置
self.serial_manager.reload_config() self.serial_manager.reload_config()
# 重新加载托盘号
self.load_pallet_codes()
logging.info("设置已更新,重新加载配置") logging.info("设置已更新,重新加载配置")
def handle_input(self): def handle_input(self):
"""处理上料按钮点击事件""" """处理上料按钮点击事件"""
# 获取托盘号 # 获取托盘号
tray_id = self.tray_edit.currentText() tray_id = self.tray_edit.currentText()
if not tray_id:
QMessageBox.warning(self, "提示", "请先选择或输入托盘号")
return
# 启动监听(不论后续是否确认上料) # 启动监听(不论后续是否确认上料)
# 启动Modbus监控 # 启动Modbus监控
@ -358,7 +407,7 @@ class MainWindow(MainWindowUI):
# 如果用户确认,则执行上料操作 # 如果用户确认,则执行上料操作
if result == QDialog.Accepted: if result == QDialog.Accepted:
# 获取托盘料值作为拆垛层数 # 获取托盘料值作为拆垛层数
stow_num = dialog.pallet_material_value.text() stow_num = dialog.pallet_tier_value.text()
if stow_num == "--" or not stow_num: if stow_num == "--" or not stow_num:
QMessageBox.warning(self, "错误", "未获取到托盘料信息,请重试") QMessageBox.warning(self, "错误", "未获取到托盘料信息,请重试")
return return
@ -370,7 +419,7 @@ class MainWindow(MainWindowUI):
self.init_seq[tray_id] = 1 self.init_seq[tray_id] = 1
if not pallet_type: if not pallet_type:
QMessageBox.warning(self, "错误", "未查到对应下料托盘类型") QMessageBox.warning(self, "错误", "未查到对应托盘类型")
return return
# 执行Modbus操作 # 执行Modbus操作
@ -398,9 +447,6 @@ class MainWindow(MainWindowUI):
"""处理下料按钮点击事件""" """处理下料按钮点击事件"""
# 获取托盘号 # 获取托盘号
tray_id = self.tray_edit.currentText() tray_id = self.tray_edit.currentText()
if not tray_id:
QMessageBox.warning(self, "提示", "请先选择或输入托盘号")
return
# 启动监听(不论后续是否确认下料) # 启动监听(不论后续是否确认下料)
# 启动Modbus监控 # 启动Modbus监控
@ -425,7 +471,7 @@ class MainWindow(MainWindowUI):
# 如果用户确认,则执行下料操作 # 如果用户确认,则执行下料操作
if result == QDialog.Accepted: if result == QDialog.Accepted:
# 获取托盘料值作为下料层数 # 获取托盘料值作为下料层数
stow_num = dialog.pallet_material_value.text() stow_num = dialog.pallet_tier_value.text()
if stow_num == "--" or not stow_num: if stow_num == "--" or not stow_num:
QMessageBox.warning(self, "错误", "未获取到托盘料信息,请重试") QMessageBox.warning(self, "错误", "未获取到托盘料信息,请重试")
return return

View File

@ -3,6 +3,8 @@ from apis.tary_api import TaryApi
from PySide6.QtCore import Qt, Signal from PySide6.QtCore import Qt, Signal
from PySide6.QtWidgets import QMessageBox, QDialog from PySide6.QtWidgets import QMessageBox, QDialog
import logging import logging
from utils.app_mode import AppMode
from utils.pallet_type_manager import PalletTypeManager
class UnloadingDialog(UnloadingDialogUI): class UnloadingDialog(UnloadingDialogUI):
# 定义一个信号,用于向主窗口传递托盘号 # 定义一个信号,用于向主窗口传递托盘号
@ -34,7 +36,8 @@ class UnloadingDialog(UnloadingDialogUI):
"""设置事件连接""" """设置事件连接"""
# 托盘号输入框回车事件触发查询 # 托盘号输入框回车事件触发查询
self.tray_input.returnPressed.connect(self.handle_tray_return_pressed) self.tray_input.returnPressed.connect(self.handle_tray_return_pressed)
self.tray_input.editingFinished.connect(self.on_tray_query) # 移除editingFinished事件避免重复触发查询
# self.tray_input.editingFinished.connect(self.on_tray_query)
# 确认按钮点击事件 # 确认按钮点击事件
self.confirm_button.clicked.connect(self.accept) self.confirm_button.clicked.connect(self.accept)
@ -60,8 +63,36 @@ class UnloadingDialog(UnloadingDialogUI):
logging.info(f"查询托盘号: {tray_code}") logging.info(f"查询托盘号: {tray_code}")
if AppMode.is_api():
self.tary_api = TaryApi()
# 调用API获取托盘信息 # 调用API获取托盘信息
response = self.tary_api.get_tary_info(tray_code) response = self.tary_api.get_tary_info(tray_code)
else:
pallet_type_manager = PalletTypeManager.get_instance()
pallet_info = pallet_type_manager.get_pallet_info_by_pallet_id(tray_code)
# 检查返回的数据类型并进行适当处理
if pallet_info is None:
response = {
"success": False,
"message": "未找到托盘信息"
}
else:
# 如果返回的是元组(数据库查询结果),将其转换为字典
# 根据dao/pallet_type_dao.py中get_pallet_info_by_pallet_id方法的SQL查询
# 返回的字段顺序为pallet_code, pallet_name, description, axios_name, axios_type, tier, size, amount, weight
response = {
"success": True,
"data": {
"tp_note": pallet_info[0] if len(pallet_info) > 0 else "",
"product_name": pallet_info[1] if len(pallet_info) > 1 else "",
"axis_type": pallet_info[4] if len(pallet_info) > 4 else "",
"tier": str(pallet_info[5]) if len(pallet_info) > 5 else "",
"weight": str(pallet_info[8]) if len(pallet_info) > 8 else "",
"quantity": ""
}
}
logging.info(f"托盘信息响应: {response}") logging.info(f"托盘信息响应: {response}")
logging.info(f"response.success={response.get('success')}, response.data存在={response.get('data') is not None}") logging.info(f"response.success={response.get('success')}, response.data存在={response.get('data') is not None}")
@ -72,14 +103,14 @@ class UnloadingDialog(UnloadingDialogUI):
# 显示托盘相关信息 # 显示托盘相关信息
axis_type = str(tray_data.get("axis_type", "--")) axis_type = str(tray_data.get("axis_type", "--"))
material = str(tray_data.get("material", "--")) tier = str(tray_data.get("tier", "--"))
weight = str(tray_data.get("weight", "--")) weight = str(tray_data.get("weight", "--"))
logging.info(f"显示托盘信息: 轴型={axis_type}, 托盘料={material}, 重量={weight}") logging.info(f"显示托盘信息: 轴型={axis_type}, 托盘料={tier}, 重量={weight}")
# 设置显示值 # 设置显示值
self.axis_value.setText(axis_type) self.axis_value.setText(axis_type)
self.pallet_material_value.setText(material) self.pallet_tier_value.setText(tier)
self.quantity_value.setText("") # 数量为空 self.quantity_value.setText("") # 数量为空
self.weight_value.setText(f"{weight} kg") self.weight_value.setText(f"{weight} kg")
@ -110,3 +141,26 @@ class UnloadingDialog(UnloadingDialogUI):
except Exception as e: except Exception as e:
logging.error(f"查询托盘信息异常: {str(e)}") logging.error(f"查询托盘信息异常: {str(e)}")
QMessageBox.critical(self, "查询异常", f"查询托盘信息时发生异常: {str(e)}") QMessageBox.critical(self, "查询异常", f"查询托盘信息时发生异常: {str(e)}")
def keyPressEvent(self, event):
"""重写键盘事件处理,防止回车关闭对话框"""
# 如果按下回车键
if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
logging.info(f"捕获到回车键事件,当前焦点部件: {self.focusWidget()}")
# 如果焦点在托盘输入框上,触发查询
if self.focusWidget() == self.tray_input:
# 不需要重复调用on_tray_query因为returnPressed信号已经处理了
event.accept() # 消费掉这个事件
return
# 如果焦点在确认按钮上,则允许默认行为(确认)
if self.focusWidget() == self.confirm_button:
return super().keyPressEvent(event)
# 其他情况下,阻止回车事件传播
event.accept() # 消费掉这个事件
return
# 其他键位事件交给父类处理
super().keyPressEvent(event)