Commit 783f019366a872f42a514e66cf5999ada5234264
Committed by
Gitee
!1077 【功能优化】商城:秒杀装修重构
Merge pull request !1077 from 卢越/master-jdk17
Showing
6 changed files
with
63 additions
and
10 deletions
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/SeckillActivityController.java
| 1 | package cn.iocoder.yudao.module.promotion.controller.admin.seckill; | 1 | package cn.iocoder.yudao.module.promotion.controller.admin.seckill; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 4 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 6 | import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; | 7 | import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; |
| @@ -13,15 +14,17 @@ import cn.iocoder.yudao.module.promotion.service.seckill.SeckillActivityService; | @@ -13,15 +14,17 @@ import cn.iocoder.yudao.module.promotion.service.seckill.SeckillActivityService; | ||
| 13 | import io.swagger.v3.oas.annotations.Operation; | 14 | import io.swagger.v3.oas.annotations.Operation; |
| 14 | import io.swagger.v3.oas.annotations.Parameter; | 15 | import io.swagger.v3.oas.annotations.Parameter; |
| 15 | import io.swagger.v3.oas.annotations.tags.Tag; | 16 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 17 | +import jakarta.annotation.Resource; | ||
| 18 | +import jakarta.validation.Valid; | ||
| 16 | import org.springframework.security.access.prepost.PreAuthorize; | 19 | import org.springframework.security.access.prepost.PreAuthorize; |
| 17 | import org.springframework.validation.annotation.Validated; | 20 | import org.springframework.validation.annotation.Validated; |
| 18 | import org.springframework.web.bind.annotation.*; | 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 | import java.util.List; | 24 | import java.util.List; |
| 23 | 25 | ||
| 24 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 26 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 27 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; | ||
| 25 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | 28 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| 26 | 29 | ||
| 27 | @Tag(name = "管理后台 - 秒杀活动") | 30 | @Tag(name = "管理后台 - 秒杀活动") |
| @@ -89,11 +92,27 @@ public class SeckillActivityController { | @@ -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 | convertSet(pageResult.getList(), SeckillActivityDO::getId)); | 96 | convertSet(pageResult.getList(), SeckillActivityDO::getId)); |
| 94 | List<ProductSpuRespDTO> spuList = productSpuApi.getSpuList( | 97 | List<ProductSpuRespDTO> spuList = productSpuApi.getSpuList( |
| 95 | convertSet(pageResult.getList(), SeckillActivityDO::getSpuId)); | 98 | convertSet(pageResult.getList(), SeckillActivityDO::getSpuId)); |
| 96 | return success(SeckillActivityConvert.INSTANCE.convertPage(pageResult, products, spuList)); | 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,4 +54,8 @@ public class SeckillActivityRespVO extends SeckillActivityBaseVO { | ||
| 54 | example = "50") | 54 | example = "50") |
| 55 | private Integer marketPrice; | 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,6 +23,7 @@ import com.google.common.cache.LoadingCache; | ||
| 23 | import io.swagger.v3.oas.annotations.Operation; | 23 | import io.swagger.v3.oas.annotations.Operation; |
| 24 | import io.swagger.v3.oas.annotations.Parameter; | 24 | import io.swagger.v3.oas.annotations.Parameter; |
| 25 | import io.swagger.v3.oas.annotations.tags.Tag; | 25 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 26 | +import jakarta.annotation.Resource; | ||
| 26 | import org.springframework.context.annotation.Lazy; | 27 | import org.springframework.context.annotation.Lazy; |
| 27 | import org.springframework.validation.annotation.Validated; | 28 | import org.springframework.validation.annotation.Validated; |
| 28 | import org.springframework.web.bind.annotation.GetMapping; | 29 | import org.springframework.web.bind.annotation.GetMapping; |
| @@ -30,7 +31,6 @@ import org.springframework.web.bind.annotation.RequestMapping; | @@ -30,7 +31,6 @@ import org.springframework.web.bind.annotation.RequestMapping; | ||
| 30 | import org.springframework.web.bind.annotation.RequestParam; | 31 | import org.springframework.web.bind.annotation.RequestParam; |
| 31 | import org.springframework.web.bind.annotation.RestController; | 32 | import org.springframework.web.bind.annotation.RestController; |
| 32 | 33 | ||
| 33 | -import jakarta.annotation.Resource; | ||
| 34 | import java.time.Duration; | 34 | import java.time.Duration; |
| 35 | import java.time.LocalDate; | 35 | import java.time.LocalDate; |
| 36 | import java.time.LocalDateTime; | 36 | import java.time.LocalDateTime; |
| @@ -86,7 +86,7 @@ public class AppSeckillActivityController { | @@ -86,7 +86,7 @@ public class AppSeckillActivityController { | ||
| 86 | 86 | ||
| 87 | // 2.1 查询满足当前阶段的活动 | 87 | // 2.1 查询满足当前阶段的活动 |
| 88 | List<SeckillActivityDO> activityList = activityService.getSeckillActivityListByConfigIdAndStatus(config.getId(), CommonStatusEnum.ENABLE.getStatus()); | 88 | List<SeckillActivityDO> activityList = activityService.getSeckillActivityListByConfigIdAndStatus(config.getId(), CommonStatusEnum.ENABLE.getStatus()); |
| 89 | - List<SeckillProductDO> productList = activityService.getSeckillProductListByActivityId( | 89 | + List<SeckillProductDO> productList = activityService.getSeckillProductListByActivityIds( |
| 90 | convertList(activityList, SeckillActivityDO::getId)); | 90 | convertList(activityList, SeckillActivityDO::getId)); |
| 91 | // 2.2 获取 spu 信息 | 91 | // 2.2 获取 spu 信息 |
| 92 | List<ProductSpuRespDTO> spuList = spuApi.getSpuList(convertList(activityList, SeckillActivityDO::getSpuId)); | 92 | List<ProductSpuRespDTO> spuList = spuApi.getSpuList(convertList(activityList, SeckillActivityDO::getSpuId)); |
| @@ -101,7 +101,7 @@ public class AppSeckillActivityController { | @@ -101,7 +101,7 @@ public class AppSeckillActivityController { | ||
| 101 | if (CollUtil.isEmpty(pageResult.getList())) { | 101 | if (CollUtil.isEmpty(pageResult.getList())) { |
| 102 | return success(PageResult.empty(pageResult.getTotal())); | 102 | return success(PageResult.empty(pageResult.getTotal())); |
| 103 | } | 103 | } |
| 104 | - List<SeckillProductDO> productList = activityService.getSeckillProductListByActivityId( | 104 | + List<SeckillProductDO> productList = activityService.getSeckillProductListByActivityIds( |
| 105 | convertList(pageResult.getList(), SeckillActivityDO::getId)); | 105 | convertList(pageResult.getList(), SeckillActivityDO::getId)); |
| 106 | 106 | ||
| 107 | // 2. 拼接数据 | 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,6 +3,7 @@ package cn.iocoder.yudao.module.promotion.convert.seckill; | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | 4 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| 5 | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | 5 | import cn.iocoder.yudao.framework.common.util.collection.MapUtils; |
| 6 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 6 | import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; | 7 | import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; |
| 7 | import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillValidateJoinRespDTO; | 8 | import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillValidateJoinRespDTO; |
| 8 | import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO; | 9 | import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO; |
| @@ -87,6 +88,22 @@ public interface SeckillActivityConvert { | @@ -87,6 +88,22 @@ public interface SeckillActivityConvert { | ||
| 87 | return CollectionUtils.convertList(products, item -> convert(activity, item).setActivityStatus(activity.getStatus())); | 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 | List<SeckillProductRespVO> convertList2(List<SeckillProductDO> list); | 107 | List<SeckillProductRespVO> convertList2(List<SeckillProductDO> list); |
| 91 | 108 | ||
| 92 | List<AppSeckillActivityRespVO> convertList3(List<SeckillActivityDO> activityList); | 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 +8,8 @@ import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.Se | ||
| 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 cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillProductDO; | 10 | import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillProductDO; |
| 11 | - | ||
| 12 | import jakarta.validation.Valid; | 11 | import jakarta.validation.Valid; |
| 12 | + | ||
| 13 | import java.time.LocalDateTime; | 13 | import java.time.LocalDateTime; |
| 14 | import java.util.Collection; | 14 | import java.util.Collection; |
| 15 | import java.util.List; | 15 | import java.util.List; |
| @@ -98,7 +98,7 @@ public interface SeckillActivityService { | @@ -98,7 +98,7 @@ public interface SeckillActivityService { | ||
| 98 | * @param activityIds 活动编号 | 98 | * @param activityIds 活动编号 |
| 99 | * @return 活动商品列表 | 99 | * @return 活动商品列表 |
| 100 | */ | 100 | */ |
| 101 | - List<SeckillProductDO> getSeckillProductListByActivityId(Collection<Long> activityIds); | 101 | + List<SeckillProductDO> getSeckillProductListByActivityIds(Collection<Long> activityIds); |
| 102 | 102 | ||
| 103 | /** | 103 | /** |
| 104 | * 通过活动时段编号获取指定 status 的秒杀活动 | 104 | * 通过活动时段编号获取指定 status 的秒杀活动 |
| @@ -139,4 +139,12 @@ public interface SeckillActivityService { | @@ -139,4 +139,12 @@ public interface SeckillActivityService { | ||
| 139 | */ | 139 | */ |
| 140 | List<SeckillActivityDO> getSeckillActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime); | 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,11 +23,11 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillConfigDO; | ||
| 23 | import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillProductDO; | 23 | import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillProductDO; |
| 24 | import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillActivityMapper; | 24 | import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillActivityMapper; |
| 25 | import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillProductMapper; | 25 | import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillProductMapper; |
| 26 | +import jakarta.annotation.Resource; | ||
| 26 | import org.springframework.stereotype.Service; | 27 | import org.springframework.stereotype.Service; |
| 27 | import org.springframework.transaction.annotation.Transactional; | 28 | import org.springframework.transaction.annotation.Transactional; |
| 28 | import org.springframework.validation.annotation.Validated; | 29 | import org.springframework.validation.annotation.Validated; |
| 29 | 30 | ||
| 30 | -import jakarta.annotation.Resource; | ||
| 31 | import java.time.LocalDateTime; | 31 | import java.time.LocalDateTime; |
| 32 | import java.util.Collection; | 32 | import java.util.Collection; |
| 33 | import java.util.Collections; | 33 | import java.util.Collections; |
| @@ -276,7 +276,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { | @@ -276,7 +276,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { | ||
| 276 | } | 276 | } |
| 277 | 277 | ||
| 278 | @Override | 278 | @Override |
| 279 | - public List<SeckillProductDO> getSeckillProductListByActivityId(Collection<Long> activityIds) { | 279 | + public List<SeckillProductDO> getSeckillProductListByActivityIds(Collection<Long> activityIds) { |
| 280 | return seckillProductMapper.selectListByActivityId(activityIds); | 280 | return seckillProductMapper.selectListByActivityId(activityIds); |
| 281 | } | 281 | } |
| 282 | 282 | ||
| @@ -336,4 +336,9 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { | @@ -336,4 +336,9 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { | ||
| 336 | convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")), dateTime); | 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 | } |