以jboss drools计算

时间:2013-10-08 21:42:37

标签: date jboss drools rule-engine

我最近在drools中遇到了以下场景。我想知道如何继续进行规则设计。

Class Emp{
 beingDate:Date
 endDate:Date
}

根据给定日期确定员工年收入的规则:

  • 2003年3月5日之前的日期,小时费率为3.5美元,年度乘数为2100
  • 2003年3月5日之后的日期,每小时费率每年变化(给定数据),年度乘数为2092年。

可能存在开始日期在2003年3月5日之前且结束日期在3/5/2003之后的情况。

为此方案设计规则的最佳方法是什么。

更新:添加了例如为了更清晰 如果对象是

empObj={
  beginDate=10/8/2001, 
  endDate=5/10/2005
}

规则应该给出以下总和:

  1. 3.5 *(2001年10月8日开始的2001年的天数)/(2001年的总天数)* 2100
  2. 3.5 * 2100 ==>这是2002年的一年
  3. 3.5 *(2003年3月5日之前的2003年的天数)/(2003年的总天数)* 2100
  4. (2003小时费率)*(2003年3月5日之后的2003年的天数)/(2003年的总天数)* 2092 ==>注意年度乘数的变化..
  5. (2004小时费率)* 2092
  6. (2005年小时费率)*(2005年10月5日之前的2005天数)/(2005年总天数)* 2092

1 个答案:

答案 0 :(得分:0)

这样做的一种方法是每年制定一条规则。所以它看起来像这样

rule "2001"
when:
   e : Emp( beginDate < "01-Jan-2002" )
then:
   // 1. Get the number of days worked in 2001, probably easiest to do with some Java helper method
   // 2. Calculate the sum
   // 3. Add the sum to some Fact, could be the same Emp fact even
 end

 rule "2002"
 when:
   e : Emp( beginDate < "01-Jan-2003" )
 then:
    // As with 2001
 end

其余规则非常相似,只是相应地更改年度乘数。如果您决定使用Emp对象来保存总和,请添加类似

的方法
class Emp {
  long sum = 0
  void addToSum( long value ) { sum += value }
}

在你的RHS方面调用方法并更新每个规则上的对象。

希望这有帮助。