Commit 150a1c9771e987101d2f8eccb0a8daeda7430260

Authored by YunaiV
1 parent 2e5cc053

重构:将订单的分支流程,抽到 TradeOrderHandler 实现类中(取消的排重逻辑)

yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBrokerageOrderHandler.java
1 1 package cn.iocoder.yudao.module.trade.service.order.handler;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.hutool.core.lang.Assert;
4 5 import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
5 6 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
... ... @@ -53,21 +54,36 @@ public class TradeBrokerageOrderHandler implements TradeOrderHandler {
53 54  
54 55 @Override
55 56 public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
56   - if (order.getBrokerageUserId() != null) {
57   - addBrokerage(order.getUserId(), orderItems);
  57 + if (order.getBrokerageUserId() == null) {
  58 + return;
58 59 }
  60 + addBrokerage(order.getUserId(), orderItems);
59 61 }
60 62  
61 63 @Override
62 64 public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
63   - // TODO 芋艿:取消支付时,需要处理下;
  65 + // 如果是未支付的订单,不会产生分销结果,所以直接 return
  66 + if (!order.getPayStatus()) {
  67 + return;
  68 + }
  69 + if (order.getBrokerageUserId() == null) {
  70 + return;
  71 + }
  72 +
  73 + // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚
  74 + orderItems = filterOrderItemListByNoneAfterSale(orderItems);
  75 + if (CollUtil.isEmpty(orderItems)) {
  76 + return;
  77 + }
  78 + orderItems.forEach(orderItem -> afterCancelOrderItem(order, orderItem));
64 79 }
65 80  
66 81 @Override
67 82 public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {
68   - if (order.getBrokerageUserId() != null) {
69   - cancelBrokerage(order.getId(), orderItem.getOrderId());
  83 + if (order.getBrokerageUserId() == null) {
  84 + return;
70 85 }
  86 + cancelBrokerage(order.getId(), orderItem.getOrderId());
71 87 }
72 88  
73 89 /**
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeMemberPointOrderHandler.java
1 1 package cn.iocoder.yudao.module.trade.service.order.handler;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.iocoder.yudao.module.member.api.level.MemberLevelApi;
4 5 import cn.iocoder.yudao.module.member.api.point.MemberPointApi;
5 6 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
... ... @@ -13,6 +14,8 @@ import org.springframework.stereotype.Component;
13 14 import javax.annotation.Resource;
14 15 import java.util.List;
15 16  
  17 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue;
  18 +
16 19 /**
17 20 * 会员积分、等级的 {@link TradeOrderHandler} 实现类
18 21 *
... ... @@ -48,10 +51,29 @@ public class TradeMemberPointOrderHandler implements TradeOrderHandler {
48 51  
49 52 @Override
50 53 public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
51   - // 扣减(回滚)用户积分(订单抵扣)
52   - addPoint(order.getUserId(), order.getUsePoint(), MemberPointBizTypeEnum.ORDER_CANCEL,
  54 + // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚
  55 + orderItems = filterOrderItemListByNoneAfterSale(orderItems);
  56 + if (CollUtil.isEmpty(orderItems)) {
  57 + return;
  58 + }
  59 +
  60 + // 增加(回滚)用户积分(订单抵扣)
  61 + Integer usePoint = getSumValue(orderItems, TradeOrderItemDO::getUsePoint, Integer::sum);
  62 + addPoint(order.getUserId(), usePoint, MemberPointBizTypeEnum.ORDER_CANCEL,
  63 + order.getId());
  64 + // 如下的返还,需要经过支持,也就是经历 afterPayOrder 流程
  65 + if (!order.getPayStatus()) {
  66 + return;
  67 + }
  68 + // 扣减(回滚)积分(订单赠送)
  69 + Integer givePoint = getSumValue(orderItems, TradeOrderItemDO::getGivePoint, Integer::sum);
  70 + reducePoint(order.getUserId(), givePoint, MemberPointBizTypeEnum.ORDER_CANCEL,
53 71 order.getId());
54   - // TODO 芋艿:需要校验;如果部分子订单已经售后退款,则不进行整单退;因为已经退了一部分积分了
  72 + // 扣减(回滚)用户经验
  73 + int payPrice = order.getPayPrice() - order.getRefundPrice();
  74 + // TODO @疯狂:这里的 bizId 和 afterCancelOrderItem 不一致了,有什么建议的处理方案?
  75 + memberLevelApi.addExperience(order.getUserId(), -payPrice, MemberExperienceBizTypeEnum.REFUND.getType(),
  76 + String.valueOf(order.getId()));
55 77 }
56 78  
57 79 @Override
... ... @@ -59,7 +81,7 @@ public class TradeMemberPointOrderHandler implements TradeOrderHandler {
59 81 // 扣减(回滚)积分(订单赠送)
60 82 reducePoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.AFTER_SALE_DEDUCT_GIVE,
61 83 orderItem.getAfterSaleId());
62   - // 扣减(回滚)积分:增加用户积分(返还抵扣)
  84 + // 增加(回滚)积分(订单抵扣)
63 85 addPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.AFTER_SALE_REFUND_USED,
64 86 orderItem.getAfterSaleId());
65 87  
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeOrderHandler.java
1 1 package cn.iocoder.yudao.module.trade.service.order.handler;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
4 5 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  6 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
5 7  
6 8 import java.util.List;
7 9  
... ... @@ -60,4 +62,17 @@ public interface TradeOrderHandler {
60 62 */
61 63 default void beforeDeliveryOrder(TradeOrderDO order) {}
62 64  
  65 + // ========== 公用方法 ==========
  66 +
  67 + /**
  68 + * 过滤“未售后”的订单项列表
  69 + *
  70 + * @param orderItems 订单项列表
  71 + * @return 过滤后的订单项列表
  72 + */
  73 + default List<TradeOrderItemDO> filterOrderItemListByNoneAfterSale(List<TradeOrderItemDO> orderItems) {
  74 + CollUtil.filterNew(orderItems, item -> !TradeOrderItemAfterSaleStatusEnum.isNone(item.getAfterSaleStatus()));
  75 + return orderItems;
  76 + }
  77 +
63 78 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeProductSkuOrderHandler.java
1 1 package cn.iocoder.yudao.module.trade.service.order.handler;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
3 4 import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
4 5 import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
5 6 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
... ... @@ -29,7 +30,11 @@ public class TradeProductSkuOrderHandler implements TradeOrderHandler {
29 30  
30 31 @Override
31 32 public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
32   - // TODO 芋艿:如果部分售后,最后导致取消;这里需要过滤下;
  33 + // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚
  34 + orderItems = filterOrderItemListByNoneAfterSale(orderItems);
  35 + if (CollUtil.isEmpty(orderItems)) {
  36 + return;
  37 + }
33 38 productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(orderItems));
34 39 }
35 40  
... ...