fix: 2024-03-25被错误的修改一个问题,导致分销订单无法结算,当前 commit 修复问题并优化问题,解决可能出现的事务问题,采用一条 sql 执行

This commit is contained in:
Chopper711
2024-06-18 09:55:15 +08:00
parent cb776eb4c0
commit 8c5ce396b2
4 changed files with 95 additions and 119 deletions

View File

@@ -3,6 +3,9 @@ package cn.lili.modules.distribution.mapper;
import cn.hutool.core.date.DateTime;
import cn.lili.modules.distribution.entity.dos.DistributionOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
/**
@@ -24,4 +27,15 @@ public interface DistributionOrderMapper extends BaseMapper<DistributionOrder> {
",d.commission_frozen =(ifnull(d.commission_frozen,0) -(SELECT SUM( dorder.rebate ) FROM li_distribution_order AS dorder WHERE dorder.distribution_order_status = #{distributionOrderStatus} AND dorder.settle_cycle< #{settleCycle} AND dorder.distribution_id = d.id ) )")
void rebate(String distributionOrderStatus, DateTime settleCycle);
/**
* 查询待结算的分销订单
* @return 待结算的分销订单
*/
@Select("UPDATE li_distribution_order distribution_order"
+ " INNER JOIN li_order_item oi ON oi.sn = distribution_order.order_item_sn"
+ " SET distribution_order.distribution_order_status = 'WAIT_BILL',"
+ " distribution_order.settle_cycle = #{settleCycle} "
+ " WHERE distribution_order.distribution_order_status = 'NO_COMPLETED'"
+ " AND oi.after_sale_status = 'EXPIRED';")
List<DistributionOrder> distributionSettlementOrder(Date settleCycle);
}

View File

@@ -45,17 +45,13 @@ public interface DistributionOrderService extends IService<DistributionOrder> {
/**
* 订单退款
* 记录分销订单
*
* @param afterSaleSn 售后单号
*/
void refundOrder(AfterSale afterSale);
/**
* 分销订单状态修改
*
* @param orderItems
*/
void updateDistributionOrderStatus(List<OrderItem> orderItems);
void updateDistributionOrderStatus();
/**
* 分销订单结算

View File

@@ -1,13 +1,11 @@
package cn.lili.modules.distribution.serviceimpl;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.common.utils.SpringContextUtil;
import cn.lili.modules.distribution.entity.dos.Distribution;
import cn.lili.modules.distribution.entity.dos.DistributionOrder;
import cn.lili.modules.distribution.entity.enums.DistributionOrderStatusEnum;
@@ -18,10 +16,8 @@ import cn.lili.modules.distribution.service.DistributionOrderService;
import cn.lili.modules.distribution.service.DistributionService;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import cn.lili.modules.order.order.entity.dos.Order;
import cn.lili.modules.order.order.entity.dos.OrderItem;
import cn.lili.modules.order.order.entity.dos.StoreFlow;
import cn.lili.modules.order.order.entity.dto.StoreFlowQueryDTO;
import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum;
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.order.order.service.StoreFlowService;
@@ -34,17 +30,15 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* 分销订单接口实现
@@ -54,7 +48,8 @@ import java.util.stream.Collectors;
*/
@Slf4j
@Service
public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderMapper, DistributionOrder> implements DistributionOrderService {
public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderMapper, DistributionOrder>
implements DistributionOrderService {
/**
* 订单
@@ -78,15 +73,15 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
private SettingService settingService;
@Override
public IPage<DistributionOrder> getDistributionOrderPage(DistributionOrderSearchParams distributionOrderSearchParams) {
return this.page(PageUtil.initPage(distributionOrderSearchParams), distributionOrderSearchParams.queryWrapper());
public IPage<DistributionOrder> getDistributionOrderPage(
DistributionOrderSearchParams distributionOrderSearchParams) {
return this.page(PageUtil.initPage(distributionOrderSearchParams),
distributionOrderSearchParams.queryWrapper());
}
/**
* 1.查看订单是否为分销订单
* 2.查看店铺流水计算分销总佣金
* 3.修改分销员的分销总金额、冻结金额
* 1.查看订单是否为分销订单 2.查看店铺流水计算分销总佣金 3.修改分销员的分销总金额、冻结金额
*
* @param orderSn 订单编号
*/
@@ -100,8 +95,8 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
//判断是否为分销订单,如果为分销订单则获取分销佣金
if (order.getDistributionId() != null) {
//根据订单编号获取有分销金额的店铺流水记录
List<StoreFlow> storeFlowList = storeFlowService
.listStoreFlow(StoreFlowQueryDTO.builder().justDistribution(true).orderSn(orderSn).build());
List<StoreFlow> storeFlowList = storeFlowService.listStoreFlow(
StoreFlowQueryDTO.builder().justDistribution(true).orderSn(orderSn).build());
double rebate = 0.0;
//循环店铺流水记录判断是否包含分销商品
//包含分销商品则进行记录分销订单、计算分销总额
@@ -118,8 +113,8 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
//设置结算天数(解冻日期)
Setting setting = settingService.get(SettingEnum.DISTRIBUTION_SETTING.name());
DistributionSetting distributionSetting = JSONUtil.toBean(setting.getSettingValue(), DistributionSetting.class);
DistributionSetting distributionSetting =
JSONUtil.toBean(setting.getSettingValue(), DistributionSetting.class);
//添加分销订单
this.save(distributionOrder);
@@ -129,26 +124,23 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
distributionService.addRebate(rebate, order.getDistributionId());
//如果天数写0则立即进行结算
// if (distributionSetting.getCashDay().equals(0)) {
// DateTime dateTime = new DateTime();
// dateTime = dateTime.offsetNew(DateField.DAY_OF_MONTH, -distributionSetting.getCashDay());
// //防止事务失效采用上下文获取bean
// DistributionOrderService bean = SpringContextUtil.getBean(DistributionOrderService.class);
// //分销订单结算
// bean.updateRebate(dateTime, DistributionOrderStatusEnum.WAIT_BILL.name());
// }
// if (distributionSetting.getCashDay().equals(0)) {
// DateTime dateTime = new DateTime();
// dateTime = dateTime.offsetNew(DateField.DAY_OF_MONTH, -distributionSetting.getCashDay());
// //防止事务失效采用上下文获取bean
// DistributionOrderService bean = SpringContextUtil.getBean(DistributionOrderService.class);
// //分销订单结算
// bean.updateRebate(dateTime, DistributionOrderStatusEnum.WAIT_BILL.name());
// }
}
}
}
}
/**
* 1.获取订单判断是否为已付款的分销订单
* 2.查看店铺流水记录分销佣金
* 3.修改分销员的分销总金额、可提现金额
* 1.获取订单判断是否为已付款的分销订单 2.查看店铺流水记录分销佣金 3.修改分销员的分销总金额、可提现金额
*
* @param orderSn 订单编号
*/
@@ -162,8 +154,8 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
if (order.getDistributionId() != null && order.getPayStatus().equals(PayStatusEnum.PAID.name())) {
//根据订单编号获取有分销金额的店铺流水记录
List<DistributionOrder> distributionOrderList = this.list(new LambdaQueryWrapper<DistributionOrder>()
.eq(DistributionOrder::getOrderSn, orderSn));
List<DistributionOrder> distributionOrderList =
this.list(new LambdaQueryWrapper<DistributionOrder>().eq(DistributionOrder::getOrderSn, orderSn));
//如果没有分销定单,则直接返回
if (distributionOrderList.isEmpty()) {
@@ -185,18 +177,20 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
//修改分销订单的状态
this.update(new LambdaUpdateWrapper<DistributionOrder>().eq(DistributionOrder::getOrderSn, orderSn)
.set(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.CANCEL.name()));
.set(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.CANCEL.name()));
}
@Override
public void refundOrder(AfterSale afterSale) {
//判断是否为分销订单
StoreFlow refundStoreFlow = storeFlowService.queryOne(StoreFlowQueryDTO.builder().justDistribution(true).refundSn(afterSale.getSn()).build());
StoreFlow refundStoreFlow = storeFlowService.queryOne(
StoreFlowQueryDTO.builder().justDistribution(true).refundSn(afterSale.getSn()).build());
if (refundStoreFlow != null) {
//获取收款分销订单
DistributionOrder distributionOrder = this.getOne(new LambdaQueryWrapper<DistributionOrder>()
.eq(DistributionOrder::getOrderItemSn, afterSale.getOrderItemSn()));
DistributionOrder distributionOrder = this.getOne(
new LambdaQueryWrapper<DistributionOrder>().eq(DistributionOrder::getOrderItemSn,
afterSale.getOrderItemSn()));
//分销订单不存在,则直接返回
if (distributionOrder == null) {
return;
@@ -204,59 +198,27 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
if (distributionOrder.getSellBackRebate() == null) {
distributionOrder.setSellBackRebate(refundStoreFlow.getDistributionRebate());
} else {
distributionOrder.setSellBackRebate(CurrencyUtil.add(distributionOrder.getSellBackRebate(), refundStoreFlow.getDistributionRebate()));
distributionOrder.setSellBackRebate(
CurrencyUtil.add(distributionOrder.getSellBackRebate(), refundStoreFlow.getDistributionRebate()));
}
distributionOrder.setRebate(CurrencyUtil.sub(distributionOrder.getRebate(), refundStoreFlow.getDistributionRebate()));
distributionOrder.setRebate(
CurrencyUtil.sub(distributionOrder.getRebate(), refundStoreFlow.getDistributionRebate()));
if (distributionOrder.getRebate() == 0) {
distributionOrder.setDistributionOrderStatus(DistributionOrderStatusEnum.REFUND.name());
}
this.updateById(distributionOrder);
// 修改分销员提成金额
distributionService.subCanRebate(CurrencyUtil.sub(0, refundStoreFlow.getDistributionRebate()), distributionOrder.getDistributionId());
// 修改分销员提成金额
distributionService.subCanRebate(CurrencyUtil.sub(0, refundStoreFlow.getDistributionRebate()),
distributionOrder.getDistributionId());
}
}
@Override
public void updateDistributionOrderStatus(List<OrderItem> orderItems) {
if (orderItems.isEmpty()) {
return;
}
public void updateDistributionOrderStatus() {
//获取未完成分销订单
List<DistributionOrder> distributionOrderList = this.list(new LambdaQueryWrapper<DistributionOrder>()
.eq(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.NO_COMPLETED.name()));
if (distributionOrderList.isEmpty()) {
return;
}
List<DistributionOrder> list = ListUtil.list(false);
orderItems.stream().forEach(orderItem -> {
//订单售后状态为已失效并且投诉状态为已失效
if (StrUtil.equals(OrderItemAfterSaleStatusEnum.EXPIRED.name(), orderItem.getAfterSaleStatus())) {
List<DistributionOrder> collect = distributionOrderList.stream()
.filter(distributionOrder -> StrUtil.equals(distributionOrder.getOrderItemSn(), orderItem.getSn()))
.map((distributionOrder) -> {
distributionOrder.setDistributionOrderStatus(DistributionOrderStatusEnum.WAIT_BILL.name());
distributionOrder.setSettleCycle(new Date());
return distributionOrder;
})
.collect(Collectors.toList());
list.addAll(collect);
}
});
if (!list.isEmpty()) {
//批量修改分销订单结算状态
this.updateBatchById(list);
}
baseMapper.distributionSettlementOrder(new Date());
}
@Override
@@ -264,20 +226,21 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
//结算时间延后五分钟
dateTime = dateTime.offsetNew(DateField.MINUTE, 5);
//获取待结算订单
List<DistributionOrder> distributionOrderList = this.list(new LambdaQueryWrapper<DistributionOrder>()
.eq(DistributionOrder::getDistributionOrderStatus, distributionOrderStatus)
.isNotNull(DistributionOrder::getSettleCycle)
List<DistributionOrder> distributionOrderList = this.list(
new LambdaQueryWrapper<DistributionOrder>().eq(DistributionOrder::getDistributionOrderStatus,
distributionOrderStatus).isNotNull(DistributionOrder::getSettleCycle)
.le(DistributionOrder::getSettleCycle, dateTime));
//校验待结算订单
if (ObjectUtil.isNotNull(distributionOrderList) && distributionOrderList.size() > 0) {
//结算分销人员信息列表
List<Distribution> distributionUpdateList = new ArrayList<>();
//获取分销员信息
List<Distribution> distributionList = distributionService.list(new LambdaQueryWrapper<Distribution>()
.eq(Distribution::getDistributionStatus, DistributionStatusEnum.PASS.name()));
List<Distribution> distributionList = distributionService.list(
new LambdaQueryWrapper<Distribution>().eq(Distribution::getDistributionStatus,
DistributionStatusEnum.PASS.name()));
//根据销人员获取对应分销订单
Map<String, List<DistributionOrder>> distributionOrderList1 = distributionOrderList.stream()
.collect(Collectors.groupingBy(DistributionOrder::getDistributionId));
Map<String, List<DistributionOrder>> distributionOrderList1 =
distributionOrderList.stream().collect(Collectors.groupingBy(DistributionOrder::getDistributionId));
//校验分销订单不为空
if (ObjectUtil.isNotNull(distributionOrderList1) && distributionOrderList1.size() > 0) {
@@ -302,10 +265,8 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
this.updateBatchById(distributionOrderList);
}
}
/**
* 计算分销结算金额
*
@@ -314,20 +275,25 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
* @param distributionList 分销列表
* @return
*/
public Distribution checkDistribution(String
distributionId, List<DistributionOrder> list, List<Distribution> distributionList) {
public Distribution checkDistribution(String distributionId, List<DistributionOrder> list,
List<Distribution> distributionList) {
//获取所有待结算订单分销人员信息
Distribution distribution = distributionList.parallelStream().filter(a -> StrUtil.equals(a.getId(), distributionId)).collect(Collectors.toList()).get(0);
Distribution distribution =
distributionList.parallelStream().filter(a -> StrUtil.equals(a.getId(), distributionId))
.collect(Collectors.toList()).get(0);
//获取分销订单总金额
double rebate = list.stream().mapToDouble(DistributionOrder::getRebate).sum();
//检验单分销人员冻结金额为负数时.扣除负数冻结金额后再结算
if (distribution.getCommissionFrozen() < 0) {
rebate = CurrencyUtil.add(distribution.getCommissionFrozen() == null ? 0.0 : distribution.getCommissionFrozen(), rebate);
rebate =
CurrencyUtil.add(distribution.getCommissionFrozen() == null ? 0.0 : distribution.getCommissionFrozen(),
rebate);
}
//结算订单总金额+分销可提现金额
Double canRebate = CurrencyUtil.add(rebate, distribution.getCanRebate() == null ? 0.0 : distribution.getCanRebate());
Double canRebate =
CurrencyUtil.add(rebate, distribution.getCanRebate() == null ? 0.0 : distribution.getCanRebate());
//结算金额小于0
if (canRebate < 0) {
//结算订单总金额+分销可提现金额