orders 表单查询收货人地址的操作

本文详细介绍了在特定Action中使用Struts框架查询orders表单收货人地址的实现方式,包括服务调用、分页展示及JSON返回格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

orders 表单查询收货人地址的操作

orersAction中的代码
public String findAddressLists(){
        System.out.println("查询中");
        int count=sendAddressService.getCount(SendAddress.class, "");
        System.out.println("总记录数");
        this.setPagination(new Pagination(this.getPage(),count,this.getRows()));
        List<SendAddress> datas=sendAddressService.getObjects(SendAddress.class,
                this.pagination.getRowFrom(), this.pagination.getRowTo(), "", "");
        for(SendAddress entityssss:datas){
            System.out.println(entityssss.getAddress());
        }
        this.pagination.setRows(datas);
        return SUCCESS;
    }
}
struts-orders.xml中的代码

<!--查询送货地址-->
        <action name="findAddressLists" class="cn.csdn.hr.buy360.action.OrdersAction" method="findAddressLists">
            <result type="json">
                <param name="root">pagination</param>
                <param name="excludeNullProperties">true</param>
            </result>
        </action>
js中的代码

function sendAddressList() {
    alert("查询送货地址");
    $("#openSendAddress").window('open');
    $("#sendAddressLists").datagrid({
        loadMsg : "数据加载中....",
        width : 800,
        height : 400,
        nowrap : false,// 时候显示在第一行
        striped : true,// 是否隔行变色
        url : '../../csdn/findAddressLists.action',
        sortName : 'id', // 定义排列的名称
        sortOrder : 'asc',// 定义排列的方式 asc desc两种
        remoteSort : false, // 定义是否从服务器给数据排序
        idField : 'id', // 标识字段
        fitColumns : false, // 是否自动设置列的宽度
        singleSelect : false,// 是否只选择一行
        frozenColumns : [ [ {
            field : '排序',
            checkbox : true
        }, {
            title : '编号',
            field : 'id',
            width : 50,
            sortable : true
        } ] ],
        columns : [ [ {
            field:'recieveName',
            title : '收货人名称 ',
            colspan : 90
        } ], [ {
            field : 'address',
            title : '收获地址',
            width : 90
        }, {
            field : 'phone',
            title : '收货电话',
            width : 90

        }, {
            field : 'postCode',
            title : '邮编',
            width : 90
        }, {
            field : 'customers',
            title : '客户',
            width : 90
        } ] ],
        pagination : true
    });
}
使用Java,要求完成具备完整前后端功能的系统项目设计。 12、在线花店销售系统 项目目的 搭建线上花店销售平台,实现花卉商品展示、在线订购、订单管理等功能,为商家拓展销售渠道,为客户提供便捷购花服务。 项目模块 •商品管理模块 ◦添加商品:商家录入花卉名称、品种、价格、花语、图片、库存、养护知识等信息。 ◦编辑商品:修改商品价格、库存、描述等信息,更新商品图片。 ◦删除商品:下架不再销售的花卉商品。 ◦查询商品:用户按名称、品种、价格区间等搜索商品,查看商品详情及用户评价。 •订单管理模块 ◦生成订单:用户选择商品、数量、配送时间、收货地址,提交订单,系统计算订单金额,生成订单号。 ◦订单支付:集成第三方支付接口(微信支付、支付宝),完成在线支付,记录支付流水 ◦订单状态更新:包括待支付、已支付、已发货、已签收、已取消等状态,实时通知用户订单进度 ◦订单查询:用户查看个人订单记录,商家查询所有订单,处理发货、退款等操作。 •配送管理模块 ◦配送信息录入:商家填写物流单号、物流公司,更新商品配送状态。 ◦配送跟踪:用户查询订单物流信息,查看商品运输进度。 •会员管理模块 ◦会员注册登录:支持手机号、邮箱注册,第三方账号登录,填写会员昵称、联系方 式等信息。 ◦会员等级:根据消费金额划分会员等级,提供不同折扣、积分、优先配送等权益。 ◦积分管理:消费、评价获取积分,积分可兑换商品或抵扣现金。 关键字段 商品ID、订单号、会员ID、物流单号、支付状态、会员等级 技术要求 •前端:运用HTML、CSS、JavaScript搭建界面,可结合Vue.js或React.js框架,实现表单提交、数据展示等交互功能。 •后端:基于Java语言,借助SpringBoot框架构建服务,处理数据库操作与业务逻辑,通过RESTfulAPI实现前后端数据交互。 •数据库:采用MySQL数据库合理设计结构及关联关系。 其他要求 系统具备商品推荐功能(基于用户浏览和购买历史);提供花艺知识文章推送;保障支付安全,遵循支付接口规范。
06-26
这是一个企业用简易的进销存系统中的部分代码,现在这个模块出现问题,在新建订单添加物料时点击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)}")
07-22
下面会给你一段简易进销存系统的代码片段,现在出现问题我无法解决,请你帮我分析并解决问题。我会给你项目的文件结构,如果你发现所给你的文件代码无法分析出问题,可以向我索要其余需要的文件代码。 问题:采购管理模块内采购订单功能内,在新建订单添加物料时点击ok添加无效,随即程序崩溃。 文件结构: main.py user_auth ----auth_manager.py ----change_password_dialog.py ----user_auth_db.py ----first_login_dialog.py ----login_window.py ----password_utils.py ----user_model.py ----app_data.db window_main ----app_styles.qss ----main_window.py ----module_buttons.py ----navigation.py ----status_bar.py basicData_manager ----basic_data_db.py ----basic_data_manager.py ----basic_data_models.py ----customer_manager.py ----product_manager.py ----supplier_manager.py purchase_manager ----purchase_db.py ----purchase_in_manager.py ----purchase_main.py ----purchase_models.py ----purchase_order_manager.py ----purchase_payment_manager.py ----purchase_return_manager.py # purchase_manager/purchase_order_manager 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): """打开物料选择对话框""" print("打开物料选择对话框...") dialog = ProductSelectionDialog(self) if dialog.exec_() == QDialog.Accepted: print(f"物料选择对话框返回: 选择了 {len(dialog.selected_products)} 个物料") for i, product in enumerate(dialog.selected_products): print(f"添加物料 {i + 1}: ID={product['id']}, 名称={product['name']}") # 检查是否已添加过该物料 existing = next((item for item in self.items if item.get("id") == product["id"]), None) if existing: print(f"物料 {product['id']} 已存在,增加数量") # ... 现有代码 ... else: print(f"物料 {product['id']} 是新物料,添加到格") self.add_item_to_table(product) # 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 # 确保传入正确的数据库对象 if db is None or not hasattr(db, 'get_purchase_orders'): # 创建正确的数据库实例 self.db = PurchaseDB() print(f"创建新的 PurchaseDB 实例: {type(self.db)}") else: self.db = db print(f"使用传入的 PurchaseDB 实例: {type(self.db)}") 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)}") # 添加更详细的错误信息 import traceback traceback.print_exc() 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)}")
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值