绩效管理中强制分布经常会用到,如:
如图,部门人数在五人以上适用此表,举例:
张三的部门业绩为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)
附图: