在Drools中写入规则-条件和

在Drools中写入规则-条件和,drools,rule-engine,accumulate,Drools,Rule Engine,Accumulate,我一直在为一个特定的问题陈述写规则。 我有一个excel文件,其中包含id、专业、薪水列。专业可以取“肿瘤学”、“泌尿学”等值。我必须计算每个专业对应的总工资。 有两种方法可以做到这一点 第一: rule "Total salary of Oncology" no-loop lock-on-active salience 100 when $m : Masterclass( $id : phyid , $p : p,spec=="Oncology") not Ma

我一直在为一个特定的问题陈述写规则。 我有一个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 
规则“肿瘤科总工资”
无回路
锁定活动
突出100
什么时候
$m:Masterclass($id:phyid,$p:p,spec==“肿瘤学”)
非大师级(等级==“肿瘤学”,phyid<$id)
$total:Number()来自累计(Masterclass($salary:salary,spec==“肿瘤学”),
初始值(双倍合计=0;),
行动(总额+=$SALLAY;),
结果(新的双倍(总数)))
然后
System.out.println($m.getSpec());
System.out.println(“总目标薪酬为:+$Total+”,专业:+$m.getSpec());
收回(百万美元);
结束
其他专业也一样。 这条规则行得通

第二: 只写一条规则,读取专业的价值,然后汇总相应的工资。 我试图实现这一点,但没有成功。
任何帮助都将不胜感激。

这还远远不够完美。但是请注意,您不必插入特定的字符串。不管怎样,在没有字符串匹配的情况下运行规则将生成所有特殊项目的累计金额

你应该把字符串包装成一个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 
规则“触发器读取”
什么时候
不是字符串()
然后
String s=按任意方式读取();
插入(s);
结束;
规则“某物的总工资”
什么时候
$spec:String()
$m:Masterclass($id:phyid,spec==$spec)
非主类(spec=$spec,phyid<$id)
$total:Number()来自
累积(大师级($salary:salary,spec==$spec),
初始值(双倍合计=0;),
行动(总额+=$SALLAY;),
结果(新的双倍(总数)))
然后
System.out.println($m.getSpec());
System.out.println(“总目标薪酬为:+$Total+
“o专业:+$m.getSpec());
收回($spec);
结束
“读取”从何处开始?你的键盘?档案?白板;-)?