rulebook规则引擎示例

绩效管理中强制分布经常会用到,如:

如图,部门人数在五人以上适用此表,举例:

张三的部门业绩为A,
属于A等部门,
部门有20人,
张三个人考评在部门排名第8名;

按此表,张三属于B等员工,可以转换为95分;

但部门少于 6人,那么排名规则为:

引入rulebook规则引擎,代码结构:

扫描二维码关注公众号,回复: 931094 查看本文章

pom.xml
 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.youway</groupId>
	<artifactId>kpi-rulebook</artifactId>
	<version>1.0-SNAPSHOT</version>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<easy-rules.version>3.1.0</easy-rules.version>
		<slf4j.version>1.7.25</slf4j.version>
		<rulebook.version>0.9.1</rulebook.version>
	</properties>

	<dependencies>

		<dependency>
			<groupId>com.deliveredtechnologies</groupId>
			<artifactId>rulebook-core</artifactId>
			<version>${rulebook.version}</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-simple</artifactId>
			<version>${slf4j.version}</version>
		</dependency>


		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.16.8</version>
			<scope>provided</scope>
		</dependency>

	</dependencies>


</project>

规则执行测试代码 Launcher.java

package com.youway;

import com.deliveredtechnologies.rulebook.NameValueReferableMap;
import com.deliveredtechnologies.rulebook.FactMap;
import com.deliveredtechnologies.rulebook.model.runner.RuleBookRunner;

/**
 * 规则执行测试代码
 * @author youway
 *
 */

public class Launcher {
  public static void main(String args[]) {
    RuleBookRunner ruleBook = new RuleBookRunner("com.youway.rules");  //加载制定package中所有规则
    NameValueReferableMap facts = new FactMap();
    facts.setValue("num", 5);  //部门人数:5
    facts.setValue("deptLevel", "B");  //部门业绩评级:B
    facts.setValue("rank", 3); //该员工在部门考评中排名:3
    ruleBook.run(facts);
    ruleBook.getResult().ifPresent(System.out::println);  //打印规则执行的输出结果
  }
}

规则执行输出的结果类型 Response.java

package com.youway.pojos;

import lombok.Data;

/**
 * 强制分布结果,根据规则所输出的结果
 * @author youway
 *
 */
@Data
public class Response {
	
	public Response() {
		
	}
	
	public Response(String level, double score) {
		this.level = level;
		this.score = score;
	}

	//评级
	private String level;
	//转换分数
	private double score;
}

强制分布规则RuleParams.java

package com.youway.rules;

/**
 * 强制分布规则
 * 
 * @author youway
 *
 */
public interface RuleParams {
	//转换分数
	double SCORE_A = 100.00;
	double SCORE_B = 95.00;
	double SCORE_C = 95.00;
	double SCORE_D = 90.00;
	double SCORE_E = 85.00;
	
}

1人强制分布规则LessRule1

package com.youway.rules;

import com.deliveredtechnologies.rulebook.RuleState;
import com.deliveredtechnologies.rulebook.annotation.Given;
import com.deliveredtechnologies.rulebook.annotation.Result;
import com.deliveredtechnologies.rulebook.annotation.Rule;
import com.deliveredtechnologies.rulebook.annotation.Then;
import com.deliveredtechnologies.rulebook.annotation.When;
import com.youway.pojos.Response;

/**
 * 1人强制分布规则
 * @author youway
 *
 */
@Rule
public class LessRule1 implements RuleParams {
	// 所在部门的员工数
	@Given("num")
	private int num;
	// 所属部门等级
	@Given("deptLevel")
	private String deptLevel;
	// 所在部门排名
	@Given("rank")
	private int rank;

	@Result
	private Response response;

	@When
	public boolean when() {
		return num==1;
	}

	@Then
	public RuleState then() {
		System.out.println("LessRule1被执行......");
		if (deptLevel == "A") {
			this.response = new Response("A", SCORE_A);
		}
		if (deptLevel == "B") {
			this.response = new Response("B", SCORE_B);
		}
		if (deptLevel == "C") {
			this.response = new Response("C", SCORE_C);
		}
		if (deptLevel == "D") {
			this.response = new Response("D", SCORE_D);
		}
		if (deptLevel == "E") {
			this.response = new Response("E", SCORE_E);
		}
		
		return RuleState.BREAK;
	}
}

...... 其他强制分布规则结构依此类同

运行结果:

LessRule5被执行......
Response(level=C, score=95.0)

附图:

猜你喜欢

转载自my.oschina.net/youway/blog/1633951