在这种情况下,如何将Java代码与Drools规则分开?
这就是我在Drools中所做的场景 有一个Java对象-在这种情况下,如何将Java代码与Drools规则分开?,java,drools,Java,Drools,这就是我在Drools中所做的场景 有一个Java对象-PricingDetails,包含表示服务的对象列表(servicedools) 每个ServiceDrools都有以下字段: 服务(编号) 服务类别(数目) 比率 我需要做的是根据每个servicedools的信息更改每个服务的费率,例如: 如果ServiceDrools具有服务112和类型9,或服务159和类型4,则对ServiceDrools应用5%的折扣 我的做法是: rule "Test- service type 9, se
PricingDetails
,包含表示服务的对象列表(servicedools
)
每个ServiceDrools
都有以下字段:
- 服务(编号)
- 服务类别(数目)
- 比率
servicedools
的信息更改每个服务的费率,例如:
如果ServiceDrools
具有服务112和类型9,或服务159和类型4,则对ServiceDrools
应用5%的折扣
我的做法是:
rule "Test- service type 9, service 112 + service type 4, service 159"
lock-on-active
when
$detail : PricingDetails()
$services : ArrayList( size > 1 ) from collect(
ServiceDrools( (serviceType == 9 && service == 112) ||
(serviceType == 4 && service == 159) )
from $detail.getServices()
)
then
modify( $detail ){
setCostServices($services, .05);
}
end
在第一部分中,对象PricingDetails
获取它包含的服务列表,循环查找列出的服务。符合条件的服务存储在变量$services
中
然后通过调用函数setCostServices($services.05)
修改PricingDetails
对象,该函数具有以下代码:
public void setCostServices(ArrayList<ServiceDrools> serviciosProcesar,
Double porcentajeDescuento){
Double suma = 0D;
for (ServicioDrools s: serviciosProcesar)
suma += s.getTarifa();
Double nuevaTarifa = suma - (suma * porcentajeDescuento);
for (ServicioDrools s: serviciosProcesar)
s.setTarifa( nuevaTarifa );
}
public void setCostServices(ArrayList服务流程,
双瓷器(德斯库托){
双suma=0D;
适用于(服务流程s:serviciosProcesar)
suma+=s.getTarifa();
双纽瓦塔里法=苏马-(苏马*瓷器);
适用于(服务流程s:serviciosProcesar)
s、 setTarifa(nuevaTarifa);
}
如何改进代码?
如何将Java代码与Drools规则分开
谢谢。方法setCostServices在哪里定义?我不确定您想做什么。至少在您提供的描述中,Java和DRL并没有不寻常的混合。唯一值得关注的是,规则的LHS是否正在使用Java代码调用执行复杂的逻辑。在本例中,setCostServices函数位于RHS上,因此这不是一个问题。我看到的唯一问题是setCostServices函数看起来不像所描述的那样工作。它并没有对每种服务费率给予5%的折扣。它将每项服务的费率设置为低于所有服务费率总和的5%。提供的代码是一个Java方法,而规则似乎将其作为DRL函数调用。所有这些都让我觉得提供的代码根本不起作用。