Commit d3352308d4b8854f1b1d5cebedb2ee89435c260f

Authored by puhui999
1 parent 2725376b

【代码优化】积分商城

yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/point/PointActivityServiceImpl.java
... ... @@ -100,7 +100,7 @@ public class PointActivityServiceImpl implements PointActivityService {
100 100 }
101 101 pointActivityMapper.updateById(updateObj);
102 102 // 2.2 更新商品
103   - updateSeckillProduct(updateObj, updateReqVO.getProducts());
  103 + updatePointProduct(updateObj, updateReqVO.getProducts());
104 104 }
105 105  
106 106 @Override
... ... @@ -157,12 +157,12 @@ public class PointActivityServiceImpl implements PointActivityService {
157 157 }
158 158  
159 159 /**
160   - * 更新秒杀商品
  160 + * 更新积分商品
161 161 *
162   - * @param activity 秒杀活动
  162 + * @param activity 积分活动
163 163 * @param products 该活动的最新商品配置
164 164 */
165   - private void updateSeckillProduct(PointActivityDO activity, List<PointProductSaveReqVO> products) {
  165 + private void updatePointProduct(PointActivityDO activity, List<PointProductSaveReqVO> products) {
166 166 // 第一步,对比新老数据,获得添加、修改、删除的列表
167 167 List<PointProductDO> newList = buildPointProductDO(activity, products);
168 168 List<PointProductDO> oldList = pointProductMapper.selectListByActivityId(activity.getId());
... ... @@ -211,10 +211,10 @@ public class PointActivityServiceImpl implements PointActivityService {
211 211 }
212 212  
213 213 /**
214   - * 校验秒杀商品是否都存在
  214 + * 校验积分商品是否都存在
215 215 *
216 216 * @param spuId 商品 SPU 编号
217   - * @param products 秒杀商品
  217 + * @param products 积分商品
218 218 */
219 219 private void validateProductExists(Long spuId, List<PointProductSaveReqVO> products) {
220 220 // 1. 校验商品 spu 是否存在
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderMapper.java
... ... @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
7 7 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
8 8 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
9 9 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
  10 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
10 11 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
11 12 import org.apache.ibatis.annotations.Mapper;
12 13  
... ... @@ -106,10 +107,22 @@ public interface TradeOrderMapper extends BaseMapperX&lt;TradeOrderDO&gt; {
106 107 .eq(TradeOrderDO::getCommentStatus, commentStatus));
107 108 }
108 109  
109   - default List<TradeOrderDO> selectListByUserIdAndSeckillActivityId(Long userId, Long seckillActivityId) {
110   - return selectList(new LambdaUpdateWrapper<>(TradeOrderDO.class)
111   - .eq(TradeOrderDO::getUserId, userId)
112   - .eq(TradeOrderDO::getSeckillActivityId, seckillActivityId));
  110 + default List<TradeOrderDO> selectListByUserIdAndActivityId(Long userId, Long activityId, TradeOrderTypeEnum type) {
  111 + LambdaQueryWrapperX<TradeOrderDO> queryWrapperX = new LambdaQueryWrapperX<>();
  112 + queryWrapperX.eq(TradeOrderDO::getUserId, userId);
  113 + if (TradeOrderTypeEnum.isSeckill(type.getType())) {
  114 + queryWrapperX.eq(TradeOrderDO::getSeckillActivityId, activityId);
  115 + }
  116 + if (TradeOrderTypeEnum.isBargain(type.getType())) {
  117 + queryWrapperX.eq(TradeOrderDO::getBargainActivityId, activityId);
  118 + }
  119 + if (TradeOrderTypeEnum.isCombination(type.getType())) {
  120 + queryWrapperX.eq(TradeOrderDO::getCombinationActivityId, activityId);
  121 + }
  122 + if (TradeOrderTypeEnum.isPoint(type.getType())) {
  123 + queryWrapperX.eq(TradeOrderDO::getPointActivityId, activityId);
  124 + }
  125 + return selectList(queryWrapperX);
113 126 }
114 127  
115 128 default TradeOrderDO selectOneByPickUpVerifyCode(String pickUpVerifyCode) {
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java
... ... @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSummary
6 6 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
7 7 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
8 8 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
  9 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
9 10 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
10 11  
11 12 import java.util.Collection;
... ... @@ -110,13 +111,14 @@ public interface TradeOrderQueryService {
110 111 List<ExpressTrackRespDTO> getExpressTrackList(Long id);
111 112  
112 113 /**
113   - * 【会员】在指定秒杀活动下,用户购买的商品数量
  114 + * 【会员】在指定活动下,用户购买的商品数量
114 115 *
115 116 * @param userId 用户编号
116 117 * @param activityId 活动编号
117   - * @return 秒杀商品数量
  118 + * @param type 订单类型
  119 + * @return 活动商品数量
118 120 */
119   - int getSeckillProductCount(Long userId, Long activityId);
  121 + int getActivityProductCount(Long userId, Long activityId, TradeOrderTypeEnum type);
120 122  
121 123 // =================== Order Item ===================
122 124  
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java
... ... @@ -19,6 +19,7 @@ import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper;
19 19 import cn.iocoder.yudao.module.trade.dal.redis.RedisKeyConstants;
20 20 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum;
21 21 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
  22 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
22 23 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClientFactory;
23 24 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO;
24 25 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
... ... @@ -174,9 +175,9 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
174 175 }
175 176  
176 177 @Override
177   - public int getSeckillProductCount(Long userId, Long activityId) {
  178 + public int getActivityProductCount(Long userId, Long activityId, TradeOrderTypeEnum type) {
178 179 // 获得订单列表
179   - List<TradeOrderDO> orders = tradeOrderMapper.selectListByUserIdAndSeckillActivityId(userId, activityId);
  180 + List<TradeOrderDO> orders = tradeOrderMapper.selectListByUserIdAndActivityId(userId, activityId, type);
180 181 orders.removeIf(order -> TradeOrderStatusEnum.isCanceled(order.getStatus())); // 过滤掉【已取消】的订单
181 182 if (CollUtil.isEmpty(orders)) {
182 183 return 0;
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradePointActivityPriceCalculator.java
... ... @@ -56,7 +56,7 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator {
56 56 Assert.isTrue(param.getItems().size() == 1, "积分商城兑换商品时,只允许选择一个商品");
57 57 // 2. 校验是否可以参与积分商城活动
58 58 TradePriceCalculateRespBO.OrderItem orderItem = result.getItems().get(0);
59   - PointValidateJoinRespDTO activity = validateJoinSeckill(
  59 + PointValidateJoinRespDTO activity = validateJoinPointActivity(
60 60 param.getUserId(), param.getPointActivityId(),
61 61 orderItem.getSkuId(), orderItem.getCount());
62 62  
... ... @@ -80,12 +80,12 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator {
80 80 TradePriceCalculatorHelper.recountAllPrice(result);
81 81 }
82 82  
83   - private PointValidateJoinRespDTO validateJoinSeckill(Long userId, Long activityId, Long skuId, Integer count) {
  83 + private PointValidateJoinRespDTO validateJoinPointActivity(Long userId, Long activityId, Long skuId, Integer count) {
84 84 // 1. 校验是否可以参与积分商城活动
85 85 PointValidateJoinRespDTO pointValidateJoinRespDTO = pointActivityApi.validateJoinPointActivity(activityId, skuId, count);
86 86 // 2. 校验总限购数量,目前只有 trade 有具体下单的数据,需要交给 trade 价格计算使用
87   - int activityProductCount = tradeOrderQueryService.getSeckillProductCount(userId, activityId);
88   - if (activityProductCount + count > pointValidateJoinRespDTO.getCount()) {
  87 + int pointProductCount = tradeOrderQueryService.getActivityProductCount(userId, activityId, TradeOrderTypeEnum.POINT);
  88 + if (pointProductCount + count > pointValidateJoinRespDTO.getCount()) {
89 89 throw exception(PRICE_CALCULATE_POINT_TOTAL_LIMIT_COUNT);
90 90 }
91 91 return pointValidateJoinRespDTO;
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeSeckillActivityPriceCalculator.java
... ... @@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil;
5 5 import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi;
6 6 import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillValidateJoinRespDTO;
7 7 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
  8 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
8 9 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
9 10 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
10 11 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
... ... @@ -60,7 +61,7 @@ public class TradeSeckillActivityPriceCalculator implements TradePriceCalculator
60 61 // 1. 校验是否可以参与秒杀
61 62 SeckillValidateJoinRespDTO seckillActivity = seckillActivityApi.validateJoinSeckill(activityId, skuId, count);
62 63 // 2. 校验总限购数量,目前只有 trade 有具体下单的数据,需要交给 trade 价格计算使用
63   - int seckillProductCount = tradeOrderQueryService.getSeckillProductCount(userId, activityId);
  64 + int seckillProductCount = tradeOrderQueryService.getActivityProductCount(userId, activityId, TradeOrderTypeEnum.SECKILL);
64 65 if (seckillProductCount + count > seckillActivity.getTotalLimitCount()) {
65 66 throw exception(PRICE_CALCULATE_SECKILL_TOTAL_LIMIT_COUNT);
66 67 }
... ...