Commit b0179457ce0ccf4cf5336e99206fcab5e34853f9
1 parent
41e5cf52
重构:将订单的分支流程,抽到 TradeOrderHandler 实现类中(补全各种排重逻辑)
Showing
10 changed files
with
86 additions
and
43 deletions
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 | } | ... | ... |