Commit d3352308d4b8854f1b1d5cebedb2ee89435c260f
1 parent
2725376b
【代码优化】积分商城
Showing
6 changed files
with
37 additions
and
20 deletions
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<TradeOrderDO> { |
| 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 | } | ... | ... |