采用Excel作为可视化设计器的开源规则引擎 NopRule

决策树和决策矩阵是业务人员可以直观理解的复杂IF-ELSE逻辑表达形式,也是规则引擎中最常用、最有用的部分。常见的规则引擎如Drools虽然提供了更加丰富的功能特性集,
特别是所谓的RETE算法可以用于高效复用多次重复出现的表达式片段,但在实际业务应用中很少出现必须使用RETE算法的情况,大部分情况下我们都是把规则引擎降级为决策表和决策矩阵来使用。

合理安排决策树和决策矩阵的节点顺序已经可以起到优化执行的作用。对于必须使用RETE算法的情况往往一般人已经难以直观理解,难以交给业务人员直接配置。
甚至程序员理解其中的执行细节也存在困难,还不如手工实现更加便于优化。基本的决策表+类似流程图的执行控制往往比使用RETE算法更加合用。

NopRule是一个非常轻量级的规则引擎,它可以嵌入在Java程序内部使用,也可以作为微服务被远程调用。
它提供了在线可视化设计界面,可以将规则模型保存在数据库中实现动态更新,同时也可以使用静态的模型文件,不依赖数据库存储。

与NopReport报表引擎类似,NopRule可以使用Excel作为可视化设计工具,直接导入Excel格式的规则模型,极大简化了业务规则的设计和使用。

一. 使用方式

仿照nop-quarks-demo工程中的做法,在pom文件中可以引入如下模块

    <dependency>
        <groupId>io.github.entropy-cloud</groupId>
        <artifactId>nop-rule-service</artifactId>
    </dependency>

    <dependency>
        <groupId>io.github.entropy-cloud</groupId>
        <artifactId>nop-rule-web</artifactId>
    </dependency>

nop-rule-service提供后端规则服务。nop-rule-web包含对应的amis前端管理页面。

/_vfs/nop/demo/app.action-auth.xml中引入nop-rule.action-auth.xml,其中定义了用于测试的功能菜单

<auth x:extends="/nop/auth/auth/nop-auth.action-auth.xml,/nop/sys/auth/nop-sys.action-auth.xml,
    /nop/rule/auth/nop-rule.action-auth.xml">
</auth>

启动后访问http://localhost:8080/#/NopRuleDefinition-main

1.1 规则调用

可以通过RuleService接口调用远程规则服务

Map<String,Object> inputs = new HashMap<String,Object>();
inputs.put("season","Winter");
inputs.put("guestCount",10);

RuleRequestBean request = new RuleRequestBean();
request.setRuleName("test-decision-table");
request.setInputs(inputs);

RuleResponseBean response = ruleService.executeRule(ApiRequest.build(inputs)).get();
Map<String,Object> outputs = response.getOutputs();

如果是嵌入在Java程序内部使用,则可以直接使用IRuleManager接口,减少请求对象的包装转换

IRuleManager ruleManager = getRuleManager();
IRuleRuntime ruleRt = ruleManager.newRuntime();
ruleRt.setInput("season", "Winter");
ruleRt.setInput("guestCount", 4);
Map<String, Object> output = ruleManager.executeRule("test/test-table", null, ruleRt);
System.out.println(JsonTool.serialize(ruleRt.getLogMessages(), true));
assertEquals("Roastbeef", output.get("dish"));

具体示例参见 TestRuleExprParser

使用RuleManager嵌入调用的时候可以传入复杂的输入对象,而作为RuleService调用的时候输入变量应该是JSON数据。

1.2 导入模型

在【规则模型】的管理页面上,新增以及修改的时候都可以通过上传Excel模型文件来导入模型定义。

1.3 测试规则

导入规则模型之后,点击行数据上的【测试规则】按钮,可以弹出测试页面。

点击提交按钮之后,会弹出结果显示页,其中包含了返回的输出变量集合,以及规则执行过程中产生的详细日志信息,从中可以看出具体规则节点的匹配顺序和匹配结果

二. 配置

2.1 Excel模型配置

Excel规则模型必须包含两个Sheet,其中Rule表单配置决策规则,而Config表单配置输入输出变量等描述信息。

输入变量是规则模型中用于判断的那些变量,而输出变量是满足匹配条件的那些规则节点所产生的输出。为了支持在线可视化设计,我们需要为输入输出变量指定显示名和数据类型。

输入变量支持复杂对象结构

  1. 在变量名前增加*号可以表示嵌套对象结构,增加几个*号表示对应第几个层级
  2. 通过设置【计算】列为Y,则表示这个属性不是由外部调用者传入的,而是根据输出数据和上下文环境变量动态计算得到的值,计算使用的表达式由【缺省表达式】列指定
  3. 业务规则匹配时有可能会匹配到多个执行分支,每个分支都可能会产生输出变量,通过指定【汇总】列,我们可以指定如何根据综合多个输出结果产生最终返回的output值。

2.2 Rule表达式

在输入列的单元格中配置规则判断表达式RuleExpr,它的语法有些类似Friendly Enough Expression Language (FEEL),是XLang Expression的一个更容易阅读的版本,使用RulExprParser来解析。

  1. true和false可以直接指定是否匹配

  2. 减号-表示true,直接匹配

  3. 数值型表示严格匹配

  4. 引号包裹的字符串表示严格匹配

  5. 如果是单个变量名则不把它作为变量来解释,而是看作是字符串值。如果要表示等于变量,则应该使用 == myVar这种形式

  6. 支持比较操作符和and/or/not,并且支持括号。所有支持比较操作符在FilterOp类中定义

  7. 支持所有XScript中注册的全局函数

2.3 决策表配置

决策表的配置示例可以参见 decision-tree.rule.xlsx

决策表的左上角的内容必须是字母T,表示Table。然后是输入列和输出列。输入列和输出列的每一列都是对应的输入输出变量名。

2.4 决策矩阵配置

决策矩阵的配置示例可以参见 decision-matrix.rule.xlsx

决策表的左上交的内容必须是字母M,表示Matrix。

  1. 在左侧的每一列以及头部的每一行的第一个单元格中可以配置输入变量名。
  2. 单元格中可以通过批注valueExpr来指定表达式,此时单元格文本仅作为显示用的label。如果不配置,则以单元格的文本为表达式。
  3. 可以配置输出多个结果值

2.5 在线修改

对于决策树模型可以通过在线页面进行修改,规则匹配条件的配置使用AMIS的ConditionBuilder控件

三. 设计原理

在Nop平台的整体设计中,NopRule负责的是对复杂判断逻辑的抽象,这其中最核心的部分是Filter模型

3.1 Filter模型

filter模型由filter.xdef元模型来定义,它可以用于描述复杂的and/or条件

<and>
    <or>
        <eq name="status" value="1" />
        <eq name="status" value="2" />
    </or>
    <gt name="amount" value="3" />
</and>
  1. Nop平台在所有需要表达判断条件的地方都统一使用Filter模型,在Java程序中对应ITreeBean类型
  2. 利用XML和JSON的双向转换,Filter模型可以保存为XML格式或者JSON格式
  3. Nop平台中高级查询使用的就是Filter模型,后台通过FilterBeanToSQLTransformer类将它转换为SQL语句
  4. 前端AMIS的ConditionBuilder控件可以将复杂判断条件保存为Condition对象。ConditionExprHelper负责实现Condition和Filter模型之间的双向转换。
  5. Filter模型可以通过FilterBeanToPredicateTransformer编译得到IEvalPredicate接口,直接在内存中执行过滤逻辑,
  6. Filter模型也可以通过FilterBeanEvaluator在内存中执行
  7. Filter模型与表达式语言Expression之间可以利用FilterBeanExpressionCompiler和ExpressionToFilterBeanTransformer进行可逆转换,

3.2 Schema模型

Nop平台中所有需要定义对象类型的地方都统一使用schema模型,它由元模型schema.xdef来定义。

  1. XDef元模型和Schema模型之间可以相互转换。XDef用于定义XML结构,而Schema用于定义对象以及JSON结构。
  2. 通过SimpleSchemaValidator可以检查value是否满足schema规范要求
  3. 通过XSchemaToJsonSchema可以将schema对象转换为JSON Schema定义
  4. ConditionSchemaHelper负责将规则模型中的输入变量定义转换为前端ConditionBuilder控件所支持的schema定义。

3.3 Excel数据模型

Nop平台提供了Excel数据模型和Java领域模型对象之间的双向转换,因此无需编程,就可以实现Excel解析以及将对象导出为Excel文件的功能。具体介绍参见excel-import.md

  • NopRule在解析Excel格式的规则模式时,对于Config表单页的解析就是使用的标准Excel转换技术。
 RuleModel rule = ImportModelHelper.parseSheet(sheetModel, configSheet, compileTool, scope, RuleModel.class);
  • NopRule使用Excel格式的API模型来定义对外服务接口,自动生成对应的接口定义和服务框架类,参见nop-rule.api.xlsx

总结

NopRule的实现采用了Nop平台的基本技术战略:

  1. 通过元模型来定义领域模型
  2. 尽量通过自动推导实现模型之间的双向转换,减少硬编码
  3. 通过复用底层的通用模型,如Filter、Expression等,我们可以快速组装出更复杂的领域模型,如规则模型

基于可逆计算理论设计的低代码平台NopPlatform已开源:

  • gitee: canonical-entropy/nop-entropy
  • github: entropy-cloud/nop-entropy
  • 开发示例:docs/tutorial/tutorial.md
  • 可逆计算原理和Nop平台介绍及答疑_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/901705.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

xxl-job java.sql.SQLException: interrupt问题排查

近期生产环境固定凌晨报错&#xff0c;提示 ConnectionManager [Thread-23069] getWriteConnection db:***,pattern: error, jdbcUrl: jdbc:mysql://***:3306/***?connectTimeout3000&socketTimeout180000&autoReconnecttrue&zeroDateTimeBehaviorCONVERT_TO_NUL…

Windows自带录屏好用吗?四大录屏工具轻松实现高效录屏!

Windows系统自带的录屏工具其实就是Xbox Game Bar。今天&#xff0c;除了这个工具&#xff0c;我还会为大家推荐几款实用录屏工具&#xff0c;让大家轻松实现高效录屏&#xff01; 福昕录屏软件 直达链接&#xff1a;www.foxitsoftware.cn/REC/ 操作教程&#xff1a;立即获取…

本地缓存库分析(一):golang-lru

文章目录 本地缓存概览golang-lru标准lrulru的操作PutGet 2q&#xff1a;冷热分离lruPutGet expirable_lru&#xff1a;支持过期时间的lruPutGet过期 总结 本地缓存概览 在业务中&#xff0c;一般会将极高频访问的数据缓存到本地。以减少网络IO的开销&#xff0c;下游服务的压…

css 切角实现(全)

效果 样式代码 <template><div class"container"><div class"clip-all-angle"> 4个角全部剪切 </div><div class"clip-two-angle"> 切底部两个角 </div><div class"clip-two-top-angle"> …

1.2.2 算法的时间复杂度

那么我们如何评估算法的时间开销&#xff1f; 存在什么问题? 和机器性能有关&#xff0c;如:超级计算机 v.s. 单片机 和编程语言有关&#xff0c;越高级的语言执行效率越低 和编译程序产生的机器指令质量有关 有些算法是不能事后再统计的&#xff0c;如:导弹控制算法 能否事…

Spring Boot框架下的酒店住宿登记系统

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

PIL处理器在环测试

目录 PIL处理器在环测试介绍 PIL测试过程 编译模块 测试结果 PIL处理器在环测试介绍 SIL测试是验证代码和模型的一致性&#xff0c;代码运行在Windows平台上&#xff0c;某种程度上说&#xff0c;这并不能保证代码到目标处理器上的运行结果也能够和模型保持一致。所以&…

ctfshow的sql注入解题思路171-211

ctfshow-SQL注入 web171&#xff1a;爆库名->爆表名->爆字段名->爆字段值 -1 union select 1,database() ,3 -- //返回数据库名 -1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema库名 -- //获取数据库里的表名 -…

【华为\荣耀、中兴、华三路由器IPV6设置】

华为\荣耀、中兴、华三路由器ipv6设置 华为\荣耀设置-路由器拨号情况下中兴设置-路由器拨号情况下华三设置-光猫拨号情况下&#xff08;待续&#xff09; 华为\荣耀设置-路由器拨号情况下 如图设置就行 中兴设置-路由器拨号情况下 中兴路由器有两个设置地方也是如图设置 …

一站式AI自动化剪辑 内置多种功能 永久免费

AI影视解说自动化剪辑工具&#xff0c;功能非常强大&#xff0c;吊打所有视频解说&#xff0c;解放双手&#xff0c;从我开始 【资源名称】&#xff1a;纳拉托艾 【资源大小】&#xff1a;1.27 【资源版本】&#xff1a;0.1 【测试机型】&#xff1a;Win11. 【资源介绍】&a…

基于SSM+小程序的智慧旅游平台登录管理系统(旅游2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 旅游平台开发微信小程序功能有管理员和用户。 1、管理员功能有个人中心&#xff0c;用户管理&#xff0c;景点分类管理&#xff0c;旅游景点管理&#xff0c;景点购票管理&#xff0c;景…

Leetcode刷题笔记13

DP35 【模板】二维前缀和 【模板】二维前缀和_牛客题霸_牛客网 解法一&#xff1a;暴力解法 -> 模拟 直接算区间里面的和 每次询问都要遍历数组一遍 时间复杂度&#xff1a;O(n*m*q) 解法二&#xff1a;前缀和 1. 预处理出来一个前缀和矩阵 dp[i][j]表示&#xff1a;从[…

VisionPro Basic - 01- 有关应用和作业

前言&#xff1a; VP&#xff08;VisionPro&#xff09;的保存文件都是.vpp&#xff0c;所以&#xff0c;你在保存的时候&#xff0c;一定要注意区别。否则&#xff0c;过了几天&#xff0c;你都搞不清楚自己当年哪个的应用&#xff0c;哪个是作业... 环境&#xff1a; 例子1&…

高级网络互联技术:AS3001与AS3000的路由交换方案

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

数字化转型项目实施方案建议书|168页PPT

文 档是一份关于数字化转型项目的实施方案建议书&#xff0c;由某咨询公司为***集团制定。文档详细介绍了项目的实施范围、信息系统现状、建设目标、高阶方案建议以及项目组织和计划。 以下是对文档内容的解读&#xff1a; 项目实施范围&#xff1a;涵盖了数字化转型路线图中…

CSP-J2024 全网首发

T1:扑克牌 题目描述 Description 小 P 从同学小 Q 那儿借来一副 n 张牌的扑克牌。 本题中我们不考虑大小王&#xff0c;此时每张牌具有两个属性:花色和点数。花色共有 4种: 方片、草花、红桃和黑桃。点数共有 13 种&#xff0c;从小到大分别为A 2 3 4 5 6 7 8 9 T J Q K。注意…

【3DMAX科研绘图】3DMAX饼状图生成插件PieChart使用方法详解

3DMAX饼状图生成插件PieChart&#xff0c;一款用于制作3D饼状图的工具。可以设置任意数量的切片&#xff0c;以及随机或指定切片颜色。 饼状图&#xff08;Pie Chart&#xff09;是一种常用的数据可视化工具&#xff0c;它主要用于展示不同类别数据的比例关系。在饼状图中&…

ERPS环网配置

ERPS&#xff08;Ethernet Ring Protection Switching&#xff09;&#xff1a;以太网多环保护技术 ERPS节点信息 1、RPL owner 节点&#xff08;主节点&#xff09; 一个 ERPS 环只有一个 RPL owner 节点&#xff0c;由用户配置决定&#xff0c;通过阻塞 RPL 端口来防止 ERP…

.NET 一款内网渗透中替代PowerShell的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

笔记整理—linux驱动开发部分(1)驱动梗概

驱动可以分为广义上的和狭义上的驱动。广义上的驱动是用于操作硬件的代码&#xff0c;而狭义上的驱动为基于内核系统之上让硬件去被操作的逻辑方法。 linux体系架构&#xff1a; 1.分层思想 &#xff1a;在OS中间还会有许多层。 : 2.驱动的上面是系统调用&#xff08;API&…