Commit b8c653d18b0aeb325abff9cbea1d9510843ea93c

Authored by 卢越
1 parent 0ce0c3f3

【功能优化】拼团装修重构;

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 }