company_tab.py 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. """
  2. 公司维护Tab页面
  3. """
  4. from PyQt5.QtWidgets import (
  5. QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton,
  6. QTableWidget, QTableWidgetItem, QHeaderView, QMessageBox, QDialog,
  7. QFormLayout
  8. )
  9. from PyQt5.QtCore import Qt
  10. from PyQt5.QtGui import QFont
  11. from database import Database
  12. class CompanyTab(QWidget):
  13. """公司维护Tab"""
  14. def __init__(self, db: Database):
  15. super().__init__()
  16. self.db = db
  17. self.init_ui()
  18. self.refresh_list()
  19. def init_ui(self):
  20. """初始化界面"""
  21. layout = QVBoxLayout()
  22. layout.setSpacing(10)
  23. layout.setContentsMargins(15, 15, 15, 15)
  24. # 标题
  25. title = QLabel("公司名称维护")
  26. title_font = QFont("微软雅黑", 18, QFont.Bold)
  27. title.setFont(title_font)
  28. layout.addWidget(title)
  29. # 按钮区域
  30. button_layout = QHBoxLayout()
  31. button_layout.setSpacing(10)
  32. self.add_btn = QPushButton("新增")
  33. self.add_btn.setMinimumHeight(45)
  34. self.add_btn.setMinimumWidth(120)
  35. self.add_btn.setFont(QFont("微软雅黑", 16))
  36. self.add_btn.setStyleSheet("background-color: #2196F3; color: white; border-radius: 5px;")
  37. self.add_btn.clicked.connect(self.add_company)
  38. # 添加快捷键
  39. from PyQt5.QtGui import QKeySequence
  40. self.add_btn.setShortcut(QKeySequence("Ctrl+N"))
  41. self.edit_btn = QPushButton("修改")
  42. self.edit_btn.setMinimumHeight(45)
  43. self.edit_btn.setMinimumWidth(120)
  44. self.edit_btn.setFont(QFont("微软雅黑", 16))
  45. self.edit_btn.clicked.connect(self.edit_company)
  46. self.delete_btn = QPushButton("删除")
  47. self.delete_btn.setMinimumHeight(45)
  48. self.delete_btn.setMinimumWidth(120)
  49. self.delete_btn.setFont(QFont("微软雅黑", 16))
  50. self.delete_btn.setStyleSheet("background-color: #f44336; color: white; border-radius: 5px;")
  51. self.delete_btn.clicked.connect(self.delete_company)
  52. # 添加快捷键
  53. from PyQt5.QtGui import QKeySequence
  54. self.delete_btn.setShortcut(QKeySequence("Delete"))
  55. self.refresh_btn = QPushButton("刷新")
  56. self.refresh_btn.setMinimumHeight(45)
  57. self.refresh_btn.setMinimumWidth(120)
  58. self.refresh_btn.setFont(QFont("微软雅黑", 16))
  59. self.refresh_btn.setStyleSheet("""
  60. QPushButton {
  61. background-color: #607D8B;
  62. color: white;
  63. border-radius: 5px;
  64. border: none;
  65. }
  66. QPushButton:hover {
  67. background-color: #455A64;
  68. }
  69. QPushButton:pressed {
  70. background-color: #37474F;
  71. }
  72. QPushButton:disabled {
  73. background-color: #BDBDBD;
  74. color: #757575;
  75. }
  76. """)
  77. self.refresh_btn.setEnabled(True) # 确保按钮是启用状态
  78. self.refresh_btn.clicked.connect(self.refresh_list)
  79. self.refresh_btn.setShortcut(QKeySequence("F5"))
  80. button_layout.addWidget(self.add_btn)
  81. button_layout.addWidget(self.edit_btn)
  82. button_layout.addWidget(self.delete_btn)
  83. button_layout.addWidget(self.refresh_btn)
  84. button_layout.addStretch()
  85. layout.addLayout(button_layout)
  86. # 表格
  87. self.table = QTableWidget()
  88. self.table.setColumnCount(2)
  89. self.table.setHorizontalHeaderLabels(["序号", "公司名称"])
  90. self.table.horizontalHeader().setFont(QFont("微软雅黑", 15, QFont.Bold))
  91. self.table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
  92. self.table.setFont(QFont("微软雅黑", 15))
  93. self.table.setAlternatingRowColors(True)
  94. self.table.setSelectionBehavior(QTableWidget.SelectRows)
  95. self.table.setSelectionMode(QTableWidget.SingleSelection)
  96. layout.addWidget(self.table)
  97. self.setLayout(layout)
  98. def refresh_list(self):
  99. """刷新列表"""
  100. companies = self.db.get_all_companies()
  101. self.table.setRowCount(len(companies))
  102. for i, company in enumerate(companies):
  103. # 序号
  104. self.table.setItem(i, 0, QTableWidgetItem(str(i + 1)))
  105. # 公司名称
  106. self.table.setItem(i, 1, QTableWidgetItem(company['name']))
  107. self.table.resizeRowsToContents()
  108. def get_selected_company_id(self) -> int:
  109. """获取选中的公司ID"""
  110. current_row = self.table.currentRow()
  111. if current_row < 0:
  112. return -1
  113. companies = self.db.get_all_companies()
  114. if current_row >= len(companies):
  115. return -1
  116. return companies[current_row]['id']
  117. def add_company(self):
  118. """新增公司"""
  119. dialog = CompanyDialog(self.db, parent=self)
  120. if dialog.exec_() == QDialog.Accepted:
  121. self.refresh_list()
  122. def edit_company(self):
  123. """修改公司"""
  124. company_id = self.get_selected_company_id()
  125. if company_id < 0:
  126. QMessageBox.warning(self, "提示", "请先选择要修改的公司")
  127. return
  128. companies = self.db.get_all_companies()
  129. company = next((c for c in companies if c['id'] == company_id), None)
  130. if not company:
  131. QMessageBox.warning(self, "错误", "未找到该公司")
  132. return
  133. dialog = CompanyDialog(self.db, company=company, parent=self)
  134. if dialog.exec_() == QDialog.Accepted:
  135. self.refresh_list()
  136. def delete_company(self):
  137. """删除公司"""
  138. company_id = self.get_selected_company_id()
  139. if company_id < 0:
  140. QMessageBox.warning(self, "提示", "请先选择要删除的公司")
  141. return
  142. # 检查是否被引用
  143. if self.db.is_company_used(company_id):
  144. QMessageBox.warning(self, "错误", "该公司已被地磅单引用,无法删除")
  145. return
  146. # 确认删除
  147. reply = QMessageBox.question(
  148. self, "确认", "确定要删除该公司吗?",
  149. QMessageBox.Yes | QMessageBox.No,
  150. QMessageBox.No
  151. )
  152. if reply == QMessageBox.Yes:
  153. if self.db.delete_company(company_id):
  154. QMessageBox.information(self, "成功", "删除成功!")
  155. self.refresh_list()
  156. else:
  157. QMessageBox.warning(self, "错误", "删除失败")
  158. class CompanyDialog(QDialog):
  159. """公司编辑对话框"""
  160. def __init__(self, db: Database, company=None, parent=None):
  161. super().__init__(parent)
  162. self.db = db
  163. self.company = company
  164. self.init_ui()
  165. def init_ui(self):
  166. """初始化对话框界面"""
  167. if self.company:
  168. self.setWindowTitle("修改公司名称")
  169. else:
  170. self.setWindowTitle("新增公司名称")
  171. self.setMinimumWidth(400)
  172. layout = QVBoxLayout()
  173. layout.setSpacing(15)
  174. layout.setContentsMargins(20, 20, 20, 20)
  175. # 表单
  176. form_layout = QFormLayout()
  177. form_layout.setSpacing(15)
  178. name_label = QLabel("公司名称 *:")
  179. name_label.setFont(QFont("微软雅黑", 16))
  180. self.name_input = QLineEdit()
  181. self.name_input.setMinimumHeight(45)
  182. self.name_input.setFont(QFont("微软雅黑", 16))
  183. if self.company:
  184. self.name_input.setText(self.company['name'])
  185. form_layout.addRow(name_label, self.name_input)
  186. layout.addLayout(form_layout)
  187. # 按钮
  188. button_layout = QHBoxLayout()
  189. button_layout.addStretch()
  190. ok_btn = QPushButton("确定")
  191. ok_btn.setMinimumHeight(45)
  192. ok_btn.setMinimumWidth(100)
  193. ok_btn.setFont(QFont("微软雅黑", 16))
  194. ok_btn.clicked.connect(self.save)
  195. cancel_btn = QPushButton("取消")
  196. cancel_btn.setMinimumHeight(45)
  197. cancel_btn.setMinimumWidth(100)
  198. cancel_btn.setFont(QFont("微软雅黑", 16))
  199. cancel_btn.clicked.connect(self.reject)
  200. button_layout.addWidget(ok_btn)
  201. button_layout.addWidget(cancel_btn)
  202. layout.addLayout(button_layout)
  203. self.setLayout(layout)
  204. def save(self):
  205. """保存"""
  206. name = self.name_input.text().strip()
  207. if not name:
  208. QMessageBox.warning(self, "验证失败", "公司名称不能为空")
  209. return
  210. # 检查重复
  211. if self.company:
  212. # 修改模式
  213. if self.db.company_exists(name, exclude_id=self.company['id']):
  214. QMessageBox.warning(self, "验证失败", "该名称已存在")
  215. return
  216. if self.db.update_company(self.company['id'], name):
  217. QMessageBox.information(self, "成功", "修改成功!")
  218. self.accept()
  219. else:
  220. QMessageBox.warning(self, "错误", "修改失败")
  221. else:
  222. # 新增模式
  223. if self.db.company_exists(name):
  224. QMessageBox.warning(self, "验证失败", "该名称已存在")
  225. return
  226. try:
  227. self.db.insert_company(name)
  228. QMessageBox.information(self, "成功", "新增成功!")
  229. self.accept()
  230. except Exception as e:
  231. QMessageBox.critical(self, "错误", f"新增失败:{str(e)}")