fix(web): 扫码页与备选库位带单据ID,按有效可用量限流

配合后端预占回加:扫码/借库/审批页面调用 /outbound/scan 与 /outbound/alternatives
时带上本单 id 与 biz_type,拿到的 available_quantity 即为「实时可用量 + 本单
预占」,本单锁定的行不会再因实时可用量为 0 而被拦住或从列表消失。

后端已在响应边界完成归一化,故前端模板与校验逻辑(:max、库存列展示、超量
警告、草稿存取)一律不动,只多传参数 —— 避免把同一语义散落到多个读写点。

- api/outbound.ts:getStockByBarcode / getStockAlternatives 加 requestId 与
  bizType 参数,导出 ScanBizType,ScanResult 补 reserved_quantity 等字段
- api/transaction.ts:同名的历史副本同步签名(当前无调用方,加注释指向唯一来源)
- views/outbound/create.vue、views/transaction/borrow.vue:各 3 处调用点带上
  单据 id;refreshStockFromDraft 改为显式透传 id,不依赖 computed 已解析
- views/borrow/approval/index.vue:审批页也带上本单 id,否则待审批单
  (预占已生效)锁定的行会因实时可用量为 0 而从备选列表消失

借库侧 request_id 是 BorrowApproval.id,靠 biz_type='borrow' 与出库单区分 ——
两张表 ID 空间独立,不可省。
This commit is contained in:
yueli
2026-09-11 10:34:23 +08:00
parent a8a3c82331
commit b313fefdfa
5 changed files with 107 additions and 32 deletions

View File

@ -62,7 +62,7 @@
placement="right"
:width="340"
trigger="click"
@show="loadAlternatives(item)"
@show="loadAlternatives(item, row.id)"
>
<!-- ★ 整个库位格子都是点击热区,工人不必精准点图标 -->
<template #reference>
@ -310,16 +310,22 @@ const altLoading = ref(false)
const altItems = ref<any[]>([])
const altTotal = ref(0)
const loadAlternatives = async (item: any) => {
const loadAlternatives = async (item: any, approvalId?: number) => {
if (!item?.base_id) return
altLoading.value = true
altItems.value = []
altTotal.value = 0
try {
const res: any = await getStockAlternatives(item.base_id, {
stock_id: item.stock_id,
source_table: item.source_table,
})
// ★ 带上本单 id 且 biz_type='borrow':
// 审批阶段看到的多是 status=0(待审批)的单据,而预占在**提交申请时**
// 就已冻结可用数。不回加的话,被本单占满的行实时可用量为 0,
// 恰好会从列表里消失 —— 审批人反而看不到本单锁定的批次。
const res: any = await getStockAlternatives(
item.base_id,
{ stock_id: item.stock_id, source_table: item.source_table },
approvalId,
'borrow'
)
altItems.value = res?.data?.items || []
altTotal.value = res?.data?.total_available || 0
} catch (e) {