优惠券规则校验,SettlementInfo 里面的优惠券模板类型可能不止一种吧?

来源:10-3 定义优惠券规则执行器抽象类

慕哥0422421

2020-02-29

这里 settlement.getCouponAndTemplateInfos().get(0).getTemplate()
.getRule().getUsage().getGoodsType() 直接 get(0)了,但是结算信息里面优惠券模板CouponTemplateSDK可能不止一种,应该把每一种的规则里面的使用范围都获取才对吧!

写回答

1回答

张勤一

2020-03-01

同学你好:

    我 check 下我的代码,是没有问题的。你看到的是抽象类中的通用方法(通用方法是针对单一优惠券做判断的),但是,我在多个优惠券 Executor 中又会进行重写的。例如,我实现了一个 “满减 + 折扣优惠券的处理规则”(ManJianZheKouExecutor),这里面就会重写 isGoodsTypeSatisfy 方法,且会判断所有的 GoodsType 都满足。

    你可以看到下面的代码:

/**
 * <h2>校验商品类型与优惠券是否匹配</h2>
 * 需要注意:
 * 1. 这里实现的只是单品类优惠券的校验, 多品类优惠券重载此方法实现
 * 2. 商品只要有一个与优惠券要求的商品类型匹配就可以(可以根据需要自行实现)
 *
 * @param settlement {@link SettlementInfo}
 * @return true: 不合法; false: 合法
 */
@Override
@SuppressWarnings("all")
protected boolean isGoodsTypeSatisfy(SettlementInfo settlement) {

    log.debug("Check ManJian And ZheKou Is Match Or Not!");

    List<Integer> goodsType = settlement.getGoodsInfos().stream().map(GoodsInfo::getType)
            .collect(Collectors.toList());
    List<Integer> templateGoodsType = new ArrayList<>();

    settlement.getCouponAndTemplateInfos().forEach(ct -> {
        templateGoodsType.addAll(
                JSON.parseObject(ct.getTemplate().getRule().getUsage().getGoodsType(), List.class)
        );
    });

    // 如果想要使用多种优惠券, 则必须要所有的商品类型都要包含在内, 即差集为空
    return CollectionUtils.isEmpty(CollectionUtils.subtract(goodsType, templateGoodsType));
}


    欢迎来 QQ 群随时交流、讨论,也非常感谢同学的支持!

2
0

Spring Cloud微服务实战 打造企业级优惠券系统

微服务,SpringCloud,SpringBoot面试、毕设、

1203 学习 · 487 问题

查看课程