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.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import com.gxwebsoft.common.core.annotation.IgnoreTenant;
|
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.ShopDealerCapital;
|
||||||
import com.gxwebsoft.shop.entity.ShopDealerOrder;
|
import com.gxwebsoft.shop.entity.ShopDealerOrder;
|
||||||
import com.gxwebsoft.shop.entity.ShopDealerReferee;
|
import com.gxwebsoft.shop.entity.ShopDealerReferee;
|
||||||
@@ -87,6 +89,9 @@ public class DealerOrderSettlement10584Task {
|
|||||||
@Resource
|
@Resource
|
||||||
private UserMapper userMapper;
|
private UserMapper userMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private GltTicketTemplateService gltTicketTemplateService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 每10秒执行一次。
|
* 每10秒执行一次。
|
||||||
*/
|
*/
|
||||||
@@ -94,7 +99,8 @@ public class DealerOrderSettlement10584Task {
|
|||||||
@IgnoreTenant("该定时任务仅处理租户10584,但需要显式按tenantId过滤,避免定时任务线程无租户上下文导致查询异常")
|
@IgnoreTenant("该定时任务仅处理租户10584,但需要显式按tenantId过滤,避免定时任务线程无租户上下文导致查询异常")
|
||||||
public void settleTenant10584Orders() {
|
public void settleTenant10584Orders() {
|
||||||
try {
|
try {
|
||||||
List<ShopOrder> orders = findUnsettledPaidOrders();
|
Set<Integer> waterFormIds = loadWaterFormIds();
|
||||||
|
List<ShopOrder> orders = findUnsettledPaidOrders(waterFormIds);
|
||||||
if (orders.isEmpty()) {
|
if (orders.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -118,7 +124,7 @@ public class DealerOrderSettlement10584Task {
|
|||||||
try {
|
try {
|
||||||
transactionTemplate.executeWithoutResult(status -> {
|
transactionTemplate.executeWithoutResult(status -> {
|
||||||
// 先“认领”订单:并发/多实例下避免重复结算(update=0 表示被其他线程/实例处理)
|
// 先“认领”订单:并发/多实例下避免重复结算(update=0 表示被其他线程/实例处理)
|
||||||
if (!claimOrderToSettle(order.getOrderId())) {
|
if (!claimOrderToSettle(order.getOrderId(), waterFormIds)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
settleOneOrder(order, level1ParentCache, shopRoleCache, totalDealerUser, dealerBasicSetting.level);
|
settleOneOrder(order, level1ParentCache, shopRoleCache, totalDealerUser, dealerBasicSetting.level);
|
||||||
@@ -132,28 +138,57 @@ public class DealerOrderSettlement10584Task {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<ShopOrder> findUnsettledPaidOrders() {
|
private List<ShopOrder> findUnsettledPaidOrders(Set<Integer> waterFormIds) {
|
||||||
// 以确认收货为准:仅结算 deliveryStatus=20 的订单(租户10584约定)。
|
// 租户10584约定:
|
||||||
return shopOrderService.list(
|
// - 普通订单:以发货为准(deliveryStatus=20)才结算;
|
||||||
new LambdaQueryWrapper<ShopOrder>()
|
// - 绑定水票模板的订单:支付成功即可体现分润(无需等发货状态变更)。
|
||||||
.eq(ShopOrder::getTenantId, TENANT_ID)
|
LambdaQueryWrapper<ShopOrder> qw = new LambdaQueryWrapper<ShopOrder>()
|
||||||
.eq(ShopOrder::getDeleted, 0)
|
.eq(ShopOrder::getTenantId, TENANT_ID)
|
||||||
.eq(ShopOrder::getPayStatus, true)
|
.eq(ShopOrder::getDeleted, 0)
|
||||||
.eq(ShopOrder::getDeliveryStatus, 20)
|
.eq(ShopOrder::getPayStatus, true)
|
||||||
.eq(ShopOrder::getIsSettled, 0)
|
.eq(ShopOrder::getIsSettled, 0);
|
||||||
.orderByAsc(ShopOrder::getOrderId)
|
|
||||||
.last("limit " + MAX_ORDERS_PER_RUN)
|
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) {
|
private boolean claimOrderToSettle(Integer orderId, Set<Integer> waterFormIds) {
|
||||||
return shopOrderService.update(
|
LambdaUpdateWrapper<ShopOrder> uw = new LambdaUpdateWrapper<ShopOrder>()
|
||||||
new LambdaUpdateWrapper<ShopOrder>()
|
.eq(ShopOrder::getOrderId, orderId)
|
||||||
.eq(ShopOrder::getOrderId, orderId)
|
.eq(ShopOrder::getTenantId, TENANT_ID)
|
||||||
.eq(ShopOrder::getTenantId, TENANT_ID)
|
.eq(ShopOrder::getIsSettled, 0);
|
||||||
.eq(ShopOrder::getIsSettled, 0)
|
|
||||||
.set(ShopOrder::getIsSettled, 1)
|
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(
|
private void settleOneOrder(
|
||||||
|
|||||||
Reference in New Issue
Block a user