Commit b0179457ce0ccf4cf5336e99206fcab5e34853f9

Authored by YunaiV
1 parent 41e5cf52

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

yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillProductMapper.java
... ... @@ -41,7 +41,7 @@ public interface SeckillProductMapper extends BaseMapperX<SeckillProductDO> {
41 41 Assert.isTrue(count > 0);
42 42 return update(null, new LambdaUpdateWrapper<SeckillProductDO>()
43 43 .eq(SeckillProductDO::getId, id)
44   - .gt(SeckillProductDO::getStock, count)
  44 + .ge(SeckillProductDO::getStock, count)
45 45 .setSql("stock = stock - " + count));
46 46 }
47 47  
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBargainOrderHandler.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.promotion.api.bargain.BargainActivityApi;
5 6 import cn.iocoder.yudao.module.promotion.api.bargain.BargainRecordApi;
... ... @@ -50,16 +51,28 @@ public class TradeBargainOrderHandler implements TradeOrderHandler {
50 51 }
51 52  
52 53 @Override
53   - public void cancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
54   - if (TradeOrderTypeEnum.isBargain(order.getType())) {
  54 + public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  55 + if (!TradeOrderTypeEnum.isBargain(order.getType())) {
55 56 return;
56 57 }
57 58 // 明确校验一下
58 59 Assert.isTrue(orderItems.size() == 1, "砍价时,只允许选择一个商品");
59 60  
60   - // 恢复砍价活动的库存
61   - bargainActivityApi.updateBargainActivityStock(order.getBargainActivityId(),
62   - orderItems.get(0).getCount());
  61 + // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚
  62 + orderItems = filterOrderItemListByNoneAfterSale(orderItems);
  63 + if (CollUtil.isEmpty(orderItems)) {
  64 + return;
  65 + }
  66 + afterCancelOrderItem(order, orderItems.get(0));
  67 + }
  68 +
  69 + @Override
  70 + public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {
  71 + if (!TradeOrderTypeEnum.isBargain(order.getType())) {
  72 + return;
  73 + }
  74 + // 恢复(增加)砍价活动的库存
  75 + bargainActivityApi.updateBargainActivityStock(order.getBargainActivityId(), orderItem.getCount());
63 76 }
64 77  
65 78 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCombinationOrderHandler.java
... ... @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.trade.service.order.handler;
2 2  
3 3 import cn.hutool.core.lang.Assert;
4 4 import cn.iocoder.yudao.framework.common.core.KeyValue;
5   -import cn.iocoder.yudao.framework.common.core.KeyValue;
6 5 import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi;
7 6 import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
8 7 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
... ... @@ -18,10 +17,8 @@ import javax.annotation.Resource;
18 17 import java.util.List;
19 18  
20 19 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
21   -import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS;
22   -
23   -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
24 20 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_CREATE_FAIL_EXIST_UNPAID;
  21 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS;
25 22  
26 23 /**
27 24 * 拼团订单的 {@link TradeOrderHandler} 实现类
... ... @@ -50,11 +47,11 @@ public class TradeCombinationOrderHandler implements TradeOrderHandler {
50 47 }
51 48 Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品");
52 49  
53   - // 校验是否满足拼团活动相关限制
  50 + // 1. 校验是否满足拼团活动相关限制
54 51 TradeOrderItemDO item = orderItems.get(0);
55 52 combinationRecordApi.validateCombinationRecord(order.getUserId(), order.getCombinationActivityId(),
56 53 order.getCombinationHeadId(), item.getSkuId(), item.getCount());
57   - // 校验该用户是否存在未支付的拼团活动订单;就是还没支付的时候,重复下单了;需要校验下;不然的话,一个拼团可以下多个单子了;
  54 + // 2. 校验该用户是否存在未支付的拼团活动订单;就是还没支付的时候,重复下单了;需要校验下;不然的话,一个拼团可以下多个单子了;
58 55 TradeOrderDO activityOrder = orderQueryService.getActivityOrderByUserIdAndActivityIdAndStatus(
59 56 order.getUserId(), order.getCombinationActivityId(), TradeOrderStatusEnum.UNPAID.getStatus());
60 57 if (activityOrder != null) {
... ... @@ -65,17 +62,18 @@ public class TradeCombinationOrderHandler implements TradeOrderHandler {
65 62 @Override
66 63 public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
67 64 // 1.如果不是拼团订单则结束
68   - if (TradeOrderTypeEnum.isCombination(order.getType())) {
  65 + if (!TradeOrderTypeEnum.isCombination(order.getType())) {
69 66 return;
70 67 }
71 68 Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品");
72 69  
73   - // 2.获取商品信息
  70 + // 2. 创建拼团记录
74 71 TradeOrderItemDO item = orderItems.get(0);
75   - // 2.1.创建拼团记录
76 72 KeyValue<Long, Long> recordIdAndHeadId = combinationRecordApi.createCombinationRecord(
77 73 TradeOrderConvert.INSTANCE.convert(order, item));
78   - // 3.更新拼团相关信息到订单
  74 +
  75 + // 3. 更新拼团相关信息到订单
  76 + // TODO 芋艿,只需要更新 record
79 77 orderUpdateService.updateOrderCombinationInfo(order.getId(), order.getCombinationActivityId(),
80 78 recordIdAndHeadId.getKey(), recordIdAndHeadId.getValue());
81 79 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeMemberPointOrderHandler.java
... ... @@ -45,8 +45,8 @@ public class TradeMemberPointOrderHandler implements TradeOrderHandler {
45 45 order.getId());
46 46  
47 47 // 增加用户经验
48   - memberLevelApi.addExperience(order.getUserId(), order.getPayPrice(), MemberExperienceBizTypeEnum.ORDER.getType(),
49   - String.valueOf(order.getId()));
  48 + memberLevelApi.addExperience(order.getUserId(), order.getPayPrice(),
  49 + MemberExperienceBizTypeEnum.ORDER_GIVE.getType(), String.valueOf(order.getId()));
50 50 }
51 51  
52 52 @Override
... ... @@ -59,36 +59,36 @@ public class TradeMemberPointOrderHandler implements TradeOrderHandler {
59 59  
60 60 // 增加(回滚)用户积分(订单抵扣)
61 61 Integer usePoint = getSumValue(orderItems, TradeOrderItemDO::getUsePoint, Integer::sum);
62   - addPoint(order.getUserId(), usePoint, MemberPointBizTypeEnum.ORDER_CANCEL,
  62 + addPoint(order.getUserId(), usePoint, MemberPointBizTypeEnum.ORDER_USE_CANCEL,
63 63 order.getId());
  64 +
64 65 // 如下的返还,需要经过支持,也就是经历 afterPayOrder 流程
65 66 if (!order.getPayStatus()) {
66 67 return;
67 68 }
68 69 // 扣减(回滚)积分(订单赠送)
69 70 Integer givePoint = getSumValue(orderItems, TradeOrderItemDO::getGivePoint, Integer::sum);
70   - reducePoint(order.getUserId(), givePoint, MemberPointBizTypeEnum.ORDER_CANCEL,
  71 + reducePoint(order.getUserId(), givePoint, MemberPointBizTypeEnum.ORDER_GIVE_CANCEL,
71 72 order.getId());
72 73 // 扣减(回滚)用户经验
73 74 int payPrice = order.getPayPrice() - order.getRefundPrice();
74   - // TODO @疯狂:这里的 bizId 和 afterCancelOrderItem 不一致了,有什么建议的处理方案?
75   - memberLevelApi.addExperience(order.getUserId(), -payPrice, MemberExperienceBizTypeEnum.REFUND.getType(),
76   - String.valueOf(order.getId()));
  75 + memberLevelApi.addExperience(order.getUserId(), payPrice,
  76 + MemberExperienceBizTypeEnum.ORDER_GIVE_CANCEL.getType(), String.valueOf(order.getId()));
77 77 }
78 78  
79 79 @Override
80 80 public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {
81 81 // 扣减(回滚)积分(订单赠送)
82   - reducePoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.AFTER_SALE_DEDUCT_GIVE,
83   - orderItem.getAfterSaleId());
  82 + reducePoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.ORDER_GIVE_CANCEL_ITEM,
  83 + orderItem.getId());
84 84 // 增加(回滚)积分(订单抵扣)
85   - addPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.AFTER_SALE_REFUND_USED,
86   - orderItem.getAfterSaleId());
  85 + addPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.ORDER_USE_CANCEL_ITEM,
  86 + orderItem.getId());
87 87  
88 88 // 扣减(回滚)用户经验
89 89 AfterSaleDO afterSale = afterSaleService.getAfterSale(orderItem.getAfterSaleId());
90   - memberLevelApi.addExperience(order.getUserId(), -afterSale.getRefundPrice(), MemberExperienceBizTypeEnum.REFUND.getType(),
91   - String.valueOf(orderItem.getAfterSaleId()));
  90 + memberLevelApi.reduceExperience(order.getUserId(), afterSale.getRefundPrice(),
  91 + MemberExperienceBizTypeEnum.ORDER_GIVE_CANCEL_ITEM.getType(), String.valueOf(orderItem.getId()));
92 92 }
93 93  
94 94 /**
... ...
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 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
4 4 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
5 5 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
6 6 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
... ... @@ -71,8 +71,8 @@ public interface TradeOrderHandler {
71 71 * @return 过滤后的订单项列表
72 72 */
73 73 default List<TradeOrderItemDO> filterOrderItemListByNoneAfterSale(List<TradeOrderItemDO> orderItems) {
74   - CollUtil.filterNew(orderItems, item -> !TradeOrderItemAfterSaleStatusEnum.isNone(item.getAfterSaleStatus()));
75   - return orderItems;
  74 + return CollectionUtils.filterList(orderItems,
  75 + item -> TradeOrderItemAfterSaleStatusEnum.isNone(item.getAfterSaleStatus()));
76 76 }
77 77  
78 78 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeSeckillOrderHandler.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.promotion.api.seckill.SeckillActivityApi;
5 6 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
... ... @@ -35,16 +36,29 @@ public class TradeSeckillOrderHandler implements TradeOrderHandler {
35 36 }
36 37  
37 38 @Override
38   - public void cancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
39   - if (TradeOrderTypeEnum.isSeckill(order.getType())) {
  39 + public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
  40 + if (!TradeOrderTypeEnum.isSeckill(order.getType())) {
40 41 return;
41 42 }
42 43 // 明确校验一下
43 44 Assert.isTrue(orderItems.size() == 1, "秒杀时,只允许选择一个商品");
44 45  
  46 + // 售后的订单项,已经在 afterCancelOrderItem 回滚库存,所以这里不需要重复回滚
  47 + orderItems = filterOrderItemListByNoneAfterSale(orderItems);
  48 + if (CollUtil.isEmpty(orderItems)) {
  49 + return;
  50 + }
  51 + afterCancelOrderItem(order, orderItems.get(0));
  52 + }
  53 +
  54 + @Override
  55 + public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {
  56 + if (!TradeOrderTypeEnum.isSeckill(order.getType())) {
  57 + return;
  58 + }
45 59 // 恢复秒杀活动的库存
46 60 seckillActivityApi.updateSeckillStockIncr(order.getSeckillActivityId(),
47   - orderItems.get(0).getSkuId(), orderItems.get(0).getCount());
  61 + orderItem.getSkuId(), orderItem.getCount());
48 62 }
49 63  
50 64 }
... ...
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApi.java
... ... @@ -18,7 +18,6 @@ public interface MemberLevelApi {
18 18 */
19 19 MemberLevelRespDTO getMemberLevel(Long id);
20 20  
21   - // TODO 芋艿:后续增加一个减少接口;
22 21 /**
23 22 * 增加会员经验
24 23 *
... ... @@ -29,4 +28,14 @@ public interface MemberLevelApi {
29 28 */
30 29 void addExperience(Long userId, Integer experience, Integer bizType, String bizId);
31 30  
  31 + /**
  32 + * 扣减会员经验
  33 + *
  34 + * @param userId 会员ID
  35 + * @param experience 经验
  36 + * @param bizType 业务类型 {@link MemberExperienceBizTypeEnum}
  37 + * @param bizId 业务编号
  38 + */
  39 + void reduceExperience(Long userId, Integer experience, Integer bizType, String bizId);
  40 +
32 41 }
... ...
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java
... ... @@ -20,10 +20,11 @@ public enum MemberExperienceBizTypeEnum {
20 20 */
21 21 ADMIN(0, "管理员调整", "管理员调整获得 {} 经验", true),
22 22 INVITE_REGISTER(1, "邀新奖励", "邀请好友获得 {} 经验", true),
23   - ORDER(2, "下单奖励", "下单获得 {} 经验", true),
24   - REFUND(3, "退单扣除", "退单获得 {} 经验", false),
25 23 SIGN_IN(4, "签到奖励", "签到获得 {} 经验", true),
26 24 LOTTERY(5, "抽奖奖励", "抽奖获得 {} 经验", true),
  25 + ORDER_GIVE(11, "下单奖励", "下单获得 {} 经验", true),
  26 + ORDER_GIVE_CANCEL(12, "下单奖励(整单取消)", "取消订单获得 {} 经验", false), // ORDER_GIVE 的取消
  27 + ORDER_GIVE_CANCEL_ITEM(13, "下单奖励(单个退款)", "退款订单获得 {} 经验", false), // ORDER_GIVE 的取消
27 28 ;
28 29  
29 30 /**
... ...
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java
... ... @@ -18,11 +18,14 @@ public enum MemberPointBizTypeEnum implements IntArrayValuable {
18 18  
19 19 SIGN(1, "签到", "签到获得 {} 积分", true),
20 20 ADMIN(2, "管理员修改", "管理员修改 {} 积分", true),
21   - ORDER_GIVE(10, "订单奖励", "下单获得 {} 积分", true), // 支付订单时,赠送积分
22   - ORDER_CANCEL(11, "订单取消", "订单取消,退还 {} 积分", true), // 取消订单时,退回积分
23   - ORDER_USE(12, "订单使用", "下单使用 {} 积分", false), // 下单时,扣减积分
24   - AFTER_SALE_REFUND_USED(13, "订单退款", "订单退款,退还 {} 积分", true), // 售后订单成功时,退回积分(对应 ORDER_USE 操作)
25   - AFTER_SALE_DEDUCT_GIVE(14, "订单退款", "订单退款,扣除赠送的 {} 积分", false), // 售后订单成功时,扣减积分(对应 ORDER_GIVE 操作)
  21 +
  22 + ORDER_USE(11, "订单积分抵扣", "下单使用 {} 积分", false), // 下单时,扣减积分
  23 + ORDER_USE_CANCEL(12, "订单积分抵扣(整单取消)", "订单取消,退还 {} 积分", true), // ORDER_USE 的取消
  24 + ORDER_USE_CANCEL_ITEM(13, "订单积分抵扣(单个退款)", "订单退款,退还 {} 积分", true), // ORDER_USE 的取消
  25 +
  26 + ORDER_GIVE(21, "订单积分奖励", "下单获得 {} 积分", true), // 支付订单时,赠送积分
  27 + ORDER_GIVE_CANCEL(22, "订单积分奖励(整单取消)", "订单取消,退还 {} 积分", false), // ORDER_GIVE 的取消
  28 + ORDER_GIVE_CANCEL_ITEM(23, "订单积分奖励(单个退款)", "订单退款,扣除赠送的 {} 积分", false) // ORDER_GIVE 的取消
26 29 ;
27 30  
28 31 /**
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java
... ... @@ -38,4 +38,9 @@ public class MemberLevelApiImpl implements MemberLevelApi {
38 38 memberLevelService.addExperience(userId, experience, bizTypeEnum, bizId);
39 39 }
40 40  
  41 + @Override
  42 + public void reduceExperience(Long userId, Integer experience, Integer bizType, String bizId) {
  43 + addExperience(userId, -experience, bizType, bizId);
  44 + }
  45 +
41 46 }
... ...