这个流口水规则能不能写得简单一点?

Can this drools rule be written simpler?

我刚开始写 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

上面的 drools 规则有效。但是,对于我正在解决的问题,LHS 似乎有点复杂,所以我的问题是它可以写​​得更简单吗?如果可以,怎么做?

PricingResponse和一个BigDecimal对象插入到KieSession中。在触发规则后,将检索所有 Validation 对象。我认为这是一个非常标准的规则问题。在 PricingResponse 对象中有一个 BigDecimal totalNetPremium 属性和一个 'PaymentTerm paymentTerm' 属性。我想验证 paymentTerm 和 totalNetPremium 的乘积是否大于原始保费的 120%,作为 BigDecimal 插入。 PaymentTerm class 和 enum 有一个 BigDecimal month 属性。

该规则确实不必要地复杂,主要是因为您认为必须将所有 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函数。

我不喜欢使用 "raw" JDK classes 作为事实(此处:BigDecimal)。这些对象没有区别。该值应来自包含 class 的 Policy,而后者又应链接到 PricingResponse.