diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java index 64a6c201c..8170d6542 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WmsServiceFeign.java @@ -74,21 +74,21 @@ public interface WmsServiceFeign { */ @ApiOperation("oms下发单保存") @PostMapping(value = "/stockOutOrderApi/omsOutOrderAdd") - public void omsOutOrderAdd(@RequestBody StockOutOrder stockOutOrder); + public AjaxResult omsOutOrderAdd(@RequestBody StockOutOrder stockOutOrder); /** * oms下发单明细保存 */ @ApiOperation("oms下发单明细保存") @PostMapping(value = "/stockOutOrderApi/omsOutOrderAddDetail") - public void omsOutOrderAddDetail(@RequestBody List outMaterialDetails); + public AjaxResult omsOutOrderAddDetail(@RequestBody List outMaterialDetails); /** * oms下发单明细保存 */ @ApiOperation("oms下发单明细保存") @PostMapping(value = "/stockOutOrderApi/omsOutOrderAddDeliveryDetailsLink") - public void omsOutOrderAddDeliveryDetailsLink(@RequestBody List deliveryDetailsLinks); + public AjaxResult omsOutOrderAddDeliveryDetailsLink(@RequestBody List deliveryDetailsLinks); /** diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java index 4f48a4cea..f5ea93014 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWmsFallbackFactory.java @@ -57,16 +57,19 @@ public class RemoteWmsFallbackFactory implements FallbackFactory outMaterialDetails) { + public AjaxResult omsOutOrderAddDetail(List outMaterialDetails) { + return AjaxResult.error("WMS下发单明细保存失败(服务降级):" + cause.getMessage()); } @Override - public void omsOutOrderAddDeliveryDetailsLink(List deliveryDetailsLinks) { - + public AjaxResult omsOutOrderAddDeliveryDetailsLink(List deliveryDetailsLinks) { + return AjaxResult.error("WMS下发单配送明细保存失败(服务降级):" + cause.getMessage()); } @Override diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java index 4e33c7a29..6a1617cb8 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockOutOrder/service/ExecutionStockOutOrderDomainService.java @@ -534,7 +534,12 @@ public class ExecutionStockOutOrderDomainService { stockOutOrder.setOrganizationId(orgId); stockOutOrder.setOrganizationName(orgName); stockOutOrder.setTopOrganizationId(topOrgId); - wmsServiceFeign.omsOutOrderAdd(stockOutOrder); + //单头/配送明细推送同样校验返回值: 降级吞掉会残留"有单无明细"等半截单 + AjaxResult orderAddResult = wmsServiceFeign.omsOutOrderAdd(stockOutOrder); + if (orderAddResult == null || !"200".equals(String.valueOf(orderAddResult.get("code")))) { + throw new ServiceException("出库单[" + currentOrderNumber + "]WMS出库单推送失败:" + + (orderAddResult == null ? "WMS服务不可用或已降级" : orderAddResult.get("msg"))); + } List list = deliveryDetailsLinkService.list(new QueryWrapper().lambda().eq(ReservationDeliveryDetailsLink::getOrderNumber, byId.getOutOrderNumber())); List deliveryDetailsLinkList = new ArrayList<>(); @@ -544,7 +549,11 @@ public class ExecutionStockOutOrderDomainService { deliveryDetailsLink.setOmsId(reservationDeliveryDetailsLink.getId()); deliveryDetailsLinkList.add(deliveryDetailsLink); } - wmsServiceFeign.omsOutOrderAddDeliveryDetailsLink(deliveryDetailsLinkList); + AjaxResult linkAddResult = wmsServiceFeign.omsOutOrderAddDeliveryDetailsLink(deliveryDetailsLinkList); + if (linkAddResult == null || !"200".equals(String.valueOf(linkAddResult.get("code")))) { + throw new ServiceException("出库单[" + currentOrderNumber + "]WMS配送明细推送失败:" + + (linkAddResult == null ? "WMS服务不可用或已降级" : linkAddResult.get("msg"))); + } String inOrderNumber = stockOutOrder.getOutOrderNumber(); @@ -558,7 +567,12 @@ public class ExecutionStockOutOrderDomainService { outMaterialDetail.setTopOrganizationId(topOrgId); outMaterialDetailList.add(outMaterialDetail); } - wmsServiceFeign.omsOutOrderAddDetail(outMaterialDetailList); + //明细推送必须校验返回值: 失败被降级吞掉时WMS会残留"有单无明细"的出库单, 自动分配报"可用库存为0"难定位 + AjaxResult detailAddResult = wmsServiceFeign.omsOutOrderAddDetail(outMaterialDetailList); + if (detailAddResult == null || !"200".equals(String.valueOf(detailAddResult.get("code")))) { + throw new ServiceException("出库单[" + currentOrderNumber + "]WMS出库明细推送失败:" + + (detailAddResult == null ? "WMS服务不可用或已降级" : detailAddResult.get("msg"))); + } String outOrderNumber = byId.getOutOrderNumber(); com.mhd.system.api.domain.StockOutOrderDTO stockOutOrderDTO = new com.mhd.system.api.domain.StockOutOrderDTO(); diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java index d99a8ffd5..7455d4575 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockOutOrder/service/StockOutOrderDomainService.java @@ -2632,6 +2632,8 @@ public class StockOutOrderDomainService { .eq(InventoryAdjustmentRecord::getRelateNo, relateNo)); //逻辑删除出库单明细 materialDetail.setDelFlag(2); + // 归档行置空uniqueId: 明细表唯一约束不含del_flag, 保留原值会与重新下发推单时同一uniqueId的新明细撞键 + materialDetail.setUniqueId(null); outMaterialDetailService.updateById(materialDetail); } //逻辑删除出库单(用按单号查出的DB对象更新:OMS补偿清理只传单号,传入对象无主键,直接updateById不生效) @@ -2772,6 +2774,8 @@ public class StockOutOrderDomainService { } //逻辑删除出库单明细 materialDetail.setDelFlag(2); + // 归档行置空uniqueId: 明细表唯一约束不含del_flag, 保留原值会与重新下发推单时同一uniqueId的新明细撞键 + materialDetail.setUniqueId(null); materialDetail.setReverseFlag(1); outMaterialDetailService.updateById(materialDetail); } @@ -2845,11 +2849,25 @@ public class StockOutOrderDomainService { if (CollectionUtils.isEmpty(outMaterialDetails)) { return; } - //幂等保护:重复下发时先逻辑删除同单号已存在的活动明细,避免重复插入导致分配/拣货数据错乱 + //幂等保护:重复下发时本单已有活动明细统一软删(1→2)并置空uniqueId outMaterialDetailService.update(new UpdateWrapper().lambda() .set(OutMaterialDetail::getDelFlag, 2) + .set(OutMaterialDetail::getUniqueId, null) .eq(OutMaterialDetail::getOutOrderNumber, outMaterialDetails.get(0).getOutOrderNumber()) .eq(OutMaterialDetail::getDelFlag, 1)); + //自愈:反审/取消下发的历史归档明细(del_flag=2, 含其他执行单残留)若仍占用本次推送的uniqueId, 置空释放键位 + //(表唯一约束不含del_flag; 反审后重新下发会复用同一库存行的uniqueId, 跨执行单也要清, 否则明细插入撞唯一约束) + List pushedUniqueIds = outMaterialDetails.stream() + .map(OutMaterialDetail::getUniqueId) + .filter(java.util.Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + if (!pushedUniqueIds.isEmpty()) { + outMaterialDetailService.update(new UpdateWrapper().lambda() + .set(OutMaterialDetail::getUniqueId, null) + .eq(OutMaterialDetail::getDelFlag, 2) + .in(OutMaterialDetail::getUniqueId, pushedUniqueIds)); + } outMaterialDetailService.saveBatch(outMaterialDetails); autoAuditOmsOutOrder(outMaterialDetails.get(0).getOutOrderNumber()); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java index 58c10f37a..424885b33 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/facadeApi/stockOutOrder/StockOutOrderApi.java @@ -521,8 +521,9 @@ public class StockOutOrderApi extends BaseController { */ @ApiOperation("oms下发单保存") @PostMapping(value = "/omsOutOrderAdd") - public void omsOutOrderAdd(@RequestBody StockOutOrder stockOutOrder) { + public AjaxResult omsOutOrderAdd(@RequestBody StockOutOrder stockOutOrder) { stockOutOrderApplicationService.omsOrderAdd(stockOutOrder); + return AjaxResult.success(); } /** @@ -550,8 +551,9 @@ public class StockOutOrderApi extends BaseController { */ @ApiOperation("oms下发单明细保存") @PostMapping(value = "/omsOutOrderAddDetail") - public void omsOutOrderAddDetail(@RequestBody List outMaterialDetails) { + public AjaxResult omsOutOrderAddDetail(@RequestBody List outMaterialDetails) { stockOutOrderApplicationService.omsOrderAddDetail(outMaterialDetails); + return AjaxResult.success(); } /** @@ -587,8 +589,9 @@ public class StockOutOrderApi extends BaseController { */ @ApiOperation("oms下发单配送明细保存") @PostMapping(value = "/omsOutOrderAddDeliveryDetailsLink") - public void omsOutOrderAddDeliveryDetailsLink(@RequestBody List deliveryDetailLinks) { + public AjaxResult omsOutOrderAddDeliveryDetailsLink(@RequestBody List deliveryDetailLinks) { stockOutOrderApplicationService.omsOrderAddDeliveryDetailsLink(deliveryDetailLinks); + return AjaxResult.success(); } @ApiOperation("出库单提货单打印")