From fee891dad00056186ad3d5265f72fb6abd73afbf Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Thu, 3 Sep 2026 17:44:16 +0800 Subject: [PATCH] =?UTF-8?q?fix(oms):=20=E4=B8=8B=E5=8F=91=E5=87=BA?= =?UTF-8?q?=E5=BA=93=E5=8D=95=E5=A2=9E=E5=8A=A0=E5=B9=82=E7=AD=89=E6=8B=A6?= =?UTF-8?q?=E6=88=AA=EF=BC=8C=E5=B7=B2=E5=AD=98=E5=9C=A8=E6=9C=89=E6=95=88?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=8D=95=E6=97=B6=E7=A6=81=E6=AD=A2=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E4=B8=8B=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:单据下发过并取消后重新下发(或重复点下发),issueOrder 会再生成新执行单并原样复制业务明细uniqueId插入,撞执行明细表唯一约束(如CONS134279709)导致下发失败。 修复:issueOrder 生成执行单前先查同业务单号下是否已存在有效执行单(del_flag=1),存在则提示「已下发,请勿重复下发;如需重新下发请先取消下发」。 配套DB变更(单独由DBA执行):执行明细表唯一键CONS134279709改为函数唯一索引,仅对DEL_FLAG=1的行约束UNIQUE_ID唯一,软删行不再占用唯一键。 --- .../service/ReservationStockOutOrderDomainService.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java index bde5e11a3..a90e17cdb 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java @@ -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().lambda() + .eq(ExecutionStockOutOrder::getBusinessOutOrderNumber, inOrderNumber) + .eq(ExecutionStockOutOrder::getDelFlag, 1)); + if (activeExecutionCount > 0) { + throw new ServiceException("出库单[" + inOrderNumber + "]已下发,请勿重复下发;如需重新下发请先取消下发"); + } List executionInOrderNumbers = new ArrayList<>(); List materialDetailList = outMaterialDetailService.list(new QueryWrapper().lambda().eq(ReservationOutMaterialDetail::getOutOrderNumber, inOrderNumber));