mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 20:28:44 +08:00 
			
		
		
		
	【代码优化】商城:优化 /promotion/activity/list-by-spu-id 的逻辑
This commit is contained in:
		@@ -1,23 +1,13 @@
 | 
				
			|||||||
package cn.iocoder.yudao.module.promotion.controller.app.activity;
 | 
					package cn.iocoder.yudao.module.promotion.controller.app.activity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import cn.hutool.core.collection.CollUtil;
 | 
					 | 
				
			||||||
import cn.hutool.core.map.MapUtil;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 | 
					import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 | 
				
			||||||
import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.controller.app.activity.vo.AppActivityRespVO;
 | 
					import cn.iocoder.yudao.module.promotion.controller.app.activity.vo.AppActivityRespVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivityDO;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillActivityDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillActivityDO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
 | 
					import cn.iocoder.yudao.module.promotion.enums.common.PromotionTypeEnum;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.service.bargain.BargainActivityService;
 | 
					import cn.iocoder.yudao.module.promotion.service.bargain.BargainActivityService;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.service.combination.CombinationActivityService;
 | 
					import cn.iocoder.yudao.module.promotion.service.combination.CombinationActivityService;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.service.discount.DiscountActivityService;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.service.reward.RewardActivityService;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.service.seckill.SeckillActivityService;
 | 
					import cn.iocoder.yudao.module.promotion.service.seckill.SeckillActivityService;
 | 
				
			||||||
import io.swagger.v3.oas.annotations.Operation;
 | 
					import io.swagger.v3.oas.annotations.Operation;
 | 
				
			||||||
import io.swagger.v3.oas.annotations.Parameter;
 | 
					import io.swagger.v3.oas.annotations.Parameter;
 | 
				
			||||||
@@ -29,12 +19,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
 | 
				
			|||||||
import org.springframework.web.bind.annotation.RequestParam;
 | 
					import org.springframework.web.bind.annotation.RequestParam;
 | 
				
			||||||
import org.springframework.web.bind.annotation.RestController;
 | 
					import org.springframework.web.bind.annotation.RestController;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.time.LocalDateTime;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
import java.util.*;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.stream.Collectors;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 | 
					import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 | 
				
			||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Tag(name = "用户 APP - 营销活动") // 用于提供跨多个活动的 HTTP 接口
 | 
					@Tag(name = "用户 APP - 营销活动") // 用于提供跨多个活动的 HTTP 接口
 | 
				
			||||||
@RestController
 | 
					@RestController
 | 
				
			||||||
@@ -48,125 +36,31 @@ public class AppActivityController {
 | 
				
			|||||||
    private SeckillActivityService seckillActivityService;
 | 
					    private SeckillActivityService seckillActivityService;
 | 
				
			||||||
    @Resource
 | 
					    @Resource
 | 
				
			||||||
    private BargainActivityService bargainActivityService;
 | 
					    private BargainActivityService bargainActivityService;
 | 
				
			||||||
    @Resource
 | 
					 | 
				
			||||||
    private DiscountActivityService discountActivityService;
 | 
					 | 
				
			||||||
    @Resource
 | 
					 | 
				
			||||||
    private RewardActivityService rewardActivityService;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Resource
 | 
					 | 
				
			||||||
    private ProductSpuApi productSpuApi;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @GetMapping("/list-by-spu-id")
 | 
					    @GetMapping("/list-by-spu-id")
 | 
				
			||||||
    @Operation(summary = "获得单个商品,近期参与的每个活动")
 | 
					    @Operation(summary = "获得单个商品,进行中的拼团、秒杀、砍价活动信息", description = "每种活动,只返回一个")
 | 
				
			||||||
    @Parameter(name = "spuId", description = "商品编号", required = true)
 | 
					    @Parameter(name = "spuId", description = "商品编号", required = true)
 | 
				
			||||||
    public CommonResult<List<AppActivityRespVO>> getActivityListBySpuId(@RequestParam("spuId") Long spuId) {
 | 
					    public CommonResult<List<AppActivityRespVO>> getActivityListBySpuId(@RequestParam("spuId") Long spuId) {
 | 
				
			||||||
        // 每种活动,只返回一个
 | 
					        List<AppActivityRespVO> activityVOList = new ArrayList<>();
 | 
				
			||||||
        return success(getAppActivityList(Collections.singletonList(spuId)));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @GetMapping("/list-by-spu-ids")
 | 
					 | 
				
			||||||
    @Operation(summary = "获得多个商品,近期参与的每个活动")
 | 
					 | 
				
			||||||
    @Parameter(name = "spuIds", description = "商品编号数组", required = true)
 | 
					 | 
				
			||||||
    public CommonResult<Map<Long, List<AppActivityRespVO>>> getActivityListBySpuIds(@RequestParam("spuIds") List<Long> spuIds) {
 | 
					 | 
				
			||||||
        if (CollUtil.isEmpty(spuIds)) {
 | 
					 | 
				
			||||||
            return success(MapUtil.empty());
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        // 每种活动,只返回一个;key 为 SPU 编号
 | 
					 | 
				
			||||||
        return success(convertMultiMap(getAppActivityList(spuIds), AppActivityRespVO::getSpuId));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private List<AppActivityRespVO> getAppActivityList(Collection<Long> spuIds) {
 | 
					 | 
				
			||||||
        if (CollUtil.isEmpty(spuIds)) {
 | 
					 | 
				
			||||||
            return new ArrayList<>();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        // 获取开启的且开始的且没有结束的活动
 | 
					 | 
				
			||||||
        List<AppActivityRespVO> activityList = new ArrayList<>();
 | 
					 | 
				
			||||||
        LocalDateTime now = LocalDateTime.now();
 | 
					 | 
				
			||||||
        // 1. 拼团活动
 | 
					        // 1. 拼团活动
 | 
				
			||||||
        getCombinationActivities(spuIds, now, activityList);
 | 
					        CombinationActivityDO combinationActivity = combinationActivityService.getMatchCombinationActivityBySpuId(spuId);
 | 
				
			||||||
 | 
					        if (combinationActivity != null) {
 | 
				
			||||||
 | 
					            activityVOList.add(new AppActivityRespVO(combinationActivity.getId(), PromotionTypeEnum.COMBINATION_ACTIVITY.getType(),
 | 
				
			||||||
 | 
					                    combinationActivity.getName(), combinationActivity.getSpuId(), combinationActivity.getStartTime(), combinationActivity.getEndTime()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        // 2. 秒杀活动
 | 
					        // 2. 秒杀活动
 | 
				
			||||||
        getSeckillActivities(spuIds, now, activityList);
 | 
					        SeckillActivityDO seckillActivity = seckillActivityService.getMatchSeckillActivityBySpuId(spuId);
 | 
				
			||||||
 | 
					        if (seckillActivity != null) {
 | 
				
			||||||
 | 
					            activityVOList.add(new AppActivityRespVO(seckillActivity.getId(), PromotionTypeEnum.SECKILL_ACTIVITY.getType(),
 | 
				
			||||||
 | 
					                    seckillActivity.getName(), seckillActivity.getSpuId(), seckillActivity.getStartTime(), seckillActivity.getEndTime()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        // 3. 砍价活动
 | 
					        // 3. 砍价活动
 | 
				
			||||||
        getBargainActivities(spuIds, now, activityList);
 | 
					        BargainActivityDO bargainActivity = bargainActivityService.getMatchBargainActivityBySpuId(spuId);
 | 
				
			||||||
        // 4. 限时折扣活动
 | 
					        if (bargainActivity != null) {
 | 
				
			||||||
        getDiscountActivities(spuIds, now, activityList);
 | 
					            activityVOList.add(new AppActivityRespVO(bargainActivity.getId(), PromotionTypeEnum.BARGAIN_ACTIVITY.getType(),
 | 
				
			||||||
        // 5. 满减送活动
 | 
					                    bargainActivity.getName(), bargainActivity.getSpuId(), bargainActivity.getStartTime(), bargainActivity.getEndTime()));
 | 
				
			||||||
        getRewardActivityList(spuIds, now, activityList);
 | 
					 | 
				
			||||||
        return activityList;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private void getCombinationActivities(Collection<Long> spuIds, LocalDateTime now, List<AppActivityRespVO> activityList) {
 | 
					 | 
				
			||||||
        List<CombinationActivityDO> combinationActivities = combinationActivityService.getCombinationActivityBySpuIdsAndStatusAndDateTimeLt(
 | 
					 | 
				
			||||||
                spuIds, CommonStatusEnum.ENABLE.getStatus(), now);
 | 
					 | 
				
			||||||
        if (CollUtil.isEmpty(combinationActivities)) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        combinationActivities.forEach(item -> {
 | 
					 | 
				
			||||||
            activityList.add(new AppActivityRespVO(item.getId(), PromotionTypeEnum.COMBINATION_ACTIVITY.getType(),
 | 
					 | 
				
			||||||
                    item.getName(), item.getSpuId(), item.getStartTime(), item.getEndTime()));
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private void getSeckillActivities(Collection<Long> spuIds, LocalDateTime now, List<AppActivityRespVO> activityList) {
 | 
					 | 
				
			||||||
        List<SeckillActivityDO> seckillActivities = seckillActivityService.getSeckillActivityBySpuIdsAndStatusAndDateTimeLt(
 | 
					 | 
				
			||||||
                spuIds, CommonStatusEnum.ENABLE.getStatus(), now);
 | 
					 | 
				
			||||||
        if (CollUtil.isEmpty(seckillActivities)) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        seckillActivities.forEach(item -> {
 | 
					 | 
				
			||||||
            activityList.add(new AppActivityRespVO(item.getId(), PromotionTypeEnum.SECKILL_ACTIVITY.getType(),
 | 
					 | 
				
			||||||
                    item.getName(), item.getSpuId(), item.getStartTime(), item.getEndTime()));
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private void getBargainActivities(Collection<Long> spuIds, LocalDateTime now, List<AppActivityRespVO> activityList) {
 | 
					 | 
				
			||||||
        List<BargainActivityDO> bargainActivities = bargainActivityService.getBargainActivityBySpuIdsAndStatusAndDateTimeLt(
 | 
					 | 
				
			||||||
                spuIds, CommonStatusEnum.ENABLE.getStatus(), now);
 | 
					 | 
				
			||||||
        if (CollUtil.isNotEmpty(bargainActivities)) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        bargainActivities.forEach(item -> {
 | 
					 | 
				
			||||||
            activityList.add(new AppActivityRespVO(item.getId(), PromotionTypeEnum.BARGAIN_ACTIVITY.getType(),
 | 
					 | 
				
			||||||
                    item.getName(), item.getSpuId(), item.getStartTime(), item.getEndTime()));
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private void getDiscountActivities(Collection<Long> spuIds, LocalDateTime now, List<AppActivityRespVO> activityList) {
 | 
					 | 
				
			||||||
        List<DiscountActivityDO> discountActivities = discountActivityService.getDiscountActivityBySpuIdsAndStatusAndDateTimeLt(
 | 
					 | 
				
			||||||
                spuIds, CommonStatusEnum.ENABLE.getStatus(), now);
 | 
					 | 
				
			||||||
        if (CollUtil.isEmpty(discountActivities)) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        List<DiscountProductDO> products = discountActivityService.getDiscountProductsByActivityId(
 | 
					 | 
				
			||||||
                convertSet(discountActivities, DiscountActivityDO::getId));
 | 
					 | 
				
			||||||
        Map<Long, Long> productMap = convertMap(products, DiscountProductDO::getActivityId, DiscountProductDO::getSpuId);
 | 
					 | 
				
			||||||
        discountActivities.forEach(item -> activityList.add(new AppActivityRespVO(item.getId(), PromotionTypeEnum.DISCOUNT_ACTIVITY.getType(),
 | 
					 | 
				
			||||||
                item.getName(), productMap.get(item.getId()), item.getStartTime(), item.getEndTime())));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private void getRewardActivityList(Collection<Long> spuIds, LocalDateTime now, List<AppActivityRespVO> activityList) {
 | 
					 | 
				
			||||||
        List<RewardActivityDO> rewardActivities = rewardActivityService.getRewardActivityBySpuIdsAndStatusAndDateTimeLt(
 | 
					 | 
				
			||||||
                spuIds, CommonStatusEnum.ENABLE.getStatus(), now);
 | 
					 | 
				
			||||||
        if (CollUtil.isEmpty(rewardActivities)) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Map<Long, Optional<RewardActivityDO>> spuIdAndActivityMap = spuIds.stream().collect(Collectors.toMap(spuId -> spuId, spuId -> rewardActivities.stream()
 | 
					 | 
				
			||||||
                .filter(activity -> PromotionProductScopeEnum.isAll(activity.getProductScope())
 | 
					 | 
				
			||||||
                                || PromotionProductScopeEnum.isSpu(activity.getProductScope()) // 商品范围
 | 
					 | 
				
			||||||
                                    && CollUtil.contains(activity.getProductScopeValues(), spuId)
 | 
					 | 
				
			||||||
                                || PromotionProductScopeEnum.isCategory(activity.getProductScope()) // 分类范围
 | 
					 | 
				
			||||||
                                    && CollUtil.contains(activity.getProductScopeValues(), productSpuApi.getSpu(spuId).getCategoryId()))
 | 
					 | 
				
			||||||
                .max(Comparator.comparing(RewardActivityDO::getCreateTime))));
 | 
					 | 
				
			||||||
        for (Long supId : spuIdAndActivityMap.keySet()) {
 | 
					 | 
				
			||||||
            spuIdAndActivityMap.get(supId).ifPresent(rewardActivity -> activityList.add(
 | 
					 | 
				
			||||||
                    new AppActivityRespVO(rewardActivity.getId(), PromotionTypeEnum.REWARD_ACTIVITY.getType(),
 | 
					 | 
				
			||||||
                            rewardActivity.getName(), supId, rewardActivity.getStartTime(), rewardActivity.getEndTime())));
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        return success(activityVOList);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,14 +6,11 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 | 
				
			|||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 | 
					import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityPageReqVO;
 | 
					import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityPageReqVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
 | 
				
			||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
					 | 
				
			||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
					import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
				
			||||||
import org.apache.ibatis.annotations.Mapper;
 | 
					import org.apache.ibatis.annotations.Mapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.time.LocalDateTime;
 | 
					import java.time.LocalDateTime;
 | 
				
			||||||
import java.util.Collection;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 砍价活动 Mapper
 | 
					 * 砍价活动 Mapper
 | 
				
			||||||
@@ -86,35 +83,13 @@ public interface BargainActivityMapper extends BaseMapperX<BargainActivityDO> {
 | 
				
			|||||||
                .last("LIMIT " + count));
 | 
					                .last("LIMIT " + count));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    default BargainActivityDO selectBySpuIdAndStatusAndNow(Long spuId, Integer status) {
 | 
				
			||||||
     * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
 | 
					        LocalDateTime now = LocalDateTime.now();
 | 
				
			||||||
     *
 | 
					        return selectOne(new LambdaQueryWrapperX<BargainActivityDO>()
 | 
				
			||||||
     * @param spuIds spu 编号
 | 
					                .eq(BargainActivityDO::getSpuId, spuId)
 | 
				
			||||||
     * @param status 状态
 | 
					                .eq(BargainActivityDO::getStatus, status)
 | 
				
			||||||
     * @return 包含 spuId 和 activityId 的 map 对象列表
 | 
					                .lt(BargainActivityDO::getStartTime, now)
 | 
				
			||||||
     */
 | 
					                .gt(BargainActivityDO::getEndTime, now)); // 开始时间 < now < 结束时间,也就是说获取指定时间段的活动
 | 
				
			||||||
    default List<Map<String, Object>> selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(Collection<Long> spuIds, Integer status) {
 | 
					 | 
				
			||||||
        return selectMaps(new QueryWrapper<BargainActivityDO>()
 | 
					 | 
				
			||||||
                .select("spu_id AS spuId, MAX(DISTINCT(id)) AS activityId") // 时间越大 id 也越大 直接用 id
 | 
					 | 
				
			||||||
                .in("spu_id", spuIds)
 | 
					 | 
				
			||||||
                .eq("status", status)
 | 
					 | 
				
			||||||
                .groupBy("spu_id"));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 获取指定活动编号的活动列表且
 | 
					 | 
				
			||||||
     * 开始时间和结束时间小于给定时间 dateTime 的活动列表
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param ids      活动编号
 | 
					 | 
				
			||||||
     * @param dateTime 指定日期
 | 
					 | 
				
			||||||
     * @return 活动列表
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    default List<BargainActivityDO> selectListByIdsAndDateTimeLt(Collection<Long> ids, LocalDateTime dateTime) {
 | 
					 | 
				
			||||||
        return selectList(new LambdaQueryWrapperX<BargainActivityDO>()
 | 
					 | 
				
			||||||
                .in(BargainActivityDO::getId, ids)
 | 
					 | 
				
			||||||
                .lt(BargainActivityDO::getStartTime, dateTime)
 | 
					 | 
				
			||||||
                .gt(BargainActivityDO::getEndTime, dateTime)// 开始时间 < 指定时间 < 结束时间,也就是说获取指定时间段的活动
 | 
					 | 
				
			||||||
                .orderByDesc(BargainActivityDO::getCreateTime));
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,14 +6,10 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 | 
				
			|||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 | 
					import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO;
 | 
					import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityPageReqVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
 | 
				
			||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
					 | 
				
			||||||
import org.apache.ibatis.annotations.Mapper;
 | 
					import org.apache.ibatis.annotations.Mapper;
 | 
				
			||||||
import org.apache.ibatis.annotations.Param;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.time.LocalDateTime;
 | 
					import java.time.LocalDateTime;
 | 
				
			||||||
import java.util.Collection;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 拼团活动 Mapper
 | 
					 * 拼团活动 Mapper
 | 
				
			||||||
@@ -39,40 +35,13 @@ public interface CombinationActivityMapper extends BaseMapperX<CombinationActivi
 | 
				
			|||||||
                .eq(CombinationActivityDO::getStatus, status));
 | 
					                .eq(CombinationActivityDO::getStatus, status));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    default List<CombinationActivityDO> selectListByStatus(Integer status, Integer count) {
 | 
					    default CombinationActivityDO selectBySpuIdAndStatusAndNow(Long spuId, Integer status) {
 | 
				
			||||||
        return selectList(new LambdaQueryWrapperX<CombinationActivityDO>()
 | 
					        LocalDateTime now = LocalDateTime.now();
 | 
				
			||||||
 | 
					        return selectOne(new LambdaQueryWrapperX<CombinationActivityDO>()
 | 
				
			||||||
 | 
					                .eq(CombinationActivityDO::getSpuId, spuId)
 | 
				
			||||||
                .eq(CombinationActivityDO::getStatus, status)
 | 
					                .eq(CombinationActivityDO::getStatus, status)
 | 
				
			||||||
                .last("LIMIT " + count));
 | 
					                .lt(CombinationActivityDO::getStartTime, now)
 | 
				
			||||||
    }
 | 
					                .gt(CombinationActivityDO::getEndTime, now)); // 开始时间 < now < 结束时间,也就是说获取指定时间段的活动
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
 | 
					 | 
				
			||||||
     * @param spuIds spu 编号
 | 
					 | 
				
			||||||
     * @param status 状态
 | 
					 | 
				
			||||||
     * @return 包含 spuId 和 activityId 的 map 对象列表
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    default List<Map<String, Object>> selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(@Param("spuIds") Collection<Long> spuIds, @Param("status") Integer status) {
 | 
					 | 
				
			||||||
        return selectMaps(new QueryWrapper<CombinationActivityDO>()
 | 
					 | 
				
			||||||
                .select("spu_id AS spuId, MAX(DISTINCT(id)) AS activityId") // 时间越大 id 也越大 直接用 id
 | 
					 | 
				
			||||||
                .in("spu_id", spuIds)
 | 
					 | 
				
			||||||
                .eq("status", status)
 | 
					 | 
				
			||||||
                .groupBy("spu_id"));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 获取指定活动编号的活动列表且
 | 
					 | 
				
			||||||
     * 开始时间和结束时间小于给定时间 dateTime 的活动列表
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param ids      活动编号
 | 
					 | 
				
			||||||
     * @param dateTime 指定日期
 | 
					 | 
				
			||||||
     * @return 活动列表
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    default List<CombinationActivityDO> selectListByIdsAndDateTimeLt(Collection<Long> ids, LocalDateTime dateTime) {
 | 
					 | 
				
			||||||
        return selectList(new LambdaQueryWrapperX<CombinationActivityDO>()
 | 
					 | 
				
			||||||
                .in(CombinationActivityDO::getId, ids)
 | 
					 | 
				
			||||||
                .lt(CombinationActivityDO::getStartTime, dateTime)
 | 
					 | 
				
			||||||
                .gt(CombinationActivityDO::getEndTime, dateTime)// 开始时间 < 指定时间 < 结束时间,也就是说获取指定时间段的活动
 | 
					 | 
				
			||||||
                .orderByDesc(CombinationActivityDO::getCreateTime));
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -8,15 +8,11 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 | 
				
			|||||||
import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO;
 | 
					import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.controller.app.seckill.vo.activity.AppSeckillActivityPageReqVO;
 | 
					import cn.iocoder.yudao.module.promotion.controller.app.seckill.vo.activity.AppSeckillActivityPageReqVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillActivityDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillActivityDO;
 | 
				
			||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
					 | 
				
			||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
					import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
				
			||||||
import org.apache.ibatis.annotations.Mapper;
 | 
					import org.apache.ibatis.annotations.Mapper;
 | 
				
			||||||
import org.apache.ibatis.annotations.Param;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.time.LocalDateTime;
 | 
					import java.time.LocalDateTime;
 | 
				
			||||||
import java.util.Collection;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 秒杀活动 Mapper
 | 
					 * 秒杀活动 Mapper
 | 
				
			||||||
@@ -77,35 +73,13 @@ public interface SeckillActivityMapper extends BaseMapperX<SeckillActivityDO> {
 | 
				
			|||||||
                .apply(ObjectUtil.isNotNull(pageReqVO.getConfigId()), "FIND_IN_SET(" + pageReqVO.getConfigId() + ",config_ids) > 0"));
 | 
					                .apply(ObjectUtil.isNotNull(pageReqVO.getConfigId()), "FIND_IN_SET(" + pageReqVO.getConfigId() + ",config_ids) > 0"));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    default SeckillActivityDO selectBySpuIdAndStatusAndNow(Long spuId, Integer status) {
 | 
				
			||||||
     * 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
 | 
					        LocalDateTime now = LocalDateTime.now();
 | 
				
			||||||
     *
 | 
					        return selectOne(new LambdaQueryWrapperX<SeckillActivityDO>()
 | 
				
			||||||
     * @param spuIds spu 编号
 | 
					                .eq(SeckillActivityDO::getSpuId, spuId)
 | 
				
			||||||
     * @param status 状态
 | 
					                .eq(SeckillActivityDO::getStatus, status)
 | 
				
			||||||
     * @return 包含 spuId 和 activityId 的 map 对象列表
 | 
					                .lt(SeckillActivityDO::getStartTime, now)
 | 
				
			||||||
     */
 | 
					                .gt(SeckillActivityDO::getEndTime, now)); // 开始时间 < now < 结束时间,也就是说获取指定时间段的活动
 | 
				
			||||||
    default List<Map<String, Object>> selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(@Param("spuIds") Collection<Long> spuIds, @Param("status") Integer status) {
 | 
					 | 
				
			||||||
        return selectMaps(new QueryWrapper<SeckillActivityDO>()
 | 
					 | 
				
			||||||
                .select("spu_id AS spuId, MAX(DISTINCT(id)) AS activityId") // 时间越大 id 也越大 直接用 id
 | 
					 | 
				
			||||||
                .in("spu_id", spuIds)
 | 
					 | 
				
			||||||
                .eq("status", status)
 | 
					 | 
				
			||||||
                .groupBy("spu_id"));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 获取指定活动编号的活动列表且
 | 
					 | 
				
			||||||
     * 开始时间和结束时间小于给定时间 dateTime 的活动列表
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param ids      活动编号
 | 
					 | 
				
			||||||
     * @param dateTime 指定日期
 | 
					 | 
				
			||||||
     * @return 活动列表
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    default List<SeckillActivityDO> selectListByIdsAndDateTimeLt(Collection<Long> ids, LocalDateTime dateTime) {
 | 
					 | 
				
			||||||
        return selectList(new LambdaQueryWrapperX<SeckillActivityDO>()
 | 
					 | 
				
			||||||
                .in(SeckillActivityDO::getId, ids)
 | 
					 | 
				
			||||||
                .lt(SeckillActivityDO::getStartTime, dateTime)
 | 
					 | 
				
			||||||
                .gt(SeckillActivityDO::getEndTime, dateTime)// 开始时间 < 指定时间 < 结束时间,也就是说获取指定时间段的活动
 | 
					 | 
				
			||||||
                .orderByDesc(SeckillActivityDO::getCreateTime));
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,10 +6,8 @@ import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.Ba
 | 
				
			|||||||
import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityPageReqVO;
 | 
					import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityPageReqVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityUpdateReqVO;
 | 
					import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.BargainActivityUpdateReqVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
 | 
				
			||||||
 | 
					 | 
				
			||||||
import jakarta.validation.Valid;
 | 
					import jakarta.validation.Valid;
 | 
				
			||||||
import java.time.LocalDateTime;
 | 
					
 | 
				
			||||||
import java.util.Collection;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -108,13 +106,11 @@ public interface BargainActivityService {
 | 
				
			|||||||
    List<BargainActivityDO> getBargainActivityListByCount(Integer count);
 | 
					    List<BargainActivityDO> getBargainActivityListByCount(Integer count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录
 | 
					     * 获得 SPU 进行中的砍价活动
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param spuIds   spu 编号
 | 
					     * @param spuId SPU 编号数组
 | 
				
			||||||
     * @param status   状态
 | 
					     * @return 砍价活动
 | 
				
			||||||
     * @param dateTime 日期时间
 | 
					 | 
				
			||||||
     * @return 砍价活动列表
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    List<BargainActivityDO> getBargainActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime);
 | 
					    BargainActivityDO getMatchBargainActivityBySpuId(Long spuId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,5 @@
 | 
				
			|||||||
package cn.iocoder.yudao.module.promotion.service.bargain;
 | 
					package cn.iocoder.yudao.module.promotion.service.bargain;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import cn.hutool.core.collection.CollUtil;
 | 
					 | 
				
			||||||
import cn.hutool.core.map.MapUtil;
 | 
					 | 
				
			||||||
import cn.hutool.core.util.ObjectUtil;
 | 
					import cn.hutool.core.util.ObjectUtil;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 | 
					import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
 | 
					import cn.iocoder.yudao.framework.common.pojo.PageParam;
 | 
				
			||||||
@@ -15,17 +13,17 @@ import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.activity.Ba
 | 
				
			|||||||
import cn.iocoder.yudao.module.promotion.convert.bargain.BargainActivityConvert;
 | 
					import cn.iocoder.yudao.module.promotion.convert.bargain.BargainActivityConvert;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.mysql.bargain.BargainActivityMapper;
 | 
					import cn.iocoder.yudao.module.promotion.dal.mysql.bargain.BargainActivityMapper;
 | 
				
			||||||
 | 
					import jakarta.annotation.Resource;
 | 
				
			||||||
import org.springframework.stereotype.Service;
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
import org.springframework.transaction.annotation.Transactional;
 | 
					import org.springframework.transaction.annotation.Transactional;
 | 
				
			||||||
import org.springframework.validation.annotation.Validated;
 | 
					import org.springframework.validation.annotation.Validated;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import jakarta.annotation.Resource;
 | 
					 | 
				
			||||||
import java.time.LocalDateTime;
 | 
					import java.time.LocalDateTime;
 | 
				
			||||||
import java.util.*;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 | 
					import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 | 
				
			||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch;
 | 
					import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch;
 | 
				
			||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
 | 
					 | 
				
			||||||
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
 | 
					import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
 | 
				
			||||||
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
 | 
					import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -194,15 +192,8 @@ public class BargainActivityServiceImpl implements BargainActivityService {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public List<BargainActivityDO> getBargainActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime) {
 | 
					    public BargainActivityDO getMatchBargainActivityBySpuId(Long spuId) {
 | 
				
			||||||
        // 1. 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
 | 
					        return bargainActivityMapper.selectBySpuIdAndStatusAndNow(spuId, CommonStatusEnum.ENABLE.getStatus());
 | 
				
			||||||
        List<Map<String, Object>> spuIdAndActivityIdMaps = bargainActivityMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(spuIds, status);
 | 
					 | 
				
			||||||
        if (CollUtil.isEmpty(spuIdAndActivityIdMaps)) {
 | 
					 | 
				
			||||||
            return Collections.emptyList();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        // 2. 查询活动详情
 | 
					 | 
				
			||||||
        return bargainActivityMapper.selectListByIdsAndDateTimeLt(
 | 
					 | 
				
			||||||
                convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")), dateTime);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,9 +7,8 @@ import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activit
 | 
				
			|||||||
import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO;
 | 
					import cn.iocoder.yudao.module.promotion.controller.admin.combination.vo.activity.CombinationActivityUpdateReqVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationProductDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationProductDO;
 | 
				
			||||||
 | 
					 | 
				
			||||||
import jakarta.validation.Valid;
 | 
					import jakarta.validation.Valid;
 | 
				
			||||||
import java.time.LocalDateTime;
 | 
					
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
import java.util.Collections;
 | 
					import java.util.Collections;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
@@ -109,22 +108,20 @@ public interface CombinationActivityService {
 | 
				
			|||||||
    PageResult<CombinationActivityDO> getCombinationActivityPage(PageParam pageParam);
 | 
					    PageResult<CombinationActivityDO> getCombinationActivityPage(PageParam pageParam);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获取指定活动、指定 sku 编号的商品
 | 
					     * 获取指定活动、指定 SKU 编号的商品
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param activityId 活动编号
 | 
					     * @param activityId 活动编号
 | 
				
			||||||
     * @param skuId      sku 编号
 | 
					     * @param skuId      SKU 编号
 | 
				
			||||||
     * @return 活动商品信息
 | 
					     * @return 活动商品信息
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    CombinationProductDO selectByActivityIdAndSkuId(Long activityId, Long skuId);
 | 
					    CombinationProductDO selectByActivityIdAndSkuId(Long activityId, Long skuId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录
 | 
					     * 获得 SPU 进行中的拼团活动
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param spuIds   spu 编号
 | 
					     * @param spuId SPU 编号数组
 | 
				
			||||||
     * @param status   状态
 | 
					     * @return 拼团活动
 | 
				
			||||||
     * @param dateTime 日期时间
 | 
					 | 
				
			||||||
     * @return 拼团活动列表
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    List<CombinationActivityDO> getCombinationActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime);
 | 
					    CombinationActivityDO getMatchCombinationActivityBySpuId(Long spuId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,6 @@
 | 
				
			|||||||
package cn.iocoder.yudao.module.promotion.service.combination;
 | 
					package cn.iocoder.yudao.module.promotion.service.combination;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import cn.hutool.core.collection.CollUtil;
 | 
					import cn.hutool.core.collection.CollUtil;
 | 
				
			||||||
import cn.hutool.core.map.MapUtil;
 | 
					 | 
				
			||||||
import cn.hutool.core.util.ObjectUtil;
 | 
					import cn.hutool.core.util.ObjectUtil;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 | 
					import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
 | 
					import cn.iocoder.yudao.framework.common.pojo.PageParam;
 | 
				
			||||||
@@ -20,19 +19,18 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationA
 | 
				
			|||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationProductDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationProductDO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationActivityMapper;
 | 
					import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationActivityMapper;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationProductMapper;
 | 
					import cn.iocoder.yudao.module.promotion.dal.mysql.combination.CombinationProductMapper;
 | 
				
			||||||
 | 
					import jakarta.annotation.Resource;
 | 
				
			||||||
import org.springframework.stereotype.Service;
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
import org.springframework.transaction.annotation.Transactional;
 | 
					import org.springframework.transaction.annotation.Transactional;
 | 
				
			||||||
import org.springframework.validation.annotation.Validated;
 | 
					import org.springframework.validation.annotation.Validated;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import jakarta.annotation.Resource;
 | 
					 | 
				
			||||||
import java.time.LocalDateTime;
 | 
					 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
import java.util.Collections;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 | 
					import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 | 
				
			||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
 | 
					import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
 | 
				
			||||||
 | 
					import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
 | 
				
			||||||
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
 | 
					import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
 | 
				
			||||||
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
 | 
					import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
 | 
				
			||||||
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
 | 
					import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
 | 
				
			||||||
@@ -178,7 +176,7 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
 | 
				
			|||||||
            combinationProductMapper.updateBatch(diffList.get(1));
 | 
					            combinationProductMapper.updateBatch(diffList.get(1));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (CollUtil.isNotEmpty(diffList.get(2))) {
 | 
					        if (CollUtil.isNotEmpty(diffList.get(2))) {
 | 
				
			||||||
            combinationProductMapper.deleteBatchIds(CollectionUtils.convertList(diffList.get(2), CombinationProductDO::getId));
 | 
					            combinationProductMapper.deleteByIds(CollectionUtils.convertList(diffList.get(2), CombinationProductDO::getId));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -238,15 +236,8 @@ public class CombinationActivityServiceImpl implements CombinationActivityServic
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public List<CombinationActivityDO> getCombinationActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime) {
 | 
					    public CombinationActivityDO getMatchCombinationActivityBySpuId(Long spuId) {
 | 
				
			||||||
        // 1.查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
 | 
					        return combinationActivityMapper.selectBySpuIdAndStatusAndNow(spuId, CommonStatusEnum.ENABLE.getStatus());
 | 
				
			||||||
        List<Map<String, Object>> spuIdAndActivityIdMaps = combinationActivityMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(spuIds, status);
 | 
					 | 
				
			||||||
        if (CollUtil.isEmpty(spuIdAndActivityIdMaps)) {
 | 
					 | 
				
			||||||
            return Collections.emptyList();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        // 2.查询活动详情
 | 
					 | 
				
			||||||
        return combinationActivityMapper.selectListByIdsAndDateTimeLt(
 | 
					 | 
				
			||||||
                convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")), dateTime);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountActivit
 | 
				
			|||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.discount.DiscountProductDO;
 | 
				
			||||||
import jakarta.validation.Valid;
 | 
					import jakarta.validation.Valid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.time.LocalDateTime;
 | 
					 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -91,14 +90,11 @@ public interface DiscountActivityService {
 | 
				
			|||||||
    List<DiscountProductDO> getDiscountProductsByActivityId(Collection<Long> activityIds);
 | 
					    List<DiscountProductDO> getDiscountProductsByActivityId(Collection<Long> activityIds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录
 | 
					     * 获取指定 SPU 编号最近参加的活动,每个 spuId 只返回一条记录
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param spuIds   spu 编号
 | 
					     * @param spuIds   SPU 编号数组
 | 
				
			||||||
     * @param status   状态
 | 
					 | 
				
			||||||
     * @param dateTime 当前日期时间
 | 
					 | 
				
			||||||
     * @return 折扣活动列表
 | 
					     * @return 折扣活动列表
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    List<DiscountActivityDO> getDiscountActivityBySpuIdsAndStatusAndDateTimeLt(
 | 
					    List<DiscountActivityDO> getDiscountActivityListBySpuIds(Collection<Long> spuIds);
 | 
				
			||||||
            Collection<Long> spuIds, Integer status, LocalDateTime dateTime);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -189,16 +189,17 @@ public class DiscountActivityServiceImpl implements DiscountActivityService {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public List<DiscountActivityDO> getDiscountActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime) {
 | 
					    public List<DiscountActivityDO> getDiscountActivityListBySpuIds(Collection<Long> spuIds) {
 | 
				
			||||||
        // 1. 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
 | 
					        // 1. 查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
 | 
				
			||||||
        List<Map<String, Object>> spuIdAndActivityIdMaps = discountProductMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(spuIds, status);
 | 
					        List<Map<String, Object>> spuIdAndActivityIdMaps = discountProductMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(
 | 
				
			||||||
 | 
					                spuIds, CommonStatusEnum.ENABLE.getStatus());
 | 
				
			||||||
        if (CollUtil.isEmpty(spuIdAndActivityIdMaps)) {
 | 
					        if (CollUtil.isEmpty(spuIdAndActivityIdMaps)) {
 | 
				
			||||||
            return Collections.emptyList();
 | 
					            return Collections.emptyList();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 2. 查询活动详情
 | 
					        // 2. 查询活动详情
 | 
				
			||||||
        return discountActivityMapper.selectListByIdsAndDateTimeLt(
 | 
					        return discountActivityMapper.selectListByIdsAndDateTimeLt(
 | 
				
			||||||
                convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")), dateTime);
 | 
					                convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")), LocalDateTime.now());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,6 @@ import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillActivityD
 | 
				
			|||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillProductDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.SeckillProductDO;
 | 
				
			||||||
import jakarta.validation.Valid;
 | 
					import jakarta.validation.Valid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.time.LocalDateTime;
 | 
					 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -130,14 +129,12 @@ public interface SeckillActivityService {
 | 
				
			|||||||
    SeckillValidateJoinRespDTO validateJoinSeckill(Long activityId, Long skuId, Integer count);
 | 
					    SeckillValidateJoinRespDTO validateJoinSeckill(Long activityId, Long skuId, Integer count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获取指定 spu 编号最近参加的活动,每个 spuId 只返回一条记录
 | 
					     * 获得 SPU 进行中的秒杀活动
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param spuIds   spu 编号
 | 
					     * @param spuId SPU 编号数组
 | 
				
			||||||
     * @param status   状态
 | 
					     * @return 秒杀活动
 | 
				
			||||||
     * @param dateTime 日期时间
 | 
					 | 
				
			||||||
     * @return 秒杀活动列表
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    List<SeckillActivityDO> getSeckillActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime);
 | 
					    SeckillActivityDO getMatchSeckillActivityBySpuId(Long spuId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获得拼团活动列表
 | 
					     * 获得拼团活动列表
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,6 @@
 | 
				
			|||||||
package cn.iocoder.yudao.module.promotion.service.seckill;
 | 
					package cn.iocoder.yudao.module.promotion.service.seckill;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import cn.hutool.core.collection.CollUtil;
 | 
					 | 
				
			||||||
import cn.hutool.core.collection.CollectionUtil;
 | 
					import cn.hutool.core.collection.CollectionUtil;
 | 
				
			||||||
import cn.hutool.core.map.MapUtil;
 | 
					 | 
				
			||||||
import cn.hutool.core.util.ObjectUtil;
 | 
					import cn.hutool.core.util.ObjectUtil;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 | 
					import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
					import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
				
			||||||
@@ -30,7 +28,6 @@ import org.springframework.validation.annotation.Validated;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import java.time.LocalDateTime;
 | 
					import java.time.LocalDateTime;
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
import java.util.Collections;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -56,8 +53,10 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
 | 
				
			|||||||
    private SeckillActivityMapper seckillActivityMapper;
 | 
					    private SeckillActivityMapper seckillActivityMapper;
 | 
				
			||||||
    @Resource
 | 
					    @Resource
 | 
				
			||||||
    private SeckillProductMapper seckillProductMapper;
 | 
					    private SeckillProductMapper seckillProductMapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Resource
 | 
					    @Resource
 | 
				
			||||||
    private SeckillConfigService seckillConfigService;
 | 
					    private SeckillConfigService seckillConfigService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Resource
 | 
					    @Resource
 | 
				
			||||||
    private ProductSpuApi productSpuApi;
 | 
					    private ProductSpuApi productSpuApi;
 | 
				
			||||||
    @Resource
 | 
					    @Resource
 | 
				
			||||||
@@ -219,7 +218,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
 | 
				
			|||||||
            seckillProductMapper.updateBatch(diffList.get(1));
 | 
					            seckillProductMapper.updateBatch(diffList.get(1));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (isNotEmpty(diffList.get(2))) {
 | 
					        if (isNotEmpty(diffList.get(2))) {
 | 
				
			||||||
            seckillProductMapper.deleteBatchIds(convertList(diffList.get(2), SeckillProductDO::getId));
 | 
					            seckillProductMapper.deleteByIds(convertList(diffList.get(2), SeckillProductDO::getId));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -249,7 +248,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
 | 
				
			|||||||
        seckillActivityMapper.deleteById(id);
 | 
					        seckillActivityMapper.deleteById(id);
 | 
				
			||||||
        // 删除活动商品
 | 
					        // 删除活动商品
 | 
				
			||||||
        List<SeckillProductDO> products = seckillProductMapper.selectListByActivityId(id);
 | 
					        List<SeckillProductDO> products = seckillProductMapper.selectListByActivityId(id);
 | 
				
			||||||
        seckillProductMapper.deleteBatchIds(convertSet(products, SeckillProductDO::getId));
 | 
					        seckillProductMapper.deleteByIds(convertSet(products, SeckillProductDO::getId));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private SeckillActivityDO validateSeckillActivityExists(Long id) {
 | 
					    private SeckillActivityDO validateSeckillActivityExists(Long id) {
 | 
				
			||||||
@@ -325,20 +324,13 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public List<SeckillActivityDO> getSeckillActivityBySpuIdsAndStatusAndDateTimeLt(Collection<Long> spuIds, Integer status, LocalDateTime dateTime) {
 | 
					    public SeckillActivityDO getMatchSeckillActivityBySpuId(Long spuId) {
 | 
				
			||||||
        // 1.查询出指定 spuId 的 spu 参加的活动最接近现在的一条记录。多个的话,一个 spuId 对应一个最近的活动编号
 | 
					        return seckillActivityMapper.selectBySpuIdAndStatusAndNow(spuId, CommonStatusEnum.ENABLE.getStatus());
 | 
				
			||||||
        List<Map<String, Object>> spuIdAndActivityIdMaps = seckillActivityMapper.selectSpuIdAndActivityIdMapsBySpuIdsAndStatus(spuIds, status);
 | 
					 | 
				
			||||||
        if (CollUtil.isEmpty(spuIdAndActivityIdMaps)) {
 | 
					 | 
				
			||||||
            return Collections.emptyList();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        // 2.查询活动详情
 | 
					 | 
				
			||||||
        return seckillActivityMapper.selectListByIdsAndDateTimeLt(
 | 
					 | 
				
			||||||
                convertSet(spuIdAndActivityIdMaps, map -> MapUtil.getLong(map, "activityId")), dateTime);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public List<SeckillActivityDO> getSeckillActivityListByIds(Collection<Long> ids) {
 | 
					    public List<SeckillActivityDO> getSeckillActivityListByIds(Collection<Long> ids) {
 | 
				
			||||||
        return List.of();
 | 
					        return seckillActivityMapper.selectBatchIds(ids);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user