From b82705295635c0dcf31504ace9f9f65a54f099c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Wed, 11 Mar 2026 15:14:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(settlement):=20=E4=BC=98=E5=8C=96=E7=BB=8F?= =?UTF-8?q?=E9=94=80=E5=95=86=E8=AE=A2=E5=8D=95=E7=BB=93=E7=AE=97=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E6=94=AF=E6=8C=81=E6=B0=B4=E7=A5=A8=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入水票模板服务和相关实体类 - 添加水票模板商品ID加载功能 - 修改订单查询逻辑支持水票模板订单即时结算 - 更新订单认领逻辑适配水票模板订单条件 - 实现普通订单和水票模板订单差异化结算规则 - 添加异常处理确保系统稳定性 --- .../task/DealerOrderSettlement10584Task.java | 79 +++++++++++++------ 1 file changed, 57 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java b/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java index 3dc3368..fdda29b 100644 --- a/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java +++ b/src/main/java/com/gxwebsoft/glt/task/DealerOrderSettlement10584Task.java @@ -3,6 +3,8 @@ package com.gxwebsoft.glt.task; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.gxwebsoft.common.core.annotation.IgnoreTenant; +import com.gxwebsoft.glt.entity.GltTicketTemplate; +import com.gxwebsoft.glt.service.GltTicketTemplateService; import com.gxwebsoft.shop.entity.ShopDealerCapital; import com.gxwebsoft.shop.entity.ShopDealerOrder; import com.gxwebsoft.shop.entity.ShopDealerReferee; @@ -87,6 +89,9 @@ public class DealerOrderSettlement10584Task { @Resource private UserMapper userMapper; + @Resource + private GltTicketTemplateService gltTicketTemplateService; + /** * 每10秒执行一次。 */ @@ -94,7 +99,8 @@ public class DealerOrderSettlement10584Task { @IgnoreTenant("该定时任务仅处理租户10584,但需要显式按tenantId过滤,避免定时任务线程无租户上下文导致查询异常") public void settleTenant10584Orders() { try { - List orders = findUnsettledPaidOrders(); + Set waterFormIds = loadWaterFormIds(); + List orders = findUnsettledPaidOrders(waterFormIds); if (orders.isEmpty()) { return; } @@ -118,7 +124,7 @@ public class DealerOrderSettlement10584Task { try { transactionTemplate.executeWithoutResult(status -> { // 先“认领”订单:并发/多实例下避免重复结算(update=0 表示被其他线程/实例处理) - if (!claimOrderToSettle(order.getOrderId())) { + if (!claimOrderToSettle(order.getOrderId(), waterFormIds)) { return; } settleOneOrder(order, level1ParentCache, shopRoleCache, totalDealerUser, dealerBasicSetting.level); @@ -132,28 +138,57 @@ public class DealerOrderSettlement10584Task { } } - private List findUnsettledPaidOrders() { - // 以确认收货为准:仅结算 deliveryStatus=20 的订单(租户10584约定)。 - return shopOrderService.list( - new LambdaQueryWrapper() - .eq(ShopOrder::getTenantId, TENANT_ID) - .eq(ShopOrder::getDeleted, 0) - .eq(ShopOrder::getPayStatus, true) - .eq(ShopOrder::getDeliveryStatus, 20) - .eq(ShopOrder::getIsSettled, 0) - .orderByAsc(ShopOrder::getOrderId) - .last("limit " + MAX_ORDERS_PER_RUN) - ); + private List findUnsettledPaidOrders(Set waterFormIds) { + // 租户10584约定: + // - 普通订单:以发货为准(deliveryStatus=20)才结算; + // - 绑定水票模板的订单:支付成功即可体现分润(无需等发货状态变更)。 + LambdaQueryWrapper qw = new LambdaQueryWrapper() + .eq(ShopOrder::getTenantId, TENANT_ID) + .eq(ShopOrder::getDeleted, 0) + .eq(ShopOrder::getPayStatus, true) + .eq(ShopOrder::getIsSettled, 0); + + if (waterFormIds != null && !waterFormIds.isEmpty()) { + qw.and(w -> w.eq(ShopOrder::getDeliveryStatus, 20).or().in(ShopOrder::getFormId, waterFormIds)); + } else { + qw.eq(ShopOrder::getDeliveryStatus, 20); + } + + qw.orderByAsc(ShopOrder::getOrderId).last("limit " + MAX_ORDERS_PER_RUN); + return shopOrderService.list(qw); } - private boolean claimOrderToSettle(Integer orderId) { - return shopOrderService.update( - new LambdaUpdateWrapper() - .eq(ShopOrder::getOrderId, orderId) - .eq(ShopOrder::getTenantId, TENANT_ID) - .eq(ShopOrder::getIsSettled, 0) - .set(ShopOrder::getIsSettled, 1) - ); + private boolean claimOrderToSettle(Integer orderId, Set waterFormIds) { + LambdaUpdateWrapper uw = new LambdaUpdateWrapper() + .eq(ShopOrder::getOrderId, orderId) + .eq(ShopOrder::getTenantId, TENANT_ID) + .eq(ShopOrder::getIsSettled, 0); + + if (waterFormIds != null && !waterFormIds.isEmpty()) { + uw.and(w -> w.eq(ShopOrder::getDeliveryStatus, 20).or().in(ShopOrder::getFormId, waterFormIds)); + } else { + uw.eq(ShopOrder::getDeliveryStatus, 20); + } + + uw.set(ShopOrder::getIsSettled, 1); + return shopOrderService.update(uw); + } + + private Set loadWaterFormIds() { + try { + return gltTicketTemplateService.list( + new LambdaQueryWrapper() + .eq(GltTicketTemplate::getTenantId, TENANT_ID) + .eq(GltTicketTemplate::getDeleted, 0) + .isNotNull(GltTicketTemplate::getGoodsId) + ).stream() + .map(GltTicketTemplate::getGoodsId) + .filter(Objects::nonNull) + .collect(java.util.stream.Collectors.toSet()); + } catch (Exception e) { + log.warn("读取水票模板goodsId失败,将按普通订单规则结算 - tenantId={}", TENANT_ID, e); + return Collections.emptySet(); + } } private void settleOneOrder(