JCF3.0™ Rule Engine Guide - rule language

From JCFWiKi

Jump to: navigation, search

그림:check.gif

  • 산출물: JCF3.0™ Rule Engine - 룰 언어 rule 작성 가이드
  • 작성자: 고경철
  • 작성일 : 2007/12/04
  • 버전 : 0.9
  • 개정이력 :

목차

[편집] rule language

그림:warning.gif

[편집] 예제

[편집] 인사급여 로직 뽑아내기

그림:forbidden.gif

  • 급여 부분의 수당로직을 몇가지 뽑아냄

[편집] 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