瀏覽代碼

promotion:RewardActivityServiceImpl 的 getMatchRewardActivities 逻辑

YunaiV 2 年之前
父節點
當前提交
c87bc084e6

+ 6 - 0
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/reward/RewardActivityMapper.java

@@ -29,4 +29,10 @@ public interface RewardActivityMapper extends BaseMapperX<RewardActivityDO> {
         return selectList(RewardActivityDO::getStatus, statuses);
     }
 
+    default List<RewardActivityDO> selectListByProductScopeAndStatus(Integer productScope, Integer status) {
+        return selectList(new LambdaQueryWrapperX<RewardActivityDO>()
+                .eq(RewardActivityDO::getProductScope, productScope)
+                .eq(RewardActivityDO::getStatus, status));
+    }
+
 }

+ 0 - 1
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/price/PriceServiceImpl.java

@@ -76,7 +76,6 @@ public class PriceServiceImpl implements PriceService {
         calculatePriceForOrderLevel(calculateReqDTO.getUserId(), priceCalculate);
         // 计算优惠劵级别的价格
         calculatePriceForCouponLevel(calculateReqDTO.getUserId(), calculateReqDTO.getCouponId(), priceCalculate);
-        // 计算【优惠劵】促销 TODO 待实现
         return priceCalculate;
     }
 

+ 21 - 3
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/reward/RewardActivityServiceImpl.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.promotion.service.reward;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityCreateReqVO;
 import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO;
@@ -9,16 +10,23 @@ import cn.iocoder.yudao.module.promotion.convert.reward.RewardActivityConvert;
 import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO;
 import cn.iocoder.yudao.module.promotion.dal.mysql.reward.RewardActivityMapper;
 import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum;
+import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum;
 import cn.iocoder.yudao.module.promotion.util.PromotionUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
-import java.util.*;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
+import static cn.hutool.core.collection.CollUtil.intersectionDistinct;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
 import static java.util.Arrays.asList;
+import static java.util.Collections.singleton;
 
 /**
  * 满减送活动 Service 实现类
@@ -144,8 +152,18 @@ public class RewardActivityServiceImpl implements RewardActivityService {
 
     @Override
     public Map<RewardActivityDO, Set<Long>> getMatchRewardActivities(Set<Long> spuIds) {
-        // TODO 芋艿:待实现
-        return null;
+        // 如果有全局活动,则直接选择它
+        List<RewardActivityDO> allActivities = rewardActivityMapper.selectListByProductScopeAndStatus(
+                PromotionProductScopeEnum.ALL.getScope(), PromotionActivityStatusEnum.RUN.getStatus());
+        if (CollUtil.isNotEmpty(allActivities)) {
+            return MapUtil.builder(allActivities.get(0), spuIds).build();
+        }
+
+        // 查询某个活动参加的活动
+        List<RewardActivityDO> productActivityList = getRewardActivityListBySpuIds(spuIds,
+                singleton(PromotionActivityStatusEnum.RUN.getStatus()));
+        return convertMap(productActivityList, activity -> activity,
+                rewardActivityDO -> intersectionDistinct(rewardActivityDO.getProductSpuIds(), spuIds)); // 求交集返回
     }
 
 }

+ 55 - 0
yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/reward/RewardActivityServiceImplTest.java

@@ -15,8 +15,11 @@ import org.springframework.context.annotation.Import;
 
 import javax.annotation.Resource;
 import java.time.Duration;
+import java.util.Map;
+import java.util.Set;
 
 import static cn.hutool.core.util.RandomUtil.randomEle;
+import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet;
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.addTime;
 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
@@ -24,6 +27,8 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServic
 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.REWARD_ACTIVITY_NOT_EXISTS;
+import static java.util.Arrays.asList;
+import static java.util.Collections.singletonList;
 import static org.junit.jupiter.api.Assertions.*;
 
 /**
@@ -160,4 +165,54 @@ public class RewardActivityServiceImplTest extends BaseDbUnitTest {
        assertPojoEquals(dbRewardActivity, pageResult.getList().get(0), "rules");
     }
 
+    @Test
+    public void testGetRewardActivities_all() {
+        // mock 数据
+        RewardActivityDO allActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus())
+                .setProductScope(PromotionProductScopeEnum.ALL.getScope()));
+        rewardActivityMapper.insert(allActivity);
+        RewardActivityDO productActivity = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus())
+                .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductSpuIds(asList(1L, 2L)));
+        rewardActivityMapper.insert(productActivity);
+        // 准备参数
+        Set<Long> spuIds = asSet(1L, 2L);
+
+        // 调用
+        Map<RewardActivityDO, Set<Long>> matchRewardActivities = rewardActivityService.getMatchRewardActivities(spuIds);
+        // 断言
+        assertEquals(matchRewardActivities.size(), 1);
+        Map.Entry<RewardActivityDO, Set<Long>> next = matchRewardActivities.entrySet().iterator().next();
+        assertPojoEquals(next.getKey(), allActivity);
+        assertEquals(next.getValue(), spuIds);
+    }
+
+    @Test
+    public void testGetRewardActivities_product() {
+        // mock 数据
+        RewardActivityDO productActivity01 = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus())
+                .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductSpuIds(asList(1L, 2L)));
+        rewardActivityMapper.insert(productActivity01);
+        RewardActivityDO productActivity02 = randomPojo(RewardActivityDO.class, o -> o.setStatus(PromotionActivityStatusEnum.RUN.getStatus())
+                .setProductScope(PromotionProductScopeEnum.SPU.getScope()).setProductSpuIds(singletonList(3L)));
+        rewardActivityMapper.insert(productActivity02);
+        // 准备参数
+        Set<Long> spuIds = asSet(1L, 2L, 3L);
+
+        // 调用
+        Map<RewardActivityDO, Set<Long>> matchRewardActivities = rewardActivityService.getMatchRewardActivities(spuIds);
+        // 断言
+        assertEquals(matchRewardActivities.size(), 2);
+        matchRewardActivities.forEach((activity, activitySpuIds) -> {
+            if (activity.getId().equals(productActivity01.getId())) {
+                assertPojoEquals(activity, productActivity01);
+                assertEquals(activitySpuIds, asSet(1L, 2L));
+            } else if (activity.getId().equals(productActivity02.getId())) {
+                assertPojoEquals(activity, productActivity02);
+                assertEquals(activitySpuIds, asSet(3L));
+            } else {
+                fail();
+            }
+        });
+    }
+
 }