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() + "]已下发,不可重复执行;如需重新下发请先取消下发");