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,7 +41,7 @@ public interface SeckillProductMapper extends BaseMapperX<SeckillProductDO> {
41 Assert.isTrue(count > 0); 41 Assert.isTrue(count > 0);
42 return update(null, new LambdaUpdateWrapper<SeckillProductDO>() 42 return update(null, new LambdaUpdateWrapper<SeckillProductDO>()
43 .eq(SeckillProductDO::getId, id) 43 .eq(SeckillProductDO::getId, id)
44 - .gt(SeckillProductDO::getStock, count) 44 + .ge(SeckillProductDO::getStock, count)
45 .setSql("stock = stock - " + count)); 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 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.promotion.api.bargain.BargainActivityApi; 5 import cn.iocoder.yudao.module.promotion.api.bargain.BargainActivityApi;
5 import cn.iocoder.yudao.module.promotion.api.bargain.BargainRecordApi; 6 import cn.iocoder.yudao.module.promotion.api.bargain.BargainRecordApi;
@@ -50,16 +51,28 @@ public class TradeBargainOrderHandler implements TradeOrderHandler { @@ -50,16 +51,28 @@ public class TradeBargainOrderHandler implements TradeOrderHandler {
50 } 51 }
51 52
52 @Override 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 return; 56 return;
56 } 57 }
57 // 明确校验一下 58 // 明确校验一下
58 Assert.isTrue(orderItems.size() == 1, "砍价时,只允许选择一个商品"); 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,7 +2,6 @@ package cn.iocoder.yudao.module.trade.service.order.handler;
2 2
3 import cn.hutool.core.lang.Assert; 3 import cn.hutool.core.lang.Assert;
4 import cn.iocoder.yudao.framework.common.core.KeyValue; 4 import cn.iocoder.yudao.framework.common.core.KeyValue;
5 -import cn.iocoder.yudao.framework.common.core.KeyValue;  
6 import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi; 5 import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi;
7 import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; 6 import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
8 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 7 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
@@ -18,10 +17,8 @@ import javax.annotation.Resource; @@ -18,10 +17,8 @@ import javax.annotation.Resource;
18 import java.util.List; 17 import java.util.List;
19 18
20 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 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 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_CREATE_FAIL_EXIST_UNPAID; 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 * 拼团订单的 {@link TradeOrderHandler} 实现类 24 * 拼团订单的 {@link TradeOrderHandler} 实现类
@@ -50,11 +47,11 @@ public class TradeCombinationOrderHandler implements TradeOrderHandler { @@ -50,11 +47,11 @@ public class TradeCombinationOrderHandler implements TradeOrderHandler {
50 } 47 }
51 Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品"); 48 Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品");
52 49
53 - // 校验是否满足拼团活动相关限制 50 + // 1. 校验是否满足拼团活动相关限制
54 TradeOrderItemDO item = orderItems.get(0); 51 TradeOrderItemDO item = orderItems.get(0);
55 combinationRecordApi.validateCombinationRecord(order.getUserId(), order.getCombinationActivityId(), 52 combinationRecordApi.validateCombinationRecord(order.getUserId(), order.getCombinationActivityId(),
56 order.getCombinationHeadId(), item.getSkuId(), item.getCount()); 53 order.getCombinationHeadId(), item.getSkuId(), item.getCount());
57 - // 校验该用户是否存在未支付的拼团活动订单;就是还没支付的时候,重复下单了;需要校验下;不然的话,一个拼团可以下多个单子了; 54 + // 2. 校验该用户是否存在未支付的拼团活动订单;就是还没支付的时候,重复下单了;需要校验下;不然的话,一个拼团可以下多个单子了;
58 TradeOrderDO activityOrder = orderQueryService.getActivityOrderByUserIdAndActivityIdAndStatus( 55 TradeOrderDO activityOrder = orderQueryService.getActivityOrderByUserIdAndActivityIdAndStatus(
59 order.getUserId(), order.getCombinationActivityId(), TradeOrderStatusEnum.UNPAID.getStatus()); 56 order.getUserId(), order.getCombinationActivityId(), TradeOrderStatusEnum.UNPAID.getStatus());
60 if (activityOrder != null) { 57 if (activityOrder != null) {
@@ -65,17 +62,18 @@ public class TradeCombinationOrderHandler implements TradeOrderHandler { @@ -65,17 +62,18 @@ public class TradeCombinationOrderHandler implements TradeOrderHandler {
65 @Override 62 @Override
66 public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { 63 public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
67 // 1.如果不是拼团订单则结束 64 // 1.如果不是拼团订单则结束
68 - if (TradeOrderTypeEnum.isCombination(order.getType())) { 65 + if (!TradeOrderTypeEnum.isCombination(order.getType())) {
69 return; 66 return;
70 } 67 }
71 Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品"); 68 Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品");
72 69
73 - // 2.获取商品信息 70 + // 2. 创建拼团记录
74 TradeOrderItemDO item = orderItems.get(0); 71 TradeOrderItemDO item = orderItems.get(0);
75 - // 2.1.创建拼团记录  
76 KeyValue<Long, Long> recordIdAndHeadId = combinationRecordApi.createCombinationRecord( 72 KeyValue<Long, Long> recordIdAndHeadId = combinationRecordApi.createCombinationRecord(
77 TradeOrderConvert.INSTANCE.convert(order, item)); 73 TradeOrderConvert.INSTANCE.convert(order, item));
78 - // 3.更新拼团相关信息到订单 74 +
  75 + // 3. 更新拼团相关信息到订单
  76 + // TODO 芋艿,只需要更新 record
79 orderUpdateService.updateOrderCombinationInfo(order.getId(), order.getCombinationActivityId(), 77 orderUpdateService.updateOrderCombinationInfo(order.getId(), order.getCombinationActivityId(),
80 recordIdAndHeadId.getKey(), recordIdAndHeadId.getValue()); 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,8 +45,8 @@ public class TradeMemberPointOrderHandler implements TradeOrderHandler {
45 order.getId()); 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 @Override 52 @Override
@@ -59,36 +59,36 @@ public class TradeMemberPointOrderHandler implements TradeOrderHandler { @@ -59,36 +59,36 @@ public class TradeMemberPointOrderHandler implements TradeOrderHandler {
59 59
60 // 增加(回滚)用户积分(订单抵扣) 60 // 增加(回滚)用户积分(订单抵扣)
61 Integer usePoint = getSumValue(orderItems, TradeOrderItemDO::getUsePoint, Integer::sum); 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 order.getId()); 63 order.getId());
  64 +
64 // 如下的返还,需要经过支持,也就是经历 afterPayOrder 流程 65 // 如下的返还,需要经过支持,也就是经历 afterPayOrder 流程
65 if (!order.getPayStatus()) { 66 if (!order.getPayStatus()) {
66 return; 67 return;
67 } 68 }
68 // 扣减(回滚)积分(订单赠送) 69 // 扣减(回滚)积分(订单赠送)
69 Integer givePoint = getSumValue(orderItems, TradeOrderItemDO::getGivePoint, Integer::sum); 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 order.getId()); 72 order.getId());
72 // 扣减(回滚)用户经验 73 // 扣减(回滚)用户经验
73 int payPrice = order.getPayPrice() - order.getRefundPrice(); 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 @Override 79 @Override
80 public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) { 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 AfterSaleDO afterSale = afterSaleService.getAfterSale(orderItem.getAfterSaleId()); 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 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.framework.common.util.collection.CollectionUtils;
4 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 4 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
5 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; 6 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
@@ -71,8 +71,8 @@ public interface TradeOrderHandler { @@ -71,8 +71,8 @@ public interface TradeOrderHandler {
71 * @return 过滤后的订单项列表 71 * @return 过滤后的订单项列表
72 */ 72 */
73 default List<TradeOrderItemDO> filterOrderItemListByNoneAfterSale(List<TradeOrderItemDO> orderItems) { 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 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.promotion.api.seckill.SeckillActivityApi; 5 import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi;
5 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; 6 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
@@ -35,16 +36,29 @@ public class TradeSeckillOrderHandler implements TradeOrderHandler { @@ -35,16 +36,29 @@ public class TradeSeckillOrderHandler implements TradeOrderHandler {
35 } 36 }
36 37
37 @Override 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 return; 41 return;
41 } 42 }
42 // 明确校验一下 43 // 明确校验一下
43 Assert.isTrue(orderItems.size() == 1, "秒杀时,只允许选择一个商品"); 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 seckillActivityApi.updateSeckillStockIncr(order.getSeckillActivityId(), 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,7 +18,6 @@ public interface MemberLevelApi {
18 */ 18 */
19 MemberLevelRespDTO getMemberLevel(Long id); 19 MemberLevelRespDTO getMemberLevel(Long id);
20 20
21 - // TODO 芋艿:后续增加一个减少接口;  
22 /** 21 /**
23 * 增加会员经验 22 * 增加会员经验
24 * 23 *
@@ -29,4 +28,14 @@ public interface MemberLevelApi { @@ -29,4 +28,14 @@ public interface MemberLevelApi {
29 */ 28 */
30 void addExperience(Long userId, Integer experience, Integer bizType, String bizId); 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,10 +20,11 @@ public enum MemberExperienceBizTypeEnum {
20 */ 20 */
21 ADMIN(0, "管理员调整", "管理员调整获得 {} 经验", true), 21 ADMIN(0, "管理员调整", "管理员调整获得 {} 经验", true),
22 INVITE_REGISTER(1, "邀新奖励", "邀请好友获得 {} 经验", true), 22 INVITE_REGISTER(1, "邀新奖励", "邀请好友获得 {} 经验", true),
23 - ORDER(2, "下单奖励", "下单获得 {} 经验", true),  
24 - REFUND(3, "退单扣除", "退单获得 {} 经验", false),  
25 SIGN_IN(4, "签到奖励", "签到获得 {} 经验", true), 23 SIGN_IN(4, "签到奖励", "签到获得 {} 经验", true),
26 LOTTERY(5, "抽奖奖励", "抽奖获得 {} 经验", true), 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,11 +18,14 @@ public enum MemberPointBizTypeEnum implements IntArrayValuable {
18 18
19 SIGN(1, "签到", "签到获得 {} 积分", true), 19 SIGN(1, "签到", "签到获得 {} 积分", true),
20 ADMIN(2, "管理员修改", "管理员修改 {} 积分", true), 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,4 +38,9 @@ public class MemberLevelApiImpl implements MemberLevelApi {
38 memberLevelService.addExperience(userId, experience, bizTypeEnum, bizId); 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 }