Commit 831983e31430b9807ca4a7f7a12d12bf9edda1ba

Authored by puhui999
1 parent e845872a

营销活动:重构 getCombinationActivityBySpuIdsAndStatus 方法

yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/bargain/BargainActivityMapper.java
@@ -6,14 +6,15 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; @@ -6,14 +6,15 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
7 import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityPageReqVO; 7 import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityPageReqVO;
8 import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO; 8 import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
  9 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
9 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; 10 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
10 import org.apache.ibatis.annotations.Mapper; 11 import org.apache.ibatis.annotations.Mapper;
11 import org.apache.ibatis.annotations.Param; 12 import org.apache.ibatis.annotations.Param;
12 -import org.apache.ibatis.annotations.Select;  
13 13
14 import java.time.LocalDateTime; 14 import java.time.LocalDateTime;
15 import java.util.Collection; 15 import java.util.Collection;
16 import java.util.List; 16 import java.util.List;
  17 +import java.util.Map;
17 18
18 /** 19 /**
19 * 砍价活动 Mapper 20 * 砍价活动 Mapper
@@ -86,30 +87,25 @@ public interface BargainActivityMapper extends BaseMapperX<BargainActivityDO> { @@ -86,30 +87,25 @@ public interface BargainActivityMapper extends BaseMapperX<BargainActivityDO> {
86 .last("LIMIT " + count)); 87 .last("LIMIT " + count));
87 } 88 }
88 89
89 - // TODO @puhui999:一个商品,在统一时间,不会参与多个活动;so 是不是不用 inner join 哈?  
90 - // PS:如果可以参与多个,其实可以这样写 select * from promotion_bargain_activity group by spu_id ORDER BY create_time DESC;通过 group 来过滤  
91 -  
92 /** 90 /**
93 - * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录 91 + * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
94 * 92 *
95 * @param spuIds spu 编号 93 * @param spuIds spu 编号
96 * @param status 状态 94 * @param status 状态
97 - * @return 砍价活动列表 95 + * @return 包含 spuId 和 activityId 的 map 对象列表
98 */ 96 */
99 - @Select("<script> " + "SELECT p1.* " +  
100 - "FROM promotion_bargain_activity p1 " +  
101 - "INNER JOIN ( " +  
102 - " SELECT spu_id, MAX(DISTINCT create_time) AS max_create_time " +  
103 - " FROM promotion_bargain_activity " +  
104 - " WHERE spu_id IN " +  
105 - "<foreach collection='spuIds' item='spuId' open='(' separator=',' close=')'>" +  
106 - " #{spuId}" +  
107 - "</foreach>" +  
108 - " GROUP BY spu_id " +  
109 - ") p2 " +  
110 - "ON p1.spu_id = p2.spu_id AND p1.create_time = p2.max_create_time AND p1.status = #{status} " +  
111 - "ORDER BY p1.create_time DESC;" +  
112 - " </script>")  
113 - List<BargainActivityDO> selectListBySpuIdsAndStatus(@Param("spuIds") Collection<Long> spuIds, @Param("status") Integer status); 97 + default List<Map<String, Object>> selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(@Param("spuIds") Collection<Long> spuIds, @Param("status") Integer status) {
  98 + return selectMaps(new QueryWrapper<BargainActivityDO>()
  99 + .select("spu_id AS spuId, MAX(DISTINCT(id)) AS activityId") // 时间越大 id 也越大 直接用 id
  100 + .in("spu_id", spuIds)
  101 + .eq("status", status)
  102 + .groupBy("spu_id"));
  103 + }
  104 +
  105 + default List<BargainActivityDO> selectListByIds(Collection<Long> ids) {
  106 + return selectList(new LambdaQueryWrapperX<BargainActivityDO>()
  107 + .in(BargainActivityDO::getId, ids)
  108 + .orderByDesc(BargainActivityDO::getCreateTime));
  109 + }
114 110
115 } 111 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/CombinationActivityMapper.java
@@ -6,12 +6,13 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; @@ -6,12 +6,13 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
7 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO; 7 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO;
8 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO; 8 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
  9 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
9 import org.apache.ibatis.annotations.Mapper; 10 import org.apache.ibatis.annotations.Mapper;
10 import org.apache.ibatis.annotations.Param; 11 import org.apache.ibatis.annotations.Param;
11 -import org.apache.ibatis.annotations.Select;  
12 12
13 import java.util.Collection; 13 import java.util.Collection;
14 import java.util.List; 14 import java.util.List;
  15 +import java.util.Map;
15 16
16 /** 17 /**
17 * 拼团活动 Mapper 18 * 拼团活动 Mapper
@@ -43,30 +44,24 @@ public interface CombinationActivityMapper extends BaseMapperX&lt;CombinationActivi @@ -43,30 +44,24 @@ public interface CombinationActivityMapper extends BaseMapperX&lt;CombinationActivi
43 .last("LIMIT " + count)); 44 .last("LIMIT " + count));
44 } 45 }
45 46
46 - // TODO @puhui999:类似 BargainActivityMapper  
47 -  
48 /** 47 /**
49 - * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录  
50 - * 48 + * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
51 * @param spuIds spu 编号 49 * @param spuIds spu 编号
52 * @param status 状态 50 * @param status 状态
53 - * @return 拼团活动列表 51 + * @return 包含 spuId 和 activityId 的 map 对象列表
54 */ 52 */
55 - @Select("<script> " + "SELECT p1.* " +  
56 - "FROM promotion_combination_activity p1 " +  
57 - "INNER JOIN ( " +  
58 - " SELECT spu_id, MAX(DISTINCT create_time) AS max_create_time " +  
59 - " FROM promotion_combination_activity " +  
60 - " WHERE spu_id IN " +  
61 - "<foreach collection='spuIds' item='spuId' open='(' separator=',' close=')'>" +  
62 - " #{spuId}" +  
63 - "</foreach>" +  
64 - " GROUP BY spu_id " +  
65 - ") p2 " +  
66 - "ON p1.spu_id = p2.spu_id AND p1.create_time = p2.max_create_time AND p1.status = #{status} " +  
67 - "ORDER BY p1.create_time DESC;" +  
68 - " </script>")  
69 - List<CombinationActivityDO> selectListBySpuIdsAndStatus(@Param("spuIds") Collection<Long> spuIds, @Param("status") Integer status); 53 + default List<Map<String, Object>> selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(@Param("spuIds") Collection<Long> spuIds, @Param("status") Integer status) {
  54 + return selectMaps(new QueryWrapper<CombinationActivityDO>()
  55 + .select("spu_id AS spuId, MAX(DISTINCT(id)) AS activityId") // 时间越大 id 也越大 直接用 id
  56 + .in("spu_id", spuIds)
  57 + .eq("status", status)
  58 + .groupBy("spu_id"));
  59 + }
70 60
  61 + default List<CombinationActivityDO> selectListByIds(Collection<Long> ids) {
  62 + return selectList(new LambdaQueryWrapperX<CombinationActivityDO>()
  63 + .in(CombinationActivityDO::getId, ids)
  64 + .orderByDesc(CombinationActivityDO::getCreateTime));
  65 + }
71 66
72 } 67 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillActivityMapper.java
@@ -7,13 +7,14 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; @@ -7,13 +7,14 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
7 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO; 7 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO;
8 import cn.iocoder.yudao.module.promotion.controller.app.seckill.vo.activity.AppSeckillActivityPageReqVO; 8 import cn.iocoder.yudao.module.promotion.controller.app.seckill.vo.activity.AppSeckillActivityPageReqVO;
9 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillActivityDO; 9 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillActivityDO;
  10 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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 import org.apache.ibatis.annotations.Param; 13 import org.apache.ibatis.annotations.Param;
13 -import org.apache.ibatis.annotations.Select;  
14 14
15 import java.util.Collection; 15 import java.util.Collection;
16 import java.util.List; 16 import java.util.List;
  17 +import java.util.Map;
17 18
18 /** 19 /**
19 * 秒杀活动 Mapper 20 * 秒杀活动 Mapper
@@ -59,29 +60,24 @@ public interface SeckillActivityMapper extends BaseMapperX&lt;SeckillActivityDO&gt; { @@ -59,29 +60,24 @@ public interface SeckillActivityMapper extends BaseMapperX&lt;SeckillActivityDO&gt; {
59 .apply(ObjectUtil.isNotNull(pageReqVO.getConfigId()), "FIND_IN_SET(" + pageReqVO.getConfigId() + ",config_ids) > 0")); 60 .apply(ObjectUtil.isNotNull(pageReqVO.getConfigId()), "FIND_IN_SET(" + pageReqVO.getConfigId() + ",config_ids) > 0"));
60 } 61 }
61 62
62 - // TODO @puhui999:类似 BargainActivityMapper  
63 -  
64 /** 63 /**
65 - * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录  
66 - * 64 + * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
67 * @param spuIds spu 编号 65 * @param spuIds spu 编号
68 * @param status 状态 66 * @param status 状态
69 - * @return 秒杀活动列表 67 + * @return 包含 spuId 和 activityId 的 map 对象列表
70 */ 68 */
71 - @Select("<script> " + "SELECT p1.* " +  
72 - "FROM promotion_seckill_activity p1 " +  
73 - "INNER JOIN ( " +  
74 - " SELECT spu_id, MAX(DISTINCT create_time) AS max_create_time " +  
75 - " FROM promotion_seckill_activity " +  
76 - " WHERE spu_id IN " +  
77 - "<foreach collection='spuIds' item='spuId' open='(' separator=',' close=')'>" +  
78 - " #{spuId}" +  
79 - "</foreach>" +  
80 - " GROUP BY spu_id " +  
81 - ") p2 " +  
82 - "ON p1.spu_id = p2.spu_id AND p1.create_time = p2.max_create_time AND p1.status = #{status} " +  
83 - "ORDER BY p1.create_time DESC;" +  
84 - " </script>")  
85 - List<SeckillActivityDO> selectListBySpuIdsAndStatus(@Param("spuIds") Collection<Long> spuIds, @Param("status") Integer status); 69 + default List<Map<String, Object>> selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(@Param("spuIds") Collection<Long> spuIds, @Param("status") Integer status) {
  70 + return selectMaps(new QueryWrapper<SeckillActivityDO>()
  71 + .select("spu_id AS spuId, MAX(DISTINCT(id)) AS activityId") // 时间越大 id 也越大 直接用 id
  72 + .in("spu_id", spuIds)
  73 + .eq("status", status)
  74 + .groupBy("spu_id"));
  75 + }
  76 +
  77 + default List<SeckillActivityDO> selectListByIds(Collection<Long> ids) {
  78 + return selectList(new LambdaQueryWrapperX<SeckillActivityDO>()
  79 + .in(SeckillActivityDO::getId, ids)
  80 + .orderByDesc(SeckillActivityDO::getCreateTime));
  81 + }
86 82
87 } 83 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainActivityServiceImpl.java
1 package cn.iocoder.yudao.module.promotion.service.bargain; 1 package cn.iocoder.yudao.module.promotion.service.bargain;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.map.MapUtil;
3 import cn.hutool.core.util.ObjUtil; 5 import cn.hutool.core.util.ObjUtil;
4 import cn.hutool.core.util.ObjectUtil; 6 import cn.hutool.core.util.ObjectUtil;
5 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 7 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
@@ -20,12 +22,11 @@ import org.springframework.validation.annotation.Validated; @@ -20,12 +22,11 @@ import org.springframework.validation.annotation.Validated;
20 22
21 import javax.annotation.Resource; 23 import javax.annotation.Resource;
22 import java.time.LocalDateTime; 24 import java.time.LocalDateTime;
23 -import java.util.Collection;  
24 -import java.util.List;  
25 -import java.util.Set; 25 +import java.util.*;
26 26
27 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 27 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
28 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch; 28 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch;
  29 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
29 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS; 30 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
30 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; 31 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
31 32
@@ -178,7 +179,13 @@ public class BargainActivityServiceImpl implements BargainActivityService { @@ -178,7 +179,13 @@ public class BargainActivityServiceImpl implements BargainActivityService {
178 179
179 @Override 180 @Override
180 public List<BargainActivityDO> getBargainActivityBySpuIdsAndStatus(Collection<Long> spuIds, Integer status) { 181 public List<BargainActivityDO> getBargainActivityBySpuIdsAndStatus(Collection<Long> spuIds, Integer status) {
181 - return bargainActivityMapper.selectListBySpuIdsAndStatus(spuIds, status); 182 + // 1.查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
  183 + List<Map<String, Object>> spuIdAndActivityIdMaps = bargainActivityMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(spuIds, status);
  184 + if (CollUtil.isEmpty(spuIdAndActivityIdMaps)) {
  185 + return Collections.emptyList();
  186 + }
  187 + // 2.查询活动详情
  188 + return bargainActivityMapper.selectListByIds(convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")));
182 } 189 }
183 190
184 } 191 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImpl.java
1 package cn.iocoder.yudao.module.promotion.service.combination; 1 package cn.iocoder.yudao.module.promotion.service.combination;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.map.MapUtil;
4 import cn.hutool.core.util.ObjectUtil; 5 import cn.hutool.core.util.ObjectUtil;
5 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 6 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
6 import cn.iocoder.yudao.framework.common.pojo.PageParam; 7 import cn.iocoder.yudao.framework.common.pojo.PageParam;
@@ -25,12 +26,12 @@ import org.springframework.validation.annotation.Validated; @@ -25,12 +26,12 @@ import org.springframework.validation.annotation.Validated;
25 26
26 import javax.annotation.Resource; 27 import javax.annotation.Resource;
27 import java.util.Collection; 28 import java.util.Collection;
  29 +import java.util.Collections;
28 import java.util.List; 30 import java.util.List;
29 import java.util.Map; 31 import java.util.Map;
30 32
31 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 33 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
32 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;  
33 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; 34 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
34 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS; 35 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
35 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS; 36 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
36 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; 37 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
@@ -228,7 +229,13 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic @@ -228,7 +229,13 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
228 229
229 @Override 230 @Override
230 public List<CombinationActivityDO> getCombinationActivityBySpuIdsAndStatus(Collection<Long> spuIds, Integer status) { 231 public List<CombinationActivityDO> getCombinationActivityBySpuIdsAndStatus(Collection<Long> spuIds, Integer status) {
231 - return combinationActivityMapper.selectListBySpuIdsAndStatus(spuIds, status); 232 + // 1.查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
  233 + List<Map<String, Object>> spuIdAndActivityIdMaps = combinationActivityMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(spuIds, status);
  234 + if (CollUtil.isEmpty(spuIdAndActivityIdMaps)) {
  235 + return Collections.emptyList();
  236 + }
  237 + // 2.查询活动详情
  238 + return combinationActivityMapper.selectListByIds(convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")));
232 } 239 }
233 240
234 } 241 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/SeckillActivityServiceImpl.java
1 package cn.iocoder.yudao.module.promotion.service.seckill; 1 package cn.iocoder.yudao.module.promotion.service.seckill;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
3 import cn.hutool.core.collection.CollectionUtil; 4 import cn.hutool.core.collection.CollectionUtil;
  5 +import cn.hutool.core.map.MapUtil;
4 import cn.hutool.core.util.ObjectUtil; 6 import cn.hutool.core.util.ObjectUtil;
5 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 7 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -27,6 +29,7 @@ import org.springframework.validation.annotation.Validated; @@ -27,6 +29,7 @@ import org.springframework.validation.annotation.Validated;
27 29
28 import javax.annotation.Resource; 30 import javax.annotation.Resource;
29 import java.util.Collection; 31 import java.util.Collection;
  32 +import java.util.Collections;
30 import java.util.List; 33 import java.util.List;
31 import java.util.Map; 34 import java.util.Map;
32 35
@@ -312,7 +315,13 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @@ -312,7 +315,13 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
312 315
313 @Override 316 @Override
314 public List<SeckillActivityDO> getSeckillActivityBySpuIdsAndStatus(Collection<Long> spuIds, Integer status) { 317 public List<SeckillActivityDO> getSeckillActivityBySpuIdsAndStatus(Collection<Long> spuIds, Integer status) {
315 - return seckillActivityMapper.selectListBySpuIdsAndStatus(spuIds, status); 318 + // 1.查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
  319 + List<Map<String, Object>> spuIdAndActivityIdMaps = seckillActivityMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(spuIds, status);
  320 + if (CollUtil.isEmpty(spuIdAndActivityIdMaps)) {
  321 + return Collections.emptyList();
  322 + }
  323 + // 2.查询活动详情
  324 + return seckillActivityMapper.selectListByIds(convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")));
316 } 325 }
317 326
318 } 327 }