Commit 544597d6e2e53f6db9588b0754d80e90b648662d

Authored by YunaiV
1 parent d4b7f4aa

promotion:完善限时折扣,补充相关的单元测试

yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/discount/DiscountActivityConvert.java
... ... @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.promotion.convert.discount;
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 5 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityBaseVO;
6 7 import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO;
7 8 import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityRespVO;
8 9 import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityUpdateReqVO;
... ... @@ -46,4 +47,7 @@ public interface DiscountActivityConvert {
46 47 return detail;
47 48 });
48 49 }
  50 +
  51 + DiscountProductDO convert(DiscountActivityBaseVO.Product bean);
  52 +
49 53 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/discount/DiscountProductMapper.java
... ... @@ -19,4 +19,8 @@ public interface DiscountProductMapper extends BaseMapperX<DiscountProductDO> {
19 19 return selectList(DiscountProductDO::getSkuId, skuIds);
20 20 }
21 21  
  22 + default List<DiscountProductDO> selectListByActivityId(Long activityId) {
  23 + return selectList(DiscountProductDO::getActivityId, activityId);
  24 + }
  25 +
22 26 }
... ...
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/discount/DiscountActivityServiceImpl.java
1 1 package cn.iocoder.yudao.module.promotion.service.discount;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.collection.CollectionUtil;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 6 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
6 7 import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityBaseVO;
... ... @@ -22,6 +23,7 @@ import javax.annotation.Resource;
22 23 import java.util.*;
23 24  
24 25 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  26 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
25 27 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
26 28 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
27 29 import static java.util.Arrays.asList;
... ... @@ -54,10 +56,14 @@ public class DiscountActivityServiceImpl implements DiscountActivityService {
54 56 // 校验商品是否冲突
55 57 validateDiscountActivityProductConflicts(null, createReqVO.getProducts());
56 58  
57   - // 插入
  59 + // 插入活动
58 60 DiscountActivityDO discountActivity = DiscountActivityConvert.INSTANCE.convert(createReqVO)
59 61 .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime()));
60 62 discountActivityMapper.insert(discountActivity);
  63 + // 插入商品
  64 + List<DiscountProductDO> discountProducts = convertList(createReqVO.getProducts(),
  65 + product -> DiscountActivityConvert.INSTANCE.convert(product).setActivityId(discountActivity.getId()));
  66 + discountProductMapper.insertBatch(discountProducts);
61 67 // 返回
62 68 return discountActivity.getId();
63 69 }
... ... @@ -72,12 +78,34 @@ public class DiscountActivityServiceImpl implements DiscountActivityService {
72 78 // 校验商品是否冲突
73 79 validateDiscountActivityProductConflicts(updateReqVO.getId(), updateReqVO.getProducts());
74 80  
75   - // 更新
  81 + // 更新活动
76 82 DiscountActivityDO updateObj = DiscountActivityConvert.INSTANCE.convert(updateReqVO)
77 83 .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getStartTime(), updateReqVO.getEndTime()));
78 84 discountActivityMapper.updateById(updateObj);
  85 + // 更新商品
  86 + updateDiscountProduct(updateReqVO);
79 87 }
80 88  
  89 + private void updateDiscountProduct(DiscountActivityUpdateReqVO updateReqVO) {
  90 + List<DiscountProductDO> dbDiscountProducts = discountProductMapper.selectListByActivityId(updateReqVO.getId());
  91 + // 计算要删除的记录
  92 + List<Long> deleteIds = convertList(dbDiscountProducts, DiscountProductDO::getId,
  93 + discountProductDO -> updateReqVO.getProducts().stream()
  94 + .noneMatch(product -> product.getSkuId().equals(discountProductDO.getSkuId())
  95 + && product.getDiscountPrice().equals(discountProductDO.getDiscountPrice())));
  96 + if (CollUtil.isNotEmpty(deleteIds)) {
  97 + discountProductMapper.deleteBatchIds(deleteIds);
  98 + }
  99 + // 计算新增的记录
  100 + List<DiscountProductDO> newDiscountProducts = convertList(updateReqVO.getProducts(),
  101 + product -> DiscountActivityConvert.INSTANCE.convert(product).setActivityId(updateReqVO.getId()));
  102 + newDiscountProducts.removeIf(product -> dbDiscountProducts.stream().anyMatch(
  103 + dbProduct -> dbProduct.getSkuId().equals(product.getSkuId())
  104 + && dbProduct.getDiscountPrice().equals(product.getDiscountPrice()))); // 如果匹配到,说明是更新的
  105 + if (CollectionUtil.isNotEmpty(newDiscountProducts)) {
  106 + discountProductMapper.insertBatch(newDiscountProducts);
  107 + }
  108 + }
81 109  
82 110 /**
83 111 * 校验商品是否冲突
... ...
yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/discount/DiscountActivityServiceImplTest.java
... ... @@ -2,11 +2,14 @@ package cn.iocoder.yudao.module.promotion.service.discount;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityBaseVO;
5 6 import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityCreateReqVO;
6 7 import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityPageReqVO;
7 8 import cn.iocoder.yudao.module.promotion.controller.admin.discount.vo.DiscountActivityUpdateReqVO;
8 9 import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO;
  10 +import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO;
9 11 import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountActivityMapper;
  12 +import cn.iocoder.yudao.module.promotion.dal.mysql.discount.DiscountProductMapper;
10 13 import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum;
11 14 import org.junit.jupiter.api.Test;
12 15 import org.springframework.context.annotation.Import;
... ... @@ -14,6 +17,7 @@ import org.springframework.context.annotation.Import;
14 17 import javax.annotation.Resource;
15 18 import java.time.Duration;
16 19 import java.util.Date;
  20 +import java.util.List;
17 21  
18 22 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime;
19 23 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
... ... @@ -23,6 +27,7 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServic
23 27 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
24 28 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
25 29 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.DISCOUNT_ACTIVITY_NOT_EXISTS;
  30 +import static java.util.Arrays.asList;
26 31 import static org.junit.jupiter.api.Assertions.*;
27 32  
28 33 /**
... ... @@ -38,6 +43,8 @@ public class DiscountActivityServiceImplTest extends BaseDbUnitTest {
38 43  
39 44 @Resource
40 45 private DiscountActivityMapper discountActivityMapper;
  46 + @Resource
  47 + private DiscountProductMapper discountProductMapper;
41 48  
42 49 @Test
43 50 public void testCreateDiscountActivity_success() {
... ... @@ -45,32 +52,87 @@ public class DiscountActivityServiceImplTest extends BaseDbUnitTest {
45 52 DiscountActivityCreateReqVO reqVO = randomPojo(DiscountActivityCreateReqVO.class, o -> {
46 53 // 用于触发进行中的状态
47 54 o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2)));
  55 + // 设置商品
  56 + o.setProducts(asList(new DiscountActivityBaseVO.Product().setSpuId(1L).setSkuId(2L).setDiscountPrice(3),
  57 + new DiscountActivityBaseVO.Product().setSpuId(10L).setSkuId(20L).setDiscountPrice(30)));
48 58 });
49 59  
50 60 // 调用
51 61 Long discountActivityId = discountActivityService.createDiscountActivity(reqVO);
52 62 // 断言
53 63 assertNotNull(discountActivityId);
54   - // 校验记录的属性是否正确
  64 + // 校验活动
55 65 DiscountActivityDO discountActivity = discountActivityMapper.selectById(discountActivityId);
56 66 assertPojoEquals(reqVO, discountActivity);
  67 + assertEquals(discountActivity.getStatus(), PromotionActivityStatusEnum.WAIT.getStatus());
  68 + // 校验商品
  69 + List<DiscountProductDO> discountProducts = discountProductMapper.selectList(DiscountProductDO::getActivityId, discountActivity.getId());
  70 + assertEquals(discountProducts.size(), reqVO.getProducts().size());
  71 + for (int i = 0; i < reqVO.getProducts().size(); i++) {
  72 + DiscountActivityBaseVO.Product product = reqVO.getProducts().get(i);
  73 + DiscountProductDO discountProduct = discountProducts.get(i);
  74 + assertEquals(discountProduct.getActivityId(), discountActivity.getId());
  75 + assertEquals(discountProduct.getSpuId(), product.getSpuId());
  76 + assertEquals(discountProduct.getSkuId(), product.getSkuId());
  77 + assertEquals(discountProduct.getDiscountPrice(), product.getDiscountPrice());
  78 + }
57 79 }
58 80  
59 81 @Test
60 82 public void testUpdateDiscountActivity_success() {
61   - // mock 数据
  83 + // mock 数据(商品)
62 84 DiscountActivityDO dbDiscountActivity = randomPojo(DiscountActivityDO.class);
63 85 discountActivityMapper.insert(dbDiscountActivity);// @Sql: 先插入出一条存在的数据
  86 + // mock 数据(活动)
  87 + DiscountProductDO dbDiscountProduct01 = randomPojo(DiscountProductDO.class, o -> o.setActivityId(dbDiscountActivity.getId())
  88 + .setSpuId(1L).setSkuId(2L));
  89 + DiscountProductDO dbDiscountProduct02 = randomPojo(DiscountProductDO.class, o -> o.setActivityId(dbDiscountActivity.getId())
  90 + .setSpuId(10L).setSkuId(20L));
  91 + discountProductMapper.insert(dbDiscountProduct01);
  92 + discountProductMapper.insert(dbDiscountProduct02);
64 93 // 准备参数
65 94 DiscountActivityUpdateReqVO reqVO = randomPojo(DiscountActivityUpdateReqVO.class, o -> {
66 95 o.setId(dbDiscountActivity.getId()); // 设置更新的 ID
  96 + // 用于触发进行中的状态
  97 + o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2)));
  98 + // 设置商品
  99 + o.setProducts(asList(new DiscountActivityBaseVO.Product().setSpuId(1L).setSkuId(2L).setDiscountPrice(3),
  100 + new DiscountActivityBaseVO.Product().setSpuId(100L).setSkuId(200L).setDiscountPrice(30)));
67 101 });
68 102  
69 103 // 调用
70 104 discountActivityService.updateDiscountActivity(reqVO);
71   - // 校验是否更新正确
  105 + // 校验活动
72 106 DiscountActivityDO discountActivity = discountActivityMapper.selectById(reqVO.getId()); // 获取最新的
73 107 assertPojoEquals(reqVO, discountActivity);
  108 + assertEquals(discountActivity.getStatus(), PromotionActivityStatusEnum.WAIT.getStatus());
  109 + // 校验商品
  110 + List<DiscountProductDO> discountProducts = discountProductMapper.selectList(DiscountProductDO::getActivityId, discountActivity.getId());
  111 + assertEquals(discountProducts.size(), reqVO.getProducts().size());
  112 + for (int i = 0; i < reqVO.getProducts().size(); i++) {
  113 + DiscountActivityBaseVO.Product product = reqVO.getProducts().get(i);
  114 + DiscountProductDO discountProduct = discountProducts.get(i);
  115 + assertEquals(discountProduct.getActivityId(), discountActivity.getId());
  116 + assertEquals(discountProduct.getSpuId(), product.getSpuId());
  117 + assertEquals(discountProduct.getSkuId(), product.getSkuId());
  118 + assertEquals(discountProduct.getDiscountPrice(), product.getDiscountPrice());
  119 + }
  120 + }
  121 +
  122 + @Test
  123 + public void testCloseDiscountActivity() {
  124 + // mock 数据
  125 + DiscountActivityDO dbDiscountActivity = randomPojo(DiscountActivityDO.class,
  126 + o -> o.setStatus(PromotionActivityStatusEnum.WAIT.getStatus()));
  127 + discountActivityMapper.insert(dbDiscountActivity);// @Sql: 先插入出一条存在的数据
  128 + // 准备参数
  129 + Long id = dbDiscountActivity.getId();
  130 +
  131 + // 调用
  132 + discountActivityService.closeRewardActivity(id);
  133 + // 校验状态
  134 + DiscountActivityDO discountActivity = discountActivityMapper.selectById(id);
  135 + assertEquals(discountActivity.getStatus(), PromotionActivityStatusEnum.CLOSE.getStatus());
74 136 }
75 137  
76 138 @Test
... ... @@ -85,7 +147,8 @@ public class DiscountActivityServiceImplTest extends BaseDbUnitTest {
85 147 @Test
86 148 public void testDeleteDiscountActivity_success() {
87 149 // mock 数据
88   - DiscountActivityDO dbDiscountActivity = randomPojo(DiscountActivityDO.class);
  150 + DiscountActivityDO dbDiscountActivity = randomPojo(DiscountActivityDO.class,
  151 + o -> o.setStatus(PromotionActivityStatusEnum.CLOSE.getStatus()));
89 152 discountActivityMapper.insert(dbDiscountActivity);// @Sql: 先插入出一条存在的数据
90 153 // 准备参数
91 154 Long id = dbDiscountActivity.getId();
... ...