From 99bca76e08988a6714fb8477583531349ef2895e Mon Sep 17 00:00:00 2001 From: zhu-mengmeng <15588200382@163.com> Date: Thu, 26 Jun 2025 10:14:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E6=89=98=E7=9B=98?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=98=E7=9B=98=E7=B1=BB=E5=9E=8B=E7=9A=84?= =?UTF-8?q?=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96UI=E4=BA=A4=E4=BA=92=EF=BC=8C=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E6=89=98=E7=9B=98=E7=B1=BB=E5=9E=8B=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/app_config.json | 2 +- dao/pallet_type_dao.py | 376 ++++++------------ db/jtDB.db | Bin 77824 -> 86016 bytes ui/pallet_type_settings_ui.py | 156 ++------ utils/pallet_type_manager.py | 77 +++- widgets/main_window.py | 2 +- widgets/pallet_type_settings_widget.py | 518 ++++++++----------------- 7 files changed, 414 insertions(+), 717 deletions(-) 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 70019cbb93e3cc1015b93660e34201bc37300c86..06d3ca51e17ff936fb42ea050e0447fd2eab10a1 100644 GIT binary patch delta 1967 zcmZ{kYfM{J9Kg@Hx4rFc={+q_N_mVM457^meeh5ou_+ZD59cJzXErFbTTluOy(Emp zb(yf@<_7E%VQRKHmrOGygJ$a(f$0bRVq#`uV*I2gv<2e_zwU#H=iXcFZLv4G_uTV8 z=l?tZ=Q;Pg;@nN;Lb+iB0AR%L{`2~xtpRSV4c~gr8>Kx5=t|r#`Y^$TW)!8U5ud`4e zgMX9y5*l~_Gsd*(_UNzaK}9L>sQ;j@FP^Q9+x74lGX7jCygeFpeMn_Gd>CHr5qHX><@a&EoN2MQuhY}t$@Y6XdOO*iMV`?(V^67K zf-k3QD`ksP*exS|tH$c7q)f-{yoV``9N017JRnlfSt?W}yB*F)a?O*d2Q-TEnJDdN zEgBX-BYrkks`-heYRf58n^CaGE#!W{DSXlUx-yl?XoR!xiKhxO;bpSef+UR-ki0=t z&;QCa^IBx%8}NHYZQ&!RmcNCb;lD*zTG(X86~*xeeaJJ@!>UX*HE`}t@d$a{%Kwd7 zN6J@(a4Up5=eIQ#5dqHD)v?JBR#Km=q}DbQ*Doa&E~oC?6a5_z1txrA4+t9UYo0#u z5l^4R<*>3xU+HI$9`Eh7iR%32ovlwL^;VqV&?INsd3Z7T(KV}$9iQZ+`6Xd4a{Ynu z@We=n)8h7G`#az0x3TQif)d62{O)6ZS7YIIS`+_GK{fwd!Tl1ARma=~6k`Br6NQnT z`I9j)AzZNk=prYSg#Z>+(Q4fOF9RrclJeBFKe@D>+FDJW-w2FN2H&psBtCppZDXrD z(xW#$z95Vzl(K$vw8;Cdg~E7)SuNl}8cz*PCvHcRu`js5R24_%)x`>KoU*ovSCO{S ztR{d#vQaS=I-Pp-7{`3??g}<>C@?|p27`*cv<^}RK@x-vPmLy*9$?O1bpAgGnZt-= zu8$W9(H)vLtKhyR#MC<&kl3D)0Pc-z!t=2v7$kB)8IBhg0vbo1HbV%Ev>5fEe>$}m zOD)~sTiKLQ8rP3s+Jmk`naeCYxY_q)u`s2Wc7PtBcM;3{%*-+EILQ_!(oGeB8ncs@ zyiVM{gNsxuSgEum$<9Nez9f16taK~0Soh|0S)xSFQbzK|p<5w`C2vL((F=0JB#9iB zKfzrjW|{uaNqpns{@Hg@Xe#N9+(c*c(?w*lWKK$`w2v87{!|}<1uuzqNm-WrD6;ll J%&_uC>tBQNew6?K literal 77824 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 G_kRJlO8@Tw 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