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,7 +100,7 @@ public class PointActivityServiceImpl implements PointActivityService { | ||
| 100 | } | 100 | } |
| 101 | pointActivityMapper.updateById(updateObj); | 101 | pointActivityMapper.updateById(updateObj); |
| 102 | // 2.2 更新商品 | 102 | // 2.2 更新商品 |
| 103 | - updateSeckillProduct(updateObj, updateReqVO.getProducts()); | 103 | + updatePointProduct(updateObj, updateReqVO.getProducts()); |
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | @Override | 106 | @Override |
| @@ -157,12 +157,12 @@ public class PointActivityServiceImpl implements PointActivityService { | @@ -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 | * @param products 该活动的最新商品配置 | 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 | List<PointProductDO> newList = buildPointProductDO(activity, products); | 167 | List<PointProductDO> newList = buildPointProductDO(activity, products); |
| 168 | List<PointProductDO> oldList = pointProductMapper.selectListByActivityId(activity.getId()); | 168 | List<PointProductDO> oldList = pointProductMapper.selectListByActivityId(activity.getId()); |
| @@ -211,10 +211,10 @@ public class PointActivityServiceImpl implements PointActivityService { | @@ -211,10 +211,10 @@ public class PointActivityServiceImpl implements PointActivityService { | ||
| 211 | } | 211 | } |
| 212 | 212 | ||
| 213 | /** | 213 | /** |
| 214 | - * 校验秒杀商品是否都存在 | 214 | + * 校验积分商品是否都存在 |
| 215 | * | 215 | * |
| 216 | * @param spuId 商品 SPU 编号 | 216 | * @param spuId 商品 SPU 编号 |
| 217 | - * @param products 秒杀商品 | 217 | + * @param products 积分商品 |
| 218 | */ | 218 | */ |
| 219 | private void validateProductExists(Long spuId, List<PointProductSaveReqVO> products) { | 219 | private void validateProductExists(Long spuId, List<PointProductSaveReqVO> products) { |
| 220 | // 1. 校验商品 spu 是否存在 | 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,6 +7,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; | ||
| 7 | import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; | 7 | import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; |
| 8 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO; | 8 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO; |
| 9 | import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; | 9 | import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; |
| 10 | +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; | ||
| 10 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | 11 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| 11 | import org.apache.ibatis.annotations.Mapper; | 12 | import org.apache.ibatis.annotations.Mapper; |
| 12 | 13 | ||
| @@ -106,10 +107,22 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> { | @@ -106,10 +107,22 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> { | ||
| 106 | .eq(TradeOrderDO::getCommentStatus, commentStatus)); | 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 | default TradeOrderDO selectOneByPickUpVerifyCode(String pickUpVerifyCode) { | 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 +6,7 @@ import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderSummary | ||
| 6 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO; | 6 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO; |
| 7 | import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; | 7 | import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; |
| 8 | import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; | 8 | import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; |
| 9 | +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; | ||
| 9 | import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; | 10 | import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; |
| 10 | 11 | ||
| 11 | import java.util.Collection; | 12 | import java.util.Collection; |
| @@ -110,13 +111,14 @@ public interface TradeOrderQueryService { | @@ -110,13 +111,14 @@ public interface TradeOrderQueryService { | ||
| 110 | List<ExpressTrackRespDTO> getExpressTrackList(Long id); | 111 | List<ExpressTrackRespDTO> getExpressTrackList(Long id); |
| 111 | 112 | ||
| 112 | /** | 113 | /** |
| 113 | - * 【会员】在指定秒杀活动下,用户购买的商品数量 | 114 | + * 【会员】在指定活动下,用户购买的商品数量 |
| 114 | * | 115 | * |
| 115 | * @param userId 用户编号 | 116 | * @param userId 用户编号 |
| 116 | * @param activityId 活动编号 | 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 | // =================== Order Item =================== | 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,6 +19,7 @@ import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper; | ||
| 19 | import cn.iocoder.yudao.module.trade.dal.redis.RedisKeyConstants; | 19 | import cn.iocoder.yudao.module.trade.dal.redis.RedisKeyConstants; |
| 20 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum; | 20 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum; |
| 21 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; | 21 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; |
| 22 | +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; | ||
| 22 | import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClientFactory; | 23 | import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClientFactory; |
| 23 | import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO; | 24 | import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO; |
| 24 | import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; | 25 | import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; |
| @@ -174,9 +175,9 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { | @@ -174,9 +175,9 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { | ||
| 174 | } | 175 | } |
| 175 | 176 | ||
| 176 | @Override | 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 | orders.removeIf(order -> TradeOrderStatusEnum.isCanceled(order.getStatus())); // 过滤掉【已取消】的订单 | 181 | orders.removeIf(order -> TradeOrderStatusEnum.isCanceled(order.getStatus())); // 过滤掉【已取消】的订单 |
| 181 | if (CollUtil.isEmpty(orders)) { | 182 | if (CollUtil.isEmpty(orders)) { |
| 182 | return 0; | 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,7 +56,7 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator { | ||
| 56 | Assert.isTrue(param.getItems().size() == 1, "积分商城兑换商品时,只允许选择一个商品"); | 56 | Assert.isTrue(param.getItems().size() == 1, "积分商城兑换商品时,只允许选择一个商品"); |
| 57 | // 2. 校验是否可以参与积分商城活动 | 57 | // 2. 校验是否可以参与积分商城活动 |
| 58 | TradePriceCalculateRespBO.OrderItem orderItem = result.getItems().get(0); | 58 | TradePriceCalculateRespBO.OrderItem orderItem = result.getItems().get(0); |
| 59 | - PointValidateJoinRespDTO activity = validateJoinSeckill( | 59 | + PointValidateJoinRespDTO activity = validateJoinPointActivity( |
| 60 | param.getUserId(), param.getPointActivityId(), | 60 | param.getUserId(), param.getPointActivityId(), |
| 61 | orderItem.getSkuId(), orderItem.getCount()); | 61 | orderItem.getSkuId(), orderItem.getCount()); |
| 62 | 62 | ||
| @@ -80,12 +80,12 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator { | @@ -80,12 +80,12 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator { | ||
| 80 | TradePriceCalculatorHelper.recountAllPrice(result); | 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 | // 1. 校验是否可以参与积分商城活动 | 84 | // 1. 校验是否可以参与积分商城活动 |
| 85 | PointValidateJoinRespDTO pointValidateJoinRespDTO = pointActivityApi.validateJoinPointActivity(activityId, skuId, count); | 85 | PointValidateJoinRespDTO pointValidateJoinRespDTO = pointActivityApi.validateJoinPointActivity(activityId, skuId, count); |
| 86 | // 2. 校验总限购数量,目前只有 trade 有具体下单的数据,需要交给 trade 价格计算使用 | 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 | throw exception(PRICE_CALCULATE_POINT_TOTAL_LIMIT_COUNT); | 89 | throw exception(PRICE_CALCULATE_POINT_TOTAL_LIMIT_COUNT); |
| 90 | } | 90 | } |
| 91 | return pointValidateJoinRespDTO; | 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,6 +5,7 @@ import cn.hutool.core.util.StrUtil; | ||
| 5 | import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi; | 5 | import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi; |
| 6 | import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillValidateJoinRespDTO; | 6 | import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillValidateJoinRespDTO; |
| 7 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; | 7 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; |
| 8 | +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; | ||
| 8 | import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; | 9 | import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; |
| 9 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; | 10 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; |
| 10 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; | 11 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; |
| @@ -60,7 +61,7 @@ public class TradeSeckillActivityPriceCalculator implements TradePriceCalculator | @@ -60,7 +61,7 @@ public class TradeSeckillActivityPriceCalculator implements TradePriceCalculator | ||
| 60 | // 1. 校验是否可以参与秒杀 | 61 | // 1. 校验是否可以参与秒杀 |
| 61 | SeckillValidateJoinRespDTO seckillActivity = seckillActivityApi.validateJoinSeckill(activityId, skuId, count); | 62 | SeckillValidateJoinRespDTO seckillActivity = seckillActivityApi.validateJoinSeckill(activityId, skuId, count); |
| 62 | // 2. 校验总限购数量,目前只有 trade 有具体下单的数据,需要交给 trade 价格计算使用 | 63 | // 2. 校验总限购数量,目前只有 trade 有具体下单的数据,需要交给 trade 价格计算使用 |
| 63 | - int seckillProductCount = tradeOrderQueryService.getSeckillProductCount(userId, activityId); | 64 | + int seckillProductCount = tradeOrderQueryService.getActivityProductCount(userId, activityId, TradeOrderTypeEnum.SECKILL); |
| 64 | if (seckillProductCount + count > seckillActivity.getTotalLimitCount()) { | 65 | if (seckillProductCount + count > seckillActivity.getTotalLimitCount()) { |
| 65 | throw exception(PRICE_CALCULATE_SECKILL_TOTAL_LIMIT_COUNT); | 66 | throw exception(PRICE_CALCULATE_SECKILL_TOTAL_LIMIT_COUNT); |
| 66 | } | 67 | } |