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(