`

Java Drools5.1 规则流基础【示例】

 
阅读更多
一、问题描述



假设雇员Employ有:

           学历信息 eduInfo,   简历信息  resume,

           考核信息 annualExam  和奖惩信息 awardPunish;

要确定其:

           基本工资 basicSalary, 职务工资 dutySalary,

           分红金额 bonus 和 总工资 totalSalary.



规则如下:

【1】学历决定基本工资(basicSalary):

                       ====>本科1500研究生2500

【2】简历决定职务工资(dutySalary) :

                       ====>技术2000管理4500

【3】年度考核决定分红(bonus):

                       ====>分红总金额1000

                       ==>考核结果:

                        ==>优秀100%(1000);良好90%(900);

                                       合格60%(600); 不合格0%(0);

【4】奖惩决定计算最终工资与【123】项工资之和的比例:

                       ====>奖励:*110%(+10%)

                       ====>惩罚:*90%(-10%)

                       ====>无:*100%(0%)

【5】计算总工资: (【1】+【2】+【3】)*【4】



二、问题分析



1.基本流程:



P【计算基本工资,计算职务工资,计算分红, 计算奖惩比例】

                    ====>计算总工资(根据奖惩情况)

其中,P[i,...,k]表示任务i,...,k并发执行,====>表示顺序执行。

即有:P[1,2,3, 4] ===> 5



三、概要设计



【1】类Employ的设计:

【2】规则文件的编写和组织:

                ==>学历规则文件:EduInfoRule.drl

                ==>简历规则文件:ResumeRule.drl

                ==>分红规则文件:BonusRule.drl

                ==>奖惩规则文件:AwardPunish.drl

                ==>计算总工资规则:TotalRule.drl

【3】规则文件的组合(规则流):



                 ==>EduInfo.drl含规则组basic_salary

                 ==>ResumeRule.drl含规则组duty_salary

                 ==>BonusRule.drl含规则组bonus_salary

                 ==>AwardPunish.drl含规则组award_punish

                  ==>TotalRule.drl含规则组sum_salary



组合方式:

[start]--->  P[basic_sal ary , duty_salary, bonus_salary, award_punish]

                  --->sum_salary ---> [end]





其中:P表示并发,--->表示顺序 【规则流图在后面的实现中给出】



【4】编写测试文件:EmployTest.java


四、详细设计



【1】使用EclipseIDE作为开发环境,drools5.1作为规则引擎

【2】为简单起见,Employ类的属性作了简化处理,

             eduInfo, resume , annualExam,   awardPunish均为String,

                   basic{duty,bonus,total}_salary , percent作为double类型。

五、规则文件及规则流



              EduInfoRule.drl:
package myrules;
import sample.Employ;
 
rule"Bachelor"
      ruleflow-group"basic_salary"
when
   emp:Employ(eduInfo =="bachelor");
then
   System.out.println("execrule Bachelor ... ");
   emp.setBasicSalary(1500);
end

rule"Master"
      ruleflow-group"basic_salary"
when
   emp:Employ(eduInfo=="master")
then
   System.out.println("execrule Master ... ");
   emp.setBasicSalary(2500);
end


Resume.drl
package myrules
import sample.Employ;

rule"Technician"
       ruleflow-group"duty_salary"
when
   emp:Employ(resume=="tech")
then
   System.out.println("execrule Technician ... ");
  emp.setDutySalary(2000);
end

rule"Manager"
      ruleflow-group"duty_salary"
when
   emp:Employ(awardPunish=="manager")
then
   System.out.println("execrule manager ... ");
   emp.setDutySalary(4500);
end


BonusRule.drl 
package myrules
import sample.Employ;

rule"Excellent"
      ruleflow-group"bonus_salary"
when
  emp: Employ(annualExam=="excellent")
then
   System.out.println("execrule Excellent ... ");
  emp.setBonus(1000*1.0);
end

rule"Good"
       ruleflow-group"bonus_salary"
when
  emp: Employ(annualExam=="good")
then
   System.out.println("execrule Good ... ");
  emp.setBonus(1000*0.9);
end

rule"Common"
      ruleflow-group"bonus_salary"
when
  emp: Employ(annualExam=="common")
then
   System.out.println("execrule Common ... ");
  emp.setBonus(1000*0.6);
end

rule"failing"
       ruleflow-group"bonus_salary"
when
  emp: Employ(annualExam=="failing")
then
   System.out.println("execrule failing ... ");
  emp.setBonus(1000*0.0);
end


AwardPunish.drl 

packagemyrules
importsample.Employ;

rule"Award"
       ruleflow-group"award_punish"
when
   emp:Employ(awardPunish=="award")
then
   System.out.println("execrule Award ... ");
  emp.setPercent(1.10);
end

rule"Punishment"
       ruleflow-group"award_punish"
when
   emp:Employ(awardPunish=="punish")
then
   System.out.println("execrule Punishment ... ");
  emp.setPercent(0.90);
end

rule"None"
      ruleflow-group"award_punish"
when
   emp:Employ(awardPunish=="none")
then
   System.out.println("execrule None ... ");
  emp.setPercent(1.00);
end


TotalRule.drl

package myrules
import sample.Employ;

rule"Total"
  ruleflow-group"sum_salary"
when
   emp: Employ()
then
   System.out.println("execrule Total ... ");
   double total =emp.getBasicSalary() + emp.getDutySalary() +
                 emp.getBonus();                               
   emp.setTotalSalary(total*emp.getPercent());
end






注意:

       [1]Split结点类型为OR,约束选择alwaystrue.表示选择其规则组中所有符合事实的规则进行并发执行;

       [2] Join结点类型为AND,表示当且进当上述规则组均执行完毕后,才执行后面的规则或进程。




六、测试代码:



Employ:
package sample;

public class Employ {
	
	public static final double BONUS = 1000;
	
	private String eduInfo;
	private String resume;
	private String annualExam;
	private String awardPunish;
	
	private double basicSalary;
	private double dutySalary;
	private double bonus;
	private double percent;
	
	private double totalSalary;
    
	public String getEduInfo() {
		return eduInfo;
	}
	public void setEduInfo(String eduInfo) {
		this.eduInfo = eduInfo;
	}
	public String getResume() {
		return resume;
	}
	public void setResume(String resume) {
		this.resume = resume;
	}
	public String getAnnualExam() {
		return annualExam;
	}
	public void setAnnualExam(String annualExam) {
		this.annualExam = annualExam;
	}
	public String getAwardPunish() {
		return awardPunish;
	}
	public void setAwardPunish(String awardPunish) {
		this.awardPunish = awardPunish;
	}
	
	public double getBasicSalary() {
		return basicSalary;
	}
	public void setBasicSalary(double basicSalary) {
		this.basicSalary = basicSalary;
	}
	
	public double getDutySalary() {
		return dutySalary;
	}
	public void setDutySalary(double dutySalary) {
		this.dutySalary = dutySalary;
	}

	public double getBonus() {
		return bonus;
	}
	public void setBonus(double bonus) {
		this.bonus = bonus;
	}
	
	public double getPercent() {
		return percent;
	}
	public void setPercent(double percent) {
		this.percent = percent;
	}
	
	public double getTotalSalary() {
		return totalSalary;
	}
	public void setTotalSalary(double totalSalary) {
		this.totalSalary = totalSalary;
	}
    
    public String toString() {
    	return "[" + eduInfo + " " + resume + " " + annualExam + " " +
    	             awardPunish + " " + basicSalary + " " + dutySalary + " " +
    	             bonus + " " + totalSalary + "]";   
    }
    
}


EmployTest:
package sample;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;

public class EmployTest {
	
	public static void main(String[] args) {
		
		try {
			// load up the knowledge base
			KnowledgeBase kbase = readKnowledgeBase();
			StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
			KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
			// go !
			Employ emp = new Employ();
			emp.setEduInfo("master");
			emp.setResume("tech");
			emp.setAnnualExam("good");
			emp.setAwardPunish("award");
			ksession.insert(emp);
			ksession.startProcess("myrules.salary");
			ksession.fireAllRules();	
			System.out.println("Basic Salary: " + emp.getBasicSalary());
			System.out.println("Duty Salary: " + emp.getDutySalary());
			System.out.println("Bonus      : " + emp.getBonus());
			System.out.println("rate       : " + emp.getPercent());
			System.out.printf("Total Salary: %.0f" , emp.getTotalSalary());
			logger.close();
		} catch (Throwable t) {
			t.printStackTrace();
		}			
		
	}
		
	private static KnowledgeBase readKnowledgeBase() throws Exception {
		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
		kbuilder.add(ResourceFactory.newClassPathResource("rules/EduInfoRule.drl"), ResourceType.DRL);
		kbuilder.add(ResourceFactory.newClassPathResource("rules/ResumeRule.drl"), ResourceType.DRL);
		kbuilder.add(ResourceFactory.newClassPathResource("rules/BonusRule.drl"), ResourceType.DRL);
		kbuilder.add(ResourceFactory.newClassPathResource("rules/AwardPunish.drl"), ResourceType.DRL);
	    kbuilder.add(ResourceFactory.newClassPathResource("rules/TotalRule.drl"), ResourceType.DRL);
		kbuilder.add(ResourceFactory.newClassPathResource("rules/salary.rf"), ResourceType.DRF);
		KnowledgeBuilderErrors errors = kbuilder.getErrors();
		if (errors.size() > 0) {
			for (KnowledgeBuilderError error: errors) {
				System.err.println(error);
			}
			throw new IllegalArgumentException("Could not parse knowledge.");
		}
		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
		kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
		return kbase;
	}	

}


测试结果:

               execrule Technician ...

           execrule Master ...

execrule Good ...

execrule Award ...

execrule Total ...

BasicSalary: 2500.0

DutySalary: 2000.0

Bonus : 900.0

rate : 1.1

TotalSalary: 5940





七、总结




Javadrools规则流基础:




【1】掌握规则引擎的基本工作原理;

【2】掌握规则文件的编写;

【3】掌握规则流图的绘制及应用程序集成。

【4】掌握规则组合的两种基本方式【并发和顺序】的实现方式。




下一步:




【1】更复杂的规则组合;

【2】规则文件的组织、管理;

【3】规则文件的自动生成;

【4】用户自定义规则;



NOTE:  关于XP下的示例作了一些修改,主要增加了XML格式的规则流文件及一个简单的自动生成顺序规则流的方法。已经上传至CSDN下载,请在下面网址下载:http://download.csdn.net/source/3462802 
  • 大小: 30.6 KB
  • 大小: 417.2 KB
分享到:
评论

相关推荐

    停车场管理系统c语言.docx

    问题描述: 停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入; 当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 1.基本要求 (1)以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。 (2)每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。 (3)栈以顺序结构实现,队列以链表实现。 2.重点难点 重点:针对停车场问题的特点,利

    精选毕设项目-人民好公仆小程序(生活+便民+政务).zip

    精选毕设项目-人民好公仆小程序(生活+便民+政务)

    精选毕设项目-相册;处理用户信息.zip

    精选毕设项目-相册;处理用户信息

    精选毕设项目-喵喵小说.zip

    精选毕设项目-喵喵小说

    精选毕设项目-图片预览带后端.zip

    精选毕设项目-图片预览带后端

    精选项目-爱靓女带后台.zip

    精选项目-爱靓女带后台

    法院综合安全监管平台解决方案PPT(53页).pptx

    在科技与司法的交响曲中,智慧法院应运而生,成为新时代司法服务的新篇章。它不仅仅是一个概念,更是对法院传统工作模式的一次深刻变革。智慧法院通过移动信息化技术,为法院系统注入了强大的生命力,有效缓解了案多人少的矛盾,让司法服务更加高效、便捷。 立案、调解、审判,每一个阶段都融入了科技的智慧。在立案阶段,智慧法院利用区块链技术实现可信存证,确保了电子合同的合法性和安全性,让交易双方的身份真实性、交易安全性得到了有力见证。这不仅极大地缩短了立案时间,还为后续审判工作奠定了坚实的基础。在调解阶段,多元调解服务平台借助人工智能、自然语言处理等前沿技术,实现了矛盾纠纷的快速化解。无论是矛盾类型的多元化,还是化解主体的多元化,智慧法院都能提供一站式、全方位的服务,让纠纷解决更加高效、和谐。而在审判阶段,智能立案、智能送达、智能庭审、智能判决等一系列智能化手段的应用,更是让审判活动变得更加智能化、集约化。这不仅提高了审判效率,还确保了审判质量的稳步提升。 更为引人注目的是,智慧法院还构建了一套完善的执行体系。移动执行指挥云平台的建设,让执行工作变得更加精准、高效。执行指挥中心和信息管理中心的一体化应用,实现了信息的实时传输和交换,为执行工作提供了强有力的支撑。而执行指挥车的配备,更是让执行现场通讯信号得到了有力保障,应急通讯能力得到了显著提升。这一系列创新举措的实施,不仅让执行难问题得到了有效解决,还为构建诚信社会、保障金融法治化营商环境提供了有力支撑。智慧法院的出现,让司法服务更加贴近民心,让公平正义的阳光更加温暖人心。

    西门子1200与3台台达DTK温控器通讯程序 功能:实现西门子1200 PLC对3台台达DTK温控器进行485通讯控制,在触摸屏上设定温度,读取温度 器件:西门子12

    西门子1200与3台台达DTK温控器通讯程序 功能:实现西门子1200 PLC对3台台达DTK温控器进行485通讯控制,在触摸屏上设定温度,读取温度 器件:西门子1200 1214DC DC DC.昆仑通态TPC7062Ti ,西门子KTP700 Basic PN,台达DTK 4848V12温控器。 说明:的是程序,带详细注释程序,西门子触摸屏程序,PLC设置和温控器设置,接线说明书。 #SIEMENS 西门子

    机械设计电阻绕线焊线一体机sw18全套技术资料100%好用.zip

    机械设计电阻绕线焊线一体机sw18全套技术资料100%好用.zip

    VB6编写的上位机采集2路温度 并形成曲线图 还可查看历史数据

    VB6编写的上位机源码,可实时显示曲线图,带有数据库,可以进行历史数据的保存 及 查看历史采集数据。

    精选毕设项目-新浪读书.zip

    精选毕设项目-新浪读书

    jQuery+Slick插件实现游戏人物轮播展示切换特效源码.zip

    jQuery+Slick插件实现游戏人物轮播展示切换特效源码是一款通过背景图片的切换来显示不同的人物效果,轮播效果通过slick幻灯片插件来制作。效果非常棒,有需要的朋友可以直接下载使用,适应各大网站

    精选毕设项目-地图查找附件.zip

    精选毕设项目-地图查找附件

    (蛐蛐voc数据)农作物病虫害识别目标检测数据集,VOC格式,蛐蛐数据集,纯手动标注,用来进行目标检测代码训练的数据

    (蛐蛐voc数据)农作物病虫害识别目标检测数据集,VOC格式,蛐蛐数据集,纯手动标注,用来进行目标检测代码训练的数据。

    MATLAB Simulink仿真模型 双馈风机并网频率控制仿真模型,利用下垂控制与惯性控制结合的综合惯性控制,实现电力系统的频率稳定,两台同步发电机组,具体参数可自行调节,频率波形比较可利用matl

    MATLAB Simulink仿真模型 双馈风机并网频率控制仿真模型,利用下垂控制与惯性控制结合的综合惯性控制,实现电力系统的频率稳定,两台同步发电机组,具体参数可自行调节,频率波形比较可利用matlab工作区画出。

    科研项目结题报告的撰写指南:结构、内容与注意事项

    一、结题报告的类型及主要结构 结题报告是一种专门用于科研课题结题验收的实用性报告类文体,也叫研究报告。它是研究者在课题研究结束后对科研课题研究过程和研究成果进行客观、全面、实事求是的描述,是课题研究所有材料中最主要的材料,也是科研课题结题验收的主要依据。   一篇规范、合格的结题报告,需要回答好3个问题:一是“为什么要选择这项课题进行研究?”二是“这项课题是怎样进行研究的?”三是“课题研究取得哪些研究成果?”  基本结构大致包括以下部分: 第一个问题 “为什么要选择这项课题进行研究?”  1.课题提出的背景;2.课题研究的意义(包括理论意义和现实意义,这个部分也可以合并归入“课题提出的背景”部分);第二个问题“这项课题是怎样进行研究的?”3.文献综述;4.课题研究的理论依据;5.课题研究的目标;6.课题研究的主要内容;7.课题研究的对象;8.课题研究的方法;9. 课题研究的主要过程(研究的步骤);   除了第9部分外,从第1到第8部分在填报课题立项申报表、在制定课题研究方案、在开题报告中,都有要求,内容基本相同。到了撰写结题报告时,只须稍作适当修改就可以了。而第9部分,则需要通过对

    1+X网络安全应急响应之应急准备:构建高效安全的应急响应体系

    内容概要:本文档重点讲述了网络安全应急响应的各项准备工作,涵盖了‘1+X’网络安全应急响应的职业技能等级证书概述、应急响应的基础知识、应急响应组织的建立、风险评估与改进、应急响应预案的制定以及详细的应急响应计划处置样例。文中详细介绍了各级职业技能的要求和任务,尤其关注如何未雨绸缪,制定完善的应急预案以应对潜在的网络安全风险;同时也探讨了如何在网络安全事件发生时,采取及时有效的应急处置措施。 适合人群:从事或有兴趣进入网络安全领域的从业人员,尤其是准备考取‘1+X’网络安全应急响应职业技能等级证书的相关人员。 使用场景及目标:帮助读者了解网络安全应急响应的基本概念及其在整个国家安全框架中的重要地位;指导读者学会如何建立健全高效的应急响应组织结构,如何进行全面的风险评估以及如何编制切实可行的应急预案;通过实例剖析,增强读者应对突发网络安全事件的能力。文档的目标在于提升读者在不同层面的专业技能,包括但不限于系统备份、日志分析、安全漏洞修复等方面的能力。 阅读建议:此文档结构清晰,内容详尽,非常适合有一定基础的技术从业者参考学习。建议读者逐章节深入了解,特别是关注自身岗位对应的技能细分类别。此外,结合实例深入理解和练习如何进行应急处置是非常有价值的,有助于提升自身的实战能力。

    电动汽车动力系统匹配计算模型:输入整车参数及性能要求,一键生成驱动系统的扭矩功率峰值转速等参数 2、整车动力经济性计算模型:包含NEDC WLTC CLTC工况,输入整车参数可生成工况电耗、百公里电

    电动汽车动力系统匹配计算模型:输入整车参数及性能要求,一键生成驱动系统的扭矩功率峰值转速等参数。 2、整车动力经济性计算模型:包含NEDC WLTC CLTC工况,输入整车参数可生成工况电耗、百公里电耗、匀速工况续航、百公里电耗等信息。 实际项目中使用的计算仿真模型. 两个模型打包

    chromedriver-linux64_122.0.6254.0.zip

    chromedriver-linux64_122.0.6254.0

    SRS构型七自由度冗余机械臂运动学建模全套matlab代码 代码主要功能: 1. 基于臂角参数化方法求解机械臂在给定末端位姿和臂角下的关节角度; 2. 求解机械臂在给定末端位姿下的有效臂角范围

    SRS构型七自由度冗余机械臂运动学建模全套matlab代码 代码主要功能: [1]. 基于臂角参数化方法求解机械臂在给定末端位姿和臂角下的关节角度; [2]. 求解机械臂在给定末端位姿下的有效臂角范围,有效即在该区间内机械臂关节角度不会超出关节限位; [3]. 以避关节限位为目标在有效臂角区间内进行最优臂角的选取,进而获取机械臂在给定末端位姿下的最优关节角度。 购前须知: 1. 代码均为个人手写,主要包含运动学建模全套代码; 2. 代码已经包含必要的注释; 包含原理推导文档,不包含绘图脚本以及urdf;

Global site tag (gtag.js) - Google Analytics