一、背景介绍
在实际业务中,售前根据客户需求选择相应的产品和对应的物料来生成报价单。然而,在填写报价单的过程中,可能会出现物料漏选或数量不准确的情况,这会对后续备货和生产效率造成重大影响。此外,由于产品和物料种类繁多,数量众多,以及物料之间的关联规则复杂,传统的业务代码实现逻辑规则已经不再适用。
为了解决这一问题,我们采用了开源的Drools规则引擎结合低代码平台Odoo进行审单系统的开发。通过这种方式,成功实现了规则与程序的解耦,使业务人员能够自行配置所需的规则,从而实现真正的规则审核自动化。
这样一来,我们能够提高效率,减少人为错误,并确保整个流程的顺利进行。
二、引擎介绍
(一)规则引擎介绍
规则引擎,全称为业务规则管理系统,英文名为BRMS(即Business Rule Management System)。规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。
需要注意的是规则引擎并不是一个具体的技术框架,而是指的一类系统,即业务规则管理系统。目前市面上具体的规则引擎产品有:drools、VisualRules、iLog等。规则引擎实现了将业务决策从应用程序代码中分离出来,接收数据输入,解释业务规则,并根据业务规则做出业务决策。
规则引擎其实就是一个输入输出平台。
系统中引入规则引擎后,业务规则不再以程序代码的形式驻留在系统中,取而代之的是处理规则的规则引擎,业务规则存储在规则库中,完全独立于程序。业务人员可以像管理数据一样对业务规则进行管理,比如查询、添加、更新、统计、提交业务规则等。
业务规则被加载到规则引擎中供应用系统调用。
●使用规则引擎的优势如下
- 业务规则与系统代码分离,实现业务规则的集中管理
- 在不重启服务的情况下可随时对业务规则进行扩展和维护
- 可以动态修改业务规则,从而快速响应需求变更
- 规则引擎是相对独立的,只关心业务规则,使得业务分析人员也可以参与编辑、维护系统的业务规则
- 减少了硬编码业务规则的成本和风险
- 使用规则引擎提供的规则编辑工具,使复杂的业务规则实现变得的简单
●规则引擎常用应用场景
对于一些存在比较复杂的业务规则并且业务规则会频繁变动的系统比较适合使用规则引擎,如下:
- 风险控制系统----风险贷款、风险评估
- 反欺诈项目----银行贷款、征信验证
- 决策平台系统----财务计算
- 促销平台系统----满减、打折、加价购
(二)drools规则引擎
drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(例如存放在数据库中),使得业务规则的变更不需要修改项目代码、重启服务器就可以在线上环境立即生效。
- drools官网地址:https://drools.org/
- drools源码下载地址:https://github.com/kiegroup/drools
Drools基本构成,主要由以下三部分组成:
- Working Memory(工作内存)
- Rule Base(规则库)
- Inference Engine(推理引擎)
其中Inference Engine(推理引擎)又包括:Pattern Matcher(匹配器) 具体匹配哪一个规则,由这个完成,Agenda(议程),Execution Engine(执行引擎)
- Working Memory:工作内存,drools规则引擎会从Working Memory中获取数据并和规则文件中定义的规则进行模式匹配,所以我们开发的应用程序只需要将我们的数据插入到Working Memory中即可
- Fact:事实,是指在drools 规则应用当中,将一个普通的JavaBean插入到Working Memory后的对象就是Fact对象,例如本案例中的Order对象就属于Fact对象。Fact对象是我们的应用和规则引擎进行数据交互的桥梁或通道。
- Rule Base:规则库,我们在规则文件中定义的规则都会被加载到规则库中。
- Pattern Matcher:匹配器,将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,匹配成功的规则将被激活并放入Agenda中。
- Agenda:议程,用于存放通过匹配器进行模式匹配后被激活的规则。
- Execution Engine:执行引擎,执行Agenda中被激活的规则。
● Drools基础语法:
规则文件的构成:
在使用Drools时最重要的工作就是编写规则文件,规则文件的后缀为.drl。drl是Drools Rule Language的缩写。在规则文件中编写具体的规则内容。
Drools语法结构:由规则名称(唯一),规则对象属性,条件语句与执行语句结合成为一个完整的规则:
- rule:关键字,表示规则开始,参数为规则的唯一名称。
- attributes:规则属性,是rule与when之间的参数,为可选项。
- when:关键字,后面跟规则的条件部分。
- LHS(Left Hand Side):是规则的条件部分的通用名称。它由零个或多个条件元素组成。如果LHS为空,则它将被视为始终为true的条件元素。(左手边)
- then:关键字,后面跟规则的结果部分。
- RHS(Right Hand Side):是规则的后果或行动部分的通用名称。(右手边)
- end:关键字,表示一个规则结束。
● Pattern模式匹配:
Drools中的匹配器可以将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,我们需要在规则体的LHS部分定义规则并进行模式匹配。LHS部分由一个或者多个条件组成,条件又称为pattern。
pattern的语法结构为:绑定变量名:Object(Field约束),绑定变量既可以用在对象上,也可以用在对象的属性上,其中绑定变量名可以省略,通常绑定变量名的命名一般建议以$开始。如果定义了绑定变量名,就可以在规则体的RHS部分使用此绑定变量名来操作相应的Fact对象。Field约束部分是需要返回true或者false的0个或多个表达式。
LHS部分可以定义多个pattern,多个pattern之间可以使用and或者or进行连接,也可以不写,默认连接为and。
Drools语法的比较操作符:
三、审单系统结合drools规则引擎
(一)业务流程
(二)为什么选用drools引擎
- drools完全开源免费,并且社区最大,适合采用
- drools规则语法简单,开发人员可快速上手
- 由于sdk代码在本地可调试,可实现不同的自定义规则解析
- 运行效率快,一条规则只需要0.005毫秒级左右
- 对比其余的规则引擎,无法达到既高效又解耦的效果,与审单系统业务场景相悖
(三)审单系统结合drools引擎实现自定义规则模式
审单系统首页展示:包括多型号规则匹配,规则运行数量与拦截数量。
1、业务部门导入规则(excel,xml)
由于drools没有excel导入规则的做法,也没有把业务部门规则语言转为drl的做法,所以这里自己实现文件解析,拼接规则成drl正确语法等:
用户导入规则时需要按照特定的模板来编写规则,excel中一共有7列数据,第一列为机器型号,第二列为规则名称(唯一),第三列为if条件,对应drools中的when关键字,第四列为then,对应drools中的then关键字,第五列为action,表示带出规则时,需要报价系统带出的物料和数量,第六列为msg,是规则不通过时的提示信息,第七列为规则状态,可选生效或者不生效:
excel编写示例规则:
2、规则加载到drools
规则在导入时会存入到数据库中,加载到drools引擎之前,需要将这样写的规则替换成drl语法的规则,可以看到经过处理之后的文档会变成很多drl文件,其中做到了自动转换为drl语法:
drl文件内容示例如下,已经将一行excel数据自动转换为drools引擎熟悉的语句:
3、报价单提交时执行批量规则
报价单在提交时会将配置传给drools,drools根据加载的规则执行每一条规则。每一条规则每一个配置都会执行,并且是毫秒级别,这就是drools的高效性。
4、返回规则执行结果(通过、未通过)
drools可以将未通过的规则,以及为什么不通过规则的物料返回,同时也会让通过的规则返回:
四、总结
本文章讲述了基于odoo平台开发的审单系统的业务以及drools规则引擎的结合,但是还有许多需要完善的地方,比如现在生成的drl文件是很多的,一条数据对应一个drl文件,后来考虑是否10条数据对应一个drl文件。
作者:李建伟| 后端开发工程师