Commit c4943e97c7b447d75776cd6c1d50023236d243f2
Committed by
Gitee
!1057 完善满减送活动 CRUD 部分
Merge pull request !1057 from puhui999/develop
Showing
17 changed files
with
248 additions
and
193 deletions
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/reward/dto/RewardActivityMatchRespDTO.java
| 1 | package cn.iocoder.yudao.module.promotion.api.reward.dto; | 1 | package cn.iocoder.yudao.module.promotion.api.reward.dto; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 3 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum; | 4 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum; |
| 5 | +import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; | ||
| 4 | import lombok.Data; | 6 | import lombok.Data; |
| 5 | 7 | ||
| 8 | +import java.io.Serializable; | ||
| 9 | +import java.time.LocalDateTime; | ||
| 6 | import java.util.List; | 10 | import java.util.List; |
| 7 | 11 | ||
| 8 | /** | 12 | /** |
| @@ -22,27 +26,49 @@ public class RewardActivityMatchRespDTO { | @@ -22,27 +26,49 @@ public class RewardActivityMatchRespDTO { | ||
| 22 | */ | 26 | */ |
| 23 | private String name; | 27 | private String name; |
| 24 | /** | 28 | /** |
| 29 | + * 状态 | ||
| 30 | + * | ||
| 31 | + * 枚举 {@link CommonStatusEnum} | ||
| 32 | + */ | ||
| 33 | + private Integer status; | ||
| 34 | + /** | ||
| 35 | + * 开始时间 | ||
| 36 | + */ | ||
| 37 | + private LocalDateTime startTime; | ||
| 38 | + /** | ||
| 39 | + * 结束时间 | ||
| 40 | + */ | ||
| 41 | + private LocalDateTime endTime; | ||
| 42 | + /** | ||
| 43 | + * 备注 | ||
| 44 | + */ | ||
| 45 | + private String remark; | ||
| 46 | + /** | ||
| 25 | * 条件类型 | 47 | * 条件类型 |
| 26 | * | 48 | * |
| 27 | * 枚举 {@link PromotionConditionTypeEnum} | 49 | * 枚举 {@link PromotionConditionTypeEnum} |
| 28 | */ | 50 | */ |
| 29 | private Integer conditionType; | 51 | private Integer conditionType; |
| 30 | /** | 52 | /** |
| 31 | - * 优惠规则的数组 | 53 | + * 商品范围 |
| 54 | + * | ||
| 55 | + * 枚举 {@link PromotionProductScopeEnum} | ||
| 32 | */ | 56 | */ |
| 33 | - private List<Rule> rules; | ||
| 34 | - | 57 | + private Integer productScope; |
| 35 | /** | 58 | /** |
| 36 | * 商品 SPU 编号的数组 | 59 | * 商品 SPU 编号的数组 |
| 37 | */ | 60 | */ |
| 38 | - private List<Long> spuIds; | 61 | + private List<Long> productScopeValues; |
| 62 | + /** | ||
| 63 | + * 优惠规则的数组 | ||
| 64 | + */ | ||
| 65 | + private List<Rule> rules; | ||
| 39 | 66 | ||
| 40 | - // TODO 芋艿:后面 RewardActivityRespDTO 有了之后,Rule 可以放过去 | ||
| 41 | /** | 67 | /** |
| 42 | * 优惠规则 | 68 | * 优惠规则 |
| 43 | */ | 69 | */ |
| 44 | @Data | 70 | @Data |
| 45 | - public static class Rule { | 71 | + public static class Rule implements Serializable { |
| 46 | 72 | ||
| 47 | /** | 73 | /** |
| 48 | * 优惠门槛 | 74 | * 优惠门槛 |
| @@ -60,10 +86,18 @@ public class RewardActivityMatchRespDTO { | @@ -60,10 +86,18 @@ public class RewardActivityMatchRespDTO { | ||
| 60 | */ | 86 | */ |
| 61 | private Boolean freeDelivery; | 87 | private Boolean freeDelivery; |
| 62 | /** | 88 | /** |
| 89 | + * 是否赠送积分 | ||
| 90 | + */ | ||
| 91 | + private Boolean givePoint; | ||
| 92 | + /** | ||
| 63 | * 赠送的积分 | 93 | * 赠送的积分 |
| 64 | */ | 94 | */ |
| 65 | private Integer point; | 95 | private Integer point; |
| 66 | /** | 96 | /** |
| 97 | + * 是否赠送优惠券 | ||
| 98 | + */ | ||
| 99 | + private Boolean giveCoupon; | ||
| 100 | + /** | ||
| 67 | * 赠送的优惠劵编号的数组 | 101 | * 赠送的优惠劵编号的数组 |
| 68 | */ | 102 | */ |
| 69 | private List<Long> couponIds; | 103 | private List<Long> couponIds; |
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
| @@ -44,7 +44,8 @@ public interface ErrorCodeConstants { | @@ -44,7 +44,8 @@ public interface ErrorCodeConstants { | ||
| 44 | ErrorCode REWARD_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_006_002, "满减送活动已关闭,不能修改"); | 44 | ErrorCode REWARD_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_006_002, "满减送活动已关闭,不能修改"); |
| 45 | ErrorCode REWARD_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED = new ErrorCode(1_013_006_003, "满减送活动未关闭,不能删除"); | 45 | ErrorCode REWARD_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED = new ErrorCode(1_013_006_003, "满减送活动未关闭,不能删除"); |
| 46 | ErrorCode REWARD_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_006_004, "满减送活动已关闭,不能重复关闭"); | 46 | ErrorCode REWARD_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_006_004, "满减送活动已关闭,不能重复关闭"); |
| 47 | - ErrorCode REWARD_ACTIVITY_CLOSE_FAIL_STATUS_END = new ErrorCode(1_013_006_005, "满减送活动已结束,不能关闭"); | 47 | + ErrorCode REWARD_ACTIVITY_SCOPE_ALL_EXISTS = new ErrorCode(1_013_006_005, "已存在商品范围为全场的满减送活动"); |
| 48 | + ErrorCode REWARD_ACTIVITY_SCOPE_CATEGORY_EXISTS = new ErrorCode(1_013_006_006, "存在商品类型参加了其它满减送活动"); | ||
| 48 | 49 | ||
| 49 | // ========== TODO 空着 1-013-007-000 ============ | 50 | // ========== TODO 空着 1-013-007-000 ============ |
| 50 | 51 |
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/common/PromotionProductScopeEnum.java
| 1 | package cn.iocoder.yudao.module.promotion.enums.common; | 1 | package cn.iocoder.yudao.module.promotion.enums.common; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.util.ObjUtil; | ||
| 3 | import cn.iocoder.yudao.framework.common.core.IntArrayValuable; | 4 | import cn.iocoder.yudao.framework.common.core.IntArrayValuable; |
| 4 | import lombok.AllArgsConstructor; | 5 | import lombok.AllArgsConstructor; |
| 5 | import lombok.Getter; | 6 | import lombok.Getter; |
| @@ -35,4 +36,16 @@ public enum PromotionProductScopeEnum implements IntArrayValuable { | @@ -35,4 +36,16 @@ public enum PromotionProductScopeEnum implements IntArrayValuable { | ||
| 35 | return ARRAYS; | 36 | return ARRAYS; |
| 36 | } | 37 | } |
| 37 | 38 | ||
| 39 | + public static boolean isAll(Integer scope) { | ||
| 40 | + return ObjUtil.equal(scope, ALL.scope); | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + public static boolean isSpu(Integer scope) { | ||
| 44 | + return ObjUtil.equal(scope, SPU.scope); | ||
| 45 | + } | ||
| 46 | + | ||
| 47 | + public static boolean isCategory(Integer scope) { | ||
| 48 | + return ObjUtil.equal(scope, CATEGORY.scope); | ||
| 49 | + } | ||
| 50 | + | ||
| 38 | } | 51 | } |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/activity/AppActivityController.java
| @@ -2,14 +2,19 @@ package cn.iocoder.yudao.module.promotion.controller.app.activity; | @@ -2,14 +2,19 @@ package cn.iocoder.yudao.module.promotion.controller.app.activity; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.hutool.core.map.MapUtil; | 4 | import cn.hutool.core.map.MapUtil; |
| 5 | +import cn.hutool.core.util.ObjUtil; | ||
| 5 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | 6 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 6 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 7 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 8 | +import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; | ||
| 9 | +import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; | ||
| 7 | import cn.iocoder.yudao.module.promotion.controller.app.activity.vo.AppActivityRespVO; | 10 | import cn.iocoder.yudao.module.promotion.controller.app.activity.vo.AppActivityRespVO; |
| 8 | import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO; | 11 | import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO; |
| 9 | import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO; | 12 | import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO; |
| 10 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO; | 13 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO; |
| 11 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; | 14 | import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO; |
| 15 | +import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; | ||
| 12 | import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillActivityDO; | 16 | import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillActivityDO; |
| 17 | +import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; | ||
| 13 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; | 18 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; |
| 14 | import cn.iocoder.yudao.module.promotion.service.bargain.BargainActivityService; | 19 | import cn.iocoder.yudao.module.promotion.service.bargain.BargainActivityService; |
| 15 | import cn.iocoder.yudao.module.promotion.service.combination.CombinationActivityService; | 20 | import cn.iocoder.yudao.module.promotion.service.combination.CombinationActivityService; |
| @@ -48,6 +53,8 @@ public class AppActivityController { | @@ -48,6 +53,8 @@ public class AppActivityController { | ||
| 48 | private DiscountActivityService discountActivityService; | 53 | private DiscountActivityService discountActivityService; |
| 49 | @Resource | 54 | @Resource |
| 50 | private RewardActivityService rewardActivityService; | 55 | private RewardActivityService rewardActivityService; |
| 56 | + @Resource | ||
| 57 | + private ProductSpuApi productSpuApi; | ||
| 51 | 58 | ||
| 52 | @GetMapping("/list-by-spu-id") | 59 | @GetMapping("/list-by-spu-id") |
| 53 | @Operation(summary = "获得单个商品,近期参与的每个活动") | 60 | @Operation(summary = "获得单个商品,近期参与的每个活动") |
| @@ -141,29 +148,52 @@ public class AppActivityController { | @@ -141,29 +148,52 @@ public class AppActivityController { | ||
| 141 | item.getName(), productMap.get(item.getId()), item.getStartTime(), item.getEndTime()))); | 148 | item.getName(), productMap.get(item.getId()), item.getStartTime(), item.getEndTime()))); |
| 142 | } | 149 | } |
| 143 | 150 | ||
| 151 | + private static void buildAppActivityRespVO(RewardActivityDO rewardActivity, Collection<Long> spuIds, | ||
| 152 | + List<AppActivityRespVO> activityList) { | ||
| 153 | + for (Long spuId : spuIds) { | ||
| 154 | + // 校验商品是否已经加入过活动 | ||
| 155 | + if (anyMatch(activityList, appActivity -> ObjUtil.equal(appActivity.getId(), rewardActivity.getId()) && | ||
| 156 | + ObjUtil.equal(appActivity.getSpuId(), spuId))) { | ||
| 157 | + continue; | ||
| 158 | + } | ||
| 159 | + activityList.add(new AppActivityRespVO(rewardActivity.getId(), | ||
| 160 | + PromotionTypeEnum.REWARD_ACTIVITY.getType(), rewardActivity.getName(), spuId, | ||
| 161 | + rewardActivity.getStartTime(), rewardActivity.getEndTime())); | ||
| 162 | + } | ||
| 163 | + } | ||
| 164 | + | ||
| 144 | private void getRewardActivities(Collection<Long> spuIds, LocalDateTime now, List<AppActivityRespVO> activityList) { | 165 | private void getRewardActivities(Collection<Long> spuIds, LocalDateTime now, List<AppActivityRespVO> activityList) { |
| 145 | - // TODO @puhui999:有 3 范围,不只 spuId,还有 categoryId,全部,下次 fix | ||
| 146 | - //List<RewardActivityDO> rewardActivityList = rewardActivityService.getRewardActivityBySpuIdsAndStatusAndDateTimeLt( | ||
| 147 | - // spuIds, PromotionActivityStatusEnum.RUN.getStatus(), now); | ||
| 148 | - //if (CollUtil.isEmpty(rewardActivityList)) { | ||
| 149 | - // return; | ||
| 150 | - //} | ||
| 151 | - // | ||
| 152 | - //Map<Long, Optional<RewardActivityDO>> spuIdAndActivityMap = spuIds.stream() | ||
| 153 | - // .collect(Collectors.toMap( | ||
| 154 | - // spuId -> spuId, | ||
| 155 | - // spuId -> rewardActivityList.stream() | ||
| 156 | - // .filter(activity -> activity.getProductSpuIds().contains(spuId)) | ||
| 157 | - // .max(Comparator.comparing(RewardActivityDO::getCreateTime)))); | ||
| 158 | - //for (Long supId : spuIdAndActivityMap.keySet()) { | ||
| 159 | - // if (spuIdAndActivityMap.get(supId).isEmpty()) { | ||
| 160 | - // continue; | ||
| 161 | - // } | ||
| 162 | - // | ||
| 163 | - // RewardActivityDO rewardActivityDO = spuIdAndActivityMap.get(supId).get(); | ||
| 164 | - // activityList.add(new AppActivityRespVO(rewardActivityDO.getId(), PromotionTypeEnum.REWARD_ACTIVITY.getType(), | ||
| 165 | - // rewardActivityDO.getName(), supId, rewardActivityDO.getStartTime(), rewardActivityDO.getEndTime())); | ||
| 166 | - //} | 166 | + // 1.1 获得所有的活动 |
| 167 | + List<RewardActivityDO> rewardActivityList = rewardActivityService.getRewardActivityByStatusAndDateTimeLt( | ||
| 168 | + CommonStatusEnum.ENABLE.getStatus(), now); | ||
| 169 | + if (CollUtil.isEmpty(rewardActivityList)) { | ||
| 170 | + return; | ||
| 171 | + } | ||
| 172 | + // 1.2 获得所有的商品信息 | ||
| 173 | + List<ProductSpuRespDTO> spuList = productSpuApi.getSpuList(spuIds); | ||
| 174 | + if (CollUtil.isEmpty(spuList)) { | ||
| 175 | + return; | ||
| 176 | + } | ||
| 177 | + | ||
| 178 | + // 2. 构建活动 | ||
| 179 | + for (RewardActivityDO rewardActivity : rewardActivityList) { | ||
| 180 | + // 情况一:所有商品都能参加 | ||
| 181 | + if (PromotionProductScopeEnum.isAll(rewardActivity.getProductScope())) { | ||
| 182 | + buildAppActivityRespVO(rewardActivity, spuIds, activityList); | ||
| 183 | + } | ||
| 184 | + // 情况二:指定商品参加 | ||
| 185 | + if (PromotionProductScopeEnum.isSpu(rewardActivity.getProductScope())) { | ||
| 186 | + List<Long> fSpuIds = spuList.stream().map(ProductSpuRespDTO::getId).filter(id -> | ||
| 187 | + rewardActivity.getProductScopeValues().contains(id)).toList(); | ||
| 188 | + buildAppActivityRespVO(rewardActivity, fSpuIds, activityList); | ||
| 189 | + } | ||
| 190 | + // 情况三:指定商品类型参加 | ||
| 191 | + if (PromotionProductScopeEnum.isCategory(rewardActivity.getProductScope())) { | ||
| 192 | + List<Long> fSpuIds = spuList.stream().filter(spuItem -> rewardActivity.getProductScopeValues() | ||
| 193 | + .contains(spuItem.getCategoryId())).map(ProductSpuRespDTO::getId).toList(); | ||
| 194 | + buildAppActivityRespVO(rewardActivity, fSpuIds, activityList); | ||
| 195 | + } | ||
| 196 | + } | ||
| 167 | } | 197 | } |
| 168 | 198 | ||
| 169 | } | 199 | } |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/reward/RewardActivityDO.java
| 1 | package cn.iocoder.yudao.module.promotion.dal.dataobject.reward; | 1 | package cn.iocoder.yudao.module.promotion.dal.dataobject.reward; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | 4 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler; | 5 | import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler; |
| 5 | -import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum; | ||
| 6 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum; | 6 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionConditionTypeEnum; |
| 7 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; | 7 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; |
| 8 | import com.baomidou.mybatisplus.annotation.KeySequence; | 8 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| @@ -40,7 +40,7 @@ public class RewardActivityDO extends BaseDO { | @@ -40,7 +40,7 @@ public class RewardActivityDO extends BaseDO { | ||
| 40 | /** | 40 | /** |
| 41 | * 状态 | 41 | * 状态 |
| 42 | * | 42 | * |
| 43 | - * 枚举 {@link PromotionActivityStatusEnum} | 43 | + * 枚举 {@link CommonStatusEnum} |
| 44 | */ | 44 | */ |
| 45 | private Integer status; | 45 | private Integer status; |
| 46 | /** | 46 | /** |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/reward/RewardActivityMapper.java
| @@ -30,10 +30,6 @@ public interface RewardActivityMapper extends BaseMapperX<RewardActivityDO> { | @@ -30,10 +30,6 @@ public interface RewardActivityMapper extends BaseMapperX<RewardActivityDO> { | ||
| 30 | .orderByDesc(RewardActivityDO::getId)); | 30 | .orderByDesc(RewardActivityDO::getId)); |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | - default List<RewardActivityDO> selectListByStatus(Collection<Integer> statuses) { | ||
| 34 | - return selectList(RewardActivityDO::getStatus, statuses); | ||
| 35 | - } | ||
| 36 | - | ||
| 37 | default List<RewardActivityDO> selectListByProductScopeAndStatus(Integer productScope, Integer status) { | 33 | default List<RewardActivityDO> selectListByProductScopeAndStatus(Integer productScope, Integer status) { |
| 38 | return selectList(new LambdaQueryWrapperX<RewardActivityDO>() | 34 | return selectList(new LambdaQueryWrapperX<RewardActivityDO>() |
| 39 | .eq(RewardActivityDO::getProductScope, productScope) | 35 | .eq(RewardActivityDO::getProductScope, productScope) |
| @@ -53,16 +49,16 @@ public interface RewardActivityMapper extends BaseMapperX<RewardActivityDO> { | @@ -53,16 +49,16 @@ public interface RewardActivityMapper extends BaseMapperX<RewardActivityDO> { | ||
| 53 | * 获取指定活动编号的活动列表且 | 49 | * 获取指定活动编号的活动列表且 |
| 54 | * 开始时间和结束时间小于给定时间 dateTime 的活动列表 | 50 | * 开始时间和结束时间小于给定时间 dateTime 的活动列表 |
| 55 | * | 51 | * |
| 56 | - * @param ids 活动编号 | 52 | + * @param status 状态 |
| 57 | * @param dateTime 指定日期 | 53 | * @param dateTime 指定日期 |
| 58 | * @return 活动列表 | 54 | * @return 活动列表 |
| 59 | */ | 55 | */ |
| 60 | - default List<RewardActivityDO> selectListByIdsAndDateTimeLt(Collection<Long> ids, LocalDateTime dateTime) { | 56 | + default List<RewardActivityDO> selectListByStatusAndDateTimeLt(Integer status, LocalDateTime dateTime) { |
| 61 | return selectList(new LambdaQueryWrapperX<RewardActivityDO>() | 57 | return selectList(new LambdaQueryWrapperX<RewardActivityDO>() |
| 62 | - .in(RewardActivityDO::getId, ids) | 58 | + .eq(RewardActivityDO::getStatus, status) |
| 63 | .lt(RewardActivityDO::getStartTime, dateTime) | 59 | .lt(RewardActivityDO::getStartTime, dateTime) |
| 64 | .gt(RewardActivityDO::getEndTime, dateTime)// 开始时间 < 指定时间 < 结束时间,也就是说获取指定时间段的活动 | 60 | .gt(RewardActivityDO::getEndTime, dateTime)// 开始时间 < 指定时间 < 结束时间,也就是说获取指定时间段的活动 |
| 65 | - .orderByDesc(RewardActivityDO::getCreateTime) | 61 | + .orderByAsc(RewardActivityDO::getStartTime) |
| 66 | ); | 62 | ); |
| 67 | } | 63 | } |
| 68 | 64 |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/combination/CombinationRecordServiceImpl.java
| @@ -27,6 +27,7 @@ import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStat | @@ -27,6 +27,7 @@ import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStat | ||
| 27 | import cn.iocoder.yudao.module.system.api.social.SocialClientApi; | 27 | import cn.iocoder.yudao.module.system.api.social.SocialClientApi; |
| 28 | import cn.iocoder.yudao.module.system.api.social.dto.SocialWxaSubscribeMessageSendReqDTO; | 28 | import cn.iocoder.yudao.module.system.api.social.dto.SocialWxaSubscribeMessageSendReqDTO; |
| 29 | import cn.iocoder.yudao.module.trade.api.order.TradeOrderApi; | 29 | import cn.iocoder.yudao.module.trade.api.order.TradeOrderApi; |
| 30 | +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderCancelTypeEnum; | ||
| 30 | import jakarta.annotation.Nullable; | 31 | import jakarta.annotation.Nullable; |
| 31 | import jakarta.annotation.Resource; | 32 | import jakarta.annotation.Resource; |
| 32 | import lombok.extern.slf4j.Slf4j; | 33 | import lombok.extern.slf4j.Slf4j; |
| @@ -37,7 +38,10 @@ import org.springframework.transaction.annotation.Transactional; | @@ -37,7 +38,10 @@ import org.springframework.transaction.annotation.Transactional; | ||
| 37 | import org.springframework.validation.annotation.Validated; | 38 | import org.springframework.validation.annotation.Validated; |
| 38 | 39 | ||
| 39 | import java.time.LocalDateTime; | 40 | import java.time.LocalDateTime; |
| 40 | -import java.util.*; | 41 | +import java.util.ArrayList; |
| 42 | +import java.util.Collection; | ||
| 43 | +import java.util.List; | ||
| 44 | +import java.util.Map; | ||
| 41 | 45 | ||
| 42 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 46 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 43 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; | 47 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; |
| @@ -335,7 +339,8 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { | @@ -335,7 +339,8 @@ public class CombinationRecordServiceImpl implements CombinationRecordService { | ||
| 335 | List<CombinationRecordDO> headAndRecords = updateBatchCombinationRecords(headRecord, | 339 | List<CombinationRecordDO> headAndRecords = updateBatchCombinationRecords(headRecord, |
| 336 | CombinationRecordStatusEnum.FAILED); | 340 | CombinationRecordStatusEnum.FAILED); |
| 337 | // 2. 订单取消 | 341 | // 2. 订单取消 |
| 338 | - headAndRecords.forEach(item -> tradeOrderApi.cancelPaidOrder(item.getUserId(), item.getOrderId())); | 342 | + headAndRecords.forEach(item -> tradeOrderApi.cancelPaidOrder(item.getUserId(), item.getOrderId(), |
| 343 | + TradeOrderCancelTypeEnum.COMBINATION_CLOSE)); | ||
| 339 | } | 344 | } |
| 340 | 345 | ||
| 341 | /** | 346 | /** |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/reward/RewardActivityService.java
| @@ -75,11 +75,10 @@ public interface RewardActivityService { | @@ -75,11 +75,10 @@ public interface RewardActivityService { | ||
| 75 | /** | 75 | /** |
| 76 | * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录 | 76 | * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录 |
| 77 | * | 77 | * |
| 78 | - * @param spuIds spu 编号 | ||
| 79 | * @param status 状态 | 78 | * @param status 状态 |
| 80 | * @param dateTime 当前日期时间 | 79 | * @param dateTime 当前日期时间 |
| 81 | * @return 满减送活动列表 | 80 | * @return 满减送活动列表 |
| 82 | */ | 81 | */ |
| 83 | - List<RewardActivityDO> getRewardActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime); | 82 | + List<RewardActivityDO> getRewardActivityByStatusAndDateTimeLt(Integer status, LocalDateTime dateTime); |
| 84 | 83 | ||
| 85 | } | 84 | } |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/reward/RewardActivityServiceImpl.java
| 1 | package cn.iocoder.yudao.module.promotion.service.reward; | 1 | package cn.iocoder.yudao.module.promotion.service.reward; |
| 2 | 2 | ||
| 3 | -import cn.hutool.core.collection.CollUtil; | 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 5 | import cn.iocoder.yudao.module.product.api.category.ProductCategoryApi; | 6 | import cn.iocoder.yudao.module.product.api.category.ProductCategoryApi; |
| 6 | import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; | 7 | import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; |
| 7 | import cn.iocoder.yudao.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; | 8 | import cn.iocoder.yudao.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; |
| 9 | +import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityBaseVO; | ||
| 8 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; | 10 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; |
| 9 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; | 11 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; |
| 10 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; | 12 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; |
| 11 | import cn.iocoder.yudao.module.promotion.convert.reward.RewardActivityConvert; | 13 | import cn.iocoder.yudao.module.promotion.convert.reward.RewardActivityConvert; |
| 12 | import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; | 14 | import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; |
| 13 | import cn.iocoder.yudao.module.promotion.dal.mysql.reward.RewardActivityMapper; | 15 | import cn.iocoder.yudao.module.promotion.dal.mysql.reward.RewardActivityMapper; |
| 14 | -import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum; | ||
| 15 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; | 16 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; |
| 16 | import cn.iocoder.yudao.module.promotion.util.PromotionUtils; | 17 | import cn.iocoder.yudao.module.promotion.util.PromotionUtils; |
| 17 | import jakarta.annotation.Resource; | 18 | import jakarta.annotation.Resource; |
| @@ -20,14 +21,13 @@ import org.springframework.validation.annotation.Validated; | @@ -20,14 +21,13 @@ import org.springframework.validation.annotation.Validated; | ||
| 20 | 21 | ||
| 21 | import java.time.LocalDateTime; | 22 | import java.time.LocalDateTime; |
| 22 | import java.util.Collection; | 23 | import java.util.Collection; |
| 23 | -import java.util.Collections; | ||
| 24 | import java.util.List; | 24 | import java.util.List; |
| 25 | import java.util.Objects; | 25 | import java.util.Objects; |
| 26 | 26 | ||
| 27 | +import static cn.hutool.core.collection.CollUtil.intersectionDistinct; | ||
| 27 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 28 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 28 | -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | 29 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch; |
| 29 | import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; | 30 | import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; |
| 30 | -import static java.util.Arrays.asList; | ||
| 31 | 31 | ||
| 32 | /** | 32 | /** |
| 33 | * 满减送活动 Service 实现类 | 33 | * 满减送活动 Service 实现类 |
| @@ -51,7 +51,7 @@ public class RewardActivityServiceImpl implements RewardActivityService { | @@ -51,7 +51,7 @@ public class RewardActivityServiceImpl implements RewardActivityService { | ||
| 51 | // 1.1 校验商品范围 | 51 | // 1.1 校验商品范围 |
| 52 | validateProductScope(createReqVO.getProductScope(), createReqVO.getProductScopeValues()); | 52 | validateProductScope(createReqVO.getProductScope(), createReqVO.getProductScopeValues()); |
| 53 | // 1.2 校验商品是否冲突 | 53 | // 1.2 校验商品是否冲突 |
| 54 | - //validateRewardActivitySpuConflicts(null, createReqVO.getProductSpuIds()); | 54 | + validateRewardActivitySpuConflicts(null, createReqVO); |
| 55 | 55 | ||
| 56 | // 2. 插入 | 56 | // 2. 插入 |
| 57 | RewardActivityDO rewardActivity = RewardActivityConvert.INSTANCE.convert(createReqVO) | 57 | RewardActivityDO rewardActivity = RewardActivityConvert.INSTANCE.convert(createReqVO) |
| @@ -65,13 +65,13 @@ public class RewardActivityServiceImpl implements RewardActivityService { | @@ -65,13 +65,13 @@ public class RewardActivityServiceImpl implements RewardActivityService { | ||
| 65 | public void updateRewardActivity(RewardActivityUpdateReqVO updateReqVO) { | 65 | public void updateRewardActivity(RewardActivityUpdateReqVO updateReqVO) { |
| 66 | // 1.1 校验存在 | 66 | // 1.1 校验存在 |
| 67 | RewardActivityDO dbRewardActivity = validateRewardActivityExists(updateReqVO.getId()); | 67 | RewardActivityDO dbRewardActivity = validateRewardActivityExists(updateReqVO.getId()); |
| 68 | - if (dbRewardActivity.getStatus().equals(PromotionActivityStatusEnum.CLOSE.getStatus())) { // 已关闭的活动,不能修改噢 | 68 | + if (dbRewardActivity.getStatus().equals(CommonStatusEnum.DISABLE.getStatus())) { // 已关闭的活动,不能修改噢 |
| 69 | throw exception(REWARD_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED); | 69 | throw exception(REWARD_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED); |
| 70 | } | 70 | } |
| 71 | // 1.2 校验商品范围 | 71 | // 1.2 校验商品范围 |
| 72 | validateProductScope(updateReqVO.getProductScope(), updateReqVO.getProductScopeValues()); | 72 | validateProductScope(updateReqVO.getProductScope(), updateReqVO.getProductScopeValues()); |
| 73 | // 1.3 校验商品是否冲突 | 73 | // 1.3 校验商品是否冲突 |
| 74 | - //validateRewardActivitySpuConflicts(updateReqVO.getId(), updateReqVO.getProductSpuIds()); | 74 | + validateRewardActivitySpuConflicts(updateReqVO.getId(), updateReqVO); |
| 75 | 75 | ||
| 76 | // 2. 更新 | 76 | // 2. 更新 |
| 77 | RewardActivityDO updateObj = RewardActivityConvert.INSTANCE.convert(updateReqVO) | 77 | RewardActivityDO updateObj = RewardActivityConvert.INSTANCE.convert(updateReqVO) |
| @@ -82,17 +82,13 @@ public class RewardActivityServiceImpl implements RewardActivityService { | @@ -82,17 +82,13 @@ public class RewardActivityServiceImpl implements RewardActivityService { | ||
| 82 | @Override | 82 | @Override |
| 83 | public void closeRewardActivity(Long id) { | 83 | public void closeRewardActivity(Long id) { |
| 84 | // 校验存在 | 84 | // 校验存在 |
| 85 | - // TODO @puhui999:去掉 PromotionActivityStatusEnum,使用 CommonStatus 作为状态哈。开启,关闭 | ||
| 86 | RewardActivityDO dbRewardActivity = validateRewardActivityExists(id); | 85 | RewardActivityDO dbRewardActivity = validateRewardActivityExists(id); |
| 87 | - if (dbRewardActivity.getStatus().equals(PromotionActivityStatusEnum.CLOSE.getStatus())) { // 已关闭的活动,不能关闭噢 | 86 | + if (dbRewardActivity.getStatus().equals(CommonStatusEnum.DISABLE.getStatus())) { // 已关闭的活动,不能关闭噢 |
| 88 | throw exception(REWARD_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED); | 87 | throw exception(REWARD_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED); |
| 89 | } | 88 | } |
| 90 | - if (dbRewardActivity.getStatus().equals(PromotionActivityStatusEnum.END.getStatus())) { // 已关闭的活动,不能关闭噢 | ||
| 91 | - throw exception(REWARD_ACTIVITY_CLOSE_FAIL_STATUS_END); | ||
| 92 | - } | ||
| 93 | 89 | ||
| 94 | // 更新 | 90 | // 更新 |
| 95 | - RewardActivityDO updateObj = new RewardActivityDO().setId(id).setStatus(PromotionActivityStatusEnum.CLOSE.getStatus()); | 91 | + RewardActivityDO updateObj = new RewardActivityDO().setId(id).setStatus(CommonStatusEnum.DISABLE.getStatus()); |
| 96 | rewardActivityMapper.updateById(updateObj); | 92 | rewardActivityMapper.updateById(updateObj); |
| 97 | } | 93 | } |
| 98 | 94 | ||
| @@ -100,7 +96,7 @@ public class RewardActivityServiceImpl implements RewardActivityService { | @@ -100,7 +96,7 @@ public class RewardActivityServiceImpl implements RewardActivityService { | ||
| 100 | public void deleteRewardActivity(Long id) { | 96 | public void deleteRewardActivity(Long id) { |
| 101 | // 校验存在 | 97 | // 校验存在 |
| 102 | RewardActivityDO dbRewardActivity = validateRewardActivityExists(id); | 98 | RewardActivityDO dbRewardActivity = validateRewardActivityExists(id); |
| 103 | - if (!dbRewardActivity.getStatus().equals(PromotionActivityStatusEnum.CLOSE.getStatus())) { // 未关闭的活动,不能删除噢 | 99 | + if (dbRewardActivity.getStatus().equals(CommonStatusEnum.ENABLE.getStatus())) { // 未关闭的活动,不能删除噢 |
| 104 | throw exception(REWARD_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED); | 100 | throw exception(REWARD_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED); |
| 105 | } | 101 | } |
| 106 | 102 | ||
| @@ -116,27 +112,30 @@ public class RewardActivityServiceImpl implements RewardActivityService { | @@ -116,27 +112,30 @@ public class RewardActivityServiceImpl implements RewardActivityService { | ||
| 116 | return activity; | 112 | return activity; |
| 117 | } | 113 | } |
| 118 | 114 | ||
| 119 | - // TODO @芋艿:逻辑有问题,需要优化;要分成全场、和指定来校验; | ||
| 120 | - // TODO @puhui999: 下次提交 fix | ||
| 121 | /** | 115 | /** |
| 122 | * 校验商品参加的活动是否冲突 | 116 | * 校验商品参加的活动是否冲突 |
| 123 | * | 117 | * |
| 124 | - * @param id 活动编号 | ||
| 125 | - * @param spuIds 商品 SPU 编号数组 | 118 | + * @param id 活动编号 |
| 119 | + * @param rewardActivity 请求 | ||
| 126 | */ | 120 | */ |
| 127 | - private void validateRewardActivitySpuConflicts(Long id, Collection<Long> spuIds) { | ||
| 128 | - if (CollUtil.isEmpty(spuIds)) { | ||
| 129 | - return; | ||
| 130 | - } | ||
| 131 | - // 查询商品参加的活动 | ||
| 132 | - List<RewardActivityDO> rewardActivityList = getRewardActivityListBySpuIds(spuIds, | ||
| 133 | - asList(PromotionActivityStatusEnum.WAIT.getStatus(), PromotionActivityStatusEnum.RUN.getStatus())); | 121 | + private void validateRewardActivitySpuConflicts(Long id, RewardActivityBaseVO rewardActivity) { |
| 122 | + List<RewardActivityDO> list = rewardActivityMapper.selectList(RewardActivityDO::getProductScope, | ||
| 123 | + rewardActivity.getProductScope(), RewardActivityDO::getStatus, CommonStatusEnum.ENABLE.getStatus()); | ||
| 134 | if (id != null) { // 排除自己这个活动 | 124 | if (id != null) { // 排除自己这个活动 |
| 135 | - rewardActivityList.removeIf(activity -> id.equals(activity.getId())); | 125 | + list.removeIf(activity -> id.equals(activity.getId())); |
| 126 | + } | ||
| 127 | + | ||
| 128 | + // 情况一:全部商品参加 | ||
| 129 | + if (PromotionProductScopeEnum.isAll(rewardActivity.getProductScope()) && !list.isEmpty()) { | ||
| 130 | + throw exception(REWARD_ACTIVITY_SCOPE_ALL_EXISTS); | ||
| 136 | } | 131 | } |
| 137 | - // 如果非空,则说明冲突 | ||
| 138 | - if (CollUtil.isNotEmpty(rewardActivityList)) { | ||
| 139 | - throw exception(REWARD_ACTIVITY_SPU_CONFLICTS); | 132 | + if (PromotionProductScopeEnum.isSpu(rewardActivity.getProductScope()) || // 情况二:指定商品参加 |
| 133 | + PromotionProductScopeEnum.isCategory(rewardActivity.getProductScope())) { // 情况三:指定商品类型参加 | ||
| 134 | + if (anyMatch(list, item -> !intersectionDistinct(item.getProductScopeValues(), | ||
| 135 | + rewardActivity.getProductScopeValues()).isEmpty())) { | ||
| 136 | + throw exception(PromotionProductScopeEnum.isSpu(rewardActivity.getProductScope()) ? | ||
| 137 | + REWARD_ACTIVITY_SPU_CONFLICTS : REWARD_ACTIVITY_SCOPE_CATEGORY_EXISTS); | ||
| 138 | + } | ||
| 140 | } | 139 | } |
| 141 | } | 140 | } |
| 142 | 141 | ||
| @@ -148,21 +147,6 @@ public class RewardActivityServiceImpl implements RewardActivityService { | @@ -148,21 +147,6 @@ public class RewardActivityServiceImpl implements RewardActivityService { | ||
| 148 | } | 147 | } |
| 149 | } | 148 | } |
| 150 | 149 | ||
| 151 | - /** | ||
| 152 | - * 获得商品参加的满减送活动的数组 | ||
| 153 | - * | ||
| 154 | - * @param spuIds 商品 SPU 编号数组 | ||
| 155 | - * @param statuses 活动状态数组 | ||
| 156 | - * @return 商品参加的满减送活动的数组 | ||
| 157 | - */ | ||
| 158 | - private List<RewardActivityDO> getRewardActivityListBySpuIds(Collection<Long> spuIds, | ||
| 159 | - Collection<Integer> statuses) { | ||
| 160 | - // TODO @puhui999: 下次 fix | ||
| 161 | - //List<RewardActivityDO> list = rewardActivityMapper.selectListByStatus(statuses); | ||
| 162 | - //return CollUtil.filter(list, activity -> CollUtil.containsAny(activity.getProductSpuIds(), spuIds)); | ||
| 163 | - return List.of(); | ||
| 164 | - } | ||
| 165 | - | ||
| 166 | @Override | 150 | @Override |
| 167 | public RewardActivityDO getRewardActivity(Long id) { | 151 | public RewardActivityDO getRewardActivity(Long id) { |
| 168 | return rewardActivityMapper.selectById(id); | 152 | return rewardActivityMapper.selectById(id); |
| @@ -176,31 +160,13 @@ public class RewardActivityServiceImpl implements RewardActivityService { | @@ -176,31 +160,13 @@ public class RewardActivityServiceImpl implements RewardActivityService { | ||
| 176 | @Override | 160 | @Override |
| 177 | public List<RewardActivityMatchRespDTO> getMatchRewardActivityList(Collection<Long> spuIds) { | 161 | public List<RewardActivityMatchRespDTO> getMatchRewardActivityList(Collection<Long> spuIds) { |
| 178 | // TODO 芋艿:待实现;先指定,然后再全局的; | 162 | // TODO 芋艿:待实现;先指定,然后再全局的; |
| 179 | -// // 如果有全局活动,则直接选择它 | ||
| 180 | -// List<RewardActivityDO> allActivities = rewardActivityMapper.selectListByProductScopeAndStatus( | ||
| 181 | -// PromotionProductScopeEnum.ALL.getScope(), PromotionActivityStatusEnum.RUN.getStatus()); | ||
| 182 | -// if (CollUtil.isNotEmpty(allActivities)) { | ||
| 183 | -// return MapUtil.builder(allActivities.get(0), spuIds).build(); | ||
| 184 | -// } | ||
| 185 | -// | ||
| 186 | -// // 查询某个活动参加的活动 | ||
| 187 | -// List<RewardActivityDO> productActivityList = getRewardActivityListBySpuIds(spuIds, | ||
| 188 | -// singleton(PromotionActivityStatusEnum.RUN.getStatus())); | ||
| 189 | -// return convertMap(productActivityList, activity -> activity, | ||
| 190 | -// rewardActivityDO -> intersectionDistinct(rewardActivityDO.getProductSpuIds(), spuIds)); // 求交集返回 | ||
| 191 | - return null; | 163 | + List<RewardActivityDO> list = rewardActivityMapper.selectListBySpuIdsAndStatus(spuIds, CommonStatusEnum.ENABLE.getStatus()); |
| 164 | + return BeanUtils.toBean(list, RewardActivityMatchRespDTO.class); | ||
| 192 | } | 165 | } |
| 193 | 166 | ||
| 194 | @Override | 167 | @Override |
| 195 | - public List<RewardActivityDO> getRewardActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime) { | ||
| 196 | - // 1. 查询出指定 spuId 的 spu 参加的活动 | ||
| 197 | - List<RewardActivityDO> rewardActivityList = rewardActivityMapper.selectListBySpuIdsAndStatus(spuIds, status); | ||
| 198 | - if (CollUtil.isEmpty(rewardActivityList)) { | ||
| 199 | - return Collections.emptyList(); | ||
| 200 | - } | ||
| 201 | - | ||
| 202 | - // 2. 查询活动详情 | ||
| 203 | - return rewardActivityMapper.selectListByIdsAndDateTimeLt(convertSet(rewardActivityList, RewardActivityDO::getId), dateTime); | 168 | + public List<RewardActivityDO> getRewardActivityByStatusAndDateTimeLt(Integer status, LocalDateTime dateTime) { |
| 169 | + return rewardActivityMapper.selectListByStatusAndDateTimeLt(status, dateTime); | ||
| 204 | } | 170 | } |
| 205 | 171 | ||
| 206 | } | 172 | } |
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.reward; | 1 | package cn.iocoder.yudao.module.promotion.service.reward; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | 5 | import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; |
| 6 | +import cn.iocoder.yudao.module.promotion.api.reward.dto.RewardActivityMatchRespDTO; | ||
| 5 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; | 7 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO; |
| 6 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; | 8 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; |
| 7 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; | 9 | import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityUpdateReqVO; |
| 8 | import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; | 10 | import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; |
| 9 | import cn.iocoder.yudao.module.promotion.dal.mysql.reward.RewardActivityMapper; | 11 | import cn.iocoder.yudao.module.promotion.dal.mysql.reward.RewardActivityMapper; |
| 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.PromotionConditionTypeEnum; |
| 12 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; | 13 | import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; |
| 14 | +import jakarta.annotation.Resource; | ||
| 13 | import org.junit.jupiter.api.Disabled; | 15 | import org.junit.jupiter.api.Disabled; |
| 14 | import org.junit.jupiter.api.Test; | 16 | import org.junit.jupiter.api.Test; |
| 15 | import org.springframework.context.annotation.Import; | 17 | import org.springframework.context.annotation.Import; |
| 16 | 18 | ||
| 17 | -import jakarta.annotation.Resource; | ||
| 18 | import java.time.Duration; | 19 | import java.time.Duration; |
| 20 | +import java.util.List; | ||
| 19 | import java.util.Set; | 21 | import java.util.Set; |
| 20 | 22 | ||
| 21 | import static cn.hutool.core.util.RandomUtil.randomEle; | 23 | import static cn.hutool.core.util.RandomUtil.randomEle; |
| @@ -27,15 +29,15 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServic | @@ -27,15 +29,15 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServic | ||
| 27 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; | 29 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; |
| 28 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; | 30 | import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; |
| 29 | import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.REWARD_ACTIVITY_NOT_EXISTS; | 31 | import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.REWARD_ACTIVITY_NOT_EXISTS; |
| 30 | -import static java.util.Arrays.asList; | 32 | +import static com.google.common.primitives.Longs.asList; |
| 31 | import static java.util.Collections.singletonList; | 33 | import static java.util.Collections.singletonList; |
| 32 | import static org.junit.jupiter.api.Assertions.*; | 34 | import static org.junit.jupiter.api.Assertions.*; |
| 33 | 35 | ||
| 34 | /** | 36 | /** |
| 35 | -* {@link RewardActivityServiceImpl} 的单元测试类 | ||
| 36 | -* | ||
| 37 | -* @author 芋道源码 | ||
| 38 | -*/ | 37 | + * {@link RewardActivityServiceImpl} 的单元测试类 |
| 38 | + * | ||
| 39 | + * @author 芋道源码 | ||
| 40 | + */ | ||
| 39 | @Disabled // TODO 芋艿:后续 fix 补充的单测 | 41 | @Disabled // TODO 芋艿:后续 fix 补充的单测 |
| 40 | @Import(RewardActivityServiceImpl.class) | 42 | @Import(RewardActivityServiceImpl.class) |
| 41 | public class RewardActivityServiceImplTest extends BaseDbUnitTest { | 43 | public class RewardActivityServiceImplTest extends BaseDbUnitTest { |
| @@ -63,7 +65,7 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { | @@ -63,7 +65,7 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { | ||
| 63 | // 校验记录的属性是否正确 | 65 | // 校验记录的属性是否正确 |
| 64 | RewardActivityDO rewardActivity = rewardActivityMapper.selectById(rewardActivityId); | 66 | RewardActivityDO rewardActivity = rewardActivityMapper.selectById(rewardActivityId); |
| 65 | assertPojoEquals(reqVO, rewardActivity, "rules"); | 67 | assertPojoEquals(reqVO, rewardActivity, "rules"); |
| 66 | - assertEquals(rewardActivity.getStatus(), PromotionActivityStatusEnum.WAIT.getStatus()); | 68 | + assertEquals(rewardActivity.getStatus(), CommonStatusEnum.DISABLE.getStatus()); |
| 67 | for (int i = 0; i < reqVO.getRules().size(); i++) { | 69 | for (int i = 0; i < reqVO.getRules().size(); i++) { |
| 68 | assertPojoEquals(reqVO.getRules().get(i), rewardActivity.getRules().get(i)); | 70 | assertPojoEquals(reqVO.getRules().get(i), rewardActivity.getRules().get(i)); |
| 69 | } | 71 | } |
| @@ -72,7 +74,7 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { | @@ -72,7 +74,7 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { | ||
| 72 | @Test | 74 | @Test |
| 73 | public void testUpdateRewardActivity_success() { | 75 | public void testUpdateRewardActivity_success() { |
| 74 | // mock 数据 | 76 | // mock 数据 |
| 75 | - RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.WAIT.getStatus())); | 77 | + RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); |
| 76 | rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据 | 78 | rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据 |
| 77 | // 准备参数 | 79 | // 准备参数 |
| 78 | RewardActivityUpdateReqVO reqVO = randomPojo(RewardActivityUpdateReqVO.class, o -> { | 80 | RewardActivityUpdateReqVO reqVO = randomPojo(RewardActivityUpdateReqVO.class, o -> { |
| @@ -88,7 +90,7 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { | @@ -88,7 +90,7 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { | ||
| 88 | // 校验是否更新正确 | 90 | // 校验是否更新正确 |
| 89 | RewardActivityDO rewardActivity = rewardActivityMapper.selectById(reqVO.getId()); // 获取最新的 | 91 | RewardActivityDO rewardActivity = rewardActivityMapper.selectById(reqVO.getId()); // 获取最新的 |
| 90 | assertPojoEquals(reqVO, rewardActivity, "rules"); | 92 | assertPojoEquals(reqVO, rewardActivity, "rules"); |
| 91 | - assertEquals(rewardActivity.getStatus(), PromotionActivityStatusEnum.WAIT.getStatus()); | 93 | + assertEquals(rewardActivity.getStatus(), CommonStatusEnum.DISABLE.getStatus()); |
| 92 | for (int i = 0; i < reqVO.getRules().size(); i++) { | 94 | for (int i = 0; i < reqVO.getRules().size(); i++) { |
| 93 | assertPojoEquals(reqVO.getRules().get(i), rewardActivity.getRules().get(i)); | 95 | assertPojoEquals(reqVO.getRules().get(i), rewardActivity.getRules().get(i)); |
| 94 | } | 96 | } |
| @@ -97,7 +99,7 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { | @@ -97,7 +99,7 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { | ||
| 97 | @Test | 99 | @Test |
| 98 | public void testCloseRewardActivity() { | 100 | public void testCloseRewardActivity() { |
| 99 | // mock 数据 | 101 | // mock 数据 |
| 100 | - RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.WAIT.getStatus())); | 102 | + RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); |
| 101 | rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据 | 103 | rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据 |
| 102 | // 准备参数 | 104 | // 准备参数 |
| 103 | Long id = dbRewardActivity.getId(); | 105 | Long id = dbRewardActivity.getId(); |
| @@ -106,7 +108,7 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { | @@ -106,7 +108,7 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { | ||
| 106 | rewardActivityService.closeRewardActivity(id); | 108 | rewardActivityService.closeRewardActivity(id); |
| 107 | // 校验状态 | 109 | // 校验状态 |
| 108 | RewardActivityDO rewardActivity = rewardActivityMapper.selectById(id); | 110 | RewardActivityDO rewardActivity = rewardActivityMapper.selectById(id); |
| 109 | - assertEquals(rewardActivity.getStatus(), PromotionActivityStatusEnum.CLOSE.getStatus()); | 111 | + assertEquals(rewardActivity.getStatus(), CommonStatusEnum.DISABLE.getStatus()); |
| 110 | } | 112 | } |
| 111 | 113 | ||
| 112 | @Test | 114 | @Test |
| @@ -121,15 +123,15 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { | @@ -121,15 +123,15 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { | ||
| 121 | @Test | 123 | @Test |
| 122 | public void testDeleteRewardActivity_success() { | 124 | public void testDeleteRewardActivity_success() { |
| 123 | // mock 数据 | 125 | // mock 数据 |
| 124 | - RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.CLOSE.getStatus())); | 126 | + RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())); |
| 125 | rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据 | 127 | rewardActivityMapper.insert(dbRewardActivity);// @Sql: 先插入出一条存在的数据 |
| 126 | // 准备参数 | 128 | // 准备参数 |
| 127 | Long id = dbRewardActivity.getId(); | 129 | Long id = dbRewardActivity.getId(); |
| 128 | 130 | ||
| 129 | // 调用 | 131 | // 调用 |
| 130 | rewardActivityService.deleteRewardActivity(id); | 132 | rewardActivityService.deleteRewardActivity(id); |
| 131 | - // 校验数据不存在了 | ||
| 132 | - assertNull(rewardActivityMapper.selectById(id)); | 133 | + // 校验数据不存在了 |
| 134 | + assertNull(rewardActivityMapper.selectById(id)); | ||
| 133 | } | 135 | } |
| 134 | 136 | ||
| 135 | @Test | 137 | @Test |
| @@ -143,78 +145,82 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { | @@ -143,78 +145,82 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest { | ||
| 143 | 145 | ||
| 144 | @Test | 146 | @Test |
| 145 | public void testGetRewardActivityPage() { | 147 | public void testGetRewardActivityPage() { |
| 146 | - // mock 数据 | ||
| 147 | - RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> { // 等会查询到 | ||
| 148 | - o.setName("芋艿"); | ||
| 149 | - o.setStatus(PromotionActivityStatusEnum.CLOSE.getStatus()); | ||
| 150 | - }); | ||
| 151 | - rewardActivityMapper.insert(dbRewardActivity); | ||
| 152 | - // 测试 name 不匹配 | ||
| 153 | - rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setName("土豆"))); | ||
| 154 | - // 测试 status 不匹配 | ||
| 155 | - rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus()))); | ||
| 156 | - // 准备参数 | ||
| 157 | - RewardActivityPageReqVO reqVO = new RewardActivityPageReqVO(); | ||
| 158 | - reqVO.setName("芋艿"); | ||
| 159 | - reqVO.setStatus(PromotionActivityStatusEnum.CLOSE.getStatus()); | ||
| 160 | - | ||
| 161 | - // 调用 | ||
| 162 | - PageResult<RewardActivityDO> pageResult = rewardActivityService.getRewardActivityPage(reqVO); | ||
| 163 | - // 断言 | ||
| 164 | - assertEquals(1, pageResult.getTotal()); | ||
| 165 | - assertEquals(1, pageResult.getList().size()); | ||
| 166 | - assertPojoEquals(dbRewardActivity, pageResult.getList().get(0), "rules"); | 148 | + // mock 数据 |
| 149 | + RewardActivityDO dbRewardActivity = randomPojo(RewardActivityDO.class, o -> { // 等会查询到 | ||
| 150 | + o.setName("芋艿"); | ||
| 151 | + o.setStatus(CommonStatusEnum.DISABLE.getStatus()); | ||
| 152 | + }); | ||
| 153 | + rewardActivityMapper.insert(dbRewardActivity); | ||
| 154 | + // 测试 name 不匹配 | ||
| 155 | + rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setName("土豆"))); | ||
| 156 | + // 测试 status 不匹配 | ||
| 157 | + rewardActivityMapper.insert(cloneIgnoreId(dbRewardActivity, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()))); | ||
| 158 | + // 准备参数 | ||
| 159 | + RewardActivityPageReqVO reqVO = new RewardActivityPageReqVO(); | ||
| 160 | + reqVO.setName("芋艿"); | ||
| 161 | + reqVO.setStatus(CommonStatusEnum.DISABLE.getStatus()); | ||
| 162 | + | ||
| 163 | + // 调用 | ||
| 164 | + PageResult<RewardActivityDO> pageResult = rewardActivityService.getRewardActivityPage(reqVO); | ||
| 165 | + // 断言 | ||
| 166 | + assertEquals(1, pageResult.getTotal()); | ||
| 167 | + assertEquals(1, pageResult.getList().size()); | ||
| 168 | + assertPojoEquals(dbRewardActivity, pageResult.getList().get(0), "rules"); | ||
| 167 | } | 169 | } |
| 168 | 170 | ||
| 169 | @Test | 171 | @Test |
| 170 | public void testGetRewardActivities_all() { | 172 | public void testGetRewardActivities_all() { |
| 171 | // mock 数据 | 173 | // mock 数据 |
| 172 | - RewardActivityDO allActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus()) | 174 | + RewardActivityDO allActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) |
| 173 | .setProductScope(PromotionProductScopeEnum.ALL.getScope())); | 175 | .setProductScope(PromotionProductScopeEnum.ALL.getScope())); |
| 174 | rewardActivityMapper.insert(allActivity); | 176 | rewardActivityMapper.insert(allActivity); |
| 175 | - RewardActivityDO productActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus()) | ||
| 176 | - .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductSpuIds(asList(1L, 2L))); | 177 | + RewardActivityDO productActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) |
| 178 | + .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductScopeValues(asList(1L, 2L))); | ||
| 177 | rewardActivityMapper.insert(productActivity); | 179 | rewardActivityMapper.insert(productActivity); |
| 178 | // 准备参数 | 180 | // 准备参数 |
| 179 | Set<Long> spuIds = asSet(1L, 2L); | 181 | Set<Long> spuIds = asSet(1L, 2L); |
| 180 | 182 | ||
| 181 | // 调用 TODO getMatchRewardActivities 没有这个方法,但是找到了 getMatchRewardActivityList | 183 | // 调用 TODO getMatchRewardActivities 没有这个方法,但是找到了 getMatchRewardActivityList |
| 182 | - //Map<RewardActivityDO, Set<Long>> matchRewardActivities = rewardActivityService.getMatchRewardActivities(spuIds); | 184 | + List<RewardActivityMatchRespDTO> matchRewardActivityList = rewardActivityService.getMatchRewardActivityList(spuIds); |
| 183 | // 断言 | 185 | // 断言 |
| 184 | - //assertEquals(matchRewardActivities.size(), 1); | ||
| 185 | - //Map.Entry<RewardActivityDO, Set<Long>> next = matchRewardActivities.entrySet().iterator().next(); | ||
| 186 | - //assertPojoEquals(next.getKey(), allActivity); | ||
| 187 | - //assertEquals(next.getValue(), spuIds); | 186 | + assertEquals(matchRewardActivityList.size(), 1); |
| 187 | + matchRewardActivityList.forEach((activity) -> { | ||
| 188 | + if (activity.getId().equals(productActivity.getId())) { | ||
| 189 | + assertPojoEquals(activity, productActivity); | ||
| 190 | + assertEquals(activity.getProductScopeValues(), asList(1L, 2L)); | ||
| 191 | + } else { | ||
| 192 | + fail(); | ||
| 193 | + } | ||
| 194 | + }); | ||
| 188 | } | 195 | } |
| 189 | 196 | ||
| 190 | @Test | 197 | @Test |
| 191 | public void testGetRewardActivities_product() { | 198 | public void testGetRewardActivities_product() { |
| 192 | // mock 数据 | 199 | // mock 数据 |
| 193 | - // TODO @puhui999:有单测的问题,也一起瞅瞅 | ||
| 194 | - RewardActivityDO productActivity01 = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus()) | ||
| 195 | - .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductSpuIds(asList(1L, 2L))); | 200 | + RewardActivityDO productActivity01 = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) |
| 201 | + .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductScopeValues(asList(1L, 2L))); | ||
| 196 | rewardActivityMapper.insert(productActivity01); | 202 | rewardActivityMapper.insert(productActivity01); |
| 197 | - RewardActivityDO productActivity02 = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus()) | ||
| 198 | - .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductSpuIds(singletonList(3L))); | 203 | + RewardActivityDO productActivity02 = randomPojo(RewardActivityDO.class, o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()) |
| 204 | + .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductScopeValues(singletonList(3L))); | ||
| 199 | rewardActivityMapper.insert(productActivity02); | 205 | rewardActivityMapper.insert(productActivity02); |
| 200 | // 准备参数 | 206 | // 准备参数 |
| 201 | Set<Long> spuIds = asSet(1L, 2L, 3L); | 207 | Set<Long> spuIds = asSet(1L, 2L, 3L); |
| 202 | 208 | ||
| 203 | // 调用 TODO getMatchRewardActivities 没有这个方法,但是找到了 getMatchRewardActivityList | 209 | // 调用 TODO getMatchRewardActivities 没有这个方法,但是找到了 getMatchRewardActivityList |
| 204 | - //Map<RewardActivityDO, Set<Long>> matchRewardActivities = rewardActivityService.getMatchRewardActivities(spuIds); | 210 | + List<RewardActivityMatchRespDTO> matchRewardActivityList = rewardActivityService.getMatchRewardActivityList(spuIds); |
| 205 | // 断言 | 211 | // 断言 |
| 206 | - //assertEquals(matchRewardActivities.size(), 2); | ||
| 207 | - //matchRewardActivities.forEach((activity, activitySpuIds) -> { | ||
| 208 | - // if (activity.getId().equals(productActivity01.getId())) { | ||
| 209 | - // assertPojoEquals(activity, productActivity01); | ||
| 210 | - // assertEquals(activitySpuIds, asSet(1L, 2L)); | ||
| 211 | - // } else if (activity.getId().equals(productActivity02.getId())) { | ||
| 212 | - // assertPojoEquals(activity, productActivity02); | ||
| 213 | - // assertEquals(activitySpuIds, asSet(3L)); | ||
| 214 | - // } else { | ||
| 215 | - // fail(); | ||
| 216 | - // } | ||
| 217 | - //}); | 212 | + assertEquals(matchRewardActivityList.size(), 2); |
| 213 | + matchRewardActivityList.forEach((activity) -> { | ||
| 214 | + if (activity.getId().equals(productActivity01.getId())) { | ||
| 215 | + assertPojoEquals(activity, productActivity01); | ||
| 216 | + assertEquals(activity.getProductScopeValues(), asList(1L, 2L)); | ||
| 217 | + } else if (activity.getId().equals(productActivity02.getId())) { | ||
| 218 | + assertPojoEquals(activity, productActivity02); | ||
| 219 | + assertEquals(activity.getProductScopeValues(), singletonList(3L)); | ||
| 220 | + } else { | ||
| 221 | + fail(); | ||
| 222 | + } | ||
| 223 | + }); | ||
| 218 | } | 224 | } |
| 219 | 225 | ||
| 220 | } | 226 | } |
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/order/TradeOrderApi.java
| 1 | package cn.iocoder.yudao.module.trade.api.order; | 1 | package cn.iocoder.yudao.module.trade.api.order; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.module.trade.api.order.dto.TradeOrderRespDTO; | 3 | import cn.iocoder.yudao.module.trade.api.order.dto.TradeOrderRespDTO; |
| 4 | +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderCancelTypeEnum; | ||
| 4 | 5 | ||
| 5 | import java.util.Collection; | 6 | import java.util.Collection; |
| 6 | import java.util.List; | 7 | import java.util.List; |
| @@ -31,9 +32,10 @@ public interface TradeOrderApi { | @@ -31,9 +32,10 @@ public interface TradeOrderApi { | ||
| 31 | /** | 32 | /** |
| 32 | * 取消支付订单 | 33 | * 取消支付订单 |
| 33 | * | 34 | * |
| 34 | - * @param userId 用户编号 | ||
| 35 | - * @param orderId 订单编号 | 35 | + * @param userId 用户编号 |
| 36 | + * @param orderId 订单编号 | ||
| 37 | + * @param cancelTypeEnum 取消类型 | ||
| 36 | */ | 38 | */ |
| 37 | - void cancelPaidOrder(Long userId, Long orderId); | 39 | + void cancelPaidOrder(Long userId, Long orderId, TradeOrderCancelTypeEnum cancelTypeEnum); |
| 38 | 40 | ||
| 39 | } | 41 | } |
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/order/TradeOrderCancelTypeEnum.java
| @@ -17,7 +17,8 @@ public enum TradeOrderCancelTypeEnum implements IntArrayValuable { | @@ -17,7 +17,8 @@ public enum TradeOrderCancelTypeEnum implements IntArrayValuable { | ||
| 17 | 17 | ||
| 18 | PAY_TIMEOUT(10, "超时未支付"), | 18 | PAY_TIMEOUT(10, "超时未支付"), |
| 19 | AFTER_SALE_CLOSE(20, "退款关闭"), | 19 | AFTER_SALE_CLOSE(20, "退款关闭"), |
| 20 | - MEMBER_CANCEL(30, "买家取消"); | 20 | + MEMBER_CANCEL(30, "买家取消"), |
| 21 | + COMBINATION_CLOSE(40, "拼团关闭"); | ||
| 21 | 22 | ||
| 22 | public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderCancelTypeEnum::getType).toArray(); | 23 | public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(TradeOrderCancelTypeEnum::getType).toArray(); |
| 23 | 24 |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/order/TradeOrderApiImpl.java
| @@ -2,12 +2,13 @@ package cn.iocoder.yudao.module.trade.api.order; | @@ -2,12 +2,13 @@ package cn.iocoder.yudao.module.trade.api.order; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.module.trade.api.order.dto.TradeOrderRespDTO; | 3 | import cn.iocoder.yudao.module.trade.api.order.dto.TradeOrderRespDTO; |
| 4 | import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; | 4 | import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; |
| 5 | +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderCancelTypeEnum; | ||
| 5 | import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; | 6 | import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; |
| 6 | import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService; | 7 | import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService; |
| 8 | +import jakarta.annotation.Resource; | ||
| 7 | import org.springframework.stereotype.Service; | 9 | import org.springframework.stereotype.Service; |
| 8 | import org.springframework.validation.annotation.Validated; | 10 | import org.springframework.validation.annotation.Validated; |
| 9 | 11 | ||
| 10 | -import jakarta.annotation.Resource; | ||
| 11 | import java.util.Collection; | 12 | import java.util.Collection; |
| 12 | import java.util.List; | 13 | import java.util.List; |
| 13 | 14 | ||
| @@ -36,8 +37,8 @@ public class TradeOrderApiImpl implements TradeOrderApi { | @@ -36,8 +37,8 @@ public class TradeOrderApiImpl implements TradeOrderApi { | ||
| 36 | } | 37 | } |
| 37 | 38 | ||
| 38 | @Override | 39 | @Override |
| 39 | - public void cancelPaidOrder(Long userId, Long orderId) { | ||
| 40 | - tradeOrderUpdateService.cancelPaidOrder(userId, orderId); | 40 | + public void cancelPaidOrder(Long userId, Long orderId, TradeOrderCancelTypeEnum cancelTypeEnum) { |
| 41 | + tradeOrderUpdateService.cancelPaidOrder(userId, orderId, cancelTypeEnum); | ||
| 41 | } | 42 | } |
| 42 | 43 | ||
| 43 | } | 44 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateService.java
| 1 | package cn.iocoder.yudao.module.trade.service.order; | 1 | package cn.iocoder.yudao.module.trade.service.order; |
| 2 | 2 | ||
| 3 | -import cn.iocoder.yudao.framework.common.enums.TerminalEnum; | ||
| 4 | import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO; | 3 | import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO; |
| 5 | import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO; | 4 | import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO; |
| 6 | import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO; | 5 | import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO; |
| @@ -10,7 +9,7 @@ import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettle | @@ -10,7 +9,7 @@ import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettle | ||
| 10 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettlementRespVO; | 9 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettlementRespVO; |
| 11 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.item.AppTradeOrderItemCommentCreateReqVO; | 10 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.item.AppTradeOrderItemCommentCreateReqVO; |
| 12 | import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; | 11 | import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; |
| 13 | - | 12 | +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderCancelTypeEnum; |
| 14 | import jakarta.validation.constraints.NotNull; | 13 | import jakarta.validation.constraints.NotNull; |
| 15 | 14 | ||
| 16 | /** | 15 | /** |
| @@ -188,12 +187,14 @@ public interface TradeOrderUpdateService { | @@ -188,12 +187,14 @@ public interface TradeOrderUpdateService { | ||
| 188 | void updateOrderCombinationInfo(Long orderId, Long activityId, Long combinationRecordId, Long headId); | 187 | void updateOrderCombinationInfo(Long orderId, Long activityId, Long combinationRecordId, Long headId); |
| 189 | 188 | ||
| 190 | // TODO 芋艿:拼团取消,不调这个接口哈; | 189 | // TODO 芋艿:拼团取消,不调这个接口哈; |
| 190 | + | ||
| 191 | /** | 191 | /** |
| 192 | * 取消支付订单 | 192 | * 取消支付订单 |
| 193 | * | 193 | * |
| 194 | - * @param userId 用户编号 | ||
| 195 | - * @param orderId 订单编号 | 194 | + * @param userId 用户编号 |
| 195 | + * @param orderId 订单编号 | ||
| 196 | + * @param cancelTypeEnum 取消类型 | ||
| 196 | */ | 197 | */ |
| 197 | - void cancelPaidOrder(Long userId, Long orderId); | 198 | + void cancelPaidOrder(Long userId, Long orderId, TradeOrderCancelTypeEnum cancelTypeEnum); |
| 198 | 199 | ||
| 199 | } | 200 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
| @@ -858,13 +858,13 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -858,13 +858,13 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 858 | 858 | ||
| 859 | @Override | 859 | @Override |
| 860 | @Transactional(rollbackFor = Exception.class) | 860 | @Transactional(rollbackFor = Exception.class) |
| 861 | - public void cancelPaidOrder(Long userId, Long orderId) { | ||
| 862 | - // TODO @puhui999:可能要加一个拼团取消;TradeOrderCancelTypeEnum.AFTER_SALE_CLOSE;然后参数传入下; | 861 | + public void cancelPaidOrder(Long userId, Long orderId, TradeOrderCancelTypeEnum cancelTypeEnum) { |
| 863 | // 1.1 检验订单存在 | 862 | // 1.1 检验订单存在 |
| 864 | TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(orderId, userId); | 863 | TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(orderId, userId); |
| 865 | if (order == null) { | 864 | if (order == null) { |
| 866 | throw exception(ORDER_NOT_FOUND); | 865 | throw exception(ORDER_NOT_FOUND); |
| 867 | } | 866 | } |
| 867 | + | ||
| 868 | // 1.2 校验订单是否支付 | 868 | // 1.2 校验订单是否支付 |
| 869 | if (!order.getPayStatus()) { | 869 | if (!order.getPayStatus()) { |
| 870 | throw exception(ORDER_CANCEL_PAID_FAIL, "已支付"); | 870 | throw exception(ORDER_CANCEL_PAID_FAIL, "已支付"); |
| @@ -875,13 +875,13 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | @@ -875,13 +875,13 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { | ||
| 875 | } | 875 | } |
| 876 | 876 | ||
| 877 | // 2.1 取消订单 | 877 | // 2.1 取消订单 |
| 878 | - cancelOrder0(order, TradeOrderCancelTypeEnum.AFTER_SALE_CLOSE); | 878 | + cancelOrder0(order, cancelTypeEnum); |
| 879 | // 2.2 创建退款单 | 879 | // 2.2 创建退款单 |
| 880 | payRefundApi.createRefund(new PayRefundCreateReqDTO() | 880 | payRefundApi.createRefund(new PayRefundCreateReqDTO() |
| 881 | .setAppKey(tradeOrderProperties.getPayAppKey()).setUserIp(getClientIP()) // 支付应用 | 881 | .setAppKey(tradeOrderProperties.getPayAppKey()).setUserIp(getClientIP()) // 支付应用 |
| 882 | .setMerchantOrderId(String.valueOf(order.getId())) // 支付单号 | 882 | .setMerchantOrderId(String.valueOf(order.getId())) // 支付单号 |
| 883 | .setMerchantRefundId(String.valueOf(order.getId())) | 883 | .setMerchantRefundId(String.valueOf(order.getId())) |
| 884 | - .setReason("取消支付订单").setPrice(order.getPayPrice()));// 价格信息 | 884 | + .setReason(cancelTypeEnum.getName()).setPrice(order.getPayPrice()));// 价格信息 |
| 885 | } | 885 | } |
| 886 | 886 | ||
| 887 | /** | 887 | /** |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculator.java
| @@ -10,10 +10,10 @@ import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; | @@ -10,10 +10,10 @@ import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum; | ||
| 10 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; | 10 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum; |
| 11 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; | 11 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateReqBO; |
| 12 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; | 12 | import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; |
| 13 | +import jakarta.annotation.Resource; | ||
| 13 | import org.springframework.core.annotation.Order; | 14 | import org.springframework.core.annotation.Order; |
| 14 | import org.springframework.stereotype.Component; | 15 | import org.springframework.stereotype.Component; |
| 15 | 16 | ||
| 16 | -import jakarta.annotation.Resource; | ||
| 17 | import java.util.List; | 17 | import java.util.List; |
| 18 | 18 | ||
| 19 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; | 19 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| @@ -96,7 +96,7 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator | @@ -96,7 +96,7 @@ public class TradeRewardActivityPriceCalculator implements TradePriceCalculator | ||
| 96 | private List<TradePriceCalculateRespBO.OrderItem> filterMatchCouponOrderItems(TradePriceCalculateRespBO result, | 96 | private List<TradePriceCalculateRespBO.OrderItem> filterMatchCouponOrderItems(TradePriceCalculateRespBO result, |
| 97 | RewardActivityMatchRespDTO rewardActivity) { | 97 | RewardActivityMatchRespDTO rewardActivity) { |
| 98 | return filterList(result.getItems(), | 98 | return filterList(result.getItems(), |
| 99 | - orderItem -> CollUtil.contains(rewardActivity.getSpuIds(), orderItem.getSpuId())); | 99 | + orderItem -> CollUtil.contains(rewardActivity.getProductScopeValues(), orderItem.getSpuId())); |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | /** | 102 | /** |
yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/price/calculator/TradeRewardActivityPriceCalculatorTest.java
| @@ -63,10 +63,10 @@ public class TradeRewardActivityPriceCalculatorTest extends BaseMockitoUnitTest | @@ -63,10 +63,10 @@ public class TradeRewardActivityPriceCalculatorTest extends BaseMockitoUnitTest | ||
| 63 | // mock 方法(限时折扣 DiscountActivity 信息) | 63 | // mock 方法(限时折扣 DiscountActivity 信息) |
| 64 | when(rewardActivityApi.getMatchRewardActivityList(eq(asSet(1L, 2L, 3L)))).thenReturn(asList( | 64 | when(rewardActivityApi.getMatchRewardActivityList(eq(asSet(1L, 2L, 3L)))).thenReturn(asList( |
| 65 | randomPojo(RewardActivityMatchRespDTO.class, o -> o.setId(1000L).setName("活动 1000 号") | 65 | randomPojo(RewardActivityMatchRespDTO.class, o -> o.setId(1000L).setName("活动 1000 号") |
| 66 | - .setSpuIds(asList(1L, 2L)).setConditionType(PromotionConditionTypeEnum.PRICE.getType()) | 66 | + .setProductScopeValues(asList(1L, 2L)).setConditionType(PromotionConditionTypeEnum.PRICE.getType()) |
| 67 | .setRules(singletonList(new RewardActivityMatchRespDTO.Rule().setLimit(200).setDiscountPrice(70)))), | 67 | .setRules(singletonList(new RewardActivityMatchRespDTO.Rule().setLimit(200).setDiscountPrice(70)))), |
| 68 | randomPojo(RewardActivityMatchRespDTO.class, o -> o.setId(2000L).setName("活动 2000 号") | 68 | randomPojo(RewardActivityMatchRespDTO.class, o -> o.setId(2000L).setName("活动 2000 号") |
| 69 | - .setSpuIds(singletonList(3L)).setConditionType(PromotionConditionTypeEnum.COUNT.getType()) | 69 | + .setProductScopeValues(singletonList(3L)).setConditionType(PromotionConditionTypeEnum.COUNT.getType()) |
| 70 | .setRules(asList(new RewardActivityMatchRespDTO.Rule().setLimit(1).setDiscountPrice(10), | 70 | .setRules(asList(new RewardActivityMatchRespDTO.Rule().setLimit(1).setDiscountPrice(10), |
| 71 | new RewardActivityMatchRespDTO.Rule().setLimit(2).setDiscountPrice(60), // 最大可满足,因为是 4 个 | 71 | new RewardActivityMatchRespDTO.Rule().setLimit(2).setDiscountPrice(60), // 最大可满足,因为是 4 个 |
| 72 | new RewardActivityMatchRespDTO.Rule().setLimit(10).setDiscountPrice(100)))) | 72 | new RewardActivityMatchRespDTO.Rule().setLimit(10).setDiscountPrice(100)))) |
| @@ -175,7 +175,7 @@ public class TradeRewardActivityPriceCalculatorTest extends BaseMockitoUnitTest | @@ -175,7 +175,7 @@ public class TradeRewardActivityPriceCalculatorTest extends BaseMockitoUnitTest | ||
| 175 | // mock 方法(限时折扣 DiscountActivity 信息) | 175 | // mock 方法(限时折扣 DiscountActivity 信息) |
| 176 | when(rewardActivityApi.getMatchRewardActivityList(eq(asSet(1L, 2L)))).thenReturn(singletonList( | 176 | when(rewardActivityApi.getMatchRewardActivityList(eq(asSet(1L, 2L)))).thenReturn(singletonList( |
| 177 | randomPojo(RewardActivityMatchRespDTO.class, o -> o.setId(1000L).setName("活动 1000 号") | 177 | randomPojo(RewardActivityMatchRespDTO.class, o -> o.setId(1000L).setName("活动 1000 号") |
| 178 | - .setSpuIds(asList(1L, 2L)).setConditionType(PromotionConditionTypeEnum.PRICE.getType()) | 178 | + .setProductScopeValues(asList(1L, 2L)).setConditionType(PromotionConditionTypeEnum.PRICE.getType()) |
| 179 | .setRules(singletonList(new RewardActivityMatchRespDTO.Rule().setLimit(351).setDiscountPrice(70)))) | 179 | .setRules(singletonList(new RewardActivityMatchRespDTO.Rule().setLimit(351).setDiscountPrice(70)))) |
| 180 | )); | 180 | )); |
| 181 | 181 |