Commit 5c2723c7bfd26d1b431cdc669e77f1647a0e5a90

Authored by puhui999
1 parent de828e3d

fix: 修复合并差异

Showing 12 changed files with 107 additions and 364 deletions
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/api/bargain/BargainRecordApiImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.api.bargain;
  2 +
  3 +import cn.iocoder.yudao.module.promotion.api.bargain.dto.BargainRecordCreateReqDTO;
  4 +import org.springframework.stereotype.Service;
  5 +
  6 +/**
  7 + * 砍价活动 API 实现类 TODO @puhui999
  8 + *
  9 + * @author HUIHUI
  10 + */
  11 +@Service
  12 +public class BargainRecordApiImpl implements BargainRecordApi {
  13 +
  14 + @Override
  15 + public void createRecord(BargainRecordCreateReqDTO reqDTO) {
  16 +
  17 + }
  18 +
  19 + @Override
  20 + public boolean validateRecordSuccess(Long userId, Long orderId) {
  21 + return false;
  22 + }
  23 +
  24 +}
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/bargain/BargainActivityController.java
... ... @@ -4,12 +4,12 @@ import cn.hutool.core.collection.CollUtil;
4 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 6 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
7   -import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
8   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityCreateReqVO;
9   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityPageReqVO;
10   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityRespVO;
11   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityUpdateReqVO;
  7 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityBaseVO;
  8 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityPageReqVO;
  9 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityRespVO;
  10 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO;
12 11 import cn.iocoder.yudao.module.promotion.convert.bargain.BargainActivityConvert;
  12 +import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
13 13 import cn.iocoder.yudao.module.promotion.service.bargain.BargainActivityService;
14 14 import io.swagger.v3.oas.annotations.Operation;
15 15 import io.swagger.v3.oas.annotations.Parameter;
... ... @@ -20,8 +20,6 @@ import org.springframework.web.bind.annotation.*;
20 20  
21 21 import javax.annotation.Resource;
22 22 import javax.validation.Valid;
23   -import java.util.Collections;
24   -import java.util.List;
25 23  
26 24 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
27 25  
... ... @@ -40,7 +38,7 @@ public class BargainActivityController {
40 38 @PostMapping("/create")
41 39 @Operation(summary = "创建砍价活动")
42 40 @PreAuthorize("@ss.hasPermission('promotion:bargain-activity:create')")
43   - public CommonResult<Long> createBargainActivity(@Valid @RequestBody BargainActivityCreateReqVO createReqVO) {
  41 + public CommonResult<Long> createBargainActivity(@Valid @RequestBody BargainActivityBaseVO createReqVO) {
44 42 return success(activityService.createBargainActivity(createReqVO));
45 43 }
46 44  
... ... @@ -79,14 +77,6 @@ public class BargainActivityController {
79 77 if (CollUtil.isEmpty(pageResult.getList())) {
80 78 return success(PageResult.empty(pageResult.getTotal()));
81 79 }
82   -
83   - // 拼接数据
84   -// List<BargainProductDO> products = activityService.getBargainProductsByActivityIds(
85   -// convertSet(pageResult.getList(), BargainActivityDO::getId));
86   - List<BargainProductDO> products = Collections.emptyList();
87   - List<ProductSpuRespDTO> spus = productSpuApi.getSpuList(
88   - convertSet(pageResult.getList(), BargainActivityDO::getSpuId));
89   - return success(BargainActivityConvert.INSTANCE.convertPage(pageResult, products, spus));
90 80 return success(BargainActivityConvert.INSTANCE.convertPage(activityService.getBargainActivityPage(pageVO)));
91 81 }
92 82  
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/bargain/BargainActivityConvert.java
1 1 package cn.iocoder.yudao.module.promotion.convert.bargain;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityCreateReqVO;
  4 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityBaseVO;
5 5 import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityRespVO;
6 6 import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO;
7 7 import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
... ... @@ -20,7 +20,7 @@ public interface BargainActivityConvert {
20 20  
21 21 BargainActivityConvert INSTANCE = Mappers.getMapper(BargainActivityConvert.class);
22 22  
23   - BargainActivityDO convert(BargainActivityCreateReqVO bean);
  23 + BargainActivityDO convert(BargainActivityBaseVO bean);
24 24  
25 25 BargainActivityDO convert(BargainActivityUpdateReqVO bean);
26 26  
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/combination/CombinationActivityConvert.java
... ... @@ -11,7 +11,6 @@ import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activit
11 11 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO;
12 12 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.product.CombinationProductBaseVO;
13 13 import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.product.CombinationProductRespVO;
14   -import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.product.CombinationProductUpdateReqVO;
15 14 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
16 15 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationProductDO;
17 16 import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationRecordDO;
... ... @@ -73,7 +72,7 @@ public interface CombinationActivityConvert {
73 72 @Mapping(target = "activityId", source = "activity.id"),
74 73 @Mapping(target = "spuId", source = "activity.spuId"),
75 74 @Mapping(target = "skuId", source = "product.skuId"),
76   - @Mapping(target = "activePrice", source = "product.activePrice"),
  75 + @Mapping(target = "combinationPrice", source = "product.combinationPrice"),
77 76 @Mapping(target = "activityStartTime", source = "activity.startTime"),
78 77 @Mapping(target = "activityEndTime", source = "activity.endTime")
79 78 })
... ... @@ -83,7 +82,7 @@ public interface CombinationActivityConvert {
83 82 return CollectionUtils.convertList(products, item -> convert(activity, item).setActivityStatus(activity.getStatus()));
84 83 }
85 84  
86   - default List<CombinationProductDO> convertList(List<CombinationProductUpdateReqVO> updateProductVOs,
  85 + default List<CombinationProductDO> convertList(List<CombinationProductBaseVO> updateProductVOs,
87 86 List<CombinationProductDO> products, CombinationActivityDO activity) {
88 87 Map<Long, Long> productMap = convertMap(products, CombinationProductDO::getSkuId, CombinationProductDO::getId);
89 88 return CollectionUtils.convertList(updateProductVOs, updateProductVO -> convert(activity, updateProductVO)
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckillactivity/SeckillActivityConvert.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  5 +import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
5 6 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
6 7 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO;
7 8 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityDetailRespVO;
... ... @@ -40,11 +41,14 @@ public interface SeckillActivityConvert {
40 41 PageResult<SeckillActivityRespVO> convertPage(PageResult<SeckillActivityDO> page);
41 42  
42 43 default PageResult<SeckillActivityRespVO> convertPage(PageResult<SeckillActivityDO> page, List<SeckillProductDO> seckillProducts, List<ProductSpuRespDTO> spuList) {
43   - Map<Long, ProductSpuRespDTO> spuMap = CollectionUtils.convertMap(spuList, ProductSpuRespDTO::getId, c -> c);
  44 + Map<Long, ProductSpuRespDTO> spuMap = CollectionUtils.convertMap(spuList, ProductSpuRespDTO::getId);
44 45 PageResult<SeckillActivityRespVO> pageResult = convertPage(page);
45 46 pageResult.getList().forEach(item -> {
46   - item.setSpuName(spuMap.get(item.getSpuId()).getName());
47   - item.setPicUrl(spuMap.get(item.getSpuId()).getPicUrl());
  47 + MapUtils.findAndThen(spuMap, item.getSpuId(), spu -> {
  48 + item.setSpuName(spu.getName());
  49 + item.setPicUrl(spu.getPicUrl());
  50 + });
  51 +
48 52 item.setProducts(convertList2(seckillProducts));
49 53 });
50 54 return pageResult;
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainActivityService.java
1 1 package cn.iocoder.yudao.module.promotion.service.bargain;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityCreateReqVO;
  4 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityBaseVO;
5 5 import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityPageReqVO;
6 6 import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO;
7 7 import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
... ... @@ -21,7 +21,7 @@ public interface BargainActivityService {
21 21 * @param createReqVO 创建信息
22 22 * @return 编号
23 23 */
24   - Long createBargainActivity(@Valid BargainActivityCreateReqVO createReqVO);
  24 + Long createBargainActivity(@Valid BargainActivityBaseVO createReqVO);
25 25  
26 26 /**
27 27 * 更新砍价活动
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainActivityServiceImpl.java
... ... @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
10 10 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
11 11 import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
12 12 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
13   -import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityCreateReqVO;
  13 +import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityBaseVO;
14 14 import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityPageReqVO;
15 15 import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO;
16 16 import cn.iocoder.yudao.module.promotion.convert.bargain.BargainActivityConvert;
... ... @@ -37,7 +37,8 @@ import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
37 37 */
38 38 @Service
39 39 @Validated
40   -public class BargainServiceImpl implements BargainActivityService, BargainRecordService {
  40 +public class BargainActivityServiceImpl implements BargainActivityService {
  41 +
41 42  
42 43 @Resource
43 44 private BargainActivityMapper bargainActivityMapper;
... ... @@ -57,7 +58,7 @@ public class BargainServiceImpl implements BargainActivityService, BargainRecord
57 58  
58 59 @Override
59 60 @Transactional(rollbackFor = Exception.class)
60   - public Long createBargainActivity(BargainActivityCreateReqVO createReqVO) {
  61 + public Long createBargainActivity(BargainActivityBaseVO createReqVO) {
61 62 // 校验商品 SPU 是否存在是否参加的别的活动
62 63 validateBargainConflict(createReqVO.getSpuId(), null);
63 64 // 获取所选 spu下的所有 sku
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainRecordService.java
... ... @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.promotion.service.bargain;
2 2  
3 3  
4 4 /**
5   - * 商品活动记录 service
  5 + * 砍价记录 service 接口
6 6 *
7 7 * @author HUIHUI
8 8 */
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/bargain/BargainRecordServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.service.bargain;
  2 +
  3 +import org.springframework.stereotype.Service;
  4 +import org.springframework.validation.annotation.Validated;
  5 +
  6 +/**
  7 + * 砍价记录 Service 实现类
  8 + *
  9 + * @author HUIHUI
  10 + */
  11 +@Service
  12 +@Validated
  13 +public class BargainRecordServiceImpl implements BargainRecordService {
  14 +}
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java
... ... @@ -14,11 +14,11 @@ import org.springframework.transaction.annotation.Transactional;
14 14 import org.springframework.validation.annotation.Validated;
15 15  
16 16 import javax.annotation.Resource;
  17 +import java.time.LocalDateTime;
17 18 import java.util.List;
18 19  
19 20 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
20 21 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
21   -import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.COMBINATION_RECORD_USER_FULL;
22 22  
23 23 // TODO 芋艿:等拼团记录做完,完整 review 下
24 24 /**
... ... @@ -37,6 +37,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
37 37 private CombinationRecordMapper recordMapper;
38 38  
39 39 @Override
  40 + @Transactional(rollbackFor = Exception.class)
40 41 public void updateCombinationRecordStatusByUserIdAndOrderId(CombinationRecordUpdateStatusReqDTO reqDTO) {
41 42 // 校验拼团是否存在
42 43 CombinationRecordDO recordDO = validateCombinationRecord(reqDTO.getUserId(), reqDTO.getOrderId());
... ... @@ -80,6 +81,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
80 81 }
81 82  
82 83 @Override
  84 + @Transactional(rollbackFor = Exception.class)
83 85 public void createCombinationRecord(CombinationRecordCreateReqDTO reqDTO) {
84 86 // 1.1 校验拼团活动
85 87 CombinationActivityDO activity = combinationActivityService.validateCombinationActivityExists(reqDTO.getActivityId());
... ... @@ -88,9 +90,19 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
88 90 if (recordDO != null) {
89 91 throw exception(COMBINATION_RECORD_EXISTS);
90 92 }
91   - // 1.3 父拼团是否存在,是否已经满了
  93 + // 1.3 校验用户是否参加了其它拼团
  94 + List<CombinationRecordDO> recordDOList = recordMapper.selectListByUserIdAndStatus(reqDTO.getUserId(), CombinationRecordStatusEnum.IN_PROGRESS.getStatus());
  95 + if (CollUtil.isNotEmpty(recordDOList)) {
  96 + throw exception(COMBINATION_RECORD_FAILED_HAVE_JOINED);
  97 + }
  98 + // 1.4 校验当前活动是否过期
  99 + if (LocalDateTime.now().isAfter(activity.getEndTime())) {
  100 + throw exception(COMBINATION_RECORD_FAILED_TIME_END);
  101 + }
  102 + // 1.5 父拼团是否存在,是否已经满了
92 103 if (reqDTO.getHeadId() != null) {
93   - CombinationRecordDO recordDO1 = recordMapper.selectRecordByHeadId(reqDTO.getHeadId(), reqDTO.getActivityId(), CombinationRecordStatusEnum.IN_PROGRESS.getStatus());
  104 + // 查询进行中的父拼团
  105 + CombinationRecordDO recordDO1 = recordMapper.selectOneByHeadId(reqDTO.getHeadId(), CombinationRecordStatusEnum.IN_PROGRESS.getStatus());
94 106 if (recordDO1 == null) {
95 107 throw exception(COMBINATION_RECORD_HEAD_NOT_EXISTS);
96 108 }
... ... @@ -99,7 +111,6 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
99 111 throw exception(COMBINATION_RECORD_USER_FULL);
100 112 }
101 113 }
102   - // TODO @puhui999:应该还有一些校验,后续补噶;例如说,一个团,自己已经参与进去了,不能再参与进去;
103 114  
104 115 // 2. 创建拼团记录
105 116 CombinationRecordDO record = CombinationActivityConvert.INSTANCE.convert(reqDTO);
... ... @@ -115,6 +126,25 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
115 126 return validateCombinationRecord(userId, orderId);
116 127 }
117 128  
  129 + @Override
  130 + public List<CombinationRecordDO> getRecordListByUserIdAndActivityId(Long userId, Long activityId) {
  131 + return recordMapper.selectListByUserIdAndActivityId(userId, activityId);
  132 + }
  133 +
  134 + @Override
  135 + public void validateCombinationLimitCount(Long activityId, Integer count, Integer sumCount) {
  136 + // 1.1 校验拼团活动
  137 + CombinationActivityDO activity = combinationActivityService.validateCombinationActivityExists(activityId);
  138 + // 校验是否达到限购总限购标准
  139 + if ((sumCount + count) > activity.getTotalLimitCount()) {
  140 + throw exception(COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED);
  141 + }
  142 + // 单次购买是否达到限购标准
  143 + if (count > activity.getSingleLimitCount()) {
  144 + throw exception(COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED);
  145 + }
  146 + }
  147 +
118 148 /**
119 149 * APP 端获取开团记录
120 150 *
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationServiceImpl.java deleted
1   -package cn.iocoder.yudao.module.promotion.service.combination;
2   -
3   -import cn.hutool.core.collection.CollUtil;
4   -import cn.hutool.core.collection.CollectionUtil;
5   -import cn.hutool.core.util.ObjectUtil;
6   -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
7   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
8   -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
9   -import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
10   -import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
11   -import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
12   -import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
13   -import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
14   -import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUpdateStatusReqDTO;
15   -import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityCreateReqVO;
16   -import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO;
17   -import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO;
18   -import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.product.CombinationProductCreateReqVO;
19   -import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.product.CombinationProductUpdateReqVO;
20   -import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert;
21   -import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
22   -import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationProductDO;
23   -import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationRecordDO;
24   -import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationActivityMapper;
25   -import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationProductMapper;
26   -import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationRecordMapper;
27   -import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;
28   -import org.springframework.stereotype.Service;
29   -import org.springframework.transaction.annotation.Transactional;
30   -import org.springframework.validation.annotation.Validated;
31   -
32   -import javax.annotation.Resource;
33   -import java.time.LocalDateTime;
34   -import java.util.Collection;
35   -import java.util.List;
36   -
37   -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
38   -import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
39   -import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
40   -import static cn.iocoder.yudao.module.promotion.util.PromotionUtils.validateProductSkuAllExists;
41   -
42   -/**
43   - * 拼团活动 Service 实现类
44   - *
45   - * @author HUIHUI
46   - */
47   -@Service
48   -@Validated
49   -public class CombinationServiceImpl implements CombinationActivityService, CombinationRecordService {
50   -
51   - @Resource
52   - private CombinationActivityMapper combinationActivityMapper;
53   - @Resource
54   - private CombinationRecordMapper recordMapper;
55   - @Resource
56   - private CombinationProductMapper combinationProductMapper;
57   - @Resource
58   - private ProductSpuApi productSpuApi;
59   - @Resource
60   - private ProductSkuApi productSkuApi;
61   -
62   - @Override
63   - @Transactional(rollbackFor = Exception.class)
64   - public Long createCombinationActivity(CombinationActivityCreateReqVO createReqVO) {
65   - // 校验商品 SPU 是否存在是否参加的别的活动
66   - validateProductCombinationConflict(createReqVO.getSpuId(), null);
67   - // 获取所选 spu下的所有 sku
68   - List<ProductSkuRespDTO> skus = productSkuApi.getSkuListBySpuId(CollectionUtil.newArrayList(createReqVO.getSpuId()));
69   - // 校验商品 sku 是否存在
70   - validateProductSkuAllExists(skus, createReqVO.getProducts(), CombinationProductCreateReqVO::getSkuId);
71   -
72   - // 插入拼团活动
73   - CombinationActivityDO activityDO = CombinationActivityConvert.INSTANCE.convert(createReqVO);
74   - // TODO 营销相关属性初始化 拼团成功更新相关属性
75   - activityDO.setTotalNum(0);
76   - activityDO.setSuccessNum(0);
77   - activityDO.setOrderUserCount(0);
78   - activityDO.setVirtualGroup(0);
79   - activityDO.setStatus(CommonStatusEnum.ENABLE.getStatus());
80   - combinationActivityMapper.insert(activityDO);
81   - // 插入商品
82   - List<CombinationProductDO> productDOs = CombinationActivityConvert.INSTANCE.convertList(createReqVO.getProducts(), activityDO);
83   - combinationProductMapper.insertBatch(productDOs);
84   - // 返回
85   - return activityDO.getId();
86   - }
87   -
88   - private void validateProductCombinationConflict(Long spuId, Long activityId) {
89   - // 校验商品 spu 是否存在
90   - List<ProductSpuRespDTO> spuList = productSpuApi.getSpuList(CollUtil.newArrayList(spuId));
91   - if (CollUtil.isEmpty(spuList)) {
92   - throw exception(SPU_NOT_EXISTS);
93   - }
94   - // 查询所有开启的拼团活动
95   - List<CombinationActivityDO> activityDOs = combinationActivityMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus());
96   - // 更新时排除自己
97   - if (activityId != null) {
98   - activityDOs.removeIf(item -> ObjectUtil.equal(item.getId(), activityId));
99   - }
100   - // 过滤出所有 spuIds 有交集的活动
101   - List<CombinationActivityDO> doList = CollectionUtils.convertList(activityDOs, c -> c, s -> ObjectUtil.equal(s.getId(), spuId));
102   - if (CollUtil.isNotEmpty(doList)) {
103   - throw exception(COMBINATION_ACTIVITY_SPU_CONFLICTS);
104   - }
105   - }
106   -
107   - @Override
108   - @Transactional(rollbackFor = Exception.class)
109   - public void updateCombinationActivity(CombinationActivityUpdateReqVO updateReqVO) {
110   - // 校验存在
111   - CombinationActivityDO activityDO = validateCombinationActivityExists(updateReqVO.getId());
112   - // 校验状态
113   - if (ObjectUtil.equal(activityDO.getStatus(), CommonStatusEnum.DISABLE.getStatus())) {
114   - throw exception(COMBINATION_ACTIVITY_STATUS_DISABLE);
115   - }
116   - // 校验商品冲突
117   - validateProductCombinationConflict(updateReqVO.getSpuId(), updateReqVO.getId());
118   - // 获取所选 spu下的所有 sku
119   - List<ProductSkuRespDTO> skus = productSkuApi.getSkuListBySpuId(CollectionUtil.newArrayList(updateReqVO.getSpuId()));
120   - // 校验商品 sku 是否存在
121   - validateProductSkuAllExists(skus, updateReqVO.getProducts(), CombinationProductUpdateReqVO::getSkuId);
122   -
123   - // 更新
124   - CombinationActivityDO updateObj = CombinationActivityConvert.INSTANCE.convert(updateReqVO);
125   - combinationActivityMapper.updateById(updateObj);
126   - // 更新商品
127   - updateCombinationProduct(updateObj, updateReqVO.getProducts());
128   - }
129   -
130   - /**
131   - * 更新拼团商品
132   - *
133   - * @param activity 拼团活动
134   - * @param products 该活动的最新商品配置
135   - */
136   - private void updateCombinationProduct(CombinationActivityDO activity, List<CombinationProductUpdateReqVO> products) {
137   - // 第一步,对比新老数据,获得添加、修改、删除的列表
138   - List<CombinationProductDO> newList = CombinationActivityConvert.INSTANCE.convertList(products, activity);
139   - List<CombinationProductDO> oldList = combinationProductMapper.selectListByActivityIds(CollUtil.newArrayList(activity.getId()));
140   - List<List<CombinationProductDO>> diffList = CollectionUtils.diffList(oldList, newList, (oldVal, newVal) -> {
141   - boolean same = ObjectUtil.equal(oldVal.getSkuId(), newVal.getSkuId());
142   - if (same) {
143   - newVal.setId(oldVal.getId());
144   - }
145   - return same;
146   - });
147   -
148   - // 第二步,批量添加、修改、删除
149   - if (CollUtil.isNotEmpty(diffList.get(0))) {
150   - combinationProductMapper.insertBatch(diffList.get(0));
151   - }
152   - if (CollUtil.isNotEmpty(diffList.get(1))) {
153   - combinationProductMapper.updateBatch(diffList.get(1));
154   - }
155   - if (CollUtil.isNotEmpty(diffList.get(2))) {
156   - combinationProductMapper.deleteBatchIds(CollectionUtils.convertList(diffList.get(2), CombinationProductDO::getId));
157   - }
158   - }
159   -
160   - @Override
161   - @Transactional(rollbackFor = Exception.class)
162   - public void deleteCombinationActivity(Long id) {
163   - // 校验存在
164   - CombinationActivityDO activityDO = validateCombinationActivityExists(id);
165   - // 校验状态
166   - if (ObjectUtil.equal(activityDO.getStatus(), CommonStatusEnum.ENABLE.getStatus())) {
167   - throw exception(COMBINATION_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END);
168   - }
169   -
170   - // 删除
171   - combinationActivityMapper.deleteById(id);
172   - }
173   -
174   - private CombinationActivityDO validateCombinationActivityExists(Long id) {
175   - CombinationActivityDO activityDO = combinationActivityMapper.selectById(id);
176   - if (activityDO == null) {
177   - throw exception(COMBINATION_ACTIVITY_NOT_EXISTS);
178   - }
179   - return activityDO;
180   - }
181   -
182   - @Override
183   - public CombinationActivityDO getCombinationActivity(Long id) {
184   - return validateCombinationActivityExists(id);
185   - }
186   -
187   - @Override
188   - public List<CombinationActivityDO> getCombinationActivityList(Collection<Long> ids) {
189   - return combinationActivityMapper.selectBatchIds(ids);
190   - }
191   -
192   - @Override
193   - public PageResult<CombinationActivityDO> getCombinationActivityPage(CombinationActivityPageReqVO pageReqVO) {
194   - return combinationActivityMapper.selectPage(pageReqVO);
195   - }
196   -
197   - @Override
198   - public List<CombinationProductDO> getCombinationProductsByActivityIds(Collection<Long> ids) {
199   - return combinationProductMapper.selectListByActivityIds(ids);
200   - }
201   -
202   - @Override
203   - @Transactional(rollbackFor = Exception.class)
204   - public void updateCombinationRecordStatusByUserIdAndOrderId(CombinationRecordUpdateStatusReqDTO reqDTO) {
205   - // 校验拼团是否存在
206   - CombinationRecordDO recordDO = validateCombinationRecord(reqDTO.getUserId(), reqDTO.getOrderId());
207   -
208   - // 更新状态
209   - recordDO.setStatus(reqDTO.getStatus());
210   - recordMapper.updateById(recordDO);
211   - }
212   -
213   - @Override
214   - @Transactional(rollbackFor = Exception.class)
215   - public void updateCombinationRecordStatusAndStartTimeByUserIdAndOrderId(CombinationRecordUpdateStatusReqDTO reqDTO) {
216   - CombinationRecordDO recordDO = validateCombinationRecord(reqDTO.getUserId(), reqDTO.getOrderId());
217   - // 更新状态
218   - recordDO.setStatus(reqDTO.getStatus());
219   - // 更新开始时间
220   - recordDO.setStartTime(reqDTO.getStartTime());
221   - recordMapper.updateById(recordDO);
222   -
223   - // 更新拼团参入人数
224   - List<CombinationRecordDO> recordDOs = recordMapper.selectListByHeadIdAndStatus(recordDO.getHeadId(), reqDTO.getStatus());
225   - if (CollUtil.isNotEmpty(recordDOs)) {
226   - recordDOs.forEach(item -> {
227   - item.setUserCount(recordDOs.size());
228   - // 校验拼团是否满足要求
229   - if (ObjectUtil.equal(recordDOs.size(), recordDO.getUserSize())) {
230   - item.setStatus(CombinationRecordStatusEnum.SUCCESS.getStatus());
231   - }
232   - });
233   - }
234   - recordMapper.updateBatch(recordDOs);
235   - }
236   -
237   - private CombinationRecordDO validateCombinationRecord(Long userId, Long orderId) {
238   - // 校验拼团是否存在
239   - CombinationRecordDO recordDO = recordMapper.selectByUserIdAndOrderId(userId, orderId);
240   - if (recordDO == null) {
241   - throw exception(COMBINATION_RECORD_NOT_EXISTS);
242   - }
243   - return recordDO;
244   - }
245   -
246   - @Override
247   - @Transactional(rollbackFor = Exception.class)
248   - public void createCombinationRecord(CombinationRecordCreateReqDTO reqDTO) {
249   - // 1.1 校验拼团活动
250   - CombinationActivityDO activity = validateCombinationActivityExists(reqDTO.getActivityId());
251   - // 1.2 需要校验下,他当前是不是已经参加了该拼团;
252   - CombinationRecordDO recordDO = recordMapper.selectByUserIdAndOrderId(reqDTO.getUserId(), reqDTO.getOrderId());
253   - if (recordDO != null) {
254   - throw exception(COMBINATION_RECORD_EXISTS);
255   - }
256   - // 1.3 校验用户是否参加了其它拼团
257   - List<CombinationRecordDO> recordDOList = recordMapper.selectListByUserIdAndStatus(reqDTO.getUserId(), CombinationRecordStatusEnum.IN_PROGRESS.getStatus());
258   - if (CollUtil.isNotEmpty(recordDOList)) {
259   - throw exception(COMBINATION_RECORD_FAILED_HAVE_JOINED);
260   - }
261   - // 1.4 校验当前活动是否过期
262   - if (LocalDateTime.now().isAfter(activity.getEndTime())) {
263   - throw exception(COMBINATION_RECORD_FAILED_TIME_END);
264   - }
265   - // 1.5 父拼团是否存在,是否已经满了
266   - if (reqDTO.getHeadId() != null) {
267   - // 查询进行中的父拼团
268   - CombinationRecordDO recordDO1 = recordMapper.selectOneByHeadId(reqDTO.getHeadId(), CombinationRecordStatusEnum.IN_PROGRESS.getStatus());
269   - if (recordDO1 == null) {
270   - throw exception(COMBINATION_RECORD_HEAD_NOT_EXISTS);
271   - }
272   - // 校验拼团是否满足要求
273   - if (ObjectUtil.equal(recordDO1.getUserCount(), recordDO1.getUserSize())) {
274   - throw exception(COMBINATION_RECORD_USER_FULL);
275   - }
276   - }
277   -
278   - // 2. 创建拼团记录
279   - CombinationRecordDO record = CombinationActivityConvert.INSTANCE.convert(reqDTO);
280   - record.setVirtualGroup(false);
281   - // TODO @puhui999:过期时间,应该是 Date 哈;
282   - record.setExpireTime(activity.getLimitDuration());
283   - record.setUserSize(activity.getUserSize());
284   - recordMapper.insert(record);
285   - }
286   -
287   - @Override
288   - public CombinationRecordDO getCombinationRecord(Long userId, Long orderId) {
289   - return validateCombinationRecord(userId, orderId);
290   - }
291   -
292   - /**
293   - * APP 端获取开团记录
294   - *
295   - * @return 开团记录
296   - */
297   - public List<CombinationRecordDO> getRecordListByStatus(Integer status) {
298   - return recordMapper.selectListByStatus(status);
299   - }
300   -
301   - public List<CombinationRecordDO> getRecordListByUserIdAndActivityId(Long userId, Long activityId) {
302   - return recordMapper.selectListByUserIdAndActivityId(userId, activityId);
303   - }
304   -
305   - @Override
306   - public void validateCombinationLimitCount(Long activityId, Integer count, Integer sumCount) {
307   - // 1.1 校验拼团活动
308   - CombinationActivityDO activity = validateCombinationActivityExists(activityId);
309   - // 校验是否达到限购总限购标准
310   - if ((sumCount + count) > activity.getTotalLimitCount()) {
311   - throw exception(COMBINATION_RECORD_FAILED_TOTAL_LIMIT_COUNT_EXCEED);
312   - }
313   - // 单次购买是否达到限购标准
314   - if (count > activity.getSingleLimitCount()) {
315   - throw exception(COMBINATION_RECORD_FAILED_SINGLE_LIMIT_COUNT_EXCEED);
316   - }
317   - }
318   -
319   -}
yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationActivityServiceImplTest.java
... ... @@ -23,15 +23,15 @@ import static org.junit.jupiter.api.Assertions.*;
23 23  
24 24 // TODO 芋艿:等完成后,在补全单测
25 25 /**
26   - * {@link CombinationServiceImpl} 的单元测试类
  26 + * {@link CombinationActivityServiceImpl} 的单元测试类
27 27 *
28 28 * @author HUIHUI
29 29 */
30   -@Import(CombinationServiceImpl.class)
  30 +@Import(CombinationActivityServiceImpl.class)
31 31 public class CombinationActivityServiceImplTest extends BaseDbUnitTest {
32 32  
33 33 @Resource
34   - private CombinationServiceImpl combinationActivityService;
  34 + private CombinationActivityServiceImpl combinationActivityService;
35 35  
36 36 @Resource
37 37 private CombinationActivityMapper combinationActivityMapper;
... ... @@ -111,8 +111,8 @@ public class CombinationActivityServiceImplTest extends BaseDbUnitTest {
111 111 o.setStartTime(null);
112 112 o.setEndTime(null);
113 113 o.setUserSize(null);
114   - o.setTotalNum(null);
115   - o.setSuccessNum(null);
  114 + o.setTotalCount(null);
  115 + o.setSuccessCount(null);
116 116 o.setOrderUserCount(null);
117 117 o.setVirtualGroup(null);
118 118 o.setStatus(null);
... ... @@ -135,9 +135,9 @@ public class CombinationActivityServiceImplTest extends BaseDbUnitTest {
135 135 // 测试 userSize 不匹配
136 136 combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setUserSize(null)));
137 137 // 测试 totalNum 不匹配
138   - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setTotalNum(null)));
  138 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setTotalCount(null)));
139 139 // 测试 successNum 不匹配
140   - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSuccessNum(null)));
  140 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSuccessCount(null)));
141 141 // 测试 orderUserCount 不匹配
142 142 combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setOrderUserCount(null)));
143 143 // 测试 virtualGroup 不匹配
... ... @@ -173,8 +173,8 @@ public class CombinationActivityServiceImplTest extends BaseDbUnitTest {
173 173 o.setStartTime(null);
174 174 o.setEndTime(null);
175 175 o.setUserSize(null);
176   - o.setTotalNum(null);
177   - o.setSuccessNum(null);
  176 + o.setTotalCount(null);
  177 + o.setSuccessCount(null);
178 178 o.setOrderUserCount(null);
179 179 o.setVirtualGroup(null);
180 180 o.setStatus(null);
... ... @@ -197,9 +197,9 @@ public class CombinationActivityServiceImplTest extends BaseDbUnitTest {
197 197 // 测试 userSize 不匹配
198 198 combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setUserSize(null)));
199 199 // 测试 totalNum 不匹配
200   - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setTotalNum(null)));
  200 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setTotalCount(null)));
201 201 // 测试 successNum 不匹配
202   - combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSuccessNum(null)));
  202 + combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setSuccessCount(null)));
203 203 // 测试 orderUserCount 不匹配
204 204 combinationActivityMapper.insert(cloneIgnoreId(dbCombinationActivity, o -> o.setOrderUserCount(null)));
205 205 // 测试 virtualGroup 不匹配
... ...