2013-10-08 2 views
-1

Недавно я столкнулся с нижеприведенным сценарием в drools. Я хочу знать, как приступить к созданию правила для этого.расчет в jboss drools

Class Emp{ 
beingDate:Date 
endDate:Date 
} 

Правила для определения годового дохода работника, исходя из заданных дат:

  • за период до 3/5/2003 почасовой ставка составляет $ 3,5 и годовой множитель 2100
  • Даты после 3/5/2003 почасовая ставка изменяется каждый год (данные) и годовой множитель составляет 2092.

Возможны сценарии, в которых дата начала до 3/5/2003, а дата окончания - тер 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 году до 5/5/2003)/(общее количество дней в 2003 году) * 2100
  4. (2003 час) * (количество дней в 2003 году af ter 3/5/2003)/(общий №. дней в 2003 году) * ==> Обратите внимание на изменение годового мультипликатора ..
  5. (2004 почасовой ставки) * 2092
  6. (2005 почасовой ставки) * (нет. дней в 2005 году до 5/10/2005)/(общее количество дней в 2005 году) * 2092
+0

Вы пробовали что-нибудь? –

+0

Во втором случае, в каком формате указаны данные, которые повлияют на почасовую ставку? Это может повлиять на лучшее решение. – kaskelotti

+0

@JAndy его в основном указано в текстовом документе как таблица. Думаю, это должно быть в таблице решений. Однако не в состоянии прийти к конкретному подходу. – Srik

ответ

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 } 
} 

И в вашей стороне РИТ вызвать метод и обновления объекта на каждом правиле.

Надеюсь, это поможет.

+0

Спасибо. Достаточно близко ответить ... – Srik