Commit 60171ce7e49d4e836db1a25df6f78f7a1714df11

Authored by 芋道源码
Committed by Gitee
2 parents e4a2c738 5c2723c7

!571 完善订单发货逻辑、重构砍价活动、完善拼团记录创建逻辑

Merge pull request !571 from puhui999/feature/mall_product
Showing 37 changed files with 383 additions and 493 deletions
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/bargain/BargainRecordApi.java
... ... @@ -14,10 +14,19 @@ import javax.validation.Valid;
14 14 public interface BargainRecordApi {
15 15  
16 16 /**
17   - * 创建开团记录
  17 + * 创建砍价记录
18 18 *
19 19 * @param reqDTO 请求 DTO
20 20 */
21 21 void createRecord(@Valid BargainRecordCreateReqDTO reqDTO);
22 22  
  23 + /**
  24 + * 查询砍价是否成功
  25 + *
  26 + * @param userId 用户编号
  27 + * @param orderId 订单编号
  28 + * @return 砍价是否成功
  29 + */
  30 + boolean validateRecordSuccess(Long userId, Long orderId);
  31 +
23 32 }
... ...
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationRecordApi.java
1 1 package cn.iocoder.yudao.module.promotion.api.combination;
2 2  
3 3 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
  4 +import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordRespDTO;
4 5 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUpdateStatusReqDTO;
5 6  
6 7 import javax.validation.Valid;
  8 +import java.util.List;
7 9  
8 10 // TODO @芋艿:后面也再撸撸这几个接口
  11 +
9 12 /**
10 13 * 拼团记录 API 接口
11 14 *
... ... @@ -18,7 +21,7 @@ public interface CombinationRecordApi {
18 21 *
19 22 * @param reqDTO 请求 DTO
20 23 */
21   - void createCombinationRecord(@Valid CombinationRecordCreateReqDTO reqDTO);
  24 + void createRecord(@Valid CombinationRecordCreateReqDTO reqDTO);
22 25  
23 26 /**
24 27 * 查询拼团记录是否成功
... ... @@ -27,7 +30,26 @@ public interface CombinationRecordApi {
27 30 * @param orderId 订单编号
28 31 * @return 拼团是否成功
29 32 */
30   - boolean isCombinationRecordSuccess(Long userId, Long orderId);
  33 + boolean validateRecordSuccess(Long userId, Long orderId);
  34 +
  35 + /**
  36 + * 获取拼团记录
  37 + *
  38 + * @param userId 用户编号
  39 + * @param activityId 活动编号
  40 + * @return 拼团记录列表
  41 + */
  42 + List<CombinationRecordRespDTO> getRecordListByUserIdAndActivityId(Long userId, Long activityId);
  43 +
  44 + /**
  45 + * 验证组合限制数
  46 + * 校验是否满足限购要求
  47 + *
  48 + * @param count 本次购买数量
  49 + * @param sumCount 已购买数量合计
  50 + * @param activityId 活动编号
  51 + */
  52 + void validateCombinationLimitCount(Long activityId, Integer count, Integer sumCount);
31 53  
32 54 // TODO @puhui999:是不是搞成具体的方法,拼团成功,拼团失败,这种方法;
33 55  
... ...
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/dto/CombinationRecordRespDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.api.combination.dto;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import javax.validation.constraints.NotNull;
  6 +
  7 +/**
  8 + * 拼团记录 Response DTO
  9 + *
  10 + * @author HUIHUI
  11 + */
  12 +@Data
  13 +public class CombinationRecordRespDTO {
  14 +
  15 + /**
  16 + * 拼团活动编号
  17 + */
  18 + @NotNull(message = "拼团活动编号不能为空")
  19 + private Long activityId;
  20 + /**
  21 + * spu 编号
  22 + */
  23 + @NotNull(message = "spu 编号不能为空")
  24 + private Long spuId;
  25 + /**
  26 + * sku 编号
  27 + */
  28 + @NotNull(message = "sku 编号不能为空")
  29 + private Long skuId;
  30 + /**
  31 + * 用户编号
  32 + */
  33 + @NotNull(message = "用户编号不能为空")
  34 + private Long userId;
  35 + /**
  36 + * 订单编号
  37 + */
  38 + @NotNull(message = "订单编号不能为空")
  39 + private Long orderId;
  40 + /**
  41 + * 开团状态:正在开团 拼团成功 拼团失败
  42 + */
  43 + @NotNull(message = "开团状态不能为空")
  44 + private Integer status;
  45 +
  46 +}
... ...
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
... ... @@ -64,17 +64,18 @@ public interface ErrorCodeConstants {
64 64 ErrorCode COMBINATION_RECORD_NOT_EXISTS = new ErrorCode(1013010004, "拼团不存在");
65 65 ErrorCode COMBINATION_RECORD_EXISTS = new ErrorCode(1013010005, "拼团失败,已参与过该拼团");
66 66 ErrorCode COMBINATION_RECORD_HEAD_NOT_EXISTS = new ErrorCode(1013010006, "拼团失败,父拼团不存在");
67   - ErrorCode COMBINATION_RECORD_USER_FULL = new ErrorCode(1013010006, "拼团失败,拼团人数已满");
  67 + ErrorCode COMBINATION_RECORD_USER_FULL = new ErrorCode(1013010007, "拼团失败,拼团人数已满");
  68 + ErrorCode COMBINATION_RECORD_FAILED_HAVE_JOINED = new ErrorCode(1013010008, "拼团失败,已参与其它拼团");
  69 + ErrorCode COMBINATION_RECORD_FAILED_TIME_END = new ErrorCode(1013010009, "拼团失败,活动已经结束");
  70 + ErrorCode COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED = new ErrorCode(1013010010, "拼团失败,单次限购超出");
  71 + ErrorCode COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED = new ErrorCode(1013010011, "拼团失败,单次限购超出");
68 72  
69 73 // ========== 砍价活动 1013011000 ==========
70 74 ErrorCode BARGAIN_ACTIVITY_NOT_EXISTS = new ErrorCode(1013011000, "砍价活动不存在");
71 75 ErrorCode BARGAIN_ACTIVITY_SPU_CONFLICTS = new ErrorCode(1013011001, "存在商品参加了其它砍价活动");
72 76 ErrorCode BARGAIN_ACTIVITY_STATUS_DISABLE = new ErrorCode(1013011002, "砍价活动已关闭不能修改");
73 77 ErrorCode BARGAIN_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END = new ErrorCode(1013011003, "砍价活动未关闭或未结束,不能删除");
74   -
75   - // TODO @puhui999:拆分成砍价记录
76   -
77   - ErrorCode BARGAIN_RECORD_NOT_EXISTS = new ErrorCode(1013011004, "砍价不存在");
  78 + ErrorCode BARGAIN_RECORD_NOT_EXISTS = new ErrorCode(1013011004, "砍价记录不存在");
78 79 ErrorCode BARGAIN_RECORD_EXISTS = new ErrorCode(1013011005, "砍价失败,已参与过该砍价");
79 80 ErrorCode BARGAIN_RECORD_HEAD_NOT_EXISTS = new ErrorCode(1013011006, "砍价失败,父砍价不存在");
80 81 ErrorCode BARGAIN_RECORD_USER_FULL = new ErrorCode(1013011007, "砍价失败,砍价人数已满");
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/bargain/BargainRecordApiImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.api.bargain;
  2 +
  3 +import cn.iocoder.yudao.module.promotion.api.bargain.dto.BargainRecordCreateReqDTO;
  4 +import org.springframework.stereotype.Service;
  5 +
  6 +/**
  7 + * 砍价活动 API 实现类 TODO @puhui999
  8 + *
  9 + * @author HUIHUI
  10 + */
  11 +@Service
  12 +public class BargainRecordApiImpl implements BargainRecordApi {
  13 +
  14 + @Override
  15 + public void createRecord(BargainRecordCreateReqDTO reqDTO) {
  16 +
  17 + }
  18 +
  19 + @Override
  20 + public boolean validateRecordSuccess(Long userId, Long orderId) {
  21 + return false;
  22 + }
  23 +
  24 +}
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationRecordApiImpl.java
1 1 package cn.iocoder.yudao.module.promotion.api.combination;
2 2  
3 3 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
  4 +import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordRespDTO;
4 5 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUpdateStatusReqDTO;
  6 +import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert;
5 7 import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;
6 8 import cn.iocoder.yudao.module.promotion.service.combination.CombinationRecordService;
7 9 import org.springframework.stereotype.Service;
8 10  
9 11 import javax.annotation.Resource;
  12 +import java.util.List;
10 13  
11 14 /**
12 15 * 拼团活动 API 实现类
... ... @@ -20,16 +23,26 @@ public class CombinationRecordApiImpl implements CombinationRecordApi {
20 23 private CombinationRecordService recordService;
21 24  
22 25 @Override
23   - public void createCombinationRecord(CombinationRecordCreateReqDTO reqDTO) {
  26 + public void createRecord(CombinationRecordCreateReqDTO reqDTO) {
24 27 recordService.createCombinationRecord(reqDTO);
25 28 }
26 29  
27 30 @Override
28   - public boolean isCombinationRecordSuccess(Long userId, Long orderId) {
  31 + public boolean validateRecordSuccess(Long userId, Long orderId) {
29 32 return CombinationRecordStatusEnum.isSuccess(recordService.getCombinationRecord(userId, orderId).getStatus());
30 33 }
31 34  
32 35 @Override
  36 + public List<CombinationRecordRespDTO> getRecordListByUserIdAndActivityId(Long userId, Long activityId) {
  37 + return CombinationActivityConvert.INSTANCE.convert(recordService.getRecordListByUserIdAndActivityId(userId, activityId));
  38 + }
  39 +
  40 + @Override
  41 + public void validateCombinationLimitCount(Long activityId, Integer count, Integer sumCount) {
  42 + recordService.validateCombinationLimitCount(activityId, count, sumCount);
  43 + }
  44 +
  45 + @Override
33 46 public void updateCombinationRecordStatus(CombinationRecordUpdateStatusReqDTO reqDTO) {
34 47 if (null == reqDTO.getStartTime()) {
35 48 recordService.updateCombinationRecordStatusByUserIdAndOrderId(reqDTO);
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/BargainActivityController.java
... ... @@ -4,14 +4,12 @@ import cn.hutool.core.collection.CollUtil;
4 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 6 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
7   -import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
8   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityCreateReqVO;
9   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityPageReqVO;
10   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityRespVO;
11   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityUpdateReqVO;
  7 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityBaseVO;
  8 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityPageReqVO;
  9 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityRespVO;
  10 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO;
12 11 import cn.iocoder.yudao.module.promotion.convert.bargain.BargainActivityConvert;
13 12 import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
14   -import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainProductDO;
15 13 import cn.iocoder.yudao.module.promotion.service.bargain.BargainActivityService;
16 14 import io.swagger.v3.oas.annotations.Operation;
17 15 import io.swagger.v3.oas.annotations.Parameter;
... ... @@ -22,12 +20,8 @@ import org.springframework.web.bind.annotation.*;
22 20  
23 21 import javax.annotation.Resource;
24 22 import javax.validation.Valid;
25   -import java.util.Collections;
26   -import java.util.List;
27 23  
28   -import static cn.hutool.core.collection.CollectionUtil.newArrayList;
29 24 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
30   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
31 25  
32 26 @Tag(name = "管理后台 - 砍价活动")
33 27 @RestController
... ... @@ -44,7 +38,7 @@ public class BargainActivityController {
44 38 @PostMapping("/create")
45 39 @Operation(summary = "创建砍价活动")
46 40 @PreAuthorize("@ss.hasPermission('promotion:bargain-activity:create')")
47   - public CommonResult<Long> createBargainActivity(@Valid @RequestBody BargainActivityCreateReqVO createReqVO) {
  41 + public CommonResult<Long> createBargainActivity(@Valid @RequestBody BargainActivityBaseVO createReqVO) {
48 42 return success(activityService.createBargainActivity(createReqVO));
49 43 }
50 44  
... ... @@ -70,9 +64,7 @@ public class BargainActivityController {
70 64 @Parameter(name = "id", description = "编号", required = true, example = "1024")
71 65 @PreAuthorize("@ss.hasPermission('promotion:bargain-activity:query')")
72 66 public CommonResult<BargainActivityRespVO> getBargainActivity(@RequestParam("id") Long id) {
73   - BargainActivityDO activity = activityService.getBargainActivity(id);
74   - List<BargainProductDO> products = activityService.getBargainProductsByActivityIds(newArrayList(id));
75   - return success(BargainActivityConvert.INSTANCE.convert(activity, products));
  67 + return success(BargainActivityConvert.INSTANCE.convert(activityService.getBargainActivity(id)));
76 68 }
77 69  
78 70 @GetMapping("/page")
... ... @@ -85,14 +77,7 @@ public class BargainActivityController {
85 77 if (CollUtil.isEmpty(pageResult.getList())) {
86 78 return success(PageResult.empty(pageResult.getTotal()));
87 79 }
88   -
89   - // 拼接数据
90   -// List<BargainProductDO> products = activityService.getBargainProductsByActivityIds(
91   -// convertSet(pageResult.getList(), BargainActivityDO::getId));
92   - List<BargainProductDO> products = Collections.emptyList();
93   - List<ProductSpuRespDTO> spus = productSpuApi.getSpuList(
94   - convertSet(pageResult.getList(), BargainActivityDO::getSpuId));
95   - return success(BargainActivityConvert.INSTANCE.convertPage(pageResult, products, spus));
  80 + return success(BargainActivityConvert.INSTANCE.convertPage(activityService.getBargainActivityPage(pageVO)));
96 81 }
97 82  
98 83 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/activity/BargainActivityBaseVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/BargainActivityBaseVO.java
1   -package cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity;
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
... ... @@ -26,6 +26,22 @@ public class BargainActivityBaseVO {
26 26 @NotNull(message = "砍价商品不能为空")
27 27 private Long spuId;
28 28  
  29 + @Schema(description = "商品 skuId", requiredMode = Schema.RequiredMode.REQUIRED, example = "23")
  30 + @NotNull(message = "商品 skuId 不能为空")
  31 + private Long skuId;
  32 +
  33 + @Schema(description = "砍价起始价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "23")
  34 + @NotNull(message = "砍价起始价格不能为空")
  35 + private Integer bargainFirstPrice;
  36 +
  37 + @Schema(description = "砍价底价", requiredMode = Schema.RequiredMode.REQUIRED, example = "23")
  38 + @NotNull(message = "砍价底价不能为空")
  39 + private Integer bargainPrice;
  40 +
  41 + @Schema(description = "活动库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "23")
  42 + @NotNull(message = "活动库存不能为空")
  43 + private Integer stock;
  44 +
29 45 @Schema(description = "总限购数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "16218")
30 46 @NotNull(message = "总限购数量不能为空")
31 47 private Integer totalLimitCount;
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/activity/BargainActivityPageReqVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/BargainActivityPageReqVO.java
1   -package cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity;
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6 import lombok.EqualsAndHashCode;
7 7 import lombok.ToString;
8   -import org.springframework.format.annotation.DateTimeFormat;
9   -
10   -import java.time.LocalDateTime;
11   -
12   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
13 8  
14 9 @Schema(description = "管理后台 - 砍价活动分页 Request VO")
15 10 @Data
... ... @@ -20,14 +15,6 @@ public class BargainActivityPageReqVO extends PageParam {
20 15 @Schema(description = "砍价名称", example = "赵六")
21 16 private String name;
22 17  
23   - @Schema(description = "开始时间")
24   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
25   - private LocalDateTime[] startTime;
26   -
27   - @Schema(description = "结束时间")
28   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
29   - private LocalDateTime[] endTime;
30   -
31 18 @Schema(description = "活动状态:0开启 1关闭", example = "0")
32 19 private Integer status;
33 20  
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/activity/BargainActivityRespVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/BargainActivityRespVO.java
1   -package cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity;
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo;
2 2  
3   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.product.BargainProductRespVO;
4 3 import io.swagger.v3.oas.annotations.media.Schema;
5 4 import lombok.Data;
6 5 import lombok.EqualsAndHashCode;
... ... @@ -8,8 +7,6 @@ import lombok.ToString;
8 7  
9 8 import javax.validation.constraints.NotNull;
10 9 import java.time.LocalDateTime;
11   -import java.util.List;
12   -
13 10 @Schema(description = "管理后台 - 砍价活动 Response VO")
14 11 @Data
15 12 @EqualsAndHashCode(callSuper = true)
... ... @@ -25,17 +22,14 @@ public class BargainActivityRespVO extends BargainActivityBaseVO {
25 22 @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22901")
26 23 private Long id;
27 24  
28   - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  25 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022-07-01 23:59:59")
29 26 private LocalDateTime createTime;
30 27  
31   - @Schema(description = "砍价成功数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "888")
  28 + @Schema(description = "砍价成功数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "999")
32 29 private Integer successCount;
33 30  
34 31 @Schema(description = "活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
35 32 @NotNull(message = "活动状态不能为空")
36 33 private Integer status;
37 34  
38   - @Schema(description = "砍价商品", requiredMode = Schema.RequiredMode.REQUIRED)
39   - private List<BargainProductRespVO> products;
40   -
41 35 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/activity/BargainActivityUpdateReqVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/BargainActivityUpdateReqVO.java
1   -package cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity;
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo;
2 2  
3   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.product.BargainProductBaseVO;
4 3 import io.swagger.v3.oas.annotations.media.Schema;
5 4 import lombok.Data;
6 5 import lombok.EqualsAndHashCode;
7 6 import lombok.ToString;
8 7  
9   -import javax.validation.Valid;
10 8 import javax.validation.constraints.NotNull;
11   -import java.util.List;
12 9  
13 10 @Schema(description = "管理后台 - 砍价活动更新 Request VO")
14 11 @Data
... ... @@ -20,8 +17,4 @@ public class BargainActivityUpdateReqVO extends BargainActivityBaseVO {
20 17 @NotNull(message = "活动编号不能为空")
21 18 private Long id;
22 19  
23   - @Schema(description = "砍价商品", requiredMode = Schema.RequiredMode.REQUIRED)
24   - @Valid
25   - private List<BargainProductBaseVO> products;
26   -
27 20 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/activity/BargainActivityCreateReqVO.java deleted
1   -package cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity;
2   -
3   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.product.BargainProductBaseVO;
4   -import io.swagger.v3.oas.annotations.media.Schema;
5   -import lombok.Data;
6   -import lombok.EqualsAndHashCode;
7   -import lombok.ToString;
8   -
9   -import javax.validation.Valid;
10   -import java.util.List;
11   -
12   -@Schema(description = "管理后台 - 砍价活动创建 Request VO")
13   -@Data
14   -@EqualsAndHashCode(callSuper = true)
15   -@ToString(callSuper = true)
16   -public class BargainActivityCreateReqVO extends BargainActivityBaseVO {
17   -
18   - @Schema(description = "砍价商品", requiredMode = Schema.RequiredMode.REQUIRED)
19   - @Valid
20   - private List<BargainProductBaseVO> products;
21   -
22   -}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/product/BargainProductBaseVO.java deleted
1   -package cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.product;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -
6   -import javax.validation.constraints.NotNull;
7   -
8   -/**
9   - * 砍价商品 Base VO,提供给添加、修改、详细的子 VO 使用
10   - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
11   - */
12   -@Data
13   -public class BargainProductBaseVO {
14   -
15   - @Schema(description = "商品 spuId", requiredMode = Schema.RequiredMode.REQUIRED, example = "123")
16   - @NotNull(message = "商品 spuId 不能为空")
17   - private Long spuId;
18   -
19   - @Schema(description = "商品 skuId", requiredMode = Schema.RequiredMode.REQUIRED, example = "44")
20   - @NotNull(message = "商品 skuId 不能为空")
21   - private Long skuId;
22   -
23   - @Schema(description = "砍价起始价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "33")
24   - @NotNull(message = "砍价起始价格不能为空")
25   - private Integer bargainFirstPrice;
26   -
27   - @Schema(description = "砍价底价", requiredMode = Schema.RequiredMode.REQUIRED, example = "22")
28   - @NotNull(message = "砍价底价不能为空")
29   - private Integer bargainPrice;
30   -
31   - @Schema(description = "活动库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "11")
32   - @NotNull(message = "活动库存不能为空")
33   - private Integer stock;
34   -
35   -}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/product/BargainProductRespVO.java deleted
1   -package cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.product;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -import lombok.EqualsAndHashCode;
6   -import lombok.ToString;
7   -
8   -import java.time.LocalDateTime;
9   -
10   -@Schema(description = "管理后台 - 砍价商品 Response VO")
11   -@Data
12   -@EqualsAndHashCode(callSuper = true)
13   -@ToString(callSuper = true)
14   -public class BargainProductRespVO extends BargainProductBaseVO {
15   -
16   - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "28322")
17   - private Long id;
18   -
19   - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
20   - private LocalDateTime createTime;
21   -
22   -}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/combination/vo/activity/CombinationActivityPageReqVO.java
... ... @@ -5,11 +5,6 @@ import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6 import lombok.EqualsAndHashCode;
7 7 import lombok.ToString;
8   -import org.springframework.format.annotation.DateTimeFormat;
9   -
10   -import java.time.LocalDateTime;
11   -
12   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
13 8  
14 9 @Schema(description = "管理后台 - 拼团活动分页 Request VO")
15 10 @Data
... ... @@ -20,15 +15,8 @@ public class CombinationActivityPageReqVO extends PageParam {
20 15 @Schema(description = "拼团名称", example = "赵六")
21 16 private String name;
22 17  
23   - @Schema(description = "开始时间")
24   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
25   - private LocalDateTime[] startTime;
26   -
27   - @Schema(description = "结束时间")
28   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
29   - private LocalDateTime[] endTime;
30   -
31 18 @Schema(description = "活动状态:0开启 1关闭", example = "0")
32 19 private Integer status;
33 20  
  21 +
34 22 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/bargain/BargainActivityConvert.java
1 1 package cn.iocoder.yudao.module.promotion.convert.bargain;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5   -import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
6   -import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
7   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityCreateReqVO;
8   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityRespVO;
9   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityUpdateReqVO;
10   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.product.BargainProductBaseVO;
11   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.product.BargainProductRespVO;
  4 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityBaseVO;
  5 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityRespVO;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO;
12 7 import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
13   -import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainProductDO;
14 8 import org.mapstruct.Mapper;
15   -import org.mapstruct.Mapping;
16   -import org.mapstruct.Mappings;
17 9 import org.mapstruct.factory.Mappers;
18 10  
19 11 import java.util.List;
20   -import java.util.Map;
21   -
22   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
23 12  
24 13 /**
25 14 * 拼团活动 Convert
... ... @@ -31,62 +20,14 @@ public interface BargainActivityConvert {
31 20  
32 21 BargainActivityConvert INSTANCE = Mappers.getMapper(BargainActivityConvert.class);
33 22  
34   - BargainActivityDO convert(BargainActivityCreateReqVO bean);
  23 + BargainActivityDO convert(BargainActivityBaseVO bean);
35 24  
36 25 BargainActivityDO convert(BargainActivityUpdateReqVO bean);
37 26  
38 27 BargainActivityRespVO convert(BargainActivityDO bean);
39 28  
40   - BargainProductRespVO convert(BargainProductDO bean);
41   -
42   - default BargainActivityRespVO convert(BargainActivityDO activity,
43   - List<BargainProductDO> products) {
44   - return convert(activity).setProducts(convertList2(products));
45   - }
46   -
47 29 List<BargainActivityRespVO> convertList(List<BargainActivityDO> list);
48 30  
49 31 PageResult<BargainActivityRespVO> convertPage(PageResult<BargainActivityDO> page);
50 32  
51   - default PageResult<BargainActivityRespVO> convertPage(PageResult<BargainActivityDO> page,
52   - List<BargainProductDO> productList,
53   - List<ProductSpuRespDTO> spuList) {
54   - PageResult<BargainActivityRespVO> pageResult = convertPage(page);
55   - // 拼接商品
56   - Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
57   - pageResult.getList().forEach(item -> {
58   - item.setProducts(convertList2(productList));
59   - MapUtils.findAndThen(spuMap, item.getSpuId(),
60   - spu -> item.setSpuName(spu.getName()).setPicUrl(spu.getPicUrl()));
61   - });
62   - return pageResult;
63   - }
64   -
65   - List<BargainProductRespVO> convertList2(List<BargainProductDO> productDOs);
66   -
67   - @Mappings({
68   - @Mapping(target = "id", ignore = true),
69   - @Mapping(target = "activityId", source = "activity.id"),
70   - @Mapping(target = "spuId", source = "activity.spuId"),
71   - @Mapping(target = "skuId", source = "product.skuId"),
72   - @Mapping(target = "bargainFirstPrice", source = "product.bargainFirstPrice"),
73   - @Mapping(target = "bargainPrice", source = "product.bargainPrice"),
74   - @Mapping(target = "stock", source = "product.stock"),
75   - @Mapping(target = "activityStartTime", source = "activity.startTime"),
76   - @Mapping(target = "activityEndTime", source = "activity.endTime")
77   - })
78   - BargainProductDO convert(BargainActivityDO activity, BargainProductBaseVO product);
79   -
80   - default List<BargainProductDO> convertList(List<? extends BargainProductBaseVO> products, BargainActivityDO activityDO) {
81   - return CollectionUtils.convertList(products, item -> convert(activityDO, item).setActivityStatus(activityDO.getStatus()));
82   - }
83   -
84   - default List<BargainProductDO> convertList(List<BargainProductBaseVO> updateProductVOs,
85   - List<BargainProductDO> products, BargainActivityDO activity) {
86   - Map<Long, Long> productMap = convertMap(products, BargainProductDO::getSkuId, BargainProductDO::getId);
87   - return CollectionUtils.convertList(updateProductVOs, updateProductVO -> convert(activity, updateProductVO)
88   - .setId(productMap.get(updateProductVO.getSkuId()))
89   - .setActivityStatus(activity.getStatus()));
90   - }
91   -
92 33 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/combination/CombinationActivityConvert.java
... ... @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 5 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
6 6 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
7 7 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
  8 +import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordRespDTO;
8 9 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO;
9 10 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityRespVO;
10 11 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO;
... ... @@ -41,9 +42,8 @@ public interface CombinationActivityConvert {
41 42  
42 43 CombinationProductRespVO convert(CombinationProductDO bean);
43 44  
44   - default CombinationActivityRespVO convert(CombinationActivityDO activity,
45   - List<CombinationProductDO> products) {
46   - return convert(activity).setProducts(convertList2(products));
  45 + default CombinationActivityRespVO convert(CombinationActivityDO bean, List<CombinationProductDO> productDOs) {
  46 + return convert(bean).setProducts(convertList2(productDOs));
47 47 }
48 48  
49 49 List<CombinationActivityRespVO> convertList(List<CombinationActivityDO> list);
... ... @@ -53,22 +53,20 @@ public interface CombinationActivityConvert {
53 53 default PageResult<CombinationActivityRespVO> convertPage(PageResult<CombinationActivityDO> page,
54 54 List<CombinationProductDO> productList,
55 55 List<ProductSpuRespDTO> spuList) {
56   - PageResult<CombinationActivityRespVO> pageResult = convertPage(page);
57   - // 拼接商品
58 56 Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
  57 + PageResult<CombinationActivityRespVO> pageResult = convertPage(page);
59 58 pageResult.getList().forEach(item -> {
  59 + MapUtils.findAndThen(spuMap, item.getSpuId(), spu -> {
  60 + item.setSpuName(spu.getName());
  61 + item.setPicUrl(spu.getPicUrl());
  62 + });
60 63 item.setProducts(convertList2(productList));
61   - MapUtils.findAndThen(spuMap, item.getSpuId(),
62   - spu -> item.setSpuName(spu.getName()).setPicUrl(spu.getPicUrl()));
63 64 });
64 65 return pageResult;
65 66 }
66 67  
67 68 List<CombinationProductRespVO> convertList2(List<CombinationProductDO> productDOs);
68 69  
69   - default List<CombinationProductDO> convertList(List<? extends CombinationProductBaseVO> products, CombinationActivityDO activityDO) {
70   - return CollectionUtils.convertList(products, item -> convert(activityDO, item).setActivityStatus(activityDO.getStatus()));
71   - }
72 70 @Mappings({
73 71 @Mapping(target = "id", ignore = true),
74 72 @Mapping(target = "activityId", source = "activity.id"),
... ... @@ -80,6 +78,10 @@ public interface CombinationActivityConvert {
80 78 })
81 79 CombinationProductDO convert(CombinationActivityDO activity, CombinationProductBaseVO product);
82 80  
  81 + default List<CombinationProductDO> convertList(List<? extends CombinationProductBaseVO> products, CombinationActivityDO activity) {
  82 + return CollectionUtils.convertList(products, item -> convert(activity, item).setActivityStatus(activity.getStatus()));
  83 + }
  84 +
83 85 default List<CombinationProductDO> convertList(List<CombinationProductBaseVO> updateProductVOs,
84 86 List<CombinationProductDO> products, CombinationActivityDO activity) {
85 87 Map<Long, Long> productMap = convertMap(products, CombinationProductDO::getSkuId, CombinationProductDO::getId);
... ... @@ -90,4 +92,6 @@ public interface CombinationActivityConvert {
90 92  
91 93 CombinationRecordDO convert(CombinationRecordCreateReqDTO reqDTO);
92 94  
  95 + List<CombinationRecordRespDTO> convert(List<CombinationRecordDO> bean);
  96 +
93 97 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckillactivity/SeckillActivityConvert.java
... ... @@ -20,8 +20,6 @@ import org.mapstruct.factory.Mappers;
20 20 import java.util.List;
21 21 import java.util.Map;
22 22  
23   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
24   -
25 23 /**
26 24 * 秒杀活动 Convert
27 25 *
... ... @@ -40,32 +38,28 @@ public interface SeckillActivityConvert {
40 38  
41 39 List<SeckillActivityRespVO> convertList(List<SeckillActivityDO> list);
42 40  
43   - default PageResult<SeckillActivityRespVO> convertPage(PageResult<SeckillActivityDO> page,
44   - List<SeckillProductDO> seckillProducts,
45   - List<ProductSpuRespDTO> spuList) {
  41 + PageResult<SeckillActivityRespVO> convertPage(PageResult<SeckillActivityDO> page);
  42 +
  43 + default PageResult<SeckillActivityRespVO> convertPage(PageResult<SeckillActivityDO> page, List<SeckillProductDO> seckillProducts, List<ProductSpuRespDTO> spuList) {
  44 + Map<Long, ProductSpuRespDTO> spuMap = CollectionUtils.convertMap(spuList, ProductSpuRespDTO::getId);
46 45 PageResult<SeckillActivityRespVO> pageResult = convertPage(page);
47   - // 拼接商品
48   - Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
49 46 pageResult.getList().forEach(item -> {
  47 + MapUtils.findAndThen(spuMap, item.getSpuId(), spu -> {
  48 + item.setSpuName(spu.getName());
  49 + item.setPicUrl(spu.getPicUrl());
  50 + });
  51 +
50 52 item.setProducts(convertList2(seckillProducts));
51   - MapUtils.findAndThen(spuMap, item.getSpuId(),
52   - spu -> item.setSpuName(spu.getName()).setPicUrl(spu.getPicUrl()));
53 53 });
54 54 return pageResult;
55 55 }
56   - PageResult<SeckillActivityRespVO> convertPage(PageResult<SeckillActivityDO> page);
57 56  
58 57 SeckillActivityDetailRespVO convert1(SeckillActivityDO seckillActivity);
59 58  
60   - default SeckillActivityDetailRespVO convert(SeckillActivityDO activity,
61   - List<SeckillProductDO> products) {
62   - return convert1(activity).setProducts(convertList2(products));
  59 + default SeckillActivityDetailRespVO convert(SeckillActivityDO seckillActivity, List<SeckillProductDO> seckillProducts) {
  60 + return convert1(seckillActivity).setProducts(convertList2(seckillProducts));
63 61 }
64   - List<SeckillProductRespVO> convertList2(List<SeckillProductDO> productDOs);
65 62  
66   - default List<SeckillProductDO> convertList(List<? extends SeckillProductBaseVO> products, SeckillActivityDO activityDO) {
67   - return CollectionUtils.convertList(products, item -> convert(activityDO, item).setActivityStatus(activityDO.getStatus()));
68   - }
69 63 @Mappings({
70 64 @Mapping(target = "id", ignore = true),
71 65 @Mapping(target = "activityId", source = "activity.id"),
... ... @@ -79,4 +73,10 @@ public interface SeckillActivityConvert {
79 73 })
80 74 SeckillProductDO convert(SeckillActivityDO activity, SeckillProductBaseVO product);
81 75  
  76 + default List<SeckillProductDO> convertList(List<? extends SeckillProductBaseVO> products, SeckillActivityDO activity) {
  77 + return CollectionUtils.convertList(products, item -> convert(activity, item).setActivityStatus(activity.getStatus()));
  78 + }
  79 +
  80 + List<SeckillProductRespVO> convertList2(List<SeckillProductDO> productDOs);
  81 +
82 82 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/bargain/BargainActivityDO.java
1 1 package cn.iocoder.yudao.module.promotion.dal.dataobject.bargain;
2 2  
3   -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
5 4 import com.baomidou.mybatisplus.annotation.KeySequence;
6 5 import com.baomidou.mybatisplus.annotation.TableId;
... ... @@ -29,6 +28,7 @@ public class BargainActivityDO extends BaseDO {
29 28 */
30 29 @TableId
31 30 private Long id;
  31 +
32 32 /**
33 33 * 砍价活动名称
34 34 */
... ... @@ -38,6 +38,7 @@ public class BargainActivityDO extends BaseDO {
38 38 * 活动开始时间
39 39 */
40 40 private LocalDateTime startTime;
  41 +
41 42 /**
42 43 * 活动结束时间
43 44 */
... ... @@ -45,8 +46,6 @@ public class BargainActivityDO extends BaseDO {
45 46  
46 47 /**
47 48 * 活动状态
48   - *
49   - * 枚举 {@link CommonStatusEnum}
50 49 */
51 50 private Integer status;
52 51  
... ... @@ -55,35 +54,50 @@ public class BargainActivityDO extends BaseDO {
55 54 */
56 55 private Long spuId;
57 56 /**
58   - * 砍价库存
  57 + * 商品 SKU 编号
59 58 */
60   - private Integer stock;
61   -
  59 + private Long skuId;
  60 + /**
  61 + * 砍价起始价格,单位分
  62 + */
  63 + private Integer bargainFirstPrice;
  64 + /**
  65 + * 砍价底价,单位:分
  66 + */
  67 + private Integer bargainPrice;
62 68 /**
63 69 * 达到该人数,才能砍到低价
64 70 */
65 71 private Integer userSize;
  72 +
66 73 /**
67 74 * 最大帮砍次数
68 75 */
69 76 private Integer bargainCount;
  77 +
70 78 /**
71 79 * 总限购数量
72 80 */
73 81 private Integer totalLimitCount;
  82 +
  83 + /**
  84 + * 砍价活动库存
  85 + */
  86 + private Integer stock;
  87 +
74 88 /**
75 89 * 用户每次砍价的最小金额,单位:分
76 90 */
77 91 private Integer randomMinPrice;
  92 +
78 93 /**
79 94 * 用户每次砍价的最大金额,单位:分
80 95 */
81 96 private Integer randomMaxPrice;
  97 +
82 98 /**
83 99 * 砍价成功数量
84 100 */
85 101 private Integer successCount;
86 102  
87   - // TODO @puhui999:把 BargainProductDO 字段融合过来;
88   -
89 103 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/bargain/BargainProductDO.java deleted
1   -package cn.iocoder.yudao.module.promotion.dal.dataobject.bargain;
2   -
3   -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4   -import com.baomidou.mybatisplus.annotation.KeySequence;
5   -import com.baomidou.mybatisplus.annotation.TableId;
6   -import com.baomidou.mybatisplus.annotation.TableName;
7   -import lombok.*;
8   -
9   -import java.time.LocalDateTime;
10   -
11   -/**
12   - * 砍价商品 DO
13   - *
14   - * @author HUIHUI
15   - */
16   -@Deprecated // 应该融合到 BargainActivityDO 表
17   -@TableName("promotion_bargain_product")
18   -@KeySequence("promotion_bargain_product_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
19   -@Data
20   -@EqualsAndHashCode(callSuper = true)
21   -@ToString(callSuper = true)
22   -@Builder
23   -@NoArgsConstructor
24   -@AllArgsConstructor
25   -public class BargainProductDO extends BaseDO {
26   -
27   - /**
28   - * 编号
29   - */
30   - @TableId
31   - private Long id;
32   - /**
33   - * 砍价活动编号
34   - */
35   - private Long activityId;
36   - /**
37   - * 商品 SPU 编号
38   - */
39   - private Long spuId;
40   - /**
41   - * 商品 SKU 编号
42   - */
43   - private Long skuId;
44   - /**
45   - * 砍价商品状态
46   - *
47   - * 关联 {@link BargainActivityDO#getStatus()}
48   - */
49   - private Integer activityStatus;
50   - /**
51   - * 活动开始时间点
52   - */
53   - private LocalDateTime activityStartTime;
54   - /**
55   - * 活动结束时间点
56   - */
57   - private LocalDateTime activityEndTime;
58   - /**
59   - * 砍价起始价格,单位分
60   - */
61   - private Integer bargainFirstPrice;
62   - /**
63   - * 砍价底价,单位:分
64   - */
65   - private Integer bargainPrice;
66   - /**
67   - * 活动库存
68   - */
69   - private Integer stock;
70   -
71   -}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/bargain/BargainActivityMapper.java
... ... @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.promotion.dal.mysql.bargain;
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityPageReqVO;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityPageReqVO;
7 7 import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
8 8 import org.apache.ibatis.annotations.Mapper;
9 9  
... ... @@ -20,6 +20,7 @@ public interface BargainActivityMapper extends BaseMapperX&lt;BargainActivityDO&gt; {
20 20 default PageResult<BargainActivityDO> selectPage(BargainActivityPageReqVO reqVO) {
21 21 return selectPage(reqVO, new LambdaQueryWrapperX<BargainActivityDO>()
22 22 .likeIfPresent(BargainActivityDO::getName, reqVO.getName())
  23 + .eqIfPresent(BargainActivityDO::getStatus, reqVO.getStatus())
23 24 .orderByDesc(BargainActivityDO::getId));
24 25 }
25 26  
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/bargain/BargainProductMapper.java deleted
1   -package cn.iocoder.yudao.module.promotion.dal.mysql.bargain;
2   -
3   -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4   -import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainProductDO;
5   -import org.apache.ibatis.annotations.Mapper;
6   -
7   -import java.util.Collection;
8   -import java.util.List;
9   -
10   -/**
11   - * 砍价商品 Mapper
12   - *
13   - * @author HUIHUI
14   - */
15   -@Mapper
16   -public interface BargainProductMapper extends BaseMapperX<BargainProductDO> {
17   -
18   - default List<BargainProductDO> selectListByActivityIds(Collection<Long> ids) {
19   - return selectList(BargainProductDO::getActivityId, ids);
20   - }
21   -
22   -}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/CombinationActivityMapper.java
... ... @@ -20,8 +20,6 @@ public interface CombinationActivityMapper extends BaseMapperX&lt;CombinationActivi
20 20 default PageResult<CombinationActivityDO> selectPage(CombinationActivityPageReqVO reqVO) {
21 21 return selectPage(reqVO, new LambdaQueryWrapperX<CombinationActivityDO>()
22 22 .likeIfPresent(CombinationActivityDO::getName, reqVO.getName())
23   - .betweenIfPresent(CombinationActivityDO::getStartTime, reqVO.getStartTime())
24   - .betweenIfPresent(CombinationActivityDO::getEndTime, reqVO.getEndTime())
25 23 .eqIfPresent(CombinationActivityDO::getStatus, reqVO.getStatus())
26 24 .orderByDesc(CombinationActivityDO::getId));
27 25 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/combination/CombinationRecordMapper.java
... ... @@ -20,18 +20,20 @@ public interface CombinationRecordMapper extends BaseMapperX&lt;CombinationRecordDO
20 20 CombinationRecordDO::getOrderId, orderId);
21 21 }
22 22  
23   - // TODO @puhui999 selectByUserIdAndActivityId
  23 + default List<CombinationRecordDO> selectListByUserIdAndStatus(Long userId, Integer status) {
  24 + return selectList(new LambdaQueryWrapperX<CombinationRecordDO>()
  25 + .eq(CombinationRecordDO::getUserId, userId)
  26 + .eq(CombinationRecordDO::getStatus, status));
  27 + }
24 28 /**
25 29 * 查询拼团记录
26 30 *
27   - * @param headId 团长编号
28   - * @param activityId 活动编号
  31 + * @param headId 团长编号
29 32 * @return 拼团记录
30 33 */
31   - default CombinationRecordDO selectRecordByHeadId(Long headId, Long activityId, Integer status) {
  34 + default CombinationRecordDO selectOneByHeadId(Long headId, Integer status) {
32 35 return selectOne(new LambdaQueryWrapperX<CombinationRecordDO>()
33   - .eq(CombinationRecordDO::getUserId, headId)
34   - .eq(CombinationRecordDO::getActivityId, activityId)
  36 + .eq(CombinationRecordDO::getId, headId)
35 37 .eq(CombinationRecordDO::getStatus, status));
36 38 }
37 39  
... ... @@ -45,4 +47,16 @@ public interface CombinationRecordMapper extends BaseMapperX&lt;CombinationRecordDO
45 47 return selectList(CombinationRecordDO::getStatus, status);
46 48 }
47 49  
  50 + /**
  51 + * 查询拼团记录
  52 + *
  53 + * @param userId 用户 id
  54 + * @param activityId 活动 id
  55 + * @return 拼团记录
  56 + */
  57 + default List<CombinationRecordDO> selectListByUserIdAndActivityId(Long userId, Long activityId) {
  58 + return selectList(new LambdaQueryWrapperX<CombinationRecordDO>()
  59 + .eq(CombinationRecordDO::getUserId, userId)
  60 + .eq(CombinationRecordDO::getActivityId, activityId));
  61 + }
48 62 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainActivityService.java
1 1 package cn.iocoder.yudao.module.promotion.service.bargain;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityCreateReqVO;
5   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityPageReqVO;
6   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityUpdateReqVO;
  4 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityBaseVO;
  5 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityPageReqVO;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO;
7 7 import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
8   -import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainProductDO;
9 8  
10 9 import javax.validation.Valid;
11   -import java.util.Collection;
12   -import java.util.List;
13 10  
14 11 /**
15 12 * 砍价活动 Service 接口
... ... @@ -24,7 +21,7 @@ public interface BargainActivityService {
24 21 * @param createReqVO 创建信息
25 22 * @return 编号
26 23 */
27   - Long createBargainActivity(@Valid BargainActivityCreateReqVO createReqVO);
  24 + Long createBargainActivity(@Valid BargainActivityBaseVO createReqVO);
28 25  
29 26 /**
30 27 * 更新砍价活动
... ... @@ -56,12 +53,5 @@ public interface BargainActivityService {
56 53 */
57 54 PageResult<BargainActivityDO> getBargainActivityPage(BargainActivityPageReqVO pageReqVO);
58 55  
59   - /**
60   - * 获得砍价活动商品列表
61   - *
62   - * @param activityIds 砍价活动 ids
63   - * @return 砍价活动的商品列表
64   - */
65   - List<BargainProductDO> getBargainProductsByActivityIds(Collection<Long> activityIds);
66 56  
67 57 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainActivityServiceImpl.java
... ... @@ -10,29 +10,25 @@ import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
10 10 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
11 11 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
12 12 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
13   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityCreateReqVO;
14   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityPageReqVO;
15   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityUpdateReqVO;
16   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.product.BargainProductBaseVO;
  13 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityBaseVO;
  14 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityPageReqVO;
  15 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO;
17 16 import cn.iocoder.yudao.module.promotion.convert.bargain.BargainActivityConvert;
18 17 import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
19   -import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainProductDO;
20 18 import cn.iocoder.yudao.module.promotion.dal.mysql.bargain.BargainActivityMapper;
21   -import cn.iocoder.yudao.module.promotion.dal.mysql.bargain.BargainProductMapper;
  19 +import cn.iocoder.yudao.module.promotion.dal.mysql.bargain.BargainRecordMapper;
22 20 import org.springframework.stereotype.Service;
23 21 import org.springframework.transaction.annotation.Transactional;
24 22 import org.springframework.validation.annotation.Validated;
25 23  
26 24 import javax.annotation.Resource;
27   -import java.util.Collection;
28 25 import java.util.List;
29 26  
30 27 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
31 28 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch;
32   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue;
  29 +import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
33 30 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
34 31 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
35   -import static cn.iocoder.yudao.module.promotion.util.PromotionUtils.validateProductSkuAllExists;
36 32  
37 33 /**
38 34 * 砍价活动 Service 实现类
... ... @@ -43,42 +39,43 @@ import static cn.iocoder.yudao.module.promotion.util.PromotionUtils.validateProd
43 39 @Validated
44 40 public class BargainActivityServiceImpl implements BargainActivityService {
45 41  
  42 +
46 43 @Resource
47 44 private BargainActivityMapper bargainActivityMapper;
48 45 @Resource
49   - private BargainProductMapper bargainProductMapper;
50   -
  46 + private BargainRecordMapper recordMapper;
51 47 @Resource
52 48 private ProductSpuApi productSpuApi;
53 49 @Resource
54 50 private ProductSkuApi productSkuApi;
55 51  
  52 + private static void validateSku(Long skuId, List<ProductSkuRespDTO> skus) {
  53 + // 校验商品 sku 是否存在
  54 + if (!CollectionUtils.convertSet(skus, ProductSkuRespDTO::getId).contains(skuId)) {
  55 + throw exception(SKU_NOT_EXISTS);
  56 + }
  57 + }
  58 +
56 59 @Override
57 60 @Transactional(rollbackFor = Exception.class)
58   - public Long createBargainActivity(BargainActivityCreateReqVO createReqVO) {
  61 + public Long createBargainActivity(BargainActivityBaseVO createReqVO) {
59 62 // 校验商品 SPU 是否存在是否参加的别的活动
60   - validateProductBargainConflict(createReqVO.getSpuId(), null);
  63 + validateBargainConflict(createReqVO.getSpuId(), null);
61 64 // 获取所选 spu下的所有 sku
62 65 List<ProductSkuRespDTO> skus = productSkuApi.getSkuListBySpuId(CollectionUtil.newArrayList(createReqVO.getSpuId()));
63   - // 校验商品 sku 是否存在
64   - validateProductSkuAllExists(skus, createReqVO.getProducts(), BargainProductBaseVO::getSkuId);
  66 + validateSku(createReqVO.getSkuId(), skus);
65 67  
66 68 // 插入砍价活动
67   - BargainActivityDO activity = BargainActivityConvert.INSTANCE.convert(createReqVO);
  69 + BargainActivityDO activityDO = BargainActivityConvert.INSTANCE.convert(createReqVO);
68 70 // TODO 营销相关属性初始化 砍价成功更新相关属性
69   - activity.setSuccessCount(0);
70   - // 活动总库存
71   - activity.setStock(getSumValue(createReqVO.getProducts(), BargainProductBaseVO::getStock, Integer::sum));
72   - activity.setStatus(CommonStatusEnum.ENABLE.getStatus());
73   - bargainActivityMapper.insert(activity);
74   - // 插入商品
75   - List<BargainProductDO> productDOs = BargainActivityConvert.INSTANCE.convertList(createReqVO.getProducts(), activity);
76   - bargainProductMapper.insertBatch(productDOs);
  71 + activityDO.setSuccessCount(0);
  72 + activityDO.setStatus(CommonStatusEnum.ENABLE.getStatus());
  73 + bargainActivityMapper.insert(activityDO);
77 74 // 返回
78   - return activity.getId();
  75 + return activityDO.getId();
79 76 }
80 77  
81   - private void validateProductBargainConflict(Long spuId, Long activityId) {
  78 + private void validateBargainConflict(Long spuId, Long activityId) {
82 79 // 校验商品 spu 是否存在
83 80 List<ProductSpuRespDTO> spuList = productSpuApi.getSpuList(CollUtil.newArrayList(spuId));
84 81 if (CollUtil.isEmpty(spuList)) {
... ... @@ -106,52 +103,16 @@ public class BargainActivityServiceImpl implements BargainActivityService {
106 103 throw exception(BARGAIN_ACTIVITY_STATUS_DISABLE);
107 104 }
108 105 // 校验商品冲突
109   - validateProductBargainConflict(updateReqVO.getSpuId(), updateReqVO.getId());
  106 + validateBargainConflict(updateReqVO.getSpuId(), updateReqVO.getId());
110 107 // 获取所选 spu下的所有 sku
111 108 List<ProductSkuRespDTO> skus = productSkuApi.getSkuListBySpuId(CollectionUtil.newArrayList(updateReqVO.getSpuId()));
112 109 // 校验商品 sku 是否存在
113   - validateProductSkuAllExists(skus, updateReqVO.getProducts(), BargainProductBaseVO::getSkuId);
  110 + validateSku(updateReqVO.getSkuId(), skus);
114 111  
115 112 // 更新
116 113 BargainActivityDO updateObj = BargainActivityConvert.INSTANCE.convert(updateReqVO);
117   - // 更新活动库存
118   - updateObj.setStock(getSumValue(updateReqVO.getProducts(), BargainProductBaseVO::getStock, Integer::sum));
119 114 bargainActivityMapper.updateById(updateObj);
120   - // 更新商品
121   - updateBargainProduct(updateObj, updateReqVO.getProducts());
122   - }
123 115  
124   - /**
125   - * 更新砍价商品
126   - *
127   - * @param updateObj 更新的活动
128   - * @param products 商品配置
129   - */
130   - private void updateBargainProduct(BargainActivityDO updateObj, List<BargainProductBaseVO> products) {
131   - // 默认全部新增
132   - List<BargainProductDO> defaultNewList = BargainActivityConvert.INSTANCE.convertList(products, updateObj);
133   - // 数据库中的老数据
134   - List<BargainProductDO> oldList = bargainProductMapper.selectListByActivityIds(CollUtil.newArrayList(updateObj.getId()));
135   - List<List<BargainProductDO>> lists = CollectionUtils.diffList(oldList, defaultNewList, (oldVal, newVal) -> {
136   - boolean same = ObjectUtil.equal(oldVal.getSkuId(), newVal.getSkuId());
137   - if (same) {
138   - newVal.setId(oldVal.getId());
139   - }
140   - return same;
141   - });
142   -
143   - // create
144   - if (CollUtil.isNotEmpty(lists.get(0))) {
145   - bargainProductMapper.insertBatch(lists.get(0));
146   - }
147   - // update
148   - if (CollUtil.isNotEmpty(lists.get(1))) {
149   - bargainProductMapper.updateBatch(lists.get(1));
150   - }
151   - // delete
152   - if (CollUtil.isNotEmpty(lists.get(2))) {
153   - bargainProductMapper.deleteBatchIds(CollectionUtils.convertList(lists.get(2), BargainProductDO::getId));
154   - }
155 116 }
156 117  
157 118 @Override
... ... @@ -178,7 +139,7 @@ public class BargainActivityServiceImpl implements BargainActivityService {
178 139  
179 140 @Override
180 141 public BargainActivityDO getBargainActivity(Long id) {
181   - return bargainActivityMapper.selectById(id);
  142 + return validateBargainActivityExists(id);
182 143 }
183 144  
184 145 @Override
... ... @@ -186,9 +147,4 @@ public class BargainActivityServiceImpl implements BargainActivityService {
186 147 return bargainActivityMapper.selectPage(pageReqVO);
187 148 }
188 149  
189   - @Override
190   - public List<BargainProductDO> getBargainProductsByActivityIds(Collection<Long> activityIds) {
191   - return bargainProductMapper.selectListByActivityIds(activityIds);
192   - }
193   -
194 150 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainRecordService.java
... ... @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.promotion.service.bargain;
2 2  
3 3  
4 4 /**
5   - * 商品活动记录 service
  5 + * 砍价记录 service 接口
6 6 *
7 7 * @author HUIHUI
8 8 */
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainRecordServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.service.bargain;
  2 +
  3 +import org.springframework.stereotype.Service;
  4 +import org.springframework.validation.annotation.Validated;
  5 +
  6 +/**
  7 + * 砍价记录 Service 实现类
  8 + *
  9 + * @author HUIHUI
  10 + */
  11 +@Service
  12 +@Validated
  13 +public class BargainRecordServiceImpl implements BargainRecordService {
  14 +}
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordService.java
... ... @@ -4,6 +4,8 @@ import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCr
4 4 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUpdateStatusReqDTO;
5 5 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationRecordDO;
6 6  
  7 +import java.util.List;
  8 +
7 9 /**
8 10 * 拼团记录 Service 接口
9 11 *
... ... @@ -41,4 +43,23 @@ public interface CombinationRecordService {
41 43 */
42 44 CombinationRecordDO getCombinationRecord(Long userId, Long orderId);
43 45  
  46 + /**
  47 + * 获取拼团记录
  48 + *
  49 + * @param userId 用户 id
  50 + * @param activityId 活动 id
  51 + * @return 拼团记录列表
  52 + */
  53 + List<CombinationRecordDO> getRecordListByUserIdAndActivityId(Long userId, Long activityId);
  54 +
  55 + /**
  56 + * 验证组合限制数
  57 + * 校验是否满足限购要求
  58 + *
  59 + * @param count 本次购买数量
  60 + * @param sumCount 已购买数量合计
  61 + * @param activityId 活动编号
  62 + */
  63 + void validateCombinationLimitCount(Long activityId, Integer count, Integer sumCount);
  64 +
44 65 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java
... ... @@ -14,11 +14,11 @@ import org.springframework.transaction.annotation.Transactional;
14 14 import org.springframework.validation.annotation.Validated;
15 15  
16 16 import javax.annotation.Resource;
  17 +import java.time.LocalDateTime;
17 18 import java.util.List;
18 19  
19 20 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
20 21 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
21   -import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COMBINATION_RECORD_USER_FULL;
22 22  
23 23 // TODO 芋艿:等拼团记录做完,完整 review 下
24 24 /**
... ... @@ -37,6 +37,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
37 37 private CombinationRecordMapper recordMapper;
38 38  
39 39 @Override
  40 + @Transactional(rollbackFor = Exception.class)
40 41 public void updateCombinationRecordStatusByUserIdAndOrderId(CombinationRecordUpdateStatusReqDTO reqDTO) {
41 42 // 校验拼团是否存在
42 43 CombinationRecordDO recordDO = validateCombinationRecord(reqDTO.getUserId(), reqDTO.getOrderId());
... ... @@ -80,6 +81,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
80 81 }
81 82  
82 83 @Override
  84 + @Transactional(rollbackFor = Exception.class)
83 85 public void createCombinationRecord(CombinationRecordCreateReqDTO reqDTO) {
84 86 // 1.1 校验拼团活动
85 87 CombinationActivityDO activity = combinationActivityService.validateCombinationActivityExists(reqDTO.getActivityId());
... ... @@ -88,9 +90,19 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
88 90 if (recordDO != null) {
89 91 throw exception(COMBINATION_RECORD_EXISTS);
90 92 }
91   - // 1.3 父拼团是否存在,是否已经满了
  93 + // 1.3 校验用户是否参加了其它拼团
  94 + List<CombinationRecordDO> recordDOList = recordMapper.selectListByUserIdAndStatus(reqDTO.getUserId(), CombinationRecordStatusEnum.IN_PROGRESS.getStatus());
  95 + if (CollUtil.isNotEmpty(recordDOList)) {
  96 + throw exception(COMBINATION_RECORD_FAILED_HAVE_JOINED);
  97 + }
  98 + // 1.4 校验当前活动是否过期
  99 + if (LocalDateTime.now().isAfter(activity.getEndTime())) {
  100 + throw exception(COMBINATION_RECORD_FAILED_TIME_END);
  101 + }
  102 + // 1.5 父拼团是否存在,是否已经满了
92 103 if (reqDTO.getHeadId() != null) {
93   - CombinationRecordDO recordDO1 = recordMapper.selectRecordByHeadId(reqDTO.getHeadId(), reqDTO.getActivityId(), CombinationRecordStatusEnum.IN_PROGRESS.getStatus());
  104 + // 查询进行中的父拼团
  105 + CombinationRecordDO recordDO1 = recordMapper.selectOneByHeadId(reqDTO.getHeadId(), CombinationRecordStatusEnum.IN_PROGRESS.getStatus());
94 106 if (recordDO1 == null) {
95 107 throw exception(COMBINATION_RECORD_HEAD_NOT_EXISTS);
96 108 }
... ... @@ -99,7 +111,6 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
99 111 throw exception(COMBINATION_RECORD_USER_FULL);
100 112 }
101 113 }
102   - // TODO @puhui999:应该还有一些校验,后续补噶;例如说,一个团,自己已经参与进去了,不能再参与进去;
103 114  
104 115 // 2. 创建拼团记录
105 116 CombinationRecordDO record = CombinationActivityConvert.INSTANCE.convert(reqDTO);
... ... @@ -115,6 +126,25 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
115 126 return validateCombinationRecord(userId, orderId);
116 127 }
117 128  
  129 + @Override
  130 + public List<CombinationRecordDO> getRecordListByUserIdAndActivityId(Long userId, Long activityId) {
  131 + return recordMapper.selectListByUserIdAndActivityId(userId, activityId);
  132 + }
  133 +
  134 + @Override
  135 + public void validateCombinationLimitCount(Long activityId, Integer count, Integer sumCount) {
  136 + // 1.1 校验拼团活动
  137 + CombinationActivityDO activity = combinationActivityService.validateCombinationActivityExists(activityId);
  138 + // 校验是否达到限购总限购标准
  139 + if ((sumCount + count) > activity.getTotalLimitCount()) {
  140 + throw exception(COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED);
  141 + }
  142 + // 单次购买是否达到限购标准
  143 + if (count > activity.getSingleLimitCount()) {
  144 + throw exception(COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED);
  145 + }
  146 + }
  147 +
118 148 /**
119 149 * APP 端获取开团记录
120 150 *
... ...
yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImplTest.java
... ... @@ -13,7 +13,6 @@ import org.springframework.context.annotation.Import;
13 13  
14 14 import javax.annotation.Resource;
15 15  
16   -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
17 16 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
18 17 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
19 18 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
... ... @@ -152,8 +151,6 @@ public class CombinationActivityServiceImplTest extends BaseDbUnitTest {
152 151 // 准备参数
153 152 CombinationActivityPageReqVO reqVO = new CombinationActivityPageReqVO();
154 153 reqVO.setName(null);
155   - reqVO.setStartTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
156   - reqVO.setEndTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
157 154 reqVO.setStatus(null);
158 155  
159 156 // 调用
... ...
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/ErrorCodeConstants.java
... ... @@ -31,10 +31,7 @@ public interface ErrorCodeConstants {
31 31 ErrorCode ORDER_COMMENT_STATUS_NOT_FALSE = new ErrorCode(1011000020, "创建交易订单项的评价失败,订单已评价");
32 32 ErrorCode ORDER_DELIVERY_FAIL_REFUND_STATUS_NOT_NONE = new ErrorCode(1011000021, "交易订单发货失败,订单已退款或部分退款");
33 33 ErrorCode ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS = new ErrorCode(1011000022, "交易订单发货失败,拼团未成功");
34   - // TODO 已移除订单单独发货
35   - ErrorCode ORDER_DELIVERY_FAILED_ITEMS_NOT_EMPTY = new ErrorCode(1011000023, "订单发货失败,请选择发货商品");
36   - ErrorCode ORDER_DELIVERY_FAILED_ITEM_NOT_EXISTS = new ErrorCode(1011000024, "订单发货失败,所选发货商品不存在");
37   - ErrorCode ORDER_DELIVERY_FAILED_ITEM_ALREADY_DELIVERY = new ErrorCode(1011000025, "订单发货失败,所选商品已发货");
  34 + ErrorCode ORDER_DELIVERY_FAIL_BARGAIN_RECORD_STATUS_NOT_SUCCESS = new ErrorCode(1011000023, "交易订单发货失败,砍价未成功");
38 35  
39 36 // ========== After Sale 模块 1011000100 ==========
40 37 ErrorCode AFTER_SALE_NOT_FOUND = new ErrorCode(1011000100, "售后单不存在");
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/order/vo/TradeOrderDeliveryReqVO.java
... ... @@ -29,7 +29,5 @@ public class TradeOrderDeliveryReqVO {
29 29 @NotEmpty(message = "发货物流单号不能为空")
30 30 private String logisticsNo;
31 31  
32   - // =============== 同城配送 ================
33   - // TODO
34 32  
35 33 }
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java
... ... @@ -149,9 +149,8 @@ public class AppTradeOrderController {
149 149 @PutMapping("/receive")
150 150 @Operation(summary = "确认交易订单收货")
151 151 @Parameter(name = "id", description = "交易订单编号")
152   - public CommonResult<Boolean> receiveOrder(@RequestParam("id") Long id) {
153   - tradeOrderService.receiveOrder(getLoginUserId(), id);
154   - return success(true);
  152 + public CommonResult<Boolean> takeOrder(@RequestParam("id") Long id) {
  153 + return success(tradeOrderService.receiveOrder(getLoginUserId(), id));
155 154 }
156 155  
157 156 @DeleteMapping("/cancel")
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderItemMapper.java
... ... @@ -25,6 +25,12 @@ public interface TradeOrderItemMapper extends BaseMapperX&lt;TradeOrderItemDO&gt; {
25 25 return selectList(TradeOrderItemDO::getOrderId, orderIds);
26 26 }
27 27  
  28 + default List<TradeOrderItemDO> selectListByOrderIdAnSkuId(Collection<Long> orderIds, Collection<Long> skuIds) {
  29 + return selectList(new LambdaQueryWrapperX<TradeOrderItemDO>()
  30 + .in(TradeOrderItemDO::getOrderId, orderIds)
  31 + .eq(TradeOrderItemDO::getSkuId, skuIds));
  32 + }
  33 +
28 34 default TradeOrderItemDO selectOrderItemByIdAndUserId(Long orderItemId, Long loginUserId) {
29 35 return selectOne(new LambdaQueryWrapperX<TradeOrderItemDO>()
30 36 .eq(TradeOrderItemDO::getId, orderItemId)
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderService.java
... ... @@ -65,9 +65,10 @@ public interface TradeOrderService {
65 65 * 【会员】收货交易订单
66 66 *
67 67 * @param userId 用户编号
68   - * @param id 订单编号
  68 + * @param id 订单编号
  69 + * @return 成功/失败
69 70 */
70   - void receiveOrder(Long userId, Long id);
  71 + Boolean receiveOrder(Long userId, Long id);
71 72  
72 73 /**
73 74 * 获得指定编号的交易订单
... ...
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java
... ... @@ -9,6 +9,7 @@ import cn.iocoder.yudao.framework.common.core.KeyValue;
9 9 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
10 10 import cn.iocoder.yudao.framework.common.enums.TerminalEnum;
11 11 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  12 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
12 13 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
13 14 import cn.iocoder.yudao.module.member.api.address.AddressApi;
14 15 import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO;
... ... @@ -22,7 +23,9 @@ import cn.iocoder.yudao.module.product.api.comment.ProductCommentApi;
22 23 import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO;
23 24 import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
24 25 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO;
  26 +import cn.iocoder.yudao.module.promotion.api.bargain.BargainRecordApi;
25 27 import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi;
  28 +import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordRespDTO;
26 29 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUpdateStatusReqDTO;
27 30 import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi;
28 31 import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO;
... ... @@ -108,6 +111,9 @@ public class TradeOrderServiceImpl implements TradeOrderService {
108 111 @Resource
109 112 private CombinationRecordApi combinationRecordApi;
110 113  
  114 + @Resource
  115 + private BargainRecordApi bargainRecordApi;
  116 +
111 117 // =================== Order ===================
112 118  
113 119 @Override
... ... @@ -173,8 +179,18 @@ public class TradeOrderServiceImpl implements TradeOrderService {
173 179 // 拼团
174 180 if (Objects.equals(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) {
175 181 MemberUserRespDTO user = memberUserApi.getUser(userId);
  182 + List<CombinationRecordRespDTO> recordRespDTOS = combinationRecordApi.getRecordListByUserIdAndActivityId(userId, createReqVO.getCombinationActivityId());
176 183 // TODO 拼团一次应该只能选择一种规格的商品
177   - combinationRecordApi.createCombinationRecord(TradeOrderConvert.INSTANCE.convert(order, orderItems.get(0), createReqVO, user));
  184 + TradeOrderItemDO orderItemDO = orderItems.get(0);
  185 + if (CollUtil.isNotEmpty(recordRespDTOS)) {
  186 + List<Long> skuIds = convertList(recordRespDTOS, CombinationRecordRespDTO::getSkuId, item -> ObjectUtil.equals(item.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus()));
  187 + List<TradeOrderItemDO> tradeOrderItemDOS = tradeOrderItemMapper.selectListByOrderIdAnSkuId(convertList(recordRespDTOS,
  188 + CombinationRecordRespDTO::getOrderId, item -> ObjectUtil.equals(item.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus())), skuIds);
  189 + combinationRecordApi.validateCombinationLimitCount(createReqVO.getCombinationActivityId(),
  190 + CollectionUtils.getSumValue(tradeOrderItemDOS, TradeOrderItemDO::getCount, Integer::sum), orderItemDO.getCount());
  191 + }
  192 +
  193 + combinationRecordApi.createRecord(TradeOrderConvert.INSTANCE.convert(order, orderItemDO, createReqVO, user));
178 194 }
179 195 // TODO 秒杀扣减库存是下单就扣除还是等待订单支付成功再扣除
180 196 if (Objects.equals(TradeOrderTypeEnum.SECKILL.getType(), order.getType())) {
... ... @@ -382,33 +398,23 @@ public class TradeOrderServiceImpl implements TradeOrderService {
382 398 public void deliveryOrder(Long userId, TradeOrderDeliveryReqVO deliveryReqVO) {
383 399 // 1.1 校验并获得交易订单(可发货)
384 400 TradeOrderDO order = validateOrderDeliverable(deliveryReqVO.getId());
385   -
386   - /* TODO
387   - * fix: 首先需要店铺设置配送方式如: 自提 、配送、物流-配送、物流-配送-自提、商家配送
388   - * 1.如果店铺有设置配送方式用户只填写收货地址的情况下店家后台自己选择配送方式
389   - * 2.如果店铺只支持到店自提那么下单后默认发货不需要物流
390   - * 3.如果店铺支持 物流-配送-自提 的情况下后台不需要选择配送方式按前端用户选择的配送方式发货即可
391   - */
392 401 TradeOrderDO updateOrderObj = new TradeOrderDO();
393 402 // 判断发货类型
394 403 // 2.1 快递发货
395 404 if (Objects.equals(deliveryReqVO.getType(), DeliveryTypeEnum.EXPRESS.getMode())) {
396 405 // 校验快递公司
397   - validateDeliveryExpress(deliveryReqVO);
398   - updateOrderObj.setLogisticsId(deliveryReqVO.getLogisticsId()).setLogisticsNo(deliveryReqVO.getLogisticsNo());
399   - }
400   - // 2.2 用户自提
401   - if (Objects.equals(deliveryReqVO.getType(), DeliveryTypeEnum.PICK_UP.getMode())) {
402   - // TODO 校验自提门店是否存在
403   - // 重置一下确保快递公司和快递单号为空
404   - updateOrderObj.setLogisticsId(null).setLogisticsNo("");
  406 + DeliveryExpressDO deliveryExpress = deliveryExpressService.getDeliveryExpress(deliveryReqVO.getLogisticsId());
  407 + if (deliveryExpress == null) {
  408 + throw exception(EXPRESS_NOT_EXISTS);
  409 + }
  410 + if (deliveryExpress.getStatus().equals(CommonStatusEnum.DISABLE.getStatus())) {
  411 + throw exception(EXPRESS_STATUS_NOT_ENABLE);
  412 + }
  413 + updateOrderObj.setLogisticsId(deliveryReqVO.getLogisticsId()).setLogisticsNo(deliveryReqVO.getLogisticsNo()).setDeliveryType(DeliveryTypeEnum.EXPRESS.getMode());
405 414 }
406   - // 2.3 TODO 芋艿:如果无需发货,需要怎么存储?回复:需要把 deliverType 设置为 DeliveryTypeEnum.NULL
  415 + // 2.2 无需发货
407 416 if (Objects.equals(deliveryReqVO.getType(), DeliveryTypeEnum.NULL.getMode())) {
408   - // TODO 情况一:正常走发货逻辑和用户自提有点像 不同点:不需要自提门店只需要用户确认收货
409   - // TODO 情况二:用户下单付款后直接确认收货或等待用户确认收货
410   - // 重置一下确保快递公司和快递单号为空
411   - updateOrderObj.setLogisticsId(null).setLogisticsNo("");
  417 + updateOrderObj.setLogisticsId(null).setLogisticsNo("").setDeliveryType(DeliveryTypeEnum.NULL.getMode());
412 418 }
413 419  
414 420 // 更新 TradeOrderDO 状态为已发货,等待收货
... ... @@ -427,16 +433,6 @@ public class TradeOrderServiceImpl implements TradeOrderService {
427 433 // TODO 设计:lili:是不是发货后,才支持售后?
428 434 }
429 435  
430   - private void validateDeliveryExpress(TradeOrderDeliveryReqVO deliveryReqVO) {
431   - DeliveryExpressDO deliveryExpress = deliveryExpressService.getDeliveryExpress(deliveryReqVO.getLogisticsId());
432   - if (deliveryExpress == null) {
433   - throw exception(EXPRESS_NOT_EXISTS);
434   - }
435   - if (deliveryExpress.getStatus().equals(CommonStatusEnum.DISABLE.getStatus())) {
436   - throw exception(EXPRESS_STATUS_NOT_ENABLE);
437   - }
438   - }
439   -
440 436 /**
441 437 * 校验交易订单满足被发货的条件
442 438 *
... ... @@ -462,17 +458,23 @@ public class TradeOrderServiceImpl implements TradeOrderService {
462 458 // 订单类型:拼团
463 459 if (Objects.equals(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) {
464 460 // 校验订单拼团是否成功
465   - if (combinationRecordApi.isCombinationRecordSuccess(order.getUserId(), order.getId())) {
  461 + if (combinationRecordApi.validateRecordSuccess(order.getUserId(), order.getId())) {
466 462 throw exception(ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS);
467 463 }
468 464 }
469   - // TODO puhui999: 校验订单砍价是否成功
  465 + // 订单类类型:砍价
  466 + if (Objects.equals(TradeOrderTypeEnum.BARGAIN.getType(), order.getType())) {
  467 + // 校验订单砍价是否成功
  468 + if (bargainRecordApi.validateRecordSuccess(order.getUserId(), order.getId())) {
  469 + throw exception(ORDER_DELIVERY_FAIL_BARGAIN_RECORD_STATUS_NOT_SUCCESS);
  470 + }
  471 + }
470 472 return order;
471 473 }
472 474  
473 475 @Override
474 476 @Transactional(rollbackFor = Exception.class)
475   - public void receiveOrder(Long userId, Long id) {
  477 + public Boolean receiveOrder(Long userId, Long id) {
476 478 // 校验并获得交易订单(可收货)
477 479 TradeOrderDO order = validateOrderReceivable(userId, id);
478 480  
... ... @@ -487,6 +489,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
487 489 // TODO 芋艿:lili 发送订单变化的消息
488 490  
489 491 // TODO 芋艿:lili 发送商品被购买完成的数据
  492 + return Boolean.TRUE;
490 493 }
491 494  
492 495 /**
... ...