规则引擎介绍
体系结构
规则引擎由以下六大部分组成:
- 函数:负责对数据的格式化处理,比如数据统计。
- 公式:负责对数据的逻辑处理,比如值之间比大小。
- 规则:实现校验逻辑。
- 前置条件:执行规则前必须满足的条件。
- 规则包:实现同时执行多条规则,并返回所有规则的执行结果。
- 引擎主程序:调用规则引擎的入口。
配置文件
- 规则引擎产品信息配置文件:配置规则引擎产品级属性。
- 规则配置文件:配置校验数据的规则。
- 规则前置条件配置文件:配置规则用到的前置条件。
- 规则包配置文件:配置校验数据规则的集合。
- 公式、函数配置文件:配置系统所有相关的函数以及公式。
- 决策树配置文件:配置决策树的集合;
变量类型
- 传入变量:业务系统传入的供规则使用的变量,以“@”符号开头,变量名字中不能包含“@”符号。
- 中间变量:规则计算过程中生成的变量,以”$”符号开头,变量名字中不能包含”$”符号。
特殊标识符
| 标识符 | 说明 |
|---|---|
| @ | 传入变量前缀 |
| $ | 过程变量前缀 |
| # | 函数名前缀 |
| - | 校验公式分隔符 |
| ; | 比对值分隔符 |
支持的公式
| 公式名 | 说明 | 是否已经支持 |
|---|---|---|
| eqs | 判断字符串是否相等 | 是 |
| ineqs | 判断字符串是否不相等 | 是 |
| eqn | 判断数字是否相等 | 是 |
| ineqn | 判断数字是否不相等 | 是 |
| greater | 大于 | 是 |
| less | 小于 | 是 |
| ge | 大于等于 | 是 |
| le | 小于等于 | 是 |
| isnum | 判断是数字 | 是 |
| notnum | 判断不是数字 | 是 |
| isint | 判断是整数 | 是 |
| idvalid | 判断身份证合法 | 是 |
| dateafter | 在XX日期之后 | 是 |
| datebegin | 在XX日期之前 | 是 |
支持的函数
| 函数名 | 说明 | 是否已经支持 |
|---|---|---|
| sum(p…..N) | 汇总多个参数值得和,参数可以有多个,中间以逗号分隔 | 是 |
| len(p) | 取参数的长度 | 是 |
注: 1. P:代表参数,N代表可以有多个。
2. 规则引擎的函数支持函数嵌套,嵌套之后的函数会预先执行最里面的函数再依次执行外面的函数,如:
checkedFieldName="**#sum(#sum($v1,$V5), #sum ($v2,$V6),$v3,$v4)**"
执行顺序:首先执行#sum($v1,$V5)函数,然后执行#sum($v2,$V6)函数,最后执行最外面的#sum函数。
规则引擎使用说明
产品信息配置
产品信息配置文件放置路径为:.. /rules/ ruleEngine\_properties.xml
具体参数信息如下:
| 参数 | 参数名称 | 默认值 | 说明 |
|---|---|---|---|
| engineName | 引擎名称 | EasyODM | 显示规则引擎的名称 |
| copyRight | 版权 | 高伟达软件股份有限公司 | 版权所有,可根据实际情况修改 |
| version | 版本号 | 2.0 | 描述规则引擎的版本号 |
| runStatus | 运行状态 | true | 规则引擎在执行规则时根据此状态判断是否执行规则 |
| conditionFiles | 前置条件文件 | 需要加载的前置条件文件,多个文件就配置多个file元素 | |
| ruleFiles | 规则文件 | 需要加载的规则文件,多个文件就配置多个file元素 | |
| modelFiles | 规则包文件 | 需要加载的规则包文件,多个文件就配置多个file元素 |
PS:每个业务系统必须有且只能有一个规则引擎产品配置文件,否则规则引擎将无法运行。
前置条件配置
前置条件配置在前置条件配置文件中,业务系统可以根据子系统或功能模块拆分前置条件配置文件,每个前置条件文件可以配置多个前置条件。
前置条件属性说明:
| 节点 | 属性 | 含义 | 备注 |
| condition | id | 前置条件ID | 全系统唯一,一般编号规则为:模块简称+”-C“+流水号 |
| name | 前置条件名称 | ||
| checktype | 检测的类型 | 1.该类型应与 规则公式配置文件中配置的公式一致保持一致。 2.公式可以有多个,以“-”符号分隔。 | |
| startValue | 范围顶值 | 用于判断数字范围的最小值 | |
| endValue | 范围底值 | 用于判断数字范围的最大值 | |
| checkedFieldName | 被检测的值 | 存放需要被规则校验的值,支持通过函数运算 | |
| targetDataList | 比对值 | 可以有多个,以”;”符分隔 | |
| openClose | 开闭区间 | 可以使用开闭区间判断范围,例如:(1,10]; | |
| sql | 通过该SQL语句获取结果集,SQL可以有变量以@开头,可以配置多个 | ||
PS:前置条件是规则的超类,他包含了规则里面的大部分属性;
规则配置
规则配置在规则配置文件中,业务系统可以根据功能模块拆分规则文件,每个规则文件可以配置多条规则。
规则属性说明:
| 节点 | 属性 | 含义 | 备注 |
| rule | id | 规则ID | 全系统唯一,一般编号规则为:模块简称+”-R“+流水号 |
| name | 规则名称 | 描述规则作用 | |
| checktype | 检测的类型 | 1.该类型应与 规则公式配置文件中配置的公式一致保持一致。 2.公式可以有多个,以“-”符号分隔。 | |
| startValue | 范围顶值 | 用于判断数字范围的最小值 | |
| endValue | 范围底值 | 用于判断数字范围的最大值 | |
| checkedFieldName | 被检测的值 | 存放需要被规则校验的值,支持通过函数运算 | |
| targetDataList | 比对值 | 可以有多个,以”;”符分隔 | |
| openClose | 开闭区间 | 可以使用开闭区间判断范围,例如:(1,10]; | |
| actionType | 事件类型 | 规则执行后执行的事件类型: ACTION:执行一个自定义动作; MSG:返回文本信息; | |
| action | 触发事件 | 根据actionType配置相应的事件。 | |
| errCode | 错误码 | 规则校验失败时返回的错误代码 | |
| errMsg | 错误信息 | 规则校验时返回的错误信息你,支持解析规则中的变量 | |
| checkLevel | 检查级别 | 1:info;2:warn;3:err | |
| sql | 通过该SQL语句获取结果集,SQL可以有变量以@开头,可以配置多个 | ||
| condition | 前置条件,只需要配置前置条件ID,可以配置多个 | ||
| formula | 配置前置条件的公式,公式参数必须为规则中配置的前置条件。如formula为空,各个前置条件间的关系默认为“与”的关系。公式函数变量:#AND(var1,var2,…varn),#OR(var1,var2,…varn) | ||
示例:
<rule id=_"BIZ-R0001"_ name=_"客户存在不良贷款"_ checktype=_"greater-less-eqn"_ checkedFieldName=_"#sum(#sum($v1,$v2,-25),$v3)"_ targetDataList=_"25"_ startValue=_"20"_ endValue=_"30"_ errcode=_"2101015-012"_ errMsg=_"客户存在不良贷款"_ checkLevel=_"warn"_\><sql>select count(loan\_id) v1,nvl(max(loan\_length),0) v2 from TB\_LON\_LOAN where CLOSE\_FLAG = '0' and LOAN\_LEVEL\_FIVE\_CLASS in ('3','4','5') and CUS\_ID = @cusId</sql><sql>select count(loan\_id) v3 from TB\_LON\_LOAN\_APPLICATION where CUS\_ID = @cusId </sql></rule>
示例说明:规则引擎执行“BIZ-R0001”规则的顺序如下:
- 规则引擎获取SQL节点的语句,如果该SQL语句有变量,规则引擎根据将预设的变量值赋给SQL语句组成一个可以执行的字符串,并通过该字符串到数据库查出符合条件的结果集。如果结果集没有数据将不执行本节点的所有规则。
- 判断规则内部是否存在前置条件condition和公式formula,如果存在,则先根据公式判断是否满足前置条件,如果满足再进行规则判断。如果不满足,直接忽略该规则。
- 如果结果集有数据,规则引擎先执行BIZ-R0001规则:获取结果集中的v1,v2,v3字段对应的值,并将这三个变量值作为参数执行checkedFieldName设置的函数,计算出的结果作为此规则的被检测值传入checktype节点定义的所有公式中,greater公式将该值和startValue配置的值进行是否大于运算,如果返回true继续执行下一个公式,如果返回false,该规则直接不通过。
规则包配置
规则包是多个规则的合集,具体配置信息如下:
| 节点 | 属性 | 含义 | 备注 |
| model | id | 规则包ID | 全系统唯一,一般编号规则为:模块简称+”-M“+流水号 |
| name | 规则包名称 | 描述规则包的作用 | |
| isIgnore | 是否忽略错误 |
当规则包配置为false(不忽略错误)时,包中规则按顺序执行,只要有一条规则不符合规则,就会停止检查,返回该条规则的错误信息。 | |
| rule | 配置规则包中包含的规则ID | ||
调用规则
将规则引擎集成到业务系统后,业务系统只需在程序里调用规则引擎的com.git.easyodm. ODMExecutor类的runRule和runModel方法即可,规则引擎启动之后便根据自身的规则配置项对数据进行校验处理,处理结果将存入规则文件配置的指定表当中。
在调用ODMExecutor类的runRule和runModel方法时需传入几个参数,以下表格是参数说明:
| 参数名 | 类型 | 中文说明 | 备注 |
|---|---|---|---|
| ruleID/modelID | String | 规则ID/规则包ID | 用于找到需要校验的规则或者规则包 |
| paramMap | DTDMap | 参数对象 | 规则或规则包需要用到的变量集合 |
后台调用规则引擎示例:
//调用规则或规则包List<MessageObj> result = execRule("LOAN-R0004", EngineConstants.RULE,pd);//解析规则返回结果,默认只解析规则执行失败的信息String retMsg = parseMsg(result);//解析所有规则返回结果String retMsg = parseMsg(result,false);
前台调用规则引擎示例:
未完待续。。。
扩展规则引擎
目前规则引擎只提供了最常用的规则,为了使其更加符合业务系统各方面的数据校验处理,规则引擎提供了相关接口供开发人员再次扩展。
规则引擎的扩展主要包括两部分:函数扩展和公式扩展。
扩展函数
- 实现函数接口:主要实现
com.git.easyodm.func.Function接口的public String getValue(List<String> list)方法。 - 添加配置项:在公式、函数配置文件中添加配置Bean,同时Bean的Name 以
function\_开头,如下:
<bean id="function\_sum" ></bean>
扩展公式
- 实现公式接口:主要实现
com.git. easyodm.formula. Formula接口的
public boolean execute(Rule rule,Map<String,Object> record,Map<String,Object> sysVarMap)方法,同时实现类放在com.git. easyodm.formula.impl目录下,参数说明如下:
rule:具体规则。
Record:MAP结果集
sysVarMap:系统变量MAP。
- 添加配置项:在公式、函数配置文件中添加配置Bean,同时Bean的Name
以Formula\_开头,如下:
