diff --git a/src/main/java/com/gxwebsoft/glt/controller/GltTicketOrderController.java b/src/main/java/com/gxwebsoft/glt/controller/GltTicketOrderController.java index d8dc338..4502142 100644 --- a/src/main/java/com/gxwebsoft/glt/controller/GltTicketOrderController.java +++ b/src/main/java/com/gxwebsoft/glt/controller/GltTicketOrderController.java @@ -242,6 +242,7 @@ public class GltTicketOrderController extends BaseController { @PutMapping() public ApiResult update(@RequestBody GltTicketOrder gltTicketOrder) { if (gltTicketOrderService.updateById(gltTicketOrder)) { + Integer tenantId = getTenantId(); // 后台指派配送员(直接改 riderId)时,同步商城订单为“已发货”(deliveryStatus=20) if (gltTicketOrder != null && gltTicketOrder.getId() != null @@ -249,10 +250,17 @@ public class GltTicketOrderController extends BaseController { && gltTicketOrder.getRiderId() > 0) { gltTicketOrderService.markShopOrderShippedAfterRiderAssigned( gltTicketOrder.getId(), - getTenantId(), + tenantId, gltTicketOrder.getRiderId() ); } + // 后台直接改“已完成”(deliveryStatus=40)时,同步商城订单为“已完成”(orderStatus=1) + if (gltTicketOrder != null + && gltTicketOrder.getId() != null + && gltTicketOrder.getDeliveryStatus() != null + && gltTicketOrder.getDeliveryStatus() == GltTicketOrderService.DELIVERY_STATUS_FINISHED) { + gltTicketOrderService.markShopOrderCompletedAfterTicketFinished(gltTicketOrder.getId(), tenantId); + } return success("修改成功"); } return fail("修改失败"); diff --git a/src/main/java/com/gxwebsoft/glt/mapper/xml/GltTicketOrderMapper.xml b/src/main/java/com/gxwebsoft/glt/mapper/xml/GltTicketOrderMapper.xml index b45594c..91312a4 100644 --- a/src/main/java/com/gxwebsoft/glt/mapper/xml/GltTicketOrderMapper.xml +++ b/src/main/java/com/gxwebsoft/glt/mapper/xml/GltTicketOrderMapper.xml @@ -11,7 +11,7 @@ d.name as receiverName, d.phone as receiverPhone, d.province as receiverProvince, d.city as receiverCity, d.region as receiverRegion, d.address as receiverAddress, d.full_address as receiverFullAddress, d.lat as receiverLat, d.lng as receiverLng, - f.order_no as orderNo + COALESCE(o.order_no, f.order_no) as orderNo FROM glt_ticket_order a LEFT JOIN shop_store b ON a.store_id = b.id LEFT JOIN shop_store_warehouse w ON a.warehouse_id = w.id @@ -19,6 +19,7 @@ LEFT JOIN gxwebsoft_core.sys_user u ON a.user_id = u.user_id LEFT JOIN shop_user_address d ON a.address_id = d.id LEFT JOIN glt_user_ticket f ON a.user_ticket_id = f.id + LEFT JOIN shop_order o ON f.order_id = o.order_id AND f.tenant_id = o.tenant_id AND o.deleted = 0 diff --git a/src/main/java/com/gxwebsoft/glt/service/GltTicketOrderService.java b/src/main/java/com/gxwebsoft/glt/service/GltTicketOrderService.java index 1252f65..9f3fc81 100644 --- a/src/main/java/com/gxwebsoft/glt/service/GltTicketOrderService.java +++ b/src/main/java/com/gxwebsoft/glt/service/GltTicketOrderService.java @@ -71,6 +71,13 @@ public interface GltTicketOrderService extends IService { */ void markShopOrderShippedAfterRiderAssigned(Integer ticketOrderId, Integer tenantId, Integer riderId); + /** + * 送水订单完成后,同步关联商城订单为“已完成”(orderStatus=1)。 + * + *

用于后台直接改 deliveryStatus=40 等不经过 confirmReceive/autoConfirmTimeout 的兜底同步。

+ */ + void markShopOrderCompletedAfterTicketFinished(Integer ticketOrderId, Integer tenantId); + /** * 配送员开始配送:10 -> 20,并写 sendStartTime。 */ 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 322d39c..cca8400 100644 --- a/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java @@ -21,8 +21,10 @@ 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.entity.ShopOrderGoods; import com.gxwebsoft.shop.service.ShopDealerCapitalService; import com.gxwebsoft.shop.service.ShopDealerUserService; +import com.gxwebsoft.shop.service.ShopOrderGoodsService; import com.gxwebsoft.shop.service.ShopOrderService; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; @@ -77,6 +79,9 @@ public class GltTicketOrderServiceImpl extends ServiceImpl pageRel(GltTicketOrderParam param) { PageParam page = new PageParam<>(param); @@ -249,6 +254,11 @@ public class GltTicketOrderServiceImpl extends ServiceImpl() + .select(ShopOrderGoods::getOrderId) + .eq(ShopOrderGoods::getTenantId, tenantId) + .eq(ShopOrderGoods::getId, userTicket.getOrderGoodsId()) + .last("limit 1") + ); + if (og != null) { + shopOrderId = og.getOrderId(); + resolvedByOrderGoodsId = shopOrderId != null; + } + } if (shopOrderId == null && !StringUtils.hasText(shopOrderNo)) { + log.warn("同步商城订单发货状态失败:未找到关联商城订单 - tenantId={}, ticketOrderId={}, userTicketId={}, userTicket.orderId={}, userTicket.orderNo={}, userTicket.orderGoodsId={}", + tenantId, ticketOrderId, userTicket.getId(), userTicket.getOrderId(), userTicket.getOrderNo(), userTicket.getOrderGoodsId()); return; } + // 若是通过 orderGoodsId 兜底反查到 orderId,则顺便回填 glt_user_ticket.order_id/order_no,减少后续同步/查询依赖兜底分支。 + if (resolvedByOrderGoodsId && userTicket.getOrderId() == null && shopOrderId != null) { + if (!StringUtils.hasText(shopOrderNo)) { + ShopOrder order = shopOrderService.getOne( + new LambdaQueryWrapper() + .select(ShopOrder::getOrderNo) + .eq(ShopOrder::getTenantId, tenantId) + .eq(ShopOrder::getDeleted, 0) + .eq(ShopOrder::getOrderId, shopOrderId) + .last("limit 1") + ); + if (order != null) { + shopOrderNo = order.getOrderNo(); + } + } + + LambdaUpdateWrapper backfill = new LambdaUpdateWrapper() + .eq(GltUserTicket::getTenantId, tenantId) + .eq(GltUserTicket::getDeleted, 0) + .eq(GltUserTicket::getId, userTicket.getId()); + backfill.set(GltUserTicket::getOrderId, shopOrderId); + if (!StringUtils.hasText(userTicket.getOrderNo()) && StringUtils.hasText(shopOrderNo)) { + backfill.set(GltUserTicket::getOrderNo, shopOrderNo); + } + backfill.set(GltUserTicket::getUpdateTime, now); + try { + gltUserTicketService.update(backfill); + } catch (Exception e) { + log.debug("回填水票关联商城订单信息失败(不影响主流程) - tenantId={}, userTicketId={}, orderId={}, orderNo={}", + tenantId, userTicket.getId(), shopOrderId, shopOrderNo, e); + } + } LambdaUpdateWrapper uw = new LambdaUpdateWrapper() .eq(ShopOrder::getTenantId, tenantId) @@ -586,9 +645,58 @@ public class GltTicketOrderServiceImpl extends ServiceImpl() + .select(ShopOrderGoods::getOrderId) + .eq(ShopOrderGoods::getTenantId, tenantId) + .eq(ShopOrderGoods::getId, userTicket.getOrderGoodsId()) + .last("limit 1") + ); + if (og != null) { + shopOrderId = og.getOrderId(); + resolvedByOrderGoodsId = shopOrderId != null; + } + } if (shopOrderId == null && !StringUtils.hasText(shopOrderNo)) { + log.warn("送水订单完成但未找到关联商城订单,无法同步完成状态 - tenantId={}, ticketOrderId={}, userTicketId={}, userTicket.orderId={}, userTicket.orderNo={}, userTicket.orderGoodsId={}", + tenantId, ticketOrderId, userTicket.getId(), userTicket.getOrderId(), userTicket.getOrderNo(), userTicket.getOrderGoodsId()); return; } + // 若是通过 orderGoodsId 兜底反查到 orderId,则顺便回填 glt_user_ticket.order_id/order_no,减少后续同步/查询依赖兜底分支。 + if (resolvedByOrderGoodsId && userTicket.getOrderId() == null && shopOrderId != null) { + if (!StringUtils.hasText(shopOrderNo)) { + ShopOrder order = shopOrderService.getOne( + new LambdaQueryWrapper() + .select(ShopOrder::getOrderNo) + .eq(ShopOrder::getTenantId, tenantId) + .eq(ShopOrder::getDeleted, 0) + .eq(ShopOrder::getOrderId, shopOrderId) + .last("limit 1") + ); + if (order != null) { + shopOrderNo = order.getOrderNo(); + } + } + + LambdaUpdateWrapper backfill = new LambdaUpdateWrapper() + .eq(GltUserTicket::getTenantId, tenantId) + .eq(GltUserTicket::getDeleted, 0) + .eq(GltUserTicket::getId, userTicket.getId()); + backfill.set(GltUserTicket::getOrderId, shopOrderId); + if (!StringUtils.hasText(userTicket.getOrderNo()) && StringUtils.hasText(shopOrderNo)) { + backfill.set(GltUserTicket::getOrderNo, shopOrderNo); + } + backfill.set(GltUserTicket::getUpdateTime, now); + try { + gltUserTicketService.update(backfill); + } catch (Exception e) { + log.debug("回填水票关联商城订单信息失败(不影响主流程) - tenantId={}, userTicketId={}, orderId={}, orderNo={}", + tenantId, userTicket.getId(), shopOrderId, shopOrderNo, e); + } + } LambdaUpdateWrapper uw = new LambdaUpdateWrapper() .eq(ShopOrder::getTenantId, tenantId)