入库模块:物料搜索点击无感修复 + 类别校验白名单准入制

前端(buy/semi/product/service.vue,4 文件):

修复物料搜索"点击已聚焦 input 时内容被清空"交互 bug。

el-select 在 filterable+remote 模式下点击已聚焦的 input 时,el-select 内部

会 emit query='' 触发 remote-method,绕过 handleMaterialDropdownVisible

入口保护,直接清空 searchKeyword 和 materialOptions,导致用户被迫重写。

新增两层防御实现"编辑无感":

1) handleMaterialDropdownVisible 入口拦截:已选过物料(form.base_id 有值)

   时下拉打开直接 return,不请求默认列表

2) handleSearchMaterial 内部拦截:拦截 el-select 内部 emit 的空 query,

   仅在 form.base_id 有值 + safeQuery 为空 + 列表非空时 return

后端(buy/semi/product_service.py,3 文件):

入库类别校验从黑名单改为白名单准入制,彻底杜绝"成品进半成品库"

等非法组合(d94b52b 黑名单方案"成品不能进采购库"已挡不住这种组合)。

- buy_service.py: 黑名单(禁半成品/成品进采购)→ 白名单(必须含"原材料")

- semi_service.py: 统一错误信息格式为"只有【半成品】才允许半成品入库!"

- product_service.py: 统一错误信息格式为"只有【成品】才允许成品入库!"

- 三处空 category 统一显示为"未分类"

配合前端已修复的 catch 块(e.response.data.msg 精准提取),后端新错误

信息可原样弹窗给用户。
This commit is contained in:
DXC
2026-06-04 17:57:17 +08:00
parent d94b52bf73
commit ff5418afa3
7 changed files with 67 additions and 27 deletions

View File

@ -101,10 +101,10 @@ class BuyInboundService:
if not material.is_enabled: raise ValueError(f"物料【{material.name}】已停用")
# ============================================================
# 物料类别隔离校验:采购入库禁止"半成品"/"成品"
# 物料类别隔离校验:采购入库必须为"原材料"类目(白名单准入制)
# ============================================================
if material.category and ("半成品" in material.category or "成品" in material.category):
raise ValueError(f"物料【{material.name}类别为{material.category}】,禁止作为采购入库!")
if not material.category or "原材料" not in material.category:
raise ValueError(f"物料【{material.name}属于{material.category or '未分类'}】,只有【原材料】才允许采购入库!")
# ============================================================
# 强制质检校验:如果物料标记为强制质检,则必须提供到检状态和检测报告

View File

@ -116,10 +116,10 @@ class ProductInboundService:
raise ValueError(f"物料【{material.name}】已停用,无法办理新入库。")
# ============================================================
# 物料类别隔离校验:成品入库必须为"成品"类目
# 物料类别隔离校验:成品入库必须为"成品"类目(白名单准入制)
# ============================================================
if not material.category or "成品" not in material.category:
raise ValueError(f"物料【{material.name}类别为{material.category or ''}】,非成品,无法办理成品入库!")
raise ValueError(f"物料【{material.name}属于{material.category or '未分类'}】,只有【成品】才允许成品入库!")
ProductInboundService._check_unique(
serial_number=data.get('serial_number')

View File

@ -123,10 +123,10 @@ class SemiInboundService:
raise ValueError(f"物料【{material.name}】已停用,无法办理新入库。")
# ============================================================
# 物料类别隔离校验:半成品入库必须为"半成品"类目
# 物料类别隔离校验:半成品入库必须为"半成品"类目(白名单准入制)
# ============================================================
if not material.category or "半成品" not in material.category:
raise ValueError(f"物料【{material.name}类别为{material.category or ''}】,非半成品,无法办理半成品入库!")
raise ValueError(f"物料【{material.name}属于{material.category or '未分类'}】,只有【半成品】才允许半成品入库!")
SemiInboundService._check_unique(
base_id=base_id,