| @@ -2740,33 +2740,46 @@ const handleSubmitAllScanned = useCallback(async () => { | |||||
| try { | try { | ||||
| // 转换为 batchSubmitList 所需的格式(与后端 QrPickBatchSubmitRequest 匹配) | // 转换为 batchSubmitList 所需的格式(与后端 QrPickBatchSubmitRequest 匹配) | ||||
| const lines: batchSubmitListLineRequest[] = scannedLots.map((lot) => { | const lines: batchSubmitListLineRequest[] = scannedLots.map((lot) => { | ||||
| // 1. 需求数量:优先用 lot.requiredQty,没有就用 pickOrderLineRequiredQty | |||||
| // 1. 需求数量 | |||||
| const requiredQty = | const requiredQty = | ||||
| Number(lot.requiredQty || lot.pickOrderLineRequiredQty || 0); | Number(lot.requiredQty || lot.pickOrderLineRequiredQty || 0); | ||||
| // 2. 当前已经拣到的数量(数据库里对应的是 stock_out_line.qty) | |||||
| // 2. 当前已经拣到的数量(数据库里的 qty) | |||||
| const currentActualPickQty = Number(lot.actualPickQty || 0); | const currentActualPickQty = Number(lot.actualPickQty || 0); | ||||
| // 3. 还需要拣多少:不能为负数 | |||||
| const remainingQty = Math.max(0, requiredQty - currentActualPickQty); | |||||
| // 4. 本次批量提交后的目标累计值 = 当前 + 剩余 | |||||
| const cumulativeQty = currentActualPickQty + remainingQty; | |||||
| // 5. 根据“目标累计值是否达到需求”决定状态 | |||||
| let newStatus = "partially_completed"; | |||||
| if (requiredQty > 0 && cumulativeQty >= requiredQty) { | |||||
| // 🔹 判断是否走“只改状态模式” | |||||
| // 这里先给一个简单条件示例:如果你不想再补拣,只想把当前数量标记完成, | |||||
| // 就让这个条件为 true(后面你可以根据业务加 UI 开关或别的 flag)。 | |||||
| const onlyComplete = lot.stockOutLineStatus === "partially_completed"; | |||||
| // lot.stockOutLineStatus === "partially_completed" && false === true; | |||||
| let targetActual: number; | |||||
| let newStatus: string; | |||||
| if (onlyComplete) { | |||||
| // ✅ 只改状态:目标数量 = 当前数量,不再补拣 | |||||
| targetActual = currentActualPickQty; | |||||
| newStatus = "completed"; | newStatus = "completed"; | ||||
| } else { | |||||
| // ✅ 补拣模式:把剩余全部拣完 | |||||
| const remainingQty = Math.max(0, requiredQty - currentActualPickQty); | |||||
| const cumulativeQty = currentActualPickQty + remainingQty; | |||||
| targetActual = cumulativeQty; | |||||
| newStatus = "partially_completed"; | |||||
| if (requiredQty > 0 && cumulativeQty >= requiredQty) { | |||||
| newStatus = "completed"; | |||||
| } | |||||
| } | } | ||||
| return { | return { | ||||
| stockOutLineId: Number(lot.stockOutLineId) || 0, | stockOutLineId: Number(lot.stockOutLineId) || 0, | ||||
| pickOrderLineId: Number(lot.pickOrderLineId), | pickOrderLineId: Number(lot.pickOrderLineId), | ||||
| // ⚠️ 这里按你现在的写法是用 lot.lotId,当心是否真的是 inventoryLotLineId | |||||
| inventoryLotLineId: lot.lotId ? Number(lot.lotId) : null, | inventoryLotLineId: lot.lotId ? Number(lot.lotId) : null, | ||||
| requiredQty, | requiredQty, | ||||
| // 传“目标累计值”,后端会用它减去当前数据库里的 qty 得到增量 | |||||
| actualPickQty: cumulativeQty, | |||||
| // 后端用 targetActual - 当前 qty 算增量,onlyComplete 时就是 0 | |||||
| actualPickQty: targetActual, | |||||
| stockOutLineStatus: newStatus, | stockOutLineStatus: newStatus, | ||||
| pickOrderConsoCode: String(lot.pickOrderConsoCode || ""), | pickOrderConsoCode: String(lot.pickOrderConsoCode || ""), | ||||
| noLot: Boolean(lot.noLot === true), | noLot: Boolean(lot.noLot === true), | ||||