add: 新增一键满托功能

This commit is contained in:
zhu-mengmeng 2025-07-14 15:44:16 +08:00
parent b6c65ca493
commit 4495b1683d
6 changed files with 143 additions and 17 deletions

View File

@ -2,10 +2,50 @@ from utils.api_utils import ApiUtils
import logging import logging
import json import json
class GcApi: class GcApi:
"""工程API接口类"""
def __init__(self): def __init__(self):
"""初始化托盘API工具类""" """初始化API接口"""
self.api_utils = ApiUtils() self.api_utils = ApiUtils()
def ismt_option(self, params):
"""
标记是否满托
Args:
ismt: 是否满托
corp_id: 公司ID
tray_id: 托盘ID
ip: 机器IP
Returns:
dict: 返回结果
"""
try:
# API 配置中的键名
api_key = "ismt_option"
# 构建 form-data 格式的数据
data = {
"ismt": params.get("ismt", False),
"xpack":params.get("tray_id", ""),
"nw_ip":params.get("ip", ""),
"data_corp":params.get("corp_id", ""),
}
# 将工程号作为参数传递,使用 data 参数传递 form-data 格式数据
response = self.api_utils.post(api_key, data=data)
# 请求失败时返回空数据
if not response.get("status", False):
return {
"success": False,
"message": "标记是否满托失败",
"data": None
}
return response
except Exception as e:
logging.error(f"标记是否满托失败: {str(e)}")
return None
def get_gc_info(self, gc_code): def get_gc_info(self, gc_code):
""" """
获取GC信息 获取GC信息

View File

@ -15,7 +15,8 @@
"get_gc_info": "/jsjt/xcsc/tprk/getBZGCInfoToWsbz.do", "get_gc_info": "/jsjt/xcsc/tprk/getBZGCInfoToWsbz.do",
"get_order_info": "/jsjt/xcsc/tprk/getXsddBzrkGridListToWsbz.do", "get_order_info": "/jsjt/xcsc/tprk/getXsddBzrkGridListToWsbz.do",
"add_order_info": "/jsjt/xcsc/tprk/bzrkAdd01.do", "add_order_info": "/jsjt/xcsc/tprk/bzrkAdd01.do",
"get_xpack": "/jsjt/xcsc/tprk/getXpackToWsbz.do" "get_xpack": "/jsjt/xcsc/tprk/getXpackToWsbz.do",
"ismt_option": "/jsjt/xcsc/tprk/ismtOptioTonWsbz.do"
}, },
"database": { "database": {
"default": "sqlite", "default": "sqlite",

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=[2247]) client.write_registers(address=11, values=[212])
# 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])
@ -11,8 +11,8 @@ client.write_registers(address=4, values=[0])
# client.write_registers(address=30, values=[25]) # client.write_registers(address=30, values=[25])
# client.write_registers(address=5, values=[16]) # client.write_registers(address=5, values=[16])
# 贴标完成 # 贴标完成
# client.write_registers(address=24, values=[1])s # client.write_registers(address=24, values=[1])
# client.write_registers(address=13, values=[1]) client.write_registers(address=13, values=[1])
result = client.read_holding_registers(address=0, count=1) result = client.read_holding_registers(address=0, count=1)

View File

@ -472,9 +472,9 @@ class MainWindowUI(QMainWindow):
"""创建微丝产线表格,包含上料、检验、包装部分""" """创建微丝产线表格,包含上料、检验、包装部分"""
# 创建微丝产线框架 # 创建微丝产线框架
self.process_frame = QFrame() self.process_frame = QFrame()
self.process_frame.setFrameShape(QFrame.Box) self.process_frame.setFrameShape(QFrame.NoFrame) # 移除边框
self.process_frame.setLineWidth(1) self.process_frame.setLineWidth(0)
self.process_frame.setStyleSheet("QFrame { border: 1px solid #dddddd; }") self.process_frame.setStyleSheet("QFrame { background-color: #f5f5f5; }") # 与其他标题背景色一致
self.process_layout = QVBoxLayout(self.process_frame) self.process_layout = QVBoxLayout(self.process_frame)
self.process_layout.setContentsMargins(0, 0, 0, 0) self.process_layout.setContentsMargins(0, 0, 0, 0)
self.process_layout.setSpacing(0) self.process_layout.setSpacing(0)
@ -483,9 +483,8 @@ class MainWindowUI(QMainWindow):
self.process_title = QLabel("微丝产线") self.process_title = QLabel("微丝产线")
self.process_title.setFont(self.second_title_font) self.process_title.setFont(self.second_title_font)
self.process_title.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.process_title.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
# 调整行高
self.process_title.setFixedHeight(40) self.process_title.setFixedHeight(40)
self.process_title.setStyleSheet("background-color: #f8f8f8; padding: 5px; border-bottom: 1px solid #dddddd;") self.process_title.setStyleSheet("background-color: #f5f5f5; padding: 5px;") # 移除底部边框
self.process_layout.addWidget(self.process_title) self.process_layout.addWidget(self.process_title)
@ -529,9 +528,9 @@ class MainWindowUI(QMainWindow):
"""创建包装记录表格""" """创建包装记录表格"""
# 创建包装记录框架 # 创建包装记录框架
self.record_frame = QFrame() self.record_frame = QFrame()
self.record_frame.setFrameShape(QFrame.Box) self.record_frame.setFrameShape(QFrame.NoFrame) # 移除边框
self.record_frame.setLineWidth(1) self.record_frame.setLineWidth(0)
self.record_frame.setStyleSheet("QFrame { border: 1px solid #dddddd; }") # 移除 border-top: none; self.record_frame.setStyleSheet("QFrame { background-color: #f5f5f5; }") # 与其他标题背景色一致
self.record_layout = QVBoxLayout(self.record_frame) self.record_layout = QVBoxLayout(self.record_frame)
self.record_layout.setContentsMargins(0, 0, 0, 0) self.record_layout.setContentsMargins(0, 0, 0, 0)
self.record_layout.setSpacing(0) self.record_layout.setSpacing(0)
@ -540,10 +539,44 @@ class MainWindowUI(QMainWindow):
self.record_title = QLabel("包装记录") self.record_title = QLabel("包装记录")
self.record_title.setFont(self.second_title_font) self.record_title.setFont(self.second_title_font)
self.record_title.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.record_title.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
# 调整行高
self.record_title.setFixedHeight(40) self.record_title.setFixedHeight(40)
self.record_title.setStyleSheet("background-color: #f8f8f8; padding: 5px; border-bottom: 1px solid #dddddd;") self.record_title.setStyleSheet("background-color: #f5f5f5; padding: 5px;") # 移除底部边框
self.record_layout.addWidget(self.record_title)
# 创建标题容器,用于水平布局标题和按钮
self.record_title_container = QWidget()
self.record_title_layout = QHBoxLayout(self.record_title_container)
self.record_title_layout.setContentsMargins(5, 0, 5, 0)
self.record_title_layout.setSpacing(10)
# 添加标题到布局
self.record_title_layout.addWidget(self.record_title)
# 创建托盘完成按钮
self.tray_complete_button = QPushButton("托盘完成")
self.tray_complete_button.setFont(self.normal_font)
self.tray_complete_button.setFixedSize(100, 30)
self.tray_complete_button.setStyleSheet("""
QPushButton {
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
padding: 5px 10px;
}
QPushButton:hover {
background-color: #45a049;
}
QPushButton:pressed {
background-color: #3d8b40;
}
""")
# 添加按钮到布局,并设置右对齐
self.record_title_layout.addStretch() # 添加弹性空间,将按钮推到右侧
self.record_title_layout.addWidget(self.tray_complete_button)
# 将标题容器添加到记录布局
self.record_layout.addWidget(self.record_title_container)
# 创建表格 # 创建表格
self.record_table = QTableWidget(13, 10) # 13行10列序号、订单、工程号、品名、规格、托号、轴包装号、重量、净重、完成时间 self.record_table = QTableWidget(13, 10) # 13行10列序号、订单、工程号、品名、规格、托号、轴包装号、重量、净重、完成时间

View File

@ -270,6 +270,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.tray_complete_button.clicked.connect(self.handle_tray_complete)
# 设置表格上下文菜单 # 设置表格上下文菜单
self.process_table.setContextMenuPolicy(Qt.CustomContextMenu) self.process_table.setContextMenuPolicy(Qt.CustomContextMenu)
self.process_table.customContextMenuRequested.connect(self.show_table_context_menu) self.process_table.customContextMenuRequested.connect(self.show_table_context_menu)
@ -3542,3 +3545,52 @@ class MainWindow(MainWindowUI):
logging.warning("====> 已切换到实时相机模式") logging.warning("====> 已切换到实时相机模式")
except Exception as e: except Exception as e:
logging.error(f"处理本地图像模式变更时发生错误: {e}") logging.error(f"处理本地图像模式变更时发生错误: {e}")
def handle_tray_complete(self):
"""处理托盘完成按钮点击事件"""
try:
# 获取托盘号
tray_id = self.tray_edit.currentText()
if not tray_id:
QMessageBox.warning(self, "提示", "请先选择托盘号")
return
# 确认对话框
reply = QMessageBox.question(
self,
"确认完成",
f"确认将托盘 {tray_id} 标记为已满托?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No
)
if reply != QMessageBox.Yes:
return
# 调用接口
from apis.gc_api import GcApi
gc_api = GcApi()
# 准备参数
params = {
'ismt': True,
'corp_id': self.corp_id,
'tray_id': tray_id,
'ip': '192.168.1.246'
}
# 调用接口
response = gc_api.ismt_option(params)
# 处理响应
if response.get('status', False):
QMessageBox.information(self, "成功", "托盘已标记为完成")
logging.info(f"托盘 {tray_id} 已标记为完成")
else:
error_msg = response.get('message', '未知错误')
QMessageBox.warning(self, "失败", f"标记托盘完成失败: {error_msg}")
logging.error(f"标记托盘 {tray_id} 完成失败: {error_msg}")
except Exception as e:
logging.error(f"处理托盘完成失败: {str(e)}")
QMessageBox.critical(self, "错误", f"处理托盘完成失败: {str(e)}")