Commit b8c653d18b0aeb325abff9cbea1d9510843ea93c
1 parent
0ce0c3f3
【功能优化】拼团装修重构;
Showing
3 changed files
with
92 additions
and
3 deletions
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/combination/CombinationActivityController.java
| @@ -16,19 +16,21 @@ import cn.iocoder.yudao.module.promotion.service.combination.CombinationRecordSe | @@ -16,19 +16,21 @@ import cn.iocoder.yudao.module.promotion.service.combination.CombinationRecordSe | ||
| 16 | import io.swagger.v3.oas.annotations.Operation; | 16 | import io.swagger.v3.oas.annotations.Operation; |
| 17 | import io.swagger.v3.oas.annotations.Parameter; | 17 | import io.swagger.v3.oas.annotations.Parameter; |
| 18 | import io.swagger.v3.oas.annotations.tags.Tag; | 18 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 19 | +import jakarta.annotation.Resource; | ||
| 20 | +import jakarta.validation.Valid; | ||
| 19 | import org.springframework.security.access.prepost.PreAuthorize; | 21 | import org.springframework.security.access.prepost.PreAuthorize; |
| 20 | import org.springframework.validation.annotation.Validated; | 22 | import org.springframework.validation.annotation.Validated; |
| 21 | import org.springframework.web.bind.annotation.*; | 23 | import org.springframework.web.bind.annotation.*; |
| 22 | 24 | ||
| 23 | -import jakarta.annotation.Resource; | ||
| 24 | -import jakarta.validation.Valid; | 25 | +import java.util.Collection; |
| 25 | import java.util.List; | 26 | import java.util.List; |
| 26 | import java.util.Map; | 27 | import java.util.Map; |
| 27 | import java.util.Set; | 28 | import java.util.Set; |
| 29 | +import java.util.stream.Collectors; | ||
| 28 | 30 | ||
| 29 | import static cn.hutool.core.collection.CollectionUtil.newArrayList; | 31 | import static cn.hutool.core.collection.CollectionUtil.newArrayList; |
| 30 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 32 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 31 | -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | 33 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; |
| 32 | 34 | ||
| 33 | @Tag(name = "管理后台 - 拼团活动") | 35 | @Tag(name = "管理后台 - 拼团活动") |
| 34 | @RestController | 36 | @RestController |
| @@ -87,6 +89,43 @@ public class CombinationActivityController { | @@ -87,6 +89,43 @@ public class CombinationActivityController { | ||
| 87 | return success(CombinationActivityConvert.INSTANCE.convert(activity, products)); | 89 | return success(CombinationActivityConvert.INSTANCE.convert(activity, products)); |
| 88 | } | 90 | } |
| 89 | 91 | ||
| 92 | + @GetMapping("/list") | ||
| 93 | + @Operation(summary = "获得拼团活动详情列表") | ||
| 94 | + @Parameter(name = "combinationActivityIds", description = "拼团活动编号列表", required = true, example = "[1,2,3]") | ||
| 95 | + @PreAuthorize("@ss.hasPermission('product:spu:query')") | ||
| 96 | + public CommonResult<List<CombinationActivityRespVO>> getCombinationActivityDetailList(@RequestParam("combinationActivityIds") Collection<Long> combinationActivityIds) { | ||
| 97 | + // 查询拼团活动列表 | ||
| 98 | + List<CombinationActivityDO> activities = combinationActivityService.getCombinationActivityListByIds(combinationActivityIds); | ||
| 99 | + | ||
| 100 | + // 转换活动列表 | ||
| 101 | + List<CombinationActivityRespVO> activityVOs = CombinationActivityConvert.INSTANCE.convertList(activities); | ||
| 102 | + | ||
| 103 | + // 获取商品SPU列表和拼团产品列表 | ||
| 104 | + Set<Long> spuIds = activities.stream().map(CombinationActivityDO::getSpuId).collect(Collectors.toSet()); | ||
| 105 | + List<ProductSpuRespDTO> spuList = productSpuApi.getSpuList(spuIds); | ||
| 106 | + | ||
| 107 | + Set<Long> activityIds = activities.stream().map(CombinationActivityDO::getId).collect(Collectors.toSet()); | ||
| 108 | + List<CombinationProductDO> productList = combinationActivityService.getCombinationProductListByActivityIds(activityIds); | ||
| 109 | + | ||
| 110 | + // 创建SPU和产品的映射 | ||
| 111 | + Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId); | ||
| 112 | + Map<Long, List<CombinationProductDO>> productMap = convertMultiMap(productList, CombinationProductDO::getActivityId); | ||
| 113 | + | ||
| 114 | + // 更新VO列表 | ||
| 115 | + activityVOs.forEach(vo -> { | ||
| 116 | + ProductSpuRespDTO spu = spuMap.get(vo.getSpuId()); | ||
| 117 | + if (spu != null) { | ||
| 118 | + vo.setSpuName(spu.getName()) | ||
| 119 | + .setPicUrl(spu.getPicUrl()) | ||
| 120 | + .setMarketPrice(spu.getMarketPrice()); | ||
| 121 | + } | ||
| 122 | + vo.setProducts(CombinationActivityConvert.INSTANCE.convertList2(productMap.get(vo.getId()))); | ||
| 123 | + }); | ||
| 124 | + | ||
| 125 | + return success(activityVOs); | ||
| 126 | + } | ||
| 127 | + | ||
| 128 | + | ||
| 90 | @GetMapping("/page") | 129 | @GetMapping("/page") |
| 91 | @Operation(summary = "获得拼团活动分页") | 130 | @Operation(summary = "获得拼团活动分页") |
| 92 | @PreAuthorize("@ss.hasPermission('promotion:combination-activity:query')") | 131 | @PreAuthorize("@ss.hasPermission('promotion:combination-activity:query')") |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/combination/vo/activity/CombinationActivityRespVO.java
| @@ -27,4 +27,16 @@ public class CombinationActivityRespVO extends CombinationActivityBaseVO { | @@ -27,4 +27,16 @@ public class CombinationActivityRespVO extends CombinationActivityBaseVO { | ||
| 27 | @Schema(description = "拼团商品", requiredMode = Schema.RequiredMode.REQUIRED) | 27 | @Schema(description = "拼团商品", requiredMode = Schema.RequiredMode.REQUIRED) |
| 28 | private List<CombinationProductRespVO> products; | 28 | private List<CombinationProductRespVO> products; |
| 29 | 29 | ||
| 30 | + // ========== 商品字段 ========== | ||
| 31 | + | ||
| 32 | + @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, // 从 SPU 的 name 读取 | ||
| 33 | + example = "618大促") | ||
| 34 | + private String spuName; | ||
| 35 | + @Schema(description = "商品主图", requiredMode = Schema.RequiredMode.REQUIRED, // 从 SPU 的 picUrl 读取 | ||
| 36 | + example = "https://www.iocoder.cn/xx.png") | ||
| 37 | + private String picUrl; | ||
| 38 | + @Schema(description = "商品市场价,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, // 从 SPU 的 marketPrice 读取 | ||
| 39 | + example = "50") | ||
| 40 | + private Integer marketPrice; | ||
| 41 | + | ||
| 30 | } | 42 | } |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/AppCombinationActivityController.java
| @@ -26,9 +26,13 @@ import org.springframework.web.bind.annotation.RequestParam; | @@ -26,9 +26,13 @@ import org.springframework.web.bind.annotation.RequestParam; | ||
| 26 | import org.springframework.web.bind.annotation.RestController; | 26 | import org.springframework.web.bind.annotation.RestController; |
| 27 | 27 | ||
| 28 | import jakarta.annotation.Resource; | 28 | import jakarta.annotation.Resource; |
| 29 | + | ||
| 29 | import java.time.Duration; | 30 | import java.time.Duration; |
| 31 | +import java.util.ArrayList; | ||
| 32 | +import java.util.Collection; | ||
| 30 | import java.util.Collections; | 33 | import java.util.Collections; |
| 31 | import java.util.List; | 34 | import java.util.List; |
| 35 | +import java.util.stream.Collectors; | ||
| 32 | 36 | ||
| 33 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 37 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 34 | import static cn.iocoder.yudao.framework.common.util.cache.CacheUtils.buildAsyncReloadingCache; | 38 | import static cn.iocoder.yudao.framework.common.util.cache.CacheUtils.buildAsyncReloadingCache; |
| @@ -109,4 +113,38 @@ public class AppCombinationActivityController { | @@ -109,4 +113,38 @@ public class AppCombinationActivityController { | ||
| 109 | return success(CombinationActivityConvert.INSTANCE.convert3(activity, products)); | 113 | return success(CombinationActivityConvert.INSTANCE.convert3(activity, products)); |
| 110 | } | 114 | } |
| 111 | 115 | ||
| 116 | + @GetMapping("/get-detail-list") | ||
| 117 | + @Operation(summary = "获得拼团活动明细") | ||
| 118 | + @Parameter(name = "combinationActivityIds", description = "活动编号列表", required = true, example = "[1024, 1025]") | ||
| 119 | + public CommonResult<List<AppCombinationActivityDetailRespVO>> getCombinationActivityDetailList(@RequestParam("combinationActivityIds") Collection<Long> combinationActivityIds) { | ||
| 120 | + // 1. 获取活动 | ||
| 121 | + List<CombinationActivityDO> combinationActivityDOList = activityService.getCombinationActivityListByIds(combinationActivityIds); | ||
| 122 | + | ||
| 123 | + // 过滤掉无效的活动 | ||
| 124 | + List<CombinationActivityDO> validActivities = combinationActivityDOList.stream() | ||
| 125 | + .filter(combinationActivityDO -> combinationActivityDO != null && | ||
| 126 | + !ObjectUtil.equal(combinationActivityDO.getStatus(), CommonStatusEnum.DISABLE.getStatus())) | ||
| 127 | + .toList(); | ||
| 128 | + | ||
| 129 | + // 如果没有有效的活动,返回 null 或者适当的错误信息 | ||
| 130 | + if (validActivities.isEmpty()) { | ||
| 131 | + return success(null); // 或者 return error("没有有效的活动"); | ||
| 132 | + } | ||
| 133 | + | ||
| 134 | + // 2. 构建结果列表 | ||
| 135 | + List<AppCombinationActivityDetailRespVO> detailRespVOList = new ArrayList<>(); | ||
| 136 | + for (CombinationActivityDO activity : validActivities) { | ||
| 137 | + // 获取活动商品 | ||
| 138 | + List<CombinationProductDO> products = activityService.getCombinationProductsByActivityId(activity.getId()); | ||
| 139 | + | ||
| 140 | + // 调用转换方法并添加到结果列表 | ||
| 141 | + AppCombinationActivityDetailRespVO detailRespVO = CombinationActivityConvert.INSTANCE.convert3(activity, products); | ||
| 142 | + detailRespVOList.add(detailRespVO); | ||
| 143 | + } | ||
| 144 | + | ||
| 145 | + // 3. 返回转换后的结果 | ||
| 146 | + return success(detailRespVOList); | ||
| 147 | + } | ||
| 148 | + | ||
| 149 | + | ||
| 112 | } | 150 | } |