From b4b79c68a99ba446e4d209659c3bf62b7c910907 Mon Sep 17 00:00:00 2001 From: yueli Date: Thu, 10 Sep 2026 10:14:36 +0800 Subject: [PATCH] =?UTF-8?q?fix(borrow):=20=E5=80=9F=E5=BA=93=E8=BD=AC?= =?UTF-8?q?=E6=8A=A5=E5=BA=9F=E5=AE=9E=E7=89=A9=E4=B8=8D=E8=B6=B3=E6=97=B6?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E5=9B=9E=E6=BB=9A=EF=BC=8C=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E5=A4=B9=E6=96=AD=E5=88=B0=200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原逻辑在 stock_quantity 减为负数时直接置 0。但借出时已扣减过 available_quantity,夹断会使 available_quantity > stock_quantity, 凭空多出可用库存,后续出库/借库可继续占用这批并不存在的实物。 改为不足即抛 ValueError,与同一事务内其余校验一致,整单回滚。 --- inventory-backend/app/services/trans_service.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/inventory-backend/app/services/trans_service.py b/inventory-backend/app/services/trans_service.py index 6b5afee..1f10c57 100644 --- a/inventory-backend/app/services/trans_service.py +++ b/inventory-backend/app/services/trans_service.py @@ -381,10 +381,14 @@ class TransService: if ModelClass: stock = ModelClass.query.with_for_update().get(record.stock_id) if stock: - stock.stock_quantity = float(stock.stock_quantity or 0) - pending_qty - # 防止负库存 - if stock.stock_quantity < 0: - stock.stock_quantity = 0 + stock_qty = float(stock.stock_quantity or 0) + # 不足则报错整单回滚:直接夹到 0 会让 available_quantity > stock_quantity, + # 凭空多出可用库存 + if pending_qty > stock_qty: + raise ValueError( + f"SKU {record.sku} 实物库存不足(剩 {stock_qty}),无法报废 {pending_qty}" + ) + stock.stock_quantity = stock_qty - pending_qty # 3. 创建报废记录 scrap_record = TransScrap(