Commit 65c6184450de989e5705cc571c3a37259bd36315

Authored by YunaiV
1 parent cb995ba0

【代码优化】商城:优化 /promotion/activity/list-by-spu-id 的逻辑

Showing 12 changed files with 81 additions and 308 deletions
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/activity/AppActivityController.java
1 1 package cn.iocoder.yudao.module.promotion.controller.app.activity;
2 2  
3   -import cn.hutool.core.collection.CollUtil;
4   -import cn.hutool.core.map.MapUtil;
5   -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
6 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
7   -import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
8 4 import cn.iocoder.yudao.module.promotion.controller.app.activity.vo.AppActivityRespVO;
9 5 import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
10 6 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
11   -import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO;
12   -import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO;
13   -import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO;
14 7 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillActivityDO;
15   -import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum;
16 8 import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
17 9 import cn.iocoder.yudao.module.promotion.service.bargain.BargainActivityService;
18 10 import cn.iocoder.yudao.module.promotion.service.combination.CombinationActivityService;
19   -import cn.iocoder.yudao.module.promotion.service.discount.DiscountActivityService;
20   -import cn.iocoder.yudao.module.promotion.service.reward.RewardActivityService;
21 11 import cn.iocoder.yudao.module.promotion.service.seckill.SeckillActivityService;
22 12 import io.swagger.v3.oas.annotations.Operation;
23 13 import io.swagger.v3.oas.annotations.Parameter;
... ... @@ -29,12 +19,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
29 19 import org.springframework.web.bind.annotation.RequestParam;
30 20 import org.springframework.web.bind.annotation.RestController;
31 21  
32   -import java.time.LocalDateTime;
33   -import java.util.*;
34   -import java.util.stream.Collectors;
  22 +import java.util.ArrayList;
  23 +import java.util.List;
35 24  
36 25 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
37   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
38 26  
39 27 @Tag(name = "用户 APP - 营销活动") // 用于提供跨多个活动的 HTTP 接口
40 28 @RestController
... ... @@ -48,125 +36,31 @@ public class AppActivityController {
48 36 private SeckillActivityService seckillActivityService;
49 37 @Resource
50 38 private BargainActivityService bargainActivityService;
51   - @Resource
52   - private DiscountActivityService discountActivityService;
53   - @Resource
54   - private RewardActivityService rewardActivityService;
55   -
56   - @Resource
57   - private ProductSpuApi productSpuApi;
58 39  
59 40 @GetMapping("/list-by-spu-id")
60   - @Operation(summary = "获得单个商品,近期参与的每个活动")
  41 + @Operation(summary = "获得单个商品,进行中的拼团、秒杀、砍价活动信息", description = "每种活动,只返回一个")
61 42 @Parameter(name = "spuId", description = "商品编号", required = true)
62 43 public CommonResult<List<AppActivityRespVO>> getActivityListBySpuId(@RequestParam("spuId") Long spuId) {
63   - // 每种活动,只返回一个
64   - return success(getAppActivityList(Collections.singletonList(spuId)));
65   - }
66   -
67   - @GetMapping("/list-by-spu-ids")
68   - @Operation(summary = "获得多个商品,近期参与的每个活动")
69   - @Parameter(name = "spuIds", description = "商品编号数组", required = true)
70   - public CommonResult<Map<Long, List<AppActivityRespVO>>> getActivityListBySpuIds(@RequestParam("spuIds") List<Long> spuIds) {
71   - if (CollUtil.isEmpty(spuIds)) {
72   - return success(MapUtil.empty());
73   - }
74   - // 每种活动,只返回一个;key 为 SPU 编号
75   - return success(convertMultiMap(getAppActivityList(spuIds), AppActivityRespVO::getSpuId));
76   - }
77   -
78   - private List<AppActivityRespVO> getAppActivityList(Collection<Long> spuIds) {
79   - if (CollUtil.isEmpty(spuIds)) {
80   - return new ArrayList<>();
81   - }
82   - // 获取开启的且开始的且没有结束的活动
83   - List<AppActivityRespVO> activityList = new ArrayList<>();
84   - LocalDateTime now = LocalDateTime.now();
  44 + List<AppActivityRespVO> activityVOList = new ArrayList<>();
85 45 // 1. 拼团活动
86   - getCombinationActivities(spuIds, now, activityList);
87   - // 2. 秒杀活动
88   - getSeckillActivities(spuIds, now, activityList);
89   - // 3. 砍价活动
90   - getBargainActivities(spuIds, now, activityList);
91   - // 4. 限时折扣活动
92   - getDiscountActivities(spuIds, now, activityList);
93   - // 5. 满减送活动
94   - getRewardActivityList(spuIds, now, activityList);
95   - return activityList;
96   - }
97   -
98   - private void getCombinationActivities(Collection<Long> spuIds, LocalDateTime now, List<AppActivityRespVO> activityList) {
99   - List<CombinationActivityDO> combinationActivities = combinationActivityService.getCombinationActivityBySpuIdsAndStatusAndDateTimeLt(
100   - spuIds, CommonStatusEnum.ENABLE.getStatus(), now);
101   - if (CollUtil.isEmpty(combinationActivities)) {
102   - return;
103   - }
104   -
105   - combinationActivities.forEach(item -> {
106   - activityList.add(new AppActivityRespVO(item.getId(), PromotionTypeEnum.COMBINATION_ACTIVITY.getType(),
107   - item.getName(), item.getSpuId(), item.getStartTime(), item.getEndTime()));
108   - });
109   - }
110   -
111   - private void getSeckillActivities(Collection<Long> spuIds, LocalDateTime now, List<AppActivityRespVO> activityList) {
112   - List<SeckillActivityDO> seckillActivities = seckillActivityService.getSeckillActivityBySpuIdsAndStatusAndDateTimeLt(
113   - spuIds, CommonStatusEnum.ENABLE.getStatus(), now);
114   - if (CollUtil.isEmpty(seckillActivities)) {
115   - return;
116   - }
117   -
118   - seckillActivities.forEach(item -> {
119   - activityList.add(new AppActivityRespVO(item.getId(), PromotionTypeEnum.SECKILL_ACTIVITY.getType(),
120   - item.getName(), item.getSpuId(), item.getStartTime(), item.getEndTime()));
121   - });
122   - }
123   -
124   - private void getBargainActivities(Collection<Long> spuIds, LocalDateTime now, List<AppActivityRespVO> activityList) {
125   - List<BargainActivityDO> bargainActivities = bargainActivityService.getBargainActivityBySpuIdsAndStatusAndDateTimeLt(
126   - spuIds, CommonStatusEnum.ENABLE.getStatus(), now);
127   - if (CollUtil.isNotEmpty(bargainActivities)) {
128   - return;
129   - }
130   -
131   - bargainActivities.forEach(item -> {
132   - activityList.add(new AppActivityRespVO(item.getId(), PromotionTypeEnum.BARGAIN_ACTIVITY.getType(),
133   - item.getName(), item.getSpuId(), item.getStartTime(), item.getEndTime()));
134   - });
135   - }
136   -
137   - private void getDiscountActivities(Collection<Long> spuIds, LocalDateTime now, List<AppActivityRespVO> activityList) {
138   - List<DiscountActivityDO> discountActivities = discountActivityService.getDiscountActivityBySpuIdsAndStatusAndDateTimeLt(
139   - spuIds, CommonStatusEnum.ENABLE.getStatus(), now);
140   - if (CollUtil.isEmpty(discountActivities)) {
141   - return;
  46 + CombinationActivityDO combinationActivity = combinationActivityService.getMatchCombinationActivityBySpuId(spuId);
  47 + if (combinationActivity != null) {
  48 + activityVOList.add(new AppActivityRespVO(combinationActivity.getId(), PromotionTypeEnum.COMBINATION_ACTIVITY.getType(),
  49 + combinationActivity.getName(), combinationActivity.getSpuId(), combinationActivity.getStartTime(), combinationActivity.getEndTime()));
142 50 }
143   -
144   - List<DiscountProductDO> products = discountActivityService.getDiscountProductsByActivityId(
145   - convertSet(discountActivities, DiscountActivityDO::getId));
146   - Map<Long, Long> productMap = convertMap(products, DiscountProductDO::getActivityId, DiscountProductDO::getSpuId);
147   - discountActivities.forEach(item -> activityList.add(new AppActivityRespVO(item.getId(), PromotionTypeEnum.DISCOUNT_ACTIVITY.getType(),
148   - item.getName(), productMap.get(item.getId()), item.getStartTime(), item.getEndTime())));
149   - }
150   -
151   - private void getRewardActivityList(Collection<Long> spuIds, LocalDateTime now, List<AppActivityRespVO> activityList) {
152   - List<RewardActivityDO> rewardActivities = rewardActivityService.getRewardActivityBySpuIdsAndStatusAndDateTimeLt(
153   - spuIds, CommonStatusEnum.ENABLE.getStatus(), now);
154   - if (CollUtil.isEmpty(rewardActivities)) {
155   - return;
  51 + // 2. 秒杀活动
  52 + SeckillActivityDO seckillActivity = seckillActivityService.getMatchSeckillActivityBySpuId(spuId);
  53 + if (seckillActivity != null) {
  54 + activityVOList.add(new AppActivityRespVO(seckillActivity.getId(), PromotionTypeEnum.SECKILL_ACTIVITY.getType(),
  55 + seckillActivity.getName(), seckillActivity.getSpuId(), seckillActivity.getStartTime(), seckillActivity.getEndTime()));
156 56 }
157   -
158   - Map<Long, Optional<RewardActivityDO>> spuIdAndActivityMap = spuIds.stream().collect(Collectors.toMap(spuId -> spuId, spuId -> rewardActivities.stream()
159   - .filter(activity -> PromotionProductScopeEnum.isAll(activity.getProductScope())
160   - || PromotionProductScopeEnum.isSpu(activity.getProductScope()) // 商品范围
161   - && CollUtil.contains(activity.getProductScopeValues(), spuId)
162   - || PromotionProductScopeEnum.isCategory(activity.getProductScope()) // 分类范围
163   - && CollUtil.contains(activity.getProductScopeValues(), productSpuApi.getSpu(spuId).getCategoryId()))
164   - .max(Comparator.comparing(RewardActivityDO::getCreateTime))));
165   - for (Long supId : spuIdAndActivityMap.keySet()) {
166   - spuIdAndActivityMap.get(supId).ifPresent(rewardActivity -> activityList.add(
167   - new AppActivityRespVO(rewardActivity.getId(), PromotionTypeEnum.REWARD_ACTIVITY.getType(),
168   - rewardActivity.getName(), supId, rewardActivity.getStartTime(), rewardActivity.getEndTime())));
  57 + // 3. 砍价活动
  58 + BargainActivityDO bargainActivity = bargainActivityService.getMatchBargainActivityBySpuId(spuId);
  59 + if (bargainActivity != null) {
  60 + activityVOList.add(new AppActivityRespVO(bargainActivity.getId(), PromotionTypeEnum.BARGAIN_ACTIVITY.getType(),
  61 + bargainActivity.getName(), bargainActivity.getSpuId(), bargainActivity.getStartTime(), bargainActivity.getEndTime()));
169 62 }
  63 + return success(activityVOList);
170 64 }
171 65  
172 66 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/bargain/BargainActivityMapper.java
... ... @@ -6,14 +6,11 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
7 7 import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityPageReqVO;
8 8 import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
9   -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
10 9 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
11 10 import org.apache.ibatis.annotations.Mapper;
12 11  
13 12 import java.time.LocalDateTime;
14   -import java.util.Collection;
15 13 import java.util.List;
16   -import java.util.Map;
17 14  
18 15 /**
19 16 * 砍价活动 Mapper
... ... @@ -86,35 +83,13 @@ public interface BargainActivityMapper extends BaseMapperX&lt;BargainActivityDO&gt; {
86 83 .last("LIMIT " + count));
87 84 }
88 85  
89   - /**
90   - * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
91   - *
92   - * @param spuIds spu 编号
93   - * @param status 状态
94   - * @return 包含 spuId 和 activityId 的 map 对象列表
95   - */
96   - default List<Map<String, Object>> selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(Collection<Long> spuIds, Integer status) {
97   - return selectMaps(new QueryWrapper<BargainActivityDO>()
98   - .select("spu_id AS spuId, MAX(DISTINCT(id)) AS activityId") // 时间越大 id 也越大 直接用 id
99   - .in("spu_id", spuIds)
100   - .eq("status", status)
101   - .groupBy("spu_id"));
102   - }
103   -
104   - /**
105   - * 获取指定活动编号的活动列表且
106   - * 开始时间和结束时间小于给定时间 dateTime 的活动列表
107   - *
108   - * @param ids 活动编号
109   - * @param dateTime 指定日期
110   - * @return 活动列表
111   - */
112   - default List<BargainActivityDO> selectListByIdsAndDateTimeLt(Collection<Long> ids, LocalDateTime dateTime) {
113   - return selectList(new LambdaQueryWrapperX<BargainActivityDO>()
114   - .in(BargainActivityDO::getId, ids)
115   - .lt(BargainActivityDO::getStartTime, dateTime)
116   - .gt(BargainActivityDO::getEndTime, dateTime)// 开始时间 < 指定时间 < 结束时间,也就是说获取指定时间段的活动
117   - .orderByDesc(BargainActivityDO::getCreateTime));
  86 + default BargainActivityDO selectBySpuIdAndStatusAndNow(Long spuId, Integer status) {
  87 + LocalDateTime now = LocalDateTime.now();
  88 + return selectOne(new LambdaQueryWrapperX<BargainActivityDO>()
  89 + .eq(BargainActivityDO::getSpuId, spuId)
  90 + .eq(BargainActivityDO::getStatus, status)
  91 + .lt(BargainActivityDO::getStartTime, now)
  92 + .gt(BargainActivityDO::getEndTime, now)); // 开始时间 < now < 结束时间,也就是说获取指定时间段的活动
118 93 }
119 94  
120 95 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/CombinationActivityMapper.java
... ... @@ -6,14 +6,10 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
7 7 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO;
8 8 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
9   -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
10 9 import org.apache.ibatis.annotations.Mapper;
11   -import org.apache.ibatis.annotations.Param;
12 10  
13 11 import java.time.LocalDateTime;
14   -import java.util.Collection;
15 12 import java.util.List;
16   -import java.util.Map;
17 13  
18 14 /**
19 15 * 拼团活动 Mapper
... ... @@ -39,40 +35,13 @@ public interface CombinationActivityMapper extends BaseMapperX&lt;CombinationActivi
39 35 .eq(CombinationActivityDO::getStatus, status));
40 36 }
41 37  
42   - default List<CombinationActivityDO> selectListByStatus(Integer status, Integer count) {
43   - return selectList(new LambdaQueryWrapperX<CombinationActivityDO>()
  38 + default CombinationActivityDO selectBySpuIdAndStatusAndNow(Long spuId, Integer status) {
  39 + LocalDateTime now = LocalDateTime.now();
  40 + return selectOne(new LambdaQueryWrapperX<CombinationActivityDO>()
  41 + .eq(CombinationActivityDO::getSpuId, spuId)
44 42 .eq(CombinationActivityDO::getStatus, status)
45   - .last("LIMIT " + count));
  43 + .lt(CombinationActivityDO::getStartTime, now)
  44 + .gt(CombinationActivityDO::getEndTime, now)); // 开始时间 < now < 结束时间,也就是说获取指定时间段的活动
46 45 }
47 46  
48   - /**
49   - * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
50   - * @param spuIds spu 编号
51   - * @param status 状态
52   - * @return 包含 spuId 和 activityId 的 map 对象列表
53   - */
54   - default List<Map<String, Object>> selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(@Param("spuIds") Collection<Long> spuIds, @Param("status") Integer status) {
55   - return selectMaps(new QueryWrapper<CombinationActivityDO>()
56   - .select("spu_id AS spuId, MAX(DISTINCT(id)) AS activityId") // 时间越大 id 也越大 直接用 id
57   - .in("spu_id", spuIds)
58   - .eq("status", status)
59   - .groupBy("spu_id"));
60   - }
61   -
62   - /**
63   - * 获取指定活动编号的活动列表且
64   - * 开始时间和结束时间小于给定时间 dateTime 的活动列表
65   - *
66   - * @param ids 活动编号
67   - * @param dateTime 指定日期
68   - * @return 活动列表
69   - */
70   - default List<CombinationActivityDO> selectListByIdsAndDateTimeLt(Collection<Long> ids, LocalDateTime dateTime) {
71   - return selectList(new LambdaQueryWrapperX<CombinationActivityDO>()
72   - .in(CombinationActivityDO::getId, ids)
73   - .lt(CombinationActivityDO::getStartTime, dateTime)
74   - .gt(CombinationActivityDO::getEndTime, dateTime)// 开始时间 < 指定时间 < 结束时间,也就是说获取指定时间段的活动
75   - .orderByDesc(CombinationActivityDO::getCreateTime));
76   - }
77   -
78   -}
  47 +}
79 48 \ No newline at end of file
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillActivityMapper.java
... ... @@ -8,15 +8,11 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
8 8 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO;
9 9 import cn.iocoder.yudao.module.promotion.controller.app.seckill.vo.activity.AppSeckillActivityPageReqVO;
10 10 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillActivityDO;
11   -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
12 11 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
13 12 import org.apache.ibatis.annotations.Mapper;
14   -import org.apache.ibatis.annotations.Param;
15 13  
16 14 import java.time.LocalDateTime;
17   -import java.util.Collection;
18 15 import java.util.List;
19   -import java.util.Map;
20 16  
21 17 /**
22 18 * 秒杀活动 Mapper
... ... @@ -77,35 +73,13 @@ public interface SeckillActivityMapper extends BaseMapperX&lt;SeckillActivityDO&gt; {
77 73 .apply(ObjectUtil.isNotNull(pageReqVO.getConfigId()), "FIND_IN_SET(" + pageReqVO.getConfigId() + ",config_ids) > 0"));
78 74 }
79 75  
80   - /**
81   - * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
82   - *
83   - * @param spuIds spu 编号
84   - * @param status 状态
85   - * @return 包含 spuId 和 activityId 的 map 对象列表
86   - */
87   - default List<Map<String, Object>> selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(@Param("spuIds") Collection<Long> spuIds, @Param("status") Integer status) {
88   - return selectMaps(new QueryWrapper<SeckillActivityDO>()
89   - .select("spu_id AS spuId, MAX(DISTINCT(id)) AS activityId") // 时间越大 id 也越大 直接用 id
90   - .in("spu_id", spuIds)
91   - .eq("status", status)
92   - .groupBy("spu_id"));
93   - }
94   -
95   - /**
96   - * 获取指定活动编号的活动列表且
97   - * 开始时间和结束时间小于给定时间 dateTime 的活动列表
98   - *
99   - * @param ids 活动编号
100   - * @param dateTime 指定日期
101   - * @return 活动列表
102   - */
103   - default List<SeckillActivityDO> selectListByIdsAndDateTimeLt(Collection<Long> ids, LocalDateTime dateTime) {
104   - return selectList(new LambdaQueryWrapperX<SeckillActivityDO>()
105   - .in(SeckillActivityDO::getId, ids)
106   - .lt(SeckillActivityDO::getStartTime, dateTime)
107   - .gt(SeckillActivityDO::getEndTime, dateTime)// 开始时间 < 指定时间 < 结束时间,也就是说获取指定时间段的活动
108   - .orderByDesc(SeckillActivityDO::getCreateTime));
  76 + default SeckillActivityDO selectBySpuIdAndStatusAndNow(Long spuId, Integer status) {
  77 + LocalDateTime now = LocalDateTime.now();
  78 + return selectOne(new LambdaQueryWrapperX<SeckillActivityDO>()
  79 + .eq(SeckillActivityDO::getSpuId, spuId)
  80 + .eq(SeckillActivityDO::getStatus, status)
  81 + .lt(SeckillActivityDO::getStartTime, now)
  82 + .gt(SeckillActivityDO::getEndTime, now)); // 开始时间 < now < 结束时间,也就是说获取指定时间段的活动
109 83 }
110 84  
111 85 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainActivityService.java
... ... @@ -6,10 +6,8 @@ import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.Ba
6 6 import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityPageReqVO;
7 7 import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityUpdateReqVO;
8 8 import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
9   -
10 9 import jakarta.validation.Valid;
11   -import java.time.LocalDateTime;
12   -import java.util.Collection;
  10 +
13 11 import java.util.List;
14 12 import java.util.Set;
15 13  
... ... @@ -108,13 +106,11 @@ public interface BargainActivityService {
108 106 List<BargainActivityDO> getBargainActivityListByCount(Integer count);
109 107  
110 108 /**
111   - * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录
  109 + * 获得 SPU 进行中的砍价活动
112 110 *
113   - * @param spuIds spu 编号
114   - * @param status 状态
115   - * @param dateTime 日期时间
116   - * @return 砍价活动列表
  111 + * @param spuId SPU 编号数组
  112 + * @return 砍价活动
117 113 */
118   - List<BargainActivityDO> getBargainActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime);
  114 + BargainActivityDO getMatchBargainActivityBySpuId(Long spuId);
119 115  
120 116 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainActivityServiceImpl.java
1 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;
5 3 import cn.hutool.core.util.ObjectUtil;
6 4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
7 5 import cn.iocoder.yudao.framework.common.pojo.PageParam;
... ... @@ -15,17 +13,17 @@ import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.Ba
15 13 import cn.iocoder.yudao.module.promotion.convert.bargain.BargainActivityConvert;
16 14 import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
17 15 import cn.iocoder.yudao.module.promotion.dal.mysql.bargain.BargainActivityMapper;
  16 +import jakarta.annotation.Resource;
18 17 import org.springframework.stereotype.Service;
19 18 import org.springframework.transaction.annotation.Transactional;
20 19 import org.springframework.validation.annotation.Validated;
21 20  
22   -import jakarta.annotation.Resource;
23 21 import java.time.LocalDateTime;
24   -import java.util.*;
  22 +import java.util.List;
  23 +import java.util.Set;
25 24  
26 25 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
27 26 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch;
28   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
29 27 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
30 28 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
31 29  
... ... @@ -194,15 +192,8 @@ public class BargainActivityServiceImpl implements BargainActivityService {
194 192 }
195 193  
196 194 @Override
197   - public List<BargainActivityDO> getBargainActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime) {
198   - // 1. 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
199   - List<Map<String, Object>> spuIdAndActivityIdMaps = bargainActivityMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(spuIds, status);
200   - if (CollUtil.isEmpty(spuIdAndActivityIdMaps)) {
201   - return Collections.emptyList();
202   - }
203   - // 2. 查询活动详情
204   - return bargainActivityMapper.selectListByIdsAndDateTimeLt(
205   - convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")), dateTime);
  195 + public BargainActivityDO getMatchBargainActivityBySpuId(Long spuId) {
  196 + return bargainActivityMapper.selectBySpuIdAndStatusAndNow(spuId, CommonStatusEnum.ENABLE.getStatus());
206 197 }
207 198  
208 199 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityService.java
... ... @@ -7,9 +7,8 @@ import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activit
7 7 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO;
8 8 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
9 9 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationProductDO;
10   -
11 10 import jakarta.validation.Valid;
12   -import java.time.LocalDateTime;
  11 +
13 12 import java.util.Collection;
14 13 import java.util.Collections;
15 14 import java.util.List;
... ... @@ -109,22 +108,20 @@ public interface CombinationActivityService {
109 108 PageResult<CombinationActivityDO> getCombinationActivityPage(PageParam pageParam);
110 109  
111 110 /**
112   - * 获取指定活动、指定 sku 编号的商品
  111 + * 获取指定活动、指定 SKU 编号的商品
113 112 *
114 113 * @param activityId 活动编号
115   - * @param skuId sku 编号
  114 + * @param skuId SKU 编号
116 115 * @return 活动商品信息
117 116 */
118 117 CombinationProductDO selectByActivityIdAndSkuId(Long activityId, Long skuId);
119 118  
120 119 /**
121   - * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录
  120 + * 获得 SPU 进行中的拼团活动
122 121 *
123   - * @param spuIds spu 编号
124   - * @param status 状态
125   - * @param dateTime 日期时间
126   - * @return 拼团活动列表
  122 + * @param spuId SPU 编号数组
  123 + * @return 拼团活动
127 124 */
128   - List<CombinationActivityDO> getCombinationActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime);
  125 + CombinationActivityDO getMatchCombinationActivityBySpuId(Long spuId);
129 126  
130 127 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImpl.java
1 1 package cn.iocoder.yudao.module.promotion.service.combination;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4   -import cn.hutool.core.map.MapUtil;
5 4 import cn.hutool.core.util.ObjectUtil;
6 5 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
7 6 import cn.iocoder.yudao.framework.common.pojo.PageParam;
... ... @@ -20,19 +19,18 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationA
20 19 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationProductDO;
21 20 import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationActivityMapper;
22 21 import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationProductMapper;
  22 +import jakarta.annotation.Resource;
23 23 import org.springframework.stereotype.Service;
24 24 import org.springframework.transaction.annotation.Transactional;
25 25 import org.springframework.validation.annotation.Validated;
26 26  
27   -import jakarta.annotation.Resource;
28   -import java.time.LocalDateTime;
29 27 import java.util.Collection;
30   -import java.util.Collections;
31 28 import java.util.List;
32 29 import java.util.Map;
33 30  
34 31 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
35   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
  32 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  33 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
36 34 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
37 35 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
38 36 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
... ... @@ -178,7 +176,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
178 176 combinationProductMapper.updateBatch(diffList.get(1));
179 177 }
180 178 if (CollUtil.isNotEmpty(diffList.get(2))) {
181   - combinationProductMapper.deleteBatchIds(CollectionUtils.convertList(diffList.get(2), CombinationProductDO::getId));
  179 + combinationProductMapper.deleteByIds(CollectionUtils.convertList(diffList.get(2), CombinationProductDO::getId));
182 180 }
183 181 }
184 182  
... ... @@ -238,15 +236,8 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
238 236 }
239 237  
240 238 @Override
241   - public List<CombinationActivityDO> getCombinationActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime) {
242   - // 1.查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
243   - List<Map<String, Object>> spuIdAndActivityIdMaps = combinationActivityMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(spuIds, status);
244   - if (CollUtil.isEmpty(spuIdAndActivityIdMaps)) {
245   - return Collections.emptyList();
246   - }
247   - // 2.查询活动详情
248   - return combinationActivityMapper.selectListByIdsAndDateTimeLt(
249   - convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")), dateTime);
  239 + public CombinationActivityDO getMatchCombinationActivityBySpuId(Long spuId) {
  240 + return combinationActivityMapper.selectBySpuIdAndStatusAndNow(spuId, CommonStatusEnum.ENABLE.getStatus());
250 241 }
251 242  
252 243 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/discount/DiscountActivityService.java
... ... @@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivit
8 8 import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO;
9 9 import jakarta.validation.Valid;
10 10  
11   -import java.time.LocalDateTime;
12 11 import java.util.Collection;
13 12 import java.util.List;
14 13  
... ... @@ -91,14 +90,11 @@ public interface DiscountActivityService {
91 90 List<DiscountProductDO> getDiscountProductsByActivityId(Collection<Long> activityIds);
92 91  
93 92 /**
94   - * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录
  93 + * 获取指定 SPU 编号最近参加的活动,每个 spuId 只返回一条记录
95 94 *
96   - * @param spuIds spu 编号
97   - * @param status 状态
98   - * @param dateTime 当前日期时间
  95 + * @param spuIds SPU 编号数组
99 96 * @return 折扣活动列表
100 97 */
101   - List<DiscountActivityDO> getDiscountActivityBySpuIdsAndStatusAndDateTimeLt(
102   - Collection<Long> spuIds, Integer status, LocalDateTime dateTime);
  98 + List<DiscountActivityDO> getDiscountActivityListBySpuIds(Collection<Long> spuIds);
103 99  
104 100 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/discount/DiscountActivityServiceImpl.java
... ... @@ -189,16 +189,17 @@ public class DiscountActivityServiceImpl implements DiscountActivityService {
189 189 }
190 190  
191 191 @Override
192   - public List<DiscountActivityDO> getDiscountActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime) {
  192 + public List<DiscountActivityDO> getDiscountActivityListBySpuIds(Collection<Long> spuIds) {
193 193 // 1. 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
194   - List<Map<String, Object>> spuIdAndActivityIdMaps = discountProductMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(spuIds, status);
  194 + List<Map<String, Object>> spuIdAndActivityIdMaps = discountProductMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(
  195 + spuIds, CommonStatusEnum.ENABLE.getStatus());
195 196 if (CollUtil.isEmpty(spuIdAndActivityIdMaps)) {
196 197 return Collections.emptyList();
197 198 }
198 199  
199 200 // 2. 查询活动详情
200 201 return discountActivityMapper.selectListByIdsAndDateTimeLt(
201   - convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")), dateTime);
  202 + convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")), LocalDateTime.now());
202 203 }
203 204  
204 205 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/SeckillActivityService.java
... ... @@ -10,7 +10,6 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillActivityD
10 10 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillProductDO;
11 11 import jakarta.validation.Valid;
12 12  
13   -import java.time.LocalDateTime;
14 13 import java.util.Collection;
15 14 import java.util.List;
16 15  
... ... @@ -130,14 +129,12 @@ public interface SeckillActivityService {
130 129 SeckillValidateJoinRespDTO validateJoinSeckill(Long activityId, Long skuId, Integer count);
131 130  
132 131 /**
133   - * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录
  132 + * 获得 SPU 进行中的秒杀活动
134 133 *
135   - * @param spuIds spu 编号
136   - * @param status 状态
137   - * @param dateTime 日期时间
138   - * @return 秒杀活动列表
  134 + * @param spuId SPU 编号数组
  135 + * @return 秒杀活动
139 136 */
140   - List<SeckillActivityDO> getSeckillActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime);
  137 + SeckillActivityDO getMatchSeckillActivityBySpuId(Long spuId);
141 138  
142 139 /**
143 140 * 获得拼团活动列表
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/SeckillActivityServiceImpl.java
1 1 package cn.iocoder.yudao.module.promotion.service.seckill;
2 2  
3   -import cn.hutool.core.collection.CollUtil;
4 3 import cn.hutool.core.collection.CollectionUtil;
5   -import cn.hutool.core.map.MapUtil;
6 4 import cn.hutool.core.util.ObjectUtil;
7 5 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
8 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
... ... @@ -30,7 +28,6 @@ import org.springframework.validation.annotation.Validated;
30 28  
31 29 import java.time.LocalDateTime;
32 30 import java.util.Collection;
33   -import java.util.Collections;
34 31 import java.util.List;
35 32 import java.util.Map;
36 33  
... ... @@ -56,8 +53,10 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
56 53 private SeckillActivityMapper seckillActivityMapper;
57 54 @Resource
58 55 private SeckillProductMapper seckillProductMapper;
  56 +
59 57 @Resource
60 58 private SeckillConfigService seckillConfigService;
  59 +
61 60 @Resource
62 61 private ProductSpuApi productSpuApi;
63 62 @Resource
... ... @@ -219,7 +218,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
219 218 seckillProductMapper.updateBatch(diffList.get(1));
220 219 }
221 220 if (isNotEmpty(diffList.get(2))) {
222   - seckillProductMapper.deleteBatchIds(convertList(diffList.get(2), SeckillProductDO::getId));
  221 + seckillProductMapper.deleteByIds(convertList(diffList.get(2), SeckillProductDO::getId));
223 222 }
224 223 }
225 224  
... ... @@ -249,7 +248,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
249 248 seckillActivityMapper.deleteById(id);
250 249 // 删除活动商品
251 250 List<SeckillProductDO> products = seckillProductMapper.selectListByActivityId(id);
252   - seckillProductMapper.deleteBatchIds(convertSet(products, SeckillProductDO::getId));
  251 + seckillProductMapper.deleteByIds(convertSet(products, SeckillProductDO::getId));
253 252 }
254 253  
255 254 private SeckillActivityDO validateSeckillActivityExists(Long id) {
... ... @@ -325,20 +324,13 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
325 324 }
326 325  
327 326 @Override
328   - public List<SeckillActivityDO> getSeckillActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime) {
329   - // 1.查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
330   - List<Map<String, Object>> spuIdAndActivityIdMaps = seckillActivityMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(spuIds, status);
331   - if (CollUtil.isEmpty(spuIdAndActivityIdMaps)) {
332   - return Collections.emptyList();
333   - }
334   - // 2.查询活动详情
335   - return seckillActivityMapper.selectListByIdsAndDateTimeLt(
336   - convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")), dateTime);
  327 + public SeckillActivityDO getMatchSeckillActivityBySpuId(Long spuId) {
  328 + return seckillActivityMapper.selectBySpuIdAndStatusAndNow(spuId, CommonStatusEnum.ENABLE.getStatus());
337 329 }
338 330  
339 331 @Override
340 332 public List<SeckillActivityDO> getSeckillActivityListByIds(Collection<Long> ids) {
341   - return List.of();
  333 + return seckillActivityMapper.selectBatchIds(ids);
342 334 }
343 335  
344 336 }
... ...