当前位置: 首页 > news >正文

使用规则引擎简化特定场景的开发

之前做资金中台的时候,用到了aviator轻量级的规则引擎,简化了匹配逻辑。

前一段开发一个根据获奖规则生成获奖名单的功能,场景比资金路由的匹配要简单,但规则引擎也是适用的。

1. 加入依赖

<dependency><groupId>com.googlecode.aviator</groupId><artifactId>aviator</artifactId><version>5.3.3</version>
</dependency>

2. 新建一个规则工具类

import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.Expression;import java.util.HashMap;
import java.util.Map;/*** @author xxx*/
public class RuleExpressionUtils {private RuleExpressionUtils() {}/*** 增长量的规则表达式map*/private static Map<String,Expression> incrementNumExpressionMap = new HashMap<>();/*** 增长率的规则表达式map*/private static Map<String,Expression> incrementRateExpressionMap = new HashMap<>();/*** 根据指标编码获取对应的增长量规则表达式* @param indicator 指标编码* @return 增长量规则表达式*/public static Expression getIncrementNumExpressionByIndicator(String indicator){if(incrementNumExpressionMap.containsKey(indicator)){return incrementNumExpressionMap.get(indicator);}Expression expression = AviatorEvaluator.compile(String.format("double(current.%s)", indicator));incrementNumExpressionMap.put(indicator, expression);return expression;}/*** 根据指标编码获取对应的增长率规则表达式* @param indicator 指标编码* @return 增长率规则表达式*/public static Expression getIncrementRateExpressionByIndicator(String indicator){if(incrementRateExpressionMap.containsKey(indicator)){return incrementRateExpressionMap.get(indicator);}Expression expression = AviatorEvaluator.compile(String.format("double(current.%s)", indicator));incrementRateExpressionMap.put(indicator, expression);return expression;}/*** 计算规则表达式的结果* @param expression 规则表达式* @param dataMap 参数值map* @return 计算结果*/public static Double executeValueExpression(Expression expression, Map<String, Object> dataMap){try{return (Double)expression.execute(dataMap);}catch (Exception e){return null;}}/*** 判断参数是否匹配规则* @param checkRuleExpression 考核规则表达式* @param env 参数值map* @return 匹配结果*/public static boolean invokeCheckRule(Expression checkRuleExpression, Map<String, Object> env){try{return (Boolean) checkRuleExpression.execute(env);}catch (Exception e){return false;}}
}

3. 使用规则工具类进行是否获奖的匹配和奖金的计算


//判断是否匹配规则
boolean isMatch = RuleExpressionUtils.invokeCheckRule(expression, envMap);// 获取规则表达式,并计算奖励金额Expression incrementNumExpression = RuleExpressionUtils.getIncrementNumExpressionByIndicator(indicatorField);Double actualIncrement = (Double) RuleExpressionUtils.executeValueExpression(incrementNumExpression, dataMap);

http://www.mrgr.cn/news/26021.html

相关文章:

  • 如何把提醒事项以倒数日的形式放在桌面上?
  • oracle 如何查询表被锁
  • springboot Web基础开发
  • 代理导致的git错误
  • OpenAI 宣布新AI模型——代号“Strawberry”,逐步解决复杂问题
  • Matlab-Matpower制作IEEE14-电力虚假数据注入攻击FDIA数据集
  • 智能匹配企业名录,让找客户变得简单高效
  • 单考一个OCP认证?还是OCP和OCM认证都要考?
  • 什么是外贸专用路由器?
  • (安装VMtools工具)将一个文件从主系统(windows)传送到VMware虚拟机的Linux系统中
  • 【算法专场】分治(上)
  • 至强Xeon与酷睿Core处理器的详细对比分析
  • 基于MMDetection的OV-Dino实战
  • 多渠道优化您的DTC品牌以提升邮件收入
  • C# WinForm 中 DataGridView 实现单元格cell 能进编辑状态但是不能修改单元格的效果
  • YModem在Android上的实现(二)
  • Spring模块详解Ⅳ(Spring ORM和Spring Transaction)
  • Win10录屏技巧分享:四款录屏软件推荐!
  • C语言宏参数的使用
  • 内存分配形式介绍,你知道哪些?