mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 20:28:44 +08:00 
			
		
		
		
	优惠券:完善优惠券匹配接口
This commit is contained in:
		@@ -17,11 +17,8 @@ import org.springframework.validation.annotation.Validated;
 | 
				
			|||||||
import org.springframework.web.bind.annotation.*;
 | 
					import org.springframework.web.bind.annotation.*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import javax.annotation.Resource;
 | 
					import javax.annotation.Resource;
 | 
				
			||||||
import java.time.LocalDateTime;
 | 
					 | 
				
			||||||
import java.util.ArrayList;
 | 
					 | 
				
			||||||
import java.util.Collections;
 | 
					import java.util.Collections;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Random;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
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.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 | 
					import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 | 
				
			||||||
@@ -42,36 +39,11 @@ public class AppCouponController {
 | 
				
			|||||||
        return success(1L);
 | 
					        return success(1L);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO 芋艿:待实现
 | 
					 | 
				
			||||||
    @GetMapping("/match-list")
 | 
					    @GetMapping("/match-list")
 | 
				
			||||||
    @Operation(summary = "获得匹配指定商品的优惠劵列表")
 | 
					    @Operation(summary = "获得匹配指定商品的优惠劵列表")
 | 
				
			||||||
    public CommonResult<List<AppCouponMatchRespVO>> getMatchCouponList(AppCouponMatchReqVO matchReqVO) {
 | 
					    public CommonResult<List<AppCouponMatchRespVO>> getMatchCouponList(AppCouponMatchReqVO matchReqVO) {
 | 
				
			||||||
        List<AppCouponMatchRespVO> list = new ArrayList<>();
 | 
					        // todo: 优惠金额倒序
 | 
				
			||||||
        Random random = new Random();
 | 
					        return success(CouponConvert.INSTANCE.convertList(couponService.getMatchCouponList(getLoginUserId(), matchReqVO)));
 | 
				
			||||||
        for (int i = 0; i < 10; i++) {
 | 
					 | 
				
			||||||
            AppCouponMatchRespVO vo = new AppCouponMatchRespVO();
 | 
					 | 
				
			||||||
            vo.setId(i + 1L);
 | 
					 | 
				
			||||||
            vo.setName("优惠劵" + (i + 1));
 | 
					 | 
				
			||||||
            vo.setUsePrice(random.nextInt(100) * 100);
 | 
					 | 
				
			||||||
            vo.setValidStartTime(LocalDateTime.now().plusDays(random.nextInt(10)));
 | 
					 | 
				
			||||||
            vo.setValidEndTime(LocalDateTime.now().plusDays(random.nextInt(20) + 10));
 | 
					 | 
				
			||||||
            vo.setDiscountType(random.nextInt(2) + 1);
 | 
					 | 
				
			||||||
            if (vo.getDiscountType() == 1) {
 | 
					 | 
				
			||||||
                vo.setDiscountPercent(null);
 | 
					 | 
				
			||||||
                vo.setDiscountPrice(random.nextInt(50) * 100);
 | 
					 | 
				
			||||||
                vo.setDiscountLimitPrice(null);
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                vo.setDiscountPercent(random.nextInt(90) + 10);
 | 
					 | 
				
			||||||
                vo.setDiscountPrice(null);
 | 
					 | 
				
			||||||
                vo.setDiscountLimitPrice(random.nextInt(200) * 100);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            vo.setMatch(random.nextBoolean());
 | 
					 | 
				
			||||||
            if (!vo.getMatch()) {
 | 
					 | 
				
			||||||
                vo.setDescription("不符合条件噢");
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            list.add(vo);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return success(list);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @GetMapping("/page")
 | 
					    @GetMapping("/page")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
				
			|||||||
import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponRespDTO;
 | 
					import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponRespDTO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon.CouponPageItemRespVO;
 | 
					import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon.CouponPageItemRespVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon.CouponPageReqVO;
 | 
					import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon.CouponPageReqVO;
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.coupon.AppCouponMatchRespVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.coupon.AppCouponPageReqVO;
 | 
					import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.coupon.AppCouponPageReqVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.coupon.AppCouponRespVO;
 | 
					import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.coupon.AppCouponRespVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
 | 
				
			||||||
@@ -15,6 +16,7 @@ import org.mapstruct.factory.Mappers;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import java.time.LocalDateTime;
 | 
					import java.time.LocalDateTime;
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 优惠劵 Convert
 | 
					 * 优惠劵 Convert
 | 
				
			||||||
@@ -57,4 +59,6 @@ public interface CouponConvert {
 | 
				
			|||||||
    CouponPageReqVO convert(AppCouponPageReqVO pageReqVO, Collection<Long> userIds);
 | 
					    CouponPageReqVO convert(AppCouponPageReqVO pageReqVO, Collection<Long> userIds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    PageResult<AppCouponRespVO> convertAppPage(PageResult<CouponDO> pageResult);
 | 
					    PageResult<AppCouponRespVO> convertAppPage(PageResult<CouponDO> pageResult);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    List<AppCouponMatchRespVO> convertList(List<CouponDO> list);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,13 @@
 | 
				
			|||||||
package cn.iocoder.yudao.module.promotion.dal.mysql.coupon;
 | 
					package cn.iocoder.yudao.module.promotion.dal.mysql.coupon;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import cn.hutool.core.bean.BeanUtil;
 | 
					import cn.hutool.core.bean.BeanUtil;
 | 
				
			||||||
 | 
					import cn.hutool.core.util.StrUtil;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
					import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
				
			||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 | 
					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.coupon.vo.coupon.CouponPageReqVO;
 | 
					import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon.CouponPageReqVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.module.promotion.enums.common.PromotionProductScopeEnum;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.service.coupon.bo.CouponTakeCountBO;
 | 
					import cn.iocoder.yudao.module.promotion.service.coupon.bo.CouponTakeCountBO;
 | 
				
			||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
					import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
				
			||||||
import com.github.yulichang.toolkit.MPJWrappers;
 | 
					import com.github.yulichang.toolkit.MPJWrappers;
 | 
				
			||||||
@@ -13,6 +15,8 @@ import org.apache.ibatis.annotations.Mapper;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import java.util.Collection;
 | 
					import java.util.Collection;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.function.Function;
 | 
				
			||||||
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 优惠劵 Mapper
 | 
					 * 优惠劵 Mapper
 | 
				
			||||||
@@ -73,4 +77,21 @@ public interface CouponMapper extends BaseMapperX<CouponDO> {
 | 
				
			|||||||
                .in(CouponDO::getTemplateId, templateIds)
 | 
					                .in(CouponDO::getTemplateId, templateIds)
 | 
				
			||||||
                .groupBy(CouponDO::getTemplateId)), CouponTakeCountBO.class);
 | 
					                .groupBy(CouponDO::getTemplateId)), CouponTakeCountBO.class);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    default List<CouponDO> selectListByUserIdAndStatusAndUsePriceLeAndProductScope(
 | 
				
			||||||
 | 
					            Long userId, Integer status, Integer usePrice, List<Long> spuIds, List<Long> categoryIds) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Function<List<Long>, String> productScopeValuesFindInSetFunc = ids -> ids.stream()
 | 
				
			||||||
 | 
					                .map(id -> StrUtil.format("FIND_IN_SET({}, product_scope_values) ", id))
 | 
				
			||||||
 | 
					                .collect(Collectors.joining(" OR "));
 | 
				
			||||||
 | 
					        return selectList(new LambdaQueryWrapperX<CouponDO>()
 | 
				
			||||||
 | 
					                .eq(CouponDO::getUserId, userId)
 | 
				
			||||||
 | 
					                .eq(CouponDO::getStatus, status)
 | 
				
			||||||
 | 
					                .le(CouponDO::getUsePrice, usePrice)
 | 
				
			||||||
 | 
					                .and(w -> w.eq(CouponDO::getProductScope, PromotionProductScopeEnum.ALL.getScope())
 | 
				
			||||||
 | 
					                        .or(ww -> ww.eq(CouponDO::getProductScope, PromotionProductScopeEnum.SPU.getScope())
 | 
				
			||||||
 | 
					                                .apply(productScopeValuesFindInSetFunc.apply(spuIds)))
 | 
				
			||||||
 | 
					                        .or(ww -> ww.eq(CouponDO::getProductScope, PromotionProductScopeEnum.CATEGORY.getScope())
 | 
				
			||||||
 | 
					                                .apply(productScopeValuesFindInSetFunc.apply(categoryIds)))));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.promotion.service.coupon;
 | 
				
			|||||||
import cn.hutool.core.collection.CollUtil;
 | 
					import cn.hutool.core.collection.CollUtil;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
					import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon.CouponPageReqVO;
 | 
					import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon.CouponPageReqVO;
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.coupon.AppCouponMatchReqVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTakeTypeEnum;
 | 
					import cn.iocoder.yudao.module.promotion.enums.coupon.CouponTakeTypeEnum;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.service.coupon.bo.CouponTakeCountBO;
 | 
					import cn.iocoder.yudao.module.promotion.service.coupon.bo.CouponTakeCountBO;
 | 
				
			||||||
@@ -147,4 +148,13 @@ public interface CouponService {
 | 
				
			|||||||
     * @return 领取优惠券的数量
 | 
					     * @return 领取优惠券的数量
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    List<CouponTakeCountBO> getTakeCountListByTemplateIds(Collection<Long> templateIds, Long userId);
 | 
					    List<CouponTakeCountBO> getTakeCountListByTemplateIds(Collection<Long> templateIds, Long userId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取用户匹配的优惠券列表
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param userId     用户编号
 | 
				
			||||||
 | 
					     * @param matchReqVO 匹配参数
 | 
				
			||||||
 | 
					     * @return 优惠券列表
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    List<CouponDO> getMatchCouponList(Long userId, AppCouponMatchReqVO matchReqVO);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,7 @@ import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
 | 
				
			|||||||
import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
 | 
					import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
 | 
				
			||||||
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
 | 
					import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon.CouponPageReqVO;
 | 
					import cn.iocoder.yudao.module.promotion.controller.admin.coupon.vo.coupon.CouponPageReqVO;
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.module.promotion.controller.app.coupon.vo.coupon.AppCouponMatchReqVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.convert.coupon.CouponConvert;
 | 
					import cn.iocoder.yudao.module.promotion.convert.coupon.CouponConvert;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponDO;
 | 
				
			||||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponTemplateDO;
 | 
					import cn.iocoder.yudao.module.promotion.dal.dataobject.coupon.CouponTemplateDO;
 | 
				
			||||||
@@ -186,6 +187,12 @@ public class CouponServiceImpl implements CouponService {
 | 
				
			|||||||
        return couponMapper.selectCountByUserIdAndTemplateIdIn(userId, templateIds);
 | 
					        return couponMapper.selectCountByUserIdAndTemplateIdIn(userId, templateIds);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public List<CouponDO> getMatchCouponList(Long userId, AppCouponMatchReqVO matchReqVO) {
 | 
				
			||||||
 | 
					        return couponMapper.selectListByUserIdAndStatusAndUsePriceLeAndProductScope(userId, CouponStatusEnum.UNUSED.getStatus(),
 | 
				
			||||||
 | 
					                matchReqVO.getPrice(), matchReqVO.getSpuIds(), matchReqVO.getCategoryIds());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 校验优惠券是否可以领取
 | 
					     * 校验优惠券是否可以领取
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,6 +37,8 @@ public class AppTradeOrderSettlementRespVO {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        // ========== SPU 信息 ==========
 | 
					        // ========== SPU 信息 ==========
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @Schema(description = "品类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
 | 
				
			||||||
 | 
					        private Long categoryId;
 | 
				
			||||||
        @Schema(description = "SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
 | 
					        @Schema(description = "SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
 | 
				
			||||||
        private Long spuId;
 | 
					        private Long spuId;
 | 
				
			||||||
        @Schema(description = "SPU 名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "Apple iPhone 12")
 | 
					        @Schema(description = "SPU 名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "Apple iPhone 12")
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user