From bb3dfaed4a5444c1d9b5c3893b97ac19f56da96a Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Sat, 22 Aug 2026 18:38:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(oms):=E5=87=BA=E5=BA=93=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E5=8D=95=E7=BA=BF=E8=B7=AF/=E8=BD=A6=E6=AC=A1=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E8=BF=90=E8=BE=93=E4=B8=9A=E5=8A=A1=E5=8D=95,?= =?UTF-8?q?=E8=A1=A5=E9=BD=90=E8=A7=A6=E5=8F=91=E5=85=A5=E5=8F=A3=E4=B8=8E?= =?UTF-8?q?=E6=8B=86=E5=8D=95=E6=97=B6=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 出库业务单与运输业务单为两张独立表,仅靠发票号经配送明细关联, 此前无字段同步逻辑,出库单填写的线路/车次不会流到运输业务单。 1. ReservationStockOutOrderDomainService新增syncLineInfoToBusinessOrder: 按关联链 出库单号->reservation_delivery_details_link.invoiceNumber ->business_delivery_details_link.invoiceNumber 定位关联业务单, 以出库业务单为源头覆盖lineCode/lineName/shuttleNo。 2. 触发入口三个:审核通过(auditState)/下发(issueOrder)/执行并下发 (executeAndIssue);取消下发不触发。下发与执行并下发不经过审核 动作,只挂审核入口会漏同步。 3. 同步目标同时覆盖orderId(未拆单业务单/拆单后主单)与subOrderId (拆单子单):仅同步subOrderId时,出库先审核而运输单尚未拆单 (subOrderId为空)会落空,且主单无值导致后续拆单子单拷贝不到。 4. 同步失败仅记error日志,不阻断审核/下发主流程 (状态更新与同步非同一事务,关联数据异常不应导致接口报错)。 边界:运输业务单手工创建且未录配送明细时无关联链不同步,需页面自行 填写;关联依赖发票号两侧一致,与既有退货回写为同一关联假设。 --- ...ReservationStockOutOrderDomainService.java | 69 ++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) 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 aada73d53..bde5e11a3 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 @@ -409,7 +409,7 @@ public class ReservationStockOutOrderDomainService { String userRealName = loginUser.getUserPo() != null && loginUser.getUserPo().getUserName() != null ? loginUser.getUserPo().getUserName() : (loginUser.getRealname() != null ? loginUser.getRealname() : loginUser.getUsername()); - return stockOutOrderService.update(null, new UpdateWrapper().lambda() + boolean updateResult = stockOutOrderService.update(null, new UpdateWrapper().lambda() .set(ReservationStockOutOrder::getReservationAuditId, loginUser.getUserid()) .set(ReservationStockOutOrder::getReservationAuditName, userRealName) .set(ReservationStockOutOrder::getReservationAuditTime, new Date()) @@ -418,6 +418,67 @@ public class ReservationStockOutOrderDomainService { .set(ReservationStockOutOrder::getUpdateTime, new Date()) .set(ReservationStockOutOrder::getIssueStatus, issueStatus) .in(ReservationStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds())); + + //审核通过时同步线路/车次到关联的运输业务单 + if (issueStatus == 2) { + syncLineInfoToBusinessOrder(stockOutOrderDO.getOutOrderIds()); + } + return updateResult; + } + + /** + * 将出库业务单的线路/车次同步到关联的运输业务单(审核通过/下发/执行并下发时触发): + * 关联链路 出库单号->reservation_delivery_details_link.invoiceNumber + * ->business_delivery_details_link.invoiceNumber->orderId(主单/未拆单)/subOrderId(拆单子单) + * 出库业务单与运输业务单为两张独立表,此前无字段同步逻辑,线路车次以出库业务单为源头覆盖; + * 同步失败仅记日志,不阻断主流程。 + */ + private void syncLineInfoToBusinessOrder(List outOrderIds) { + try { + for (Long outOrderId : outOrderIds) { + ReservationStockOutOrder byId = stockOutOrderService.getById(outOrderId); + if (byId == null || StringUtils.isBlank(byId.getLineCode())) { + continue; + } + List deliveryLinks = reservationDeliveryDetailsLinkService.list( + new LambdaQueryWrapper() + .eq(ReservationDeliveryDetailsLink::getOrderNumber, byId.getOutOrderNumber())); + Set syncedBusinessOrderIds = new HashSet<>(); + for (ReservationDeliveryDetailsLink deliveryLink : deliveryLinks) { + if (StringUtils.isBlank(deliveryLink.getInvoiceNumber())) { + continue; + } + List businessLinks = businessDeliveryDetailsLinkService.list( + new LambdaQueryWrapper() + .eq(BusinessDeliveryDetailsLink::getInvoiceNumber, deliveryLink.getInvoiceNumber())); + //未拆单时orderId即运输业务单本身;拆单后orderId为主单、subOrderId为子单,两者均同步 + //(若只同步subOrderId,出库业务单先于运输业务单拆单时subOrderId为空,同步落空, + // 且主单无值导致后续拆单子单也拷贝不到) + for (BusinessDeliveryDetailsLink businessLink : businessLinks) { + for (Object bizOrderIdObj : new Object[]{businessLink.getOrderId(), businessLink.getSubOrderId()}) { + if (bizOrderIdObj == null) { + continue; + } + String bizOrderId = String.valueOf(bizOrderIdObj); + if (!syncedBusinessOrderIds.add(bizOrderId)) { + continue; + } + BusinessDocumentOrder businessOrder = businessDocumentOrderMapper.selectOne( + new LambdaQueryWrapper() + .eq(BusinessDocumentOrder::getId, bizOrderId)); + if (businessOrder != null) { + businessOrder.setLineCode(byId.getLineCode()); + businessOrder.setLineName(byId.getLineName()); + businessOrder.setShuttleNo(byId.getShuttleNo()); + businessDocumentOrderMapper.updateById(businessOrder); + } + } + } + } + } + } catch (Exception e) { + log.error("同步线路/车次到运输业务单失败, outOrderIds={}, error={}", outOrderIds, e.getMessage(), e); + } } /** @@ -444,6 +505,9 @@ public class ReservationStockOutOrderDomainService { .set(ReservationStockOutOrder::getUpdateTime, new Date()) .in(ReservationStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds())); + //下发时同步线路/车次到关联的运输业务单(与审核通过触发同一同步,覆盖式) + syncLineInfoToBusinessOrder(stockOutOrderDO.getOutOrderIds()); + //todo下发推送到wms List inOrderIds = stockOutOrderDO.getOutOrderIds(); @@ -608,6 +672,9 @@ public class ReservationStockOutOrderDomainService { .set(ReservationStockOutOrder::getUpdateTime, new Date()) .in(ReservationStockOutOrder::getOutOrderId, stockOutOrderDO.getOutOrderIds())); + //下发时同步线路/车次到关联的运输业务单(与审核通过触发同一同步,覆盖式) + syncLineInfoToBusinessOrder(stockOutOrderDO.getOutOrderIds()); + //todo下发推送到wms List inOrderIds = stockOutOrderDO.getOutOrderIds();