Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在这种情况下,如何将Java代码与Drools规则分开?_Java_Drools - Fatal编程技术网

在这种情况下,如何将Java代码与Drools规则分开?

在这种情况下,如何将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

这就是我在Drools中所做的场景

有一个Java对象-
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函数调用。所有这些都让我觉得提供的代码根本不起作用。