diff --git a/config/app_config.json b/config/app_config.json index 9c7ef30..e630079 100644 --- a/config/app_config.json +++ b/config/app_config.json @@ -15,7 +15,7 @@ "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" }, "database": { "default": "sqlite", diff --git a/dao/pallet_type_dao.py b/dao/pallet_type_dao.py index bc29b07..2d9fe18 100644 --- a/dao/pallet_type_dao.py +++ b/dao/pallet_type_dao.py @@ -80,255 +80,8 @@ class PalletTypeDAO: except Exception as e: logging.error(f"获取托盘类型失败: {str(e)}") return None - def get_pallet_types_by_operation(self, operation_type, include_disabled=False): - """根据操作类型获取托盘类型 - - Args: - operation_type: 操作类型 (input/output) - include_disabled: 是否包含禁用的类型 - - Returns: - list: 托盘类型列表 - """ - try: - if include_disabled: - sql = """ - SELECT id, type_name, operation_type, description, enabled, sort_order - FROM wsbz_pallet_types - WHERE operation_type = ? AND is_deleted = FALSE - ORDER BY sort_order - """ - params = (operation_type,) - else: - sql = """ - SELECT id, type_name, operation_type, description, enabled, sort_order - FROM wsbz_pallet_types - WHERE operation_type = ? AND is_deleted = FALSE AND enabled = TRUE - ORDER BY sort_order - """ - params = (operation_type,) - - self.db.cursor.execute(sql, params) - results = self.db.cursor.fetchall() - - 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: - logging.error(f"获取托盘类型失败: {str(e)}") - return [] - - def get_pallet_type_by_id(self, pallet_type_id): - """根据ID获取托盘类型 - - Args: - pallet_type_id: 托盘类型ID - - Returns: - dict: 托盘类型信息,未找到则返回None - """ - try: - sql = """ - SELECT id, type_name, operation_type, description, enabled, sort_order - FROM wsbz_pallet_types - WHERE id = ? AND is_deleted = FALSE - """ - params = (pallet_type_id,) - - self.db.cursor.execute(sql, params) - row = self.db.cursor.fetchone() - - if row: - pallet_type = { - 'id': row[0], - 'type_name': row[1], - 'operation_type': row[2], - 'description': row[3], - 'enabled': bool(row[4]), - 'sort_order': row[5] - } - return pallet_type - else: - return None - except Exception as e: - logging.error(f"获取托盘类型失败: {str(e)}") - return None - def get_pallet_type_by_type(self,pallet_type): - """根据托盘类型获取托盘信息 - Args: - pallet_type: 托盘类型 - Returns: - dict: 托盘类型信息,未找到则返回None - """ - try: - sql = """ - SELECT id, type_name, operation_type, description, enabled, sort_order - FROM wsbz_pallet_types - WHERE type_name = ? AND is_deleted = FALSE - """ - params = (pallet_type, ) - self.db.cursor.execute(sql, params) - results = self.db.cursor.fetchall() - pallet_type_dict = {row[1]:row[5] for row in results} - return pallet_type_dict - except Exception as e: - logging.error(f"获取托盘类型失败: {str(e)}") - return {} - def create_pallet_type(self, data, username='system'): - """创建托盘类型 - - Args: - data: 托盘类型数据 - username: 操作用户 - - Returns: - int: 新创建的托盘类型ID,失败返回None - """ - try: - current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - - sql = """ - INSERT INTO wsbz_pallet_types ( - type_name, operation_type, description, enabled, sort_order, - create_time, create_by, update_time, update_by, is_deleted - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - """ - - params = ( - data.get('type_name'), - data.get('operation_type'), - data.get('description', ''), - data.get('enabled', True), - data.get('sort_order', 999), - current_time, - username, - current_time, - username, - False - ) - - self.db.execute_update(sql, params) - - # 获取新插入的ID - self.db.cursor.execute("SELECT last_insert_rowid()") - new_id = self.db.cursor.fetchone()[0] - - return new_id - except Exception as e: - logging.error(f"创建托盘类型失败: {str(e)}") - return None - - def update_pallet_type(self, pallet_type_id, data, username='system'): - """更新托盘类型 - - Args: - pallet_type_id: 托盘类型ID - data: 更新数据 - username: 操作用户 - - Returns: - bool: 更新是否成功 - """ - try: - current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - - # 构建更新SQL - update_fields = [] - params = [] - - # 可更新的字段 - allowed_fields = [ - 'type_name', 'operation_type', 'description', 'enabled', 'sort_order' - ] - - for field in allowed_fields: - if field in data: - update_fields.append(f"{field} = ?") - params.append(data[field]) - - # 添加更新时间和更新人 - update_fields.append("update_time = ?") - params.append(current_time) - update_fields.append("update_by = ?") - params.append(username) - - # 添加ID到参数列表 - params.append(pallet_type_id) - - # 构建SQL - sql = f""" - UPDATE wsbz_pallet_types - SET {', '.join(update_fields)} - WHERE id = ? - """ - - self.db.execute_update(sql, params) - return True - except Exception as e: - logging.error(f"更新托盘类型失败: {str(e)}") - return False - - def delete_pallet_type(self, pallet_type_id, username='system'): - """删除托盘类型(软删除) - - Args: - pallet_type_id: 托盘类型ID - username: 操作用户 - - Returns: - bool: 删除是否成功 - """ - try: - current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - - sql = """ - UPDATE wsbz_pallet_types - SET is_deleted = TRUE, update_time = ?, update_by = ? - WHERE id = ? - """ - params = (current_time, username, pallet_type_id) - - self.db.execute_update(sql, params) - return True - except Exception as e: - logging.error(f"删除托盘类型失败: {str(e)}") - return False - - def toggle_pallet_type(self, pallet_type_id, enabled, username='system'): - """启用或禁用托盘类型 - - Args: - pallet_type_id: 托盘类型ID - enabled: 是否启用 - username: 操作用户 - - Returns: - bool: 操作是否成功 - """ - try: - current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - - sql = """ - UPDATE wsbz_pallet_types - SET enabled = ?, update_time = ?, update_by = ? - WHERE id = ? AND is_deleted = FALSE - """ - params = (enabled, current_time, username, pallet_type_id) - - self.db.execute_update(sql, params) - return True - except Exception as e: - logging.error(f"更新托盘类型启用状态失败: {str(e)}") - return False + + def save_pallet_info(self, pallet_code, pallet_info, user_id): """保存托盘信息 @@ -446,6 +199,131 @@ class PalletTypeDAO: logging.error(f"获取托盘类型失败: {str(e)}") return {} + def get_all_pallet_types_list(self): + """获取所有托盘类型列表 + + Returns: + list: 包含所有托盘类型信息的列表,每个元素是一个字典,包含id和name + """ + try: + sql = """ + SELECT pallet_id, pallet_name FROM wsbz_pallet_type ORDER BY pallet_id + """ + self.db.cursor.execute(sql) + results = self.db.cursor.fetchall() + + pallet_types = [] + for row in results: + pallet_type = { + 'id': row[0], + 'name': row[1] + } + pallet_types.append(pallet_type) + return pallet_types + except Exception as e: + logging.error(f"获取托盘类型列表失败: {str(e)}") + return [] + + def add_pallet_type(self, pallet_id, pallet_name): + """添加托盘类型 + + Args: + pallet_id: 托盘ID + pallet_name: 托盘名称 + + Returns: + bool: 是否添加成功 + """ + try: + sql = """ + INSERT INTO wsbz_pallet_type (pallet_id, pallet_name) + VALUES (?, ?) + """ + params = (pallet_id, pallet_name) + self.db.execute_update(sql, params) + logging.info(f"添加托盘类型成功: ID={pallet_id}, 名称={pallet_name}") + return True + except Exception as e: + logging.error(f"添加托盘类型失败: {str(e)}") + return False + + def update_pallet_type(self, pallet_id, pallet_name): + """更新托盘类型 + + Args: + pallet_id: 托盘ID + pallet_name: 托盘名称 + + Returns: + bool: 是否更新成功 + """ + try: + sql = """ + UPDATE wsbz_pallet_type + SET pallet_name = ? + WHERE pallet_id = ? + """ + params = (pallet_name, pallet_id) + self.db.execute_update(sql, params) + logging.info(f"更新托盘类型成功: ID={pallet_id}, 名称={pallet_name}") + return True + except Exception as e: + logging.error(f"更新托盘类型失败: {str(e)}") + return False + + def delete_pallet_type(self, pallet_id): + """删除托盘类型 + + Args: + pallet_id: 托盘ID + + Returns: + bool: 是否删除成功 + """ + try: + sql = """ + DELETE FROM wsbz_pallet_type + WHERE pallet_id = ? + """ + params = (pallet_id,) + self.db.execute_update(sql, params) + logging.info(f"删除托盘类型成功: ID={pallet_id}") + return True + except Exception as e: + logging.error(f"删除托盘类型失败: {str(e)}") + return False + + def get_pallet_type_by_id(self, pallet_id): + """根据ID获取托盘类型 + + Args: + pallet_id: 托盘ID + + Returns: + dict: 托盘类型信息,未找到则返回None + """ + try: + sql = """ + SELECT pallet_id, pallet_name + FROM wsbz_pallet_type + WHERE pallet_id = ? + """ + params = (pallet_id,) + self.db.cursor.execute(sql, params) + row = self.db.cursor.fetchone() + + if row: + pallet_type = { + 'id': row[0], + 'name': row[1] + } + return pallet_type + else: + return None + except Exception as e: + logging.error(f"根据ID获取托盘类型失败: {str(e)}") + return None + def save_pallet_archives(self, pallet_code, tier, user_id, user_name): """保存托盘档案 diff --git a/db/jtDB.db b/db/jtDB.db index 70019cb..06d3ca5 100644 Binary files a/db/jtDB.db and b/db/jtDB.db differ diff --git a/ui/pallet_type_settings_ui.py b/ui/pallet_type_settings_ui.py index 814c20a..b09fe46 100644 --- a/ui/pallet_type_settings_ui.py +++ b/ui/pallet_type_settings_ui.py @@ -32,62 +32,12 @@ class PalletTypeSettingsUI(QWidget): - # 创建下料类型配置页面 - self.output_widget = self.create_pallet_type_widget("output") - self.main_layout.addWidget(self.output_widget, 1) - - # 底部按钮区域 - self.button_layout = QHBoxLayout() - self.button_layout.setContentsMargins(0, 10, 0, 0) - - self.save_button = QPushButton("保存配置") - self.save_button.setFont(self.normal_font) - self.save_button.setFixedSize(120, 40) - self.save_button.setStyleSheet(""" - QPushButton { - background-color: #4caf50; - color: white; - border: none; - border-radius: 5px; - } - QPushButton:hover { - background-color: #45a049; - } - QPushButton:pressed { - background-color: #3d8b40; - } - """) - - self.reset_button = QPushButton("重置") - self.reset_button.setFont(self.normal_font) - self.reset_button.setFixedSize(120, 40) - self.reset_button.setStyleSheet(""" - QPushButton { - background-color: #f44336; - color: white; - border: none; - border-radius: 5px; - } - QPushButton:hover { - background-color: #e53935; - } - QPushButton:pressed { - background-color: #d32f2f; - } - """) - - self.button_layout.addStretch() - self.button_layout.addWidget(self.reset_button) - self.button_layout.addSpacing(20) - self.button_layout.addWidget(self.save_button) - - self.main_layout.addLayout(self.button_layout) + # 创建托盘类型配置页面 + self.pallet_type_widget = self.create_pallet_type_widget() + self.main_layout.addWidget(self.pallet_type_widget, 1) - def create_pallet_type_widget(self, operation_type): + def create_pallet_type_widget(self): """创建托盘类型配置部件 - - Args: - operation_type: 操作类型 (input/output) Returns: QWidget: 托盘类型配置部件 @@ -98,19 +48,17 @@ class PalletTypeSettingsUI(QWidget): layout.setSpacing(15) # 创建表格 - table = QTableWidget() - table.setFont(self.normal_font) - table.setColumnCount(4) - table.setHorizontalHeaderLabels(["类型名称", "描述", "排序", "启用"]) - table.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch) - table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch) - table.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents) - table.horizontalHeader().setSectionResizeMode(3, QHeaderView.ResizeToContents) - table.verticalHeader().setVisible(False) - table.setSelectionBehavior(QAbstractItemView.SelectRows) - table.setSelectionMode(QAbstractItemView.SingleSelection) - table.setAlternatingRowColors(True) - table.setStyleSheet(""" + self.pallet_table = QTableWidget() + self.pallet_table.setFont(self.normal_font) + self.pallet_table.setColumnCount(2) # 只有两列:托盘ID和托盘名称 + self.pallet_table.setHorizontalHeaderLabels(["托盘ID", "托盘名称"]) + self.pallet_table.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch) + self.pallet_table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch) + self.pallet_table.verticalHeader().setVisible(False) + self.pallet_table.setSelectionBehavior(QAbstractItemView.SelectRows) + self.pallet_table.setSelectionMode(QAbstractItemView.SingleSelection) + self.pallet_table.setAlternatingRowColors(True) + self.pallet_table.setStyleSheet(""" QTableWidget { border: 1px solid #ddd; border-radius: 5px; @@ -124,8 +72,7 @@ class PalletTypeSettingsUI(QWidget): font-weight: bold; } """) - table.setObjectName(f"{operation_type}_table") - layout.addWidget(table) + layout.addWidget(self.pallet_table) # 创建表单 form_group = QGroupBox("编辑托盘类型") @@ -134,42 +81,26 @@ class PalletTypeSettingsUI(QWidget): form_layout.setContentsMargins(15, 15, 15, 15) form_layout.setSpacing(10) - # 类型名称 - type_name_input = QLineEdit() - type_name_input.setFont(self.normal_font) - type_name_input.setObjectName(f"{operation_type}_type_name_input") - form_layout.addRow("类型名称:", type_name_input) + # 托盘ID + self.pallet_id_input = QLineEdit() + self.pallet_id_input.setFont(self.normal_font) + self.pallet_id_input.setPlaceholderText("请输入托盘ID") + form_layout.addRow("托盘ID:", self.pallet_id_input) - # 描述 - desc_input = QLineEdit() - desc_input.setFont(self.normal_font) - desc_input.setObjectName(f"{operation_type}_desc_input") - form_layout.addRow("描述:", desc_input) - - # 排序 - sort_order_spin = QSpinBox() - sort_order_spin.setFont(self.normal_font) - sort_order_spin.setRange(1, 999) - sort_order_spin.setValue(100) - sort_order_spin.setObjectName(f"{operation_type}_sort_order_spin") - form_layout.addRow("排序:", sort_order_spin) - - # 启用 - enabled_check = QCheckBox("启用") - enabled_check.setFont(self.normal_font) - enabled_check.setChecked(True) - enabled_check.setObjectName(f"{operation_type}_enabled_check") - form_layout.addRow("", enabled_check) + # 托盘名称 + self.pallet_name_input = QLineEdit() + self.pallet_name_input.setFont(self.normal_font) + self.pallet_name_input.setPlaceholderText("请输入托盘名称") + form_layout.addRow("托盘名称:", self.pallet_name_input) layout.addWidget(form_group) # 创建按钮区域 button_layout = QHBoxLayout() - add_button = QPushButton("添加") - add_button.setFont(self.normal_font) - add_button.setObjectName(f"{operation_type}_add_button") - add_button.setStyleSheet(""" + self.add_button = QPushButton("添加") + self.add_button.setFont(self.normal_font) + self.add_button.setStyleSheet(""" QPushButton { background-color: #4caf50; color: white; @@ -182,10 +113,9 @@ class PalletTypeSettingsUI(QWidget): } """) - update_button = QPushButton("更新") - update_button.setFont(self.normal_font) - update_button.setObjectName(f"{operation_type}_update_button") - update_button.setStyleSheet(""" + self.update_button = QPushButton("更新") + self.update_button.setFont(self.normal_font) + self.update_button.setStyleSheet(""" QPushButton { background-color: #2196f3; color: white; @@ -198,10 +128,9 @@ class PalletTypeSettingsUI(QWidget): } """) - delete_button = QPushButton("删除") - delete_button.setFont(self.normal_font) - delete_button.setObjectName(f"{operation_type}_delete_button") - delete_button.setStyleSheet(""" + self.delete_button = QPushButton("删除") + self.delete_button.setFont(self.normal_font) + self.delete_button.setStyleSheet(""" QPushButton { background-color: #f44336; color: white; @@ -214,10 +143,9 @@ class PalletTypeSettingsUI(QWidget): } """) - cancel_button = QPushButton("取消") - cancel_button.setFont(self.normal_font) - cancel_button.setObjectName(f"{operation_type}_cancel_button") - cancel_button.setStyleSheet(""" + self.cancel_button = QPushButton("取消") + self.cancel_button.setFont(self.normal_font) + self.cancel_button.setStyleSheet(""" QPushButton { background-color: #9e9e9e; color: white; @@ -230,10 +158,10 @@ class PalletTypeSettingsUI(QWidget): } """) - button_layout.addWidget(add_button) - button_layout.addWidget(update_button) - button_layout.addWidget(delete_button) - button_layout.addWidget(cancel_button) + button_layout.addWidget(self.add_button) + button_layout.addWidget(self.update_button) + button_layout.addWidget(self.delete_button) + button_layout.addWidget(self.cancel_button) layout.addLayout(button_layout) diff --git a/utils/pallet_type_manager.py b/utils/pallet_type_manager.py index 811775e..23c4c1b 100644 --- a/utils/pallet_type_manager.py +++ b/utils/pallet_type_manager.py @@ -248,4 +248,79 @@ class PalletTypeManager: Returns: bool: 是否保存成功 """ - return self.dao.save_pallet_archives(pallet_code, tier, user_id, user_name) \ No newline at end of file + return self.dao.save_pallet_archives(pallet_code, tier, user_id, user_name) + + def reload_pallet_types(self): + """重新加载托盘类型数据""" + try: + self.pallet_types = self.dao.get_all_pallet_types_list() + 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): + """获取所有托盘类型 + + Returns: + list: 托盘类型列表 + """ + if not self.pallet_types: + self.reload_pallet_types() + return self.pallet_types + + def add_pallet_type(self, pallet_id, pallet_name): + """添加托盘类型 + + Args: + pallet_id: 托盘ID + pallet_name: 托盘名称 + + Returns: + bool: 是否添加成功 + """ + result = self.dao.add_pallet_type(pallet_id, pallet_name) + if result: + self.reload_pallet_types() + return result + + def update_pallet_type(self, pallet_id, pallet_name): + """更新托盘类型 + + Args: + pallet_id: 托盘ID + pallet_name: 托盘名称 + + Returns: + bool: 是否更新成功 + """ + result = self.dao.update_pallet_type(pallet_id, pallet_name) + if result: + self.reload_pallet_types() + return result + + def delete_pallet_type_by_id(self, pallet_id): + """删除托盘类型 + + Args: + pallet_id: 托盘ID + + Returns: + bool: 是否删除成功 + """ + result = self.dao.delete_pallet_type(pallet_id) + if result: + self.reload_pallet_types() + return result + + def get_pallet_type_by_id_new(self, pallet_id): + """根据ID获取托盘类型(新版本) + + Args: + pallet_id: 托盘ID + + Returns: + dict: 托盘类型信息,未找到则返回None + """ + return self.dao.get_pallet_type_by_id(pallet_id) \ No newline at end of file diff --git a/widgets/main_window.py b/widgets/main_window.py index e0e2e2e..193f126 100644 --- a/widgets/main_window.py +++ b/widgets/main_window.py @@ -310,7 +310,7 @@ class MainWindow(MainWindowUI): logging.info("显示主页面") def load_pallet_codes(self): - """从托盘类型管理器加载托盘号并更新到tray_edit TODO:要实现动态数据源切换""" + """从托盘类型管理器加载托盘号并更新到tray_edit""" try: # 获取当前文本,以便保留用户选择 current_text = self.tray_edit.currentText() diff --git a/widgets/pallet_type_settings_widget.py b/widgets/pallet_type_settings_widget.py index 8c6ab11..6ed1afe 100644 --- a/widgets/pallet_type_settings_widget.py +++ b/widgets/pallet_type_settings_widget.py @@ -26,384 +26,200 @@ class PalletTypeSettingsWidget(PalletTypeSettingsUI): def connect_signals(self): """连接信号和槽""" - # 保存和重置按钮 - self.save_button.clicked.connect(self.save_all_pallet_types) - self.reset_button.clicked.connect(self.load_pallet_types) + # 保存和重置按钮 - 这些按钮已被删除,因此移除这些连接 + # self.save_button.clicked.connect(self.save_all) + # self.reset_button.clicked.connect(self.load_pallet_types) - # 下料类型表格和按钮 - output_table = self.output_widget.findChild(QTableWidget, "output_table") - output_table.itemSelectionChanged.connect(lambda: self.handle_table_selection("output")) + # 托盘类型操作按钮 + self.add_button.clicked.connect(self.add_pallet_type) + self.update_button.clicked.connect(self.update_pallet_type) + self.delete_button.clicked.connect(self.delete_pallet_type) + self.cancel_button.clicked.connect(self.cancel_edit) - output_add_button = self.output_widget.findChild(QPushButton, "output_add_button") - output_add_button.clicked.connect(lambda: self.add_pallet_type("output")) - - output_update_button = self.output_widget.findChild(QPushButton, "output_update_button") - output_update_button.clicked.connect(lambda: self.update_pallet_type("output")) - - output_delete_button = self.output_widget.findChild(QPushButton, "output_delete_button") - output_delete_button.clicked.connect(lambda: self.delete_pallet_type("output")) - - output_cancel_button = self.output_widget.findChild(QPushButton, "output_cancel_button") - output_cancel_button.clicked.connect(lambda: self.cancel_edit("output")) - + # 表格选择事件 + self.pallet_table.itemClicked.connect(self.on_table_item_clicked) + def load_pallet_types(self): """加载托盘类型数据""" try: - # 重新加载数据 - self.pallet_type_manager.reload_pallet_types() + # 获取托盘类型数据 + pallet_types = self.pallet_type_manager.get_all_pallet_types() - # 加载下料类型 - self.load_operation_pallet_types("output") + # 清空表格 + self.pallet_table.setRowCount(0) - logging.info("托盘类型数据已加载") + # 填充表格 + for pallet_type in pallet_types: + row = self.pallet_table.rowCount() + self.pallet_table.insertRow(row) + + # 设置托盘ID + id_item = QTableWidgetItem(str(pallet_type['id'])) + id_item.setTextAlignment(Qt.AlignCenter) + self.pallet_table.setItem(row, 0, id_item) + + # 设置托盘名称 + name_item = QTableWidgetItem(pallet_type['name']) + name_item.setTextAlignment(Qt.AlignCenter) + self.pallet_table.setItem(row, 1, name_item) + + # 清空输入框 + self.cancel_edit() + + logging.info(f"已加载 {len(pallet_types)} 个托盘类型") except Exception as e: - logging.error(f"加载托盘类型数据失败: {str(e)}") - QMessageBox.critical(self, "错误", f"加载托盘类型数据失败: {str(e)}") + logging.error(f"加载托盘类型失败: {str(e)}") + QMessageBox.critical(self, "错误", f"加载托盘类型失败: {str(e)}") - def load_operation_pallet_types(self, operation_type): - """加载指定操作类型的托盘类型数据 + def on_table_item_clicked(self, item): + """表格项点击事件 Args: - operation_type: 操作类型 (output) + item: 点击的表格项 """ - # 获取表格 - table = self.get_table_by_operation_type(operation_type) - if not table: - return + row = item.row() - # 清空表格 - table.setRowCount(0) + # 获取托盘ID和名称 + pallet_id = self.pallet_table.item(row, 0).text() + pallet_name = self.pallet_table.item(row, 1).text() - # 获取数据 - pallet_types = self.pallet_type_manager.get_pallet_types_by_operation(operation_type, include_disabled=True) - - # 填充表格 - for row, pallet_type in enumerate(pallet_types): - table.insertRow(row) + # 填充输入框 + self.pallet_id_input.setText(pallet_id) + self.pallet_name_input.setText(pallet_name) + + def add_pallet_type(self): + """添加托盘类型""" + try: + # 获取输入值 + pallet_id_text = self.pallet_id_input.text().strip() + pallet_name = self.pallet_name_input.text().strip() - # 类型名称 - type_name_item = QTableWidgetItem(pallet_type['type_name']) - type_name_item.setData(Qt.UserRole, pallet_type['id']) - table.setItem(row, 0, type_name_item) + # 验证输入 + if not pallet_id_text or not pallet_name: + QMessageBox.warning(self, "警告", "托盘ID和托盘名称不能为空") + return - # 描述 - desc_item = QTableWidgetItem(pallet_type['description'] or "") - table.setItem(row, 1, desc_item) + # 检查ID是否为数字 + try: + pallet_id = int(pallet_id_text) + except ValueError: + QMessageBox.warning(self, "警告", "托盘ID必须为数字") + return - # 排序 - sort_order_item = QTableWidgetItem(str(pallet_type['sort_order'])) - table.setItem(row, 2, sort_order_item) + # 添加托盘类型 + result = self.pallet_type_manager.add_pallet_type(pallet_id, pallet_name) + if not result: + QMessageBox.critical(self, "错误", "添加托盘类型失败") + return - # 启用状态 - enabled_check = QCheckBox() - enabled_check.setChecked(pallet_type['enabled']) - enabled_check.stateChanged.connect(lambda state, row=row, id=pallet_type['id']: - self.toggle_pallet_type(id, state == Qt.Checked)) - table.setCellWidget(row, 3, enabled_check) - - # 重置表单 - self.reset_form(operation_type) - - def get_table_by_operation_type(self, operation_type): - """根据操作类型获取表格 - - Args: - operation_type: 操作类型 (output) - - Returns: - QTableWidget: 表格部件 - """ - if operation_type == "output": - return self.output_widget.findChild(QTableWidget, "output_table") - return None - - def get_form_values(self, operation_type): - """获取表单值 - - Args: - operation_type: 操作类型 (output) - - Returns: - dict: 表单值 - """ - widget = self.output_widget - - type_name_input = widget.findChild(QLineEdit, f"{operation_type}_type_name_input") - desc_input = widget.findChild(QLineEdit, f"{operation_type}_desc_input") - sort_order_spin = widget.findChild(QSpinBox, f"{operation_type}_sort_order_spin") - enabled_check = widget.findChild(QCheckBox, f"{operation_type}_enabled_check") - - return { - 'type_name': type_name_input.text().strip(), - 'operation_type': operation_type, - 'description': desc_input.text().strip(), - 'sort_order': sort_order_spin.value(), - 'enabled': enabled_check.isChecked() - } - - def set_form_values(self, operation_type, values): - """设置表单值 - - Args: - operation_type: 操作类型 (output) - values: 表单值 - """ - widget = self.output_widget - - type_name_input = widget.findChild(QLineEdit, f"{operation_type}_type_name_input") - desc_input = widget.findChild(QLineEdit, f"{operation_type}_desc_input") - sort_order_spin = widget.findChild(QSpinBox, f"{operation_type}_sort_order_spin") - enabled_check = widget.findChild(QCheckBox, f"{operation_type}_enabled_check") - - type_name_input.setText(values.get('type_name', '')) - desc_input.setText(values.get('description', '')) - sort_order_spin.setValue(values.get('sort_order', 100)) - enabled_check.setChecked(values.get('enabled', True)) - - def reset_form(self, operation_type): - """重置表单 - - Args: - operation_type: 操作类型 (output) - """ - widget = self.output_widget - - # 重置表单值 - self.set_form_values(operation_type, { - 'type_name': '', - 'description': '', - 'sort_order': 100, - 'enabled': True - }) - - # 重置当前编辑ID - widget.setProperty("current_edit_id", -1) - - def handle_table_selection(self, operation_type): - """处理表格选择事件 - - Args: - operation_type: 操作类型 (output) - """ - # 获取表格 - table = self.get_table_by_operation_type(operation_type) - if not table: - return - - # 获取选中行 - selected_items = table.selectedItems() - if not selected_items: - return - - # 获取行数据 - row = selected_items[0].row() - - # 获取ID - id_item = table.item(row, 0) - if not id_item: - return - - pallet_type_id = id_item.data(Qt.UserRole) - - # 获取托盘类型数据 - pallet_type = self.pallet_type_manager.get_pallet_type_by_id(pallet_type_id) - if not pallet_type: - return - - # 设置表单值 - self.set_form_values(operation_type, pallet_type) - - # 设置当前编辑ID - widget = self.output_widget - widget.setProperty("current_edit_id", pallet_type_id) - - def validate_form(self, operation_type): - """验证表单 - - Args: - operation_type: 操作类型 (output) - - Returns: - bool: 验证是否通过 - """ - values = self.get_form_values(operation_type) - - if not values['type_name']: - QMessageBox.warning(self, "警告", "请输入类型名称") - return False - - return True - - def add_pallet_type(self, operation_type): - """添加托盘类型 - - Args: - operation_type: 操作类型 (output) - """ - # 验证表单 - if not self.validate_form(operation_type): - return - - # 获取表单值 - values = self.get_form_values(operation_type) - - # 添加托盘类型 - success = self.pallet_type_manager.add_pallet_type(values) - - if success: # 重新加载数据 - self.load_operation_pallet_types(operation_type) - - # 重置表单 - self.reset_form(operation_type) + self.load_pallet_types() # 发送信号 self.signal_pallet_types_changed.emit() - self.settings_changed.emit() # 发送设置变更信号 + self.settings_changed.emit() - logging.info(f"已添加{operation_type}托盘类型: {values['type_name']}") - else: - QMessageBox.critical(self, "错误", f"添加{operation_type}托盘类型失败") - logging.error(f"添加{operation_type}托盘类型失败: {values['type_name']}") - - def update_pallet_type(self, operation_type): - """更新托盘类型 - - Args: - operation_type: 操作类型 (output) - """ - # 获取当前编辑ID - widget = self.output_widget - pallet_type_id = widget.property("current_edit_id") - - if pallet_type_id < 0: - QMessageBox.warning(self, "警告", "请先选择要编辑的托盘类型") - return - - # 验证表单 - if not self.validate_form(operation_type): - return - - # 获取表单值 - values = self.get_form_values(operation_type) - - # 更新托盘类型 - success = self.pallet_type_manager.update_pallet_type(pallet_type_id, values) - - if success: - # 重新加载数据 - self.load_operation_pallet_types(operation_type) - - # 重置表单 - self.reset_form(operation_type) - - # 发送信号 - self.signal_pallet_types_changed.emit() - self.settings_changed.emit() # 发送设置变更信号 - - logging.info(f"已更新{operation_type}托盘类型: {values['type_name']}") - else: - QMessageBox.critical(self, "错误", f"更新{operation_type}托盘类型失败") - logging.error(f"更新{operation_type}托盘类型失败: {values['type_name']}") - - def delete_pallet_type(self, operation_type): - """删除托盘类型 - - Args: - operation_type: 操作类型 (output) - """ - # 获取选中行 - table = self.get_table_by_operation_type(operation_type) - if not table: - return - - selected_items = table.selectedItems() - if not selected_items: - QMessageBox.warning(self, "警告", "请先选择要删除的托盘类型") - return - - # 获取托盘类型ID - row = selected_items[0].row() - id_item = table.item(row, 0) - if not id_item: - return - - pallet_type_id = id_item.data(Qt.UserRole) - type_name = id_item.text() - - # 确认删除 - reply = QMessageBox.question(self, "确认删除", f"确定要删除{operation_type}托盘类型 [{type_name}] 吗?", - QMessageBox.Yes | QMessageBox.No, QMessageBox.No) - - if reply != QMessageBox.Yes: - return - - # 删除托盘类型 - success = self.pallet_type_manager.delete_pallet_type(pallet_type_id) - - if success: - # 重新加载数据 - self.load_operation_pallet_types(operation_type) - - # 重置表单 - self.reset_form(operation_type) - - # 发送信号 - self.signal_pallet_types_changed.emit() - self.settings_changed.emit() # 发送设置变更信号 - - logging.info(f"已删除{operation_type}托盘类型: {type_name}") - else: - QMessageBox.critical(self, "错误", f"删除{operation_type}托盘类型失败") - logging.error(f"删除{operation_type}托盘类型失败: {type_name}") - - def cancel_edit(self, operation_type): - """取消编辑 - - Args: - operation_type: 操作类型 (output) - """ - # 重置表单 - self.reset_form(operation_type) - - # 清除表格选择 - table = self.get_table_by_operation_type(operation_type) - if table: - table.clearSelection() + # 提示成功 + QMessageBox.information(self, "成功", f"已添加托盘类型: {pallet_name}") + except Exception as e: + logging.error(f"添加托盘类型失败: {str(e)}") + QMessageBox.critical(self, "错误", f"添加托盘类型失败: {str(e)}") - def toggle_pallet_type(self, pallet_type_id, enabled): - """切换托盘类型启用状态 - - Args: - pallet_type_id: 托盘类型ID - enabled: 是否启用 - """ - # 更新托盘类型启用状态 - success = self.pallet_type_manager.update_pallet_type_status(pallet_type_id, enabled) - - if success: - # 发送信号 - self.signal_pallet_types_changed.emit() - self.settings_changed.emit() # 发送设置变更信号 + def update_pallet_type(self): + """更新托盘类型""" + try: + # 获取输入值 + pallet_id_text = self.pallet_id_input.text().strip() + pallet_name = self.pallet_name_input.text().strip() - logging.info(f"已{('启用' if enabled else '禁用')}托盘类型: {pallet_type_id}") - else: - QMessageBox.critical(self, "错误", f"更新托盘类型状态失败") - logging.error(f"更新托盘类型状态失败: {pallet_type_id}") + # 验证输入 + if not pallet_id_text or not pallet_name: + QMessageBox.warning(self, "警告", "托盘ID和托盘名称不能为空") + return - def save_all_pallet_types(self): - """保存所有托盘类型""" - # 保存所有托盘类型 - success = self.pallet_type_manager.save_all_pallet_types() - - if success: - QMessageBox.information(self, "成功", "所有托盘类型已保存") + # 检查ID是否为数字 + try: + pallet_id = int(pallet_id_text) + except ValueError: + QMessageBox.warning(self, "警告", "托盘ID必须为数字") + return + + # 更新托盘类型 + result = self.pallet_type_manager.update_pallet_type(pallet_id, pallet_name) + if not result: + QMessageBox.critical(self, "错误", "更新托盘类型失败") + return + + # 重新加载数据 + self.load_pallet_types() # 发送信号 self.signal_pallet_types_changed.emit() - self.settings_changed.emit() # 发送设置变更信号 + self.settings_changed.emit() - logging.info("已保存所有托盘类型") - else: - QMessageBox.critical(self, "错误", "保存托盘类型失败") - logging.error("保存托盘类型失败") \ No newline at end of file + # 提示成功 + QMessageBox.information(self, "成功", f"已更新托盘类型: {pallet_name}") + except Exception as e: + logging.error(f"更新托盘类型失败: {str(e)}") + QMessageBox.critical(self, "错误", f"更新托盘类型失败: {str(e)}") + + def delete_pallet_type(self): + """删除托盘类型""" + try: + # 获取输入值 + pallet_id_text = self.pallet_id_input.text().strip() + + # 验证输入 + if not pallet_id_text: + QMessageBox.warning(self, "警告", "请先选择要删除的托盘类型") + return + + # 检查ID是否为数字 + try: + pallet_id = int(pallet_id_text) + except ValueError: + QMessageBox.warning(self, "警告", "托盘ID必须为数字") + return + + # 确认删除 + reply = QMessageBox.question( + self, + "确认删除", + f"确定要删除托盘ID为 {pallet_id} 的托盘类型吗?", + QMessageBox.Yes | QMessageBox.No, + QMessageBox.No + ) + + if reply != QMessageBox.Yes: + return + + # 删除托盘类型 + result = self.pallet_type_manager.delete_pallet_type_by_id(pallet_id) + if not result: + QMessageBox.critical(self, "错误", "删除托盘类型失败") + return + + # 重新加载数据 + self.load_pallet_types() + + # 发送信号 + self.signal_pallet_types_changed.emit() + self.settings_changed.emit() + + # 提示成功 + QMessageBox.information(self, "成功", f"已删除托盘类型: {pallet_id}") + except Exception as e: + logging.error(f"删除托盘类型失败: {str(e)}") + QMessageBox.critical(self, "错误", f"删除托盘类型失败: {str(e)}") + + def cancel_edit(self): + """取消编辑""" + # 清空输入框 + self.pallet_id_input.clear() + self.pallet_name_input.clear() + + # 此方法不再需要,因为相关按钮已被删除 + # def save_all(self): + # """保存所有配置(实际上是空操作,因为每次修改都会立即保存)""" + # QMessageBox.information(self, "成功", "所有配置已保存") + \ No newline at end of file