feat(settlement): 优化经销商订单结算逻辑支持水票模板订单
- 引入水票模板服务和相关实体类 - 添加水票模板商品ID加载功能 - 修改订单查询逻辑支持水票模板订单即时结算 - 更新订单认领逻辑适配水票模板订单条件 - 实现普通订单和水票模板订单差异化结算规则 - 添加异常处理确保系统稳定性
This commit is contained in:
@@ -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>()
|
||||
.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<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::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<ShopOrder>()
|
||||
.eq(ShopOrder::getOrderId, orderId)
|
||||
.eq(ShopOrder::getTenantId, TENANT_ID)
|
||||
.eq(ShopOrder::getIsSettled, 0)
|
||||
.set(ShopOrder::getIsSettled, 1)
|
||||
);
|
||||
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);
|
||||
|
||||
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(
|
||||
|
||||
Reference in New Issue
Block a user