优惠券规则校验,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 群随时交流、讨论,也非常感谢同学的支持!
20
相似问题