-1

我最近在流口水中遇到了以下情况。我想知道如何为此进行规则设计。

Class Emp{
 beingDate:Date
 endDate:Date
}

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

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

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

为这种情况设计规则的最佳方法是什么。

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

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

该规则应给出以下总和:

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

1 回答 1

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 端调用该方法并更新每个规则上的对象。

希望这可以帮助。

于 2013-10-09T20:32:21.993 回答