feat(material): 采购链接接入读写映射与服务层
· 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:* 通配分支、过滤整段跳过(已单独复核)。
This commit is contained in:
@ -276,6 +276,9 @@ def create():
|
|||||||
# 会被 _expand_operation_perms 前缀桥接放大给 material_list:operation。
|
# 会被 _expand_operation_perms 前缀桥接放大给 material_list:operation。
|
||||||
'productImageRemark': 'material_list:remark_edit',
|
'productImageRemark': 'material_list:remark_edit',
|
||||||
'manualLinkRemark': 'material_list:remark_edit',
|
'manualLinkRemark': 'material_list:remark_edit',
|
||||||
|
# 采购链接:与读过滤 field_permissions.py 用**同一个码**,
|
||||||
|
# 避免「写用一个码、读用另一个码」再次造成读写错位。
|
||||||
|
'purchaseLink': 'material_list:purchaseLink',
|
||||||
'referencePrice': 'material_list:referencePrice',
|
'referencePrice': 'material_list:referencePrice',
|
||||||
'isEnabled': 'material_list:isEnabled'
|
'isEnabled': 'material_list:isEnabled'
|
||||||
}
|
}
|
||||||
@ -343,6 +346,9 @@ def update(id):
|
|||||||
# 会被 _expand_operation_perms 前缀桥接放大给 material_list:operation。
|
# 会被 _expand_operation_perms 前缀桥接放大给 material_list:operation。
|
||||||
'productImageRemark': 'material_list:remark_edit',
|
'productImageRemark': 'material_list:remark_edit',
|
||||||
'manualLinkRemark': 'material_list:remark_edit',
|
'manualLinkRemark': 'material_list:remark_edit',
|
||||||
|
# 采购链接:与读过滤 field_permissions.py 用**同一个码**,
|
||||||
|
# 避免「写用一个码、读用另一个码」再次造成读写错位。
|
||||||
|
'purchaseLink': 'material_list:purchaseLink',
|
||||||
'referencePrice': 'material_list:referencePrice',
|
'referencePrice': 'material_list:referencePrice',
|
||||||
'isEnabled': 'material_list:isEnabled'
|
'isEnabled': 'material_list:isEnabled'
|
||||||
}
|
}
|
||||||
|
|||||||
@ -33,6 +33,10 @@ class MaterialBase(db.Model):
|
|||||||
product_image_remark = db.Column(db.Text, default='', comment='产品图备注')
|
product_image_remark = db.Column(db.Text, default='', comment='产品图备注')
|
||||||
manual_link_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='是否启用') # ★ 状态过滤高频列
|
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),
|
'generalImage': parse_list(self.product_image),
|
||||||
'productImageRemark': self.product_image_remark or '',
|
'productImageRemark': self.product_image_remark or '',
|
||||||
'manualLinkRemark': self.manual_link_remark or '',
|
'manualLinkRemark': self.manual_link_remark or '',
|
||||||
|
'purchaseLink': self.purchase_link or '',
|
||||||
# 【核心修改】:直接返回布尔值,不再转成 1 或 0
|
# 【核心修改】:直接返回布尔值,不再转成 1 或 0
|
||||||
'isEnabled': bool(self.is_enabled),
|
'isEnabled': bool(self.is_enabled),
|
||||||
# 强制质检标记
|
# 强制质检标记
|
||||||
|
|||||||
@ -622,6 +622,7 @@ class MaterialBaseService:
|
|||||||
product_image=json.dumps(data.get('generalImage', [])),
|
product_image=json.dumps(data.get('generalImage', [])),
|
||||||
product_image_remark=data.get('productImageRemark', ''),
|
product_image_remark=data.get('productImageRemark', ''),
|
||||||
manual_link_remark=data.get('manualLinkRemark', ''),
|
manual_link_remark=data.get('manualLinkRemark', ''),
|
||||||
|
purchase_link=data.get('purchaseLink', ''),
|
||||||
reference_price=data.get('referencePrice'),
|
reference_price=data.get('referencePrice'),
|
||||||
is_enabled=is_enabled_val
|
is_enabled=is_enabled_val
|
||||||
)
|
)
|
||||||
@ -668,6 +669,7 @@ class MaterialBaseService:
|
|||||||
|
|
||||||
if 'productImageRemark' in data: material.product_image_remark = data['productImageRemark']
|
if 'productImageRemark' in data: material.product_image_remark = data['productImageRemark']
|
||||||
if 'manualLinkRemark' in data: material.manual_link_remark = data['manualLinkRemark']
|
if 'manualLinkRemark' in data: material.manual_link_remark = data['manualLinkRemark']
|
||||||
|
if 'purchaseLink' in data: material.purchase_link = data['purchaseLink']
|
||||||
|
|
||||||
if 'generalManual' in data:
|
if 'generalManual' in data:
|
||||||
material.manual_link = json.dumps(data['generalManual'])
|
material.manual_link = json.dumps(data['generalManual'])
|
||||||
|
|||||||
@ -18,6 +18,9 @@ STOCK_FIELD_RBAC_MAPPING = {
|
|||||||
"generalImage": "material_list:files", "generalManual": "material_list:files",
|
"generalImage": "material_list:files", "generalManual": "material_list:files",
|
||||||
"productImageRemark": "material_list:productImageRemark",
|
"productImageRemark": "material_list:productImageRemark",
|
||||||
"manualLinkRemark": "material_list:manualLinkRemark",
|
"manualLinkRemark": "material_list:manualLinkRemark",
|
||||||
|
# 采购链接:读写**共用同一个码**(与 referencePrice 同模式)——
|
||||||
|
# 从根上避免「写用了 A 码、读用了 B 码」导致的口径错位。
|
||||||
|
"purchaseLink": "material_list:purchaseLink",
|
||||||
"referencePrice": "material_list:referencePrice",
|
"referencePrice": "material_list:referencePrice",
|
||||||
"inventoryCount": "material_list:inventoryCount",
|
"inventoryCount": "material_list:inventoryCount",
|
||||||
"availableCount": "material_list:availableCount",
|
"availableCount": "material_list:availableCount",
|
||||||
|
|||||||
Reference in New Issue
Block a user