规则引擎
平台提供了规则引擎组件,它可以嵌入到程序当中。将程序复杂的判断规则从业务代码中剥离出来,使得程序只需要关心自己的业务,而不需要去进行复杂的逻辑判断;简单的理解是规则接受一组输入的数据,通过预定好的规则配置,再输出一组结果。
设计时定义规则
打开应用的 IDE,从组件市场中增加“规则引擎” ruleengine组件
当应用中引入规则引擎组件后,设置-规则配置打开进行规则定义
定义规则模型
选择不同的服务模块,定义规则模型,一个服务模块可以定义多个规则模型
事实定义
定义规则计算入口参数。 数据类型:支持简单数据类型、对象数据类型、JSON等。 数据来源:平台的数据模型,自定义JSON。
在使用模型前,可以先定义“事实定义”,类似于模型的参数。
点击事实定义,点击新增或者编辑已有的事实定义进行编辑页面:
一般可以选择 JSON 数据类型,分别定义需要的参数。新增参数后,记得点击“生成内容”。
事实定义属性
| 属性 | 描述 |
| ------- | -------- |
| 标题 | 参数标题 |
| 名称标识 | 只能使用字母及数字组合 |
| 数据类型 | 数据模型,JSON数据 |
| 是否必填 | 参数是否必填 |
| 属性列表 | 参数属性 |
| 内容 | 生成对应格式代码 |
数据类型:数据模型(即:选择应用中定义的数据模型)
数据类型:JSON数据(在属性列表中定义属性信息后,点击生成内容,生成指定格式内容即可)
规则定义
回到规则设计页签,新增选择不同的规则类型定义规则,目前支持表达式、决策表、决策树、评分卡类型
规则定义完成后,先点击左侧的“保存设计”,再点击右侧的“保存”。这样才把设计内容进行保存。
属性 | 描述 |
---|---|
类型 | 支持表达式、决策表、决策树、评分卡 |
ID | 规则ID |
标题 | 规则标题 |
名称标识 | 名称标识 |
优先级 | 填数字,当有多个规则满足条件时,这个值用来决定这些满足条件规则中动作的执行顺序,值越大,执行顺序越靠前。如不设置这个值,那按条件满足的顺序执行,也就是说如果不配置优先级属性规则的执行顺序是不确定的 |
规则测试 | 选择测试样例数据在线测试规则 |
表达式
表达式使用规则(与if else使用语法相似),可以多个同时使用;
如果
判断条件
那么
结果处理
使用方法:
1.先把语法格式写好:如果 判断条件 那么 结果处理
2.鼠标移动至“判断条件”及“结果处理”,设置事实定义选择,在点击“插入事实定义”,事实定义选择:数据来源于事实定义设置
3.表单完成后,点击“保存设计”按钮保存数据
示例:
如果 成绩评级.fchengji>=97 那么 {成绩评级.fpingji = "优秀"};
如果 成绩评级.fchengji>=90 并且 成绩评级.fchengji <=96 那么 {成绩评级.fpingji = "良"};
如果 成绩评级.fchengji<80 那么 {成绩评级.fpingji = "中"};
决策表:
使用luckysheet来编辑。
决策表是一种以表格形式表现规则的工具,它非常适用于描述处理判断条件较多,各条件又相互组合、有多种决策方案的情况,决策表提供精确而简洁描述复杂逻辑的方式,可将多个条件及与这些条件满足后要执行动作以图形化形式进行对应。
使用方法:
1.选择要设置的单元格
2.根据需要设置单元格内容、事实定义选择、事实定义类型,设置完成后需要点击“设置单元格”保存数据
事实定义选择:数据来源于事实定义设置
事实定义类型:
条件:判断条件
赋值:符合条件则执行赋值操作
3.单元格设置完成后需要点击“保存设计”保存规则数据
示例:
成绩输入.成绩 成绩输入.评级
>=95 优秀
<90 良
决策树:
使用antv x6的思维导图模式来编辑。
节点有 3 种类型:
- 参数节点:要对比的属性,一般用于设置条件判断字段,比如这里为成绩;
- 条件节点:参数节点要使用的比较条件,一般用于设置判断条件,比如这里为 >= 95,也就是成绩要大于等于 95;
- 动作节点:一般用于给指定字段赋值使用,比较后,需要对某个返回属性进行赋值,比如评级为 优秀。
使用方法
1. 选中需要设置的节点
2. 设置节点类型、节点标注及节点内容后,需要点击“设置节点”保存数据
3. 树节点设置完成后需要点击“保存设计”
评分卡:
使用luckysheet来编辑。
评分卡与决策表使用相似,评分卡内置评分项、权重、条件及评分。
使用方法:
1.选择要设置的单元格
2.根据需要设置单元格内容、评分项选择、评分赋值选择,设置完成后需要点击“设置单元格”保存数据
评分项选择:数据来源于事实定义设置
评分赋值选择:数据来源于事实定义设置
3.单元格设置完成后需要点击“保存设计”保存规则数据
样例数据定义
定义好规则和事实定义后,可以对该规则进行测试,测试前需要先准备样例数据:
点击新增,设置样例标题、下拉选择规则、填写输出值,事实定义内容设置这里需要根据事实定义的属性,分别对属性进行赋值:
规则测试
样例数据设置完成后,点击操作中"测试规则"
在弹出的测试页面:
- 左边是原来样例数据的内容,可临时修改测试值;
- 中间是测试条件,可选择需要测试的规则,并点击测试;
- 右边是测试结果,“实际结果”是调用规则返回的内容,可以和期望结果进行对比。
业务中调用规则
在本案例,提供了一个调用规则 API 进行测试的页面,首先在测试页面中将规则引擎组件添加到页面
调用前,需要先输入调用哪个模型(比如 test),要调用的规则(比如 cjjcs,也就是决策树那个规则的标识),事实定义内容(可参考样例数据的结构)。点击调用即可返回规则运行计算后的数值。其中:
- js 异步调用【推荐使用】
调用的是组件的 fire 函数:
let data = this.comp("tableCustomData0");
let rulecomp = this.comp("ruleengine0");
let filename = data.getValue("filename");
let modelname = data.getValue("rulename");
let facts = data.getValue("facts");
facts = JSON.parse(facts);
this.comp("ruleengine0").fire(filename, modelname, facts).then(function (ret) {
wx.showToast({
"title": "返回结果:" + ret
});
data.setValue("result", JSON.stringify(ret));
});
- 操作调用
类似于“序号”组件的使用。
- 2 步调用
和操作类似,可以先调用 fire,再另外获取调用结果 fireSync:
let data = this.comp("tableCustomData0");
let rulecomp = this.comp("ruleengine0");
let filename = data.getValue("filename");
let modelname = data.getValue("rulename");
let facts = data.getValue("facts");
facts = JSON.parse(facts);
// 2步调用
rulecomp.fire(filename, modelname, facts).then(function (ret) {
ret = rulecomp.fireSync(filename, modelname, facts);
data.setValue("resultSync", ret);
});
运行时使用
运行时,模型内容会先从应用的模型文件加载到规则引擎微服务的数据库中,后续使用数据库中的模型内容来运行。如果没有规则引擎微服务,则会加载应用本身的模型文件。
添加规则引擎微服务
这里对规则引擎应用进行发布,同时规则引擎测试案例应用也需要发布,之后在租户-应用/服务管理中从市场添加规则引擎服务并注册。
门户服务注册后,访问规则引擎微服务的规则模型库页面:
要运行哪个应用的规则模型文件,需要先选择这个微服务:
选择后,会自动获取该微服务的模块列表:
如果没有显示模块列表,再重新点一下那个微服务。也就是,需要根据微服务和模块(比如 main),来获取相应的模型文件列表:
点击查询,即可从案例中查询到 main 模块下边的规则模型文件列表,并写入到规则引擎微服务的数据库表中,在表格中展示出来:
此时把开发时的模型内容保存为运行时的模型内容了,后续就可以基于运行时的模型内容进行调用。
案例应用调用
门户服务注册后,访问案例的测试页面:
此时调用的模型内容,是来自规则引擎微服务数据表中的内容。
修改运行时模型
在规则引擎的规则模型库列表
选择服务下的规则模型,开发时导入不可编辑只能查看,因此,点击“复制新建”新建编辑
点击“编辑”,可打开在开发时设置的规则定义进行编辑修改
修改完成后,点击“发布”发布为当前规则版本
打开版本管理,可查看规则历史版本及当前主版本信息
规则引擎组件开发
在租户的应用中,打开“规则引擎开发”这个应用。需要注意的是:
- 开发组件要切换到 comp/ruleengine 端
- 特别注意:一进来的桌面端,是最早没做组件时,先做的功能页面。后边把这些功能页面和数据模型都移动到组件那边了。这个端的内容不需要浏览和开发了。
切换到组件开发端后,开发的页面,切换到如图这边,双击页面打开,就跟平常开发一致:
组件开发后,可以导出组件源码包,再上传到组件市场,可供其他案例引入进来使用。使用这块参考组件开发章节。