item_get - 获得1688商品详情

item_get - 获得1688商品详情
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Result Object:

{
“item”: {
“num_iid”: “533816674053”,
“title”: “批发男女士复古大号石英怀表时尚创意个性手表镂空蜘蛛网爱心怀表”,
“desc_short”: “”,
“price”: “8.60”,
“total_price”: 0,
“suggestive_price”: 0,
“orginal_price”: “8.60”,
“nick”: “尚我佳日用品厂”,
“num”: “2189”,
“min_num”: “2”,
“detail_url”: “https://detail.1688.com/offer/533816674053.html”,
“pic_url”: “https://cbu01.alicdn.com/img/ibank/2016/185/473/3126374581_294023583.jpg”,
“brand”: “other”,
“brandId”: “”,
“rootCatId”: “”,
“cid”: “124264005”,
“favcount”: 0,
“fanscount”: 0,
“crumbs”: [],
“created_time”: “”,
“modified_time”: “”,
“delist_time”: “”,
“desc”: “<div id=“offer-template-0”><p align=“center” style=“text-align: center;”><span style=“font-size: 16.0pt;”><img alt=“JGA24Z3CAJ){ONI8]VRYKO\" src=\"https://cbu01.alicdn.com/img/ibank/2015/633/662/2369266336_772719574.jpg\" /><br /><br /></strong></span></p><p align=\"center\" style=\"text-align: center;\"><span style=\"font-size: 16.0pt;\"><strong>材质:合金</strong></span></p><p align=\"center\" style=\"text-align: center;\"><span style=\"font-size: 16.0pt;\"><strong>机芯:普通国产机芯</strong></span></p><p align=\"center\" style=\"text-align: center;\"><span style=\"font-size: 16.0pt;\"><strong>表直径:4.5CM</strong></span></p><p align=\"center\" style=\"text-align: center;\"><span style=\"font-size: 16.0pt;\"><strong>链长:80CM(配套链条为普通细金属链)</strong></span></p><p align=\"center\" style=\"text-align: center;\"><span style=\"font-size: 16.0pt;\"><strong><img alt=\"6XAG~FMI%4(AQE8}}~A9YV8\" src=\"https://cbu01.alicdn.com/img/ibank/2015/532/163/2372361235_772719574.jpg\" /><br /></strong></span></p><p><img align=\"absmiddle\" src=\"https://img.alicdn.com/imgextra/i4/2467807969/TB2PwEDdVXXXXaaXXXXXXXXXXXX-2467807969.jpg\" style=\"display: block;margin-left: auto;margin-right: auto;\" /></p><table border=\"0\"><tr><td><p><img align=\"absmiddle\" src=\"https://img.alicdn.com/imgextra/i4/2467807969/TB2SuJCnFXXXXX3XFXXXXXXXXXX_!!2467807969.jpg\" /><img align=\"absmiddle\" src=\"https://img.alicdn.com/imgextra/i4/2467807969/TB2yDXEnFXXXXc9XpXXXXXXXXXX_!!2467807969.jpg\" /><img align=\"absmiddle\" src=\"https://img.alicdn.com/imgextra/i1/2467807969/TB2IZ0UnFXXXXagXpXXXXXXXXXX_!!2467807969.jpg\" /><img align=\"absmiddle\" src=\"https://img.alicdn.com/imgextra/i2/2467807969/TB2agiinFXXXXajXXXXXXXXXXXX_!!2467807969.jpg\" /><img align=\"absmiddle\" src=\"https://img.alicdn.com/imgextra/i4/2467807969/TB2Jx1inFXXXXakXXXXXXXXXXXX_!!2467807969.jpg\" /><img align=\"absmiddle\" src=\"https://img.alicdn.com/imgextra/i2/2467807969/TB2XPpQnFXXXXaYXpXXXXXXXXXX_!!2467807969.jpg\" /><img align=\"absmiddle\" src=\"https://img.alicdn.com/imgextra/i2/2467807969/TB2.eynnFXXXXXnXXXXXXXXXXXX_!!2467807969.jpg\" /></p></td></tr><tr><td>&nbsp;</td></tr><tr><td><p>&nbsp;</p></td></tr><tr><td><p>&nbsp;</p><p>&nbsp;</p></td></tr><tr><td><p>&nbsp;</p></td></tr></table><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><div><a name=\"hlg_list_2_12403650_end\"></a></div><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p><img align=\"absmiddle\" height=\"500\" src=\"https://img.alicdn.com/imgextra/i4/1996001085/T2u1ytXA0aXXXXXXXX-1996001085.png\" style=\"display: block;margin-left: auto;margin-right: auto;\" width=\"750\" /></p><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p><img align=\"absmiddle\" height=\"500\" src=\"https://img.alicdn.com/imgextra/i2/1996001085/T2w2KSXNXaXXXXXXXX-1996001085.png\" style=\"display: block;margin-left: auto;margin-right: auto;\" width=\"750\" /></p><p align=\"center\"><span style=\"font-size: 16.0pt;\"><strong>&nbsp;</strong></span></p><div style=\"text-align: center;\"><span style=\"font-size: 22.0pt;\"><strong>用送礼对象&nbsp;客户、同事、同学、朋友、外国人、青年、少年</strong>&nbsp;</span><br /><br /><span style=\"font-size: 22.0pt;\"><strong>适用送礼场合&nbsp;公关策划、商务馈赠、感恩节、婚庆、七夕节、情人节、生日、圣诞节、万圣节、约会&nbsp;</strong></span></div><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p style=\"text-align: center;\"><span style=\"font-size: 22.0pt;\"><strong>&nbsp;该款复古个性怀表,是古铜色的,正面设计为精致的立体皇冠,</strong></span></p><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p style=\"text-align: center;\"><span style=\"font-size: 22.0pt;\"><strong>背面为雕刻的复古花纹,无论是那一面都让您彰显个性。</strong></span></p><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p style=\"text-align: center;\"><span style=\"font-size: 22.0pt;\"><strong>小巧精致,复古的感觉中又不失可爱、时尚的风格,</strong></span></p><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p style=\"text-align: center;\"><span style=\"font-size: 22.0pt;\"><strong>是搭配休闲服饰的好选择,也是搭配毛衣的毛衣链。^_^</strong></span></p><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p style=\"text-align: center;\"><span style=\"font-size: 22.0pt;\">&nbsp;</span></p><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p align=\"center\" style=\"text-align: center;\"><span style=\"font-size: 22.0pt;\">材质:合金</span></p><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p align=\"center\" style=\"text-align: center;\"><span style=\"font-size: 22.0pt;\">重量:0.025KG</span></p><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p align=\"center\" style=\"text-align: center;\"><span style=\"font-size: 22.0pt;\">尺寸(单位CM):链长78CM,坠款2.8CM,坠厚1.1CM</span></p><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p align=\"center\" style=\"text-align: center;\"><span style=\"font-size: 22.0pt;\">人手测量,误差请谅解!</span></p><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p align=\"center\" style=\"text-align: center;\"><span style=\"font-size: 22.0pt;\"><strong>小号.这个季节搭配服装很不错.</strong></span></p><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p align=\"center\" style=\"text-align: center;\"><span style=\"font-size: 22.0pt;\"><strong>是真表 可以换电池</strong></span></p><p align=\"center\"><span style=\"font-size: 16.0pt;\"><strong>&nbsp;</strong></span></p><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p style=\"text-align: center;\">&nbsp;</p><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p style=\"text-align: center;\"><span><img src=\"https://img.alicdn.com/imgextra/i3/99814728/TB2p9Q6dpXXXXavXXXXXXXXXXXX_!!99814728.jpg\" /><br /><br /><img src=\"https://img.alicdn.com/imgextra/i3/99814728/TB2p9PpcVXXXXchXXXXXXXXXXXX_!!99814728.jpg\" /><br /><br /><img src=\"https://img.alicdn.com/imgextra/i1/99814728/TB2rYFulFXXXXX_XXXXXXXXXXXX_!!99814728.jpg\" /><br /><br /><img src=\"https://img.alicdn.com/imgextra/i1/99814728/TB2Um1WcVXXXXc3XXXXXXXXXXXX_!!99814728.jpg\" /><br /><br /><img src=\"https://img.alicdn.com/imgextra/i2/99814728/TB2gOVmlFXXXXb0XpXXXXXXXXXX_!!99814728.jpg\" /><br /><br /></span></p><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><div style=\"text-align: center;\">&nbsp;</div><p align=\"center\" style=\"text-align: center;\">&nbsp;</p><p align=\"center\" style=\"text-align: center;\"><strong><span style=\"font-size: 14.0pt;\">&nbsp;</span></strong></p><p align=\"center\" style=\"text-align: center;\"><strong><span style=\"font-size: 14.0pt;\"><img alt=\"FFQQD}MB0XH0K}ZZ{RAYP$I\" src=\"https://cbu01.alicdn.com/img/ibank/2015/455/244/2372442554_772719574.jpg\" style=\"display: block;margin-left: auto;margin-right: auto;\" /><br /><br /><img alt=\"H4@OWV7ZD1CL87J]}D`%LY” src=“https://cbu01.alicdn.com/img/ibank/2015/460/844/2372448064_772719574.jpg” />

<ul style=“text-align: center;”><li style=“text-align: left;”><span style=“font-size: 14.0pt;”>本店商品图片均为实物拍摄,所见即所得, 因显示器分辨率和色彩饱和度不同,有可能产生色差,不能接受色差者,请慎拍.<li style=“text-align: left;”><span style=“font-size: 14.0pt;”>拍之前请先询问是否有货,如果您拍的宝贝产生缺货情况,您可以选择更换同等价格的其他宝贝或者要求我们退款.<li style=“text-align: left;”><span style=“font-size: 14.0pt;”>我们建议买家用支付宝付款,安全,省心,快捷,如果需要网银付款的,请及时联系我们.<li style=“text-align: left;”><span style=“font-size: 14.0pt;”>速度运输受路况、天气、节假日等各种因素影响,运送时间上会有波动,如有较长时间未到,本店会积极吸住查询并崔促速递派送,但如遇到特别紧急包裹需要限制运送时间的情况,请务必提前声明,以免发生因速递延迟造成礼物不能准时派送的情况,航空公司禁运一切电子产品,所有电子产品只能走汽运,无耐心等待者慎拍.<li style=“text-align: left;”><span style=“font-size: 14.0pt;”>请签收快递时一定要当场打开查收,无问题才签收,如有问题,请拒绝签收,并第一时间联系我们,如签收即默认商品无任何问题,如签收后范瑛宝贝有问题的,一律视为认为造成(导致换货来回运费买家承担),为保证买家利益,请当面签收.<li style=“text-align: left;”><span style=“font-size: 14.0pt;”>退换货:请再购买前看清楚,一旦确定,宝贝无质量问题的情况下恕不退换(如收到货的手表和图片不一致,可选择退换服务。如有质量问题的可换货.)需要退换货的必须在收到货的24小时内联系本店,包裹退回来请在包裹的右上方写上您的淘宝用户名和您的地址手机,如没注明有可能没办法准时退换.退回来的手表必须无划痕,无磨损,表带没拆过,麻烦退回来之前仔细看一下表带,表扣,表头,不影响二次销售,拒绝签收任何到付件.<li style=“text-align: left;”><span style=“font-size: 14.0pt;”>本店所有产品都是低利润销售,价格是不含表盒的,如需要表盒,需加价RMB1.5/只.<li style=“text-align: left;”><span style=“font-size: 14.0pt;”>为保证您的利益,务必阅读并确认同意以上内容.”,
“item_imgs”: [
{
“url”: “https://cbu01.alicdn.com/img/ibank/2016/185/473/3126374581_294023583.jpg”
},
{
“url”: “https://cbu01.alicdn.com/img/ibank/2016/910/830/3125038019_294023583.jpg”
},
{
“url”: “https://cbu01.alicdn.com/img/ibank/2016/378/863/3126368873_294023583.jpg”
},
{
“url”: “https://cbu01.alicdn.com/img/ibank/2016/877/563/3126365778_294023583.jpg”
},
{
“url”: “https://cbu01.alicdn.com/img/ibank/2016/039/704/3127407930_294023583.jpg”
}
],
“item_weight”: “”,
“item_size”: “”,
“location”: “广东 广州”,
“post_fee”: “”,
“express_fee”: 9,
“ems_fee”: “”,
“shipping_to”: “”,
“has_discount”: “”,
“video”: [],
“is_virtual”: “”,
“sample_id”: “”,
“is_promotion”: “”,
“props_name”: “0:0:小号:;0:1:中号:;0:2:大号:”,
“prop_imgs”: {
“prop_img”: []
},
“property_alias”: “0:0:小号;0:1:中号;0:2:大号”,
“props”: [
{
“name”: “品牌”,
“value”: “other”
},
{
“name”: “是否进口”,
“value”: “否”
},
{
“name”: “加印LOGO”,
“value”: “不可以”
},
{
“name”: “加工定制”,
“value”: “否”
},
{
“name”: “显示类型”,
“value”: “指针”
},
{
“name”: “适用人群”,
“value”: “通用”
},
{
“name”: “风格”,
“value”: “仿古”
},
{
“name”: “是否专利货源”,
“value”: “否”
},
{
“name”: “防水”,
“value”: “不可以”
},
{
“name”: “机芯种类”,
“value”: “石英”
},
{
“name”: “机芯品牌”,
“value”: “68”
},
{
“name”: “机芯产地”,
“value”: “中国”
},
{
“name”: “机芯型号”,
“value”: “68”
},
{
“name”: “厚度”,
“value”: “12mm”
},
{
“name”: “表盘直径”,
“value”: “46mm”
},
{
“name”: “镜面材质”,
“value”: “有机玻璃镜面”
},
{
“name”: “表带材质”,
“value”: “金属链”
},
{
“name”: “表盘形状”,
“value”: “圆形”
},
{
“name”: “表壳材质”,
“value”: “合金”
},
{
“name”: “产地(国内)”,
“value”: “广东省”
},
{
“name”: “货号”,
“value”: “0095”
},
{
“name”: “售后服务”,
“value”: “店铺保修”
},
{
“name”: “颜色”,
“value”: “小号,中号,大号”
}
],
“total_sold”: null,
“skus”: {
“sku”: [
{
“properties”: “0:0”,
“properties_name”: “0:0:颜色:小号”,
“price”: “7.70”,
“orginal_price”: “7.70”,
“quantity”: 715,
“sku_id”: 3184603612387
},
{
“properties”: “0:1”,
“properties_name”: “0:1:颜色:中号”,
“price”: “8.60”,
“orginal_price”: “8.60”,
“quantity”: 740,
“sku_id”: 3184603612388
},
{
“properties”: “0:2”,
“properties_name”: “0:2:颜色:大号”,
“price”: “8.60”,
“orginal_price”: “8.60”,
“quantity”: 734,
“sku_id”: 3184603612389
}
]
},
“seller_id”: “2620712400”,
“sales”: “0”,
“shop_id”: “”,
“props_list”: {
“0:0”: “颜色:小号”,
“0:1”: “颜色:中号”,
“0:2”: “颜色:大号”
},
“seller_info”: {
“level”: “”,
“shop_type”: “A”,
“user_num_id”: “2620712400”,
“cid”: null,
“delivery_score”: null,
“item_score”: null,
“score_p”: null,
“city”: “广东 广州”,
“nick”: “尚我佳日用品厂”,
“sid”: “”,
“company_name”: “深圳市福田区尚我佳日用制品厂”,
“title”: “深圳市福田区尚我佳日用制品厂”,
“shop_name”: “深圳市福田区尚我佳日用制品厂”,
“zhuy”: “https://shop1440418029006.1688.com”
},
“tmall”: “false”,
“error”: “”,
“warning”: “”,
“url_log”: [],
“is_support_mix”: “true”,
“mix_amount”: “30”,
“mix_begin”: “”,
“mix_number”: “3”,
“priceRange”: null,
“priceRangeOriginal”: null,
“m_weight”: “”,
“j_weight”: “”,
“volume”: “”,
“props_img”: [],
“shop_item”: [],
“relate_items”: []
},
“secache”: “a5a215d61b3bf89d16490773196f0458”,
“secache_time”: 1576484124,
“secache_date”: “2019-12-16 16:15:24”,
“translate_status”: “error”,
“translate_time”: 0.001,
“language”: {
“current_lang”: “zh-CN”,
“source_lang”: “cn”
},
“cache”: 1,
“api_info”: “today:1 max:500003”,
“execution_time”: 0.246,
“server_time”: “Beijing/2019-12-18 11:06:41”,
“call_args”: {
“num_iid”: “533816674053”,
“area_id”: “440111”
},
“api_type”: “1688”,
“translate_language”: “zh-CN”,
“translate_engine”: “google_cn”,
“request_id”: “.13740106.5df997c0dff988.17272152”
}
下面会给你一段简易进销存系统的代码片段,现在出现问题我无法解决,请你帮我分析并解决问题。我会给你项目的文件结构,如果你发现所给你的文件代码无法分析出问题,可以向我索要其余需要的文件代码。 问题:采购管理模块内采购订单功能内,在新建订单添加物料时点击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、付费专栏及课程。

余额充值