| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- """
- 货物维护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)}")
|