在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

基于Spring EL如何实现一个简单的电商打折优惠规则引擎

122次阅读
没有评论

共计 3168 个字符,预计需要花费 8 分钟才能阅读完成。

今天就跟大家聊聊有关基于 Spring EL 如何实现一个简单的电商打折优惠规则引擎,可能很多人都不太了解,为了让大家更加了解,丸趣 TV 小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

基于 Spring EL 实现一个简单的电商打折优惠规则引擎

在日常工作中,能遇到使用规则引擎的地方非常的多。比如,电商中的打折优惠场景,复杂多变。再比如,考勤分析时每个部门都有不同的分析策略?;褂行阶始扑?,公司中不同职级,不同办公地点的算薪方式都不同。这些场景都非常的适合使用规则引擎。

说到规则引擎,大部分人可能首先想到的是 Drools,但其实 Spring EL 也很好用。

WTF?Spring EL 还能做规则引擎?

你没有看错,Spring EL 不仅能做规则引擎,我还在生产环境大范围的使用了。

  为什么要用 Spring EL 做规则引擎?

相对于别的规则引擎,Spring EL 更加轻量级,学习成本更低,与函数式编程配合表现可能超乎你的想象!

  规则引擎的使用场景

当一个系统的某项业务规则多变时,需要设计的非常的灵活,如果用传统硬编码的方式去做,可能导致代码逻辑异常复杂,而且需要改动得非常频繁。

为了解决这个问题,我打算引入脚本引擎去简化开发,降低系统复杂度,在考察过后,最终决定用 Spring EL。

  如何做

首先,我们先来定义一个结算的基础对象。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order {
 private String userId;
 private Integer age;
 // 是否是新客
 private Boolean isNew;
 private LocalDate orderDate;
 private BigDecimal price;
}

 

如果有一个供应商有一条结算规则是分成订单金额的 80%,我们可以这样计算。

public static void main(String[] args){
 ExpressionParser expressionParser = new SpelExpressionParser();
 Expression expression = expressionParser.parseExpression(price * 0.8
 Order order = new Order();
 order.setPrice(BigDecimal.TEN);
 BigDecimal value = expression.getValue(order, BigDecimal.class);
 System.out.println(value);
}

 

这样就能算出应该结算 8 元,当然这个例子太简单了,我们定义几个复杂的结算规则,看看应该如何去做。

规则 1:周一周五新客结算,结算金额为 price * 0.2

规则 2: 年龄大于 18 岁、金额大于 10 的结算,结算金额为 (price – 10) * 0.8 我们来看上面的规则,实际上是分成了两步,第一步是过滤掉不结算的订单,第二步是真正的计算金额,因此代码我们也可以分这两步走

我先定义几个测试用例

List Order  orders = new ArrayList Order (){{
 // 年龄 19,不是新客,周一下单,金额 11
 add(new Order( 张三 ,19,false,LocalDate.of(2020,11,9),new BigDecimal(11)));
 // 年龄 17,是新客,周五下单,金额 19
 add(new Order( 李四 ,17,true,LocalDate.of(2020,11,13),new BigDecimal(19)));
 // 年龄 17,不是新客,周六下单,金额 9
 add(new Order( 王五 ,17,true,LocalDate.of(2020,11,14),new BigDecimal(9)));
}};

 

主要逻辑如下, 先过滤掉不需要的订单,然后对剩下的订单进行结算。

public static void settle(List Order  orders, List String  filterRule,
 String settleRule, Map String, Expression  expressionCache) {
 Stream Order  stream = orders.stream();
 for (String rule : filterRule) {
 Expression expression = FunctionUtil
 .cacheFunction(s -  expressionParser.parseExpression(s), rule, expressionCache);
 stream = filter(stream, expression);
 }
 Expression expression = FunctionUtil
 .cacheFunction(s -  expressionParser.parseExpression(s), settleRule, expressionCache);
 stream.forEach(o -  System.out.println(o.getUserId() + expression.getValue(o)));
}

public static  T  Stream T  filter(Stream T  stream, Expression expression) {
 return stream.filter(s -  expression.getValue(s, Boolean.class));
}

 

FunctionUtil.cacheFunction() 的作用是对 Expression 进行缓存,因为创建 Expression 的代价比较高,因此把 String 规则作为 key,Expression 作为 value 缓存一下。

执行一下代码。

public static void main(String[] args) {
 Map String, Expression  expressionCache = new HashMap String, Expression

 System.out.println(结算 rule1
 List String  filterRule1 =
 Arrays.asList(orderDate.getDayOfWeek().getValue() == 1 || orderDate.getDayOfWeek().getValue() == 5 ,  isNew
 String settleRule1 =  price * 0.2
 settle(orders, filterRule1, settleRule1, expressionCache);

 System.out.println(结算 rule2
 List String  filterRule2 = Arrays.asList(age   18 ,  price   10
 String settleRule2 =  (price - 10) * 0.8
 settle(orders, filterRule2, settleRule2, expressionCache);
}

 

执行结果。

 结算 rule1
李四 3.8
结算 rule2
张三 0.8

 

可以看到,通过 Spring EL 和函数式编程,我们只需要编写规则就可以实现复杂的结算逻辑。

看完上述内容,你们对基于 Spring EL 如何实现一个简单的电商打折优惠规则引擎有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注丸趣 TV 行业资讯频道,感谢大家的支持。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-17发表,共计3168字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 扒开末成年粉嫩的流白浆视频 | 两个人日本在线观看视频 | 成人毛片全部免费观看 | 亚洲人成网亚洲欧洲无码久久 | 久久婷婷久久一区二区三区 | 欧美日韩国产深夜福利视频 | 中文字幕一区二区三区乱码 | 理论片午午伦夜理片久久 | 国内精品久久久久影 | 色综合久久久久综合体桃花网 | 又大又长粗又爽又黄少妇视频 | 国精品人妻无码一区免费视频电影 | 日韩 ed2k| 99热久久这里只精品 | 国产超碰人人模人人爽人人喊 | 丝袜视频在线观看 | 亚洲精品久久久久久下一站 | 无码人妻一区二区三区免费n鬼沢 | 四虎精品8848ys一区二区 | 欧美成亚洲 | 尤物在线观看精品国产福利片 | 亚洲欧美国产精品专区久久 | 午夜成年人视频 | 国产永久在线 | 成年免费a级毛片免费看 | 精品一区二区高清在线观看 | 毛片大全高清免费 | 五月久久 | 欧美肉大捧一进一出免费视频 | 成人综合久久精品色婷婷 | 亚洲成人在线电影 | 国产麻豆天美果冻无码视频 | 日本大臿亚洲香蕉大片 | 起碰成人免费公开网视频 | 青青青免费在线视频 | 国自产偷精品不卡在线 | 国产99精品| 久久综合久久鬼色 | 国产青草视频 | 亚洲精品亚洲九十七页 | 中文字幕天堂久久精品 |