package cn.iocoder.yudao.module.promotion.dal.mysql.reward; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.promotion.controller.admin.reward.vo.RewardActivityPageReqVO; import cn.iocoder.yudao.module.promotion.dal.dataobject.reward.RewardActivityDO; import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum; import org.apache.ibatis.annotations.Mapper; import java.time.LocalDateTime; import java.util.Collection; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; /** * 满减送活动 Mapper * * @author 芋道源码 */ @Mapper public interface RewardActivityMapper extends BaseMapperX { default PageResult selectPage(RewardActivityPageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .likeIfPresent(RewardActivityDO::getName, reqVO.getName()) .eqIfPresent(RewardActivityDO::getStatus, reqVO.getStatus()) .orderByDesc(RewardActivityDO::getId)); } default List selectListBySpuIdAndStatusAndNow(Collection spuIds, Collection categoryIds, Integer status) { LocalDateTime now = LocalDateTime.now(); Function, String> productScopeValuesFindInSetFunc = ids -> ids.stream() .map(id -> StrUtil.format("FIND_IN_SET({}, product_scope_values) ", id)) .collect(Collectors.joining(" OR ")); return selectList(new LambdaQueryWrapperX() .eq(RewardActivityDO::getStatus, status) .lt(RewardActivityDO::getStartTime, now) .gt(RewardActivityDO::getEndTime, now) .and(i -> i.eq(RewardActivityDO::getProductScope, PromotionProductScopeEnum.SPU.getScope()) .and(i1 -> i1.apply(productScopeValuesFindInSetFunc.apply(spuIds))) .or(i1 -> i1.eq(RewardActivityDO::getProductScope, PromotionProductScopeEnum.ALL.getScope())) .or(i1 -> i1.eq(RewardActivityDO::getProductScope, PromotionProductScopeEnum.CATEGORY.getScope()) .and(i2 -> i2.apply(productScopeValuesFindInSetFunc.apply(categoryIds))))) .orderByDesc(RewardActivityDO::getId) ); } }