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 package cn.iocoder.yudao.module.trade.service.order.handler; 1 package cn.iocoder.yudao.module.trade.service.order.handler;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
3 import cn.hutool.core.lang.Assert; 4 import cn.hutool.core.lang.Assert;
4 import cn.iocoder.yudao.module.member.api.user.MemberUserApi; 5 import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
5 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; 6 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
@@ -53,21 +54,36 @@ public class TradeBrokerageOrderHandler implements TradeOrderHandler { @@ -53,21 +54,36 @@ public class TradeBrokerageOrderHandler implements TradeOrderHandler {
53 54
54 @Override 55 @Override
55 public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { 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 @Override 63 @Override
62 public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { 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 @Override 81 @Override
67 public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) { 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 package cn.iocoder.yudao.module.trade.service.order.handler; 1 package cn.iocoder.yudao.module.trade.service.order.handler;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
3 import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; 4 import cn.iocoder.yudao.module.member.api.level.MemberLevelApi;
4 import cn.iocoder.yudao.module.member.api.point.MemberPointApi; 5 import cn.iocoder.yudao.module.member.api.point.MemberPointApi;
5 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; 6 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
@@ -13,6 +14,8 @@ import org.springframework.stereotype.Component; @@ -13,6 +14,8 @@ import org.springframework.stereotype.Component;
13 import javax.annotation.Resource; 14 import javax.annotation.Resource;
14 import java.util.List; 15 import java.util.List;
15 16
  17 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue;
  18 +
16 /** 19 /**
17 * 会员积分、等级的 {@link TradeOrderHandler} 实现类 20 * 会员积分、等级的 {@link TradeOrderHandler} 实现类
18 * 21 *
@@ -48,10 +51,29 @@ public class TradeMemberPointOrderHandler implements TradeOrderHandler { @@ -48,10 +51,29 @@ public class TradeMemberPointOrderHandler implements TradeOrderHandler {
48 51
49 @Override 52 @Override
50 public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { 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 order.getId()); 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 @Override 79 @Override
@@ -59,7 +81,7 @@ public class TradeMemberPointOrderHandler implements TradeOrderHandler { @@ -59,7 +81,7 @@ public class TradeMemberPointOrderHandler implements TradeOrderHandler {
59 // 扣减(回滚)积分(订单赠送) 81 // 扣减(回滚)积分(订单赠送)
60 reducePoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.AFTER_SALE_DEDUCT_GIVE, 82 reducePoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.AFTER_SALE_DEDUCT_GIVE,
61 orderItem.getAfterSaleId()); 83 orderItem.getAfterSaleId());
62 - // 扣减(回滚)积分:增加用户积分(返还抵扣) 84 + // 增加(回滚)积分(订单抵扣)
63 addPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.AFTER_SALE_REFUND_USED, 85 addPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.AFTER_SALE_REFUND_USED,
64 orderItem.getAfterSaleId()); 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 package cn.iocoder.yudao.module.trade.service.order.handler; 1 package cn.iocoder.yudao.module.trade.service.order.handler;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
3 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 4 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
4 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; 5 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  6 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
5 7
6 import java.util.List; 8 import java.util.List;
7 9
@@ -60,4 +62,17 @@ public interface TradeOrderHandler { @@ -60,4 +62,17 @@ public interface TradeOrderHandler {
60 */ 62 */
61 default void beforeDeliveryOrder(TradeOrderDO order) {} 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 package cn.iocoder.yudao.module.trade.service.order.handler; 1 package cn.iocoder.yudao.module.trade.service.order.handler;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
3 import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi; 4 import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
4 import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; 5 import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
5 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 6 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
@@ -29,7 +30,11 @@ public class TradeProductSkuOrderHandler implements TradeOrderHandler { @@ -29,7 +30,11 @@ public class TradeProductSkuOrderHandler implements TradeOrderHandler {
29 30
30 @Override 31 @Override
31 public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { 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 productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(orderItems)); 38 productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(orderItems));
34 } 39 }
35 40