Commit 783f019366a872f42a514e66cf5999ada5234264

Authored by 芋道源码
Committed by Gitee
2 parents 74492d65 9f271c3d

!1077 【功能优化】商城:秒杀装修重构

Merge pull request !1077 from 卢越/master-jdk17
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/SeckillActivityController.java
1 1 package cn.iocoder.yudao.module.promotion.controller.admin.seckill;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 5 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 7 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
... ... @@ -13,15 +14,17 @@ import cn.iocoder.yudao.module.promotion.service.seckill.SeckillActivityService;
13 14 import io.swagger.v3.oas.annotations.Operation;
14 15 import io.swagger.v3.oas.annotations.Parameter;
15 16 import io.swagger.v3.oas.annotations.tags.Tag;
  17 +import jakarta.annotation.Resource;
  18 +import jakarta.validation.Valid;
16 19 import org.springframework.security.access.prepost.PreAuthorize;
17 20 import org.springframework.validation.annotation.Validated;
18 21 import org.springframework.web.bind.annotation.*;
19 22  
20   -import jakarta.annotation.Resource;
21   -import jakarta.validation.Valid;
  23 +import java.util.Collections;
22 24 import java.util.List;
23 25  
24 26 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  27 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
25 28 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
26 29  
27 30 @Tag(name = "管理后台 - 秒杀活动")
... ... @@ -89,11 +92,27 @@ public class SeckillActivityController {
89 92 }
90 93  
91 94 // 拼接数据
92   - List<SeckillProductDO> products = seckillActivityService.getSeckillProductListByActivityId(
  95 + List<SeckillProductDO> products = seckillActivityService.getSeckillProductListByActivityIds(
93 96 convertSet(pageResult.getList(), SeckillActivityDO::getId));
94 97 List<ProductSpuRespDTO> spuList = productSpuApi.getSpuList(
95 98 convertSet(pageResult.getList(), SeckillActivityDO::getSpuId));
96 99 return success(SeckillActivityConvert.INSTANCE.convertPage(pageResult, products, spuList));
97 100 }
98 101  
  102 + @GetMapping("/list-by-ids")
  103 + @Operation(summary = "获得秒杀活动列表,基于活动编号数组")
  104 + @Parameter(name = "ids", description = "活动编号数组", required = true, example = "[1024, 1025]")
  105 + public CommonResult<List<SeckillActivityRespVO>> getCombinationActivityListByIds(@RequestParam("ids") List<Long> ids) {
  106 + // 1. 获得开启的活动列表
  107 + List<SeckillActivityDO> activityList = seckillActivityService.getSeckillActivityListByIds(ids);
  108 + activityList.removeIf(activity -> CommonStatusEnum.isDisable(activity.getStatus()));
  109 + if (CollUtil.isEmpty(activityList)) {
  110 + return success(Collections.emptyList());
  111 + }
  112 + // 2. 拼接返回
  113 + List<SeckillProductDO> productList = seckillActivityService.getSeckillProductListByActivityIds(
  114 + convertList(activityList, SeckillActivityDO::getId));
  115 + List<ProductSpuRespDTO> spuList = productSpuApi.getSpuList(convertList(activityList, SeckillActivityDO::getSpuId));
  116 + return success(SeckillActivityConvert.INSTANCE.convertList(activityList, productList, spuList));
  117 + }
99 118 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityRespVO.java
... ... @@ -54,4 +54,8 @@ public class SeckillActivityRespVO extends SeckillActivityBaseVO {
54 54 example = "50")
55 55 private Integer marketPrice;
56 56  
  57 + @Schema(description = "拼团金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
  58 + private Integer seckillPrice; // 从 products 获取最小 price 读取
  59 +
  60 +
57 61 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/seckill/AppSeckillActivityController.java
... ... @@ -23,6 +23,7 @@ import com.google.common.cache.LoadingCache;
23 23 import io.swagger.v3.oas.annotations.Operation;
24 24 import io.swagger.v3.oas.annotations.Parameter;
25 25 import io.swagger.v3.oas.annotations.tags.Tag;
  26 +import jakarta.annotation.Resource;
26 27 import org.springframework.context.annotation.Lazy;
27 28 import org.springframework.validation.annotation.Validated;
28 29 import org.springframework.web.bind.annotation.GetMapping;
... ... @@ -30,7 +31,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
30 31 import org.springframework.web.bind.annotation.RequestParam;
31 32 import org.springframework.web.bind.annotation.RestController;
32 33  
33   -import jakarta.annotation.Resource;
34 34 import java.time.Duration;
35 35 import java.time.LocalDate;
36 36 import java.time.LocalDateTime;
... ... @@ -86,7 +86,7 @@ public class AppSeckillActivityController {
86 86  
87 87 // 2.1 查询满足当前阶段的活动
88 88 List<SeckillActivityDO> activityList = activityService.getSeckillActivityListByConfigIdAndStatus(config.getId(), CommonStatusEnum.ENABLE.getStatus());
89   - List<SeckillProductDO> productList = activityService.getSeckillProductListByActivityId(
  89 + List<SeckillProductDO> productList = activityService.getSeckillProductListByActivityIds(
90 90 convertList(activityList, SeckillActivityDO::getId));
91 91 // 2.2 获取 spu 信息
92 92 List<ProductSpuRespDTO> spuList = spuApi.getSpuList(convertList(activityList, SeckillActivityDO::getSpuId));
... ... @@ -101,7 +101,7 @@ public class AppSeckillActivityController {
101 101 if (CollUtil.isEmpty(pageResult.getList())) {
102 102 return success(PageResult.empty(pageResult.getTotal()));
103 103 }
104   - List<SeckillProductDO> productList = activityService.getSeckillProductListByActivityId(
  104 + List<SeckillProductDO> productList = activityService.getSeckillProductListByActivityIds(
105 105 convertList(pageResult.getList(), SeckillActivityDO::getId));
106 106  
107 107 // 2. 拼接数据
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/SeckillActivityConvert.java
... ... @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.promotion.convert.seckill;
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 5 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
  6 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 7 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
7 8 import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillValidateJoinRespDTO;
8 9 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO;
... ... @@ -87,6 +88,22 @@ public interface SeckillActivityConvert {
87 88 return CollectionUtils.convertList(products, item -> convert(activity, item).setActivityStatus(activity.getStatus()));
88 89 }
89 90  
  91 + default List<SeckillActivityRespVO> convertList(List<SeckillActivityDO> list,
  92 + List<SeckillProductDO> productList,
  93 + List<ProductSpuRespDTO> spuList) {
  94 + List<SeckillActivityRespVO> activityList = BeanUtils.toBean(list, SeckillActivityRespVO.class);
  95 + Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
  96 + Map<Long, List<SeckillProductDO>> productMap = convertMultiMap(productList, SeckillProductDO::getActivityId);
  97 + return CollectionUtils.convertList(activityList, item -> {
  98 + // 设置 product 信息
  99 + item.setSeckillPrice(getMinValue(productMap.get(item.getId()), SeckillProductDO::getSeckillPrice));
  100 + // 设置 SPU 信息
  101 + findAndThen(spuMap, item.getSpuId(), spu -> item.setSpuName(spu.getName())
  102 + .setPicUrl(spu.getPicUrl()).setMarketPrice(spu.getMarketPrice()));
  103 + return item;
  104 + });
  105 + }
  106 +
90 107 List<SeckillProductRespVO> convertList2(List<SeckillProductDO> list);
91 108  
92 109 List<AppSeckillActivityRespVO> convertList3(List<SeckillActivityDO> activityList);
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/SeckillActivityService.java
... ... @@ -8,8 +8,8 @@ import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.Se
8 8 import cn.iocoder.yudao.module.promotion.controller.app.seckill.vo.activity.AppSeckillActivityPageReqVO;
9 9 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillActivityDO;
10 10 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillProductDO;
11   -
12 11 import jakarta.validation.Valid;
  12 +
13 13 import java.time.LocalDateTime;
14 14 import java.util.Collection;
15 15 import java.util.List;
... ... @@ -98,7 +98,7 @@ public interface SeckillActivityService {
98 98 * @param activityIds 活动编号
99 99 * @return 活动商品列表
100 100 */
101   - List<SeckillProductDO> getSeckillProductListByActivityId(Collection<Long> activityIds);
  101 + List<SeckillProductDO> getSeckillProductListByActivityIds(Collection<Long> activityIds);
102 102  
103 103 /**
104 104 * 通过活动时段编号获取指定 status 的秒杀活动
... ... @@ -139,4 +139,12 @@ public interface SeckillActivityService {
139 139 */
140 140 List<SeckillActivityDO> getSeckillActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime);
141 141  
  142 + /**
  143 + * 获得拼团活动列表
  144 + *
  145 + * @param ids 拼团活动 ids
  146 + * @return 拼团活动的列表
  147 + */
  148 + List<SeckillActivityDO> getSeckillActivityListByIds(Collection<Long> ids);
  149 +
142 150 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/SeckillActivityServiceImpl.java
... ... @@ -23,11 +23,11 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillConfigDO;
23 23 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillProductDO;
24 24 import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillActivityMapper;
25 25 import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillProductMapper;
  26 +import jakarta.annotation.Resource;
26 27 import org.springframework.stereotype.Service;
27 28 import org.springframework.transaction.annotation.Transactional;
28 29 import org.springframework.validation.annotation.Validated;
29 30  
30   -import jakarta.annotation.Resource;
31 31 import java.time.LocalDateTime;
32 32 import java.util.Collection;
33 33 import java.util.Collections;
... ... @@ -276,7 +276,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
276 276 }
277 277  
278 278 @Override
279   - public List<SeckillProductDO> getSeckillProductListByActivityId(Collection<Long> activityIds) {
  279 + public List<SeckillProductDO> getSeckillProductListByActivityIds(Collection<Long> activityIds) {
280 280 return seckillProductMapper.selectListByActivityId(activityIds);
281 281 }
282 282  
... ... @@ -336,4 +336,9 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
336 336 convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")), dateTime);
337 337 }
338 338  
  339 + @Override
  340 + public List<SeckillActivityDO> getSeckillActivityListByIds(Collection<Long> ids) {
  341 + return seckillActivityMapper.selectList(SeckillActivityDO::getId, ids);
  342 + }
  343 +
339 344 }
... ...