Написание правила в Drools - условная сумма
Я застрял в написании правила для конкретной постановки задачи. У меня есть файл Excel, содержащий столбцы ID, специальности, зарплаты. Специальность может принимать значения, такие как "онкология","урология" и т. Д. Я должен рассчитать общую зарплату, соответствующую каждой специальности. Есть два способа сделать это.
Первый:
rule "Total salary of Oncology"
no-loop
lock-on-active
salience 100
when
$m : Masterclass( $id : phyid , $p : p,spec=="Oncology")
not Masterclass( spec=="Oncology", phyid < $id)
$total : Number() from accumulate ( Masterclass( $salary : salary ,spec=="Oncology") ,
init( double total =0;),
action(total+=$salary;),
result( new Double (total)))
then
System.out.println($m.getSpec());
System.out.println("Total target pay is : " + $total + " of specialty : "+ $m.getSpec());
retract($m);
end
И аналогично для других специальностей. Это правило отлично работает.
Второе: напишите только одно правило, которое считывает значение специальности, а затем суммирует заработную плату, соответствующую ему. Я пытался реализовать это, но безуспешно. Любая помощь будет оценена.
1 ответ
Это далеко не идеально. Но обратите внимание, что вам не нужно вставлять какую-то конкретную строку. Выполнение правила без соответствующей строки приведет к накоплению сумм по всем специальностям.
И вы должны обернуть String в класс Java - мне было просто лень изобретать правильный класс Java с одним полем.
rule "trigger read"
when
not String()
then
String s = read_any_way_you_want();
insert( s );
end;
rule "Total salary of something"
when
$spec: String()
$m : Masterclass( $id: phyid , spec == $spec)
not Masterclass( spec == $spec, phyid < $id)
$total : Number() from
accumulate ( Masterclass($salary: salary, spec == $spec) ,
init( double total =0;),
action(total+=$salary;),
result( new Double (total)))
then
System.out.println($m.getSpec());
System.out.println("Total target pay is : " + $total +
" o specialty : "+ $m.getSpec());
retract($spec);
end