From 448185080918f246d3c9408bdcbf86e18718a423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Tue, 10 Feb 2026 11:29:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(ticket):=20=E6=8E=A5=E5=8D=95=E6=97=B6?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=95=86=E5=9F=8E=E8=AE=A2=E5=8D=95=E5=8F=91?= =?UTF-8?q?=E8=B4=A7=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在接单方法上添加事务注解确保操作原子性 - 优化时间获取逻辑避免重复调用当前时间 - 新增updateShopOrderDeliveryStatusAfterAccept方法处理发货状态同步 - 查询关联水票订单并更新对应商城订单的配送状态为20(已发货) - 添加幂等性检查避免重复更新并记录异常情况日志 - 引入ShopOrder和ShopOrderService依赖支持订单状态更新 --- .../impl/GltTicketOrderServiceImpl.java | 80 ++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java b/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java index 82f8f08..f8065c2 100644 --- a/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java @@ -1,6 +1,8 @@ package com.gxwebsoft.glt.service.impl; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.common.core.exception.BusinessException; import com.gxwebsoft.common.core.web.PageParam; @@ -18,8 +20,10 @@ import com.gxwebsoft.glt.service.GltUserTicketLogService; import com.gxwebsoft.glt.service.GltUserTicketService; import com.gxwebsoft.shop.entity.ShopDealerCapital; import com.gxwebsoft.shop.entity.ShopDealerUser; +import com.gxwebsoft.shop.entity.ShopOrder; import com.gxwebsoft.shop.service.ShopDealerCapitalService; import com.gxwebsoft.shop.service.ShopDealerUserService; +import com.gxwebsoft.shop.service.ShopOrderService; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import org.springframework.stereotype.Service; @@ -70,6 +74,9 @@ public class GltTicketOrderServiceImpl extends ServiceImpl pageRel(GltTicketOrderParam param) { PageParam page = new PageParam<>(param); @@ -192,6 +199,7 @@ public class GltTicketOrderServiceImpl extends ServiceImpl w.isNull(GltTicketOrder::getRiderId).or().eq(GltTicketOrder::getRiderId, 0)) .update(); if (ok) { + // 接单成功后,同步商城订单发货状态:10未发货 -> 20已发货 + updateShopOrderDeliveryStatusAfterAccept(id, tenantId, now); return; } @@ -233,6 +244,73 @@ public class GltTicketOrderServiceImpl extends ServiceImpl() + .eq(GltUserTicket::getTenantId, tenantId) + .eq(GltUserTicket::getDeleted, 0) + .eq(GltUserTicket::getId, ticketOrder.getUserTicketId()) + .last("limit 1") + ); + if (userTicket == null) { + return; + } + + Integer shopOrderId = userTicket.getOrderId(); + String shopOrderNo = userTicket.getOrderNo(); + if (shopOrderId == null && !StringUtils.hasText(shopOrderNo)) { + return; + } + + LambdaUpdateWrapper uw = new LambdaUpdateWrapper() + .eq(ShopOrder::getTenantId, tenantId) + .eq(ShopOrder::getDeleted, 0) + .and(w -> w.ne(ShopOrder::getDeliveryStatus, 20).or().isNull(ShopOrder::getDeliveryStatus)) + .set(ShopOrder::getDeliveryStatus, 20) + .set(ShopOrder::getUpdateTime, now); + if (shopOrderId != null) { + uw.eq(ShopOrder::getOrderId, shopOrderId); + } else { + uw.eq(ShopOrder::getOrderNo, shopOrderNo); + } + + boolean updated = shopOrderService.update(uw); + if (updated) { + return; + } + + // 幂等:若已是 20,则视为成功;否则记录日志便于排查关联关系/数据缺失 + LambdaQueryWrapper qw = new LambdaQueryWrapper() + .eq(ShopOrder::getTenantId, tenantId) + .eq(ShopOrder::getDeleted, 0) + .eq(ShopOrder::getDeliveryStatus, 20); + if (shopOrderId != null) { + qw.eq(ShopOrder::getOrderId, shopOrderId); + } else { + qw.eq(ShopOrder::getOrderNo, shopOrderNo); + } + if (shopOrderService.count(qw) <= 0) { + log.warn("接单成功但同步商城订单发货状态失败 - tenantId={}, ticketOrderId={}, shopOrderId={}, shopOrderNo={}", + tenantId, ticketOrderId, shopOrderId, shopOrderNo); + } + } + @Override public void start(Integer id, Integer riderId, Integer tenantId) { if (id == null) {