Commit a10d77cdfeb008a95b310178066d1ea14aa23be9

Authored by puhui999
1 parent 9358639c

mall+order: 完善部分 TODO 提到的问题

Showing 29 changed files with 131 additions and 275 deletions
yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/sku/dto/ProductSkuRespDTO.java
@@ -59,14 +59,13 @@ public class ProductSkuRespDTO { @@ -59,14 +59,13 @@ public class ProductSkuRespDTO {
59 * 商品体积,单位:m^3 平米 59 * 商品体积,单位:m^3 平米
60 */ 60 */
61 private Double volume; 61 private Double volume;
62 - // TODO @puhui999:firstBrokeragePrice ;尴尬,我当时打错了;secondBrokeragePrice  
63 /** 62 /**
64 * 一级分销的佣金,单位:分 63 * 一级分销的佣金,单位:分
65 */ 64 */
66 - private Integer firstBrokerageRecord; 65 + private Integer firstBrokeragePrice;
67 /** 66 /**
68 * 二级分销的佣金,单位:分 67 * 二级分销的佣金,单位:分
69 */ 68 */
70 - private Integer secondBrokerageRecord; 69 + private Integer secondBrokeragePrice;
71 70
72 } 71 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/vo/ProductSkuBaseVO.java
@@ -51,10 +51,10 @@ public class ProductSkuBaseVO { @@ -51,10 +51,10 @@ public class ProductSkuBaseVO {
51 private Double volume; 51 private Double volume;
52 52
53 @Schema(description = "一级分销的佣金,单位:分", example = "199") 53 @Schema(description = "一级分销的佣金,单位:分", example = "199")
54 - private Integer firstBrokerageRecord; 54 + private Integer firstBrokeragePrice;
55 55
56 @Schema(description = "二级分销的佣金,单位:分", example = "19") 56 @Schema(description = "二级分销的佣金,单位:分", example = "19")
57 - private Integer secondBrokerageRecord; 57 + private Integer secondBrokeragePrice;
58 58
59 @Schema(description = "属性数组") 59 @Schema(description = "属性数组")
60 private List<Property> properties; 60 private List<Property> properties;
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/sku/ProductSkuDO.java
@@ -81,11 +81,11 @@ public class ProductSkuDO extends BaseDO { @@ -81,11 +81,11 @@ public class ProductSkuDO extends BaseDO {
81 /** 81 /**
82 * 一级分销的佣金,单位:分 82 * 一级分销的佣金,单位:分
83 */ 83 */
84 - private Integer firstBrokerageRecord; 84 + private Integer firstBrokeragePrice;
85 /** 85 /**
86 * 二级分销的佣金,单位:分 86 * 二级分销的佣金,单位:分
87 */ 87 */
88 - private Integer secondBrokerageRecord; 88 + private Integer secondBrokeragePrice;
89 89
90 // ========== 营销相关字段 ========= 90 // ========== 营销相关字段 =========
91 91
yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImplTest.java
@@ -92,8 +92,8 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { @@ -92,8 +92,8 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest {
92 o.setMarketPrice(generaInt()); 92 o.setMarketPrice(generaInt());
93 o.setStock(generaInt()); 93 o.setStock(generaInt());
94 o.setWarnStock(10); 94 o.setWarnStock(10);
95 - o.setFirstBrokerageRecord(generaInt());  
96 - o.setSecondBrokerageRecord(generaInt()); 95 + o.setFirstBrokeragePrice(generaInt());
  96 + o.setSecondBrokeragePrice(generaInt());
97 // 限制分数为两位数 97 // 限制分数为两位数
98 o.setWeight(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP)); 98 o.setWeight(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP));
99 o.setVolume(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP)); 99 o.setVolume(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP));
@@ -143,8 +143,8 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest { @@ -143,8 +143,8 @@ public class ProductSpuServiceImplTest extends BaseDbUnitTest {
143 o.setMarketPrice(generaInt()); 143 o.setMarketPrice(generaInt());
144 o.setStock(generaInt()); 144 o.setStock(generaInt());
145 o.setWarnStock(10); 145 o.setWarnStock(10);
146 - o.setFirstBrokerageRecord(generaInt());  
147 - o.setSecondBrokerageRecord(generaInt()); 146 + o.setFirstBrokeragePrice(generaInt());
  147 + o.setSecondBrokeragePrice(generaInt());
148 // 限制分数为两位数 148 // 限制分数为两位数
149 o.setWeight(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP)); 149 o.setWeight(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP));
150 o.setVolume(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP)); 150 o.setVolume(RandomUtil.randomDouble(10,2, RoundingMode.HALF_UP));
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationApi.java renamed to yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationActivityApi.java
1 package cn.iocoder.yudao.module.promotion.api.combination; 1 package cn.iocoder.yudao.module.promotion.api.combination;
2 2
3 -import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationActivityUpdateStockReqDTO;  
4 -  
5 -// TODO @puhui999:是不是改成 CombinationActivityApi  
6 /** 3 /**
7 * 拼团活动 Api 接口 4 * 拼团活动 Api 接口
8 * 5 *
9 * @author HUIHUI 6 * @author HUIHUI
10 */ 7 */
11 -public interface CombinationApi { 8 +public interface CombinationActivityApi {
12 9
13 /** 10 /**
14 - * 更新活动库存 11 + * 校验是否满足拼团条件
15 * 12 *
16 - * @param reqDTO 请求 13 + * @param activityId 活动编号
  14 + * @param userId 用户编号
  15 + * @param skuId sku 编号
  16 + * @param count 数量
17 */ 17 */
18 - // TODO @puhui999:应该是更新哇?还是校验哈;  
19 - void validateCombination(CombinationActivityUpdateStockReqDTO reqDTO); 18 + void validateCombination(Long activityId, Long userId, Long skuId, Integer count);
20 19
21 } 20 }
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationRecordApi.java
1 package cn.iocoder.yudao.module.promotion.api.combination; 1 package cn.iocoder.yudao.module.promotion.api.combination;
2 2
3 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO; 3 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
4 -import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordRespDTO;  
5 4
6 import javax.validation.Valid; 5 import javax.validation.Valid;
7 import java.time.LocalDateTime; 6 import java.time.LocalDateTime;
8 -import java.util.List;  
9 7
10 // TODO @芋艿:后面也再撸撸这几个接口 8 // TODO @芋艿:后面也再撸撸这几个接口
11 9
@@ -33,26 +31,7 @@ public interface CombinationRecordApi { @@ -33,26 +31,7 @@ public interface CombinationRecordApi {
33 boolean isCombinationRecordSuccess(Long userId, Long orderId); 31 boolean isCombinationRecordSuccess(Long userId, Long orderId);
34 32
35 /** 33 /**
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);  
53 -  
54 - /**  
55 - * 更新拼团状态为成功 34 + * 更新拼团状态为 成功
56 * 35 *
57 * @param userId 用户编号 36 * @param userId 用户编号
58 * @param orderId 订单编号 37 * @param orderId 订单编号
@@ -60,7 +39,7 @@ public interface CombinationRecordApi { @@ -60,7 +39,7 @@ public interface CombinationRecordApi {
60 void updateRecordStatusToSuccess(Long userId, Long orderId); 39 void updateRecordStatusToSuccess(Long userId, Long orderId);
61 40
62 /** 41 /**
63 - * 更新拼团状态为失败 42 + * 更新拼团状态为 失败
64 * 43 *
65 * @param userId 用户编号 44 * @param userId 用户编号
66 * @param orderId 订单编号 45 * @param orderId 订单编号
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/dto/CombinationActivityUpdateStockReqDTO.java deleted
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 - // TODO @puhui999:是不是一个 activityId、count、skuId 参数就完事啦。  
17 -  
18 - @NotNull(message = "活动编号不能为空")  
19 - private Long activityId;  
20 -  
21 - @NotNull(message = "购买数量不能为空")  
22 - private Integer count;  
23 -  
24 - @NotNull(message = "活动商品不能为空")  
25 - private Item item;  
26 -  
27 - @Data  
28 - @Valid  
29 - public static class Item {  
30 -  
31 - @NotNull(message = "SPU 编号不能为空")  
32 - private Long spuId;  
33 -  
34 - @NotNull(message = "SKU 编号活动商品不能为空")  
35 - private Long skuId;  
36 -  
37 - @NotNull(message = "购买数量不能为空")  
38 - private Integer count;  
39 -  
40 - }  
41 -  
42 -}  
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/dto/CombinationRecordCreateReqDTO.java
@@ -13,26 +13,39 @@ import javax.validation.constraints.NotNull; @@ -13,26 +13,39 @@ import javax.validation.constraints.NotNull;
13 @Data 13 @Data
14 public class CombinationRecordCreateReqDTO { 14 public class CombinationRecordCreateReqDTO {
15 15
16 - // TODO @puhui999:注释还是要的哈  
17 - 16 + /**
  17 + * 拼团活动编号
  18 + */
18 @NotNull(message = "拼团活动编号不能为空") 19 @NotNull(message = "拼团活动编号不能为空")
19 private Long activityId; 20 private Long activityId;
20 - 21 + /**
  22 + * spu 编号
  23 + */
21 @NotNull(message = "spu 编号不能为空") 24 @NotNull(message = "spu 编号不能为空")
22 private Long spuId; 25 private Long spuId;
23 - 26 + /**
  27 + * sku 编号
  28 + */
24 @NotNull(message = "sku 编号不能为空") 29 @NotNull(message = "sku 编号不能为空")
25 private Long skuId; 30 private Long skuId;
26 - 31 + /**
  32 + * 订单编号
  33 + */
27 @NotNull(message = "订单编号不能为空") 34 @NotNull(message = "订单编号不能为空")
28 private Long orderId; 35 private Long orderId;
29 - 36 + /**
  37 + * 用户编号
  38 + */
30 @NotNull(message = "用户编号不能为空") 39 @NotNull(message = "用户编号不能为空")
31 private Long userId; 40 private Long userId;
32 - 41 + /**
  42 + * 团长编号
  43 + */
33 @NotNull(message = "团长编号不能为空") 44 @NotNull(message = "团长编号不能为空")
34 private Long headId; 45 private Long headId;
35 - 46 + /**
  47 + * 拼团商品单价
  48 + */
36 @NotNull(message = "拼团商品单价不能为空") 49 @NotNull(message = "拼团商品单价不能为空")
37 private Integer combinationPrice; 50 private Integer combinationPrice;
38 51
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/seckill/SeckillActivityApi.java
1 package cn.iocoder.yudao.module.promotion.api.seckill; 1 package cn.iocoder.yudao.module.promotion.api.seckill;
2 2
3 -import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillActivityUpdateStockReqDTO;  
4 -  
5 /** 3 /**
6 * 秒杀活动 API 接口 4 * 秒杀活动 API 接口
7 * 5 *
@@ -12,8 +10,10 @@ public interface SeckillActivityApi { @@ -12,8 +10,10 @@ public interface SeckillActivityApi {
12 /** 10 /**
13 * 更新秒杀库存 11 * 更新秒杀库存
14 * 12 *
15 - * @param updateStockReqDTO 请求 13 + * @param activityId 活动编号
  14 + * @param skuId sku 编号
  15 + * @param count 数量
16 */ 16 */
17 - void updateSeckillStock(SeckillActivityUpdateStockReqDTO updateStockReqDTO); 17 + void updateSeckillStock(Long activityId, Long skuId, Integer count);
18 18
19 } 19 }
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/seckill/dto/SeckillActivityUpdateStockReqDTO.java deleted
1 -package cn.iocoder.yudao.module.promotion.api.seckill.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 SeckillActivityUpdateStockReqDTO {  
15 -  
16 - // TODO @puhui999:可以不用 dto,直接 activityId、skuId、count 即可  
17 -  
18 - @NotNull(message = "活动编号不能为空")  
19 - private Long activityId;  
20 -  
21 - @NotNull(message = "购买数量不能为空")  
22 - private Integer count;  
23 -  
24 - @NotNull(message = "活动商品不能为空")  
25 - private Item item;  
26 -  
27 - @Data  
28 - @Valid  
29 - public static class Item {  
30 -  
31 - @NotNull(message = "SPU 编号不能为空")  
32 - private Long spuId;  
33 -  
34 - @NotNull(message = "SKU 编号活动商品不能为空")  
35 - private Long skuId;  
36 -  
37 - @NotNull(message = "购买数量不能为空")  
38 - private Integer count;  
39 -  
40 - }  
41 -  
42 -}  
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationApiImpl.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationActivityApiImpl.java
1 package cn.iocoder.yudao.module.promotion.api.combination; 1 package cn.iocoder.yudao.module.promotion.api.combination;
2 2
3 -import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationActivityUpdateStockReqDTO;  
4 import cn.iocoder.yudao.module.promotion.service.combination.CombinationActivityService; 3 import cn.iocoder.yudao.module.promotion.service.combination.CombinationActivityService;
  4 +import org.springframework.stereotype.Service;
5 5
6 import javax.annotation.Resource; 6 import javax.annotation.Resource;
7 7
@@ -10,14 +10,15 @@ import javax.annotation.Resource; @@ -10,14 +10,15 @@ import javax.annotation.Resource;
10 * 10 *
11 * @author HUIHUI 11 * @author HUIHUI
12 */ 12 */
13 -public class CombinationApiImpl implements CombinationApi { 13 +@Service
  14 +public class CombinationActivityApiImpl implements CombinationActivityApi {
14 15
15 @Resource 16 @Resource
16 private CombinationActivityService activityService; 17 private CombinationActivityService activityService;
17 18
18 @Override 19 @Override
19 - public void validateCombination(CombinationActivityUpdateStockReqDTO reqDTO) {  
20 - activityService.validateCombination(reqDTO); 20 + public void validateCombination(Long activityId, Long userId, Long skuId, Integer count) {
  21 + activityService.validateCombination(activityId, userId, skuId, count);
21 } 22 }
22 23
23 } 24 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/combination/CombinationRecordApiImpl.java
1 package cn.iocoder.yudao.module.promotion.api.combination; 1 package cn.iocoder.yudao.module.promotion.api.combination;
2 2
3 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO; 3 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
4 -import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordRespDTO;  
5 -import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert;  
6 import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum; 4 import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;
7 import cn.iocoder.yudao.module.promotion.service.combination.CombinationRecordService; 5 import cn.iocoder.yudao.module.promotion.service.combination.CombinationRecordService;
8 import org.springframework.stereotype.Service; 6 import org.springframework.stereotype.Service;
9 7
10 import javax.annotation.Resource; 8 import javax.annotation.Resource;
11 import java.time.LocalDateTime; 9 import java.time.LocalDateTime;
12 -import java.util.List;  
13 10
14 /** 11 /**
15 * 拼团活动 API 实现类 12 * 拼团活动 API 实现类
@@ -33,16 +30,6 @@ public class CombinationRecordApiImpl implements CombinationRecordApi { @@ -33,16 +30,6 @@ public class CombinationRecordApiImpl implements CombinationRecordApi {
33 } 30 }
34 31
35 @Override 32 @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  
46 public void updateRecordStatusToSuccess(Long userId, Long orderId) { 33 public void updateRecordStatusToSuccess(Long userId, Long orderId) {
47 recordService.updateCombinationRecordStatusByUserIdAndOrderId(CombinationRecordStatusEnum.SUCCESS.getStatus(), userId, orderId); 34 recordService.updateCombinationRecordStatusByUserIdAndOrderId(CombinationRecordStatusEnum.SUCCESS.getStatus(), userId, orderId);
48 } 35 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/seckill/SeckillActivityApiImpl.java
1 package cn.iocoder.yudao.module.promotion.api.seckill; 1 package cn.iocoder.yudao.module.promotion.api.seckill;
2 2
3 -import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillActivityUpdateStockReqDTO;  
4 import cn.iocoder.yudao.module.promotion.service.seckill.SeckillActivityService; 3 import cn.iocoder.yudao.module.promotion.service.seckill.SeckillActivityService;
5 import org.springframework.stereotype.Service; 4 import org.springframework.stereotype.Service;
6 5
@@ -18,8 +17,8 @@ public class SeckillActivityApiImpl implements SeckillActivityApi { @@ -18,8 +17,8 @@ public class SeckillActivityApiImpl implements SeckillActivityApi {
18 private SeckillActivityService activityService; 17 private SeckillActivityService activityService;
19 18
20 @Override 19 @Override
21 - public void updateSeckillStock(SeckillActivityUpdateStockReqDTO updateStockReqDTO) {  
22 - activityService.updateSeckillStock(updateStockReqDTO); 20 + public void updateSeckillStock(Long activityId, Long skuId, Integer count) {
  21 + activityService.updateSeckillStock(activityId, skuId, count);
23 } 22 }
24 23
25 } 24 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/combination/CombinationActivityConvert.java
@@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.promotion.convert.combination; @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.promotion.convert.combination;
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 import cn.iocoder.yudao.framework.common.util.collection.MapUtils; 5 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
  6 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
  7 +import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
6 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; 8 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
7 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO; 9 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
8 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordRespDTO; 10 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordRespDTO;
@@ -92,6 +94,19 @@ public interface CombinationActivityConvert { @@ -92,6 +94,19 @@ public interface CombinationActivityConvert {
92 94
93 CombinationRecordDO convert(CombinationRecordCreateReqDTO reqDTO); 95 CombinationRecordDO convert(CombinationRecordCreateReqDTO reqDTO);
94 96
  97 + default CombinationRecordDO convert1(CombinationRecordCreateReqDTO reqDTO, CombinationActivityDO activity, MemberUserRespDTO user,
  98 + ProductSpuRespDTO spu, ProductSkuRespDTO sku) {
  99 + CombinationRecordDO record = convert(reqDTO);
  100 + record.setVirtualGroup(false);
  101 + record.setExpireTime(record.getStartTime().plusHours(activity.getLimitDuration()));
  102 + record.setUserSize(activity.getUserSize());
  103 + record.setNickname(user.getNickname());
  104 + record.setAvatar(user.getAvatar());
  105 + record.setSpuName(spu.getName());
  106 + record.setPicUrl(sku.getPicUrl());
  107 + return record;
  108 + }
  109 +
95 List<CombinationRecordRespDTO> convert(List<CombinationRecordDO> bean); 110 List<CombinationRecordRespDTO> convert(List<CombinationRecordDO> bean);
96 111
97 } 112 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/bargain/BargainActivityMapper.java
@@ -39,7 +39,7 @@ public interface BargainActivityMapper extends BaseMapperX&lt;BargainActivityDO&gt; { @@ -39,7 +39,7 @@ public interface BargainActivityMapper extends BaseMapperX&lt;BargainActivityDO&gt; {
39 default int updateActivityStock(Long id, int count) { 39 default int updateActivityStock(Long id, int count) {
40 return update(null, new LambdaUpdateWrapper<BargainActivityDO>() 40 return update(null, new LambdaUpdateWrapper<BargainActivityDO>()
41 .eq(BargainActivityDO::getId, id) 41 .eq(BargainActivityDO::getId, id)
42 - .gt(BargainActivityDO::getStock, 0) // TODO @puhui999:不是 > 0,是要大于 count 哈 42 + .gt(BargainActivityDO::getStock, count)
43 .setSql("stock = stock - " + count)); 43 .setSql("stock = stock - " + count));
44 } 44 }
45 45
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillProductMapper.java
@@ -34,7 +34,7 @@ public interface SeckillProductMapper extends BaseMapperX&lt;SeckillProductDO&gt; { @@ -34,7 +34,7 @@ public interface SeckillProductMapper extends BaseMapperX&lt;SeckillProductDO&gt; {
34 default int updateActivityStock(Long id, int count) { 34 default int updateActivityStock(Long id, int count) {
35 return update(null, new LambdaUpdateWrapper<SeckillProductDO>() 35 return update(null, new LambdaUpdateWrapper<SeckillProductDO>()
36 .eq(SeckillProductDO::getId, id) 36 .eq(SeckillProductDO::getId, id)
37 - .gt(SeckillProductDO::getStock, 0) // TODO @puhui999:不是 > 0,是要大于 count 哈 37 + .gt(SeckillProductDO::getStock, count)
38 .setSql("stock = stock - " + count)); 38 .setSql("stock = stock - " + count));
39 } 39 }
40 40
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;  
5 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO; 4 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO;
6 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO; 5 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO;
7 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO; 6 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO;
@@ -74,10 +73,13 @@ public interface CombinationActivityService { @@ -74,10 +73,13 @@ public interface CombinationActivityService {
74 List<CombinationProductDO> getCombinationProductsByActivityIds(Collection<Long> activityIds); 73 List<CombinationProductDO> getCombinationProductsByActivityIds(Collection<Long> activityIds);
75 74
76 /** 75 /**
77 - * 更新拼图活动库存 76 + * 校验是否满足拼团条件
78 * 77 *
79 - * @param reqDTO 请求 78 + * @param activityId 活动编号
  79 + * @param userId 用户编号
  80 + * @param skuId sku 编号
  81 + * @param count 数量
80 */ 82 */
81 - void validateCombination(CombinationActivityUpdateStockReqDTO reqDTO); 83 + void validateCombination(Long activityId, Long userId, Long skuId, Integer count);
82 84
83 } 85 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImpl.java
@@ -9,7 +9,6 @@ import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi; @@ -9,7 +9,6 @@ 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;  
13 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO; 12 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO;
14 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO; 13 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO;
15 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO; 14 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO;
@@ -33,7 +32,6 @@ import java.util.Map; @@ -33,7 +32,6 @@ import java.util.Map;
33 32
34 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 33 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
35 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; 34 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
36 -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;  
37 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS; 35 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
38 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS; 36 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
39 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; 37 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
@@ -85,7 +83,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic @@ -85,7 +83,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
85 /** 83 /**
86 * 校验拼团商品参与的活动是否存在冲突 84 * 校验拼团商品参与的活动是否存在冲突
87 * 85 *
88 - * @param spuId 商品 SPU 编号 86 + * @param spuId 商品 SPU 编号
89 * @param activityId 拼团活动编号 87 * @param activityId 拼团活动编号
90 */ 88 */
91 private void validateProductConflict(Long spuId, Long activityId) { 89 private void validateProductConflict(Long spuId, Long activityId) {
@@ -104,7 +102,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic @@ -104,7 +102,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
104 /** 102 /**
105 * 校验拼团商品是否都存在 103 * 校验拼团商品是否都存在
106 * 104 *
107 - * @param spuId 商品 SPU 编号 105 + * @param spuId 商品 SPU 编号
108 * @param products 拼团商品 106 * @param products 拼团商品
109 */ 107 */
110 private void validateProductExists(Long spuId, List<CombinationProductBaseVO> products) { 108 private void validateProductExists(Long spuId, List<CombinationProductBaseVO> products) {
@@ -149,7 +147,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic @@ -149,7 +147,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
149 * 更新拼团商品 147 * 更新拼团商品
150 * 148 *
151 * @param activity 拼团活动 149 * @param activity 拼团活动
152 - * @param products 该活动的最新商品配置 150 + * @param products 该活动的最新商品配置
153 */ 151 */
154 private void updateCombinationProduct(CombinationActivityDO activity, List<CombinationProductBaseVO> products) { 152 private void updateCombinationProduct(CombinationActivityDO activity, List<CombinationProductBaseVO> products) {
155 // 第一步,对比新老数据,获得添加、修改、删除的列表 153 // 第一步,对比新老数据,获得添加、修改、删除的列表
@@ -214,35 +212,34 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic @@ -214,35 +212,34 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
214 } 212 }
215 213
216 @Override 214 @Override
217 - public void validateCombination(CombinationActivityUpdateStockReqDTO reqDTO) { 215 + public void validateCombination(Long activityId, Long userId, Long skuId, Integer count) {
218 // 1.1 校验拼团活动是否存在 216 // 1.1 校验拼团活动是否存在
219 - CombinationActivityDO activity = validateCombinationActivityExists(reqDTO.getActivityId()); 217 + CombinationActivityDO activity = validateCombinationActivityExists(activityId);
220 // 1.2 校验活动是否开启 218 // 1.2 校验活动是否开启
221 if (ObjectUtil.equal(activity.getStatus(), CommonStatusEnum.DISABLE.getStatus())) { 219 if (ObjectUtil.equal(activity.getStatus(), CommonStatusEnum.DISABLE.getStatus())) {
222 throw exception(COMBINATION_ACTIVITY_STATUS_DISABLE); 220 throw exception(COMBINATION_ACTIVITY_STATUS_DISABLE);
223 } 221 }
224 // 1.3 校验是否超出单次限购数量 222 // 1.3 校验是否超出单次限购数量
225 - if (activity.getSingleLimitCount() < reqDTO.getCount()) { 223 + if (activity.getSingleLimitCount() < count) {
226 throw exception(COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED); 224 throw exception(COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED);
227 } 225 }
228 226
229 // 2. 校验是否超出总限购数量 227 // 2. 校验是否超出总限购数量
230 - // TODO @puhui999:userId 应该接口传递哈;要保证 service 无状态  
231 - List<CombinationRecordDO> recordList = combinationRecordService.getRecordListByUserIdAndActivityId(  
232 - getLoginUserId(), reqDTO.getActivityId());  
233 - // TODO @puhui999:最好 if true return;减少括号层数  
234 - if (CollUtil.isNotEmpty(recordList)) {  
235 - // 过滤出拼团成功的  
236 - // TODO @puhui999:count 要不存一个在 record 里?  
237 - List<Long> skuIds = convertList(recordList, CombinationRecordDO::getSkuId,  
238 - item -> ObjectUtil.equals(item.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus()));  
239 - Integer countSum = tradeOrderApi.getOrderItemCountSumByOrderIdAndSkuId(convertList(recordList,  
240 - CombinationRecordDO::getOrderId,  
241 - item -> ObjectUtil.equals(item.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus())), skuIds);  
242 - if (activity.getTotalLimitCount() < countSum) {  
243 - throw exception(COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED);  
244 - } 228 + List<CombinationRecordDO> recordList = combinationRecordService.getRecordListByUserIdAndActivityId(userId, activityId);
  229 + if (CollUtil.isEmpty(recordList)) {
  230 + return;
  231 + }
  232 + // 过滤出拼团成功的
  233 + // TODO @puhui999:count 要不存一个在 record 里?
  234 + List<Long> skuIds = convertList(recordList, CombinationRecordDO::getSkuId,
  235 + item -> ObjectUtil.equals(item.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus()));
  236 + Integer countSum = tradeOrderApi.getOrderItemCountSumByOrderIdAndSkuId(convertList(recordList,
  237 + CombinationRecordDO::getOrderId,
  238 + item -> ObjectUtil.equals(item.getStatus(), CombinationRecordStatusEnum.SUCCESS.getStatus())), skuIds);
  239 + if (activity.getTotalLimitCount() < countSum) {
  240 + throw exception(COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED);
245 } 241 }
  242 +
246 } 243 }
247 244
248 } 245 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordService.java
@@ -57,14 +57,4 @@ public interface CombinationRecordService { @@ -57,14 +57,4 @@ public interface CombinationRecordService {
57 */ 57 */
58 List<CombinationRecordDO> getRecordListByUserIdAndActivityId(Long userId, Long activityId); 58 List<CombinationRecordDO> getRecordListByUserIdAndActivityId(Long userId, Long activityId);
59 59
60 - /**  
61 - * 验证组合限制数  
62 - * 校验是否满足限购要求  
63 - *  
64 - * @param count 本次购买数量  
65 - * @param sumCount 已购买数量合计  
66 - * @param activityId 活动编号  
67 - */  
68 - void validateCombinationLimitCount(Long activityId, Integer count, Integer sumCount);  
69 -  
70 } 60 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java
@@ -128,19 +128,10 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { @@ -128,19 +128,10 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
128 } 128 }
129 129
130 // 2. 创建拼团记录 130 // 2. 创建拼团记录
131 - // TODO @puhui999:可以把 user、spu、sku 一起放 convert 里哈;  
132 - CombinationRecordDO record = CombinationActivityConvert.INSTANCE.convert(reqDTO);  
133 - record.setVirtualGroup(false);  
134 - record.setExpireTime(record.getStartTime().plusHours(activity.getLimitDuration()));  
135 - record.setUserSize(activity.getUserSize());  
136 MemberUserRespDTO user = memberUserApi.getUser(reqDTO.getUserId()); 131 MemberUserRespDTO user = memberUserApi.getUser(reqDTO.getUserId());
137 - record.setNickname(user.getNickname());  
138 - record.setAvatar(user.getAvatar());  
139 - ProductSpuRespDTO spu = productSpuApi.getSpu(record.getSpuId());  
140 - record.setSpuName(spu.getName());  
141 - ProductSkuRespDTO sku = productSkuApi.getSku(record.getSkuId());  
142 - record.setPicUrl(sku.getPicUrl());  
143 - recordMapper.insert(record); 132 + ProductSpuRespDTO spu = productSpuApi.getSpu(reqDTO.getSpuId());
  133 + ProductSkuRespDTO sku = productSkuApi.getSku(reqDTO.getSkuId());
  134 + recordMapper.insert(CombinationActivityConvert.INSTANCE.convert1(reqDTO, activity, user, spu, sku));
144 } 135 }
145 136
146 @Override 137 @Override
@@ -153,20 +144,6 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { @@ -153,20 +144,6 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
153 return recordMapper.selectListByUserIdAndActivityId(userId, activityId); 144 return recordMapper.selectListByUserIdAndActivityId(userId, activityId);
154 } 145 }
155 146
156 - @Override  
157 - public void validateCombinationLimitCount(Long activityId, Integer count, Integer sumCount) {  
158 - // 1.1 校验拼团活动  
159 - CombinationActivityDO activity = combinationActivityService.validateCombinationActivityExists(activityId);  
160 - // 校验是否达到限购总限购标准  
161 - if ((sumCount + count) > activity.getTotalLimitCount()) {  
162 - throw exception(COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED);  
163 - }  
164 - // 单次购买是否达到限购标准  
165 - if (count > activity.getSingleLimitCount()) {  
166 - throw exception(COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED);  
167 - }  
168 - }  
169 -  
170 /** 147 /**
171 * APP 端获取开团记录 148 * APP 端获取开团记录
172 * 149 *
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/SeckillActivityService.java
1 package cn.iocoder.yudao.module.promotion.service.seckill; 1 package cn.iocoder.yudao.module.promotion.service.seckill;
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.seckill.dto.SeckillActivityUpdateStockReqDTO;  
5 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO; 4 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO;
6 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO; 5 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO;
7 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO; 6 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO;
@@ -37,9 +36,11 @@ public interface SeckillActivityService { @@ -37,9 +36,11 @@ public interface SeckillActivityService {
37 /** 36 /**
38 * 更新秒杀库存 37 * 更新秒杀库存
39 * 38 *
40 - * @param updateStockReqDTO 更新信息 39 + * @param activityId 活动编号
  40 + * @param skuId sku 编号
  41 + * @param count 数量
41 */ 42 */
42 - void updateSeckillStock(SeckillActivityUpdateStockReqDTO updateStockReqDTO); 43 + void updateSeckillStock(Long activityId, Long skuId, Integer count);
43 44
44 /** 45 /**
45 * 关闭秒杀活动 46 * 关闭秒杀活动
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/SeckillActivityServiceImpl.java
@@ -7,7 +7,6 @@ import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi; @@ -7,7 +7,6 @@ import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
7 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; 7 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
8 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; 8 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
9 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; 9 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
10 -import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillActivityUpdateStockReqDTO;  
11 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO; 10 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO;
12 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO; 11 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO;
13 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO; 12 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO;
@@ -147,32 +146,32 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @@ -147,32 +146,32 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
147 146
148 @Override 147 @Override
149 @Transactional(rollbackFor = Exception.class) 148 @Transactional(rollbackFor = Exception.class)
150 - public void updateSeckillStock(SeckillActivityUpdateStockReqDTO updateStockReqDTO) { 149 + public void updateSeckillStock(Long activityId, Long skuId, Integer count) {
151 // 1、校验秒杀活动是否存在 150 // 1、校验秒杀活动是否存在
152 - SeckillActivityDO seckillActivity = getSeckillActivity(updateStockReqDTO.getActivityId()); 151 + SeckillActivityDO seckillActivity = getSeckillActivity(activityId);
153 // 1.1、校验库存是否充足 152 // 1.1、校验库存是否充足
154 - if (seckillActivity.getTotalStock() < updateStockReqDTO.getCount()) { 153 + if (seckillActivity.getTotalStock() < count) {
155 throw exception(SECKILL_ACTIVITY_UPDATE_STOCK_FAIL); 154 throw exception(SECKILL_ACTIVITY_UPDATE_STOCK_FAIL);
156 } 155 }
157 156
158 // 2、获取活动商品 157 // 2、获取活动商品
159 - List<SeckillProductDO> products = getSeckillProductListByActivityId(updateStockReqDTO.getActivityId()); 158 + List<SeckillProductDO> products = getSeckillProductListByActivityId(activityId);
160 // 2.1、过滤出购买的商品 159 // 2.1、过滤出购买的商品
161 - SeckillProductDO product = findFirst(products, item -> ObjectUtil.equal(updateStockReqDTO.getItem().getSkuId(), item.getSkuId())); 160 + SeckillProductDO product = findFirst(products, item -> ObjectUtil.equal(skuId, item.getSkuId()));
162 // 2.2、检查活动商品库存是否充足 161 // 2.2、检查活动商品库存是否充足
163 - boolean isSufficient = product == null || (product.getStock() == 0 || (product.getStock() < updateStockReqDTO.getItem().getCount()) || (product.getStock() - updateStockReqDTO.getItem().getCount()) < 0); 162 + boolean isSufficient = product == null || (product.getStock() == 0 || (product.getStock() < count) || (product.getStock() - count) < 0);
164 if (isSufficient) { 163 if (isSufficient) {
165 throw exception(SECKILL_ACTIVITY_UPDATE_STOCK_FAIL); 164 throw exception(SECKILL_ACTIVITY_UPDATE_STOCK_FAIL);
166 } 165 }
167 166
168 // 3、更新活动商品库存 167 // 3、更新活动商品库存
169 - int updateCount = seckillProductMapper.updateActivityStock(product.getId(), updateStockReqDTO.getItem().getCount()); 168 + int updateCount = seckillProductMapper.updateActivityStock(product.getId(), count);
170 if (updateCount == 0) { 169 if (updateCount == 0) {
171 throw exception(SECKILL_ACTIVITY_UPDATE_STOCK_FAIL); 170 throw exception(SECKILL_ACTIVITY_UPDATE_STOCK_FAIL);
172 } 171 }
173 172
174 // 4、更新活动库存 173 // 4、更新活动库存
175 - updateCount = seckillActivityMapper.updateActivityStock(seckillActivity.getId(), updateStockReqDTO.getCount()); 174 + updateCount = seckillActivityMapper.updateActivityStock(seckillActivity.getId(), count);
176 if (updateCount == 0) { 175 if (updateCount == 0) {
177 throw exception(SECKILL_ACTIVITY_UPDATE_STOCK_FAIL); 176 throw exception(SECKILL_ACTIVITY_UPDATE_STOCK_FAIL);
178 } 177 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
@@ -14,9 +14,7 @@ import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDT @@ -14,9 +14,7 @@ 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;  
18 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO; 17 import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
19 -import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillActivityUpdateStockReqDTO;  
20 import cn.iocoder.yudao.module.trade.api.order.dto.TradeOrderRespDTO; 18 import cn.iocoder.yudao.module.trade.api.order.dto.TradeOrderRespDTO;
21 import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO; 19 import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO;
22 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO; 20 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO;
@@ -280,15 +278,9 @@ public interface TradeOrderConvert { @@ -280,15 +278,9 @@ public interface TradeOrderConvert {
280 return new BrokerageAddReqBO().setBizId(String.valueOf(item.getId())).setSourceUserId(item.getUserId()) 278 return new BrokerageAddReqBO().setBizId(String.valueOf(item.getId())).setSourceUserId(item.getUserId())
281 .setBasePrice(item.getPayPrice() * item.getCount()) 279 .setBasePrice(item.getPayPrice() * item.getCount())
282 .setTitle(BrokerageRecordBizTypeEnum.ORDER.getTitle()) // TODO @疯狂:标题类似:木晴冰雪成功购买云时代的JVM原理与实战;茫农成功购买深入拆解消息队列47讲 280 .setTitle(BrokerageRecordBizTypeEnum.ORDER.getTitle()) // TODO @疯狂:标题类似:木晴冰雪成功购买云时代的JVM原理与实战;茫农成功购买深入拆解消息队列47讲
283 - .setFirstFixedPrice(sku.getFirstBrokerageRecord()).setSecondFixedPrice(sku.getSecondBrokerageRecord()); 281 + .setFirstFixedPrice(sku.getFirstBrokeragePrice()).setSecondFixedPrice(sku.getSecondBrokeragePrice());
284 } 282 }
285 283
286 - @Mapping(target = "activityId", source = "reqBO.seckillActivityId")  
287 - SeckillActivityUpdateStockReqDTO convert(TradeBeforeOrderCreateReqBO reqBO);  
288 -  
289 - @Mapping(target = "activityId", source = "reqBO.combinationActivityId")  
290 - CombinationActivityUpdateStockReqDTO convert1(TradeBeforeOrderCreateReqBO reqBO);  
291 -  
292 TradeBeforeOrderCreateReqBO convert(AppTradeOrderCreateReqVO createReqVO); 284 TradeBeforeOrderCreateReqBO convert(AppTradeOrderCreateReqVO createReqVO);
293 285
294 @Mappings({ 286 @Mappings({
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
@@ -180,9 +180,10 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -180,9 +180,10 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
180 @Transactional(rollbackFor = Exception.class) 180 @Transactional(rollbackFor = Exception.class)
181 public TradeOrderDO createOrder(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO) { 181 public TradeOrderDO createOrder(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO) {
182 // 1、执行订单创建前置处理器 182 // 1、执行订单创建前置处理器
183 - // TODO @puhui999:最好也抽个 beforeOrderCreate 方法; 183 + // TODO @puhui999:最好也抽个 beforeOrderCreate 方法;不要 BO 各自处理参数岂不美哉?
184 TradeBeforeOrderCreateReqBO beforeOrderCreateReqBO = TradeOrderConvert.INSTANCE.convert(createReqVO); 184 TradeBeforeOrderCreateReqBO beforeOrderCreateReqBO = TradeOrderConvert.INSTANCE.convert(createReqVO);
185 beforeOrderCreateReqBO.setOrderType(validateActivity(createReqVO)); 185 beforeOrderCreateReqBO.setOrderType(validateActivity(createReqVO));
  186 + beforeOrderCreateReqBO.setUserId(userId);
186 beforeOrderCreateReqBO.setCount(getSumValue(createReqVO.getItems(), AppTradeOrderSettlementReqVO.Item::getCount, Integer::sum)); 187 beforeOrderCreateReqBO.setCount(getSumValue(createReqVO.getItems(), AppTradeOrderSettlementReqVO.Item::getCount, Integer::sum));
187 // TODO @puhui999:这里有个纠结点;handler 的定义是只处理指定类型的订单的拓展逻辑;还是通用的 handler,类似可以处理优惠劵等等 188 // TODO @puhui999:这里有个纠结点;handler 的定义是只处理指定类型的订单的拓展逻辑;还是通用的 handler,类似可以处理优惠劵等等
188 tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(beforeOrderCreateReqBO)); 189 tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(beforeOrderCreateReqBO));
@@ -726,7 +727,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -726,7 +727,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
726 } 727 }
727 728
728 // TODO 活动相关库存回滚需要活动 id,活动 id 怎么获取?app 端能否传过来 729 // TODO 活动相关库存回滚需要活动 id,活动 id 怎么获取?app 端能否传过来
729 - tradeOrderHandlers.forEach(handler -> handler.rollbackStock()); 730 + tradeOrderHandlers.forEach(handler -> handler.rollback());
730 731
731 // 2.回滚库存 732 // 2.回滚库存
732 List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(id); 733 List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(id);
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/bo/TradeBeforeOrderCreateReqBO.java
@@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.trade.service.order.bo; @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.trade.service.order.bo;
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 -import javax.validation.Valid;  
7 import javax.validation.constraints.NotNull; 6 import javax.validation.constraints.NotNull;
8 7
9 // TODO 芋艿:在想想这些参数的定义 8 // TODO 芋艿:在想想这些参数的定义
@@ -34,25 +33,16 @@ public class TradeBeforeOrderCreateReqBO { @@ -34,25 +33,16 @@ public class TradeBeforeOrderCreateReqBO {
34 @Schema(description = "砍价活动编号", example = "123") 33 @Schema(description = "砍价活动编号", example = "123")
35 private Long bargainActivityId; 34 private Long bargainActivityId;
36 35
37 - @NotNull(message = "购买数量不能为空")  
38 - private Integer count;  
39 -  
40 - @NotNull(message = "活动商品不能为空")  
41 - private Item item;  
42 -  
43 - @Data  
44 - @Valid  
45 - public static class Item { 36 + @NotNull(message = "SPU 编号不能为空")
  37 + private Long spuId;
46 38
47 - @NotNull(message = "SPU 编号不能为空")  
48 - private Long spuId; 39 + @NotNull(message = "SKU 编号活动商品不能为空")
  40 + private Long skuId;
49 41
50 - @NotNull(message = "SKU 编号活动商品不能为空")  
51 - private Long skuId; 42 + @NotNull(message = "用户编号不能为空")
  43 + private Long userId;
52 44
53 - @NotNull(message = "购买数量不能为空")  
54 - private Integer count;  
55 -  
56 - } 45 + @NotNull(message = "购买数量不能为空")
  46 + private Integer count;
57 47
58 } 48 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBargainHandler.java
@@ -22,7 +22,7 @@ public class TradeBargainHandler implements TradeOrderHandler { @@ -22,7 +22,7 @@ public class TradeBargainHandler implements TradeOrderHandler {
22 22
23 @Override 23 @Override
24 public void beforeOrderCreate(TradeBeforeOrderCreateReqBO reqBO) { 24 public void beforeOrderCreate(TradeBeforeOrderCreateReqBO reqBO) {
25 - // 如果是秒杀订单 25 + // 如果是砍价订单
26 if (ObjectUtil.notEqual(TradeOrderTypeEnum.BARGAIN.getType(), reqBO.getOrderType())) { 26 if (ObjectUtil.notEqual(TradeOrderTypeEnum.BARGAIN.getType(), reqBO.getOrderType())) {
27 return; 27 return;
28 } 28 }
@@ -37,7 +37,7 @@ public class TradeBargainHandler implements TradeOrderHandler { @@ -37,7 +37,7 @@ public class TradeBargainHandler implements TradeOrderHandler {
37 } 37 }
38 38
39 @Override 39 @Override
40 - public void rollbackStock() { 40 + public void rollback() {
41 41
42 } 42 }
43 43
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCombinationHandler.java
1 package cn.iocoder.yudao.module.trade.service.order.handler; 1 package cn.iocoder.yudao.module.trade.service.order.handler;
2 2
3 import cn.hutool.core.util.ObjectUtil; 3 import cn.hutool.core.util.ObjectUtil;
4 -import cn.iocoder.yudao.module.promotion.api.combination.CombinationApi; 4 +import cn.iocoder.yudao.module.promotion.api.combination.CombinationActivityApi;
5 import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi; 5 import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi;
6 import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; 6 import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
7 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; 7 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
@@ -20,7 +20,7 @@ import javax.annotation.Resource; @@ -20,7 +20,7 @@ import javax.annotation.Resource;
20 public class TradeCombinationHandler implements TradeOrderHandler { 20 public class TradeCombinationHandler implements TradeOrderHandler {
21 21
22 @Resource 22 @Resource
23 - private CombinationApi combinationApi; 23 + private CombinationActivityApi combinationActivityApi;
24 @Resource 24 @Resource
25 private CombinationRecordApi combinationRecordApi; 25 private CombinationRecordApi combinationRecordApi;
26 26
@@ -32,7 +32,7 @@ public class TradeCombinationHandler implements TradeOrderHandler { @@ -32,7 +32,7 @@ public class TradeCombinationHandler implements TradeOrderHandler {
32 } 32 }
33 33
34 // 校验是否满足拼团活动相关限制 34 // 校验是否满足拼团活动相关限制
35 - combinationApi.validateCombination(TradeOrderConvert.INSTANCE.convert1(reqBO)); 35 + combinationActivityApi.validateCombination(reqBO.getCombinationActivityId(), reqBO.getUserId(), reqBO.getSkuId(), reqBO.getCount());
36 } 36 }
37 37
38 @Override 38 @Override
@@ -42,7 +42,7 @@ public class TradeCombinationHandler implements TradeOrderHandler { @@ -42,7 +42,7 @@ public class TradeCombinationHandler implements TradeOrderHandler {
42 } 42 }
43 43
44 @Override 44 @Override
45 - public void rollbackStock() { 45 + public void rollback() {
46 46
47 } 47 }
48 48
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeOrderHandler.java
@@ -25,8 +25,8 @@ public interface TradeOrderHandler { @@ -25,8 +25,8 @@ public interface TradeOrderHandler {
25 void afterOrderCreate(TradeAfterOrderCreateReqBO reqBO); 25 void afterOrderCreate(TradeAfterOrderCreateReqBO reqBO);
26 26
27 /** 27 /**
28 - * 回滚活动相关库存 28 + * 回滚
29 */ 29 */
30 - void rollbackStock(); 30 + void rollback();
31 31
32 } 32 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeSeckillHandler.java
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.trade.service.order.handler; @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.trade.service.order.handler;
2 2
3 import cn.hutool.core.util.ObjectUtil; 3 import cn.hutool.core.util.ObjectUtil;
4 import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi; 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; 5 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
7 import cn.iocoder.yudao.module.trade.service.order.bo.TradeAfterOrderCreateReqBO; 6 import cn.iocoder.yudao.module.trade.service.order.bo.TradeAfterOrderCreateReqBO;
8 import cn.iocoder.yudao.module.trade.service.order.bo.TradeBeforeOrderCreateReqBO; 7 import cn.iocoder.yudao.module.trade.service.order.bo.TradeBeforeOrderCreateReqBO;
@@ -28,7 +27,7 @@ public class TradeSeckillHandler implements TradeOrderHandler { @@ -28,7 +27,7 @@ public class TradeSeckillHandler implements TradeOrderHandler {
28 return; 27 return;
29 } 28 }
30 29
31 - seckillActivityApi.updateSeckillStock(TradeOrderConvert.INSTANCE.convert(reqBO)); 30 + seckillActivityApi.updateSeckillStock(reqBO.getSeckillActivityId(), reqBO.getSkuId(), reqBO.getCount());
32 } 31 }
33 32
34 @Override 33 @Override
@@ -37,7 +36,7 @@ public class TradeSeckillHandler implements TradeOrderHandler { @@ -37,7 +36,7 @@ public class TradeSeckillHandler implements TradeOrderHandler {
37 } 36 }
38 37
39 @Override 38 @Override
40 - public void rollbackStock() { 39 + public void rollback() {
41 40
42 } 41 }
43 42