-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 年 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 年 5 月 10 日より前の 2005 年の日数) / (2005 年の合計日数) * 2092
4

1 に答える 1

0

これを行う 1 つの方法は、1 年に 1 つのルールを設定することです。したがって、次のようになります

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 に答える