refactor(bom): 前端改为消费后端分配结果,删除本地分配与跨页数据污染

一、删除前端分配算法
  Selection.vue 与 borrow/apply/index.vue 原先各自维护一套
  rowsByBaseId 归并 + 跨行分配循环(近 80 行),现全部移除。
  改为:构造 requirements → 调用 bomMatchStock → 直接 push 返回的 items。

二、缺料提示
  后端返回 shortages 时,用 ElMessageBox.alert 逐项列出
  「物料名:需 X,实配 Y,缺 Z」,替代原先笼统的「跳过 N 种缺货物料」。
  全部满足则不弹窗,仅提示添加成功。

三、API 封装支持双签名(api/outbound.ts)
  bomMatchStock(requirements | { requirements })
  同时兼容旧的 bomMatchStock(childIds),未改造的调用方不受影响。

四、清除 loadStockForBom(两个页面)
  该方法会把 BOM 匹配结果整体写入 stockList.value,而 stockList 同时是
  「手动选单弹窗」的数据源 —— 操作过 BOM 后再打开手动选单,看到的会是
  BOM 匹配结果而非库存列表。BOM 流程不再触碰 stockList 后,该交叉污染
  一并消除,方法随之删除。

注:借库选单页存在逐字相同的 .find() + Math.min 缺陷,本次一并修复,
使两个 BOM 入口行为一致。

SFC 编译通过;vue-tsc 无新增错误(残留 6 处告警为既有问题)。
This commit is contained in:
yueli
2026-09-10 14:16:52 +08:00
parent a910a6ea72
commit 0a70e5688a
3 changed files with 158 additions and 121 deletions

View File

@ -144,14 +144,30 @@ export function closeRequest(id: number) {
})
}
/** BOM 需求项:后端据此在 DB 层完成跨批次分配 */
export interface BomRequirement {
base_id: number
required_qty: number
name?: string
spec_model?: string
}
/**
* BOM 匹配库存(替代前端 while(true) 全量加载)
* 根据 BOM 子件的 base_id 列表,服务端精确查询有库存的记录
* BOM 库存匹配 / 分配
*
* 两种用法:
* 1) 分配模式(推荐):传 { requirements },后端直接返回已分配好的库存行
* (含 stock_id / source_table / allocated_qty)与 shortages 缺料明细,
* 前端直接入购物车即可,不做任何分配运算。
* 2) 查询模式(兼容旧调用):传 base_id 数组,返回全部匹配库存行。
*/
export function bomMatchStock(childIds: number[]) {
export function bomMatchStock(payload: BomRequirement[] | { requirements: BomRequirement[] }) {
const data = Array.isArray(payload)
? { child_ids: payload } // 旧签名兼容
: { requirements: payload.requirements || [] }
return request({
url: '/v1/outbound/bom-match-stock',
method: 'post',
data: { child_ids: childIds }
data
})
}