规则引擎教程--交叉决策表

合集下载

.NETRulesEngine(规则引擎)的使用详解

.NETRulesEngine(规则引擎)的使用详解

.NETRulesEngine(规则引擎)的使⽤详解⽬录RulesEngine 概述如何使⽤表达树内使⽤扩展⽅法多对象组合条件如何实现的?成功失败事件总结⼀次偶然的机会,让我拿出RulesEngine去完成⼀个业务,对于业务来说主要是完成⼀个可伸缩性(不确定的类型,以及不确定的条件,条件的变动可能是持续增加修改的)的业务判断。

⽐如说完成⼀个成就系统,管理员可创建,对于成就来说有⼀次性解锁、⽇常、周常式,还有随时重置,每次达成都触发的,⾯对着成就任务的增加,那对于程序员来说,如果每次都去增加修改这些成就任务简直是太头疼了。

好了,对此⼤家应该有⼀个简单的了解了,那跟着笔者往下⾛,我们看看如何在.NET中使⽤⾮常少的代码去完成⼀个简单的动态逻辑处理。

RulesEngine 概述RulesEngine是Microsoft推出的⼀个规则引擎项⽬,⽤于系统中抽象出的业务逻辑/规则/策略。

在我们开发的过程中,避免不了的是跟这种反反复复的业务逻辑进⾏处理,⽽对于这种动态的规则来说的话,它是⽐较优雅的⼀种⽅式,使⽤我们减少了对我们代码或者说项⽬的修改。

如何使⽤⽬前我们可以通过nuget的形式进⾏引⼊该库,如下所⽰:dotnet add package RulesEngine对于规则的配置来说,⼤家可以直接通过类型化参数,笔者主要是为了⼤家可以清晰的明⽩,所以⽤JSON化配置来做演⽰。

//反序列化Json格式规则字符串var workflowRules = JsonConvert.DeserializeObject<List<WorkflowRules>>(rulesStr);var rulesEngine = new RulesEngine.RulesEngine(workflowRules.ToArray());//定义规则var rulesStr = @"[{""WorkflowName"": ""UserInputWorkflow"",""Rules"": [{""RuleName"": ""CheckAge"",""ErrorMessage"": ""年龄必须⼤于18岁."",""ErrorType"": ""Error"",""RuleExpressionType"": ""LambdaExpression"",""Expression"": ""Age > 18""},{""RuleName"": ""CheckIDNoIsEmpty"",""ErrorMessage"": ""⾝份证号不可以为空."",""ErrorType"": ""Error"",""RuleExpressionType"": ""LambdaExpression"",""Expression"": ""IdNo != null""}]}] ";如上所⽰我们定义了规则信息,对于该信息,对于规则信息笔者默认存储的还是JSON数据,当然⼤家可以进⾏存储如下内容,将如下数据结构拆分存储到数据库中。

drools Decision Table(决策表)

drools Decision Table(决策表)

Drools决策表的使用1简单了解这几天在研究drools,drools到底是怎么与决策表交互的呢,报这个疑问开始了寻找之路。

●何时使用决策表——如果规则能够被表达为模板+数据的格式,那你应该考虑使用决策表。

决策表中的每一行就是对应模板的一行数据,将产生一个规则。

●运行决策表——Drools引擎所部署的系统中执行决策表。

首先,决策表转换成的Drools规则语言(DRL),然后执行规则引擎需求。

这意味着它是可能的业务规则的变更,无需停止和启动,或重新部署任何软件。

2创建java类●公共java类:Caluculation.java●执行java类及规则文件(drl文件):CalculationDrl.java和calculation.drl●执行java类及决策表(xml文件):CalculationXls.java和calculation.xls(运行决策表方法一)●执行java类及决策表(xml文件)生成规则,将得到的规则放入规则文件中(drl文件中):GenerationRules.java、calculation.xls、calculations.drl、CalculationDrlXls (运行决策表方法二)2.1.1Caluculation.javapackage com.flagleader.bean;public class Calculation {private double wage;//当月工资private double actualwage;//当月税后工资private double wagemore;//全月应纳税所得额private double cess;//税率private double preminus;//速算扣除数private double wageminus;//当月工资扣减数/*** 当月工资* @return*/public double getWage() {return wage;}public void setWage(double wage) {this.wage = wage;}/*** 当月税后工资* @return*/public double getActualwage() {return actualwage;}public void setActualwage(double actualwage) { this.actualwage = actualwage;}/*** 全月应纳税所得额* @return*/public double getWagemore() {return wagemore;}public void setWagemore(double wagemore) { this.wagemore = wagemore;}/*** 税率* @return*/public double getCess() {return cess;}public void setCess(double cess) {this.cess = cess;}/*** 速算扣除数* @return*/public double getPreminus() {return preminus;}public void setPreminus(double preminus) {this.preminus = preminus;}/*** 当月工资扣减数* @return*/public double getWageminus() {return wageminus;}public void setWageminus(double wageminus) {this.wageminus = wageminus;}public Calculation() {}public Calculation(double wage) {super();this.wage = wage;}public Calculation(double wage,double wagemore) {super();this.wage = wage;this.wagemore=wagemore;}@Overridepublic String toString() {return"当月工资="+wage+"\n当月税后工资="+actualwage+"\n全月应纳税所得额="+wagemore+"\n税率="+cess+"\n速算扣除数="+preminus+"\n当月工资扣减数="+wageminus;}}2.1.2calculation.drlpackage com.flagleader.beanglobal Calculation cal;no-loop truerule"全月应纳税额"salience 3when$cal : Calculation(wage>0)then#System.out.println("-----全月应纳税额------");c al.setWagemore(cal.getWage()-3500);update(cal);endrule"设置税率"salience 2whene val(true)then#System.out.println("-----设置税率------");i f ( cal.getWagemore()<=1500 ) {cal.setCess(0.03);cal.setPreminus(0);}else if ( cal.getWagemore()>1500 && cal.getWagemore()<=4500 ) {cal.setCess(0.1);cal.setPreminus(105);}else if (cal.getWagemore()>4500 && cal.getWagemore()<=9000 ) { cal.setCess(0.2);cal.setPreminus(555);}else if(cal.getWagemore()>9000 && cal.getWagemore()<=35000 ) { cal.setCess(0.25);cal.setPreminus(1005);}else if(cal.getWagemore()>35000 && cal.getWagemore()<=55000) { cal.setCess(0.3);cal.setPreminus(2755);}else if ( ( cal.getWagemore()>55000 &&cal.getWagemore()<=80000 ) ) {cal.setCess(0.35);cal.setPreminus(5505);}else if ( cal.getWagemore()>80000 ) {cal.setCess(0.45);cal.setPreminus(13505);}insert(cal);endrule"税后工资"salience 1whene val(true)then#System.out.println("-----税后工资------");cal.setWageminus(cal.getWagemore()*cal.getCess()-cal.getPreminus( ));c al.setActualwage(cal.getWage()-cal.getWageminus());insert(cal);end2.1.3CalculationDrl.javapackage com.flagleader.bean;import org.apache.log4j.Logger;import org.drools.KnowledgeBase;import org.drools.builder.KnowledgeBuilder;import org.drools.builder.KnowledgeBuilderFactory;import org.drools.builder.ResourceType;import org.drools.io.ResourceFactory;import org.drools.runtime.StatefulKnowledgeSession;@SuppressWarnings("restriction")public class CalculationDrl {static Logger logger = Logger.getLogger(CalculationDrl.class);public static void main(String[] args) {("开始");KnowledgeBuilderkBuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();//规则生成器:将编写好的规则进行编译kBuilder.add(ResourceFactory.newClassPathResource("calculation.dr l", CalculationDrl.class), ResourceType.DRL);//添加规则到规则生成其中进行编译KnowledgeBase kBase=kBuilder.newKnowledgeBase();//收集应用当中的知识定义知识库对象kBase.addKnowledgePackages(kBuilder.getKnowledgePackages());//添加规则包StatefulKnowledgeSessionsession=kBase.newStatefulKnowledgeSession();//与规则的交互通道Calculation cal=new Calculation(10000);//输入当月工资session.setGlobal("cal", cal);session.insert(cal);//将对象添加到交互通道中session.fireAllRules();//执行规则session.dispose();//释放资源System.out.println(cal.toString());("结束");}}2.1.4calculation.xls2.1.5CalculationXls.javapackage com.flagleader.bean;import org.apache.log4j.Logger;import org.drools.KnowledgeBase;import org.drools.builder.DecisionTableConfiguration; import org.drools.builder.DecisionTableInputType;import org.drools.builder.KnowledgeBuilder;import org.drools.builder.KnowledgeBuilderFactory;import org.drools.builder.ResourceType;import org.drools.io.ResourceFactory;import org.drools.runtime.StatefulKnowledgeSession;@SuppressWarnings("restriction")public class CalculationXls {static Logger logger = Logger.getLogger(CalculationDrl.class);public static void main(String[] args) {("开始");DecisionTableConfigurationdtc=KnowledgeBuilderFactory.newDecisionTableConfiguration();dtc.setInputType(DecisionTableInputType.XLS);KnowledgeBuilderbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();builder.add(ResourceFactory.newClassPathResource("com/flagleader/ bean/calculation.xls",CalculationXls.class),ResourceType.DTABLE,dtc);KnowledgeBase base=builder.newKnowledgeBase();base.addKnowledgePackages(base.getKnowledgePackages());StatefulKnowledgeSessionsession=base.newStatefulKnowledgeSession();Calculation cal=new Calculation(10000,6500.0);session.insert(cal);session.fireAllRules();session.dispose();//释放资源("结束");}}2.1.6GenerationRules.javapackage com.flagleader.bean;import java.io.*;import org.drools.decisiontable.InputType;import org.drools.decisiontable.SpreadsheetCompiler;import org.junit.Test;public class GenerationRules {@Testpublic void compile() throws FileNotFoundException {File file = new File("E:\\qzxx_workspace\\calculation\\src\\main\\java\\com\\flagleade r\\bean\\calculation.xls");InputStream is = new FileInputStream(file);SpreadsheetCompiler converter = new SpreadsheetCompiler();String drl = pile(is, InputType.XLS);System.out.println("\n\n" + drl);}2.1.7calculations.drlpackage com.flagleader.bean//generated from Decision Tableimport com.flagleader.bean.Calculation;import ng.Object;function double getCes(double cess){//System.out.println("cess="+cess);return cess;}function double getPre(double preminus){//System.out.println("preminus="+preminus);return preminus;}global Calculation cal;rule"全月应纳税额"no-loop truesalience 65526when$cal : Calculation(wage>0)thenSystem.out.println("-----全月应纳税额------");c al.setWagemore(cal.getWage()-3500);update(cal);end// rule values at D11, header at D6rule"test_11"salience 65525whenCalculation(wagemore>0,wagemore<=1500) thencal.setCess(getCes(0.03));c al.setPreminus(getPre(0.00));insert(cal);end// rule values at D12, header at D6rule"test_12"salience 65524whenCalculation(wagemore>1500,wagemore<=4500) thencal.setCess(getCes(0.1));c al.setPreminus(getPre(105.00));i nsert(cal);end// rule values at D13, header at D6rule"test_13"salience 65523whenCalculation(wagemore>4500,wagemore<=9000) thencal.setCess(getCes(0.2));c al.setPreminus(getPre(555.00));i nsert(cal);end// rule values at D14, header at D6rule"test_14"salience 65522whenCalculation(wagemore>9000,wagemore<=35000) thencal.setCess(getCes(0.25));c al.setPreminus(getPre(1005.00));i nsert(cal);end// rule values at D15, header at D6rule"test_15"salience 65521whenCalculation(wagemore>35000,wagemore<=55000) thencal.setCess(getCes(0.3));c al.setPreminus(getPre(2755.00));i nsert(cal);end// rule values at D16, header at D6rule"test_16"salience 65520whenCalculation(wagemore>55000,wagemore<=80000)thencal.setCess(getCes(0.35));c al.setPreminus(getPre(5505.00));i nsert(cal);end// rule values at D17, header at D6rule"test_17"salience 65519whenCalculation(wagemore>80000,wagemore<=100000)thencal.setCess(getCes(0.45));c al.setPreminus(getPre(13505.00));i nsert(cal);endrule"税后工资"salience 65518whene val(true)thenS ystem.out.println("-----税后工资------"+cal.getCess());cal.setWageminus(cal.getWagemore()*cal.getCess()-cal.getPreminus( ));c al.setActualwage(cal.getWage()-cal.getWageminus());insert(cal);end2.1.8CalculationDrlXls.javapackage com.flagleader.bean;import org.apache.log4j.Logger;import org.drools.KnowledgeBase;import org.drools.builder.KnowledgeBuilder;import org.drools.builder.KnowledgeBuilderFactory;import org.drools.builder.ResourceType;import org.drools.io.ResourceFactory;import org.drools.runtime.StatefulKnowledgeSession;@SuppressWarnings("restriction")public class CalculationDrlXls {static Logger logger = Logger.getLogger(CalculationDrlXls.class);public static void main(String[] args) {("开始");KnowledgeBuilderkBuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();//规则生成器:将编写好的规则进行编译kBuilder.add(ResourceFactory.newClassPathResource("calculations.d rl", CalculationDrlXls.class), ResourceType.DRL);//添加规则到规则生成其中进行编译KnowledgeBase kBase=kBuilder.newKnowledgeBase();//收集应用当中的知识定义知识库对象kBase.addKnowledgePackages(kBuilder.getKnowledgePackages());//添加规则包StatefulKnowledgeSessionsession=kBase.newStatefulKnowledgeSession();//与规则的交互通道Calculation cal=new Calculation(10000);//输入当月工资session.setGlobal("cal", cal);session.insert(cal);//将对象添加到交互通道中session.fireAllRules();//执行规则session.dispose();//释放资源System.out.println(cal.toString());("结束");}}3决策表资料决策表\Drools的- 决策表.htm原网址:/Decision+Tables决策表\Drools的- 决策表中的业务规则解释.htm原网址:/Business+rules+in+decision+tables+explained。

【原创】Drools规则引擎初窥---drl和决策表实现[实例]

【原创】Drools规则引擎初窥---drl和决策表实现[实例]

【原创】Drools规则引擎初窥---drl和决策表实现[实例]因项⽬需要,看了下drools规则引擎。

写了⼀个⽐较简单的drools的drl规则和决策表实现的例⼦。

规则说明: ⽹络商城要举办活动(奖励额外积分), 订单原价⾦额在 100以下, 不加分 100-500 加100分 500-1000 加500分 1000 以上加1000分1.建⽴最基本的Drools项⽬结构并引⼊必须的类库。

(这⾥采⽤junit来执⾏单元测试)。

创建⼀个Java Project,建⽴maven形式的源码包。

2.定义实体类Order.java1import java.util.Date;23public class Order {4private Date bookingDate;// 下单⽇期56private int amout;// 订单原价⾦额78private User user;// 下单⼈910private int score;//积分1112public Order(Date bookingDate,int amout, User user, int score){13this.bookingDate = bookingDate;14this.amout = amout;er = user;16this.score = score;17 }1819public Order(){20 }2122 //省略get、set⽅法5354 }3.定义实体User.javapublic class User {private String name;// 姓名private int level;// ⽤户级别public User(){}public User(String name, int level){ = name;this.level = level;}//省略get、set⽅法4.编写规则⽂件point-rules.drlpackage droolsimport com.wang.drools.point.Orderimport errule "zero"no-loop true//只检查⼀次lock-on-active truesalience 9 //值越⼤,优先级越⾼when//购物⾦额100以下不加分$s : Order(amout <= 100);then$s.setScore(0);update($s);endrule "add100"no-loop true//只检查⼀次lock-on-active truesalience 8 //值越⼤,优先级越⾼when//购物⾦额100以上500以下加100积分$s : Order(amout > 100 && amout <= 500);then$s.setScore(100);update($s);endrule "add500"no-loop true//只检查⼀次lock-on-active truesalience 6 //值越⼤,优先级越⾼when//购物⾦额500以上1000以下加500积分$s : Order(amout > 500 && amout <= 1000);then$s.setScore(500);update($s);endrule "add1000"no-loop true//只检查⼀次lock-on-active truesalience 5 //值越⼤,优先级越⾼when//购物⾦额1000以上加1000积分$s : Order(amout > 1000);then$s.setScore(1000);update($s);end说明:rule表⽰规则的开始,salience表⽰规则的优先级,当有多条规则同时存在是,优先级越⾼的越先被匹配执⾏。

Drools规则引擎入门指南(一)

Drools规则引擎入门指南(一)

Drools规则引擎⼊门指南(⼀)最近项⽬需要增加风控系统,在经过⼀番调研以后决定使⽤Drools规则引擎。

因为项⽬是基于SpringCloud的架构,所以此次学习使⽤了SpringBoot2.0版本结合Drools7.14.0.Final版本。

引⼊依赖1 2 3 4 5 6 7 8 9 10<dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId> <version>7.14.0.Final</version> </dependency><dependency><groupId>org.kie</groupId><artifactId>kie-spring</artifactId> <version>7.14.0.Final</version> </dependency>创建配置类1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57@Configurationpublic class DroolsAutoConfiguration {private static final String RULES_PATH = "rules/";@Bean@ConditionalOnMissingBean(KieFileSystem.class)public KieFileSystem kieFileSystem() throws IOException {KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();for (Resource file : getRuleFiles()) {kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8")); }return kieFileSystem;}private Resource[] getRuleFiles() throws IOException {ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();return resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");}@Bean@ConditionalOnMissingBean(KieContainer.class)public KieContainer kieContainer() throws IOException {final KieRepository kieRepository = getKieServices().getRepository();kieRepository.addKieModule(new KieModule() {public ReleaseId getReleaseId() {return kieRepository.getDefaultReleaseId();}});KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem());kieBuilder.buildAll();return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());}@Bean@ConditionalOnMissingBean(KieBase.class)public KieBase kieBase() throws IOException {return kieContainer().getKieBase();}@Bean@ConditionalOnMissingBean(KieSession.class)public KieSession kieSession() throws IOException {KieSession kieSession = kieContainer().newKieSession();return kieSession;}@Bean@ConditionalOnMissingBean(KModuleBeanFactoryPostProcessor.class)public KModuleBeanFactoryPostProcessor kiePostProcessor() {return new KModuleBeanFactoryPostProcessor();}public KieServices getKieServices() {System.setProperty("drools.dateformat","yyyy-MM-dd");return KieServices.Factory.get();}}在这个时候我们的基本环境已经搭建好了,接下来我们⼀起来学习Drools吧HelloWord程序员的世界⾥,我们学习任何⼀门语⾔都是以HelloWord开启的,本次学习也不例外。

Activiti6系列(1)-核心数据库表及字段注释说明

Activiti6系列(1)-核心数据库表及字段注释说明

Activiti6系列(1)-核⼼数据库表及字段注释说明前⾔本⽂是根据《疯狂⼯作流讲义-Activiti6.0》⼀书中提取过来的,有兴趣的可以去当当⽹买这本书,讲的很不错,最后还有实战案例。

虽然是提取过来的,但完全靠⼿打梳理,觉得有⽤的⼩伙伴可以给予⼀定⽀持,谢谢。

共分为六⼤部分1、通⽤数据表2、流程存储数据表3、⾝份数据表4、运⾏时数据表5、历史数据表6、DMN规则引擎数据表⼀、通⽤数据表1、资源表,act_ge_bytearray⽤于保存和流程引擎相关的资源,只要调⽤了Activiti存储服务的API,涉及的资源均会被转换为byte数组保存到这个表中。

⼀般情况下,Activiti使⽤这个表来保存字符串、流程⽂件的内容、流程图⽚内容。

主要包含如下字段:字段注释REV_数据版本,Activiti为⼀些有可能会被频繁修改的数据表,加⼊该字段,⽤来表⽰该数据被操作的次数。

Name_资源名称,类型为varchar,长度为255字节。

DEPLOYMENT_ID_⼀次部署可以添加多个资源,该字段与部署表act_re_deployment的主键相关联。

BYTES_资源内容,数据类型为longblob,最⼤可存4GB数据。

GENERATED_是否由Activiti⾃动产⽣的资源,0表⽰false,1为true。

2、属性表,act_ge_propertyActiviti将全部的属性抽象为key-value对,每个属性都有名称和值,使⽤act_ge_property来保存这些属性,该表有以下三个字段。

字段注释NAME_属性名称,varchar类型。

VALUE_属性值,varchar类型。

REV_数据的版本号。

⼆、流程存储数据表1、部署数据表,act_re_deployment。

部署信息会被保存在部署表中主要包含字段:字段注释NAME_部署的名称,可以调⽤Activiti的流程存储API来设置,类型为varchar,长度为255字节。

EasyRule规则引擎设计及使用说明

EasyRule规则引擎设计及使用说明

规则引擎使用文档2012年10月目录1.设计背景 (3)2.什么是规则引擎 (3)3.体系结构 (3)4.如何调用规则引擎 (5)5.配置使用说明 (6)6.引擎现有的公式、函数 (8)7.扩展规则引擎 (9)7.1.扩展函数 (9)7.2扩展公式 (9)8 结束语 (10)1.设计背景复杂企业级项目的开发以及其中随外部条件不断变化的业务规则(business logic),迫切需要分离商业决策者的商业决策逻辑和应用开发者的技术决策,并把这些商业决策放在中心数据库或其他统一的地方,让它们能在运行时(即商务时间)可以动态地管理和修改从而提供软件系统的柔性和适应性。

规则引擎正是应用于上述动态环境中的一种解决方法。

2.什么是规则引擎为了进一步规范系统数据的有效性、完整性,加强对数据的校验在目前各个系统是必不可少的一部分,规则引擎实现对系统数据的纵向、横向校验以及表与表之间逻辑关系校验,它可以作为一个子模块添加到任意以JAVA为基础的系统当中去,同时制定相关接口规范,开发人员只需按照规范便可以对它进行二次扩展性的开发。

3.体系结构规则引擎由以下六大部分组成:1.函数:负责对数据的格式化处理,比如数据统计。

2.公式:负责对数据的逻辑处理,比如值之间比大小。

3.规则配置文件:配置校验数据的规则。

4.规则模型配置文件:配置校验数据规则的集合。

5.公式、函数配置文件:配置系统所有相关的函数以及公式。

6.引擎主程序:调用规则引擎的入口。

7.数据库配置文件:与数据库相关的配置文件。

以上几大部分均可由开发人员灵活配置以便后续再次扩展,程序类包机构如下如下:规则文件节点属性类系统数据源接口数据计算公式接口数据计算函数接口规则引擎入口主程序工具类数据库操作接口计算公式、函数容器配置文件规则文件数据库配置类图如下:4.如何调用规则引擎将规则引擎作为子模块加入的主业务系统后,主业务系统只需在程序里调用规则引擎的com.git.easyrule.service.RuleService类的runRule()和runModel()方法即可,规则引擎启动之后便根据自身的规则配置项对数据进行校验处理,处理结果将存入规则文件配置的指定表当中。

Visual-Rules规则引擎产品介绍-PPT课件

Visual-Rules规则引擎产品介绍-PPT课件
基本服务
在线服务请求支持
提供7×24小时的在线技术支持服务,包括提供专门的客户热线电话、网站、邮件、msn等在线方式,及专职的客服人员受理客户服务请求(咨询、建议、投诉和故障等); 提供标准的故障分级请求处理流程和规范,并在标准定义的基础上自动上升一个级别;
产品信息通知和预见服务
通过各种在线渠道(电话、电子邮件、网站)提供产品新的动态(新版本计划、新产品发布、重大BUG修正)
规则引擎提供哪些对外接口 规程引擎是否支持流程控制 对于规则的变更历史如何保存、查询、利用 规则引擎版本升级问题是如何解决(例如:费用、升级的方式是否平滑) 规则引擎分布式部署,负载均衡问题 权限控制问题
*
*
规则引擎是否支持规则变更的热部署
自动编译规则包
表格
规则
参数
手工发布规则包
表格
规则
参数
规则引擎(热部署、同步更新)
软件修补 和升级
软件修补
提供软件的修补 (Patch)版本安装包下载的快速通道; 仅限于软件小版本; 对于甲方发现的软件BUG,以书面形式提交乙方,乙方按照BUG的严重级别在一到五个工作日内答复解决方案,并免费修正BUG。
应用 举例
公司 情况
产品 介绍
产品 特色
旗正规则引擎
业务人员和技术支持人员共同维护规则包中的规则
*
*
*
旗正发展历程
产品功能架构
应用 举例
公司 情况
产品 介绍
产品 特色
旗正规则引擎
Rule的定义 Rule的管理 界面管理 Parameter 管理 Rule热部署 Rule模拟执行
业务逻辑调用接口
业务通用模块 ( …)
业务规则作为企业资产管理

RuleEngine (规则引擎学习介绍)

RuleEngine (规则引擎学习介绍)

Java规则引擎商业产品主要有
Java规则引擎开源项目
• JBoss Rules(Drools ) • 具有一个易于访问企业策略、易于调整以
及易于管理的开源业务规则引擎,符合业 内标准,速度快、效率高。业务分析师或 审核人员可以利用它轻松查看业务规则, 从而检验是否已编码的规则执行了所需的 业务规则。
规则语言
• JSR 94中没有涉及用来创建规则和动作的
语言.规则语言是规则引擎应用程序的重要 组成部分,所有的业务规则都必须用某种语 言定义并且存储于规则执行集中,从而 规则 引擎可以装载和处理他们。
名称及其网址列出如下
• Rule Markup language (RuleML)
/ Simple Rule Markup Language (SRML) /srml.html Business Rules Markup Language (BRML) /brml.html SWRL: A Semantic Web Rule Language Combining OWL and RuleML /2003/11/swrl/
Production System)是一个基于Java的演绎 法(Forward-Chaining)规则引擎.这个规则引 擎被用于在Java 应用服务器,Java客户端程 序,和Servlets中通过规则来提高它们的商业 处理能力.
Java规则引擎开源项目
• InfoSapient • InfoSapient是一个开源的规则引擎.它设计
Rete算法其核心
• Rete算法其核心思想是将分离的匹配项根
据内容动态构造匹配树,以达到显著降低 计算量的效果
Java规则引擎
• 目前主流的规则引擎组件多是基于Java和

旗正业务规则引擎介绍

旗正业务规则引擎介绍
杭州旗正信息技术有限公司visualrules商业规则引擎概述判断何时利用businessruleengine处理应用程序逻辑如何建立出版並執行規則如何通过规则服务使用商业規則有关商业規則经常变动变动的原因多半来自非开发人员将需要处理的数据直接以值的方式传递支持直接从多个数据源存取数据以顺序执行的方式执行规则对于同级匹配规则可发起重新执行如果信号灯转向不是右转停车等待如果信号灯转向是右转通行java应用程序bre非java应用程序规则服务bre規則包rulepackage规则rule规则集ruleset决策表decisiontable商业对象库bom可通过规则引擎被外部调用的一个执行单元完全独立包含了运行时相关的所有商业对象数据以及规则的定义規則是由条件condition和动作action构成条件的目的在评估成立与否条件成立执行动作将规则进行分组对同一组规则设置公共条件对同一组规则设置循环条件一组具有类似条件和类似赋值操作的规则的集以表格的形式描述对值的赋值操作定义了规则包与外部的接口定义了规则包内部可操作的数据对象定义了可引用的公共规则和规则集商业規則引擎规则包执行时的传递参数规则包执行时的临时数据可调用的java类的方法规则包中各个常量可操作数据库的各种对象包括数据库表视图查询sql内存数据表格对象xml节点对象处理excel工作表的对象规则包执行时的传递参数数据规则包执行时新创建的数据类型支持numberstringlistmapbooleanfiledatetimexml类型支持路径中java类支持常量类型的值可以对值进行分组操作可以对值添加对其操作的公式或者方法支持具有驱动的各种类型的数据库从数据库中读取表视图存储过程的信息自动创建对象以及各种操作方法编辑时可以直接查阅表中的数据根据自定义的sql语句创建返回结果集或者返回值的数据对象以及各种操作方法可以直接测试sql语句的合法性以及根据参数测试返回数据可以对数据进行缓存处理支持大批量表格类数据的存取可根据excel文件导入字段定义以及数据可根据数据库对象的结果集导入可对表格数据进行汇总分组筛选可对表格数据进行相加减乘除等数值操可对表格数据进行遍历可将计算结果导出和excel比较可以设置xml节点的属性可以设置xml节点的内容可以设置xml节点的子节点可以从工作簿中读取或者创建可以以表格的形式访问可以以汇总表的形式访问可以设置某个单元格的值可以设

drools 交叉决策表

drools 交叉决策表

Drools是一个业务规则管理系统(BRMS)解决方案,它使用一种称为“规则引擎”的方法来管理和执行业务规则。

交叉决策表是Drools中一种特殊的规则表示方法,用于处理复杂的多条件决策逻辑。

交叉决策表是一种图形化工具,用于表示多个条件和相应操作(决策结果)之间的关系。

在Drools中,交叉决策表由以下几部分组成:
1. 表格标题:包含规则名称和参数列表。

2. 列标题:列出所有可能的输入条件。

3. 行标题:列出所有可能的输入组合。

4. 单元格:显示每个输入组合的结果。

在Drools中,您可以使用Decision Table(决策表)插件来创建和管理交叉决策表。

该插件提供了一个图形化界面,使您可以轻松地构建和编辑决策表,并将其转换为相应的规则代码。

要使用Decision Table插件,您需要执行以下步骤:
1. 在Drools项目中创建一个新的规则文件。

2. 在规则文件中添加一个规则,并为其指定一个名称和参数列表。

3. 在规则的体部分,使用特殊的语法来定义交叉决策表。

4. 保存并编译规则文件。

5. 在应用程序中使用规则引擎来加载和执行规则。

通过使用交叉决策表,您可以轻松地表示复杂的条件决策逻辑,并将其转换为可执行代码,以提高业务规则管理的效率和可维护性。

easyrule 交叉决策表

easyrule 交叉决策表

交叉决策表是一种用于系统规则管理的方法。

它在现实的系统中被广泛使用,在计算机科学、电力系统、工业控制等领域都有应用。

交叉决策表能够对系统的规则进行管理,实现规则的有效匹配和执行,使系统能够更加智能地进行决策和运行。

本文将介绍交叉决策表的基本原理、应用案例和发展趋势。

一、交叉决策表的基本原理1.1 交叉决策表的概念交叉决策表是一种基于规则的决策管理方法。

它采用了交叉匹配和执行的方式,将规则和条件进行组合,实现对系统决策的精细管理和控制。

交叉决策表通过规则的交叉匹配和执行,能够实现复杂系统的智能决策和运行。

1.2 交叉决策表的特点交叉决策表具有以下特点:灵活性高、规则管理简单、匹配速度快、执行效率高。

交叉决策表能够适应不同规模和复杂度的系统,对规则的管理和执行都能够实现高效运行。

1.3 交叉决策表的适用范围交叉决策表广泛适用于各种复杂系统的规则管理和决策控制。

在电力系统、工业控制、金融风控等领域都有应用。

交叉决策表能够实现对规则的精细管理和执行,提高系统的决策智能和运行效率。

二、交叉决策表的应用案例2.1 电力系统中的应用在电力系统中,交叉决策表能够对电力调度、故障诊断、负荷预测等进行规则管理和决策控制。

通过交叉决策表,电力系统能够实现对复杂规则的匹配和执行,提高系统运行效率。

2.2 工业控制中的应用在工业控制中,交叉决策表能够对生产调度、设备控制、质量监控等进行规则管理和决策控制。

通过交叉决策表,工业系统能够实现对复杂规则的匹配和执行,提高系统的智能化和自动化水平。

2.3 金融风控中的应用在金融风控中,交叉决策表能够对风险评估、信贷审核、交易监控等进行规则管理和决策控制。

通过交叉决策表,金融系统能够实现对复杂规则的匹配和执行,提高系统的风险管理能力。

三、交叉决策表的发展趋势3.1 大数据与人工智能的融合随着大数据和人工智能技术的发展,交叉决策表将会与大数据和人工智能进行更紧密的融合。

通过大数据分析和人工智能算法,交叉决策表能够更加智能地进行规则管理和决策控制,提高系统的决策水平。

ILOG规则引擎系统运维手册

ILOG规则引擎系统运维手册

ILOG 规则引擎系统运维手册一、 ILOG 规则引擎系统介绍➢ 为什么使用ILOG 规则引擎系统?保险行业是大量业务规则的处理过程,投承保规则、保费计算规则、核保规则、核批规则、费用规则、核赔规则。

业务规则无所不在,且随着行业监管、市场环境、业务管理等因素不断变化。

业务规则管理混乱、业务规则变更过分依赖技术人员,业务人员无法单独完成业务规则变更,维护成本高昂,由此带来的问题:• 业务规则变更周期长、成本高 • 规则重用性差• 业务规则知识随着时间被淡忘 基于ILOG 的规则管理,可实现:• 业务规则与保险应用剥离,业务规则易于管理• 使用集中规则库进行管理,业务人员可单独变更业务规则 • 实现历史规则追溯 • 规则可重用• 缩短新业务发布周期➢ ILOG 在都邦保险的运用Ilog 规则引擎系统目前维护的规则有车险核保规则和车险费用规则。

自动核保规则是指根据某些核保因子判断当前保单是否能够自动核保通过或者不能够自动核保通过的规则。

其中,不能够自动核保通过的规则,一般又分为数据校验规则、打回出单规则以及自动核保校验规则(转人工核保)等。

人工核保权限规则是指在人工核保环节,不同级别的核保员具有不同的核保权限,配置不同级别的核保员核保权限的规则就是人工核保权限规则。

➢ 产品组件Rule Studio (规则开发环境)用于对基于规则的应用程序进行编码、调试和部署;Rule Execution Server (规则执行服务器) RES执行部署的规则应用,业务规则调用的组件,并包括一个web 的管理控制台,业务人员/技术人员编写的业务规则只有部署在规则的执行环境中才能被执行,才能起到作用;核保规则自动核保规则人工核保规则 ——维护各核保级别的权限打回出单(数据校验或拒保)规则 转人工核保规则自动核保通过规则Rule Team Server(规则管理服务器) RTS业务人员创建、修改、组织和搜索业务规则的指定工作环境;支持非开发人员编写和管理规则;➢规则在ILOG中的描述方式简单规则●简单规则适用于简单逻辑处理——‘如果’,‘那么’决策表●决策表主要适用于没有复杂的逻辑处理、关系清晰、条件相同的规则决策树●决策树主要适用于有业务逻辑判断,不同条件下,处理方式不同的规则➢ILOG 相关基本概念规则包:根据业务逻辑组织规则的容器。

Visual Rules 交叉表

Visual Rules 交叉表

交叉决策表创建交叉决策表规则包鼠标右键点击在工程视图窗口的规则工程,出现弹出式菜单,选择其中的“新建规则包”菜单项:系统会新建一个规则包,同时系统会要求您重命名规则包的名称。

直接在工程视图窗口的规则包名称上,输入当前我们需要设置的规则包名称“交叉决策表”,然后回车:这样就新建了一个交叉决策表的规则包,新建的规则包是空的。

您可以在此基础上,设置规则包的对象库以及规则。

设置对象库将交叉决策表点开,看到的如下图所示:首先我们设置对象库,您可以点击对象库,在传入数据中,添加变量。

可以通过鼠标右击编辑窗口表格内,点击添加定义变量,还可以直接点击编辑窗口左下角的定义变量,这两中方式都会弹出对话框。

如下图所示:您也可以选择双击编辑窗口中的表格列中的列,其中列只能是名称(英文)下带有复选框的表格,如下图所示:需要定义的变量。

如下图所示:设置交叉决策表接下来,我们了解交叉决策表。

我们首先需要为规则包,添加一个交叉决策表。

右键点击“交叉决策表”规则包,然后选择“添加关联决策表”:此交叉决策策表如下:此决策表是根据消费金额和积分基数测试test变量是不是获取到值,因此消费金额和积分基为条件,test变量为赋值元素。

因此首先我们在“交叉决策表”决策表的属性窗口中,将其中赋值元素为test,如下所示:设置完“交叉决策表”决策表的赋值元素后,我们再设置交叉决策表条件,添加编辑窗口中的“交叉决策表条件”,出现条件的设置窗口:点击此窗口,条件下面的的按钮,会出现“请选择”,点击“请选择”,选择传入数据中的“消费金额”:在点击“等于”,会出现选择项,在选择项中选择“大于”:在点击“请点击选择”,选择输入常量值在点击“空”,在控件中输入0,输入完点击。

通过横向条件的配置步骤,配置纵向条件,配置如下:配置完交叉决策表条件后,在配置交叉决策表赋值:双击“空”,在表格内输入成功:测试点击规则包交叉决策表,在编辑窗口下方,选择测试选项卡:双击消费金额对应的初始输入值表格,在表格中输入500,点击,运行结果如下:交叉决策表规则配置完成。

规则引擎教程--多维决策表

规则引擎教程--多维决策表

多维决策表1.1业务需求 (2)2.1 规则实现 (3)2.1.1 规则包创建 (3)2.1.2 变量定义 (4)2.1.3 逻辑实现 (4)2.1.4 保存和编译 (10)3.1测试 (11)1.1业务需求在交叉决策表以及关联决策表中,条件之间的通常是一对一的关系(也可以实现一对多),但是在实际情况中往往会出现一对多的关系。

如在下面的列子中,一个学生要考很多学科,一个学期又要考很多场试。

若用交叉决策表会造成逻辑上的冗余,而多维决策却很容易的实现一对多的关系,。

学生考试的考试情况如下图所示:我们可以看到,每个学生每学期要有三次考试,而每次考试要考三门学科。

这样多维决策表的条件部分应该有三个:学生姓名、考试类型、学科。

而结果只有一个:分数。

需要注意的是:虽然多维决策表可以实现多对多的关系,但是在每个条件之间必须公用同一个条件。

例如,在本例子中若实际情况中有的学生没有学习英语,但是在多维决策表中还是会有该学生的英语成绩的。

若要实现每个条件下的子条件不同,就要用交叉决策表来实现了。

2.1 规则实现2.1.1 规则包创建右键名为“功能解析”的工程,点击“新建规则包”,创建一个名为:“多维决策表的”规则包,如下图所示:2.1.2 变量定义需要在该规则包的对象库中,定义四个变量:学生姓名(stuName),考试(test),学科(subject),得分(score)。

如下图所示:2.1.3 逻辑实现创建名为“学生考试得分”的多维决策表,创建过程如下图所示:创建好了“多维决策表”我们需要设置其属性,首先要在属性窗口,把条件个数设置为3,赋值元素设置成“得分”(score)。

操作流程如下所示:属性设置好了之后,我们要在“多维决策表”的条件部分中设置具体的逻辑以及该条件下的“得分”。

条件设置过程如下:按照上述的步骤,再添加两个学生,添加完成后,如下图所示:这样学生姓名就设置好了,然后我们再添加考试信息,完成后如下图:考试信息的条件设置完成之后,我们还要给学科添加信息,其添加完成后如下图所示:学科的条件设置完成之后,这样多维决策表的条件部分就完成。

easyrule 交叉决策表

easyrule 交叉决策表

easyrule 交叉决策表
交叉决策表(cross decision table)是一种规则表示方法,用于描述多个条件与多个动作之间的关系。

每个条件和动作都可以有多个取值,通过交叉方式来定义规则。

EasyRule 是一个 Java 语言编写的规则引擎,可以用于轻松创建和管理基于规则的系统。

EasyRule 支持交叉决策表作为规则定义的一种方式。

使用 EasyRule 创建交叉决策表的步骤如下:
1. 定义条件和动作:使用 EasyRule 提供的注解来定义条件和动作,例如 @Condition 和 @Action。

2. 创建规则:使用 EasyRule 提供的 RuleBuilder 来创建规则,并指定条件和动作的逻辑关系。

可以使用交叉决策表的形式来直观地描述条件和动作之间的关系。

3. 创建规则引擎:使用 EasyRule 提供的 RulesEngineBuilder 来创建规则引擎。

4. 注册规则:将创建的规则注册到规则引擎中。

5. 执行规则:将需要执行规则的事实传递给规则引擎,并启动规则引擎执行规则。

通过以上步骤,可以使用 EasyRule 来简便地创建和管理交叉决策表,并通过规则引擎执行规则。

规则引擎需求说明书

规则引擎需求说明书

规则引擎系统软件需求说明书2020/9/23目录1.引言 (3)1.1.目的 (3)1.2.范围 (3)1.3.简写与缩略语 (3)1.4.引用文件 (3)2.总体描述 (4)2.1.产品描述 (4)2.2.产品功能 (4)2.3.用户特点 (4)2.4.约束 (4)2.5.假设和依赖关系 (5)3.具体需求 (5)3.1.外部接口需求 (5)3.2.功能需求 (5)3.2.1.规则引擎控制台 (5)3.2.2.规则引擎执行器 (8)3.2.3.规则引擎资源服务器 (8)3.2.4 规则引擎客户端 (9)3.3.性能需求 (9)3.4.设计约束 (9)3.5.软件系统属性 (9)3.5.1.可靠性 (9)3.5.2.可用性 (9)3.5.3.安全保密性 (10)3.5.4.可维护性 (10)3.5.5.可移植性 (10)1.引言1.1.目的该文档试图说明整个系统的轮廓,对功能需求和性能需求进行详细的描述。

便于开发人员和用户进行理解和交流,反映出用户问题结构,可作为软件开发的依据和测试依据。

本文面向多种读者:项目经理:可根据文档了解预期产品的功能,并进行系统设计,项目管理。

开发人员:对需求进行分析,并设计出系统,包括数据库设计。

测试人员:根据本文档编写测试用例,并对软件进行功能性测试和非功能性测试。

1.2.范围规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。

接受数据输入,解释业务规则,并根据业务规则做出业务决策。

1.3.简写与缩略语字典:dict; 函数:func; 规则:rule;1.4.引用文件1、Drools官网地址:https://git地址:https:///kiegroup/drools.gitDrools是JBoss公司旗下的一款开源规则引擎,其使用了匹配规则的方式来进行,使用时需将业务逻辑进行抽象,抽象成一条条规则。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

交叉决策表
交叉决策表 (1)
1.1 业务需求 (2)
2.1规则实现 (2)
2.1.1 规则包创建 (2)
2.1.2 变量定义 (3)
2.1.3 创建交叉决策表 (3)
2.1.4 规则实现 (4)
3.1 测试 (9)
3.1.1规则单元测试 (10)
3.1.2 批量测试 (10)
1.1 业务需求
现需解决每个员工每个月(上半年)的基本业务工资。

由于每个员工每个月都有相对应的工资,同样的每个月也对应着每个员工,他们之间存在一一对应的关系。

这里我们就可以设计个“交叉决策表”,把月份和员工分别作为“交叉决策表”的横向和纵向条件,把工资作为“交叉决策表”的赋值元素。

需要注意的是:交叉决策表的赋值元素只能有一个!
员工的工资清单如下:
2.1规则实现
2.1.1 规则包创建
右键名为“功能解析”的工程,点击“新建规则包”,创建一个名为:“交叉决策表的”规则包,如下图所示:
2.1.2 变量定义
该规则包中需要在对象库中,定义三个变量:员工姓名(name),月份(month),基本工资(salary)。

如下图所示:
2.1.3 创建交叉决策表
右键名为“交叉决策表”的规则包,选择添加“交叉决策表”。

添加完成后,需将该决策表重命名为“员工基本工资”,操作截图如下所示:
创建了“员工基本工资”的“交叉决策表”之后,需处理该决策表的业务逻辑。

2.1.4 规则实现
在该例“交叉决策表”中,有两个条件:员工姓名、月份。

但是在“交叉决策表”中,横向条件是缺省存在的,所以在该“交叉决策表”的属性窗口只需一个纵向条件,然后在“赋值元素”中选择“基本工资”。

设置完成后,“交叉决策表”的属性如下图所示:
属性设置完成后,我们要为该交叉决策表设置对应的条件,操作步骤如下图所示:
员工姓名设置完成以后,我们还要在条件部分添加6种月份信息。

双击“基本工资”右下方的黑色区域,设置如下图所示的逻辑,步骤如下图所示:
确认后,我们可以看到下图所示的页面:
最后我们依次修改每个员工,每个月份的的工资,完成的结果如下:
我们点击图中黑色框中的“交叉决策表条件”,可以看到具体的逻辑。

如下图所示:
注:“交叉决策表”的横向条件缺省存在的且只能有一个;纵向条件可以设置多个,在每个纵向条件中可以存在多个不同的子条件,最后所有的的纵向条件和横向条件交叉组成新条件。

3.1 测试
我们在规则编写完成之后,都需为规则进行保存、编译。

点击“全部保存”,配置器就会自动保存并编译所有未保存规则包,过程如下:
保存后,我们可以在消息窗口看到如下消息:
如果出现上述的两条信息,说明该规则包已经编译成功!规则包保存编译以后,我们需要测试该规则包的输出结果正确性。

规则包的测试有两种方式:一种是批量测试、另一种是规则单元测试。

3.1.1规则单元测试
规则单元测试一次只能测试一条数据,若需测试其他情况,需要修改初始输入值,再测试一遍。

测试的步骤和结果,按照下图所示的进行:
3.1.2 批量测试
在批量测试中,一次测试可以测试任意条测试数据。

测试数据可以从excel中导入,也可以把excel中的数据导入到批量测试中。

首先,需要在规则包中添加批量测试,添加过程如下图所示:
完成后,我们需要添加测试用例,如下图所示:
Visual Rules Solution 旗正规则引擎
11
点击“添加”后,将会出现下图所示的页面,按图中所示添加一个测试用例:
传入值:就是测试输入值;期望结果值:在该输入值下,期望得到的结果值。

若测试输出结果值与期望结果值不同,在消息窗口会出现红色字体的错误提示;若相同,测试完成!
我们再多添加几个测试用例。

添加完成后,点击下图所示的测试按钮,测试完成后的结果如下图所示:
从上图中,我们可以看到所有的期望值与实际结果值相同,测试通过!在消息记录窗口的消息记录如下图所示:。

相关文档
最新文档