这是一个企业用简易的进销存系统中的部分代码,现在这个模块出现问题,在新建订单添加物料时点击ok添加无效,随即程序崩溃,两项测试输出均正确,出现“加载订单错误: 'UserDB' object has no attribute 'get_purchase_orders'”的提示,请你帮助我在程序中添加更多调试输出,帮我定位问题,再尝试解决问题
from PyQt5.QtWidgets import (
QWidget, QVBoxLayout, QHBoxLayout, QTableWidget, QTableWidgetItem,
QPushButton, QHeaderView, QLineEdit, QLabel, QFormLayout, QDialog,
QDialogButtonBox, QMessageBox, QTabWidget, QComboBox, QDateEdit,
QAbstractItemView, QSplitter, QSizePolicy
)
from PyQt5.QtCore import Qt, QDate
from PyQt5.QtGui import QBrush, QColor
from purchase_manager.purchase_db import PurchaseDB
from purchase_manager.purchase_models import PurchaseOrder, PurchaseOrderItem
from basicData_manager.basic_data_db import BasicDataDB
class PurchaseOrderFormDialog(QDialog):
def __init__(self, parent=None, order=None):
super().__init__(parent)
self.setWindowTitle("编辑采购订单" if order else "新建采购订单")
self.setMinimumSize(900, 650)
self.db = BasicDataDB()
self.purchase_db = PurchaseDB()
self.order = order
self.items = []
layout = QVBoxLayout()
# 表单区域
form_layout = QFormLayout()
# 订单编号(自动生成或只读)
self.order_number_input = QLineEdit()
self.order_number_input.setReadOnly(bool(order))
if not order:
self.order_number_input.setText(self.generate_order_number())
# 供应商选择
self.supplier_combo = QComboBox()
self.populate_suppliers()
# 日期选择
self.order_date_edit = QDateEdit(QDate.currentDate())
self.order_date_edit.setCalendarPopup(True)
self.expected_delivery_edit = QDateEdit(QDate.currentDate().addDays(7))
self.expected_delivery_edit.setCalendarPopup(True)
form_layout.addRow("订单编号:", self.order_number_input)
form_layout.addRow("供应商:", self.supplier_combo)
form_layout.addRow("订单日期:", self.order_date_edit)
form_layout.addRow("预计交货日期:", self.expected_delivery_edit)
# 物料明细表格
self.items_table = QTableWidget()
self.items_table.setColumnCount(9)
self.items_table.setHorizontalHeaderLabels([
"ID", "物料编码", "物料名称", "规格", "单位", "数量", "税前单价", "税率", "金额"
])
self.items_table.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeToContents)
self.items_table.horizontalHeader().setSectionResizeMode(2, QHeaderView.Stretch)
self.items_table.setSelectionBehavior(QTableWidget.SelectRows)
self.items_table.setEditTriggers(QTableWidget.DoubleClicked) # 允许编辑数量
# 添加物料按钮
add_item_btn = QPushButton("添加物料")
add_item_btn.clicked.connect(self.add_item)
# 删除物料按钮
remove_item_btn = QPushButton("删除选中物料")
remove_item_btn.clicked.connect(self.remove_selected_items)
button_layout = QHBoxLayout()
button_layout.addWidget(add_item_btn)
button_layout.addWidget(remove_item_btn)
button_layout.addStretch()
# 合计金额
self.total_amount_label = QLabel("0.00")
form_layout.addRow("合计金额:", self.total_amount_label)
layout.addLayout(form_layout)
layout.addWidget(QLabel("订单明细:"))
layout.addWidget(self.items_table)
layout.addLayout(button_layout)
# 初始化数据
if order:
self.load_order_data(order)
else:
# 初始加载空表格
self.items_table.setRowCount(0)
# 按钮区域
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
button_box.accepted.connect(self.validate_and_accept)
button_box.rejected.connect(self.reject)
layout.addWidget(button_box)
self.items_table.itemChanged.connect(self.on_item_changed)
self.setLayout(layout)
def generate_order_number(self):
"""生成唯一的订单编号"""
from datetime import datetime
return f"{datetime.now().strftime('%Y%m%d%H%M%S')}"
def populate_suppliers(self):
"""填充已审核的供应商"""
try:
suppliers = self.db.get_suppliers(status='approved')
self.supplier_combo.clear()
for supplier in suppliers:
self.supplier_combo.addItem(f"{supplier[1]} - {supplier[2]}", supplier[0])
except Exception as e:
print(f"加载供应商错误: {str(e)}")
def load_order_data(self, order):
"""加载订单数据"""
self.order_number_input.setText(order.order_number)
self.supplier_combo.setCurrentText(order.supplier_name)
self.order_date_edit.setDate(QDate.fromString(order.order_date, "yyyy-MM-dd"))
self.expected_delivery_edit.setDate(QDate.fromString(order.expected_delivery_date, "yyyy-MM-dd"))
# 加载订单明细
order_items = self.purchase_db.get_purchase_order_details(order.id)
self.items = []
self.items_table.setRowCount(len(order_items))
for row, item in enumerate(order_items):
self.items.append({
"product_id": item['product_id'],
"code": item['product_code'],
"name": item['product_name'],
"specification": item['specification'],
"unit": item['unit'],
"quantity": item['quantity'],
"unit_price": item['unit_price'],
"tax_rate": item['tax_rate']
})
self.items_table.setItem(row, 0, self.create_readonly_item(str(item['id'])))
self.items_table.setItem(row, 1, self.create_readonly_item(item['product_code']))
self.items_table.setItem(row, 2, self.create_readonly_item(item['product_name']))
self.items_table.setItem(row, 3, self.create_readonly_item(item['specification']))
self.items_table.setItem(row, 4, self.create_readonly_item(item['unit']))
self.items_table.setItem(row, 5, QTableWidgetItem(str(item['quantity'])))
self.items_table.setItem(row, 6, QTableWidgetItem(f"{item['unit_price']:.2f}"))
self.items_table.setItem(row, 7, QTableWidgetItem(f"{item['tax_rate'] * 100:.0f}%"))
self.items_table.setItem(row, 8, self.create_readonly_item(f"{item['total_price']:.2f}"))
self.update_total_amount()
def add_item(self):
"""打开物料选择对话框"""
dialog = ProductSelectionDialog(self)
if dialog.exec_() == QDialog.Accepted:
# 测试输出
print("02 - Selected Products to Add:")
print(dialog.selected_products)
for product in dialog.selected_products:
# 检查是否已添加过该物料(通过ID检查)
existing = next((item for item in self.items if item.get("id") == product["id"]), None)
if existing:
# 如果已存在,增加数量
row_index = self.items.index(existing)
current_qty = int(self.items_table.item(row_index, 5).text())
new_qty = current_qty + 1
# 更新表格
self.items_table.item(row_index, 5).setText(str(new_qty))
# 更新内存中的数据
self.items[row_index]["quantity"] = new_qty
else:
# 添加新物料
self.add_item_to_table(product)
def add_item_to_table(self, product):
"""添加物料到表格"""
row = self.items_table.rowCount()
self.items_table.insertRow(row)
# 创建物料数据对象(包含所有必要属性)
item_data = {
"id": product["id"],
"code": product["code"],
"name": product["name"],
"specification": product["specification"],
"unit": product["unit"],
"quantity": 1, # 默认数量为1
"unit_price": product["purchase_price"],
"tax_rate": product["tax_rate"]
}
self.items.append(item_data)
# 设置表格项
self.items_table.setItem(row, 0, self.create_readonly_item(str(product["id"])))
self.items_table.setItem(row, 1, self.create_readonly_item(product["code"]))
self.items_table.setItem(row, 2, self.create_readonly_item(product["name"]))
self.items_table.setItem(row, 3, self.create_readonly_item(product["specification"]))
self.items_table.setItem(row, 4, self.create_readonly_item(product["unit"]))
self.items_table.setItem(row, 5, QTableWidgetItem("1")) # 数量
self.items_table.setItem(row, 6, QTableWidgetItem(f"{product['purchase_price']:.2f}"))
self.items_table.setItem(row, 7, QTableWidgetItem(f"{product['tax_rate'] * 100:.0f}%"))
# 计算并设置总价
total_price = product['purchase_price'] * (1 + product['tax_rate'])
self.items_table.setItem(row, 8, self.create_readonly_item(f"{total_price:.2f}"))
self.update_total_amount()
def create_readonly_item(self, text):
"""创建只读表格项"""
item = QTableWidgetItem(text)
item.setFlags(item.flags() & ~Qt.ItemIsEditable)
return item
def remove_selected_items(self):
"""删除选中物料"""
selected_rows = sorted(set(index.row() for index in self.items_table.selectedIndexes()))
if not selected_rows:
QMessageBox.warning(self, "选择错误", "请先选择要删除的物料行")
return
for row in reversed(selected_rows):
self.items_table.removeRow(row)
del self.items[row]
self.update_total_amount()
def update_total_amount(self):
"""更新总金额"""
total = 0.0
for row in range(self.items_table.rowCount()):
quantity = float(self.items_table.item(row, 5).text() or 0)
unit_price = float(self.items_table.item(row, 6).text() or 0)
tax_rate = float(self.items_table.item(row, 7).text().rstrip('%')) / 100
total += quantity * unit_price * (1 + tax_rate)
self.total_amount_label.setText(f"{total:.2f}")
def validate_and_accept(self):
"""验证表单并接受"""
if not self.items:
QMessageBox.warning(self, "验证错误", "订单必须包含至少一个物料")
return
if self.supplier_combo.currentIndex() == -1:
QMessageBox.warning(self, "验证错误", "请选择供应商")
return
self.accept()
def get_order_data(self):
"""获取订单数据"""
order_data = {
"order_number": self.order_number_input.text(),
"supplier_id": self.supplier_combo.currentData(),
"order_date": self.order_date_edit.date().toString("yyyy-MM-dd"),
"expected_delivery_date": self.expected_delivery_edit.date().toString("yyyy-MM-dd"),
"total_amount": float(self.total_amount_label.text()),
"items": []
}
for row in range(self.items_table.rowCount()):
item = {
"product_id": int(self.items_table.item(row, 0).text()),
"quantity": int(self.items_table.item(row, 5).text()),
"unit_price": float(self.items_table.item(row, 6).text()),
"tax_rate": float(self.items_table.item(row, 7).text().rstrip('%')) / 100
}
order_data["items"].append(item)
return order_data
def on_item_changed(self, item):
"""当物料数量改变时更新金额"""
if item.column() in (5, 6, 7): # 数量、单价或税率列改变
row = item.row()
try:
quantity = float(self.items_table.item(row, 5).text() or 0)
unit_price = float(self.items_table.item(row, 6).text() or 0)
tax_rate = float(self.items_table.item(row, 7).text().rstrip('%') or 0) / 100
total_price = quantity * unit_price * (1 + tax_rate)
# 更新金额列
self.items_table.item(row, 8).setText(f"{total_price:.2f}")
# 更新总金额
self.update_total_amount()
except ValueError:
# 输入无效时跳过
pass
class ProductSelectionDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("选择物料")
self.setFixedSize(800, 500)
self.selected_product = None
self.db = BasicDataDB()
self.selected_products = []
layout = QVBoxLayout()
# 搜索区域
search_layout = QHBoxLayout()
self.search_input = QLineEdit()
self.search_input.setPlaceholderText("输入物料名称或编码...")
self.search_input.textChanged.connect(self.load_products)
search_layout.addWidget(QLabel("搜索:"))
search_layout.addWidget(self.search_input)
layout.addLayout(search_layout)
# 物料表格
self.products_table = QTableWidget()
self.products_table.setColumnCount(8)
self.products_table.setHorizontalHeaderLabels([
"选择","ID", "物料编码", "物料名称", "规格", "单位", "税前进价", "税率"
])# 拓展新列 ——税率
self.products_table.verticalHeader().setVisible(False)
self.products_table.setSelectionBehavior(QAbstractItemView.SelectRows)
self.products_table.setSelectionMode(QAbstractItemView.SingleSelection)
self.products_table.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeToContents)
self.products_table.horizontalHeader().setSectionResizeMode(2, QHeaderView.Stretch)
self.products_table.horizontalHeader().setSectionResizeMode(3, QHeaderView.Stretch)
self.products_table.setSelectionMode(QAbstractItemView.MultiSelection)
self.products_table.setSelectionBehavior(QAbstractItemView.SelectRows)
layout.addWidget(self.products_table)
# 按钮区域
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
button_box.accepted.connect(self.on_accept)
button_box.rejected.connect(self.reject)
layout.addWidget(button_box)
self.setLayout(layout)
# 初始加载数据
self.load_products()
def load_products(self, search_term=None):
"""加载物料数据并应用搜索过滤"""
try:
products = self.db.get_products(status='approved')
# 应用搜索过滤
if search_term:
search_term = search_term.lower().strip()
products = [p for p in products if
search_term in p[1].lower() or # 物料编码
search_term in p[2].lower()] # 物料名称
self.products_table.setRowCount(len(products))
for row, product in enumerate(products):
# 选择框
select_item = QTableWidgetItem()
select_item.setCheckState(Qt.Unchecked)
self.products_table.setItem(row, 0, select_item)
# 物料数据
self.products_table.setItem(row, 1, QTableWidgetItem(str(product[0]))) # ID
self.products_table.setItem(row, 2, QTableWidgetItem(product[1])) # 编码
self.products_table.setItem(row, 3, QTableWidgetItem(product[2])) # 名称
self.products_table.setItem(row, 4, QTableWidgetItem(product[4])) # 规格
self.products_table.setItem(row, 5, QTableWidgetItem(product[5])) # 单位
self.products_table.setItem(row, 6, QTableWidgetItem(f"{product[6]:.2f}")) # 进价
self.products_table.setItem(row, 7, QTableWidgetItem(f"{product[7]:.2f}")) # 税率
# 设置整行选择
self.products_table.setSelectionBehavior(QAbstractItemView.SelectRows)
except Exception as e:
print(f"加载物料错误: {str(e)}")
def on_accept(self):
"""处理确定按钮点击"""
self.selected_products = []
for row in range(self.products_table.rowCount()):
if self.products_table.item(row, 0).checkState() == Qt.Checked:
product = {
"id": int(self.products_table.item(row, 1).text()), # 索引1
"code": self.products_table.item(row, 2).text(), # 索引2
"name": self.products_table.item(row, 3).text(), # 索引3
"specification": self.products_table.item(row, 4).text(), # 索引4
"unit": self.products_table.item(row, 5).text(), # 索引5
"purchase_price": float(self.products_table.item(row, 6).text()), # 索引6
"tax_rate": float(self.products_table.item(row, 7).text()) # 索引7
}
self.selected_products.append(product)
# 测试输出 - 可以保留用于调试
print("01 - Selected Products:")
print(self.selected_products)
if not self.selected_products:
QMessageBox.warning(self, "选择错误", "请至少选择一个物料")
return
self.accept()
class PurchaseOrderManager(QWidget):
def __init__(self, current_user, db, parent=None):
super().__init__(parent)
self.current_user = current_user
self.db = db or PurchaseDB()
self.basic_db = BasicDataDB()
self.init_ui()
self.load_orders()
def init_ui(self):
layout = QVBoxLayout()
# 顶部按钮区域
button_layout = QHBoxLayout()
self.new_btn = QPushButton("新建订单")
self.new_btn.clicked.connect(self.show_new_form)
self.edit_btn = QPushButton("修改订单")
self.edit_btn.clicked.connect(self.show_edit_form)
self.submit_btn = QPushButton("提交订单")
self.submit_btn.clicked.connect(self.submit_order)
self.approve_btn = QPushButton("审核订单")
self.approve_btn.clicked.connect(self.approve_order)
self.refresh_btn = QPushButton("刷新")
self.refresh_btn.clicked.connect(self.load_orders)
button_layout.addWidget(self.new_btn)
button_layout.addWidget(self.edit_btn)
button_layout.addWidget(self.submit_btn)
button_layout.addWidget(self.approve_btn)
button_layout.addStretch()
button_layout.addWidget(self.refresh_btn)
# 搜索区域
search_layout = QHBoxLayout()
self.status_combo = QComboBox()
self.status_combo.addItem("全部状态", "")
self.status_combo.addItem("草稿", "draft")
self.status_combo.addItem("已提交", "submitted")
self.status_combo.addItem("已审核", "approved")
self.status_combo.addItem("已收货", "received")
self.status_combo.addItem("已取消", "canceled")
self.status_combo.currentIndexChanged.connect(self.load_orders)
self.supplier_combo = QComboBox()
self.populate_suppliers()
self.supplier_combo.currentIndexChanged.connect(self.load_orders)
self.date_from = QDateEdit(QDate.currentDate().addMonths(-1))
self.date_from.setCalendarPopup(True)
self.date_from.dateChanged.connect(self.load_orders)
self.date_to = QDateEdit(QDate.currentDate())
self.date_to.setCalendarPopup(True)
self.date_to.dateChanged.connect(self.load_orders)
search_layout.addWidget(QLabel("状态:"))
search_layout.addWidget(self.status_combo)
search_layout.addWidget(QLabel("供应商:"))
search_layout.addWidget(self.supplier_combo)
search_layout.addWidget(QLabel("日期从:"))
search_layout.addWidget(self.date_from)
search_layout.addWidget(QLabel("到:"))
search_layout.addWidget(self.date_to)
# 订单表格
self.orders_table = QTableWidget()
self.orders_table.setColumnCount(8)
self.orders_table.setHorizontalHeaderLabels([
"ID", "订单编号", "供应商", "订单日期", "交货日期", "总金额", "状态", "创建人"
])
self.orders_table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
self.orders_table.horizontalHeader().setSectionResizeMode(2, QHeaderView.Stretch)
self.orders_table.setSelectionBehavior(QTableWidget.SelectRows)
self.orders_table.setEditTriggers(QTableWidget.NoEditTriggers)
self.orders_table.doubleClicked.connect(self.show_order_details)
# 订单明细表格
self.items_table = QTableWidget()
self.items_table.setColumnCount(7)
self.items_table.setHorizontalHeaderLabels([
"物料编码", "物料名称", "规格", "单位", "数量", "单价", "金额"
])
self.items_table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
self.items_table.setEditTriggers(QTableWidget.NoEditTriggers)
# 使用分割器
splitter = QSplitter(Qt.Vertical)
splitter.addWidget(self.orders_table)
splitter.addWidget(self.items_table)
splitter.setSizes([300, 200])
layout.addLayout(button_layout)
layout.addLayout(search_layout)
layout.addWidget(splitter)
self.setLayout(layout)
# 根据用户角色设置按钮可见性
if self.current_user.role != "root":
self.approve_btn.setVisible(False)
def populate_suppliers(self):
"""填充供应商下拉框"""
try:
suppliers = self.basic_db.get_suppliers(status='approved')
self.supplier_combo.clear()
self.supplier_combo.addItem("全部供应商", -1)
for supplier in suppliers:
self.supplier_combo.addItem(f"{supplier[1]} - {supplier[2]}", supplier[0])
except Exception as e:
print(f"加载供应商错误: {str(e)}")
def load_orders(self):
"""加载采购订单"""
try:
status = self.status_combo.currentData()
supplier_id = self.supplier_combo.currentData()
if supplier_id == -1:
supplier_id = None
start_date = self.date_from.date().toString("yyyy-MM-dd")
end_date = self.date_to.date().toString("yyyy-MM-dd")
orders = self.db.get_purchase_orders(
status=status,
supplier_id=supplier_id,
start_date=start_date,
end_date=end_date
)
self.orders_table.setRowCount(len(orders))
for row, order in enumerate(orders):
self.orders_table.setItem(row, 0, QTableWidgetItem(str(order[0]))) # ID
self.orders_table.setItem(row, 1, QTableWidgetItem(order[1])) # 订单编号
self.orders_table.setItem(row, 2, QTableWidgetItem(order[11])) # 供应商名称
self.orders_table.setItem(row, 3, QTableWidgetItem(order[3])) # 订单日期
self.orders_table.setItem(row, 4, QTableWidgetItem(order[4] or "")) # 交货日期
self.orders_table.setItem(row, 5, QTableWidgetItem(f"{order[5]:.2f}")) # 总金额
# 状态列
status_item = QTableWidgetItem(order[6])
if order[6] == "draft":
status_item.setForeground(QBrush(QColor("gray")))
elif order[6] == "submitted":
status_item.setForeground(QBrush(QColor("blue")))
elif order[6] == "approved":
status_item.setForeground(QBrush(QColor("green")))
elif order[6] == "received":
status_item.setForeground(QBrush(QColor("darkgreen")))
elif order[6] == "canceled":
status_item.setForeground(QBrush(QColor("red")))
self.orders_table.setItem(row, 6, status_item)
self.orders_table.setItem(row, 7, QTableWidgetItem(order[8])) # 创建人
# 清除明细表格
self.items_table.setRowCount(0)
except Exception as e:
print(f"加载订单错误: {str(e)}")
QMessageBox.critical(self, "错误", f"加载订单失败: {str(e)}")
def get_selected_order_id(self):
"""获取选中的订单ID"""
selected = self.orders_table.selectedItems()
if not selected:
return None
return int(self.orders_table.item(selected[0].row(), 0).text())
def show_new_form(self):
"""显示新建订单表单"""
dialog = PurchaseOrderFormDialog(self)
if dialog.exec_() == QDialog.Accepted:
try:
order_data = dialog.get_order_data()
order_id = self.db.create_purchase_order(order_data, self.current_user.username)
QMessageBox.information(self, "成功", f"采购订单 #{order_id} 创建成功!")
self.load_orders()
except Exception as e:
QMessageBox.critical(self, "错误", f"创建采购订单失败: {str(e)}")
def show_edit_form(self):
"""显示编辑订单表单"""
order_id = self.get_selected_order_id()
if not order_id:
QMessageBox.warning(self, "选择错误", "请先选择一个订单")
return
# 获取订单详情
orders = self.db.get_purchase_orders()
order_data = next((o for o in orders if o[0] == order_id), None)
if not order_data:
QMessageBox.warning(self, "错误", "找不到选中的订单")
return
# 检查订单状态
if order_data[6] not in ["draft", "submitted"]:
QMessageBox.warning(self, "操作受限", "只能编辑草稿或已提交状态的订单")
return
# 创建订单对象
order = PurchaseOrder(
id=order_data[0],
order_number=order_data[1],
supplier_id=order_data[2],
supplier_name=order_data[11],
order_date=order_data[3],
expected_delivery_date=order_data[4],
total_amount=order_data[5],
status=order_data[6],
created_by=order_data[8],
created_at=order_data[9]
)
dialog = PurchaseOrderFormDialog(self, order)
if dialog.exec_() == QDialog.Accepted:
try:
update_data = dialog.get_order_data()
self.db.update_purchase_order(order_id, update_data, self.current_user.username)
QMessageBox.information(self, "成功", "采购订单更新成功!")
self.load_orders()
except Exception as e:
QMessageBox.critical(self, "错误", f"更新采购订单失败: {str(e)}")
def submit_order(self):
"""提交订单"""
order_id = self.get_selected_order_id()
if not order_id:
QMessageBox.warning(self, "选择错误", "请先选择一个订单")
return
# 检查订单状态
orders = self.db.get_purchase_orders()
order_data = next((o for o in orders if o[0] == order_id), None)
if not order_data:
QMessageBox.warning(self, "错误", "找不到选中的订单")
return
if order_data[6] != "draft":
QMessageBox.warning(self, "操作受限", "只能提交草稿状态的订单")
return
try:
self.db.submit_purchase_order(order_id, self.current_user.username)
QMessageBox.information(self, "成功", "采购订单提交成功!")
self.load_orders()
except Exception as e:
QMessageBox.critical(self, "错误", f"提交采购订单失败: {str(e)}")
def approve_order(self):
"""审核订单"""
order_id = self.get_selected_order_id()
if not order_id:
QMessageBox.warning(self, "选择错误", "请先选择一个订单")
return
# 检查订单状态
orders = self.db.get_purchase_orders()
order_data = next((o for o in orders if o[0] == order_id), None)
if not order_data:
QMessageBox.warning(self, "错误", "找不到选中的订单")
return
if order_data[6] != "submitted":
QMessageBox.warning(self, "操作受限", "只能审核已提交状态的订单")
return
try:
self.db.approve_purchase_order(order_id, self.current_user.username)
QMessageBox.information(self, "成功", "采购订单审核通过!")
self.load_orders()
except Exception as e:
QMessageBox.critical(self, "错误", f"审核采购订单失败: {str(e)}")
def show_order_details(self, index):
"""显示订单明细"""
row = index.row()
order_id = int(self.orders_table.item(row, 0).text())
try:
items = self.db.get_purchase_order_details(order_id)
self.items_table.setRowCount(len(items))
for row, item in enumerate(items):
self.items_table.setItem(row, 0, QTableWidgetItem(item['product_code']))
self.items_table.setItem(row, 1, QTableWidgetItem(item['product_name']))
self.items_table.setItem(row, 2, QTableWidgetItem(item['specification']))
self.items_table.setItem(row, 3, QTableWidgetItem(item['unit']))
self.items_table.setItem(row, 4, QTableWidgetItem(str(item['quantity'])))
self.items_table.setItem(row, 5, QTableWidgetItem(f"{item['unit_price']:.2f}"))
self.items_table.setItem(row, 6, QTableWidgetItem(f"{item['total_price']:.2f}"))
except Exception as e:
print(f"加载订单明细错误: {str(e)}")
最新发布