From 9e1c5d857009d41cfba1d203db9b93c5868ab778 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Mon, 7 Sep 2026 15:44:44 +0800 Subject: [PATCH] =?UTF-8?q?fix(oms):=20=E9=A2=84=E7=BA=A6=E5=8D=95?= =?UTF-8?q?=E4=B8=8B=E5=8F=91=E4=B8=8D=E5=86=8D=E6=8E=A8=E9=80=81WMS?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8D=E6=89=A7=E8=A1=8C=E5=8D=95=E4=B8=8B?= =?UTF-8?q?=E5=8F=91=E5=90=8EWMS=E5=87=BA=E7=8E=B0=E9=A2=84=E7=BA=A6?= =?UTF-8?q?=E5=8D=95+=E6=89=A7=E8=A1=8C=E5=8D=95=E4=B8=A4=E5=BC=A0?= =?UTF-8?q?=E5=8D=95=EF=BC=9B=E4=B8=89=E4=B8=AA=E4=B8=8B=E5=8F=91=E5=85=A5?= =?UTF-8?q?=E5=8F=A3=E8=A1=A5=E5=85=85=E8=BD=AF=E5=88=A0=E5=8D=95=E6=8B=A6?= =?UTF-8?q?=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExecutionStockInOrderDomainService.java | 8 ++- .../ReservationStockInOrderDomainService.java | 62 +++++-------------- 2 files changed, 24 insertions(+), 46 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderDomainService.java index 2264a05da..20f5c398c 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/executionStockInOrder/service/ExecutionStockInOrderDomainService.java @@ -613,9 +613,15 @@ public class ExecutionStockInOrderDomainService { } // 入参去重:同一请求内重复ID会导致同一执行单被多次推送WMS List distinctInOrderIds = inOrderIds.stream().distinct().collect(Collectors.toList()); + // 只校验有效单据:已删除(软删)执行单混入ID(过期页面提交)时在此拦截, + // 此前list/getById均不过滤del_flag,软删单照样被推到WMS形成"幽灵单" List checkOrders = stockInOrderService.list( new QueryWrapper().lambda() - .in(ExecutionStockInOrder::getInOrderId, distinctInOrderIds)); + .in(ExecutionStockInOrder::getInOrderId, distinctInOrderIds) + .eq(ExecutionStockInOrder::getDelFlag, 1)); + if (checkOrders.size() != distinctInOrderIds.size()) { + throw new ServiceException("下发失败:存在已删除的单据,请刷新后重新选择"); + } for (ExecutionStockInOrder order : checkOrders) { if (order.getIssueTime() != null) { throw new ServiceException("下发失败:单据[" + order.getInOrderNumber() + "]已下发,不可重复下发;如需重新下发请先取消下发"); diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java index e08614aaa..5f30c94c7 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/service/ReservationStockInOrderDomainService.java @@ -525,9 +525,14 @@ public class ReservationStockInOrderDomainService { if (inOrderIds == null || inOrderIds.isEmpty()) { throw new ServiceException("下发失败:未选择单据"); } + // 只校验有效单据:软删单混入ID(过期页面提交)时在此拦截 List checkOrders = stockInOrderService.list( new QueryWrapper().lambda() - .in(ReservationStockInOrder::getInOrderId, inOrderIds)); + .in(ReservationStockInOrder::getInOrderId, inOrderIds) + .eq(ReservationStockInOrder::getDelFlag, 1)); + if (checkOrders.size() != inOrderIds.stream().distinct().count()) { + throw new ServiceException("下发失败:存在已删除的单据,请刷新后重新选择"); + } for (ReservationStockInOrder order : checkOrders) { // 校验1:必须已审核(issueStatus==2 表示审核成功) if (order.getIssueStatus() == null || order.getIssueStatus() != 2) { @@ -560,50 +565,12 @@ public class ReservationStockInOrderDomainService { .set(ReservationStockInOrder::getUpdateTime, new Date()) .in(ReservationStockInOrder::getInOrderId, stockInOrderDO.getInOrderIds())); - //todo下发推送到wms - for (Long inOrderId : inOrderIds) { - ReservationStockInOrder byId = stockInOrderService.getById(inOrderId); - StockInOrder stockInOrder = new StockInOrder(); - BeanUtils.copyProperties(byId, stockInOrder, "inOrderId"); - stockInOrder.setOmsStockInOrderId(String.valueOf(byId.getInOrderId())); + // 业务链路(2026-09与业务确认,生产验证):预约单下发→生成执行单→执行单下发时才推送WMS。 + // 预约单下发此前会先把预约单自身推到WMS(omsInOrderAdd/omsInOrderAddDetail),执行单下发又推一次, + // 导致WMS入库管理出现预约单号(R260907001)+执行单号(RK260907001)两张单、仓库收两道货。 + // 已移除预约单的WMS推送,WMS推送唯一入口收敛到 ExecutionStockInOrderDomainService.issueOrder。 + // 历史已推送的预约单数据由"取消下发"(cancelIssueOrder→omsCancelInOrder,幂等)负责清理。 - try { - //WMS保存结果必须校验:此前接口返回void、Feign降级被静默吞掉,OMS标记已下发但WMS无数据/缺明细, - //收货流程无从进行(流程阻断);失败抛错回滚下发标记,WMS侧幂等(主单/明细判重),重下发安全 - AjaxResult addResult = wmsServiceFeign.omsInOrderAdd(stockInOrder); // 推主单 - if (addResult == null || !"200".equals(String.valueOf(addResult.get("code")))) { - throw new ServiceException("下发到WMS失败:入库单[" + stockInOrder.getInOrderNumber() + "]保存主单失败:" - + (addResult == null ? "WMS服务不可用或已降级" : addResult.get("msg"))); - } - - String inOrderNumber = stockInOrder.getInOrderNumber(); - List materialDetailList = materialDetailService.list( - new QueryWrapper().lambda() - .eq(ReservationInMaterialDetail::getInOrderNumber, inOrderNumber) - .eq(ReservationInMaterialDetail::getDelFlag, 1)); - List inMaterialDetailList = new ArrayList<>(); - for (ReservationInMaterialDetail reservationInMaterialDetail : materialDetailList) { - InMaterialDetail inMaterialDetail = new InMaterialDetail(); - BeanUtils.copyProperties(reservationInMaterialDetail, inMaterialDetail, "materialDetailId"); - inMaterialDetail.setOmsInMaterialDetail(String.valueOf(reservationInMaterialDetail.getMaterialDetailId())); - // 过期日期为空且饮用日期有值时,用饮用日期补齐过期日期(食品业务饮用日期即效期), - // 确保下发WMS后入库/收货/库存链路的过期日期能正常回显 - if (inMaterialDetail.getExpiryDate() == null && inMaterialDetail.getDrinkDate() != null) { - inMaterialDetail.setExpiryDate(inMaterialDetail.getDrinkDate()); - } - inMaterialDetailList.add(inMaterialDetail); - } - AjaxResult detailResult = wmsServiceFeign.omsInOrderAddDetail(inMaterialDetailList); // 推明细(会触发WMS自动审核) - if (detailResult == null || !"200".equals(String.valueOf(detailResult.get("code")))) { - throw new ServiceException("下发到WMS失败:入库单[" + inOrderNumber + "]保存明细失败:" - + (detailResult == null ? "WMS服务不可用或已降级" : detailResult.get("msg"))); - } - log.info("下发到WMS成功,单据号:{}", byId.getInOrderNumber()); - } catch (Exception e) { - log.error("下发到WMS失败,单据号:{}", byId.getInOrderNumber(), e); - throw new ServiceException("下发到WMS失败:" + e.getMessage()); - } - } //todo下发推送到入库业务单 for (Long inOrderId : inOrderIds) { // Long inOrderId = stockInOrderDO.getInOrderId(); @@ -801,9 +768,14 @@ public class ReservationStockInOrderDomainService { if (inOrderIds == null || inOrderIds.isEmpty()) { throw new ServiceException("执行失败:未选择单据"); } + // 只校验有效单据:软删单混入ID(过期页面提交)时在此拦截(与 issueOrder 校验口径一致) List checkOrders = stockInOrderService.list( new QueryWrapper().lambda() - .in(ReservationStockInOrder::getInOrderId, inOrderIds)); + .in(ReservationStockInOrder::getInOrderId, inOrderIds) + .eq(ReservationStockInOrder::getDelFlag, 1)); + if (checkOrders.size() != inOrderIds.stream().distinct().count()) { + throw new ServiceException("执行失败:存在已删除的单据,请刷新后重新选择"); + } for (ReservationStockInOrder order : checkOrders) { if (order.getIssueTime() != null) { throw new ServiceException("执行失败:单据[" + order.getInOrderNumber() + "]已下发,不可重复执行;如需重新下发请先取消下发");