Commit 79304b3a7383cb1dc060e01b87e584efc82dc94f
1 parent
74b6ff1e
promotion:增加满减送活动的排重校验、单元测试
Showing
11 changed files
with
228 additions
and
88 deletions
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
| ... | ... | @@ -29,5 +29,6 @@ public interface ErrorCodeConstants { |
| 29 | 29 | |
| 30 | 30 | // ========== 满减送活动 1003006000 ========== |
| 31 | 31 | ErrorCode REWARD_ACTIVITY_NOT_EXISTS = new ErrorCode(1003006000, "满减送活动不存在"); |
| 32 | + ErrorCode REWARD_ACTIVITY_SPU_CONFLICTS = new ErrorCode(1003006001, "商品({}) 已经参加满减送活动({})"); | |
| 32 | 33 | |
| 33 | 34 | } | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/reward/RewardActivityController.java
| ... | ... | @@ -47,18 +47,18 @@ public class RewardActivityController { |
| 47 | 47 | |
| 48 | 48 | @DeleteMapping("/delete") |
| 49 | 49 | @ApiOperation("删除满减送活动") |
| 50 | - @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Integer.class) | |
| 50 | + @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) | |
| 51 | 51 | @PreAuthorize("@ss.hasPermission('promotion:reward-activity:delete')") |
| 52 | - public CommonResult<Boolean> deleteRewardActivity(@RequestParam("id") Integer id) { | |
| 52 | + public CommonResult<Boolean> deleteRewardActivity(@RequestParam("id") Long id) { | |
| 53 | 53 | rewardActivityService.deleteRewardActivity(id); |
| 54 | 54 | return success(true); |
| 55 | 55 | } |
| 56 | 56 | |
| 57 | 57 | @GetMapping("/get") |
| 58 | 58 | @ApiOperation("获得满减送活动") |
| 59 | - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class) | |
| 59 | + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) | |
| 60 | 60 | @PreAuthorize("@ss.hasPermission('promotion:reward-activity:query')") |
| 61 | - public CommonResult<RewardActivityRespVO> getRewardActivity(@RequestParam("id") Integer id) { | |
| 61 | + public CommonResult<RewardActivityRespVO> getRewardActivity(@RequestParam("id") Long id) { | |
| 62 | 62 | RewardActivityDO rewardActivity = rewardActivityService.getRewardActivity(id); |
| 63 | 63 | return success(RewardActivityConvert.INSTANCE.convert(rewardActivity)); |
| 64 | 64 | } | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/reward/vo/RewardActivityBaseVO.java
| 1 | 1 | package cn.iocoder.yudao.module.promotion.controller.admin.reward.vo; |
| 2 | 2 | |
| 3 | +import cn.hutool.core.collection.CollUtil; | |
| 4 | +import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 5 | +import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum; | |
| 6 | +import com.fasterxml.jackson.annotation.JsonIgnore; | |
| 3 | 7 | import io.swagger.annotations.ApiModel; |
| 4 | 8 | import io.swagger.annotations.ApiModelProperty; |
| 5 | 9 | import lombok.Data; |
| 6 | 10 | import org.springframework.format.annotation.DateTimeFormat; |
| 7 | 11 | |
| 12 | +import javax.validation.Valid; | |
| 13 | +import javax.validation.constraints.AssertTrue; | |
| 14 | +import javax.validation.constraints.Future; | |
| 15 | +import javax.validation.constraints.Min; | |
| 8 | 16 | import javax.validation.constraints.NotNull; |
| 9 | 17 | import java.util.Date; |
| 10 | 18 | import java.util.List; |
| ... | ... | @@ -30,6 +38,7 @@ public class RewardActivityBaseVO { |
| 30 | 38 | @ApiModelProperty(value = "结束时间", required = true) |
| 31 | 39 | @NotNull(message = "结束时间不能为空") |
| 32 | 40 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| 41 | + @Future(message = "结束时间必须大于当前时间") | |
| 33 | 42 | private Date endTime; |
| 34 | 43 | |
| 35 | 44 | @ApiModelProperty(value = "备注", example = "biubiubiu") |
| ... | ... | @@ -37,10 +46,12 @@ public class RewardActivityBaseVO { |
| 37 | 46 | |
| 38 | 47 | @ApiModelProperty(value = "条件类型", required = true, example = "1") |
| 39 | 48 | @NotNull(message = "条件类型不能为空") |
| 49 | + @InEnum(value = PromotionConditionTypeEnum.class, message = "条件类型必须是 {value}") | |
| 40 | 50 | private Integer conditionType; |
| 41 | 51 | |
| 42 | 52 | @ApiModelProperty(value = "商品范围", required = true, example = "1") |
| 43 | 53 | @NotNull(message = "商品范围不能为空") |
| 54 | + @InEnum(value = PromotionConditionTypeEnum.class, message = "商品范围必须是 {value}") | |
| 44 | 55 | private Integer productScope; |
| 45 | 56 | |
| 46 | 57 | @ApiModelProperty(value = "商品 SPU 编号的数组", example = "1,2,3") |
| ... | ... | @@ -49,6 +60,7 @@ public class RewardActivityBaseVO { |
| 49 | 60 | /** |
| 50 | 61 | * 优惠规则的数组 |
| 51 | 62 | */ |
| 63 | + @Valid // 校验下子对象 | |
| 52 | 64 | private List<Rule> rules; |
| 53 | 65 | |
| 54 | 66 | @ApiModel("优惠规则") |
| ... | ... | @@ -56,15 +68,18 @@ public class RewardActivityBaseVO { |
| 56 | 68 | public static class Rule { |
| 57 | 69 | |
| 58 | 70 | @ApiModelProperty(value = "优惠门槛", required = true, example = "100", notes = "1. 满 N 元,单位:分; 2. 满 N 件") |
| 71 | + @Min(value = 1L, message = "优惠门槛必须大于等于 1") | |
| 59 | 72 | private Integer limit; |
| 60 | 73 | |
| 61 | 74 | @ApiModelProperty(value = "优惠价格", required = true, example = "100", notes = "单位:分") |
| 75 | + @Min(value = 1L, message = "优惠价格必须大于等于 1") | |
| 62 | 76 | private Integer discountPrice; |
| 63 | 77 | |
| 64 | 78 | @ApiModelProperty(value = "是否包邮", required = true, example = "true") |
| 65 | 79 | private Boolean freeDelivery; |
| 66 | 80 | |
| 67 | 81 | @ApiModelProperty(value = "赠送的积分", required = true, example = "100") |
| 82 | + @Min(value = 1L, message = "赠送的积分必须大于等于 1") | |
| 68 | 83 | private Integer point; |
| 69 | 84 | |
| 70 | 85 | @ApiModelProperty(value = "赠送的优惠劵编号的数组", example = "1,2,3") |
| ... | ... | @@ -73,6 +88,12 @@ public class RewardActivityBaseVO { |
| 73 | 88 | @ApiModelProperty(value = "赠送的优惠卷数量的数组", example = "1,2,3") |
| 74 | 89 | private List<Integer> couponCounts; |
| 75 | 90 | |
| 91 | + @AssertTrue(message = "优惠劵和数量必须一一对应") | |
| 92 | + @JsonIgnore | |
| 93 | + public boolean isCouponCountsValid() { | |
| 94 | + return CollUtil.size(couponCounts) == CollUtil.size(couponCounts); | |
| 95 | + } | |
| 96 | + | |
| 76 | 97 | } |
| 77 | 98 | |
| 78 | 99 | } | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/reward/vo/RewardActivityUpdateReqVO.java
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/reward/RewardActivityDO.java
| 1 | 1 | package cn.iocoder.yudao.module.promotion.dal.dataobject.reward; |
| 2 | 2 | |
| 3 | +import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | |
| 3 | 4 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 5 | +import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler; | |
| 4 | 6 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum; |
| 5 | 7 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum; |
| 6 | 8 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; |
| ... | ... | @@ -8,10 +10,11 @@ import com.baomidou.mybatisplus.annotation.KeySequence; |
| 8 | 10 | import com.baomidou.mybatisplus.annotation.TableField; |
| 9 | 11 | import com.baomidou.mybatisplus.annotation.TableId; |
| 10 | 12 | import com.baomidou.mybatisplus.annotation.TableName; |
| 11 | -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | |
| 13 | +import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; | |
| 12 | 14 | import lombok.Data; |
| 13 | 15 | import lombok.EqualsAndHashCode; |
| 14 | 16 | |
| 17 | +import java.io.Serializable; | |
| 15 | 18 | import java.util.Date; |
| 16 | 19 | import java.util.List; |
| 17 | 20 | |
| ... | ... | @@ -68,19 +71,19 @@ public class RewardActivityDO extends BaseDO { |
| 68 | 71 | /** |
| 69 | 72 | * 商品 SPU 编号的数组 |
| 70 | 73 | */ |
| 71 | - @TableField(typeHandler = JacksonTypeHandler.class) | |
| 74 | + @TableField(typeHandler = LongListTypeHandler.class) | |
| 72 | 75 | private List<Long> productSpuIds; |
| 73 | 76 | /** |
| 74 | 77 | * 优惠规则的数组 |
| 75 | 78 | */ |
| 76 | - @TableField(typeHandler = JacksonTypeHandler.class) | |
| 79 | + @TableField(typeHandler = RuleTypeHandler.class) | |
| 77 | 80 | private List<Rule> rules; |
| 78 | 81 | |
| 79 | 82 | /** |
| 80 | 83 | * 优惠规则 |
| 81 | 84 | */ |
| 82 | 85 | @Data |
| 83 | - public static class Rule { | |
| 86 | + public static class Rule implements Serializable { | |
| 84 | 87 | |
| 85 | 88 | /** |
| 86 | 89 | * 优惠门槛 |
| ... | ... | @@ -112,5 +115,19 @@ public class RewardActivityDO extends BaseDO { |
| 112 | 115 | |
| 113 | 116 | } |
| 114 | 117 | |
| 118 | + // TODO @芋艿:可以找一些新的思路 | |
| 119 | + public static class RuleTypeHandler extends AbstractJsonTypeHandler<List<Rule>> { | |
| 120 | + | |
| 121 | + @Override | |
| 122 | + protected List<Rule> parse(String json) { | |
| 123 | + return JsonUtils.parseArray(json, Rule.class); | |
| 124 | + } | |
| 125 | + | |
| 126 | + @Override | |
| 127 | + protected String toJson(List<Rule> obj) { | |
| 128 | + return JsonUtils.toJsonString(obj); | |
| 129 | + } | |
| 130 | + | |
| 131 | + } | |
| 115 | 132 | |
| 116 | 133 | } | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/reward/RewardActivityService.java
| ... | ... | @@ -7,8 +7,6 @@ import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivi |
| 7 | 7 | import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; |
| 8 | 8 | |
| 9 | 9 | import javax.validation.Valid; |
| 10 | -import java.util.Collection; | |
| 11 | -import java.util.List; | |
| 12 | 10 | import java.util.Map; |
| 13 | 11 | import java.util.Set; |
| 14 | 12 | |
| ... | ... | @@ -39,7 +37,7 @@ public interface RewardActivityService { |
| 39 | 37 | * |
| 40 | 38 | * @param id 编号 |
| 41 | 39 | */ |
| 42 | - void deleteRewardActivity(Integer id); | |
| 40 | + void deleteRewardActivity(Long id); | |
| 43 | 41 | |
| 44 | 42 | /** |
| 45 | 43 | * 获得满减送活动 |
| ... | ... | @@ -47,15 +45,7 @@ public interface RewardActivityService { |
| 47 | 45 | * @param id 编号 |
| 48 | 46 | * @return 满减送活动 |
| 49 | 47 | */ |
| 50 | - RewardActivityDO getRewardActivity(Integer id); | |
| 51 | - | |
| 52 | - /** | |
| 53 | - * 获得满减送活动列表 | |
| 54 | - * | |
| 55 | - * @param ids 编号 | |
| 56 | - * @return 满减送活动列表 | |
| 57 | - */ | |
| 58 | - List<RewardActivityDO> getRewardActivityList(Collection<Integer> ids); | |
| 48 | + RewardActivityDO getRewardActivity(Long id); | |
| 59 | 49 | |
| 60 | 50 | /** |
| 61 | 51 | * 获得满减送活动分页 | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/reward/RewardActivityServiceImpl.java
| 1 | 1 | package cn.iocoder.yudao.module.promotion.service.reward; |
| 2 | 2 | |
| 3 | +import cn.hutool.core.collection.CollUtil; | |
| 3 | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | 5 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; |
| 5 | 6 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; |
| ... | ... | @@ -7,6 +8,7 @@ import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivi |
| 7 | 8 | import cn.iocoder.yudao.module.promotion.convert.reward.RewardActivityConvert; |
| 8 | 9 | import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; |
| 9 | 10 | import cn.iocoder.yudao.module.promotion.dal.mysql.reward.RewardActivityMapper; |
| 11 | +import cn.iocoder.yudao.module.promotion.util.PromotionUtils; | |
| 10 | 12 | import org.springframework.stereotype.Service; |
| 11 | 13 | import org.springframework.validation.annotation.Validated; |
| 12 | 14 | |
| ... | ... | @@ -18,6 +20,7 @@ import java.util.Set; |
| 18 | 20 | |
| 19 | 21 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 20 | 22 | import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.REWARD_ACTIVITY_NOT_EXISTS; |
| 23 | +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.REWARD_ACTIVITY_SPU_CONFLICTS; | |
| 21 | 24 | |
| 22 | 25 | /** |
| 23 | 26 | * 满减送活动 Service 实现类 |
| ... | ... | @@ -33,8 +36,12 @@ public class RewardActivityServiceImpl implements RewardActivityService { |
| 33 | 36 | |
| 34 | 37 | @Override |
| 35 | 38 | public Long createRewardActivity(RewardActivityCreateReqVO createReqVO) { |
| 39 | + // 校验商品是否冲突 | |
| 40 | + validateRewardActivitySpuConflicts(null, createReqVO.getProductSpuIds()); | |
| 41 | + | |
| 36 | 42 | // 插入 |
| 37 | - RewardActivityDO rewardActivity = RewardActivityConvert.INSTANCE.convert(createReqVO); | |
| 43 | + RewardActivityDO rewardActivity = RewardActivityConvert.INSTANCE.convert(createReqVO) | |
| 44 | + .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime())); | |
| 38 | 45 | rewardActivityMapper.insert(rewardActivity); |
| 39 | 46 | // 返回 |
| 40 | 47 | return rewardActivity.getId(); |
| ... | ... | @@ -43,34 +50,64 @@ public class RewardActivityServiceImpl implements RewardActivityService { |
| 43 | 50 | @Override |
| 44 | 51 | public void updateRewardActivity(RewardActivityUpdateReqVO updateReqVO) { |
| 45 | 52 | // 校验存在 |
| 46 | - this.validateRewardActivityExists(updateReqVO.getId()); | |
| 53 | + validateRewardActivityExists(updateReqVO.getId()); | |
| 54 | + validateRewardActivitySpuConflicts(updateReqVO.getId(), updateReqVO.getProductSpuIds()); | |
| 55 | + | |
| 47 | 56 | // 更新 |
| 48 | - RewardActivityDO updateObj = RewardActivityConvert.INSTANCE.convert(updateReqVO); | |
| 57 | + RewardActivityDO updateObj = RewardActivityConvert.INSTANCE.convert(updateReqVO) | |
| 58 | + .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getStartTime(), updateReqVO.getEndTime())); | |
| 49 | 59 | rewardActivityMapper.updateById(updateObj); |
| 50 | 60 | } |
| 51 | 61 | |
| 52 | 62 | @Override |
| 53 | - public void deleteRewardActivity(Integer id) { | |
| 63 | + public void deleteRewardActivity(Long id) { | |
| 54 | 64 | // 校验存在 |
| 55 | - this.validateRewardActivityExists(id); | |
| 65 | + validateRewardActivityExists(id); | |
| 56 | 66 | // 删除 |
| 57 | 67 | rewardActivityMapper.deleteById(id); |
| 58 | 68 | } |
| 59 | 69 | |
| 60 | - private void validateRewardActivityExists(Integer id) { | |
| 70 | + private void validateRewardActivityExists(Long id) { | |
| 61 | 71 | if (rewardActivityMapper.selectById(id) == null) { |
| 62 | 72 | throw exception(REWARD_ACTIVITY_NOT_EXISTS); |
| 63 | 73 | } |
| 64 | 74 | } |
| 65 | 75 | |
| 66 | - @Override | |
| 67 | - public RewardActivityDO getRewardActivity(Integer id) { | |
| 68 | - return rewardActivityMapper.selectById(id); | |
| 76 | + /** | |
| 77 | + * 校验商品参加的活动是否冲突 | |
| 78 | + * | |
| 79 | + * @param id 活动编号 | |
| 80 | + * @param spuIds 商品 SPU 编号数组 | |
| 81 | + */ | |
| 82 | + private void validateRewardActivitySpuConflicts(Long id, Collection<Long> spuIds) { | |
| 83 | + if (CollUtil.isEmpty(spuIds)) { | |
| 84 | + return; | |
| 85 | + } | |
| 86 | + // 查询商品参加的活动 | |
| 87 | + List<RewardActivityDO> rewardActivityList = getRewardActivityListBySpuIds(spuIds); | |
| 88 | + if (id != null) { // 排除活动 | |
| 89 | + rewardActivityList.removeIf(activity -> id.equals(activity.getId())); | |
| 90 | + } | |
| 91 | + // 如果非空,则说明冲突 | |
| 92 | + if (CollUtil.isNotEmpty(rewardActivityList)) { | |
| 93 | + throw exception(REWARD_ACTIVITY_SPU_CONFLICTS); | |
| 94 | + } | |
| 95 | + } | |
| 96 | + | |
| 97 | + /** | |
| 98 | + * 获得商品参加的满减送活动的数组 | |
| 99 | + * | |
| 100 | + * @param spuIds 商品 SPU 编号数组 | |
| 101 | + * @return 商品参加的满减送活动的数组 | |
| 102 | + */ | |
| 103 | + private List<RewardActivityDO> getRewardActivityListBySpuIds(Collection<Long> spuIds) { | |
| 104 | + List<RewardActivityDO> list = rewardActivityMapper.selectList(); | |
| 105 | + return CollUtil.filter(list, activity -> CollUtil.containsAny(activity.getProductSpuIds(), spuIds)); | |
| 69 | 106 | } |
| 70 | 107 | |
| 71 | 108 | @Override |
| 72 | - public List<RewardActivityDO> getRewardActivityList(Collection<Integer> ids) { | |
| 73 | - return rewardActivityMapper.selectBatchIds(ids); | |
| 109 | + public RewardActivityDO getRewardActivity(Long id) { | |
| 110 | + return rewardActivityMapper.selectById(id); | |
| 74 | 111 | } |
| 75 | 112 | |
| 76 | 113 | @Override | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/util/PromotionUtils.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.promotion.util; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.framework.common.util.date.DateUtils; | |
| 4 | +import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum; | |
| 5 | + | |
| 6 | +import java.util.Date; | |
| 7 | + | |
| 8 | +/** | |
| 9 | + * 活动工具类 | |
| 10 | + * | |
| 11 | + * @author 芋道源码 | |
| 12 | + */ | |
| 13 | +public class PromotionUtils { | |
| 14 | + | |
| 15 | + /** | |
| 16 | + * 根据时间,计算活动状态 | |
| 17 | + * | |
| 18 | + * @param startTime 开始时间 | |
| 19 | + * @param endTime 结束时间 | |
| 20 | + * @return 活动状态 | |
| 21 | + */ | |
| 22 | + public static Integer calculateActivityStatus(Date startTime, Date endTime) { | |
| 23 | + if (DateUtils.beforeNow(endTime)) { | |
| 24 | + return PromotionActivityStatusEnum.END.getStatus(); | |
| 25 | + } | |
| 26 | + if (DateUtils.afterNow(startTime)) { | |
| 27 | + return PromotionActivityStatusEnum.WAIT.getStatus(); | |
| 28 | + } | |
| 29 | + return PromotionActivityStatusEnum.RUN.getStatus(); | |
| 30 | + } | |
| 31 | + | |
| 32 | +} | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/rewardactivity/RewardActivityServiceImplTest.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/reward/RewardActivityServiceImplTest.java
| 1 | -package cn.iocoder.yudao.module.promotion.service.rewardactivity; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.module.promotion.service.reward.RewardActivityServiceImpl; | |
| 4 | -import org.junit.jupiter.api.Disabled; | |
| 5 | -import org.junit.jupiter.api.Test; | |
| 6 | - | |
| 7 | -import javax.annotation.Resource; | |
| 1 | +package cn.iocoder.yudao.module.promotion.service.reward; | |
| 8 | 2 | |
| 3 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 9 | 4 | import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| 10 | - | |
| 11 | -import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.*; | |
| 12 | -import cn.iocoder.yudao.module.promotion.dal.dataobject.rewardactivity.RewardActivityDO; | |
| 5 | +import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; | |
| 6 | +import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; | |
| 7 | +import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; | |
| 8 | +import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; | |
| 13 | 9 | import cn.iocoder.yudao.module.promotion.dal.mysql.reward.RewardActivityMapper; |
| 14 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 15 | - | |
| 10 | +import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum; | |
| 11 | +import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum; | |
| 12 | +import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; | |
| 13 | +import org.junit.jupiter.api.Test; | |
| 16 | 14 | import org.springframework.context.annotation.Import; |
| 17 | -import java.util.*; | |
| 18 | 15 | |
| 19 | -import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; | |
| 20 | -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; | |
| 21 | -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; | |
| 22 | -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; | |
| 16 | +import javax.annotation.Resource; | |
| 17 | +import java.time.Duration; | |
| 18 | + | |
| 19 | +import static cn.hutool.core.util.RandomUtil.randomEle; | |
| 20 | +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime; | |
| 21 | +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; | |
| 22 | +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; | |
| 23 | +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; | |
| 24 | +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; | |
| 25 | +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; | |
| 26 | +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.REWARD_ACTIVITY_NOT_EXISTS; | |
| 23 | 27 | import static org.junit.jupiter.api.Assertions.*; |
| 24 | 28 | |
| 25 | 29 | /** |
| ... | ... | @@ -39,15 +43,24 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { |
| 39 | 43 | @Test |
| 40 | 44 | public void testCreateRewardActivity_success() { |
| 41 | 45 | // 准备参数 |
| 42 | - RewardActivityCreateReqVO reqVO = randomPojo(RewardActivityCreateReqVO.class); | |
| 46 | + RewardActivityCreateReqVO reqVO = randomPojo(RewardActivityCreateReqVO.class, o -> { | |
| 47 | + o.setConditionType(randomEle(PromotionConditionTypeEnum.values()).getType()); | |
| 48 | + o.setProductScope(randomEle(PromotionProductScopeEnum.values()).getScope()); | |
| 49 | + // 用于触发进行中的状态 | |
| 50 | + o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2))); | |
| 51 | + }); | |
| 43 | 52 | |
| 44 | 53 | // 调用 |
| 45 | - Integer rewardActivityId = rewardActivityService.createRewardActivity(reqVO); | |
| 54 | + Long rewardActivityId = rewardActivityService.createRewardActivity(reqVO); | |
| 46 | 55 | // 断言 |
| 47 | 56 | assertNotNull(rewardActivityId); |
| 48 | 57 | // 校验记录的属性是否正确 |
| 49 | 58 | RewardActivityDO rewardActivity = rewardActivityMapper.selectById(rewardActivityId); |
| 50 | - assertPojoEquals(reqVO, rewardActivity); | |
| 59 | + assertPojoEquals(reqVO, rewardActivity, "rules"); | |
| 60 | + assertEquals(rewardActivity.getStatus(), PromotionActivityStatusEnum.WAIT.getStatus()); | |
| 61 | + for (int i = 0; i < reqVO.getRules().size(); i++) { | |
| 62 | + assertPojoEquals(reqVO.getRules().get(i), rewardActivity.getRules().get(i)); | |
| 63 | + } | |
| 51 | 64 | } |
| 52 | 65 | |
| 53 | 66 | @Test |
| ... | ... | @@ -58,13 +71,21 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { |
| 58 | 71 | // 准备参数 |
| 59 | 72 | RewardActivityUpdateReqVO reqVO = randomPojo(RewardActivityUpdateReqVO.class, o -> { |
| 60 | 73 | o.setId(dbRewardActivity.getId()); // 设置更新的 ID |
| 74 | + o.setConditionType(randomEle(PromotionConditionTypeEnum.values()).getType()); | |
| 75 | + o.setProductScope(randomEle(PromotionProductScopeEnum.values()).getScope()); | |
| 76 | + // 用于触发进行中的状态 | |
| 77 | + o.setStartTime(addTime(Duration.ofDays(1))).setEndTime(addTime(Duration.ofDays(2))); | |
| 61 | 78 | }); |
| 62 | 79 | |
| 63 | 80 | // 调用 |
| 64 | 81 | rewardActivityService.updateRewardActivity(reqVO); |
| 65 | 82 | // 校验是否更新正确 |
| 66 | 83 | RewardActivityDO rewardActivity = rewardActivityMapper.selectById(reqVO.getId()); // 获取最新的 |
| 67 | - assertPojoEquals(reqVO, rewardActivity); | |
| 84 | + assertPojoEquals(reqVO, rewardActivity, "rules"); | |
| 85 | + assertEquals(rewardActivity.getStatus(), PromotionActivityStatusEnum.WAIT.getStatus()); | |
| 86 | + for (int i = 0; i < reqVO.getRules().size(); i++) { | |
| 87 | + assertPojoEquals(reqVO.getRules().get(i), rewardActivity.getRules().get(i)); | |
| 88 | + } | |
| 68 | 89 | } |
| 69 | 90 | |
| 70 | 91 | @Test |
| ... | ... | @@ -82,7 +103,7 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { |
| 82 | 103 | RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class); |
| 83 | 104 | rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据 |
| 84 | 105 | // 准备参数 |
| 85 | - Integer id = dbRewardActivity.getId(); | |
| 106 | + Long id = dbRewardActivity.getId(); | |
| 86 | 107 | |
| 87 | 108 | // 调用 |
| 88 | 109 | rewardActivityService.deleteRewardActivity(id); |
| ... | ... | @@ -93,61 +114,35 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { |
| 93 | 114 | @Test |
| 94 | 115 | public void testDeleteRewardActivity_notExists() { |
| 95 | 116 | // 准备参数 |
| 96 | - Integer id = randomIntegerId(); | |
| 117 | + Long id = randomLongId(); | |
| 97 | 118 | |
| 98 | 119 | // 调用, 并断言异常 |
| 99 | 120 | assertServiceException(() -> rewardActivityService.deleteRewardActivity(id), REWARD_ACTIVITY_NOT_EXISTS); |
| 100 | 121 | } |
| 101 | 122 | |
| 102 | 123 | @Test |
| 103 | - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 | |
| 104 | 124 | public void testGetRewardActivityPage() { |
| 105 | 125 | // mock 数据 |
| 106 | 126 | RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> { // 等会查询到 |
| 107 | - o.setName(null); | |
| 108 | - o.setStatus(null); | |
| 127 | + o.setName("芋艿"); | |
| 128 | + o.setStatus(PromotionActivityStatusEnum.CLOSE.getStatus()); | |
| 109 | 129 | }); |
| 110 | 130 | rewardActivityMapper.insert(dbRewardActivity); |
| 111 | 131 | // 测试 name 不匹配 |
| 112 | - rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setName(null))); | |
| 132 | + rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setName("土豆"))); | |
| 113 | 133 | // 测试 status 不匹配 |
| 114 | - rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setStatus(null))); | |
| 134 | + rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus()))); | |
| 115 | 135 | // 准备参数 |
| 116 | 136 | RewardActivityPageReqVO reqVO = new RewardActivityPageReqVO(); |
| 117 | - reqVO.setName(null); | |
| 118 | - reqVO.setStatus(null); | |
| 137 | + reqVO.setName("芋艿"); | |
| 138 | + reqVO.setStatus(PromotionActivityStatusEnum.CLOSE.getStatus()); | |
| 119 | 139 | |
| 120 | 140 | // 调用 |
| 121 | 141 | PageResult<RewardActivityDO> pageResult = rewardActivityService.getRewardActivityPage(reqVO); |
| 122 | 142 | // 断言 |
| 123 | 143 | assertEquals(1, pageResult.getTotal()); |
| 124 | 144 | assertEquals(1, pageResult.getList().size()); |
| 125 | - assertPojoEquals(dbRewardActivity, pageResult.getList().get(0)); | |
| 126 | - } | |
| 127 | - | |
| 128 | - @Test | |
| 129 | - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 | |
| 130 | - public void testGetRewardActivityList() { | |
| 131 | - // mock 数据 | |
| 132 | - RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> { // 等会查询到 | |
| 133 | - o.setName(null); | |
| 134 | - o.setStatus(null); | |
| 135 | - }); | |
| 136 | - rewardActivityMapper.insert(dbRewardActivity); | |
| 137 | - // 测试 name 不匹配 | |
| 138 | - rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setName(null))); | |
| 139 | - // 测试 status 不匹配 | |
| 140 | - rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setStatus(null))); | |
| 141 | - // 准备参数 | |
| 142 | - RewardActivityExportReqVO reqVO = new RewardActivityExportReqVO(); | |
| 143 | - reqVO.setName(null); | |
| 144 | - reqVO.setStatus(null); | |
| 145 | - | |
| 146 | - // 调用 | |
| 147 | - List<RewardActivityDO> list = rewardActivityService.getRewardActivityList(reqVO); | |
| 148 | - // 断言 | |
| 149 | - assertEquals(1, list.size()); | |
| 150 | - assertPojoEquals(dbRewardActivity, list.get(0)); | |
| 145 | + assertPojoEquals(dbRewardActivity, pageResult.getList().get(0), "rules"); | |
| 151 | 146 | } |
| 152 | 147 | |
| 153 | 148 | } | ... | ... |
yudao-module-mall/yudao-module-promotion-biz/src/test/resources/sql/clean.sql
yudao-module-mall/yudao-module-promotion-biz/src/test/resources/sql/create_tables.sql
| ... | ... | @@ -46,3 +46,48 @@ CREATE TABLE IF NOT EXISTS "promotion_coupon_template" ( |
| 46 | 46 | "deleted" bit NOT NULL DEFAULT FALSE, |
| 47 | 47 | PRIMARY KEY ("id") |
| 48 | 48 | ) COMMENT '优惠劵模板'; |
| 49 | + | |
| 50 | +CREATE TABLE IF NOT EXISTS "promotion_coupon" ( | |
| 51 | + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, | |
| 52 | + "template_id" bigint NOT NULL, | |
| 53 | + "name" varchar NOT NULL, | |
| 54 | + "status" int NOT NULL, | |
| 55 | + "user_id" bigint NOT NULL, | |
| 56 | + "take_type" int NOT NULL, | |
| 57 | + "useprice" int NOT NULL, | |
| 58 | + "valid_start_time" datetime NOT NULL, | |
| 59 | + "valid_end_time" datetime NOT NULL, | |
| 60 | + "product_scope" int NOT NULL, | |
| 61 | + "product_spu_ids" varchar, | |
| 62 | + "discount_type" int NOT NULL, | |
| 63 | + "discount_percent" int, | |
| 64 | + "discount_price" int, | |
| 65 | + "discount_limit_price" int, | |
| 66 | + "use_order_id" bigint, | |
| 67 | + "use_time" datetime, | |
| 68 | + "creator" varchar DEFAULT '', | |
| 69 | + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| 70 | + "updater" varchar DEFAULT '', | |
| 71 | + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| 72 | + "deleted" bit NOT NULL DEFAULT FALSE, | |
| 73 | + PRIMARY KEY ("id") | |
| 74 | +) COMMENT '优惠劵'; | |
| 75 | + | |
| 76 | +CREATE TABLE IF NOT EXISTS "promotion_reward_activity" ( | |
| 77 | + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, | |
| 78 | + "name" varchar NOT NULL, | |
| 79 | + "status" int NOT NULL, | |
| 80 | + "start_time" datetime NOT NULL, | |
| 81 | + "end_time" datetime NOT NULL, | |
| 82 | + "remark" varchar, | |
| 83 | + "condition_type" int NOT NULL, | |
| 84 | + "product_scope" int NOT NULL, | |
| 85 | + "product_spu_ids" varchar, | |
| 86 | + "rules" varchar, | |
| 87 | + "creator" varchar DEFAULT '', | |
| 88 | + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| 89 | + "updater" varchar DEFAULT '', | |
| 90 | + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | |
| 91 | + "deleted" bit NOT NULL DEFAULT FALSE, | |
| 92 | + PRIMARY KEY ("id") | |
| 93 | +) COMMENT '满减送活动'; | ... | ... |