feat(settlement): 优化经销商订单结算逻辑支持水票模板订单

- 引入水票模板服务和相关实体类
- 添加水票模板商品ID加载功能
- 修改订单查询逻辑支持水票模板订单即时结算
- 更新订单认领逻辑适配水票模板订单条件
- 实现普通订单和水票模板订单差异化结算规则
- 添加异常处理确保系统稳定性
This commit is contained in:
2026-03-11 15:14:15 +08:00
parent 2a05686b75
commit b827052956

View File

@@ -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<ShopOrder> orders = findUnsettledPaidOrders();
Set<Integer> waterFormIds = loadWaterFormIds();
List<ShopOrder> 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<ShopOrder> findUnsettledPaidOrders() {
// 以确认收货为准:仅结算 deliveryStatus=20 的订单(租户10584约定)。
return shopOrderService.list(
new LambdaQueryWrapper<ShopOrder>()
private List<ShopOrder> findUnsettledPaidOrders(Set<Integer> waterFormIds) {
// 租户10584约定
// - 普通订单以发货为准deliveryStatus=20才结算
// - 绑定水票模板的订单:支付成功即可体现分润(无需等发货状态变更)。
LambdaQueryWrapper<ShopOrder> qw = new LambdaQueryWrapper<ShopOrder>()
.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)
);
.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);
}
private boolean claimOrderToSettle(Integer orderId) {
return shopOrderService.update(
new LambdaUpdateWrapper<ShopOrder>()
qw.orderByAsc(ShopOrder::getOrderId).last("limit " + MAX_ORDERS_PER_RUN);
return shopOrderService.list(qw);
}
private boolean claimOrderToSettle(Integer orderId, Set<Integer> waterFormIds) {
LambdaUpdateWrapper<ShopOrder> uw = new LambdaUpdateWrapper<ShopOrder>()
.eq(ShopOrder::getOrderId, orderId)
.eq(ShopOrder::getTenantId, TENANT_ID)
.eq(ShopOrder::getIsSettled, 0)
.set(ShopOrder::getIsSettled, 1)
);
.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<Integer> loadWaterFormIds() {
try {
return gltTicketTemplateService.list(
new LambdaQueryWrapper<GltTicketTemplate>()
.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(