Commit 54fe0174bc1adeb2a2f152d2b17ecf54438caca7

Authored by 芋道源码
Committed by Gitee
2 parents 9451342a 8060aeb5

!625 完善订单和活动 review 提到的问题,完善 app 端获取拼团活动分页、列表、详情接口

Merge pull request !625 from puhui999/feature/mall_product
Showing 30 changed files with 360 additions and 251 deletions
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java
... ... @@ -43,17 +43,6 @@ public class LocalDateTimeUtils {
43 43 return LocalDateTime.of(year, mouth, day, 0, 0, 0);
44 44 }
45 45  
46   - /**
47   - * 创建指定时间
48   - *
49   - * @param timeStr 时间字符串
50   - * @return 指定时间
51   - */
52   - public static LocalDateTime buildTime(String timeStr) {
53   - // TODO @puhui999:这个方法的实现,和 LocalDateTimeUtil.parse() 的差异点是啥呀
54   - return LocalDateTime.of(LocalDate.now(), LocalTime.parse(timeStr));
55   - }
56   -
57 46 public static LocalDateTime[] buildBetweenTime(int year1, int mouth1, int day1,
58 47 int year2, int mouth2, int day2) {
59 48 return new LocalDateTime[]{buildTime(year1, mouth1, day1), buildTime(year2, mouth2, day2)};
... ...
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/seckill/SeckillActivityApi.java
... ... @@ -7,14 +7,13 @@ package cn.iocoder.yudao.module.promotion.api.seckill;
7 7 */
8 8 public interface SeckillActivityApi {
9 9  
10   - // TODO @puhui999:activityId 改成 id 好点哈;
11 10 /**
12 11 * 更新秒杀库存
13 12 *
14   - * @param activityId 活动编号
  13 + * @param id 活动编号
15 14 * @param skuId sku 编号
16 15 * @param count 数量
17 16 */
18   - void updateSeckillStock(Long activityId, Long skuId, Integer count);
  17 + void updateSeckillStock(Long id, Long skuId, Integer count);
19 18  
20 19 }
... ...
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
... ... @@ -56,7 +56,7 @@ public interface ErrorCodeConstants {
56 56 ErrorCode SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END = new ErrorCode(1013008004, "秒杀活动未关闭或未结束,不能删除");
57 57 ErrorCode SECKILL_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1013008005, "秒杀活动已关闭,不能重复关闭");
58 58 ErrorCode SECKILL_ACTIVITY_UPDATE_STOCK_FAIL = new ErrorCode(1013008006, "秒杀失败,原因秒杀库存不足");
59   - ErrorCode SECKILL_ACTIVITY_FAIL_STATUS_CLOSED = new ErrorCode(1013008007, "秒杀活动已关闭");
  59 + ErrorCode SECKILL_ACTIVITY_APP_STATUS_CLOSED = new ErrorCode(1013008007, "秒杀活动已关闭");
60 60  
61 61 // ========== 秒杀时段 1013009000 ==========
62 62 ErrorCode SECKILL_CONFIG_NOT_EXISTS = new ErrorCode(1013009000, "秒杀时段不存在");
... ... @@ -69,6 +69,7 @@ public interface ErrorCodeConstants {
69 69 ErrorCode COMBINATION_ACTIVITY_STATUS_DISABLE_NOT_UPDATE = new ErrorCode(1013010002, "拼团活动已关闭不能修改");
70 70 ErrorCode COMBINATION_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END = new ErrorCode(1013010003, "拼团活动未关闭或未结束,不能删除");
71 71 ErrorCode COMBINATION_ACTIVITY_STATUS_DISABLE = new ErrorCode(1013010004, "拼团失败,原因:拼团活动已关闭");
  72 + ErrorCode COMBINATION_ACTIVITY_APP_STATUS_DISABLE = new ErrorCode(1013010005, "拼团活动已关闭");
72 73  
73 74 // ========== 拼团记录 1013011000 ==========
74 75 ErrorCode COMBINATION_RECORD_NOT_EXISTS = new ErrorCode(1013011000, "拼团不存在");
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/seckill/SeckillActivityApiImpl.java
... ... @@ -17,8 +17,8 @@ public class SeckillActivityApiImpl implements SeckillActivityApi {
17 17 private SeckillActivityService activityService;
18 18  
19 19 @Override
20   - public void updateSeckillStock(Long activityId, Long skuId, Integer count) {
21   - activityService.updateSeckillStock(activityId, skuId, count);
  20 + public void updateSeckillStock(Long id, Long skuId, Integer count) {
  21 + activityService.updateSeckillStock(id, skuId, count);
22 22 }
23 23  
24 24 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/bargain/AppBargainActivityController.java
... ... @@ -23,6 +23,7 @@ import org.springframework.web.bind.annotation.RestController;
23 23 import javax.annotation.Resource;
24 24 import java.util.List;
25 25  
  26 +import static cn.hutool.core.util.ObjectUtil.defaultIfNull;
26 27 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
27 28 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
28 29  
... ... @@ -39,7 +40,7 @@ public class AppBargainActivityController {
39 40 @GetMapping("/page")
40 41 @Operation(summary = "获得砍价活动分页")
41 42 public CommonResult<PageResult<AppBargainActivityRespVO>> getBargainActivityPage(PageParam pageReqVO) {
42   - PageResult<BargainActivityDO> result = bargainActivityService.getBargainActivityPageForApp(pageReqVO);
  43 + PageResult<BargainActivityDO> result = bargainActivityService.getBargainActivityPage(pageReqVO);
43 44 if (CollUtil.isEmpty(result.getList())) {
44 45 return success(PageResult.empty(result.getTotal()));
45 46 }
... ... @@ -54,7 +55,7 @@ public class AppBargainActivityController {
54 55 @Parameter(name = "count", description = "需要展示的数量", example = "6")
55 56 public CommonResult<List<AppBargainActivityRespVO>> getBargainActivityList(
56 57 @RequestParam(name = "count", defaultValue = "6") Integer count) {
57   - List<BargainActivityDO> list = bargainActivityService.getBargainActivityListForApp(count);
  58 + List<BargainActivityDO> list = bargainActivityService.getBargainActivityListByCount(defaultIfNull(count, 6));
58 59 if (CollUtil.isEmpty(list)) {
59 60 return success(BargainActivityConvert.INSTANCE.convertAppList(list));
60 61 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/AppCombinationActivityController.java
1 1 package cn.iocoder.yudao.module.promotion.controller.app.combination;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.ObjectUtil;
  5 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
3 6 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 7 import cn.iocoder.yudao.framework.common.pojo.PageParam;
5 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  9 +import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
  10 +import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
6 11 import cn.iocoder.yudao.module.promotion.controller.app.combination.vo.activity.AppCombinationActivityDetailRespVO;
7 12 import cn.iocoder.yudao.module.promotion.controller.app.combination.vo.activity.AppCombinationActivityRespVO;
  13 +import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert;
  14 +import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
  15 +import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationProductDO;
  16 +import cn.iocoder.yudao.module.promotion.service.combination.CombinationActivityService;
8 17 import io.swagger.v3.oas.annotations.Operation;
9 18 import io.swagger.v3.oas.annotations.Parameter;
10 19 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -14,11 +23,15 @@ import org.springframework.web.bind.annotation.RequestMapping;
14 23 import org.springframework.web.bind.annotation.RequestParam;
15 24 import org.springframework.web.bind.annotation.RestController;
16 25  
17   -import java.time.LocalDateTime;
18   -import java.util.ArrayList;
  26 +import javax.annotation.Resource;
  27 +import java.util.Arrays;
19 28 import java.util.List;
20 29  
  30 +import static cn.hutool.core.util.ObjectUtil.defaultIfNull;
  31 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
21 32 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  33 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  34 +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COMBINATION_ACTIVITY_APP_STATUS_DISABLE;
22 35  
23 36 @Tag(name = "用户 APP - 拼团活动")
24 37 @RestController
... ... @@ -26,104 +39,55 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
26 39 @Validated
27 40 public class AppCombinationActivityController {
28 41  
  42 + @Resource
  43 + private CombinationActivityService activityService;
  44 + @Resource
  45 + private ProductSpuApi spuApi;
  46 +
  47 +
29 48 @GetMapping("/list")
30 49 @Operation(summary = "获得拼团活动列表", description = "用于小程序首页")
31   - // TODO 芋艿:增加 Spring Cache
32   - // TODO 芋艿:缺少 swagger 注解
  50 + @Parameter(name = "count", description = "需要展示的数量", example = "6")
33 51 public CommonResult<List<AppCombinationActivityRespVO>> getCombinationActivityList(
34 52 @RequestParam(name = "count", defaultValue = "6") Integer count) {
35   - List<AppCombinationActivityRespVO> activityList = new ArrayList<>();
36   - AppCombinationActivityRespVO activity1 = new AppCombinationActivityRespVO();
37   - activity1.setId(1L);
38   - activity1.setName("618 大拼团");
39   - activity1.setUserSize(3);
40   - activity1.setSpuId(2048L);
41   - activity1.setPicUrl("https://static.iocoder.cn/mall/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg");
42   - activity1.setMarketPrice(50);
43   - activity1.setCombinationPrice(100);
44   - activityList.add(activity1);
  53 + List<CombinationActivityDO> list = activityService.getCombinationActivityListByCount(defaultIfNull(count, 6));
  54 + if (CollUtil.isEmpty(list)) {
  55 + return success(CombinationActivityConvert.INSTANCE.convertAppList(list));
  56 + }
45 57  
46   - AppCombinationActivityRespVO activity2 = new AppCombinationActivityRespVO();
47   - activity2.setId(2L);
48   - activity2.setName("双十一拼团");
49   - activity2.setUserSize(5);
50   - activity2.setSpuId(4096L);
51   - activity2.setPicUrl("https://static.iocoder.cn/mall/132.jpeg");
52   - activity2.setMarketPrice(100);
53   - activity2.setCombinationPrice(200);
54   - activityList.add(activity2);
55   -
56   - return success(activityList);
  58 + List<ProductSpuRespDTO> spuList = spuApi.getSpuList(convertList(list, CombinationActivityDO::getSpuId));
  59 + // TODO 芋艿:增加 Spring Cache
  60 + return success(CombinationActivityConvert.INSTANCE.convertAppList(list, spuList));
57 61 }
58 62  
59 63 @GetMapping("/page")
60 64 @Operation(summary = "获得拼团活动分页")
61 65 public CommonResult<PageResult<AppCombinationActivityRespVO>> getCombinationActivityPage(PageParam pageParam) {
62   - List<AppCombinationActivityRespVO> activityList = new ArrayList<>();
63   - AppCombinationActivityRespVO activity1 = new AppCombinationActivityRespVO();
64   - activity1.setId(1L);
65   - activity1.setName("618 大拼团");
66   - activity1.setUserSize(3);
67   - activity1.setSpuId(2048L);
68   - activity1.setPicUrl("商品图片地址");
69   - activity1.setMarketPrice(50);
70   - activity1.setCombinationPrice(100);
71   - activityList.add(activity1);
72   -
73   - AppCombinationActivityRespVO activity2 = new AppCombinationActivityRespVO();
74   - activity2.setId(2L);
75   - activity2.setName("双十一拼团");
76   - activity2.setUserSize(5);
77   - activity2.setSpuId(4096L);
78   - activity2.setPicUrl("商品图片地址");
79   - activity2.setMarketPrice(100);
80   - activity2.setCombinationPrice(200);
81   - activityList.add(activity2);
  66 + PageResult<CombinationActivityDO> result = activityService.getCombinationActivityPage(pageParam);
  67 + if (CollUtil.isEmpty(result.getList())) {
  68 + return success(PageResult.empty(result.getTotal()));
  69 + }
82 70  
83   - return success(new PageResult<>(activityList, 2L));
  71 + List<ProductSpuRespDTO> spuList = spuApi.getSpuList(convertList(result.getList(), CombinationActivityDO::getSpuId));
  72 + return success(CombinationActivityConvert.INSTANCE.convertAppPage(result, spuList));
84 73 }
85 74  
86 75 @GetMapping("/get-detail")
87 76 @Operation(summary = "获得拼团活动明细")
88 77 @Parameter(name = "id", description = "活动编号", required = true, example = "1024")
89 78 public CommonResult<AppCombinationActivityDetailRespVO> getCombinationActivityDetail(@RequestParam("id") Long id) {
90   - // TODO 芋艿:如果禁用的时候,需要抛出异常;
91   - AppCombinationActivityDetailRespVO obj = new AppCombinationActivityDetailRespVO();
92   - // 设置其属性的值
93   - obj.setId(id);
94   - obj.setName("晚九点限时秒杀");
95   - obj.setStatus(1);
96   - obj.setStartTime(LocalDateTime.of(2023, 6, 15, 0, 0, 0));
97   - obj.setEndTime(LocalDateTime.of(2023, 6, 20, 23, 59, 0));
98   - obj.setUserSize(2);
99   - obj.setSuccessCount(100);
100   - obj.setSpuId(633L);
101   - obj.setSingleLimitCount(2);
102   - obj.setTotalLimitCount(3);
  79 + // 1、获取活动
  80 + CombinationActivityDO combinationActivity = activityService.getCombinationActivity(id);
  81 + if (combinationActivity == null) {
  82 + return success(null);
  83 + }
  84 + if (ObjectUtil.equal(combinationActivity.getStatus(), CommonStatusEnum.DISABLE.getStatus())) {
  85 + throw exception(COMBINATION_ACTIVITY_APP_STATUS_DISABLE);
  86 + }
103 87  
104   - // 创建一个Product对象的列表
105   - List<AppCombinationActivityDetailRespVO.Product> productList = new ArrayList<>();
106   - // 创建三个新的Product对象并设置其属性的值
107   - AppCombinationActivityDetailRespVO.Product product1 = new AppCombinationActivityDetailRespVO.Product();
108   - product1.setSkuId(1L);
109   - product1.setCombinationPrice(100);
110   - // 将第一个Product对象添加到列表中
111   - productList.add(product1);
112   - // 创建第二个Product对象并设置其属性的值
113   - AppCombinationActivityDetailRespVO.Product product2 = new AppCombinationActivityDetailRespVO.Product();
114   - product2.setSkuId(2L);
115   - product2.setCombinationPrice(200);
116   - // 将第二个Product对象添加到列表中
117   - productList.add(product2);
118   - // 创建第三个Product对象并设置其属性的值
119   - AppCombinationActivityDetailRespVO.Product product3 = new AppCombinationActivityDetailRespVO.Product();
120   - product3.setSkuId(3L);
121   - product3.setCombinationPrice(300);
122   - // 将第三个Product对象添加到列表中
123   - productList.add(product3);
124   - // 将Product列表设置为对象的属性值
125   - obj.setProducts(productList);
126   - return success(obj);
  88 + // 2、获取活动商品
  89 + List<CombinationProductDO> products = activityService.getCombinationProductsByActivityIds(Arrays.asList(combinationActivity.getId()));
  90 + return success(CombinationActivityConvert.INSTANCE.convert3(combinationActivity, products));
127 91 }
128 92  
129 93 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/vo/activity/AppCombinationActivityRespVO.java
... ... @@ -28,7 +28,6 @@ public class AppCombinationActivityRespVO {
28 28 private Integer marketPrice;
29 29  
30 30 @Schema(description = "拼团金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
31   - // 从拼团商品里取最低价
32 31 private Integer combinationPrice;
33 32  
34 33 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/seckill/AppSeckillActivityController.java
... ... @@ -27,14 +27,12 @@ import org.springframework.web.bind.annotation.RequestParam;
27 27 import org.springframework.web.bind.annotation.RestController;
28 28  
29 29 import javax.annotation.Resource;
30   -import java.util.Arrays;
31 30 import java.util.List;
32 31  
33 32 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
34 33 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
35   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
36   -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.isBetween;
37   -import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.SECKILL_ACTIVITY_FAIL_STATUS_CLOSED;
  34 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  35 +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.SECKILL_ACTIVITY_APP_STATUS_CLOSED;
38 36  
39 37 @Tag(name = "用户 App - 秒杀活动")
40 38 @RestController
... ... @@ -51,26 +49,20 @@ public class AppSeckillActivityController {
51 49 private ProductSpuApi spuApi;
52 50  
53 51 @GetMapping("/get-now")
54   - @Operation(summary = "获得当前秒杀活动") // 提供给首页使用
55   - // TODO 芋艿:需要增加 spring cache
  52 + @Operation(summary = "获得当前秒杀活动", description = "获取当前正在进行的活动,提供给首页使用")
56 53 public CommonResult<AppSeckillActivityNowRespVO> getNowSeckillActivity() {
57 54 // 1. 获取当前时间处在哪个秒杀阶段
58   - // TODO @puhui999:可以考虑在 service 写个方法;这样 controller 不用关注过多逻辑
59   - List<SeckillConfigDO> configList = configService.getSeckillConfigList();
60   - SeckillConfigDO filteredConfig = findFirst(configList, config -> ObjectUtil.equal(config.getStatus(),
61   - CommonStatusEnum.ENABLE.getStatus()) && isBetween(config.getStartTime(), config.getEndTime()));
62   - if (filteredConfig == null) { // 时段不存在直接返回 null
  55 + SeckillConfigDO configList = configService.getSeckillConfigListByStatusOnCurrentTime(CommonStatusEnum.ENABLE.getStatus());
  56 + if (configList == null) { // 时段不存在直接返回 null
63 57 return success(null);
64 58 }
65 59  
66 60 // 2. 查询满足当前阶段的活动
67   - // TODO @puhui999:最好直接返回开启的;不多查询数据
68   - List<SeckillActivityDO> activityList = activityService.getSeckillActivityListByConfigIds(Arrays.asList(filteredConfig.getId()));
69   - List<SeckillActivityDO> filteredList = filterList(activityList, item -> ObjectUtil.equal(item.getStatus(), CommonStatusEnum.ENABLE.getStatus()));
70   -
71   - // 3. 拼接数据
72   - List<ProductSpuRespDTO> spuList = spuApi.getSpuList(convertList(filteredList, SeckillActivityDO::getSpuId));
73   - return success(SeckillActivityConvert.INSTANCE.convert(filteredConfig, filteredList, spuList));
  61 + List<SeckillActivityDO> activityList = activityService.getSeckillActivityListByConfigIdAndStatus(configList.getId(), CommonStatusEnum.ENABLE.getStatus());
  62 + // 3 获取 spu 信息
  63 + List<ProductSpuRespDTO> spuList = spuApi.getSpuList(convertList(activityList, SeckillActivityDO::getSpuId));
  64 + // TODO 芋艿:需要增加 spring cache
  65 + return success(SeckillActivityConvert.INSTANCE.convert(configList, activityList, spuList));
74 66 }
75 67  
76 68 @GetMapping("/page")
... ... @@ -88,12 +80,9 @@ public class AppSeckillActivityController {
88 80 @Operation(summary = "获得秒杀活动明细")
89 81 @Parameter(name = "id", description = "活动编号", required = true, example = "1024")
90 82 public CommonResult<AppSeckillActivityDetailRespVO> getSeckillActivity(@RequestParam("id") Long id) {
91   - // 1、获取当前时间处在哪个秒杀阶段
92   - // TODO puhui999:这里,和 58 行是雷同的
93   - List<SeckillConfigDO> configList = configService.getSeckillConfigList();
94   - SeckillConfigDO filteredConfig = findFirst(configList, config -> ObjectUtil.equal(config.getStatus(),
95   - CommonStatusEnum.ENABLE.getStatus()) && isBetween(config.getStartTime(), config.getEndTime()));
96   - if (filteredConfig == null) { // 时段不存在直接返回 null
  83 + // 1. 获取当前时间处在哪个秒杀阶段
  84 + SeckillConfigDO configList = configService.getSeckillConfigListByStatusOnCurrentTime(CommonStatusEnum.ENABLE.getStatus());
  85 + if (configList == null) { // 时段不存在直接返回 null
97 86 return success(null);
98 87 }
99 88  
... ... @@ -102,14 +91,13 @@ public class AppSeckillActivityController {
102 91 if (seckillActivity == null) {
103 92 return success(null);
104 93 }
105   - // TODO 芋艿:如果禁用的时候,需要抛出异常;
106 94 if (ObjectUtil.equal(seckillActivity.getStatus(), CommonStatusEnum.DISABLE.getStatus())) {
107   - throw exception(SECKILL_ACTIVITY_FAIL_STATUS_CLOSED);
  95 + throw exception(SECKILL_ACTIVITY_APP_STATUS_CLOSED);
108 96 }
109 97  
110 98 // 3. 拼接数据
111 99 List<SeckillProductDO> products = activityService.getSeckillProductListByActivityId(seckillActivity.getId());
112   - return success(SeckillActivityConvert.INSTANCE.convert3(seckillActivity, products, filteredConfig));
  100 + return success(SeckillActivityConvert.INSTANCE.convert3(seckillActivity, products, configList));
113 101 }
114 102  
115 103 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/seckill/AppSeckillConfigController.java
1 1 package cn.iocoder.yudao.module.promotion.controller.app.seckill;
2 2  
3   -import cn.hutool.core.collection.CollectionUtil;
4 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
6 5 import cn.iocoder.yudao.module.promotion.controller.app.seckill.vo.config.AppSeckillConfigRespVO;
7 6 import cn.iocoder.yudao.module.promotion.convert.seckill.seckillconfig.SeckillConfigConvert;
8   -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO;
9 7 import cn.iocoder.yudao.module.promotion.service.seckill.SeckillConfigService;
10 8 import io.swagger.v3.oas.annotations.Operation;
11 9 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -15,7 +13,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
15 13 import org.springframework.web.bind.annotation.RestController;
16 14  
17 15 import javax.annotation.Resource;
18   -import java.util.Collections;
19 16 import java.util.List;
20 17  
21 18 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
... ... @@ -31,13 +28,7 @@ public class AppSeckillConfigController {
31 28 @GetMapping("/list")
32 29 @Operation(summary = "获得秒杀时间段列表")
33 30 public CommonResult<List<AppSeckillConfigRespVO>> getSeckillConfigList() {
34   - List<SeckillConfigDO> list = configService.getSeckillConfigListByStatus(CommonStatusEnum.ENABLE.getStatus());
35   - // TODO @puhui999:如果这种,不用判空也问题不大;
36   - if (CollectionUtil.isEmpty(list)) {
37   - return success(Collections.emptyList());
38   - }
39   -
40   - return success(SeckillConfigConvert.INSTANCE.convertList2(list));
  31 + return success(SeckillConfigConvert.INSTANCE.convertList2(configService.getSeckillConfigListByStatus(CommonStatusEnum.ENABLE.getStatus())));
41 32 }
42 33  
43 34 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityRespVO.java
... ... @@ -25,6 +25,9 @@ public class AppSeckillActivityRespVO {
25 25 // 从 SPU 的 marketPrice 读取
26 26 private Integer marketPrice;
27 27  
  28 + @Schema(description = "秒杀活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  29 + private Integer status;
  30 +
28 31 @Schema(description = "秒杀库存(剩余)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
29 32 private Integer stock;
30 33 @Schema(description = "秒杀库存(总共)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/bargain/BargainActivityConvert.java
... ... @@ -46,9 +46,7 @@ public interface BargainActivityConvert {
46 46 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
47 47 List<BargainActivityRespVO> list = CollectionUtils.convertList(result.getList(), item -> {
48 48 findAndThen(spuMap, item.getSpuId(), spu -> {
49   - // TODO @puhui999:这里可以使用链式哈
50   - item.setPicUrl(spu.getPicUrl());
51   - item.setSpuName(spu.getName());
  49 + item.setPicUrl(spu.getPicUrl()).setSpuName(spu.getName());
52 50 });
53 51 return item;
54 52 });
... ... @@ -76,9 +74,7 @@ public interface BargainActivityConvert {
76 74 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
77 75 List<AppBargainActivityRespVO> list = CollectionUtils.convertList(result.getList(), item -> {
78 76 findAndThen(spuMap, item.getSpuId(), spu -> {
79   - // TODO @puhui999:这里可以使用链式哈
80   - item.setPicUrl(spu.getPicUrl());
81   - item.setMarketPrice(spu.getMarketPrice());
  77 + item.setPicUrl(spu.getPicUrl()).setMarketPrice(spu.getMarketPrice());
82 78 });
83 79 return item;
84 80 });
... ... @@ -93,9 +89,7 @@ public interface BargainActivityConvert {
93 89 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
94 90 return CollectionUtils.convertList(activityList, item -> {
95 91 findAndThen(spuMap, item.getSpuId(), spu -> {
96   - // TODO @puhui999:这里可以使用链式哈
97   - item.setPicUrl(spu.getPicUrl());
98   - item.setMarketPrice(spu.getMarketPrice());
  92 + item.setPicUrl(spu.getPicUrl()).setMarketPrice(spu.getMarketPrice());
99 93 });
100 94 return item;
101 95 });
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/combination/CombinationActivityConvert.java
... ... @@ -13,6 +13,8 @@ import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activit
13 13 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO;
14 14 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.product.CombinationProductBaseVO;
15 15 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.product.CombinationProductRespVO;
  16 +import cn.iocoder.yudao.module.promotion.controller.app.combination.vo.activity.AppCombinationActivityDetailRespVO;
  17 +import cn.iocoder.yudao.module.promotion.controller.app.combination.vo.activity.AppCombinationActivityRespVO;
16 18 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
17 19 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationProductDO;
18 20 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationRecordDO;
... ... @@ -25,6 +27,7 @@ import java.util.List;
25 27 import java.util.Map;
26 28  
27 29 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  30 +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
28 31  
29 32 /**
30 33 * 拼团活动 Convert
... ... @@ -59,8 +62,7 @@ public interface CombinationActivityConvert {
59 62 PageResult<CombinationActivityRespVO> pageResult = convertPage(page);
60 63 pageResult.getList().forEach(item -> {
61 64 MapUtils.findAndThen(spuMap, item.getSpuId(), spu -> {
62   - item.setSpuName(spu.getName());
63   - item.setPicUrl(spu.getPicUrl());
  65 + item.setSpuName(spu.getName()).setPicUrl(spu.getPicUrl());
64 66 });
65 67 item.setProducts(convertList2(productList));
66 68 });
... ... @@ -97,18 +99,53 @@ public interface CombinationActivityConvert {
97 99 default CombinationRecordDO convert(CombinationRecordCreateReqDTO reqDTO,
98 100 CombinationActivityDO activity, MemberUserRespDTO user,
99 101 ProductSpuRespDTO spu, ProductSkuRespDTO sku) {
100   - // TODO @puhui999:搞成链式的 set;这样会更规整一点;
101   - CombinationRecordDO record = convert(reqDTO);
102   - record.setVirtualGroup(false);
103   - record.setExpireTime(record.getStartTime().plusHours(activity.getLimitDuration()));
104   - record.setUserSize(activity.getUserSize());
105   - record.setNickname(user.getNickname());
106   - record.setAvatar(user.getAvatar());
107   - record.setSpuName(spu.getName());
108   - record.setPicUrl(sku.getPicUrl());
109   - return record;
  102 + // TODO @puhui999:订单付款后需要设置开始时间和结束时间;
  103 + return convert(reqDTO)
  104 + .setVirtualGroup(false)
  105 + .setExpireTime(activity.getStartTime().plusHours(activity.getLimitDuration()))
  106 + .setUserSize(activity.getUserSize())
  107 + .setNickname(user.getNickname())
  108 + .setAvatar(user.getAvatar())
  109 + .setSpuName(spu.getName())
  110 + .setPicUrl(sku.getPicUrl());
110 111 }
111 112  
112 113 List<CombinationRecordRespDTO> convert(List<CombinationRecordDO> bean);
113 114  
  115 + List<AppCombinationActivityRespVO> convertAppList(List<CombinationActivityDO> list);
  116 +
  117 + default List<AppCombinationActivityRespVO> convertAppList(List<CombinationActivityDO> list, List<ProductSpuRespDTO> spuList) {
  118 + List<AppCombinationActivityRespVO> activityList = convertAppList(list);
  119 + Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
  120 + return CollectionUtils.convertList(activityList, item -> {
  121 + findAndThen(spuMap, item.getSpuId(), spu -> {
  122 + item.setPicUrl(spu.getPicUrl()).setMarketPrice(spu.getMarketPrice());
  123 + });
  124 + return item;
  125 + });
  126 + }
  127 +
  128 + PageResult<AppCombinationActivityRespVO> convertAppPage(PageResult<CombinationActivityDO> result);
  129 +
  130 + default PageResult<AppCombinationActivityRespVO> convertAppPage(PageResult<CombinationActivityDO> result, List<ProductSpuRespDTO> spuList) {
  131 + PageResult<AppCombinationActivityRespVO> appPage = convertAppPage(result);
  132 + Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
  133 + List<AppCombinationActivityRespVO> list = CollectionUtils.convertList(appPage.getList(), item -> {
  134 + findAndThen(spuMap, item.getSpuId(), spu -> {
  135 + item.setPicUrl(spu.getPicUrl()).setMarketPrice(spu.getMarketPrice());
  136 + });
  137 + return item;
  138 + });
  139 + appPage.setList(list);
  140 + return appPage;
  141 + }
  142 +
  143 + AppCombinationActivityDetailRespVO convert2(CombinationActivityDO combinationActivity);
  144 +
  145 + List<AppCombinationActivityDetailRespVO.Product> convertList1(List<CombinationProductDO> products);
  146 +
  147 + default AppCombinationActivityDetailRespVO convert3(CombinationActivityDO combinationActivity, List<CombinationProductDO> products) {
  148 + return convert2(combinationActivity).setProducts(convertList1(products));
  149 + }
  150 +
114 151 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckillactivity/SeckillActivityConvert.java
1 1 package cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity;
2 2  
  3 +import cn.hutool.core.date.LocalDateTimeUtil;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 6 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
... ... @@ -29,7 +30,6 @@ import java.util.Map;
29 30  
30 31 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
31 32 import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
32   -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime;
33 33  
34 34 /**
35 35 * 秒杀活动 Convert
... ... @@ -98,10 +98,9 @@ public interface SeckillActivityConvert {
98 98 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
99 99 respVO.setActivities(CollectionUtils.convertList(convertList3(activityList), item -> {
100 100 findAndThen(spuMap, item.getSpuId(), spu -> {
101   - // TODO @puhui999:可以尝试链式 set 哈;
102   - item.setPicUrl(spu.getPicUrl());
103   - item.setMarketPrice(spu.getMarketPrice());
104   - item.setUnitName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.PRODUCT_UNIT, spu.getUnit()));
  101 + item.setPicUrl(spu.getPicUrl())
  102 + .setMarketPrice(spu.getMarketPrice())
  103 + .setUnitName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.PRODUCT_UNIT, spu.getUnit()));
105 104 });
106 105 return item;
107 106 }));
... ... @@ -115,10 +114,9 @@ public interface SeckillActivityConvert {
115 114 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
116 115 List<AppSeckillActivityRespVO> list = CollectionUtils.convertList(result.getList(), item -> {
117 116 findAndThen(spuMap, item.getSpuId(), spu -> {
118   - // TODO @puhui999:可以尝试链式 set 哈;
119   - item.setPicUrl(spu.getPicUrl());
120   - item.setMarketPrice(spu.getMarketPrice());
121   - item.setUnitName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.PRODUCT_UNIT, spu.getUnit()));
  117 + item.setPicUrl(spu.getPicUrl())
  118 + .setMarketPrice(spu.getMarketPrice())
  119 + .setUnitName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.PRODUCT_UNIT, spu.getUnit()));
122 120 });
123 121 return item;
124 122 });
... ... @@ -131,12 +129,12 @@ public interface SeckillActivityConvert {
131 129 List<AppSeckillActivityDetailRespVO.Product> convertList1(List<SeckillProductDO> products);
132 130  
133 131 default AppSeckillActivityDetailRespVO convert3(SeckillActivityDO seckillActivity, List<SeckillProductDO> products, SeckillConfigDO filteredConfig) {
134   - AppSeckillActivityDetailRespVO respVO = convert2(seckillActivity);
135   - respVO.setProducts(convertList1(products));
136   - // TODO @puhui999:可以尝试链式 set 哈;
137   - respVO.setStartTime(buildTime(filteredConfig.getStartTime()));
138   - respVO.setEndTime(buildTime(filteredConfig.getEndTime()));
139   - return respVO;
  132 + return convert2(seckillActivity)
  133 + .setProducts(convertList1(products))
  134 + .setStartTime(LocalDateTimeUtil.parse(LocalDateTimeUtil.format(seckillActivity.getStartTime(), "yyyy-MM-dd") + " " + filteredConfig.getStartTime(),
  135 + "yyyy-MM-dd HH:mm:ss")) // 活动开始日期和时段结合
  136 + .setEndTime(LocalDateTimeUtil.parse(LocalDateTimeUtil.format(seckillActivity.getEndTime(), "yyyy-MM-dd") + " " + filteredConfig.getEndTime(),
  137 + "yyyy-MM-dd HH:mm:ss")); // 活动结束日期和时段结合
140 138 }
141 139  
142 140 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/bargain/BargainActivityMapper.java
... ... @@ -45,11 +45,34 @@ public interface BargainActivityMapper extends BaseMapperX&lt;BargainActivityDO&gt; {
45 45 .setSql("stock = stock - " + count));
46 46 }
47 47  
48   - default PageResult<BargainActivityDO> selectAppPage(PageParam pageReqVO, Integer status, LocalDateTime now) {
  48 + /**
  49 + * 查询处在 now 日期时间且是 status 状态的活动分页
  50 + *
  51 + * @param pageReqVO 分页参数
  52 + * @param status 状态
  53 + * @param now 当前日期时间
  54 + * @return 活动分页
  55 + */
  56 + default PageResult<BargainActivityDO> selectPage(PageParam pageReqVO, Integer status, LocalDateTime now) {
49 57 return selectPage(pageReqVO, new LambdaQueryWrapperX<BargainActivityDO>()
50 58 .eq(BargainActivityDO::getStatus, status)
51 59 .le(BargainActivityDO::getStartTime, now)
52 60 .ge(BargainActivityDO::getEndTime, now));
53 61 }
54 62  
  63 + /**
  64 + * 查询处在 now 日期时间且是 status 状态的活动分页
  65 + *
  66 + * @param status 状态
  67 + * @param now 当前日期时间
  68 + * @return 活动分页
  69 + */
  70 + default List<BargainActivityDO> selectList(Integer count, Integer status, LocalDateTime now) {
  71 + return selectList(new LambdaQueryWrapperX<BargainActivityDO>()
  72 + .eq(BargainActivityDO::getStatus, status)
  73 + .le(BargainActivityDO::getStartTime, now)
  74 + .ge(BargainActivityDO::getEndTime, now)
  75 + .last("LIMIT " + count));
  76 + }
  77 +
55 78 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/CombinationActivityMapper.java
1 1 package cn.iocoder.yudao.module.promotion.dal.mysql.combination;
2 2  
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
... ... @@ -28,4 +29,29 @@ public interface CombinationActivityMapper extends BaseMapperX&lt;CombinationActivi
28 29 return selectList(CombinationActivityDO::getStatus, status);
29 30 }
30 31  
  32 + /**
  33 + * 查询 status 状态的活动分页
  34 + *
  35 + * @param pageParam 分页参数
  36 + * @param status 状态
  37 + * @return 活动分页
  38 + */
  39 + default PageResult<CombinationActivityDO> selectPage(PageParam pageParam, Integer status) {
  40 + return selectPage(pageParam, new LambdaQueryWrapperX<CombinationActivityDO>()
  41 + .eq(CombinationActivityDO::getStatus, status));
  42 + }
  43 +
  44 + /**
  45 + * 查询 status 状态的活动分页
  46 + *
  47 + * @param status 状态
  48 + * @param count 限制条数
  49 + * @return 活动分页
  50 + */
  51 + default List<CombinationActivityDO> selectList(Integer status, Integer count) {
  52 + return selectList(new LambdaQueryWrapperX<CombinationActivityDO>()
  53 + .eq(CombinationActivityDO::getStatus, status)
  54 + .last("LIMIT " + count));
  55 + }
  56 +
31 57 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainActivityService.java
... ... @@ -63,22 +63,20 @@ public interface BargainActivityService {
63 63 */
64 64 PageResult<BargainActivityDO> getBargainActivityPage(BargainActivityPageReqVO pageReqVO);
65 65  
66   - // TODO @puhui999:这里可以改成进行中的活动;尽量避免专门为 app 定制,或者类似的名字哈;mapper 那也是
67   -
68 66 /**
69   - * 获取 APP 端活动分页数据
  67 + * 获取正在进行的活动分页数据
70 68 *
71 69 * @param pageReqVO 分页请求
72 70 * @return 砍价活动分页
73 71 */
74   - PageResult<BargainActivityDO> getBargainActivityPageForApp(PageParam pageReqVO);
  72 + PageResult<BargainActivityDO> getBargainActivityPage(PageParam pageReqVO);
75 73  
76 74 /**
77   - * 获取 APP 端活动展示数据
  75 + * 获取正在进行的活动分页数据
78 76 *
79 77 * @param count 需要的数量
80 78 * @return 砍价活动分页
81 79 */
82   - List<BargainActivityDO> getBargainActivityListForApp(Integer count);
  80 + List<BargainActivityDO> getBargainActivityListByCount(Integer count);
83 81  
84 82 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainActivityServiceImpl.java
... ... @@ -114,7 +114,7 @@ public class BargainActivityServiceImpl implements BargainActivityService {
114 114 public void deleteBargainActivity(Long id) {
115 115 // 校验存在
116 116 BargainActivityDO activityDO = validateBargainActivityExists(id);
117   - // 校验状态
  117 + // 校验状态 TODO puhui: 测试完成后需要恢复校验
118 118 //if (ObjectUtil.equal(activityDO.getStatus(), CommonStatusEnum.ENABLE.getStatus())) {
119 119 // throw exception(BARGAIN_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END);
120 120 //}
... ... @@ -142,21 +142,14 @@ public class BargainActivityServiceImpl implements BargainActivityService {
142 142 }
143 143  
144 144 @Override
145   - public PageResult<BargainActivityDO> getBargainActivityPageForApp(PageParam pageReqVO) {
  145 + public PageResult<BargainActivityDO> getBargainActivityPage(PageParam pageReqVO) {
146 146 // 只查询进行中,且在时间范围内的
147   - return bargainActivityMapper.selectAppPage(pageReqVO, CommonStatusEnum.ENABLE.getStatus(), LocalDateTime.now());
  147 + return bargainActivityMapper.selectPage(pageReqVO, CommonStatusEnum.ENABLE.getStatus(), LocalDateTime.now());
148 148 }
149 149  
150 150 @Override
151   - public List<BargainActivityDO> getBargainActivityListForApp(Integer count) {
152   - // TODO @puhui999:这种 default count 的逻辑,可以放到 controller 哈;然后可以使用 ObjectUtils.default 方法
153   - if (count == null) {
154   - count = 6;
155   - }
156   - // TODO @puhui999:这种不要用 page;会浪费一次 count;
157   - PageResult<BargainActivityDO> result = bargainActivityMapper.selectAppPage(new PageParam().setPageSize(count),
158   - CommonStatusEnum.ENABLE.getStatus(), LocalDateTime.now());
159   - return result.getList();
  151 + public List<BargainActivityDO> getBargainActivityListByCount(Integer count) {
  152 + return bargainActivityMapper.selectList(count, CommonStatusEnum.ENABLE.getStatus(), LocalDateTime.now());
160 153 }
161 154  
162 155 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityService.java
1 1 package cn.iocoder.yudao.module.promotion.service.combination;
2 2  
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO;
5 6 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO;
... ... @@ -83,4 +84,20 @@ public interface CombinationActivityService {
83 84 */
84 85 void validateCombination(Long activityId, Long userId, Long skuId, Integer count);
85 86  
  87 + /**
  88 + * 获取正在进行的活动分页数据
  89 + *
  90 + * @param count 需要的数量
  91 + * @return 拼团活动分页
  92 + */
  93 + List<CombinationActivityDO> getCombinationActivityListByCount(Integer count);
  94 +
  95 + /**
  96 + * 获取正在进行的活动分页数据
  97 + *
  98 + * @param pageParam 分页请求
  99 + * @return 拼团活动分页
  100 + */
  101 + PageResult<CombinationActivityDO> getCombinationActivityPage(PageParam pageParam);
  102 +
86 103 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImpl.java
... ... @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.promotion.service.combination;
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.ObjectUtil;
5 5 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
6 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 8 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
8 9 import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
... ... @@ -223,8 +224,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
223 224 throw exception(COMBINATION_ACTIVITY_STATUS_DISABLE);
224 225 }
225 226 // 1.3 校验是否超出单次限购数量
226   - // TODO puhui999:count > activity.getSingleLimitCount() 会更好理解点;
227   - if (activity.getSingleLimitCount() < count) {
  227 + if (count > activity.getSingleLimitCount()) {
228 228 throw exception(COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED);
229 229 }
230 230  
... ... @@ -245,4 +245,14 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
245 245 }
246 246 }
247 247  
  248 + @Override
  249 + public List<CombinationActivityDO> getCombinationActivityListByCount(Integer count) {
  250 + return combinationActivityMapper.selectList(CommonStatusEnum.ENABLE.getStatus(), count);
  251 + }
  252 +
  253 + @Override
  254 + public PageResult<CombinationActivityDO> getCombinationActivityPage(PageParam pageParam) {
  255 + return combinationActivityMapper.selectPage(pageParam, CommonStatusEnum.ENABLE.getStatus());
  256 + }
  257 +
248 258 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/SeckillActivityService.java
... ... @@ -37,11 +37,11 @@ public interface SeckillActivityService {
37 37 /**
38 38 * 更新秒杀库存
39 39 *
40   - * @param activityId 活动编号
  40 + * @param id 活动编号
41 41 * @param skuId sku 编号
42 42 * @param count 数量
43 43 */
44   - void updateSeckillStock(Long activityId, Long skuId, Integer count);
  44 + void updateSeckillStock(Long id, Long skuId, Integer count);
45 45  
46 46 /**
47 47 * 关闭秒杀活动
... ... @@ -98,6 +98,15 @@ public interface SeckillActivityService {
98 98 List<SeckillActivityDO> getSeckillActivityListByConfigIds(Collection<Long> ids);
99 99  
100 100 /**
  101 + * 通过活动时段编号获取指定 status 的秒杀活动
  102 + *
  103 + * @param configId 时段配置编号
  104 + * @param status 状态
  105 + * @return 秒杀活动列表
  106 + */
  107 + List<SeckillActivityDO> getSeckillActivityListByConfigIdAndStatus(Long configId, Integer status);
  108 +
  109 + /**
101 110 * 通过活动时段获取秒杀活动
102 111 *
103 112 * @param pageReqVO 请求
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/SeckillActivityServiceImpl.java
... ... @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.promotion.service.seckill;
3 3 import cn.hutool.core.util.ObjectUtil;
4 4 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
7 6 import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
8 7 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
9 8 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
... ... @@ -31,6 +30,7 @@ import java.util.Map;
31 30 import static cn.hutool.core.collection.CollUtil.isNotEmpty;
32 31 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
33 32 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
  33 +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.isBetween;
34 34 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
35 35 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
36 36 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
... ... @@ -148,16 +148,16 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
148 148  
149 149 @Override
150 150 @Transactional(rollbackFor = Exception.class)
151   - public void updateSeckillStock(Long activityId, Long skuId, Integer count) {
  151 + public void updateSeckillStock(Long id, Long skuId, Integer count) {
152 152 // 1、校验秒杀活动是否存在
153   - SeckillActivityDO seckillActivity = getSeckillActivity(activityId);
  153 + SeckillActivityDO seckillActivity = getSeckillActivity(id);
154 154 // 1.1、校验库存是否充足
155 155 if (seckillActivity.getTotalStock() < count) {
156 156 throw exception(SECKILL_ACTIVITY_UPDATE_STOCK_FAIL);
157 157 }
158 158  
159 159 // 2、获取活动商品
160   - List<SeckillProductDO> products = getSeckillProductListByActivityId(activityId);
  160 + List<SeckillProductDO> products = getSeckillProductListByActivityId(id);
161 161 // 2.1、过滤出购买的商品
162 162 SeckillProductDO product = findFirst(products, item -> ObjectUtil.equal(skuId, item.getSkuId()));
163 163 // 2.2、检查活动商品库存是否充足
... ... @@ -268,8 +268,15 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
268 268  
269 269 @Override
270 270 public List<SeckillActivityDO> getSeckillActivityListByConfigIds(Collection<Long> ids) {
271   - return CollectionUtils.filterList(seckillActivityMapper.selectList(),
272   - item -> CollectionUtils.anyMatch(item.getConfigIds(), ids::contains));
  271 + return filterList(seckillActivityMapper.selectList(),
  272 + item -> anyMatch(item.getConfigIds(), ids::contains));
  273 + }
  274 +
  275 + @Override
  276 + public List<SeckillActivityDO> getSeckillActivityListByConfigIdAndStatus(Long configId, Integer status) {
  277 + return filterList(seckillActivityMapper.selectList(SeckillActivityDO::getStatus, status),
  278 + item -> anyMatch(item.getConfigIds(), id -> ObjectUtil.equal(id, configId)) // 校验时段
  279 + && isBetween(item.getStartTime(), item.getEndTime())); // 追加当前日期是否处在活动日期之间的校验条件
273 280 }
274 281  
275 282 @Override
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/SeckillConfigService.java
... ... @@ -54,6 +54,7 @@ public interface SeckillConfigService {
54 54 */
55 55 List<SeckillConfigDO> getSeckillConfigList();
56 56  
  57 +
57 58 /**
58 59 * 校验秒杀时段是否存在
59 60 *
... ... @@ -85,4 +86,12 @@ public interface SeckillConfigService {
85 86 */
86 87 void updateSeckillConfigStatus(Long id, Integer status);
87 88  
  89 + /**
  90 + * 获取当前日期时间处于的秒杀时段且状态为 status
  91 + *
  92 + * @param status 状态
  93 + * @return 时段
  94 + */
  95 + SeckillConfigDO getSeckillConfigListByStatusOnCurrentTime(Integer status);
  96 +
88 97 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/SeckillConfigServiceImpl.java
... ... @@ -20,6 +20,8 @@ import java.util.Collection;
20 20 import java.util.List;
21 21  
22 22 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  23 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.findFirst;
  24 +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.isBetween;
23 25 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
24 26  
25 27 /**
... ... @@ -68,6 +70,12 @@ public class SeckillConfigServiceImpl implements SeckillConfigService {
68 70 }
69 71  
70 72 @Override
  73 + public SeckillConfigDO getSeckillConfigListByStatusOnCurrentTime(Integer status) {
  74 + return findFirst(seckillConfigMapper.selectList(SeckillConfigDO::getStatus, status),
  75 + config -> isBetween(config.getStartTime(), config.getEndTime()));
  76 + }
  77 +
  78 + @Override
71 79 public void deleteSeckillConfig(Long id) {
72 80 // 校验存在
73 81 validateSeckillConfigExists(id);
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/aftersale/TradeAfterSaleController.java
... ... @@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.trade.convert.aftersale.TradeAfterSaleConvert;
12 12 import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO;
13 13 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
14 14 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
15   -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogRespDTO;
  15 +import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogRespVO;
16 16 import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.service.AfterSaleLogService;
17 17 import cn.iocoder.yudao.module.trade.service.aftersale.TradeAfterSaleService;
18 18 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
... ... @@ -87,13 +87,13 @@ public class TradeAfterSaleController {
87 87 // 拼接数据
88 88 MemberUserRespDTO user = memberUserApi.getUser(afterSale.getUserId());
89 89 // 获取售后日志
90   - List<TradeAfterSaleLogRespDTO> logs = afterSaleLogService.getLog(afterSale.getId());
  90 + List<TradeAfterSaleLogRespVO> logs = afterSaleLogService.getLog(afterSale.getId());
91 91 // TODO 方便测试看效果,review 后移除
92 92 if (logs == null) {
93 93 logs = new ArrayList<>();
94 94 }
95 95 for (int i = 1; i <= 6; i++) {
96   - TradeAfterSaleLogRespDTO respVO = new TradeAfterSaleLogRespDTO();
  96 + TradeAfterSaleLogRespVO respVO = new TradeAfterSaleLogRespVO();
97 97 respVO.setId((long) i);
98 98 respVO.setUserId((long) i);
99 99 respVO.setUserType(i % 2 == 0 ? 2 : 1);
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/aftersale/TradeAfterSaleConvert.java
... ... @@ -6,7 +6,6 @@ import cn.iocoder.yudao.module.pay.api.refund.dto.PayRefundCreateReqDTO;
6 6 import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
7 7 import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.TradeAfterSaleDetailRespVO;
8 8 import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.TradeAfterSaleRespPageItemVO;
9   -import cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.log.TradeAfterSaleLogRespVO;
10 9 import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO;
11 10 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO;
12 11 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderBaseVO;
... ... @@ -16,7 +15,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleDO;
16 15 import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.TradeAfterSaleLogDO;
17 16 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
18 17 import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
19   -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogRespDTO;
  18 +import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogRespVO;
20 19 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
21 20 import org.mapstruct.Mapper;
22 21 import org.mapstruct.Mapping;
... ... @@ -68,10 +67,10 @@ public interface TradeAfterSaleConvert {
68 67  
69 68 PageResult<AppTradeAfterSaleRespVO> convertPage02(PageResult<TradeAfterSaleDO> page);
70 69  
71   - List<TradeAfterSaleLogRespDTO> convertList(List<TradeAfterSaleLogDO> list);
  70 + List<TradeAfterSaleLogRespVO> convertList(List<TradeAfterSaleLogDO> list);
72 71  
73 72 default TradeAfterSaleDetailRespVO convert(TradeAfterSaleDO afterSale, TradeOrderDO order, List<TradeOrderItemDO> orderItems,
74   - MemberUserRespDTO user, List<TradeAfterSaleLogRespDTO> logs) {
  73 + MemberUserRespDTO user, List<TradeAfterSaleLogRespVO> logs) {
75 74 TradeAfterSaleDetailRespVO respVO = convert(afterSale, orderItems);
76 75 // 处理用户信息
77 76 respVO.setUser(convert(user));
... ... @@ -81,7 +80,8 @@ public interface TradeAfterSaleConvert {
81 80 respVO.setLogs(convertList1(logs));
82 81 return respVO;
83 82 }
84   - List<TradeAfterSaleLogRespVO> convertList1(List<TradeAfterSaleLogRespDTO> list);
  83 +
  84 + List<cn.iocoder.yudao.module.trade.controller.admin.aftersale.vo.log.TradeAfterSaleLogRespVO> convertList1(List<TradeAfterSaleLogRespVO> list);
85 85 @Mapping(target = "id", source = "afterSale.id")
86 86 TradeAfterSaleDetailRespVO convert(TradeAfterSaleDO afterSale, List<TradeOrderItemDO> orderItems);
87 87 TradeOrderBaseVO convert(TradeOrderDO order);
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/dto/TradeAfterSaleLogRespDTO.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/dto/TradeAfterSaleLogRespVO.java
... ... @@ -8,7 +8,6 @@ import lombok.NoArgsConstructor;
8 8 import javax.validation.constraints.NotNull;
9 9 import java.time.LocalDateTime;
10 10  
11   -// TODO @puhui999:这个是不是应该搞成 vo 啊?
12 11 /**
13 12 * 贸易售后日志详情 DTO
14 13 *
... ... @@ -17,7 +16,7 @@ import java.time.LocalDateTime;
17 16 @Data
18 17 @NoArgsConstructor
19 18 @AllArgsConstructor
20   -public class TradeAfterSaleLogRespDTO {
  19 +public class TradeAfterSaleLogRespVO {
21 20  
22 21 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20669")
23 22 private Long id;
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/framework/aftersalelog/core/service/AfterSaleLogService.java
... ... @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.trade.framework.aftersalelog.core.service;
2 2  
3 3  
4 4 import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogCreateReqDTO;
5   -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogRespDTO;
  5 +import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogRespVO;
6 6  
7 7 import java.util.List;
8 8  
... ... @@ -29,6 +29,6 @@ public interface AfterSaleLogService {
29 29 * @param afterSaleId 售后编号
30 30 * @return 售后日志
31 31 */
32   - List<TradeAfterSaleLogRespDTO> getLog(Long afterSaleId);
  32 + List<TradeAfterSaleLogRespVO> getLog(Long afterSaleId);
33 33  
34 34 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceImpl.java
... ... @@ -26,7 +26,7 @@ import cn.iocoder.yudao.module.trade.enums.aftersale.TradeAfterSaleWayEnum;
26 26 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
27 27 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
28 28 import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogCreateReqDTO;
29   -import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogRespDTO;
  29 +import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.dto.TradeAfterSaleLogRespVO;
30 30 import cn.iocoder.yudao.module.trade.framework.aftersalelog.core.service.AfterSaleLogService;
31 31 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
32 32 import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService;
... ... @@ -450,7 +450,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
450 450 }
451 451  
452 452 @Override
453   - public List<TradeAfterSaleLogRespDTO> getLog(Long afterSaleId) {
  453 + public List<TradeAfterSaleLogRespVO> getLog(Long afterSaleId) {
454 454 // TODO 不熟悉流程先这么滴
455 455 List<TradeAfterSaleLogDO> saleLogDOs = tradeAfterSaleLogMapper.selectList(TradeAfterSaleLogDO::getAfterSaleId, afterSaleId);
456 456 return TradeAfterSaleConvert.INSTANCE.convertList(saleLogDOs);
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
... ... @@ -541,41 +541,49 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
541 541 tradeOrderMapper.updateById(update);
542 542 // TODO @芋艿:改价时,赠送的积分,要不要做改动???
543 543  
544   - // TODO @puhui999:应该是按照 payPrice 分配;并且要考虑取余问题;payPrice 也要考虑,item 里的
545   - // TODO:先按 adjustPrice 实现,没明白 payPrice 怎么搞哈哈哈
546   - // TODO @puhui999:就是对比新老 adjustPrice 的差值,然后计算补充的 adjustPrice 最终值;另外,可以不用区分 items.size 是不是 > 1 哈;应该是一致的逻辑;分摊的逻辑,有点类似 dividePrice 方法噢;
547 544 // 5、更新 TradeOrderItem
548   - if (items.size() > 1) {
549   - // TradeOrderItemDO 需要做 adjustPrice 的分摊
550   - int price = reqVO.getAdjustPrice() / items.size();
551   - int remainderPrice = reqVO.getAdjustPrice() % items.size();
552   - List<TradeOrderItemDO> orders = new ArrayList<>();
553   - for (int i = 0; i < items.size(); i++) {
554   - // 把平摊后剩余的金额加到第一个订单项
555   - if (remainderPrice != 0 && i == 0) {
556   - orders.add(convertOrderItemPrice(items.get(i), price + remainderPrice));
557   - }
558   - orders.add(convertOrderItemPrice(items.get(i), price));
559   - }
560   - tradeOrderItemMapper.updateBatch(orders);
561   - } else {
562   - TradeOrderItemDO orderItem = items.get(0);
563   - TradeOrderItemDO updateItem = convertOrderItemPrice(orderItem, reqVO.getAdjustPrice());
564   - tradeOrderItemMapper.updateById(updateItem);
  545 + // TradeOrderItemDO 需要做 adjustPrice 的分摊
  546 + List<Integer> dividePrices = dividePrice(items, orderPayPrice);
  547 + List<TradeOrderItemDO> updateItems = new ArrayList<>();
  548 + for (int i = 0; i < items.size(); i++) {
  549 + TradeOrderItemDO item = items.get(i);
  550 + Integer adjustPrice = item.getPrice() - dividePrices.get(i); // 计算调整的金额
  551 + updateItems.add(new TradeOrderItemDO().setId(item.getId()).setAdjustPrice(adjustPrice)
  552 + .setPayPrice(item.getPayPrice() - adjustPrice));
565 553 }
  554 + tradeOrderItemMapper.updateBatch(updateItems);
  555 +
566 556  
567 557 // 6、更新支付订单
568 558 payOrderApi.updatePayOrderPrice(order.getPayOrderId(), update.getPayPrice());
569 559 }
570 560  
571   - private TradeOrderItemDO convertOrderItemPrice(TradeOrderItemDO orderItem, Integer price) {
572   - TradeOrderItemDO newOrderItem = new TradeOrderItemDO();
573   - newOrderItem.setId(orderItem.getId());
574   - newOrderItem.setAdjustPrice(price);
575   - int payPrice = orderItem.getAdjustPrice() != null ? (orderItem.getPayPrice() - orderItem.getAdjustPrice())
576   - + price : orderItem.getPayPrice() + price;
577   - newOrderItem.setPayPrice(payPrice);
578   - return newOrderItem;
  561 + /**
  562 + * 计算订单调价价格分摊
  563 + *
  564 + * @param items 订单项
  565 + * @param orderPayPrice 订单支付金额
  566 + * @return 分摊金额数组,和传入的 orderItems 一一对应
  567 + */
  568 + private List<Integer> dividePrice(List<TradeOrderItemDO> items, Integer orderPayPrice) {
  569 + Integer total = getSumValue(items, TradeOrderItemDO::getPrice, Integer::sum);
  570 + assert total != null;
  571 + // 遍历每一个,进行分摊
  572 + List<Integer> prices = new ArrayList<>(items.size());
  573 + int remainPrice = orderPayPrice;
  574 + for (int i = 0; i < items.size(); i++) {
  575 + TradeOrderItemDO orderItem = items.get(i);
  576 + int partPrice;
  577 + if (i < items.size() - 1) { // 减一的原因,是因为拆分时,如果按照比例,可能会出现.所以最后一个,使用反减
  578 + partPrice = (int) (orderPayPrice * (1.0D * orderItem.getPayPrice() / total));
  579 + remainPrice -= partPrice;
  580 + } else {
  581 + partPrice = remainPrice;
  582 + }
  583 + Assert.isTrue(partPrice >= 0, "分摊金额必须大于等于 0");
  584 + prices.add(partPrice);
  585 + }
  586 + return prices;
579 587 }
580 588  
581 589 @Override
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/TradeBeforeOrderCreateReqBO.java
1 1 package cn.iocoder.yudao.module.trade.service.order.bo;
2 2  
  3 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
3 4 import io.swagger.v3.oas.annotations.media.Schema;
4 5 import lombok.Data;
5 6  
... ... @@ -14,36 +15,73 @@ import javax.validation.constraints.NotNull;
14 15 @Data
15 16 public class TradeBeforeOrderCreateReqBO {
16 17  
17   - // TODO @puhui999:注释也写下哈;bo 还是写注释噢
18   -
  18 + /**
  19 + * 订单类型
  20 + *
  21 + * 枚举 {@link TradeOrderTypeEnum}
  22 + */
19 23 @NotNull(message = "订单类型不能为空")
20 24 private Integer orderType;
21 25  
  26 + /**
  27 + * 用户编号
  28 + *
  29 + * 关联 MemberUserDO 的 id 编号
  30 + */
  31 + @NotNull(message = "用户编号不能为空")
  32 + private Long userId;
  33 +
22 34 // ========== 秒杀活动相关字段 ==========
23 35  
  36 + /**
  37 + *
  38 + */
24 39 @Schema(description = "秒杀活动编号", example = "1024")
25 40 private Long seckillActivityId;
26 41  
27 42 // ========== 拼团活动相关字段 ==========
28 43  
  44 + /**
  45 + * 拼团活动编号
  46 + */
29 47 @Schema(description = "拼团活动编号", example = "1024")
30 48 private Long combinationActivityId;
31 49  
  50 + /**
  51 + * 拼团团长编号
  52 + */
32 53 @Schema(description = "拼团团长编号", example = "2048")
33 54 private Long combinationHeadId;
34 55  
  56 + // ========== 砍价活动相关字段 ==========
  57 +
  58 + /**
  59 + * 砍价活动编号
  60 + */
35 61 @Schema(description = "砍价活动编号", example = "123")
36 62 private Long bargainActivityId;
37 63  
  64 + // ========== 活动购买商品相关字段 ==========
  65 +
  66 + /**
  67 + * 商品 SPU 编号
  68 + *
  69 + * 关联 ProductSkuDO 的 spuId 编号
  70 + */
38 71 @NotNull(message = "SPU 编号不能为空")
39 72 private Long spuId;
40 73  
  74 + /**
  75 + * 商品 SKU 编号
  76 + *
  77 + * 关联 ProductSkuDO 的 id 编号
  78 + */
41 79 @NotNull(message = "SKU 编号活动商品不能为空")
42 80 private Long skuId;
43 81  
44   - @NotNull(message = "用户编号不能为空")
45   - private Long userId;
46   -
  82 + /**
  83 + * 购买的商品数量
  84 + */
47 85 @NotNull(message = "购买数量不能为空")
48 86 private Integer count;
49 87  
... ...