From JCFWiKi
|
|
- 산출물: JCF3.0™ Rule Engine - 룰 언어 rule 작성 가이드
- 작성자: 고경철
- 작성일 : 2007/12/04
- 버전 : 0.9
- 개정이력 :
|
[편집] rule language
[편집] 예제
[편집] 인사급여 로직 뽑아내기
[편집] model
- 이름, 기본급, 근속년수, 결혼유무, 자녀수, 직급, 평가
[편집] Rule#1
- 근속년수에 따른 근속 수당을 매월 지급
- 근속년수 1~5년 : 근속년수 * 5000원 - 1000원
- 근속년수 6~10년 : 근속년수 * 6000원 - 2000원
- 근속년수 11~15년 : 근속년수 * 7000원 - 3000원
- 근속년수 16~20년 : 근속년수 * 8000원 - 5000원
- 근속년수 21년 : 정액 170,000원
[편집] Rule#2
- 가족수당(결혼 유무 , 자녀수)
- 배우자 10,000원 자녀1명당 5,000 최대 자녀 3명까지
- 배우자 없는데 자녀 있는경우 자녀 1명당 10,000 최대 자녀 3명까지
[편집] Rule#3
- 직급수당
- 대리 20,000
- 과장 30,000
- 차장 40,000
- 부장 50,000
[편집] Rule#4
- 평가에 따른 보너스 지급
- 평가 A : 500,000
- 평가 B : 400,000
- 평가 C : 300,000
- 평가 D : 200,000
- 직급 차장 이하만 보너스 지급 (부장은 지급 안함)
[편집] rule script로 구현된 룰
package jcf.showcase.employee.service
import java.lang.Object;
import java.lang.String;
import java.util.*;
import jcf.showcase.employee.model.Employee
import jcf.showcase.employee.service.EmployeeService
import java.io.InputStreamReader;
import java.io.BufferedReader;
//expander payScriptWithDSL.dsl
/*
근속년수에 따른 근속 수당을 매월 지급
* 근속년수 1~5년 : 근속년수 * 5000원 - 1000원
* 근속년수 6~10년 : 근속년수 * 6000원 - 2000원
* 근속년수 11~15년 : 근속년수 * 7000원 - 3000원
* 근속년수 16~20년 : 근속년수 * 8000원 - 5000원
* 근속년수 21년 : 정액 170,000원
*/
rule "year"
agenda-group "year"
no-loop
//salience 80
when
e : Employee ( year >=1)
then
if (e.getYear() >= 1 && e.getYear() <= 5){
e.setBasicpay(e.getBasicpay() + (e.getYear() * 6) - 1);
System.out.println(e.getName() +":"+ "근속수당(근속1등급)" + e.getBasicpay());
String log ="근속수당 적용(근속1등급)" + e.getBasicpay();
e.message.add(log);
}
else if
(e.getYear() >= 6 && e.getYear() <= 10){
e.setBasicpay(e.getBasicpay() + (e.getYear() * 6) - 2);
System.out.println(e.getName() +":"+ "근속수당 적용(근속2등급)" + e.getBasicpay());
String log ="근속수당 적용(근속2등급)" + e.getBasicpay();
e.message.add(log);
}
else if
(e.getYear() >= 11 && e.getYear() <= 15){
e.setBasicpay(e.getBasicpay() + (e.getYear() * 7) - 3);
System.out.println(e.getName() +":"+ "근속수당 적용(근속3등급)" + e.getBasicpay());
String log = "근속수당 적용(근속3등급)" + e.getBasicpay();
e.message.add(log);
}
else if
(e.getYear() >= 16 && e.getYear() <= 20){
e.setBasicpay(e.getBasicpay() + (e.getYear() * 8) - 5);
System.out.println(e.getName() +":"+ "근속수당 적용(근속4등급)" + e.getBasicpay());
String log ="근속수당 적용(근속4등급)" + e.getBasicpay();
e.message.add(log);
}
else if
(e.getYear() == 21){
e.setBasicpay(e.getBasicpay() + 170);
System.out.println(e.getName() +":"+ "근속수당 적용(근속5급)" + e.getBasicpay());
String log ="근속수당 적용(근속5등급)" + e.getBasicpay();
e.message.add(log);
}
end
/*
* 가족수당(결혼 유무 , 자녀수)
o 배우자 있고 자녀1명당 5,000 최대 자녀 3명까지
o 배우자 없는데 자녀 있는경우 자녀 1명당 10,000 최대 자녀 3명까지
*/
rule "family-1"
agenda-group "family"
no-loop
when
e : Employee (children > 0, children <=3, marry =="Y")
then
e.setBasicpay(e.getBasicpay() + (e.getChildren() * 5));
String log ="(배우자 유 + 자녀(3명이하))" + e.getBasicpay();
e.message.add(log);
end
rule "family-2"
agenda-group "family"
no-loop
when
e : Employee (children > 0, children <=3, marry =="N")
then
e.setBasicpay(e.getBasicpay() + (e.getChildren() * 10));
String log ="(배우자 무 + 자녀(3명이하))" + e.getBasicpay();
e.message.add(log);
end
rule "Marry"
agenda-group "Marry"
no-loop
when
e : Employee (marry =="Y")
then
e.setBasicpay(e.getBasicpay() + 10);
String log ="가족수당-배우자" + e.getBasicpay();
e.message.add(log);
end
rule "notMarry"
agenda-group "Marry"
no-loop
when
e : Employee (marry =="N")
then
e.setBasicpay(e.getBasicpay() + 5);
String log ="미혼수당" + e.getBasicpay();
e.message.add(log);
end
/*
* 직급수당
o 대리 20,000
o 과장 30,000
o 차장 40,000
o 부장 50,000
*/
rule "level"
agenda-group "level"
no-loop
when
e : Employee (level >= 1 , level <= 4)
then
if (e.getLevel() ==1){
e.setBasicpay(e.getBasicpay() + 20);
System.out.println(e.getName() +":"+ "직급수당(대리)" + e.getBasicpay());
String log ="직급수당(대리)" + e.getBasicpay();
e.message.add(log);
}
else if
(e.getLevel() == 2){
e.setBasicpay(e.getBasicpay() + 30);
System.out.println(e.getName() +":"+ "직급수당(과장))" + e.getBasicpay());
String log ="직급수당(과장)" + e.getBasicpay();
e.message.add(log);
}
else if
(e.getLevel() == 3){
e.setBasicpay(e.getBasicpay() + 40);
System.out.println(e.getName() +":"+ "직급수당(차장))" + e.getBasicpay());
String log ="직급수당(차장)" + e.getBasicpay();
e.message.add(log);
}
else if
(e.getLevel() == 4){
e.setBasicpay(e.getBasicpay() + 50);
System.out.println(e.getName() +":"+ "직급수당(부장))" + e.getBasicpay());
String log ="직급수당(부장)" + e.getBasicpay();
e.message.add(log);
}
end
/*
평가에 따른 보너스 지급
* 평가 A : 500,000
* 평가 B : 400,000
* 평가 C : 300,000
* 평가 D : 200,000
* 직급 차장 이하만 보너스 지급 (부장은 지급 안함)
*/
rule "point"
agenda-group "point"
no-loop
when
e : Employee (point >=1 , point <=4)
then
if (e.getPoint() == 1){
e.setBasicpay(e.getBasicpay() + 500);
System.out.println(e.getName() +":"+ "보너스(평가 A)" + e.getBasicpay());
String log ="보너스(평가 A)" + e.getBasicpay();
e.message.add(log);
}
else if
(e.getPoint() == 2){
e.setBasicpay(e.getBasicpay() + 400);
System.out.println(e.getName() +":"+ "보너스(평가 B)" + e.getBasicpay());
String log ="보너스(평가 B)" + e.getBasicpay();
e.message.add(log);
}
else if
(e.getPoint() == 3){
e.setBasicpay(e.getBasicpay() + 300);
System.out.println(e.getName() +":"+ "보너스(평가 C)" + e.getBasicpay());
String log ="보너스(평가 C)" + e.getBasicpay();
e.message.add(log);
}
else if
(e.getPoint() == 4){
e.setBasicpay(e.getBasicpay() + 200);
System.out.println(e.getName() +":"+ "보너스(평가 D)" + e.getBasicpay());
String log ="보너스(평가 D)" + e.getBasicpay();
e.message.add(log);
}
end