Commit 651725e3e80e8fc352b8c9e51edec4c99e020adf

Authored by puhui999
1 parent be2ee905

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

Showing 36 changed files with 305 additions and 553 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
... ... @@ -67,17 +67,18 @@ public interface ErrorCodeConstants {
67 67 ErrorCode COMBINATION_RECORD_NOT_EXISTS = new ErrorCode(1013010004, "拼团不存在");
68 68 ErrorCode COMBINATION_RECORD_EXISTS = new ErrorCode(1013010005, "拼团失败,已参与过该拼团");
69 69 ErrorCode COMBINATION_RECORD_HEAD_NOT_EXISTS = new ErrorCode(1013010006, "拼团失败,父拼团不存在");
70   - ErrorCode COMBINATION_RECORD_USER_FULL = new ErrorCode(1013010006, "拼团失败,拼团人数已满");
  70 + ErrorCode COMBINATION_RECORD_USER_FULL = new ErrorCode(1013010007, "拼团失败,拼团人数已满");
  71 + ErrorCode COMBINATION_RECORD_FAILED_HAVE_JOINED = new ErrorCode(1013010008, "拼团失败,已参与其它拼团");
  72 + ErrorCode COMBINATION_RECORD_FAILED_TIME_END = new ErrorCode(1013010009, "拼团失败,活动已经结束");
  73 + ErrorCode COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED = new ErrorCode(1013010010, "拼团失败,单次限购超出");
  74 + ErrorCode COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED = new ErrorCode(1013010011, "拼团失败,单次限购超出");
71 75  
72 76 // ========== 砍价活动 1013011000 ==========
73 77 ErrorCode BARGAIN_ACTIVITY_NOT_EXISTS = new ErrorCode(1013011000, "砍价活动不存在");
74 78 ErrorCode BARGAIN_ACTIVITY_SPU_CONFLICTS = new ErrorCode(1013011001, "存在商品参加了其它砍价活动");
75 79 ErrorCode BARGAIN_ACTIVITY_STATUS_DISABLE = new ErrorCode(1013011002, "砍价活动已关闭不能修改");
76 80 ErrorCode BARGAIN_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END = new ErrorCode(1013011003, "砍价活动未关闭或未结束,不能删除");
77   -
78   - // TODO @puhui999:拆分成砍价记录
79   -
80   - ErrorCode BARGAIN_RECORD_NOT_EXISTS = new ErrorCode(1013011004, "砍价不存在");
  81 + ErrorCode BARGAIN_RECORD_NOT_EXISTS = new ErrorCode(1013011004, "砍价记录不存在");
81 82 ErrorCode BARGAIN_RECORD_EXISTS = new ErrorCode(1013011005, "砍价失败,已参与过该砍价");
82 83 ErrorCode BARGAIN_RECORD_HEAD_NOT_EXISTS = new ErrorCode(1013011006, "砍价失败,父砍价不存在");
83 84 ErrorCode BARGAIN_RECORD_USER_FULL = new ErrorCode(1013011007, "砍价失败,砍价人数已满");
... ...
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
... ... @@ -3,13 +3,11 @@ package cn.iocoder.yudao.module.promotion.controller.admin.bargain;
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 5 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
6   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityCreateReqVO;
7   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityPageReqVO;
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;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityCreateReqVO;
  7 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityPageReqVO;
  8 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityRespVO;
  9 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO;
10 10 import cn.iocoder.yudao.module.promotion.convert.bargain.BargainActivityConvert;
11   -import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
12   -import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainProductDO;
13 11 import cn.iocoder.yudao.module.promotion.service.bargain.BargainActivityService;
14 12 import io.swagger.v3.oas.annotations.Operation;
15 13 import io.swagger.v3.oas.annotations.Parameter;
... ... @@ -20,12 +18,8 @@ import org.springframework.web.bind.annotation.*;
20 18  
21 19 import javax.annotation.Resource;
22 20 import javax.validation.Valid;
23   -import java.util.List;
24   -import java.util.Set;
25 21  
26   -import static cn.hutool.core.collection.CollectionUtil.newArrayList;
27 22 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
28   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
29 23  
30 24 @Tag(name = "管理后台 - 砍价活动")
31 25 @RestController
... ... @@ -68,9 +62,7 @@ public class BargainActivityController {
68 62 @Parameter(name = "id", description = "编号", required = true, example = "1024")
69 63 @PreAuthorize("@ss.hasPermission('promotion:bargain-activity:query')")
70 64 public CommonResult<BargainActivityRespVO> getBargainActivity(@RequestParam("id") Long id) {
71   - BargainActivityDO activity = activityService.getBargainActivity(id);
72   - List<BargainProductDO> products = activityService.getBargainProductsByActivityIds(newArrayList(id));
73   - return success(BargainActivityConvert.INSTANCE.convert(activity, products));
  65 + return success(BargainActivityConvert.INSTANCE.convert(activityService.getBargainActivity(id)));
74 66 }
75 67  
76 68 @GetMapping("/page")
... ... @@ -78,14 +70,7 @@ public class BargainActivityController {
78 70 @PreAuthorize("@ss.hasPermission('promotion:bargain-activity:query')")
79 71 public CommonResult<PageResult<BargainActivityRespVO>> getBargainActivityPage(
80 72 @Valid BargainActivityPageReqVO pageVO) {
81   - // 查询砍价活动
82   - PageResult<BargainActivityDO> pageResult = activityService.getBargainActivityPage(pageVO);
83   - // 拼接数据
84   - Set<Long> activityIds = convertSet(pageResult.getList(), BargainActivityDO::getId);
85   - Set<Long> spuIds = convertSet(pageResult.getList(), BargainActivityDO::getSpuId);
86   - return success(BargainActivityConvert.INSTANCE.convertPage(pageResult,
87   - activityService.getBargainProductsByActivityIds(activityIds),
88   - spuApi.getSpuList(spuIds)));
  73 + return success(BargainActivityConvert.INSTANCE.convertPage(activityService.getBargainActivityPage(pageVO)));
89 74 }
90 75  
91 76 }
... ...
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/product/BargainProductUpdateReqVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/BargainActivityCreateReqVO.java
1   -package cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.product;
  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;
5 5 import lombok.EqualsAndHashCode;
6 6 import lombok.ToString;
7 7  
8   -@Schema(description = "管理后台 - 砍价商品更新 Request VO")
  8 +@Schema(description = "管理后台 - 砍价活动创建 Request VO")
9 9 @Data
10 10 @EqualsAndHashCode(callSuper = true)
11 11 @ToString(callSuper = true)
12   -public class BargainProductUpdateReqVO extends BargainProductBaseVO {
  12 +public class BargainActivityCreateReqVO extends BargainActivityBaseVO {
13 13  
14 14 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/product/BargainProductCreateReqVO.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.product;
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo;
2 2  
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
3 4 import io.swagger.v3.oas.annotations.media.Schema;
4 5 import lombok.Data;
5 6 import lombok.EqualsAndHashCode;
6 7 import lombok.ToString;
7 8  
8   -// TODO @puhui999:是不是应该把 BargainProductCreateReqVO 和 BargainProductUpdateReqVO 合并在一起哈。就是一个 SaveReqVO
9   -@Schema(description = "管理后台 - 砍价商品创建 Request VO")
  9 +@Schema(description = "管理后台 - 砍价活动分页 Request VO")
10 10 @Data
11 11 @EqualsAndHashCode(callSuper = true)
12 12 @ToString(callSuper = true)
13   -public class BargainProductCreateReqVO extends BargainProductBaseVO {
  13 +public class BargainActivityPageReqVO extends PageParam {
  14 +
  15 + @Schema(description = "砍价名称", example = "赵六")
  16 + private String name;
  17 +
  18 + @Schema(description = "活动状态:0开启 1关闭", example = "0")
  19 + private Integer status;
14 20  
15 21 }
... ...
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;
7 6 import lombok.ToString;
8 7  
9   -import javax.validation.Valid;
10 8 import javax.validation.constraints.NotNull;
11 9 import java.time.LocalDateTime;
12   -import java.util.List;
13   -
14 10 @Schema(description = "管理后台 - 砍价活动 Response VO")
15 11 @Data
16 12 @EqualsAndHashCode(callSuper = true)
17 13 @ToString(callSuper = true)
18 14 public class BargainActivityRespVO extends BargainActivityBaseVO {
19 15  
20   - // TODO @puhui999:example 补全
21   -
22 16 @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618大促")
23 17 private String spuName;
24 18  
... ... @@ -28,18 +22,14 @@ public class BargainActivityRespVO extends BargainActivityBaseVO {
28 22 @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22901")
29 23 private Long id;
30 24  
31   - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  25 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022-07-01 23:59:59")
32 26 private LocalDateTime createTime;
33 27  
34   - @Schema(description = "砍价成功数量", requiredMode = Schema.RequiredMode.REQUIRED)
  28 + @Schema(description = "砍价成功数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "999")
35 29 private Integer successCount;
36 30  
37 31 @Schema(description = "活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
38 32 @NotNull(message = "活动状态不能为空")
39 33 private Integer status;
40 34  
41   - @Schema(description = "砍价商品", requiredMode = Schema.RequiredMode.REQUIRED)
42   - @Valid
43   - private List<BargainProductRespVO> products;
44   -
45 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.BargainProductUpdateReqVO;
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<BargainProductUpdateReqVO> 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.BargainProductCreateReqVO;
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<BargainProductCreateReqVO> products;
21   -
22   -}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/vo/activity/BargainActivityPageReqVO.java deleted
1   -package cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity;
2   -
3   -import cn.iocoder.yudao.framework.common.pojo.PageParam;
4   -import io.swagger.v3.oas.annotations.media.Schema;
5   -import lombok.Data;
6   -import lombok.EqualsAndHashCode;
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   -
14   -@Schema(description = "管理后台 - 砍价活动分页 Request VO")
15   -@Data
16   -@EqualsAndHashCode(callSuper = true)
17   -@ToString(callSuper = true)
18   -public class BargainActivityPageReqVO extends PageParam {
19   -
20   - @Schema(description = "砍价名称", example = "赵六")
21   - private String name;
22   -
23   - @Schema(description = "商品 SPU 编号关联 ProductSpuDO 的 id", example = "14016")
24   - private Long spuId;
25   -
26   - @Schema(description = "总限购数量", example = "16218")
27   - private Integer totalLimitCount;
28   -
29   - @Schema(description = "单次限购数量", example = "28265")
30   - private Integer singleLimitCount;
31   -
32   - @Schema(description = "开始时间")
33   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
34   - private LocalDateTime[] startTime;
35   -
36   - @Schema(description = "结束时间")
37   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
38   - private LocalDateTime[] endTime;
39   -
40   - @Schema(description = "开团人数")
41   - private Integer userSize;
42   -
43   - @Schema(description = "开团组数")
44   - private Integer totalNum;
45   -
46   - @Schema(description = "成团组数")
47   - private Integer successNum;
48   -
49   - @Schema(description = "参与人数", example = "25222")
50   - private Integer orderUserCount;
51   -
52   - @Schema(description = "虚拟成团")
53   - private Integer virtualGroup;
54   -
55   - @Schema(description = "活动状态:0开启 1关闭", example = "0")
56   - private Integer status;
57   -
58   - @Schema(description = "限制时长(小时)")
59   - private Integer limitDuration;
60   -
61   - @Schema(description = "创建时间")
62   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
63   - private LocalDateTime[] createTime;
64   -
65   -}
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 = "23")
20   - @NotNull(message = "商品 skuId 不能为空")
21   - private Long skuId;
22   -
23   - @Schema(description = "砍价起始价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "23")
24   - @NotNull(message = "砍价起始价格不能为空")
25   - private Integer bargainFirstPrice;
26   -
27   - @Schema(description = "砍价底价", requiredMode = Schema.RequiredMode.REQUIRED, example = "23")
28   - @NotNull(message = "砍价底价不能为空")
29   - private Integer bargainPrice;
30   -
31   - @Schema(description = "活动库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "23")
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,46 +15,8 @@ public class CombinationActivityPageReqVO extends PageParam {
20 15 @Schema(description = "拼团名称", example = "赵六")
21 16 private String name;
22 17  
23   - @Schema(description = "商品 SPU 编号关联 ProductSpuDO 的 id", example = "14016")
24   - private Long spuId;
25   -
26   - @Schema(description = "总限购数量", example = "16218")
27   - private Integer totalLimitCount;
28   -
29   - @Schema(description = "单次限购数量", example = "28265")
30   - private Integer singleLimitCount;
31   -
32   - @Schema(description = "开始时间")
33   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
34   - private LocalDateTime[] startTime;
35   -
36   - @Schema(description = "结束时间")
37   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
38   - private LocalDateTime[] endTime;
39   -
40   - @Schema(description = "开团人数")
41   - private Integer userSize;
42   -
43   - @Schema(description = "开团组数")
44   - private Integer totalNum;
45   -
46   - @Schema(description = "成团组数")
47   - private Integer successNum;
48   -
49   - @Schema(description = "参与人数", example = "25222")
50   - private Integer orderUserCount;
51   -
52   - @Schema(description = "虚拟成团")
53   - private Integer virtualGroup;
54   -
55 18 @Schema(description = "活动状态:0开启 1关闭", example = "0")
56 19 private Integer status;
57 20  
58   - @Schema(description = "限制时长(小时)")
59   - private Integer limitDuration;
60   -
61   - @Schema(description = "创建时间")
62   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
63   - private LocalDateTime[] createTime;
64 21  
65 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;
12   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.product.BargainProductUpdateReqVO;
  4 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityCreateReqVO;
  5 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityRespVO;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO;
13 7 import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
14   -import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainProductDO;
15 8 import org.mapstruct.Mapper;
16   -import org.mapstruct.Mapping;
17   -import org.mapstruct.Mappings;
18 9 import org.mapstruct.factory.Mappers;
19 10  
20 11 import java.util.List;
21   -import java.util.Map;
22   -
23   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
24 12  
25 13 /**
26 14 * 拼团活动 Convert
... ... @@ -38,57 +26,8 @@ public interface BargainActivityConvert {
38 26  
39 27 BargainActivityRespVO convert(BargainActivityDO bean);
40 28  
41   - BargainProductRespVO convert(BargainProductDO bean);
42   -
43   - default BargainActivityRespVO convert(BargainActivityDO bean, List<BargainProductDO> productDOs) {
44   - return convert(bean).setProducts(convertList2(productDOs));
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   - Map<Long, ProductSpuRespDTO> spuMap = convertMap(spuList, ProductSpuRespDTO::getId);
55   - PageResult<BargainActivityRespVO> pageResult = convertPage(page);
56   - pageResult.getList().forEach(item -> {
57   - MapUtils.findAndThen(spuMap, item.getSpuId(), spu -> {
58   - item.setSpuName(spu.getName());
59   - item.setPicUrl(spu.getPicUrl());
60   - });
61   - item.setProducts(convertList2(productList));
62   - });
63   - return pageResult;
64   - }
65   -
66   - List<BargainProductRespVO> convertList2(List<BargainProductDO> productDOs);
67   -
68   - // TODO @puhui999:参数改成 activity、product 会不会干净一点哈
69   - @Mappings({
70   - @Mapping(target = "id", ignore = true),
71   - @Mapping(target = "activityId", source = "activityDO.id"),
72   - @Mapping(target = "spuId", source = "activityDO.spuId"),
73   - @Mapping(target = "skuId", source = "vo.skuId"),
74   - @Mapping(target = "bargainFirstPrice", source = "vo.bargainFirstPrice"),
75   - @Mapping(target = "bargainPrice", source = "vo.bargainPrice"),
76   - @Mapping(target = "stock", source = "vo.stock"),
77   - @Mapping(target = "activityStartTime", source = "activityDO.startTime"),
78   - @Mapping(target = "activityEndTime", source = "activityDO.endTime")
79   - })
80   - BargainProductDO convert(BargainActivityDO activityDO, BargainProductBaseVO vo);
81   -
82   - default List<BargainProductDO> convertList(List<? extends BargainProductBaseVO> products, BargainActivityDO activityDO) {
83   - return CollectionUtils.convertList(products, item -> convert(activityDO, item).setActivityStatus(activityDO.getStatus()));
84   - }
85   -
86   - default List<BargainProductDO> convertList(List<BargainProductUpdateReqVO> updateProductVOs,
87   - List<BargainProductDO> products, BargainActivityDO activity) {
88   - Map<Long, Long> productMap = convertMap(products, BargainProductDO::getSkuId, BargainProductDO::getId);
89   - return CollectionUtils.convertList(updateProductVOs, updateProductVO -> convert(activity, updateProductVO)
90   - .setId(productMap.get(updateProductVO.getSkuId()))
91   - .setActivityStatus(activity.getStatus()));
92   - }
93   -
94 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;
... ... @@ -93,4 +94,6 @@ public interface CombinationActivityConvert {
93 94  
94 95 CombinationRecordDO convert(CombinationRecordCreateReqDTO reqDTO);
95 96  
  97 + List<CombinationRecordRespDTO> convert(List<CombinationRecordDO> bean);
  98 +
96 99 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/bargain/BargainActivityDO.java
... ... @@ -53,7 +53,18 @@ public class BargainActivityDO extends BaseDO {
53 53 * 商品 SPU 编号
54 54 */
55 55 private Long spuId;
56   -
  56 + /**
  57 + * 商品 SKU 编号
  58 + */
  59 + private Long skuId;
  60 + /**
  61 + * 砍价起始价格,单位分
  62 + */
  63 + private Integer bargainFirstPrice;
  64 + /**
  65 + * 砍价底价,单位:分
  66 + */
  67 + private Integer bargainPrice;
57 68 /**
58 69 * 达到该人数,才能砍到低价
59 70 */
... ... @@ -70,7 +81,7 @@ public class BargainActivityDO extends BaseDO {
70 81 private Integer totalLimitCount;
71 82  
72 83 /**
73   - * 砍价库存
  84 + * 砍价活动库存
74 85 */
75 86 private Integer stock;
76 87  
... ...
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   -@TableName("promotion_bargain_product")
17   -@KeySequence("promotion_bargain_product_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
18   -@Data
19   -@EqualsAndHashCode(callSuper = true)
20   -@ToString(callSuper = true)
21   -@Builder
22   -@NoArgsConstructor
23   -@AllArgsConstructor
24   -public class BargainProductDO extends BaseDO {
25   -
26   - /**
27   - * 编号
28   - */
29   - @TableId
30   - private Long id;
31   - /**
32   - * 砍价活动编号
33   - */
34   - private Long activityId;
35   - /**
36   - * 商品 SPU 编号
37   - */
38   - private Long spuId;
39   - /**
40   - * 商品 SKU 编号
41   - */
42   - private Long skuId;
43   - /**
44   - * 砍价商品状态
45   - *
46   - * 关联 {@link BargainActivityDO#getStatus()}
47   - */
48   - private Integer activityStatus;
49   - /**
50   - * 活动开始时间点
51   - */
52   - private LocalDateTime activityStartTime;
53   - /**
54   - * 活动结束时间点
55   - */
56   - private LocalDateTime activityEndTime;
57   - /**
58   - * 砍价起始价格,单位分
59   - */
60   - private Integer bargainFirstPrice;
61   - /**
62   - * 砍价底价,单位:分
63   - */
64   - private Integer bargainPrice;
65   - /**
66   - * 活动库存
67   - */
68   - private Integer stock;
69   -
70   -}
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,6 +20,7 @@ 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 + .eqIfPresent(CombinationActivityDO::getStatus, reqVO.getStatus())
23 24 .orderByDesc(CombinationActivityDO::getId));
24 25 }
25 26  
... ...
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.BargainActivityCreateReqVO;
  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 接口
... ... @@ -56,12 +53,5 @@ public interface BargainActivityService {
56 53 */
57 54 PageResult<BargainActivityDO> getBargainActivityPage(BargainActivityPageReqVO pageReqVO);
58 55  
59   - /**
60   - * 获得砍价活动商品列表
61   - *
62   - * @param ids 砍价活动 ids
63   - * @return 砍价活动的商品列表
64   - */
65   - List<BargainProductDO> getBargainProductsByActivityIds(Collection<Long> ids);
66 56  
67 57 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainServiceImpl.java
... ... @@ -10,31 +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.BargainProductCreateReqVO;
17   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.product.BargainProductUpdateReqVO;
  13 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityCreateReqVO;
  14 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityPageReqVO;
  15 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO;
18 16 import cn.iocoder.yudao.module.promotion.convert.bargain.BargainActivityConvert;
19 17 import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
20   -import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainProductDO;
21 18 import cn.iocoder.yudao.module.promotion.dal.mysql.bargain.BargainActivityMapper;
22   -import cn.iocoder.yudao.module.promotion.dal.mysql.bargain.BargainProductMapper;
23 19 import cn.iocoder.yudao.module.promotion.dal.mysql.bargain.BargainRecordMapper;
24 20 import org.springframework.stereotype.Service;
25 21 import org.springframework.transaction.annotation.Transactional;
26 22 import org.springframework.validation.annotation.Validated;
27 23  
28 24 import javax.annotation.Resource;
29   -import java.util.Collection;
30 25 import java.util.List;
31 26  
32 27 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
33 28 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch;
34   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue;
  29 +import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
35 30 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
36 31 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
37   -import static cn.iocoder.yudao.module.promotion.util.PromotionUtils.validateProductSkuAllExists;
38 32  
39 33 /**
40 34 * 砍价活动 Service 实现类
... ... @@ -50,38 +44,37 @@ public class BargainServiceImpl implements BargainActivityService, BargainRecord
50 44 @Resource
51 45 private BargainRecordMapper recordMapper;
52 46 @Resource
53   - private BargainProductMapper bargainProductMapper;
54   - @Resource
55 47 private ProductSpuApi productSpuApi;
56 48 @Resource
57 49 private ProductSkuApi productSkuApi;
58 50  
  51 + private static void validateSku(Long skuId, List<ProductSkuRespDTO> skus) {
  52 + // 校验商品 sku 是否存在
  53 + if (!CollectionUtils.convertSet(skus, ProductSkuRespDTO::getId).contains(skuId)) {
  54 + throw exception(SKU_NOT_EXISTS);
  55 + }
  56 + }
  57 +
59 58 @Override
60 59 @Transactional(rollbackFor = Exception.class)
61 60 public Long createBargainActivity(BargainActivityCreateReqVO createReqVO) {
62 61 // 校验商品 SPU 是否存在是否参加的别的活动
63   - validateProductBargainConflict(createReqVO.getSpuId(), null);
  62 + validateBargainConflict(createReqVO.getSpuId(), null);
64 63 // 获取所选 spu下的所有 sku
65 64 List<ProductSkuRespDTO> skus = productSkuApi.getSkuListBySpuId(CollectionUtil.newArrayList(createReqVO.getSpuId()));
66   - // 校验商品 sku 是否存在
67   - validateProductSkuAllExists(skus, createReqVO.getProducts(), BargainProductCreateReqVO::getSkuId);
  65 + validateSku(createReqVO.getSkuId(), skus);
68 66  
69 67 // 插入砍价活动
70 68 BargainActivityDO activityDO = BargainActivityConvert.INSTANCE.convert(createReqVO);
71 69 // TODO 营销相关属性初始化 砍价成功更新相关属性
72 70 activityDO.setSuccessCount(0);
73   - // 活动总库存
74   - activityDO.setStock(getSumValue(createReqVO.getProducts(), BargainProductCreateReqVO::getStock, Integer::sum));
75 71 activityDO.setStatus(CommonStatusEnum.ENABLE.getStatus());
76 72 bargainActivityMapper.insert(activityDO);
77   - // 插入商品
78   - List<BargainProductDO> productDOs = BargainActivityConvert.INSTANCE.convertList(createReqVO.getProducts(), activityDO);
79   - bargainProductMapper.insertBatch(productDOs);
80 73 // 返回
81 74 return activityDO.getId();
82 75 }
83 76  
84   - private void validateProductBargainConflict(Long spuId, Long activityId) {
  77 + private void validateBargainConflict(Long spuId, Long activityId) {
85 78 // 校验商品 spu 是否存在
86 79 List<ProductSpuRespDTO> spuList = productSpuApi.getSpuList(CollUtil.newArrayList(spuId));
87 80 if (CollUtil.isEmpty(spuList)) {
... ... @@ -109,52 +102,16 @@ public class BargainServiceImpl implements BargainActivityService, BargainRecord
109 102 throw exception(BARGAIN_ACTIVITY_STATUS_DISABLE);
110 103 }
111 104 // 校验商品冲突
112   - validateProductBargainConflict(updateReqVO.getSpuId(), updateReqVO.getId());
  105 + validateBargainConflict(updateReqVO.getSpuId(), updateReqVO.getId());
113 106 // 获取所选 spu下的所有 sku
114 107 List<ProductSkuRespDTO> skus = productSkuApi.getSkuListBySpuId(CollectionUtil.newArrayList(updateReqVO.getSpuId()));
115 108 // 校验商品 sku 是否存在
116   - validateProductSkuAllExists(skus, updateReqVO.getProducts(), BargainProductUpdateReqVO::getSkuId);
  109 + validateSku(updateReqVO.getSkuId(), skus);
117 110  
118 111 // 更新
119 112 BargainActivityDO updateObj = BargainActivityConvert.INSTANCE.convert(updateReqVO);
120   - // 更新活动库存
121   - updateObj.setStock(getSumValue(updateReqVO.getProducts(), BargainProductUpdateReqVO::getStock, Integer::sum));
122 113 bargainActivityMapper.updateById(updateObj);
123   - // 更新商品
124   - updateBargainProduct(updateObj, updateReqVO.getProducts());
125   - }
126 114  
127   - /**
128   - * 更新砍价商品
129   - *
130   - * @param updateObj 更新的活动
131   - * @param products 商品配置
132   - */
133   - private void updateBargainProduct(BargainActivityDO updateObj, List<BargainProductUpdateReqVO> products) {
134   - // 默认全部新增
135   - List<BargainProductDO> defaultNewList = BargainActivityConvert.INSTANCE.convertList(products, updateObj);
136   - // 数据库中的老数据
137   - List<BargainProductDO> oldList = bargainProductMapper.selectListByActivityIds(CollUtil.newArrayList(updateObj.getId()));
138   - List<List<BargainProductDO>> lists = CollectionUtils.diffList(oldList, defaultNewList, (oldVal, newVal) -> {
139   - boolean same = ObjectUtil.equal(oldVal.getSkuId(), newVal.getSkuId());
140   - if (same) {
141   - newVal.setId(oldVal.getId());
142   - }
143   - return same;
144   - });
145   -
146   - // create
147   - if (CollUtil.isNotEmpty(lists.get(0))) {
148   - bargainProductMapper.insertBatch(lists.get(0));
149   - }
150   - // update
151   - if (CollUtil.isNotEmpty(lists.get(1))) {
152   - bargainProductMapper.updateBatch(lists.get(1));
153   - }
154   - // delete
155   - if (CollUtil.isNotEmpty(lists.get(2))) {
156   - bargainProductMapper.deleteBatchIds(CollectionUtils.convertList(lists.get(2), BargainProductDO::getId));
157   - }
158 115 }
159 116  
160 117 @Override
... ... @@ -189,9 +146,4 @@ public class BargainServiceImpl implements BargainActivityService, BargainRecord
189 146 return bargainActivityMapper.selectPage(pageReqVO);
190 147 }
191 148  
192   - @Override
193   - public List<BargainProductDO> getBargainProductsByActivityIds(Collection<Long> ids) {
194   - return bargainProductMapper.selectListByActivityIds(ids);
195   - }
196   -
197 149 }
... ...
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/CombinationServiceImpl.java
... ... @@ -30,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
30 30 import org.springframework.validation.annotation.Validated;
31 31  
32 32 import javax.annotation.Resource;
  33 +import java.time.LocalDateTime;
33 34 import java.util.Collection;
34 35 import java.util.List;
35 36  
... ... @@ -68,8 +69,6 @@ public class CombinationServiceImpl implements CombinationActivityService, Combi
68 69 // 校验商品 sku 是否存在
69 70 validateProductSkuAllExists(skus, createReqVO.getProducts(), CombinationProductCreateReqVO::getSkuId);
70 71  
71   - // TODO 艿艿 有个小问题:现在有活动时间和限制时长,活动时间的结束时间早于设置的限制时间怎么算状态比如:
72   - // 活动时间 2023-08-05 15:00:00 - 2023-08-05 15:20:00 限制时长 2小时,那么活动时间结束就结束还是加时到满两小时
73 72 // 插入拼团活动
74 73 CombinationActivityDO activityDO = CombinationActivityConvert.INSTANCE.convert(createReqVO);
75 74 // TODO 营销相关属性初始化 拼团成功更新相关属性
... ... @@ -132,7 +131,7 @@ public class CombinationServiceImpl implements CombinationActivityService, Combi
132 131 * 更新拼团商品
133 132 *
134 133 * @param activity 拼团活动
135   - * @param products 该活动的最新商品配置
  134 + * @param products 该活动的最新商品配置
136 135 */
137 136 private void updateCombinationProduct(CombinationActivityDO activity, List<CombinationProductUpdateReqVO> products) {
138 137 // 第一步,对比新老数据,获得添加、修改、删除的列表
... ... @@ -201,6 +200,7 @@ public class CombinationServiceImpl implements CombinationActivityService, Combi
201 200 }
202 201  
203 202 @Override
  203 + @Transactional(rollbackFor = Exception.class)
204 204 public void updateCombinationRecordStatusByUserIdAndOrderId(CombinationRecordUpdateStatusReqDTO reqDTO) {
205 205 // 校验拼团是否存在
206 206 CombinationRecordDO recordDO = validateCombinationRecord(reqDTO.getUserId(), reqDTO.getOrderId());
... ... @@ -244,6 +244,7 @@ public class CombinationServiceImpl implements CombinationActivityService, Combi
244 244 }
245 245  
246 246 @Override
  247 + @Transactional(rollbackFor = Exception.class)
247 248 public void createCombinationRecord(CombinationRecordCreateReqDTO reqDTO) {
248 249 // 1.1 校验拼团活动
249 250 CombinationActivityDO activity = validateCombinationActivityExists(reqDTO.getActivityId());
... ... @@ -252,9 +253,19 @@ public class CombinationServiceImpl implements CombinationActivityService, Combi
252 253 if (recordDO != null) {
253 254 throw exception(COMBINATION_RECORD_EXISTS);
254 255 }
255   - // 1.3 父拼团是否存在,是否已经满了
  256 + // 1.3 校验用户是否参加了其它拼团
  257 + List<CombinationRecordDO> recordDOList = recordMapper.selectListByUserIdAndStatus(reqDTO.getUserId(), CombinationRecordStatusEnum.IN_PROGRESS.getStatus());
  258 + if (CollUtil.isNotEmpty(recordDOList)) {
  259 + throw exception(COMBINATION_RECORD_FAILED_HAVE_JOINED);
  260 + }
  261 + // 1.4 校验当前活动是否过期
  262 + if (LocalDateTime.now().isAfter(activity.getEndTime())) {
  263 + throw exception(COMBINATION_RECORD_FAILED_TIME_END);
  264 + }
  265 + // 1.5 父拼团是否存在,是否已经满了
256 266 if (reqDTO.getHeadId() != null) {
257   - CombinationRecordDO recordDO1 = recordMapper.selectRecordByHeadId(reqDTO.getHeadId(), reqDTO.getActivityId(), CombinationRecordStatusEnum.IN_PROGRESS.getStatus());
  267 + // 查询进行中的父拼团
  268 + CombinationRecordDO recordDO1 = recordMapper.selectOneByHeadId(reqDTO.getHeadId(), CombinationRecordStatusEnum.IN_PROGRESS.getStatus());
258 269 if (recordDO1 == null) {
259 270 throw exception(COMBINATION_RECORD_HEAD_NOT_EXISTS);
260 271 }
... ... @@ -263,7 +274,6 @@ public class CombinationServiceImpl implements CombinationActivityService, Combi
263 274 throw exception(COMBINATION_RECORD_USER_FULL);
264 275 }
265 276 }
266   - // TODO @puhui999:应该还有一些校验,后续补噶;例如说,一个团,自己已经参与进去了,不能再参与进去;
267 277  
268 278 // 2. 创建拼团记录
269 279 CombinationRecordDO record = CombinationActivityConvert.INSTANCE.convert(reqDTO);
... ... @@ -288,4 +298,22 @@ public class CombinationServiceImpl implements CombinationActivityService, Combi
288 298 return recordMapper.selectListByStatus(status);
289 299 }
290 300  
  301 + public List<CombinationRecordDO> getRecordListByUserIdAndActivityId(Long userId, Long activityId) {
  302 + return recordMapper.selectListByUserIdAndActivityId(userId, activityId);
  303 + }
  304 +
  305 + @Override
  306 + public void validateCombinationLimitCount(Long activityId, Integer count, Integer sumCount) {
  307 + // 1.1 校验拼团活动
  308 + CombinationActivityDO activity = validateCombinationActivityExists(activityId);
  309 + // 校验是否达到限购总限购标准
  310 + if ((sumCount + count) > activity.getTotalLimitCount()) {
  311 + throw exception(COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED);
  312 + }
  313 + // 单次购买是否达到限购标准
  314 + if (count > activity.getSingleLimitCount()) {
  315 + throw exception(COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED);
  316 + }
  317 + }
  318 +
291 319 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillconfig/SeckillConfigServiceImpl.java
... ... @@ -62,7 +62,6 @@ public class SeckillConfigServiceImpl implements SeckillConfigService {
62 62 seckillConfigMapper.updateById(updateObj);
63 63 }
64 64  
65   - // TODO @puhui999: 这个要不合并到更新操作里? 不单独有个操作咧; fix: 更新状态不用那么多必须的参数,更新的时候需要校验时间段
66 65 @Override
67 66 public void updateSeckillConfigStatus(Long id, Integer status) {
68 67 // 校验秒杀时段是否存在
... ...
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,19 +151,7 @@ public class CombinationActivityServiceImplTest extends BaseDbUnitTest {
152 151 // 准备参数
153 152 CombinationActivityPageReqVO reqVO = new CombinationActivityPageReqVO();
154 153 reqVO.setName(null);
155   - reqVO.setSpuId(null);
156   - reqVO.setTotalLimitCount(null);
157   - reqVO.setSingleLimitCount(null);
158   - reqVO.setStartTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
159   - reqVO.setEndTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
160   - reqVO.setUserSize(null);
161   - reqVO.setTotalNum(null);
162   - reqVO.setSuccessNum(null);
163   - reqVO.setOrderUserCount(null);
164   - reqVO.setVirtualGroup(null);
165 154 reqVO.setStatus(null);
166   - reqVO.setLimitDuration(null);
167   - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
168 155  
169 156 // 调用
170 157 PageResult<CombinationActivityDO> pageResult = combinationActivityService.getCombinationActivityPage(reqVO);
... ...
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
... ... @@ -126,8 +126,7 @@ public class AppTradeOrderController {
126 126 @Operation(summary = "确认交易订单收货")
127 127 @Parameter(name = "id", description = "交易订单编号")
128 128 public CommonResult<Boolean> takeOrder(@RequestParam("id") Long id) {
129   - // TODO @芋艿:未实现,mock 用
130   - return success(true);
  129 + return success(tradeOrderService.receiveOrder(getLoginUserId(), id));
131 130 }
132 131  
133 132 @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 状态为已发货,等待收货
... ... @@ -428,16 +434,6 @@ public class TradeOrderServiceImpl implements TradeOrderService {
428 434 // TODO 设计:lili:是不是发货后,才支持售后?
429 435 }
430 436  
431   - private void validateDeliveryExpress(TradeOrderDeliveryReqVO deliveryReqVO) {
432   - DeliveryExpressDO deliveryExpress = deliveryExpressService.getDeliveryExpress(deliveryReqVO.getLogisticsId());
433   - if (deliveryExpress == null) {
434   - throw exception(EXPRESS_NOT_EXISTS);
435   - }
436   - if (deliveryExpress.getStatus().equals(CommonStatusEnum.DISABLE.getStatus())) {
437   - throw exception(EXPRESS_STATUS_NOT_ENABLE);
438   - }
439   - }
440   -
441 437 /**
442 438 * 校验交易订单满足被发货的条件
443 439 *
... ... @@ -464,17 +460,23 @@ public class TradeOrderServiceImpl implements TradeOrderService {
464 460 // 订单类型:拼团
465 461 if (Objects.equals(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) {
466 462 // 校验订单拼团是否成功
467   - if (combinationRecordApi.isCombinationRecordSuccess(order.getUserId(), order.getId())) {
  463 + if (combinationRecordApi.validateRecordSuccess(order.getUserId(), order.getId())) {
468 464 throw exception(ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS);
469 465 }
470 466 }
471   - // TODO puhui999: 校验订单砍价是否成功
  467 + // 订单类类型:砍价
  468 + if (Objects.equals(TradeOrderTypeEnum.BARGAIN.getType(), order.getType())) {
  469 + // 校验订单砍价是否成功
  470 + if (bargainRecordApi.validateRecordSuccess(order.getUserId(), order.getId())) {
  471 + throw exception(ORDER_DELIVERY_FAIL_BARGAIN_RECORD_STATUS_NOT_SUCCESS);
  472 + }
  473 + }
472 474 return order;
473 475 }
474 476  
475 477 @Override
476 478 @Transactional(rollbackFor = Exception.class)
477   - public void receiveOrder(Long userId, Long id) {
  479 + public Boolean receiveOrder(Long userId, Long id) {
478 480 // 校验并获得交易订单(可收货)
479 481 TradeOrderDO order = validateOrderReceivable(userId, id);
480 482  
... ... @@ -490,6 +492,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
490 492 // TODO 芋艿:lili 发送订单变化的消息
491 493  
492 494 // TODO 芋艿:lili 发送商品被购买完成的数据
  495 + return Boolean.TRUE;
493 496 }
494 497  
495 498 @Override
... ...