规则引擎介绍

体系结构

规则引擎由以下六大部分组成:

  1. 函数:负责对数据的格式化处理,比如数据统计。
  2. 公式:负责对数据的逻辑处理,比如值之间比大小。
  3. 规则:实现校验逻辑。
  4. 前置条件:执行规则前必须满足的条件。
  5. 规则包:实现同时执行多条规则,并返回所有规则的执行结果。
  6. 引擎主程序:调用规则引擎的入口。

配置文件

  1. 规则引擎产品信息配置文件:配置规则引擎产品级属性。
  2. 规则配置文件:配置校验数据的规则。
  3. 规则前置条件配置文件:配置规则用到的前置条件。
  4. 规则包配置文件:配置校验数据规则的集合。
  5. 公式、函数配置文件:配置系统所有相关的函数以及公式。
  6. 决策树配置文件:配置决策树的集合;

变量类型

  1. 传入变量:业务系统传入的供规则使用的变量,以“@”符号开头,变量名字中不能包含“@”符号。
  2. 中间变量:规则计算过程中生成的变量,以”$”符号开头,变量名字中不能包含”$”符号。

特殊标识符

标识符 说明
@ 传入变量前缀
$ 过程变量前缀
# 函数名前缀
- 校验公式分隔符
; 比对值分隔符

支持的公式

公式名 说明 是否已经支持
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. 规则引擎的函数支持函数嵌套,嵌套之后的函数会预先执行最里面的函数再依次执行外面的函数,如:

  1. 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 前置条件文件 biz/conditions.xml
contract/conditions.xml
customer/conditions.xml
duebill/conditions.xml
pub/conditions.xml
需要加载的前置条件文件,多个文件就配置多个file元素
ruleFiles 规则文件 biz/rules.xml
contract/rules.xml
customer/rules.xml
duebill/rules.xml
pub/rules.xml
需要加载的规则文件,多个文件就配置多个file元素
modelFiles 规则包文件 biz/models.xml
contract/models.xml
customer/models.xml
duebill/models.xml
pub/models.xml
需要加载的规则包文件,多个文件就配置多个file元素

PS:每个业务系统必须有且只能有一个规则引擎产品配置文件,否则规则引擎将无法运行。

前置条件配置

前置条件配置在前置条件配置文件中,业务系统可以根据子系统或功能模块拆分前置条件配置文件,每个前置条件文件可以配置多个前置条件。

前置条件属性说明:

节点属性含义备注
conditionid前置条件ID全系统唯一,一般编号规则为:模块简称+”-C“+流水号
name前置条件名称
checktype检测的类型1.该类型应与
规则公式配置文件中配置的公式一致保持一致。
2.公式可以有多个,以“-”符号分隔。
startValue范围顶值用于判断数字范围的最小值
endValue范围底值用于判断数字范围的最大值
checkedFieldName被检测的值存放需要被规则校验的值,支持通过函数运算
targetDataList比对值可以有多个,以”;”符分隔
openClose开闭区间可以使用开闭区间判断范围,例如:(1,10];
sql通过该SQL语句获取结果集,SQL可以有变量以@开头,可以配置多个

PS:前置条件是规则的超类,他包含了规则里面的大部分属性;

规则配置

规则配置在规则配置文件中,业务系统可以根据功能模块拆分规则文件,每个规则文件可以配置多条规则。

规则属性说明:

节点属性含义备注
ruleid规则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)

示例:

  1. <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"_\>
  2. <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>
  3. <sql>select count(loan\_id) v3 from TB\_LON\_LOAN\_APPLICATION where CUS\_ID = @cusId </sql>
  4. </rule>

示例说明:规则引擎执行“BIZ-R0001”规则的顺序如下:

  1. 规则引擎获取SQL节点的语句,如果该SQL语句有变量,规则引擎根据将预设的变量值赋给SQL语句组成一个可以执行的字符串,并通过该字符串到数据库查出符合条件的结果集。如果结果集没有数据将不执行本节点的所有规则。
  2. 判断规则内部是否存在前置条件condition和公式formula,如果存在,则先根据公式判断是否满足前置条件,如果满足再进行规则判断。如果不满足,直接忽略该规则。
  3. 如果结果集有数据,规则引擎先执行BIZ-R0001规则:获取结果集中的v1,v2,v3字段对应的值,并将这三个变量值作为参数执行checkedFieldName设置的函数,计算出的结果作为此规则的被检测值传入checktype节点定义的所有公式中,greater公式将该值和startValue配置的值进行是否大于运算,如果返回true继续执行下一个公式,如果返回false,该规则直接不通过。

规则包配置

规则包是多个规则的合集,具体配置信息如下:

节点属性含义备注
modelid规则包ID全系统唯一,一般编号规则为:模块简称+”-M“+流水号
name规则包名称描述规则包的作用
isIgnore是否忽略错误
  1. true:忽略规则包中的规则错误
  2. false:不忽略规则包中的规则错误
当规则包配置为true(忽略错误)时,包中的所有规则都会执行,最后将返回所有错误规则的检查结果集合;
当规则包配置为false(不忽略错误)时,包中规则按顺序执行,只要有一条规则不符合规则,就会停止检查,返回该条规则的错误信息。
rule配置规则包中包含的规则ID

调用规则

将规则引擎集成到业务系统后,业务系统只需在程序里调用规则引擎的com.git.easyodm. ODMExecutor类的runRule和runModel方法即可,规则引擎启动之后便根据自身的规则配置项对数据进行校验处理,处理结果将存入规则文件配置的指定表当中。

在调用ODMExecutor类的runRule和runModel方法时需传入几个参数,以下表格是参数说明:

参数名 类型 中文说明 备注
ruleID/modelID String 规则ID/规则包ID 用于找到需要校验的规则或者规则包
paramMap DTDMap 参数对象 规则或规则包需要用到的变量集合

后台调用规则引擎示例:

  1. //调用规则或规则包
  2. List<MessageObj> result = execRule("LOAN-R0004", EngineConstants.RULE,pd);
  3. //解析规则返回结果,默认只解析规则执行失败的信息
  4. String retMsg = parseMsg(result);
  5. //解析所有规则返回结果
  6. String retMsg = parseMsg(result,false);

前台调用规则引擎示例:

未完待续。。。

扩展规则引擎

目前规则引擎只提供了最常用的规则,为了使其更加符合业务系统各方面的数据校验处理,规则引擎提供了相关接口供开发人员再次扩展。

规则引擎的扩展主要包括两部分:函数扩展和公式扩展。

扩展函数

  1. 实现函数接口:主要实现com.git.easyodm.func.Function接口的public String getValue(List<String> list)方法。
  2. 添加配置项:在公式、函数配置文件中添加配置Bean,同时Bean的Name 以function\_开头,如下:
  1. <bean id="function\_sum" ></bean>

扩展公式

  1. 实现公式接口:主要实现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。

  1. 添加配置项:在公式、函数配置文件中添加配置Bean,同时Bean的Name

Formula\_开头,如下:

附录:常见问题汇总