fix(oms): 下发出库单增加幂等拦截,已存在有效执行单时禁止重复下发

问题:单据下发过并取消后重新下发(或重复点下发),issueOrder 会再生成新执行单并原样复制业务明细uniqueId插入,撞执行明细表唯一约束(如CONS134279709)导致下发失败。
修复:issueOrder 生成执行单前先查同业务单号下是否已存在有效执行单(del_flag=1),存在则提示「已下发,请勿重复下发;如需重新下发请先取消下发」。
配套DB变更(单独由DBA执行):执行明细表唯一键CONS134279709改为函数唯一索引,仅对DEL_FLAG=1的行约束UNIQUE_ID唯一,软删行不再占用唯一键。
This commit is contained in:
rcx
2026-09-03 17:44:16 +08:00
parent 34496de969
commit fee891dad0
@@ -514,6 +514,13 @@ public class ReservationStockOutOrderDomainService {
for (Long inOrderId : inOrderIds) {
ReservationStockOutOrder byId = stockOutOrderService.getById(inOrderId);
String inOrderNumber = byId.getOutOrderNumber();
// 幂等拦截:已存在有效执行单时禁止重复下发(重复下发会生成新执行单并原样复制明细uniqueId,撞执行明细表唯一约束)
long activeExecutionCount = executionStockOutOrderService.count(new QueryWrapper<ExecutionStockOutOrder>().lambda()
.eq(ExecutionStockOutOrder::getBusinessOutOrderNumber, inOrderNumber)
.eq(ExecutionStockOutOrder::getDelFlag, 1));
if (activeExecutionCount > 0) {
throw new ServiceException("出库单[" + inOrderNumber + "]已下发,请勿重复下发;如需重新下发请先取消下发");
}
List<String> executionInOrderNumbers = new ArrayList<>();
List<ReservationOutMaterialDetail> materialDetailList = outMaterialDetailService.list(new QueryWrapper<ReservationOutMaterialDetail>().lambda().eq(ReservationOutMaterialDetail::getOutOrderNumber, inOrderNumber));