【代码评审】商城:满减送的校验逻辑

This commit is contained in:
YunaiV 2024-09-10 21:24:51 +08:00
parent 996d1ca18e
commit 5f7505d4ac
2 changed files with 7 additions and 5 deletions

View File

@ -44,7 +44,7 @@ public interface ErrorCodeConstants {
ErrorCode REWARD_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_006_002, "满减送活动已关闭,不能修改"); ErrorCode REWARD_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_006_002, "满减送活动已关闭,不能修改");
ErrorCode REWARD_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED = new ErrorCode(1_013_006_003, "满减送活动未关闭,不能删除"); ErrorCode REWARD_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED = new ErrorCode(1_013_006_003, "满减送活动未关闭,不能删除");
ErrorCode REWARD_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_006_004, "满减送活动已关闭,不能重复关闭"); ErrorCode REWARD_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1_013_006_004, "满减送活动已关闭,不能重复关闭");
ErrorCode REWARD_ACTIVITY_SCOPE_EXISTS = new ErrorCode(1_013_006_005, "与该时间段已存在的满减送活动商品范围冲突。注意商品范围 全部 > 分类 > 商品"); ErrorCode REWARD_ACTIVITY_SCOPE_EXISTS = new ErrorCode(1_013_006_005, "与该时间段已存在的满减送活动商品范围冲突");
// ========== TODO 空着 1-013-007-000 ============ // ========== TODO 空着 1-013-007-000 ============

View File

@ -117,28 +117,30 @@ public class RewardActivityServiceImpl implements RewardActivityService {
* @param rewardActivity 请求 * @param rewardActivity 请求
*/ */
private void validateRewardActivitySpuConflicts(Long id, RewardActivityBaseVO rewardActivity) { private void validateRewardActivitySpuConflicts(Long id, RewardActivityBaseVO rewardActivity) {
// 0. 获得开启的所有的活动 // 1. 获得开启的所有的活动
List<RewardActivityDO> list = rewardActivityMapper.selectList(RewardActivityDO::getStatus, CommonStatusEnum.ENABLE.getStatus()); List<RewardActivityDO> list = rewardActivityMapper.selectList(RewardActivityDO::getStatus, CommonStatusEnum.ENABLE.getStatus());
if (id != null) { // 排除自己这个活动 if (id != null) { // 排除自己这个活动
list.removeIf(activity -> id.equals(activity.getId())); list.removeIf(activity -> id.equals(activity.getId()));
} }
// 完全不允许重叠 // 2. 完全不允许重叠
for (RewardActivityDO item : list) { for (RewardActivityDO item : list) {
// 1.1 校验满减送活动时间是否冲突如果时段不冲突那么不同的时间段内则可以存在相同的商品范围 // 2.1 校验满减送活动时间是否冲突如果时段不冲突那么不同的时间段内则可以存在相同的商品范围
if (!LocalDateTimeUtil.isOverlap(item.getStartTime(), item.getEndTime(), if (!LocalDateTimeUtil.isOverlap(item.getStartTime(), item.getEndTime(),
rewardActivity.getStartTime(), rewardActivity.getEndTime())) { rewardActivity.getStartTime(), rewardActivity.getEndTime())) {
continue; continue;
} }
// 1.2 校验商品范围是否重叠 // 2.2 校验商品范围是否重叠
// 情况一如果与该时间段内商品范围为全部的活动冲突 rewardActivity 商品范围为全部那么则直接校验不通过 // 情况一如果与该时间段内商品范围为全部的活动冲突 rewardActivity 商品范围为全部那么则直接校验不通过
// 例如说rewardActivity 是全部活动结果有个 db 里的 activity 是某个分类它也是冲突的也就是说当前时间段内有且仅有只能有一个活动 // 例如说rewardActivity 是全部活动结果有个 db 里的 activity 是某个分类它也是冲突的也就是说当前时间段内有且仅有只能有一个活动
if (PromotionProductScopeEnum.isAll(item.getProductScope()) || if (PromotionProductScopeEnum.isAll(item.getProductScope()) ||
PromotionProductScopeEnum.isAll(rewardActivity.getProductScope())) { PromotionProductScopeEnum.isAll(rewardActivity.getProductScope())) {
// TODO puhui999需要提示出来与满减送活动xxx 活动存在商品范围冲突这里可能要分情况下面需要把 activityName 传入
throw exception(REWARD_ACTIVITY_SCOPE_EXISTS); throw exception(REWARD_ACTIVITY_SCOPE_EXISTS);
} }
// 情况二如果与该时间段内商品范围为类别的活动冲突 // 情况二如果与该时间段内商品范围为类别的活动冲突
if (PromotionProductScopeEnum.isCategory(item.getProductScope())) { if (PromotionProductScopeEnum.isCategory(item.getProductScope())) {
// TODO puhui999前端我们有限制只允许子分类么可能要限制下不然基于分类查询不到对应的商品因为商品目前必须在子分类下
// 校验分类是否冲突 // 校验分类是否冲突
if (PromotionProductScopeEnum.isCategory(rewardActivity.getProductScope())) { if (PromotionProductScopeEnum.isCategory(rewardActivity.getProductScope())) {
if (!intersectionDistinct(item.getProductScopeValues(), rewardActivity.getProductScopeValues()).isEmpty()) { if (!intersectionDistinct(item.getProductScopeValues(), rewardActivity.getProductScopeValues()).isEmpty()) {