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 | 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 |