""" 货物维护Tab页面 """ from PyQt5.QtWidgets import ( QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QTableWidget, QTableWidgetItem, QHeaderView, QMessageBox, QDialog, QFormLayout ) from PyQt5.QtCore import Qt from PyQt5.QtGui import QFont from database import Database class CargoTab(QWidget): """货物维护Tab""" def __init__(self, db: Database): super().__init__() self.db = db self.init_ui() self.refresh_list() def init_ui(self): """初始化界面""" layout = QVBoxLayout() layout.setSpacing(10) layout.setContentsMargins(15, 15, 15, 15) # 标题 title = QLabel("货物名称维护") title_font = QFont("微软雅黑", 18, QFont.Bold) title.setFont(title_font) layout.addWidget(title) # 按钮区域 button_layout = QHBoxLayout() button_layout.setSpacing(10) self.add_btn = QPushButton("新增") self.add_btn.setMinimumHeight(45) self.add_btn.setMinimumWidth(120) self.add_btn.setFont(QFont("微软雅黑", 16)) self.add_btn.setStyleSheet("background-color: #2196F3; color: white; border-radius: 5px;") self.add_btn.clicked.connect(self.add_cargo) # 添加快捷键 from PyQt5.QtGui import QKeySequence self.add_btn.setShortcut(QKeySequence("Ctrl+N")) self.edit_btn = QPushButton("修改") self.edit_btn.setMinimumHeight(45) self.edit_btn.setMinimumWidth(120) self.edit_btn.setFont(QFont("微软雅黑", 16)) self.edit_btn.clicked.connect(self.edit_cargo) self.delete_btn = QPushButton("删除") self.delete_btn.setMinimumHeight(45) self.delete_btn.setMinimumWidth(120) self.delete_btn.setFont(QFont("微软雅黑", 16)) self.delete_btn.setStyleSheet("background-color: #f44336; color: white; border-radius: 5px;") self.delete_btn.clicked.connect(self.delete_cargo) # 添加快捷键 from PyQt5.QtGui import QKeySequence self.delete_btn.setShortcut(QKeySequence("Delete")) self.refresh_btn = QPushButton("刷新") self.refresh_btn.setMinimumHeight(45) self.refresh_btn.setMinimumWidth(120) self.refresh_btn.setFont(QFont("微软雅黑", 16)) self.refresh_btn.setStyleSheet(""" QPushButton { background-color: #607D8B; color: white; border-radius: 5px; border: none; } QPushButton:hover { background-color: #455A64; } QPushButton:pressed { background-color: #37474F; } QPushButton:disabled { background-color: #BDBDBD; color: #757575; } """) self.refresh_btn.setEnabled(True) # 确保按钮是启用状态 self.refresh_btn.clicked.connect(self.refresh_list) self.refresh_btn.setShortcut(QKeySequence("F5")) button_layout.addWidget(self.add_btn) button_layout.addWidget(self.edit_btn) button_layout.addWidget(self.delete_btn) button_layout.addWidget(self.refresh_btn) button_layout.addStretch() layout.addLayout(button_layout) # 表格 self.table = QTableWidget() self.table.setColumnCount(2) self.table.setHorizontalHeaderLabels(["序号", "货物名称"]) self.table.horizontalHeader().setFont(QFont("微软雅黑", 15, QFont.Bold)) self.table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch) self.table.setFont(QFont("微软雅黑", 15)) self.table.setAlternatingRowColors(True) self.table.setSelectionBehavior(QTableWidget.SelectRows) self.table.setSelectionMode(QTableWidget.SingleSelection) layout.addWidget(self.table) self.setLayout(layout) def refresh_list(self): """刷新列表""" cargos = self.db.get_all_cargos() self.table.setRowCount(len(cargos)) for i, cargo in enumerate(cargos): # 序号 self.table.setItem(i, 0, QTableWidgetItem(str(i + 1))) # 货物名称 self.table.setItem(i, 1, QTableWidgetItem(cargo['name'])) self.table.resizeRowsToContents() def get_selected_cargo_id(self) -> int: """获取选中的货物ID""" current_row = self.table.currentRow() if current_row < 0: return -1 cargos = self.db.get_all_cargos() if current_row >= len(cargos): return -1 return cargos[current_row]['id'] def add_cargo(self): """新增货物""" dialog = CargoDialog(self.db, parent=self) if dialog.exec_() == QDialog.Accepted: self.refresh_list() def edit_cargo(self): """修改货物""" cargo_id = self.get_selected_cargo_id() if cargo_id < 0: QMessageBox.warning(self, "提示", "请先选择要修改的货物") return cargos = self.db.get_all_cargos() cargo = next((c for c in cargos if c['id'] == cargo_id), None) if not cargo: QMessageBox.warning(self, "错误", "未找到该货物") return dialog = CargoDialog(self.db, cargo=cargo, parent=self) if dialog.exec_() == QDialog.Accepted: self.refresh_list() def delete_cargo(self): """删除货物""" cargo_id = self.get_selected_cargo_id() if cargo_id < 0: QMessageBox.warning(self, "提示", "请先选择要删除的货物") return # 检查是否被引用 if self.db.is_cargo_used(cargo_id): QMessageBox.warning(self, "错误", "该货物已被地磅单引用,无法删除") return # 确认删除 reply = QMessageBox.question( self, "确认", "确定要删除该货物吗?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No ) if reply == QMessageBox.Yes: if self.db.delete_cargo(cargo_id): QMessageBox.information(self, "成功", "删除成功!") self.refresh_list() else: QMessageBox.warning(self, "错误", "删除失败") class CargoDialog(QDialog): """货物编辑对话框""" def __init__(self, db: Database, cargo=None, parent=None): super().__init__(parent) self.db = db self.cargo = cargo self.init_ui() def init_ui(self): """初始化对话框界面""" if self.cargo: self.setWindowTitle("修改货物名称") else: self.setWindowTitle("新增货物名称") self.setMinimumWidth(400) layout = QVBoxLayout() layout.setSpacing(15) layout.setContentsMargins(20, 20, 20, 20) # 表单 form_layout = QFormLayout() form_layout.setSpacing(15) name_label = QLabel("货物名称 *:") name_label.setFont(QFont("微软雅黑", 16)) self.name_input = QLineEdit() self.name_input.setMinimumHeight(45) self.name_input.setFont(QFont("微软雅黑", 16)) if self.cargo: self.name_input.setText(self.cargo['name']) form_layout.addRow(name_label, self.name_input) layout.addLayout(form_layout) # 按钮 button_layout = QHBoxLayout() button_layout.addStretch() ok_btn = QPushButton("确定") ok_btn.setMinimumHeight(45) ok_btn.setMinimumWidth(100) ok_btn.setFont(QFont("微软雅黑", 16)) ok_btn.clicked.connect(self.save) cancel_btn = QPushButton("取消") cancel_btn.setMinimumHeight(45) cancel_btn.setMinimumWidth(100) cancel_btn.setFont(QFont("微软雅黑", 16)) cancel_btn.clicked.connect(self.reject) button_layout.addWidget(ok_btn) button_layout.addWidget(cancel_btn) layout.addLayout(button_layout) self.setLayout(layout) def save(self): """保存""" name = self.name_input.text().strip() if not name: QMessageBox.warning(self, "验证失败", "货物名称不能为空") return # 检查重复 if self.cargo: # 修改模式 if self.db.cargo_exists(name, exclude_id=self.cargo['id']): QMessageBox.warning(self, "验证失败", "该名称已存在") return if self.db.update_cargo(self.cargo['id'], name): QMessageBox.information(self, "成功", "修改成功!") self.accept() else: QMessageBox.warning(self, "错误", "修改失败") else: # 新增模式 if self.db.cargo_exists(name): QMessageBox.warning(self, "验证失败", "该名称已存在") return try: self.db.insert_cargo(name) QMessageBox.information(self, "成功", "新增成功!") self.accept() except Exception as e: QMessageBox.critical(self, "错误", f"新增失败:{str(e)}")