Commit 150a1c9771e987101d2f8eccb0a8daeda7430260
1 parent
2e5cc053
重构:将订单的分支流程,抽到 TradeOrderHandler 实现类中(取消的排重逻辑)
Showing
4 changed files
with
68 additions
and
10 deletions
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 | ... | ... |