Commit 5f7505d4acd68a6f2442f2ce4155256f48537269
1 parent
996d1ca1
【代码评审】商城:满减送的校验逻辑
Showing
2 changed files
with
7 additions
and
5 deletions
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
| @@ -44,7 +44,7 @@ public interface ErrorCodeConstants { | @@ -44,7 +44,7 @@ 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_SCOPE_EXISTS = new ErrorCode(1_013_006_005, "与该时间段已存在的满减送活动商品范围冲突。注意商品范围 全部 > 分类 > 商品"); | 47 | + ErrorCode REWARD_ACTIVITY_SCOPE_EXISTS = new ErrorCode(1_013_006_005, "与该时间段已存在的满减送活动商品范围冲突"); |
| 48 | 48 | ||
| 49 | // ========== TODO 空着 1-013-007-000 ============ | 49 | // ========== TODO 空着 1-013-007-000 ============ |
| 50 | 50 |
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/reward/RewardActivityServiceImpl.java
| @@ -117,28 +117,30 @@ public class RewardActivityServiceImpl implements RewardActivityService { | @@ -117,28 +117,30 @@ public class RewardActivityServiceImpl implements RewardActivityService { | ||
| 117 | * @param rewardActivity 请求 | 117 | * @param rewardActivity 请求 |
| 118 | */ | 118 | */ |
| 119 | private void validateRewardActivitySpuConflicts(Long id, RewardActivityBaseVO rewardActivity) { | 119 | private void validateRewardActivitySpuConflicts(Long id, RewardActivityBaseVO rewardActivity) { |
| 120 | - // 0. 获得开启的所有的活动 | 120 | + // 1. 获得开启的所有的活动 |
| 121 | List<RewardActivityDO> list = rewardActivityMapper.selectList(RewardActivityDO::getStatus, CommonStatusEnum.ENABLE.getStatus()); | 121 | List<RewardActivityDO> list = rewardActivityMapper.selectList(RewardActivityDO::getStatus, CommonStatusEnum.ENABLE.getStatus()); |
| 122 | if (id != null) { // 排除自己这个活动 | 122 | if (id != null) { // 排除自己这个活动 |
| 123 | list.removeIf(activity -> id.equals(activity.getId())); | 123 | list.removeIf(activity -> id.equals(activity.getId())); |
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | - // 完全不允许重叠。 | 126 | + // 2. 完全不允许重叠 |
| 127 | for (RewardActivityDO item : list) { | 127 | for (RewardActivityDO item : list) { |
| 128 | - // 1.1 校验满减送活动时间是否冲突,如果时段不冲突那么不同的时间段内则可以存在相同的商品范围 | 128 | + // 2.1 校验满减送活动时间是否冲突,如果时段不冲突那么不同的时间段内则可以存在相同的商品范围 |
| 129 | if (!LocalDateTimeUtil.isOverlap(item.getStartTime(), item.getEndTime(), | 129 | if (!LocalDateTimeUtil.isOverlap(item.getStartTime(), item.getEndTime(), |
| 130 | rewardActivity.getStartTime(), rewardActivity.getEndTime())) { | 130 | rewardActivity.getStartTime(), rewardActivity.getEndTime())) { |
| 131 | continue; | 131 | continue; |
| 132 | } | 132 | } |
| 133 | - // 1.2 校验商品范围是否重叠 | 133 | + // 2.2 校验商品范围是否重叠 |
| 134 | // 情况一:如果与该时间段内商品范围为全部的活动冲突,或 rewardActivity 商品范围为全部,那么则直接校验不通过 | 134 | // 情况一:如果与该时间段内商品范围为全部的活动冲突,或 rewardActivity 商品范围为全部,那么则直接校验不通过 |
| 135 | // 例如说,rewardActivity 是全部活动,结果有个 db 里的 activity 是某个分类,它也是冲突的。也就是说,当前时间段内,有且仅有只能有一个活动! | 135 | // 例如说,rewardActivity 是全部活动,结果有个 db 里的 activity 是某个分类,它也是冲突的。也就是说,当前时间段内,有且仅有只能有一个活动! |
| 136 | if (PromotionProductScopeEnum.isAll(item.getProductScope()) || | 136 | if (PromotionProductScopeEnum.isAll(item.getProductScope()) || |
| 137 | PromotionProductScopeEnum.isAll(rewardActivity.getProductScope())) { | 137 | PromotionProductScopeEnum.isAll(rewardActivity.getProductScope())) { |
| 138 | + // TODO puhui999:需要提示出来与满减送活动“xxx 活动”存在商品范围冲突;这里可能要分情况,下面需要把 activityName 传入 | ||
| 138 | throw exception(REWARD_ACTIVITY_SCOPE_EXISTS); | 139 | throw exception(REWARD_ACTIVITY_SCOPE_EXISTS); |
| 139 | } | 140 | } |
| 140 | // 情况二:如果与该时间段内商品范围为类别的活动冲突 | 141 | // 情况二:如果与该时间段内商品范围为类别的活动冲突 |
| 141 | if (PromotionProductScopeEnum.isCategory(item.getProductScope())) { | 142 | if (PromotionProductScopeEnum.isCategory(item.getProductScope())) { |
| 143 | + // TODO puhui999:前端我们有限制,只允许子分类么?可能要限制下,不然基于分类查询不到对应的商品。因为商品目前必须在子分类下 | ||
| 142 | // 校验分类是否冲突 | 144 | // 校验分类是否冲突 |
| 143 | if (PromotionProductScopeEnum.isCategory(rewardActivity.getProductScope())) { | 145 | if (PromotionProductScopeEnum.isCategory(rewardActivity.getProductScope())) { |
| 144 | if (!intersectionDistinct(item.getProductScopeValues(), rewardActivity.getProductScopeValues()).isEmpty()) { | 146 | if (!intersectionDistinct(item.getProductScopeValues(), rewardActivity.getProductScopeValues()).isEmpty()) { |