From JCFWiKi
|
|
- 산출물: JCF3.0™ Rule Engine - xml방식 rule 작성 가이드
- 작성자: 고경철
- 작성일 : 2007/12/04
- 버전 : 0.9
- 개정이력 :
|
[편집] rule language
[편집] 룰 파일 TAG
- import
- 자바의 import와 동일하게 룰 파일 내에서 사용할 클래스를 명시
- java:functions
- 룰 파일에서 사용될 함수. 자바의 메소드와 동일하다.
- rule
- 하나의 규칙을 표현. 룰을 실행할 때 필요한 파라미터, 실행 조건 그리고 조건 충족시 실행될 코드로 구성된다.
- 여기서 가장 중요한 태그는 rule 태그이다. rule 태그는 하나의 룰을 표현해주는 태그로서 다음의 3가지로 구성된다.
- parameter
- 룰을 실행하는 데 필요한 파라미터 값. identifier 속성을 사용해서 룰에서 사용할 파라미터의 이름을 지정한다.
- java:condition
- java:consequence
[편집] 예제
[편집] 인사급여 로직 뽑아내기
[편집] 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
- 직급 차장 이하만 보너스 지급 (부장은 지급 안함)
[편집] xml로 구현된 룰
<?xml version="1.0" encoding="euc-kr" ?>
<rule-set name="Hello"
xmlns="http://drools.org/rules"
xmlns:java="http://drools.org/semantics/java"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:schemaLocation="http://drools.org/rules rules.xsd
http://drools.org/semantics/java java.xsd">
<import>java.lang.Object</import>
<import>java.lang.String</import>
<import>javacan.drools.test.Employee</import>
<rule name="role">
<parameter identifier="employee1">
<class>Employee</class>
</parameter>
<java:condition>employee1.getYear() >= 1 </java:condition>
<java:consequence>
<![CDATA[
if (employee1.getYear() >= 1 && employee1.getYear() <= 5){
employee1.setBasicpay(employee1.getBasicpay() + (employee1.getYear() * 5000) - 1000);
System.out.println(employee1.getName() +":"+ "Role1-1 적용(근속1등급)" + employee1.getBasicpay());
}
else if
(employee1.getYear() >= 6 && employee1.getYear() <= 10){
employee1.setBasicpay(employee1.getBasicpay() + (employee1.getYear() * 6000) - 2000);
System.out.println(employee1.getName() +":"+ "Role1-2 적용(근속2등급)" + employee1.getBasicpay());
}
else if
(employee1.getYear() >= 11 && employee1.getYear() <= 15){
employee1.setBasicpay(employee1.getBasicpay() + (employee1.getYear() * 7000) - 3000);
System.out.println(employee1.getName() +":"+ "Role1-3 적용(근속3등급)" + employee1.getBasicpay());
}
else if
(employee1.getYear() >= 16 && employee1.getYear() <= 20){
employee1.setBasicpay(employee1.getBasicpay() + (employee1.getYear() * 8000) - 5000);
System.out.println(employee1.getName() +":"+ "Role1-4 적용(근속4등급)" + employee1.getBasicpay());
}
else if
(employee1.getYear() == 21){
employee1.setBasicpay(employee1.getBasicpay() + 170000);
System.out.println(employee1.getName() +":"+ "Role1-5 적용(근속5급)" + employee1.getBasicpay());
}
]]>
</java:consequence>
</rule>
<rule name="role-1">
<parameter identifier="employee1">
<class>Employee</class>
</parameter>
<java:condition>employee1.getChildren() >= 0</java:condition>
<java:consequence>
if (employee1.getMarry().equals("Y")){
employee1.setBasicpay(employee1.getBasicpay() + (employee1.getChildren() * 5000));
System.out.println(employee1.getName() +":"+ "(배우자 유 + 자녀)" + employee1.getBasicpay());
}
else if
(employee1.getMarry().equals("N")){
employee1.setBasicpay(employee1.getBasicpay() + (employee1.getChildren() * 10000));
System.out.println(employee1.getName() +":"+ "(배우자 무 + 자녀)" + employee1.getBasicpay());
}
</java:consequence>
</rule>
<rule name="rule-2">
<parameter identifier="employee1">
<class>Employee</class>
</parameter>
<java:condition>employee1.getMarry().equals("Y")</java:condition>
<java:consequence>
employee1.setBasicpay(employee1.getBasicpay() + 10000);
System.out.println(employee1.getName() +":"+ "가족수당-배우자" + employee1.getBasicpay());
</java:consequence>
</rule>
<rule name="Rule3 직급수당">
<parameter identifier="employee1">
<class>Employee</class>
</parameter>
<java:condition>employee1.getLevel() >= 1 </java:condition>
<java:condition>4 >= employee1.getLevel() </java:condition>
<java:consequence>
if (employee1.getLevel() ==1){
employee1.setBasicpay(employee1.getBasicpay() + 20000);
System.out.println(employee1.getName() +":"+ "Role2 적용(대리))" + employee1.getBasicpay());
}
else if
(employee1.getLevel() == 2){
employee1.setBasicpay(employee1.getBasicpay() + 30000);
System.out.println(employee1.getName() +":"+ "Role2 적용(과장))" + employee1.getBasicpay());
}
else if
(employee1.getLevel() == 3){
employee1.setBasicpay(employee1.getBasicpay() + 40000);
System.out.println(employee1.getName() +":"+ "Role2 적용(차장))" + employee1.getBasicpay());
}
else if
(employee1.getLevel() == 4){
employee1.setBasicpay(employee1.getBasicpay() + 50000);
System.out.println(employee1.getName() +":"+ "Role2 적용(부장))" + employee1.getBasicpay());
}
</java:consequence>
</rule>
<rule name="Rule4 보너스">
<parameter identifier="employee1">
<class>Employee</class>
</parameter>
<java:condition>employee1.getPoint() >= 1 </java:condition>
<java:condition>4 >= employee1.getPoint() </java:condition>
<java:condition>3 >= employee1.getLevel() </java:condition>
<java:consequence>
if (employee1.getPoint() == 1){
employee1.setBasicpay(employee1.getBasicpay() + 500000);
System.out.println(employee1.getName() +":"+ "보너스(평가 A)" + employee1.getBasicpay());
}
else if
(employee1.getPoint() == 2){
employee1.setBasicpay(employee1.getBasicpay() + 400000);
System.out.println(employee1.getName() +":"+ "보너스(평가 B)" + employee1.getBasicpay());
}
else if
(employee1.getPoint() == 3){
employee1.setBasicpay(employee1.getBasicpay() + 300000);
System.out.println(employee1.getName() +":"+ "보너스(평가 C)" + employee1.getBasicpay());
}
else if
(employee1.getPoint() == 4){
employee1.setBasicpay(employee1.getBasicpay() + 200000);
System.out.println(employee1.getName() +":"+ "보너스(평가 D)" + employee1.getBasicpay());
}
</java:consequence>
</rule>
</rule-set>