From 6cb30a21fdec4d27c8e3de1a9d264d9ae9a6cd29 Mon Sep 17 00:00:00 2001 From: yueli Date: Thu, 17 Sep 2026 11:26:36 +0800 Subject: [PATCH] =?UTF-8?q?feat(material):=20=E9=87=87=E8=B4=AD=E9=93=BE?= =?UTF-8?q?=E6=8E=A5=E6=8E=A5=E5=85=A5=E8=AF=BB=E5=86=99=E6=98=A0=E5=B0=84?= =?UTF-8?q?=E4=B8=8E=E6=9C=8D=E5=8A=A1=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit · models/base.py:新增 purchase_link 列(text)并加入 to_dict(purchaseLink) · field_permissions.py:读过滤映射 purchaseLink → material_list:purchaseLink · inbound/base.py:POST 与 PUT 两处 field_to_perm 同时补入(漏掉任一处, 新增/修改就会各缺一半) · base_service.py:create_material 写入、update_material 按字段存在与否更新 ★ 写侧刻意**显式纳入映射**而非依赖「不在映射中→默认允许」的兜底分支 —— 那个分支正是上一轮附件备注「谁都能写」的成因,新字段不再走它。 验证(6 个角色) SUPER_ADMIN / SUPERVISOR / WAREHOUSE_MGR / INBOUND → 读✓ 写✓ OUTBOUND / SALES → 读✗ 写✗ 读写逐角色一致;超管走 material_list:* 通配分支、过滤整段跳过(已单独复核)。 --- inventory-backend/app/api/v1/inbound/base.py | 6 ++++++ inventory-backend/app/models/base.py | 5 +++++ inventory-backend/app/services/inbound/base_service.py | 2 ++ inventory-backend/app/utils/field_permissions.py | 3 +++ 4 files changed, 16 insertions(+) diff --git a/inventory-backend/app/api/v1/inbound/base.py b/inventory-backend/app/api/v1/inbound/base.py index 6f9a5d5..7a0107e 100644 --- a/inventory-backend/app/api/v1/inbound/base.py +++ b/inventory-backend/app/api/v1/inbound/base.py @@ -276,6 +276,9 @@ def create(): # 会被 _expand_operation_perms 前缀桥接放大给 material_list:operation。 'productImageRemark': 'material_list:remark_edit', 'manualLinkRemark': 'material_list:remark_edit', + # 采购链接:与读过滤 field_permissions.py 用**同一个码**, + # 避免「写用一个码、读用另一个码」再次造成读写错位。 + 'purchaseLink': 'material_list:purchaseLink', 'referencePrice': 'material_list:referencePrice', 'isEnabled': 'material_list:isEnabled' } @@ -343,6 +346,9 @@ def update(id): # 会被 _expand_operation_perms 前缀桥接放大给 material_list:operation。 'productImageRemark': 'material_list:remark_edit', 'manualLinkRemark': 'material_list:remark_edit', + # 采购链接:与读过滤 field_permissions.py 用**同一个码**, + # 避免「写用一个码、读用另一个码」再次造成读写错位。 + 'purchaseLink': 'material_list:purchaseLink', 'referencePrice': 'material_list:referencePrice', 'isEnabled': 'material_list:isEnabled' } diff --git a/inventory-backend/app/models/base.py b/inventory-backend/app/models/base.py index 9456015..7e79ff9 100644 --- a/inventory-backend/app/models/base.py +++ b/inventory-backend/app/models/base.py @@ -33,6 +33,10 @@ class MaterialBase(db.Model): product_image_remark = db.Column(db.Text, default='', comment='产品图备注') manual_link_remark = db.Column(db.Text, default='', comment='说明书备注') + # 采购链接:补货时直接跳转的购买地址(淘宝 / 1688 等)。 + # ★ 用 Text 而非 String(N):外链常带很长的查询串,截断后会得到打不开的地址。 + purchase_link = db.Column(db.Text, default='', comment='采购链接') + # 启用状态 is_enabled = db.Column(db.Boolean, default=True, index=True, comment='是否启用') # ★ 状态过滤高频列 @@ -98,6 +102,7 @@ class MaterialBase(db.Model): 'generalImage': parse_list(self.product_image), 'productImageRemark': self.product_image_remark or '', 'manualLinkRemark': self.manual_link_remark or '', + 'purchaseLink': self.purchase_link or '', # 【核心修改】:直接返回布尔值,不再转成 1 或 0 'isEnabled': bool(self.is_enabled), # 强制质检标记 diff --git a/inventory-backend/app/services/inbound/base_service.py b/inventory-backend/app/services/inbound/base_service.py index a4a8e79..c03eeb9 100644 --- a/inventory-backend/app/services/inbound/base_service.py +++ b/inventory-backend/app/services/inbound/base_service.py @@ -622,6 +622,7 @@ class MaterialBaseService: product_image=json.dumps(data.get('generalImage', [])), product_image_remark=data.get('productImageRemark', ''), manual_link_remark=data.get('manualLinkRemark', ''), + purchase_link=data.get('purchaseLink', ''), reference_price=data.get('referencePrice'), is_enabled=is_enabled_val ) @@ -668,6 +669,7 @@ class MaterialBaseService: if 'productImageRemark' in data: material.product_image_remark = data['productImageRemark'] if 'manualLinkRemark' in data: material.manual_link_remark = data['manualLinkRemark'] + if 'purchaseLink' in data: material.purchase_link = data['purchaseLink'] if 'generalManual' in data: material.manual_link = json.dumps(data['generalManual']) diff --git a/inventory-backend/app/utils/field_permissions.py b/inventory-backend/app/utils/field_permissions.py index 7cf3312..86ad289 100644 --- a/inventory-backend/app/utils/field_permissions.py +++ b/inventory-backend/app/utils/field_permissions.py @@ -18,6 +18,9 @@ STOCK_FIELD_RBAC_MAPPING = { "generalImage": "material_list:files", "generalManual": "material_list:files", "productImageRemark": "material_list:productImageRemark", "manualLinkRemark": "material_list:manualLinkRemark", + # 采购链接:读写**共用同一个码**(与 referencePrice 同模式)—— + # 从根上避免「写用了 A 码、读用了 B 码」导致的口径错位。 + "purchaseLink": "material_list:purchaseLink", "referencePrice": "material_list:referencePrice", "inventoryCount": "material_list:inventoryCount", "availableCount": "material_list:availableCount",