From 6c6a491ff86c049857d47a04a92c00bbb129ffb2 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Tue, 8 Sep 2026 13:37:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(oms/wms):=20WMS=E4=B8=8A=E6=9E=B6=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=9B=9E=E4=BC=A0OMS=E5=85=A5=E5=BA=93=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E5=8D=95=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E4=B8=8D=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WMS上架推进入库状态后回传OMS(OmsServiceFeign新增returnInResult) - OMS回传接收加固:无登录上下文判空、已入库同步issueStatus=4 - 已入库联动同步预约入库单(入库业务单)状态 --- .../com/mhd/system/api/OmsServiceFeign.java | 5 + .../RemoteOmsFeignFallbackFactory.java | 5 + .../ExecutionStockInOrderDomainService.java | 99 ++++++++++++++++--- .../service/StockShelfOrderDomainService.java | 15 ++- 4 files changed, 108 insertions(+), 16 deletions(-) diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java index 8a7006304..7c4b7082f 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/OmsServiceFeign.java @@ -12,6 +12,7 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -28,6 +29,10 @@ public interface OmsServiceFeign { @PostMapping(value = "/reservationStockInOrderApi/pushInOrderDetail") public AjaxResult pushInOrderDetail(@RequestBody InMaterialDetailTZPD inMaterialDetail); + @ApiOperation("wms回传入库结果:按入库单号同步入库状态(3-收货中 4-上架中 5-已入库)到OMS入库业务单,type非1为入库") + @GetMapping(value = "/executionStockInOrderApi/returnResult") + public AjaxResult returnInResult(@RequestParam("orderNumber") String orderNumber, @RequestParam("status") Long status, @RequestParam("type") String type); + @ApiOperation("wms推送入库单") @PostMapping(value = "/reservationStockOutOrderApi/pushOutOrder") diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteOmsFeignFallbackFactory.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteOmsFeignFallbackFactory.java index 891442eb4..09958e3b8 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteOmsFeignFallbackFactory.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteOmsFeignFallbackFactory.java @@ -41,6 +41,11 @@ public class RemoteOmsFeignFallbackFactory implements FallbackFactory().lambda() - .set(ExecutionStockOutOrder::getStatus, status) - .set(ExecutionStockOutOrder::getUpdateBy, loginUser.getUserid()) - .set(ExecutionStockOutOrder::getUpdateByName, userRealName) - .set(ExecutionStockOutOrder::getUpdateTime, new Date()) - .in(ExecutionStockOutOrder::getOutOrderNumber, orderNumber)); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper() + .set(ExecutionStockOutOrder::getStatus, status); + if (updateBy != null) { + wrapper.set(ExecutionStockOutOrder::getUpdateBy, updateBy) + .set(ExecutionStockOutOrder::getUpdateByName, userRealName) + .set(ExecutionStockOutOrder::getUpdateTime, new Date()); + } + wrapper.in(ExecutionStockOutOrder::getOutOrderNumber, orderNumber); + return stockOutOrderService.update(null, wrapper); } else { - return stockInOrderService.update(null, new UpdateWrapper().lambda() - .set(ExecutionStockInOrder::getStatus, status) - .set(ExecutionStockInOrder::getUpdateBy, loginUser.getUserid()) - .set(ExecutionStockInOrder::getUpdateByName, userRealName) - .set(ExecutionStockInOrder::getUpdateTime, new Date()) - .in(ExecutionStockInOrder::getInOrderNumber, orderNumber)); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper() + .set(ExecutionStockInOrder::getStatus, status); + // 已入库(5)时同步issueStatus=4,供前端"入库执行单"列表入库状态列展示"已入库" + if (status != null && status == 5L) { + wrapper.set(ExecutionStockInOrder::getIssueStatus, 4); + } + if (updateBy != null) { + wrapper.set(ExecutionStockInOrder::getUpdateBy, updateBy) + .set(ExecutionStockInOrder::getUpdateByName, userRealName) + .set(ExecutionStockInOrder::getUpdateTime, new Date()); + } + wrapper.in(ExecutionStockInOrder::getInOrderNumber, orderNumber); + boolean updated = stockInOrderService.update(null, wrapper); + // 同步预约入库单(前端"入库业务单"列表)状态 + syncReservationStatus(orderNumber, status, updateBy, userRealName); + return updated; + } + } + + /** + * 入库执行单状态回传后同步预约入库单: + * 执行单通过business_in_order_number关联预约单,已入库(5)且该预约单名下关联执行单全部完成时, + * 预约单同步置为已入库;同步失败只记日志,不影响执行单状态更新结果 + */ + private void syncReservationStatus(String orderNumber, Long status, Long updateBy, String userRealName) { + try { + if (status == null || status != 5L) { + return; + } + ExecutionStockInOrder execution = stockInOrderService.getOne(new QueryWrapper().lambda() + .eq(ExecutionStockInOrder::getInOrderNumber, orderNumber) + .eq(ExecutionStockInOrder::getDelFlag, 1) + .last("limit 1")); + if (execution == null || execution.getBusinessInOrderNumber() == null + || execution.getBusinessInOrderNumber().trim().isEmpty()) { + return; + } + // 多仓库拆单时存在多个关联执行单,全部已入库才同步预约单 + long unfinished = stockInOrderService.count(new QueryWrapper().lambda() + .eq(ExecutionStockInOrder::getBusinessInOrderNumber, execution.getBusinessInOrderNumber()) + .eq(ExecutionStockInOrder::getDelFlag, 1) + .and(w -> w.isNull(ExecutionStockInOrder::getStatus).or().lt(ExecutionStockInOrder::getStatus, 5))); + if (unfinished > 0) { + log.info("预约入库单[{}]名下仍有{}张执行单未完成,暂不同步已入库状态", execution.getBusinessInOrderNumber(), unfinished); + return; + } + LambdaUpdateWrapper reservationWrapper = new LambdaUpdateWrapper() + .set(ReservationStockInOrder::getStatus, 5) + // issueStatus=4 为前端"入库业务单"列表入库状态列的"已入库"展示值 + .set(ReservationStockInOrder::getIssueStatus, 4); + if (updateBy != null) { + reservationWrapper.set(ReservationStockInOrder::getUpdateBy, updateBy) + .set(ReservationStockInOrder::getUpdateByName, userRealName) + .set(ReservationStockInOrder::getUpdateTime, new Date()); + } + reservationWrapper.in(ReservationStockInOrder::getInOrderNumber, execution.getBusinessInOrderNumber()); + reservationStockInOrderService.update(reservationWrapper); + log.info("预约入库单[{}]已同步为已入库", execution.getBusinessInOrderNumber()); + } catch (Exception e) { + log.warn("同步预约入库单状态失败: orderNumber={}, status={}", orderNumber, status, e); } } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java index 8c52ff32f..0e07bbf81 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java @@ -810,8 +810,21 @@ public class StockShelfOrderDomainService { stockInOrder.setUpdateBy(loginUser.getUserid()); stockInOrder.setUpdateByName(loginUser.getUsername()); stockInOrder.setUpdateTime(new Date()); - return stockInOrderService.update(stockInOrder, + boolean updated = stockInOrderService.update(stockInOrder, new QueryWrapper().lambda().eq(StockInOrder::getInOrderNumber, stockShelfOrderPO.getInOrderNumber())); + if (updated) { + // 上架推进入库状态(4-上架中/5-已入库)后回传OMS入库业务单,保证OMS入库状态与WMS一致; + // OMS不可用或回传失败只记日志,不影响WMS上架主流程 + try { + AjaxResult notifyResult = omsServiceFeign.returnInResult(stockShelfOrderPO.getInOrderNumber(), Long.valueOf(status), "0"); + if (notifyResult == null || !"200".equals(String.valueOf(notifyResult.get("code")))) { + log.warn("回传OMS入库状态失败: orderNumber={}, status={}, result={}", stockShelfOrderPO.getInOrderNumber(), status, notifyResult); + } + } catch (Exception e) { + log.warn("回传OMS入库状态异常: orderNumber={}, status={}", stockShelfOrderPO.getInOrderNumber(), status, e); + } + } + return updated; } /** * @description 完成上架