Selaa lähdekoodia

【代码优化】积分商城

puhui999 6 kuukautta sitten
vanhempi
sitoutus
d3352308d4

+ 6 - 6
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 {
         }
         pointActivityMapper.updateById(updateObj);
         // 2.2 更新商品
-        updateSeckillProduct(updateObj, updateReqVO.getProducts());
+        updatePointProduct(updateObj, updateReqVO.getProducts());
     }
 
     @Override
@@ -157,12 +157,12 @@ public class PointActivityServiceImpl implements PointActivityService {
     }
 
     /**
-     * 更新秒杀商品
+     * 更新积分商品
      *
-     * @param activity 秒杀活动
+     * @param activity 积分活动
      * @param products 该活动的最新商品配置
      */
-    private void updateSeckillProduct(PointActivityDO activity, List<PointProductSaveReqVO> products) {
+    private void updatePointProduct(PointActivityDO activity, List<PointProductSaveReqVO> products) {
         // 第一步,对比新老数据,获得添加、修改、删除的列表
         List<PointProductDO> newList = buildPointProductDO(activity, products);
         List<PointProductDO> oldList = pointProductMapper.selectListByActivityId(activity.getId());
@@ -211,10 +211,10 @@ public class PointActivityServiceImpl implements PointActivityService {
     }
 
     /**
-     * 校验秒杀商品是否都存在
+     * 校验积分商品是否都存在
      *
      * @param spuId    商品 SPU 编号
-     * @param products 秒杀商品
+     * @param products 积分商品
      */
     private void validateProductExists(Long spuId, List<PointProductSaveReqVO> products) {
         // 1. 校验商品 spu 是否存在

+ 17 - 4
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;
 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -106,10 +107,22 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
                 .eq(TradeOrderDO::getCommentStatus, commentStatus));
     }
 
-    default List<TradeOrderDO> selectListByUserIdAndSeckillActivityId(Long userId, Long seckillActivityId) {
-        return selectList(new LambdaUpdateWrapper<>(TradeOrderDO.class)
-                .eq(TradeOrderDO::getUserId, userId)
-                .eq(TradeOrderDO::getSeckillActivityId, seckillActivityId));
+    default List<TradeOrderDO> selectListByUserIdAndActivityId(Long userId, Long activityId, TradeOrderTypeEnum type) {
+        LambdaQueryWrapperX<TradeOrderDO> queryWrapperX = new LambdaQueryWrapperX<>();
+        queryWrapperX.eq(TradeOrderDO::getUserId, userId);
+        if (TradeOrderTypeEnum.isSeckill(type.getType())) {
+            queryWrapperX.eq(TradeOrderDO::getSeckillActivityId, activityId);
+        }
+        if (TradeOrderTypeEnum.isBargain(type.getType())) {
+            queryWrapperX.eq(TradeOrderDO::getBargainActivityId, activityId);
+        }
+        if (TradeOrderTypeEnum.isCombination(type.getType())) {
+            queryWrapperX.eq(TradeOrderDO::getCombinationActivityId, activityId);
+        }
+        if (TradeOrderTypeEnum.isPoint(type.getType())) {
+            queryWrapperX.eq(TradeOrderDO::getPointActivityId, activityId);
+        }
+        return selectList(queryWrapperX);
     }
 
     default TradeOrderDO selectOneByPickUpVerifyCode(String pickUpVerifyCode) {

+ 5 - 3
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
 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
 
 import java.util.Collection;
@@ -110,13 +111,14 @@ public interface TradeOrderQueryService {
     List<ExpressTrackRespDTO> getExpressTrackList(Long id);
 
     /**
-     * 【会员】在指定秒杀活动下,用户购买的商品数量
+     * 【会员】在指定活动下,用户购买的商品数量
      *
      * @param userId     用户编号
      * @param activityId 活动编号
-     * @return 秒杀商品数量
+     * @param type       订单类型
+     * @return 活动商品数量
      */
-    int getSeckillProductCount(Long userId, Long activityId);
+    int getActivityProductCount(Long userId, Long activityId, TradeOrderTypeEnum type);
 
     // =================== Order Item ===================
 

+ 3 - 2
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;
 import cn.iocoder.yudao.module.trade.dal.redis.RedisKeyConstants;
 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum;
 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.ExpressClientFactory;
 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO;
 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
@@ -174,9 +175,9 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
     }
 
     @Override
-    public int getSeckillProductCount(Long userId, Long activityId) {
+    public int getActivityProductCount(Long userId, Long activityId, TradeOrderTypeEnum type) {
         // 获得订单列表
-        List<TradeOrderDO> orders = tradeOrderMapper.selectListByUserIdAndSeckillActivityId(userId, activityId);
+        List<TradeOrderDO> orders = tradeOrderMapper.selectListByUserIdAndActivityId(userId, activityId, type);
         orders.removeIf(order -> TradeOrderStatusEnum.isCanceled(order.getStatus())); // 过滤掉【已取消】的订单
         if (CollUtil.isEmpty(orders)) {
             return 0;

+ 4 - 4
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 {
         Assert.isTrue(param.getItems().size() == 1, "积分商城兑换商品时,只允许选择一个商品");
         // 2. 校验是否可以参与积分商城活动
         TradePriceCalculateRespBO.OrderItem orderItem = result.getItems().get(0);
-        PointValidateJoinRespDTO activity = validateJoinSeckill(
+        PointValidateJoinRespDTO activity = validateJoinPointActivity(
                 param.getUserId(), param.getPointActivityId(),
                 orderItem.getSkuId(), orderItem.getCount());
 
@@ -80,12 +80,12 @@ public class TradePointActivityPriceCalculator implements TradePriceCalculator {
         TradePriceCalculatorHelper.recountAllPrice(result);
     }
 
-    private PointValidateJoinRespDTO validateJoinSeckill(Long userId, Long activityId, Long skuId, Integer count) {
+    private PointValidateJoinRespDTO validateJoinPointActivity(Long userId, Long activityId, Long skuId, Integer count) {
         // 1. 校验是否可以参与积分商城活动
         PointValidateJoinRespDTO pointValidateJoinRespDTO = pointActivityApi.validateJoinPointActivity(activityId, skuId, count);
         // 2. 校验总限购数量,目前只有 trade 有具体下单的数据,需要交给 trade 价格计算使用
-        int activityProductCount = tradeOrderQueryService.getSeckillProductCount(userId, activityId);
-        if (activityProductCount + count > pointValidateJoinRespDTO.getCount()) {
+        int pointProductCount = tradeOrderQueryService.getActivityProductCount(userId, activityId, TradeOrderTypeEnum.POINT);
+        if (pointProductCount + count > pointValidateJoinRespDTO.getCount()) {
             throw exception(PRICE_CALCULATE_POINT_TOTAL_LIMIT_COUNT);
         }
         return pointValidateJoinRespDTO;

+ 2 - 1
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;
 import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi;
 import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillValidateJoinRespDTO;
 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
@@ -60,7 +61,7 @@ public class TradeSeckillActivityPriceCalculator implements TradePriceCalculator
         // 1. 校验是否可以参与秒杀
         SeckillValidateJoinRespDTO seckillActivity = seckillActivityApi.validateJoinSeckill(activityId, skuId, count);
         // 2. 校验总限购数量,目前只有 trade 有具体下单的数据,需要交给 trade 价格计算使用
-        int seckillProductCount = tradeOrderQueryService.getSeckillProductCount(userId, activityId);
+        int seckillProductCount = tradeOrderQueryService.getActivityProductCount(userId, activityId, TradeOrderTypeEnum.SECKILL);
         if (seckillProductCount + count > seckillActivity.getTotalLimitCount()) {
             throw exception(PRICE_CALCULATE_SECKILL_TOTAL_LIMIT_COUNT);
         }