我刚开始编写drools规则,并想出了这个:
rule "Premium to high."
when
PricingResponse($netPremium : this.getTotalNetPremium(),
$paymentTerm : this.getPaymentTerm().getMonths());
$newPremium : BigDecimal() from $netPremium.multiply($paymentTerm);
$currentPremium : BigDecimal();
BigDecimal($newPremium.divide($currentPremium, MathContext.DECIMAL128) > 1.2B);
then
insert(new Validation("New premium " + $newPremium + " (" + $netPremium +
" * " + $paymentTerm + ") " +
" is larger than 120% of the current premium " +
$currentPremium, Department.K_EN_A));
end
上面的流氓规则正在起作用。然而,对于我正在解决的问题,LHS似乎有点复杂,所以我的问题是它可以写得更简单吗?如果是这样,怎么样?
PricingResponse
中插入了BigDecimal
和KieSession
个对象。触发规则后,将检索所有Validation
个对象。我认为这是一个相当标准的规则问题在PricingResponse
对象中,有一个BigDecimal totalNetPremium
属性和一个' PaymentTerm paymentTerm'属性。我想验证paymentTerm和totalNetPremium的乘积是否大于原始溢价的120%,它是作为BigDecimal
插入的。 PaymentTerm
班级为enum
,且BigDecimal month
属性为<{1}}。
答案 0 :(得分:1)
规则确实不必要地复杂,主要是因为您认为必须将所有BigDecimal
个对象提取为模式。这是我的第一个提议:
rule "Premium to high."
when
PricingResponse($netPrem: totalNetPremium,
$paymtTerm: paymentTerm)
$currPrem: BigDecimal();
eval( isTooHigh( $netPrem, $paymtTerm.getMonths(), $currPrem ) )
then
除了通过仅使用字段名称省略分号和.this.get...()
之外,我已将笨拙的BigDecimal操作提取到函数中,该函数可以实现为DRL函数或作为静态Java函数导入。
我不喜欢使用“原始”JDK类作为事实(这里:BigDecimal)。这些对象没有区别。此值应来自包含的类,例如Policy,而后者应该与PricingResponse
相关联。