Commit 254d7828aa3f4abd927dd7330ddc730af6346b31

Authored by puhui999
1 parent 7fb45509

mall+order: 订单活动特殊逻辑的抽离

Showing 23 changed files with 526 additions and 141 deletions
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationApi.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.api.combination;
  2 +
  3 +import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationActivityUpdateStockReqDTO;
  4 +
  5 +/**
  6 + * 拼团活动 Api 接口
  7 + *
  8 + * @author HUIHUI
  9 + */
  10 +public interface CombinationApi {
  11 +
  12 + /**
  13 + * 更新活动库存
  14 + *
  15 + * @param reqDTO 请求
  16 + */
  17 + void validateCombination(CombinationActivityUpdateStockReqDTO reqDTO);
  18 +
  19 +}
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/dto/CombinationActivityUpdateStockReqDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.api.combination.dto;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import javax.validation.Valid;
  6 +import javax.validation.constraints.NotNull;
  7 +
  8 +/**
  9 + * 拼团活动更新活动库存 Request DTO
  10 + *
  11 + * @author HUIHUI
  12 + */
  13 +@Data
  14 +public class CombinationActivityUpdateStockReqDTO {
  15 +
  16 + @NotNull(message = "活动编号不能为空")
  17 + private Long activityId;
  18 +
  19 + @NotNull(message = "购买数量不能为空")
  20 + private Integer count;
  21 +
  22 + @NotNull(message = "活动商品不能为空")
  23 + private Item item;
  24 +
  25 + @Data
  26 + @Valid
  27 + public static class Item {
  28 +
  29 + @NotNull(message = "SPU 编号不能为空")
  30 + private Long spuId;
  31 +
  32 + @NotNull(message = "SKU 编号活动商品不能为空")
  33 + private Long skuId;
  34 +
  35 + @NotNull(message = "购买数量不能为空")
  36 + private Integer count;
  37 +
  38 + }
  39 +
  40 +}
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/dto/CombinationRecordCreateReqDTO.java
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.promotion.api.combination.dto; @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.promotion.api.combination.dto;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 4
5 -import javax.validation.constraints.NotEmpty;  
6 import javax.validation.constraints.NotNull; 5 import javax.validation.constraints.NotNull;
7 6
8 // TODO @芋艿:这块要在看看 7 // TODO @芋艿:这块要在看看
@@ -14,65 +13,25 @@ import javax.validation.constraints.NotNull; @@ -14,65 +13,25 @@ import javax.validation.constraints.NotNull;
14 @Data 13 @Data
15 public class CombinationRecordCreateReqDTO { 14 public class CombinationRecordCreateReqDTO {
16 15
17 - /**  
18 - * 拼团活动编号  
19 - */  
20 @NotNull(message = "拼团活动编号不能为空") 16 @NotNull(message = "拼团活动编号不能为空")
21 private Long activityId; 17 private Long activityId;
22 - /**  
23 - * spu 编号  
24 - */ 18 +
25 @NotNull(message = "spu 编号不能为空") 19 @NotNull(message = "spu 编号不能为空")
26 private Long spuId; 20 private Long spuId;
27 - /**  
28 - * sku 编号  
29 - */ 21 +
30 @NotNull(message = "sku 编号不能为空") 22 @NotNull(message = "sku 编号不能为空")
31 private Long skuId; 23 private Long skuId;
32 - /**  
33 - * 用户编号  
34 - */  
35 - @NotNull(message = "用户编号不能为空")  
36 - private Long userId;  
37 - /**  
38 - * 订单编号  
39 - */ 24 +
40 @NotNull(message = "订单编号不能为空") 25 @NotNull(message = "订单编号不能为空")
41 private Long orderId; 26 private Long orderId;
42 - /**  
43 - * 团长编号  
44 - */ 27 +
  28 + @NotNull(message = "用户编号不能为空")
  29 + private Long userId;
  30 +
45 @NotNull(message = "团长编号不能为空") 31 @NotNull(message = "团长编号不能为空")
46 private Long headId; 32 private Long headId;
47 - /**  
48 - * 商品名字  
49 - */  
50 - @NotEmpty(message = "商品名字不能为空")  
51 - private String spuName;  
52 - /**  
53 - * 商品图片  
54 - */  
55 - @NotEmpty(message = "商品图片不能为空")  
56 - private String picUrl;  
57 - /**  
58 - * 拼团商品单价  
59 - */ 33 +
60 @NotNull(message = "拼团商品单价不能为空") 34 @NotNull(message = "拼团商品单价不能为空")
61 private Integer combinationPrice; 35 private Integer combinationPrice;
62 - /**  
63 - * 用户昵称  
64 - */  
65 - @NotEmpty(message = "用户昵称不能为空")  
66 - private String nickname;  
67 - /**  
68 - * 用户头像  
69 - */  
70 - @NotEmpty(message = "用户头像不能为空")  
71 - private String avatar;  
72 - /**  
73 - * 开团状态:正在开团 拼团成功 拼团失败  
74 - */  
75 - @NotNull(message = "开团状态不能为空")  
76 - private Integer status;  
77 36
78 } 37 }
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/seckill/dto/SeckillActivityUpdateStockReqDTO.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.promotion.api.seckill.dto; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.promotion.api.seckill.dto;
2 2
3 import lombok.Data; 3 import lombok.Data;
4 4
  5 +import javax.validation.Valid;
5 import javax.validation.constraints.NotNull; 6 import javax.validation.constraints.NotNull;
6 7
7 /** 8 /**
@@ -22,6 +23,7 @@ public class SeckillActivityUpdateStockReqDTO { @@ -22,6 +23,7 @@ public class SeckillActivityUpdateStockReqDTO {
22 private Item item; 23 private Item item;
23 24
24 @Data 25 @Data
  26 + @Valid
25 public static class Item { 27 public static class Item {
26 28
27 @NotNull(message = "SPU 编号不能为空") 29 @NotNull(message = "SPU 编号不能为空")
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
@@ -65,18 +65,19 @@ public interface ErrorCodeConstants { @@ -65,18 +65,19 @@ public interface ErrorCodeConstants {
65 // ========== 拼团活动 1013010000 ========== 65 // ========== 拼团活动 1013010000 ==========
66 ErrorCode COMBINATION_ACTIVITY_NOT_EXISTS = new ErrorCode(1013010000, "拼团活动不存在"); 66 ErrorCode COMBINATION_ACTIVITY_NOT_EXISTS = new ErrorCode(1013010000, "拼团活动不存在");
67 ErrorCode COMBINATION_ACTIVITY_SPU_CONFLICTS = new ErrorCode(1013010001, "存在商品参加了其它拼团活动"); 67 ErrorCode COMBINATION_ACTIVITY_SPU_CONFLICTS = new ErrorCode(1013010001, "存在商品参加了其它拼团活动");
68 - ErrorCode COMBINATION_ACTIVITY_STATUS_DISABLE = new ErrorCode(1013010002, "拼团活动已关闭不能修改"); 68 + ErrorCode COMBINATION_ACTIVITY_STATUS_DISABLE_NOT_UPDATE = new ErrorCode(1013010002, "拼团活动已关闭不能修改");
69 ErrorCode COMBINATION_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END = new ErrorCode(1013010003, "拼团活动未关闭或未结束,不能删除"); 69 ErrorCode COMBINATION_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END = new ErrorCode(1013010003, "拼团活动未关闭或未结束,不能删除");
70 - ErrorCode COMBINATION_RECORD_NOT_EXISTS = new ErrorCode(1013010004, "拼团不存在"); 70 + ErrorCode COMBINATION_ACTIVITY_STATUS_DISABLE = new ErrorCode(1013010004, "拼团失败,原因:拼团活动已关闭");
71 71
72 // ========== 拼团记录 1013011000 ========== 72 // ========== 拼团记录 1013011000 ==========
73 - ErrorCode COMBINATION_RECORD_EXISTS = new ErrorCode(1013011000, "拼团失败,已参与过该拼团");  
74 - ErrorCode COMBINATION_RECORD_HEAD_NOT_EXISTS = new ErrorCode(1013011001, "拼团失败,父拼团不存在");  
75 - ErrorCode COMBINATION_RECORD_USER_FULL = new ErrorCode(1013011002, "拼团失败,拼团人数已满");  
76 - ErrorCode COMBINATION_RECORD_FAILED_HAVE_JOINED = new ErrorCode(1013011003, "拼团失败,已参与其它拼团");  
77 - ErrorCode COMBINATION_RECORD_FAILED_TIME_END = new ErrorCode(1013011004, "拼团失败,活动已经结束");  
78 - ErrorCode COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED = new ErrorCode(1013011005, "拼团失败,单次限购超出");  
79 - ErrorCode COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED = new ErrorCode(1013011006, "拼团失败,单次限购超出"); 73 + ErrorCode COMBINATION_RECORD_NOT_EXISTS = new ErrorCode(1013011000, "拼团不存在");
  74 + ErrorCode COMBINATION_RECORD_EXISTS = new ErrorCode(1013011001, "拼团失败,已参与过该拼团");
  75 + ErrorCode COMBINATION_RECORD_HEAD_NOT_EXISTS = new ErrorCode(1013011002, "拼团失败,父拼团不存在");
  76 + ErrorCode COMBINATION_RECORD_USER_FULL = new ErrorCode(1013011003, "拼团失败,拼团人数已满");
  77 + ErrorCode COMBINATION_RECORD_FAILED_HAVE_JOINED = new ErrorCode(1013011004, "拼团失败,已参与其它拼团");
  78 + ErrorCode COMBINATION_RECORD_FAILED_TIME_END = new ErrorCode(1013011005, "拼团失败,活动已经结束");
  79 + ErrorCode COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED = new ErrorCode(1013011006, "拼团失败,原因:单次限购超出");
  80 + ErrorCode COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED = new ErrorCode(1013011007, "拼团失败,原因:超出总购买次数");
80 81
81 // ========== 砍价活动 1013012000 ========== 82 // ========== 砍价活动 1013012000 ==========
82 ErrorCode BARGAIN_ACTIVITY_NOT_EXISTS = new ErrorCode(1013012000, "砍价活动不存在"); 83 ErrorCode BARGAIN_ACTIVITY_NOT_EXISTS = new ErrorCode(1013012000, "砍价活动不存在");
yudao-module-mall/yudao-module-promotion-biz/pom.xml
@@ -31,6 +31,11 @@ @@ -31,6 +31,11 @@
31 </dependency> 31 </dependency>
32 <dependency> 32 <dependency>
33 <groupId>cn.iocoder.boot</groupId> 33 <groupId>cn.iocoder.boot</groupId>
  34 + <artifactId>yudao-module-trade-api</artifactId>
  35 + <version>${revision}</version>
  36 + </dependency>
  37 + <dependency>
  38 + <groupId>cn.iocoder.boot</groupId>
34 <artifactId>yudao-module-member-api</artifactId> 39 <artifactId>yudao-module-member-api</artifactId>
35 <version>${revision}</version> 40 <version>${revision}</version>
36 </dependency> 41 </dependency>
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationApiImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.api.combination;
  2 +
  3 +import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationActivityUpdateStockReqDTO;
  4 +import cn.iocoder.yudao.module.promotion.service.combination.CombinationActivityService;
  5 +
  6 +import javax.annotation.Resource;
  7 +
  8 +/**
  9 + * 拼团活动 Api 接口实现类
  10 + *
  11 + * @author HUIHUI
  12 + */
  13 +public class CombinationApiImpl implements CombinationApi {
  14 +
  15 + @Resource
  16 + private CombinationActivityService activityService;
  17 +
  18 + @Override
  19 + public void validateCombination(CombinationActivityUpdateStockReqDTO reqDTO) {
  20 + activityService.validateCombination(reqDTO);
  21 + }
  22 +
  23 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityService.java
1 package cn.iocoder.yudao.module.promotion.service.combination; 1 package cn.iocoder.yudao.module.promotion.service.combination;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationActivityUpdateStockReqDTO;
4 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO; 5 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO;
5 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO; 6 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO;
6 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO; 7 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO;
@@ -72,4 +73,11 @@ public interface CombinationActivityService { @@ -72,4 +73,11 @@ public interface CombinationActivityService {
72 */ 73 */
73 List<CombinationProductDO> getCombinationProductsByActivityIds(Collection<Long> activityIds); 74 List<CombinationProductDO> getCombinationProductsByActivityIds(Collection<Long> activityIds);
74 75
  76 + /**
  77 + * 更新拼图活动库存
  78 + *
  79 + * @param reqDTO 请求
  80 + */
  81 + void validateCombination(CombinationActivityUpdateStockReqDTO reqDTO);
  82 +
75 } 83 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImpl.java
@@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi; @@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
9 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; 9 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
10 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; 10 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
11 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; 11 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
  12 +import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationActivityUpdateStockReqDTO;
12 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO; 13 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO;
13 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO; 14 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO;
14 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO; 15 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO;
@@ -16,8 +17,11 @@ import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.product @@ -16,8 +17,11 @@ import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.product
16 import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert; 17 import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert;
17 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO; 18 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
18 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationProductDO; 19 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationProductDO;
  20 +import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationRecordDO;
19 import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationActivityMapper; 21 import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationActivityMapper;
20 import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationProductMapper; 22 import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationProductMapper;
  23 +import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;
  24 +import cn.iocoder.yudao.module.trade.api.order.TradeOrderApi;
21 import org.springframework.stereotype.Service; 25 import org.springframework.stereotype.Service;
22 import org.springframework.transaction.annotation.Transactional; 26 import org.springframework.transaction.annotation.Transactional;
23 import org.springframework.validation.annotation.Validated; 27 import org.springframework.validation.annotation.Validated;
@@ -28,8 +32,8 @@ import java.util.List; @@ -28,8 +32,8 @@ import java.util.List;
28 import java.util.Map; 32 import java.util.Map;
29 33
30 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 34 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
31 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;  
32 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; 35 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
  36 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
33 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS; 37 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
34 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS; 38 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
35 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; 39 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
@@ -48,11 +52,15 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic @@ -48,11 +52,15 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
48 private CombinationActivityMapper combinationActivityMapper; 52 private CombinationActivityMapper combinationActivityMapper;
49 @Resource 53 @Resource
50 private CombinationProductMapper combinationProductMapper; 54 private CombinationProductMapper combinationProductMapper;
  55 + @Resource
  56 + private CombinationRecordService combinationRecordService;
51 57
52 @Resource 58 @Resource
53 private ProductSpuApi productSpuApi; 59 private ProductSpuApi productSpuApi;
54 @Resource 60 @Resource
55 private ProductSkuApi productSkuApi; 61 private ProductSkuApi productSkuApi;
  62 + @Resource
  63 + private TradeOrderApi tradeOrderApi;
56 64
57 @Override 65 @Override
58 @Transactional(rollbackFor = Exception.class) 66 @Transactional(rollbackFor = Exception.class)
@@ -97,7 +105,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic @@ -97,7 +105,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
97 * 校验拼团商品是否都存在 105 * 校验拼团商品是否都存在
98 * 106 *
99 * @param spuId 商品 SPU 编号 107 * @param spuId 商品 SPU 编号
100 - * @param products 秒杀商品 108 + * @param products 拼团商品
101 */ 109 */
102 private void validateProductExists(Long spuId, List<CombinationProductBaseVO> products) { 110 private void validateProductExists(Long spuId, List<CombinationProductBaseVO> products) {
103 // 1. 校验商品 spu 是否存在 111 // 1. 校验商品 spu 是否存在
@@ -123,7 +131,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic @@ -123,7 +131,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
123 CombinationActivityDO activityDO = validateCombinationActivityExists(updateReqVO.getId()); 131 CombinationActivityDO activityDO = validateCombinationActivityExists(updateReqVO.getId());
124 // 校验状态 132 // 校验状态
125 if (ObjectUtil.equal(activityDO.getStatus(), CommonStatusEnum.DISABLE.getStatus())) { 133 if (ObjectUtil.equal(activityDO.getStatus(), CommonStatusEnum.DISABLE.getStatus())) {
126 - throw exception(COMBINATION_ACTIVITY_STATUS_DISABLE); 134 + throw exception(COMBINATION_ACTIVITY_STATUS_DISABLE_NOT_UPDATE);
127 } 135 }
128 // 校验商品冲突 136 // 校验商品冲突
129 validateProductConflict(updateReqVO.getSpuId(), updateReqVO.getId()); 137 validateProductConflict(updateReqVO.getSpuId(), updateReqVO.getId());
@@ -205,4 +213,30 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic @@ -205,4 +213,30 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
205 return combinationProductMapper.selectListByActivityIds(activityIds); 213 return combinationProductMapper.selectListByActivityIds(activityIds);
206 } 214 }
207 215
  216 + @Override
  217 + public void validateCombination(CombinationActivityUpdateStockReqDTO reqDTO) {
  218 + // 1、校验拼团活动是否存在
  219 + CombinationActivityDO activity = validateCombinationActivityExists(reqDTO.getActivityId());
  220 + // 1.1、校验活动是否开启
  221 + if (ObjectUtil.equal(activity.getStatus(), CommonStatusEnum.DISABLE.getStatus())) {
  222 + throw exception(COMBINATION_ACTIVITY_STATUS_DISABLE);
  223 + }
  224 + // 1.2、校验是否超出单次限购数量
  225 + if (activity.getSingleLimitCount() < reqDTO.getCount()) {
  226 + throw exception(COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED);
  227 + }
  228 + // 1.3、校验是否超出总限购数量
  229 + List<CombinationRecordDO> recordList = combinationRecordService.getRecordListByUserIdAndActivityId(getLoginUserId(), reqDTO.getActivityId());
  230 + if (CollUtil.isNotEmpty(recordList)) {
  231 + // 过滤出拼团成功的
  232 + List<Long> skuIds = convertList(recordList, CombinationRecordDO::getSkuId,
  233 + item -> ObjectUtil.equals(item.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus()));
  234 + Integer countSum = tradeOrderApi.getOrderItemCountSumByOrderIdAndSkuId(convertList(recordList, CombinationRecordDO::getOrderId,
  235 + item -> ObjectUtil.equals(item.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus())), skuIds);
  236 + if (activity.getTotalLimitCount() < countSum) {
  237 + throw exception(COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED);
  238 + }
  239 + }
  240 + }
  241 +
208 } 242 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java
@@ -2,12 +2,19 @@ package cn.iocoder.yudao.module.promotion.service.combination; @@ -2,12 +2,19 @@ package cn.iocoder.yudao.module.promotion.service.combination;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.ObjectUtil; 4 import cn.hutool.core.util.ObjectUtil;
  5 +import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
  6 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
  7 +import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
  8 +import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
  9 +import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
  10 +import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
5 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO; 11 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
6 import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert; 12 import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert;
7 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO; 13 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
8 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationRecordDO; 14 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationRecordDO;
9 import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationRecordMapper; 15 import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationRecordMapper;
10 import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum; 16 import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;
  17 +import org.springframework.context.annotation.Lazy;
11 import org.springframework.stereotype.Service; 18 import org.springframework.stereotype.Service;
12 import org.springframework.transaction.annotation.Transactional; 19 import org.springframework.transaction.annotation.Transactional;
13 import org.springframework.validation.annotation.Validated; 20 import org.springframework.validation.annotation.Validated;
@@ -32,10 +39,18 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { @@ -32,10 +39,18 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
32 39
33 @Resource 40 @Resource
34 private CombinationActivityService combinationActivityService; 41 private CombinationActivityService combinationActivityService;
35 -  
36 @Resource 42 @Resource
37 private CombinationRecordMapper recordMapper; 43 private CombinationRecordMapper recordMapper;
38 44
  45 + @Resource
  46 + private MemberUserApi memberUserApi;
  47 + @Resource
  48 + @Lazy
  49 + private ProductSpuApi productSpuApi;
  50 + @Resource
  51 + @Lazy
  52 + private ProductSkuApi productSkuApi;
  53 +
39 @Override 54 @Override
40 @Transactional(rollbackFor = Exception.class) 55 @Transactional(rollbackFor = Exception.class)
41 public void updateCombinationRecordStatusByUserIdAndOrderId(Integer status, Long userId, Long orderId) { 56 public void updateCombinationRecordStatusByUserIdAndOrderId(Integer status, Long userId, Long orderId) {
@@ -102,12 +117,12 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { @@ -102,12 +117,12 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
102 // 1.5 父拼团是否存在,是否已经满了 117 // 1.5 父拼团是否存在,是否已经满了
103 if (reqDTO.getHeadId() != null) { 118 if (reqDTO.getHeadId() != null) {
104 // 查询进行中的父拼团 119 // 查询进行中的父拼团
105 - CombinationRecordDO recordDO1 = recordMapper.selectOneByHeadId(reqDTO.getHeadId(), CombinationRecordStatusEnum.IN_PROGRESS.getStatus());  
106 - if (recordDO1 == null) { 120 + CombinationRecordDO record = recordMapper.selectOneByHeadId(reqDTO.getHeadId(), CombinationRecordStatusEnum.IN_PROGRESS.getStatus());
  121 + if (record == null) {
107 throw exception(COMBINATION_RECORD_HEAD_NOT_EXISTS); 122 throw exception(COMBINATION_RECORD_HEAD_NOT_EXISTS);
108 } 123 }
109 // 校验拼团是否满足要求 124 // 校验拼团是否满足要求
110 - if (ObjectUtil.equal(recordDO1.getUserCount(), recordDO1.getUserSize())) { 125 + if (ObjectUtil.equal(record.getUserCount(), record.getUserSize())) {
111 throw exception(COMBINATION_RECORD_USER_FULL); 126 throw exception(COMBINATION_RECORD_USER_FULL);
112 } 127 }
113 } 128 }
@@ -117,6 +132,13 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { @@ -117,6 +132,13 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
117 record.setVirtualGroup(false); 132 record.setVirtualGroup(false);
118 record.setExpireTime(record.getStartTime().plusHours(activity.getLimitDuration())); 133 record.setExpireTime(record.getStartTime().plusHours(activity.getLimitDuration()));
119 record.setUserSize(activity.getUserSize()); 134 record.setUserSize(activity.getUserSize());
  135 + MemberUserRespDTO user = memberUserApi.getUser(reqDTO.getUserId());
  136 + record.setNickname(user.getNickname());
  137 + record.setAvatar(user.getAvatar());
  138 + ProductSpuRespDTO spu = productSpuApi.getSpu(record.getSpuId());
  139 + record.setSpuName(spu.getName());
  140 + ProductSkuRespDTO sku = productSkuApi.getSku(record.getSkuId());
  141 + record.setPicUrl(sku.getPicUrl());
120 recordMapper.insert(record); 142 recordMapper.insert(record);
121 } 143 }
122 144
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/order/TradeOrderApi.java
1 package cn.iocoder.yudao.module.trade.api.order; 1 package cn.iocoder.yudao.module.trade.api.order;
2 2
  3 +import java.util.Collection;
  4 +
3 /** 5 /**
4 * 订单 API 接口 6 * 订单 API 接口
5 * 7 *
@@ -16,4 +18,13 @@ public interface TradeOrderApi { @@ -16,4 +18,13 @@ public interface TradeOrderApi {
16 */ 18 */
17 Long validateOrder(Long userId, Long orderItemId); 19 Long validateOrder(Long userId, Long orderItemId);
18 20
  21 + /**
  22 + * 获取订单项商品购买数量总和
  23 + *
  24 + * @param orderIds 订单编号
  25 + * @param skuIds sku 编号
  26 + * @return 订单项商品购买数量总和
  27 + */
  28 + Integer getOrderItemCountSumByOrderIdAndSkuId(Collection<Long> orderIds, Collection<Long> skuIds);
  29 +
19 } 30 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/order/TradeOrderApiImpl.java
@@ -6,6 +6,7 @@ import org.springframework.stereotype.Service; @@ -6,6 +6,7 @@ import org.springframework.stereotype.Service;
6 import org.springframework.validation.annotation.Validated; 6 import org.springframework.validation.annotation.Validated;
7 7
8 import javax.annotation.Resource; 8 import javax.annotation.Resource;
  9 +import java.util.Collection;
9 10
10 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 11 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
11 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_ITEM_NOT_FOUND; 12 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_ITEM_NOT_FOUND;
@@ -32,4 +33,9 @@ public class TradeOrderApiImpl implements TradeOrderApi { @@ -32,4 +33,9 @@ public class TradeOrderApiImpl implements TradeOrderApi {
32 return item.getOrderId(); 33 return item.getOrderId();
33 } 34 }
34 35
  36 + @Override
  37 + public Integer getOrderItemCountSumByOrderIdAndSkuId(Collection<Long> orderIds, Collection<Long> skuIds) {
  38 + return tradeOrderQueryService.getOrderItemCountSumByOrderIdAndSkuId(orderIds, skuIds);
  39 + }
  40 +
35 } 41 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
@@ -14,7 +14,9 @@ import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDT @@ -14,7 +14,9 @@ import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDT
14 import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; 14 import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
15 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; 15 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
16 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; 16 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO;
  17 +import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationActivityUpdateStockReqDTO;
17 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO; 18 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
  19 +import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillActivityUpdateStockReqDTO;
18 import cn.iocoder.yudao.module.trade.api.order.dto.TradeOrderRespDTO; 20 import cn.iocoder.yudao.module.trade.api.order.dto.TradeOrderRespDTO;
19 import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO; 21 import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO;
20 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO; 22 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO;
@@ -31,6 +33,8 @@ import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEn @@ -31,6 +33,8 @@ import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEn
31 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO; 33 import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
32 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties; 34 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
33 import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO; 35 import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO;
  36 +import cn.iocoder.yudao.module.trade.service.order.bo.TradeAfterOrderCreateReqBO;
  37 +import cn.iocoder.yudao.module.trade.service.order.bo.TradeBeforeOrderCreateReqBO;
34 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; 38 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
35 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; 39 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
36 import org.mapstruct.Mapper; 40 import org.mapstruct.Mapper;
@@ -253,21 +257,15 @@ public interface TradeOrderConvert { @@ -253,21 +257,15 @@ public interface TradeOrderConvert {
253 AppTradeOrderSettlementRespVO convert0(TradePriceCalculateRespBO calculate, AddressRespDTO address); 257 AppTradeOrderSettlementRespVO convert0(TradePriceCalculateRespBO calculate, AddressRespDTO address);
254 258
255 @Mappings({ 259 @Mappings({
256 - @Mapping(target = "activityId", source = "createReqVO.combinationActivityId"),  
257 - @Mapping(target = "spuId", source = "orderItem.spuId"),  
258 - @Mapping(target = "skuId", source = "orderItem.skuId"),  
259 - @Mapping(target = "userId", source = "order.userId"),  
260 - @Mapping(target = "orderId", source = "order.id"),  
261 - @Mapping(target = "headId", source = "createReqVO.combinationHeadId"),  
262 - @Mapping(target = "spuName", source = "orderItem.spuName"),  
263 - @Mapping(target = "picUrl", source = "orderItem.picUrl"),  
264 - @Mapping(target = "combinationPrice", source = "orderItem.payPrice"),  
265 - @Mapping(target = "nickname", source = "user.nickname"),  
266 - @Mapping(target = "avatar", source = "user.avatar"),  
267 - @Mapping(target = "status", ignore = true) 260 + @Mapping(target = "activityId", source = "afterOrderCreateReqBO.combinationActivityId"),
  261 + @Mapping(target = "spuId", source = "afterOrderCreateReqBO.spuId"),
  262 + @Mapping(target = "skuId", source = "afterOrderCreateReqBO.skuId"),
  263 + @Mapping(target = "orderId", source = "afterOrderCreateReqBO.orderId"),
  264 + @Mapping(target = "userId", source = "afterOrderCreateReqBO.userId"),
  265 + @Mapping(target = "headId", source = "afterOrderCreateReqBO.combinationHeadId"),
  266 + @Mapping(target = "combinationPrice", source = "afterOrderCreateReqBO.payPrice"),
268 }) 267 })
269 - CombinationRecordCreateReqDTO convert(TradeOrderDO order, TradeOrderItemDO orderItem,  
270 - AppTradeOrderCreateReqVO createReqVO, MemberUserRespDTO user); 268 + CombinationRecordCreateReqDTO convert(TradeAfterOrderCreateReqBO afterOrderCreateReqBO);
271 269
272 List<AppOrderExpressTrackRespDTO> convertList02(List<ExpressTrackRespDTO> list); 270 List<AppOrderExpressTrackRespDTO> convertList02(List<ExpressTrackRespDTO> list);
273 271
@@ -283,4 +281,24 @@ public interface TradeOrderConvert { @@ -283,4 +281,24 @@ public interface TradeOrderConvert {
283 .setFirstFixedPrice(sku.getFirstBrokerageRecord()) 281 .setFirstFixedPrice(sku.getFirstBrokerageRecord())
284 .setSecondFixedPrice(sku.getSecondBrokerageRecord()); 282 .setSecondFixedPrice(sku.getSecondBrokerageRecord());
285 } 283 }
  284 +
  285 + @Mapping(target = "activityId", source = "reqBO.seckillActivityId")
  286 + SeckillActivityUpdateStockReqDTO convert(TradeBeforeOrderCreateReqBO reqBO);
  287 +
  288 + @Mapping(target = "activityId", source = "reqBO.combinationActivityId")
  289 + CombinationActivityUpdateStockReqDTO convert1(TradeBeforeOrderCreateReqBO reqBO);
  290 +
  291 + TradeBeforeOrderCreateReqBO convert(AppTradeOrderCreateReqVO createReqVO);
  292 +
  293 + @Mappings({
  294 + @Mapping(target = "combinationActivityId", source = "createReqVO.combinationActivityId"),
  295 + @Mapping(target = "combinationHeadId", source = "createReqVO.combinationHeadId"),
  296 + @Mapping(target = "spuId", source = "orderItem.spuId"),
  297 + @Mapping(target = "skuId", source = "orderItem.skuId"),
  298 + @Mapping(target = "orderId", source = "tradeOrderDO.id"),
  299 + @Mapping(target = "userId", source = "userId"),
  300 + @Mapping(target = "payPrice", source = "tradeOrderDO.payPrice"),
  301 + })
  302 + TradeAfterOrderCreateReqBO convert(Long userId, AppTradeOrderCreateReqVO createReqVO, TradeOrderDO tradeOrderDO, TradeOrderItemDO orderItem);
  303 +
286 } 304 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/mysql/order/TradeOrderItemMapper.java
@@ -29,7 +29,7 @@ public interface TradeOrderItemMapper extends BaseMapperX&lt;TradeOrderItemDO&gt; { @@ -29,7 +29,7 @@ public interface TradeOrderItemMapper extends BaseMapperX&lt;TradeOrderItemDO&gt; {
29 default List<TradeOrderItemDO> selectListByOrderIdAnSkuId(Collection<Long> orderIds, Collection<Long> skuIds) { 29 default List<TradeOrderItemDO> selectListByOrderIdAnSkuId(Collection<Long> orderIds, Collection<Long> skuIds) {
30 return selectList(new LambdaQueryWrapperX<TradeOrderItemDO>() 30 return selectList(new LambdaQueryWrapperX<TradeOrderItemDO>()
31 .in(TradeOrderItemDO::getOrderId, orderIds) 31 .in(TradeOrderItemDO::getOrderId, orderIds)
32 - .eq(TradeOrderItemDO::getSkuId, skuIds)); 32 + .in(TradeOrderItemDO::getSkuId, skuIds));
33 } 33 }
34 34
35 default TradeOrderItemDO selectByIdAndUserId(Long orderItemId, Long loginUserId) { 35 default TradeOrderItemDO selectByIdAndUserId(Long orderItemId, Long loginUserId) {
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryService.java
@@ -119,4 +119,13 @@ public interface TradeOrderQueryService { @@ -119,4 +119,13 @@ public interface TradeOrderQueryService {
119 */ 119 */
120 List<TradeOrderItemDO> getOrderItemListByOrderId(Collection<Long> orderIds); 120 List<TradeOrderItemDO> getOrderItemListByOrderId(Collection<Long> orderIds);
121 121
  122 + /**
  123 + * 获取订单项商品购买数量总和
  124 + *
  125 + * @param orderIds 订单编号
  126 + * @param skuIds sku 编号
  127 + * @return 订单项商品购买数量总和
  128 + */
  129 + Integer getOrderItemCountSumByOrderIdAndSkuId(Collection<Long> orderIds, Collection<Long> skuIds);
  130 +
122 } 131 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderQueryServiceImpl.java
@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.ObjectUtil; 4 import cn.hutool.core.util.ObjectUtil;
5 import cn.hutool.core.util.StrUtil; 5 import cn.hutool.core.util.StrUtil;
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
7 import cn.iocoder.yudao.module.member.api.user.MemberUserApi; 8 import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
8 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; 9 import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
9 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO; 10 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
@@ -167,4 +168,10 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { @@ -167,4 +168,10 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
167 return tradeOrderItemMapper.selectListByOrderId(orderIds); 168 return tradeOrderItemMapper.selectListByOrderId(orderIds);
168 } 169 }
169 170
  171 + @Override
  172 + public Integer getOrderItemCountSumByOrderIdAndSkuId(Collection<Long> orderIds, Collection<Long> skuIds) {
  173 + List<TradeOrderItemDO> tradeOrderItems = tradeOrderItemMapper.selectListByOrderIdAnSkuId(orderIds, skuIds);
  174 + return CollectionUtils.getSumValue(tradeOrderItems, TradeOrderItemDO::getCount, Integer::sum);
  175 + }
  176 +
170 } 177 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
@@ -13,8 +13,6 @@ import cn.iocoder.yudao.module.member.api.address.AddressApi; @@ -13,8 +13,6 @@ import cn.iocoder.yudao.module.member.api.address.AddressApi;
13 import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO; 13 import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO;
14 import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; 14 import cn.iocoder.yudao.module.member.api.level.MemberLevelApi;
15 import cn.iocoder.yudao.module.member.api.point.MemberPointApi; 15 import cn.iocoder.yudao.module.member.api.point.MemberPointApi;
16 -import cn.iocoder.yudao.module.member.api.user.MemberUserApi;  
17 -import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;  
18 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; 16 import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
19 import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; 17 import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum;
20 import cn.iocoder.yudao.module.pay.api.order.PayOrderApi; 18 import cn.iocoder.yudao.module.pay.api.order.PayOrderApi;
@@ -24,15 +22,10 @@ import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; @@ -24,15 +22,10 @@ import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum;
24 import cn.iocoder.yudao.module.product.api.comment.ProductCommentApi; 22 import cn.iocoder.yudao.module.product.api.comment.ProductCommentApi;
25 import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO; 23 import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO;
26 import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi; 24 import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
27 -import cn.iocoder.yudao.module.promotion.api.bargain.BargainActivityApi;  
28 import cn.iocoder.yudao.module.promotion.api.bargain.BargainRecordApi; 25 import cn.iocoder.yudao.module.promotion.api.bargain.BargainRecordApi;
29 import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi; 26 import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi;
30 -import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordRespDTO;  
31 import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi; 27 import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi;
32 import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO; 28 import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO;
33 -import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi;  
34 -import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillActivityUpdateStockReqDTO;  
35 -import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;  
36 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO; 29 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO;
37 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO; 30 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO;
38 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO; 31 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO;
@@ -59,6 +52,8 @@ import cn.iocoder.yudao.module.trade.service.cart.CartService; @@ -59,6 +52,8 @@ import cn.iocoder.yudao.module.trade.service.cart.CartService;
59 import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService; 52 import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService;
60 import cn.iocoder.yudao.module.trade.service.message.TradeMessageService; 53 import cn.iocoder.yudao.module.trade.service.message.TradeMessageService;
61 import cn.iocoder.yudao.module.trade.service.message.bo.TradeOrderMessageWhenDeliveryOrderReqBO; 54 import cn.iocoder.yudao.module.trade.service.message.bo.TradeOrderMessageWhenDeliveryOrderReqBO;
  55 +import cn.iocoder.yudao.module.trade.service.order.bo.TradeBeforeOrderCreateReqBO;
  56 +import cn.iocoder.yudao.module.trade.service.order.handler.TradeOrderHandler;
62 import cn.iocoder.yudao.module.trade.service.price.TradePriceService; 57 import cn.iocoder.yudao.module.trade.service.price.TradePriceService;
63 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; 58 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO;
64 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; 59 import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO;
@@ -95,6 +90,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -95,6 +90,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
95 private TradeOrderItemMapper tradeOrderItemMapper; 90 private TradeOrderItemMapper tradeOrderItemMapper;
96 @Resource 91 @Resource
97 private TradeOrderNoRedisDAO orderNoRedisDAO; 92 private TradeOrderNoRedisDAO orderNoRedisDAO;
  93 + @Resource
  94 + private List<TradeOrderHandler> orderHandlers;
98 95
99 @Resource 96 @Resource
100 private CartService cartService; 97 private CartService cartService;
@@ -118,12 +115,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -118,12 +115,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
118 @Resource 115 @Resource
119 private BargainRecordApi bargainRecordApi; 116 private BargainRecordApi bargainRecordApi;
120 @Resource 117 @Resource
121 - private SeckillActivityApi seckillActivityApi;  
122 - @Resource  
123 - private BargainActivityApi bargainActivityApi;  
124 - @Resource  
125 - private MemberUserApi memberUserApi;  
126 - @Resource  
127 private MemberLevelApi memberLevelApi; 118 private MemberLevelApi memberLevelApi;
128 @Resource 119 @Resource
129 private MemberPointApi memberPointApi; 120 private MemberPointApi memberPointApi;
@@ -188,7 +179,13 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -188,7 +179,13 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
188 @Override 179 @Override
189 @Transactional(rollbackFor = Exception.class) 180 @Transactional(rollbackFor = Exception.class)
190 public TradeOrderDO createOrder(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO) { 181 public TradeOrderDO createOrder(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO) {
191 - // 1. 价格计算 182 + // 1、执行订单创建前置处理器
  183 + TradeBeforeOrderCreateReqBO beforeOrderCreateReqBO = TradeOrderConvert.INSTANCE.convert(createReqVO);
  184 + beforeOrderCreateReqBO.setOrderType(validateActivity(createReqVO));
  185 + beforeOrderCreateReqBO.setCount(CollectionUtils.getSumValue(createReqVO.getItems(), AppTradeOrderSettlementReqVO.Item::getCount, Integer::sum));
  186 + orderHandlers.forEach(handler -> handler.beforeOrderCreate(beforeOrderCreateReqBO));
  187 +
  188 + // 2. 价格计算
192 TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, createReqVO); 189 TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, createReqVO);
193 190
194 // 2.1 插入 TradeOrderDO 订单 191 // 2.1 插入 TradeOrderDO 订单
@@ -198,37 +195,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -198,37 +195,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
198 195
199 // 3. 订单创建完后的逻辑 196 // 3. 订单创建完后的逻辑
200 afterCreateTradeOrder(userId, createReqVO, order, orderItems, calculateRespBO); 197 afterCreateTradeOrder(userId, createReqVO, order, orderItems, calculateRespBO);
201 - // 3.1 拼团的特殊逻辑  
202 - // TODO @puhui999:这个逻辑,先抽个小方法;未来要通过设计模式,把这些拼团之类的逻辑,抽象出去  
203 - // 拼团  
204 - if (Objects.equals(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) {  
205 - createCombinationRecord(userId, createReqVO, orderItems, order);  
206 - }  
207 - // 3.2 秒杀的特殊逻辑  
208 - if (Objects.equals(TradeOrderTypeEnum.SECKILL.getType(), order.getType())) {  
209 -  
210 - }  
211 - // 3.3 砍价的特殊逻辑  
212 198
213 // TODO @LeeYan9: 是可以思考下, 订单的营销优惠记录, 应该记录在哪里, 微信讨论起来! 199 // TODO @LeeYan9: 是可以思考下, 订单的营销优惠记录, 应该记录在哪里, 微信讨论起来!
214 return order; 200 return order;
215 } 201 }
216 202
217 - private void createCombinationRecord(Long userId, AppTradeOrderCreateReqVO createReqVO, List<TradeOrderItemDO> orderItems, TradeOrderDO order) {  
218 - MemberUserRespDTO user = memberUserApi.getUser(userId);  
219 - List<CombinationRecordRespDTO> recordRespDTOS = combinationRecordApi.getRecordListByUserIdAndActivityId(userId, createReqVO.getCombinationActivityId());  
220 - // TODO 拼团一次应该只能选择一种规格的商品  
221 - TradeOrderItemDO orderItemDO = orderItems.get(0);  
222 - if (CollUtil.isNotEmpty(recordRespDTOS)) {  
223 - List<Long> skuIds = convertList(recordRespDTOS, CombinationRecordRespDTO::getSkuId, item -> ObjectUtil.equals(item.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus()));  
224 - List<TradeOrderItemDO> tradeOrderItemDOS = tradeOrderItemMapper.selectListByOrderIdAnSkuId(convertList(recordRespDTOS,  
225 - CombinationRecordRespDTO::getOrderId, item -> ObjectUtil.equals(item.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus())), skuIds);  
226 - combinationRecordApi.validateCombinationLimitCount(createReqVO.getCombinationActivityId(),  
227 - CollectionUtils.getSumValue(tradeOrderItemDOS, TradeOrderItemDO::getCount, Integer::sum), orderItemDO.getCount());  
228 - }  
229 -  
230 - combinationRecordApi.createCombinationRecord(TradeOrderConvert.INSTANCE.convert(order, orderItemDO, createReqVO, user));  
231 - }  
232 203
233 // TODO @puhui999:订单超时,自动取消; 204 // TODO @puhui999:订单超时,自动取消;
234 205
@@ -310,13 +281,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -310,13 +281,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
310 private void afterCreateTradeOrder(Long userId, AppTradeOrderCreateReqVO createReqVO, 281 private void afterCreateTradeOrder(Long userId, AppTradeOrderCreateReqVO createReqVO,
311 TradeOrderDO tradeOrderDO, List<TradeOrderItemDO> orderItems, 282 TradeOrderDO tradeOrderDO, List<TradeOrderItemDO> orderItems,
312 TradePriceCalculateRespBO calculateRespBO) { 283 TradePriceCalculateRespBO calculateRespBO) {
313 - Integer count = getSumValue(orderItems, TradeOrderItemDO::getCount, Integer::sum);  
314 - // 1)如果是秒杀商品:额外扣减秒杀的库存;  
315 - if (Objects.equals(TradeOrderTypeEnum.SECKILL.getType(), tradeOrderDO.getType())) {  
316 - seckillActivityApi.updateSeckillStock(getSeckillActivityUpdateStockReqDTO(createReqVO, orderItems, count));  
317 - }  
318 - // 2)如果是砍价活动:额外扣减砍价的库存;  
319 - bargainActivityApi.updateBargainActivityStock(createReqVO.getBargainActivityId(), count); 284 + // 执行订单创建后置处理器
  285 + orderHandlers.forEach(handler -> handler.afterOrderCreate(TradeOrderConvert.INSTANCE.convert(userId, createReqVO, tradeOrderDO, orderItems.get(0))));
320 // 扣减积分 TODO 芋艿:待实现,需要前置; 286 // 扣减积分 TODO 芋艿:待实现,需要前置;
321 // 这个是不是应该放到支付成功之后?如果支付后的话,可能积分可以重复使用哈。资源类,都要预扣 287 // 这个是不是应该放到支付成功之后?如果支付后的话,可能积分可以重复使用哈。资源类,都要预扣
322 288
@@ -341,19 +307,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -341,19 +307,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
341 // 增加订单日志 TODO 芋艿:待实现 307 // 增加订单日志 TODO 芋艿:待实现
342 } 308 }
343 309
344 - private SeckillActivityUpdateStockReqDTO getSeckillActivityUpdateStockReqDTO(AppTradeOrderCreateReqVO createReqVO, List<TradeOrderItemDO> orderItems, Integer count) {  
345 - SeckillActivityUpdateStockReqDTO updateStockReqDTO = new SeckillActivityUpdateStockReqDTO();  
346 - updateStockReqDTO.setActivityId(createReqVO.getSeckillActivityId());  
347 - updateStockReqDTO.setCount(count);  
348 - // 秒杀活动只能选择一个商品  
349 - TradeOrderItemDO item = orderItems.get(0);  
350 - SeckillActivityUpdateStockReqDTO.Item item1 = new SeckillActivityUpdateStockReqDTO.Item();  
351 - item1.setSpuId(item.getSpuId());  
352 - item1.setSkuId(item.getSkuId());  
353 - item1.setCount(item.getCount());  
354 - updateStockReqDTO.setItem(item1);  
355 - return updateStockReqDTO;  
356 - }  
357 310
358 private void createPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems, TradePriceCalculateRespBO calculateRespBO) { 311 private void createPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems, TradePriceCalculateRespBO calculateRespBO) {
359 // 创建支付单,用于后续的支付 312 // 创建支付单,用于后续的支付
@@ -768,6 +721,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -768,6 +721,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
768 throw exception(ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID); 721 throw exception(ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID);
769 } 722 }
770 723
  724 + // TODO 活动相关库存回滚需要活动 id,活动 id 怎么获取?app 端能否传过来
  725 + orderHandlers.forEach(handler -> handler.rollbackStock());
  726 +
771 // 2.回滚库存 727 // 2.回滚库存
772 List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(id); 728 List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(id);
773 productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(orderItems)); 729 productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(orderItems));
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/TradeAfterOrderCreateReqBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.bo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.constraints.NotNull;
  7 +
  8 +/**
  9 + * 订单创建之后 Request BO
  10 + *
  11 + * @author HUIHUI
  12 + */
  13 +@Data
  14 +public class TradeAfterOrderCreateReqBO {
  15 +
  16 + // ========== 拼团活动相关字段 ==========
  17 +
  18 + @Schema(description = "拼团活动编号", example = "1024")
  19 + private Long combinationActivityId;
  20 +
  21 + @Schema(description = "拼团团长编号", example = "2048")
  22 + private Long combinationHeadId;
  23 +
  24 + @NotNull(message = "SPU 编号不能为空")
  25 + private Long spuId;
  26 +
  27 + @NotNull(message = "SKU 编号活动商品不能为空")
  28 + private Long skuId;
  29 +
  30 + @NotNull(message = "订单编号不能为空")
  31 + private Long orderId;
  32 +
  33 + @NotNull(message = "用户编号不能为空")
  34 + private Long userId;
  35 +
  36 + @NotNull(message = "支付金额不能为空")
  37 + private Integer payPrice;
  38 +
  39 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/TradeBeforeOrderCreateReqBO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.bo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.Valid;
  7 +import javax.validation.constraints.NotNull;
  8 +
  9 +/**
  10 + * 订单创建之前 Request BO
  11 + *
  12 + * @author HUIHUI
  13 + */
  14 +@Data
  15 +public class TradeBeforeOrderCreateReqBO {
  16 +
  17 + @NotNull(message = "订单类型不能为空")
  18 + private Integer orderType;
  19 +
  20 + // ========== 秒杀活动相关字段 ==========
  21 +
  22 + @Schema(description = "秒杀活动编号", example = "1024")
  23 + private Long seckillActivityId;
  24 +
  25 + // ========== 拼团活动相关字段 ==========
  26 +
  27 + @Schema(description = "拼团活动编号", example = "1024")
  28 + private Long combinationActivityId;
  29 +
  30 + @Schema(description = "拼团团长编号", example = "2048")
  31 + private Long combinationHeadId;
  32 +
  33 + @Schema(description = "砍价活动编号", example = "123")
  34 + private Long bargainActivityId;
  35 +
  36 + @NotNull(message = "购买数量不能为空")
  37 + private Integer count;
  38 +
  39 + @NotNull(message = "活动商品不能为空")
  40 + private Item item;
  41 +
  42 + @Data
  43 + @Valid
  44 + public static class Item {
  45 +
  46 + @NotNull(message = "SPU 编号不能为空")
  47 + private Long spuId;
  48 +
  49 + @NotNull(message = "SKU 编号活动商品不能为空")
  50 + private Long skuId;
  51 +
  52 + @NotNull(message = "购买数量不能为空")
  53 + private Integer count;
  54 +
  55 + }
  56 +
  57 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBargainHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.handler;
  2 +
  3 +import cn.hutool.core.util.ObjectUtil;
  4 +import cn.iocoder.yudao.module.promotion.api.bargain.BargainActivityApi;
  5 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  6 +import cn.iocoder.yudao.module.trade.service.order.bo.TradeAfterOrderCreateReqBO;
  7 +import cn.iocoder.yudao.module.trade.service.order.bo.TradeBeforeOrderCreateReqBO;
  8 +import org.springframework.stereotype.Component;
  9 +
  10 +import javax.annotation.Resource;
  11 +
  12 +/**
  13 + * 砍价订单 handler 实现类
  14 + *
  15 + * @author HUIHUI
  16 + */
  17 +@Component
  18 +public class TradeBargainHandler implements TradeOrderHandler {
  19 +
  20 + @Resource
  21 + private BargainActivityApi bargainActivityApi;
  22 +
  23 + @Override
  24 + public void beforeOrderCreate(TradeBeforeOrderCreateReqBO reqBO) {
  25 + // 如果是秒杀订单
  26 + if (ObjectUtil.notEqual(TradeOrderTypeEnum.BARGAIN.getType(), reqBO.getOrderType())) {
  27 + return;
  28 + }
  29 +
  30 + // 额外扣减砍价的库存
  31 + bargainActivityApi.updateBargainActivityStock(reqBO.getBargainActivityId(), reqBO.getCount());
  32 + }
  33 +
  34 + @Override
  35 + public void afterOrderCreate(TradeAfterOrderCreateReqBO reqBO) {
  36 +
  37 + }
  38 +
  39 + @Override
  40 + public void rollbackStock() {
  41 +
  42 + }
  43 +
  44 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCombinationHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.handler;
  2 +
  3 +import cn.hutool.core.util.ObjectUtil;
  4 +import cn.iocoder.yudao.module.promotion.api.combination.CombinationApi;
  5 +import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi;
  6 +import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
  7 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  8 +import cn.iocoder.yudao.module.trade.service.order.bo.TradeAfterOrderCreateReqBO;
  9 +import cn.iocoder.yudao.module.trade.service.order.bo.TradeBeforeOrderCreateReqBO;
  10 +import org.springframework.stereotype.Component;
  11 +
  12 +import javax.annotation.Resource;
  13 +
  14 +/**
  15 + * 拼团订单 handler 接口实现类
  16 + *
  17 + * @author HUIHUI
  18 + */
  19 +@Component
  20 +public class TradeCombinationHandler implements TradeOrderHandler {
  21 +
  22 + @Resource
  23 + private CombinationApi combinationApi;
  24 + @Resource
  25 + private CombinationRecordApi combinationRecordApi;
  26 +
  27 + @Override
  28 + public void beforeOrderCreate(TradeBeforeOrderCreateReqBO reqBO) {
  29 + // 如果是拼团订单;
  30 + if (ObjectUtil.notEqual(TradeOrderTypeEnum.COMBINATION.getType(), reqBO.getOrderType())) {
  31 + return;
  32 + }
  33 +
  34 + // 校验是否满足拼团活动相关限制
  35 + combinationApi.validateCombination(TradeOrderConvert.INSTANCE.convert1(reqBO));
  36 + }
  37 +
  38 + @Override
  39 + public void afterOrderCreate(TradeAfterOrderCreateReqBO reqBO) {
  40 + // 创建砍价记录
  41 + combinationRecordApi.createCombinationRecord(TradeOrderConvert.INSTANCE.convert(reqBO));
  42 + }
  43 +
  44 + @Override
  45 + public void rollbackStock() {
  46 +
  47 + }
  48 +
  49 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeOrderHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.handler;
  2 +
  3 +import cn.iocoder.yudao.module.trade.service.order.bo.TradeAfterOrderCreateReqBO;
  4 +import cn.iocoder.yudao.module.trade.service.order.bo.TradeBeforeOrderCreateReqBO;
  5 +
  6 +/**
  7 + * 订单活动特殊逻辑处理器 handler 接口
  8 + *
  9 + * @author HUIHUI
  10 + */
  11 +public interface TradeOrderHandler {
  12 +
  13 + /**
  14 + * 订单创建前
  15 + *
  16 + * @param reqBO 请求
  17 + */
  18 + void beforeOrderCreate(TradeBeforeOrderCreateReqBO reqBO);
  19 +
  20 + /**
  21 + * 订单创建后
  22 + *
  23 + * @param reqBO 请求
  24 + */
  25 + void afterOrderCreate(TradeAfterOrderCreateReqBO reqBO);
  26 +
  27 + /**
  28 + * 回滚活动相关库存
  29 + */
  30 + void rollbackStock();
  31 +
  32 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeSeckillHandler.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.service.order.handler;
  2 +
  3 +import cn.hutool.core.util.ObjectUtil;
  4 +import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi;
  5 +import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
  6 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  7 +import cn.iocoder.yudao.module.trade.service.order.bo.TradeAfterOrderCreateReqBO;
  8 +import cn.iocoder.yudao.module.trade.service.order.bo.TradeBeforeOrderCreateReqBO;
  9 +import org.springframework.stereotype.Component;
  10 +
  11 +import javax.annotation.Resource;
  12 +
  13 +/**
  14 + * 秒杀订单 handler 实现类
  15 + *
  16 + * @author HUIHUI
  17 + */
  18 +@Component
  19 +public class TradeSeckillHandler implements TradeOrderHandler {
  20 +
  21 + @Resource
  22 + private SeckillActivityApi seckillActivityApi;
  23 +
  24 + @Override
  25 + public void beforeOrderCreate(TradeBeforeOrderCreateReqBO reqBO) {
  26 + // 如果是秒杀订单:额外扣减秒杀的库存;
  27 + if (ObjectUtil.notEqual(TradeOrderTypeEnum.SECKILL.getType(), reqBO.getOrderType())) {
  28 + return;
  29 + }
  30 +
  31 + seckillActivityApi.updateSeckillStock(TradeOrderConvert.INSTANCE.convert(reqBO));
  32 + }
  33 +
  34 + @Override
  35 + public void afterOrderCreate(TradeAfterOrderCreateReqBO reqBO) {
  36 +
  37 + }
  38 +
  39 + @Override
  40 + public void rollbackStock() {
  41 +
  42 + }
  43 +
  44 +}