fix(lastleg): scope inventory holds by cycle and align pick lock ordering

This commit is contained in:
2026-10-03 01:34:14 +08:00
parent 1db6e744c8
commit 7530a95fbd
9 changed files with 304 additions and 13 deletions
@@ -78,6 +78,15 @@ public class LastlegOrderCommandService {
|| text(order.getOutboundOrderNo()) != null)) {
throw conflict("尾程订单已进入出库流程,不能新增暂扣");
}
String holdCycle = "ORDER_HOLD:" + orderId + ":" + (version + 1);
if (!held) {
LastlegOrderHoldHistory original = holdHistory.selectOne(new LambdaQueryWrapper<LastlegOrderHoldHistory>()
.eq(LastlegOrderHoldHistory::getCustomerId, order.getCustomerId())
.eq(LastlegOrderHoldHistory::getOrderId, orderId).eq(LastlegOrderHoldHistory::getHeld, true)
.orderByDesc(LastlegOrderHoldHistory::getOrderVersion).last("LIMIT 1"));
if (original == null) throw conflict("暂扣来源记录缺失,不能释放其他业务冻结库存");
holdCycle = "ORDER_HOLD:" + orderId + ":" + original.getOrderVersion();
}
LocalDateTime now = LocalDateTime.now();
boolean chargeable = held && request.chargeable();
String reason = request.reason().trim();
@@ -86,10 +95,10 @@ public class LastlegOrderCommandService {
}
if (held) {
inventory.holdInboundOrderInventory(order.getCustomerId(), operatorId, orderId,
order.getOrderNo(), reason);
order.getOrderNo(), reason, holdCycle);
} else {
inventory.releaseInboundOrderHold(order.getCustomerId(), operatorId, orderId,
order.getOrderNo(), reason);
order.getOrderNo(), reason, holdCycle);
}
int nextVersion = version + 1;
LastlegOrderCommandDtos.HoldResponse response = new LastlegOrderCommandDtos.HoldResponse(