yueli
f702a70fe5
fix(borrow): 借出只冻结可用数,不再扣减实物库存
问题
----
上一轮库存预占改造(b57c21a)把借库执行改用了 restore_then_deduct(),
而该函数是按**出库语义**设计的(物品永久离开仓库),会同时扣减
available_quantity 与 stock_quantity。借库是可逆的,于是产生两个缺陷:
1) 借出再归还后,实物库存永久少一份
初始 (stock=20, avail=20)
借出5 (stock=15, avail=15)
归还5 (stock=15, avail=20) ← 实物没回来,丢了 5
2) 借出后转报废会重复扣减
scrap_borrow 的注释明确写着「扣减总库存(该物品确认损失);
可用库存已在借出时冻结,无需重复扣」—— 它假设借出**没动实物**。
借出已扣 stock 后,转报废再扣一次:
借出5 stock=15 → 转报废 stock=10(正确应为 15)
修复
----
restore_then_deduct 增加 deduct_stock 参数:
出库 deduct_stock=True (默认)—— 可用数、实物数同时扣
借库 deduct_stock=False —— 只冻结可用数,实物数不动
★ 这是**恢复原有设计**,不是新设计。git 历史显示从最初的
04ee938 借库逻辑实现 起,历经 7ef22a3 / 83b3db6 / b79b0f9 /
2556b77 / 1527d55 六次提交,一直是:
stock.available_quantity = float(stock.available_quantity) - qty
(只减可用,不动实物)。b57c21a 把它替换掉了。
盘点的差异计算也印证了该口径的正确性:
adjusted_stock_qty = stock_quantity - 借出未还
diff_qty = 实盘数 - adjusted_stock_qty
这段逻辑要求 stock_quantity **包含**借出未还的实物,否则会重复扣减。
最终语义
--------
stock_quantity = 账面实物总数(含借出未还)
available_quantity = 实际可取用数
出库申请(预占) — available ↓
出库执行 stock ↓ available ↓
借库申请(预占) — available ↓
借库执行 — available ↓
借库归还 — available ↑
借库转报废 stock ↓ —
实测(stock, available)
------------------------
借还循环:初始(20,20) → 借出5(20,15) → 归还5(20,20) 完全可逆
出库: 预占4(20,16) → 执行(16,16) 实物确实减
转报废: 借出3(20,17) → 转报废(17,17) 实物减一次,不重复
2026-09-11 09:39:20 +08:00
..
2026-05-21 14:09:57 +08:00
2026-09-08 18:16:04 +08:00
2026-05-27 09:57:01 +08:00
2026-01-26 13:47:53 +08:00
2026-09-10 10:14:17 +08:00
2026-08-03 09:22:50 +08:00
2026-09-08 10:14:44 +08:00
2026-09-09 13:00:41 +08:00
2026-09-11 09:06:43 +08:00
2026-07-13 15:12:22 +08:00
2026-08-03 15:53:10 +08:00
2026-09-11 09:39:20 +08:00
2026-07-16 11:26:12 +08:00
2026-01-26 13:47:53 +08:00
2026-09-11 09:06:43 +08:00
2026-07-17 16:22:59 +08:00
2026-09-10 17:41:22 +08:00
2026-09-10 15:46:55 +08:00
2026-09-01 13:52:56 +08:00
2026-09-01 13:52:56 +08:00
2026-09-11 09:39:20 +08:00