diff --git a/apis/gc_api.py b/apis/gc_api.py index b1529cb..d97fa1a 100644 --- a/apis/gc_api.py +++ b/apis/gc_api.py @@ -2,10 +2,50 @@ from utils.api_utils import ApiUtils import logging import json class GcApi: + """工程API接口类""" + def __init__(self): - """初始化托盘API工具类""" + """初始化API接口""" 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): """ 获取GC信息 diff --git a/config/app_config.json b/config/app_config.json index d8c69c4..c03db90 100644 --- a/config/app_config.json +++ b/config/app_config.json @@ -15,7 +15,8 @@ "get_gc_info": "/jsjt/xcsc/tprk/getBZGCInfoToWsbz.do", "get_order_info": "/jsjt/xcsc/tprk/getXsddBzrkGridListToWsbz.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": { "default": "sqlite", diff --git a/db/jtDB.db b/db/jtDB.db index c36012f..ea9f920 100644 Binary files a/db/jtDB.db and b/db/jtDB.db differ diff --git a/from pymodbus.py b/from pymodbus.py index 9d11579..c5b7631 100644 --- a/from pymodbus.py +++ b/from pymodbus.py @@ -2,7 +2,7 @@ from pymodbus.client import ModbusTcpClient import time client = ModbusTcpClient('localhost', port=5020) client.connect() -# client.write_registers(address=11, values=[2247]) +client.write_registers(address=11, values=[212]) # client.write_registers(address=3, values=[0]) time.sleep(2) 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=5, values=[16]) # 贴标完成 -# client.write_registers(address=24, values=[1])s -# client.write_registers(address=13, values=[1]) +# client.write_registers(address=24, values=[1]) +client.write_registers(address=13, values=[1]) result = client.read_holding_registers(address=0, count=1) diff --git a/ui/main_window_ui.py b/ui/main_window_ui.py index 9a24254..dadea39 100644 --- a/ui/main_window_ui.py +++ b/ui/main_window_ui.py @@ -472,9 +472,9 @@ class MainWindowUI(QMainWindow): """创建微丝产线表格,包含上料、检验、包装部分""" # 创建微丝产线框架 self.process_frame = QFrame() - self.process_frame.setFrameShape(QFrame.Box) - self.process_frame.setLineWidth(1) - self.process_frame.setStyleSheet("QFrame { border: 1px solid #dddddd; }") + self.process_frame.setFrameShape(QFrame.NoFrame) # 移除边框 + self.process_frame.setLineWidth(0) + self.process_frame.setStyleSheet("QFrame { background-color: #f5f5f5; }") # 与其他标题背景色一致 self.process_layout = QVBoxLayout(self.process_frame) self.process_layout.setContentsMargins(0, 0, 0, 0) self.process_layout.setSpacing(0) @@ -483,9 +483,8 @@ class MainWindowUI(QMainWindow): self.process_title = QLabel("微丝产线") self.process_title.setFont(self.second_title_font) self.process_title.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) - # 调整行高 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) @@ -529,9 +528,9 @@ class MainWindowUI(QMainWindow): """创建包装记录表格""" # 创建包装记录框架 self.record_frame = QFrame() - self.record_frame.setFrameShape(QFrame.Box) - self.record_frame.setLineWidth(1) - self.record_frame.setStyleSheet("QFrame { border: 1px solid #dddddd; }") # 移除 border-top: none; + self.record_frame.setFrameShape(QFrame.NoFrame) # 移除边框 + self.record_frame.setLineWidth(0) + self.record_frame.setStyleSheet("QFrame { background-color: #f5f5f5; }") # 与其他标题背景色一致 self.record_layout = QVBoxLayout(self.record_frame) self.record_layout.setContentsMargins(0, 0, 0, 0) self.record_layout.setSpacing(0) @@ -540,10 +539,44 @@ class MainWindowUI(QMainWindow): self.record_title = QLabel("包装记录") self.record_title.setFont(self.second_title_font) self.record_title.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) - # 调整行高 self.record_title.setFixedHeight(40) - self.record_title.setStyleSheet("background-color: #f8f8f8; padding: 5px; border-bottom: 1px solid #dddddd;") - self.record_layout.addWidget(self.record_title) + self.record_title.setStyleSheet("background-color: #f5f5f5; padding: 5px;") # 移除底部边框 + + # 创建标题容器,用于水平布局标题和按钮 + 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列:序号、订单、工程号、品名、规格、托号、轴包装号、重量、净重、完成时间 diff --git a/widgets/main_window.py b/widgets/main_window.py index dd5ebae..98061a6 100644 --- a/widgets/main_window.py +++ b/widgets/main_window.py @@ -270,6 +270,9 @@ class MainWindow(MainWindowUI): self.stop_button.clicked.connect(self.handle_stop) 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.customContextMenuRequested.connect(self.show_table_context_menu) @@ -3541,4 +3544,53 @@ class MainWindow(MainWindowUI): self.camera_display.start_display() logging.warning("====> 已切换到实时相机模式") except Exception as e: - logging.error(f"处理本地图像模式变更时发生错误: {e}") \ No newline at end of file + 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)}") \ No newline at end of file