计算服务执行次数的Drools规则?

计算服务执行次数的Drools规则?,drools,Drools,我是个新来的流口水的人,我正在尝试为牙齿保险申请设计一些规则。根据之前执行的服务的历史记录,系统基本上会让用户知道他们将要执行的程序可能不在保险范围内。它还将有其他规则,可能是基于年龄的,但我可以处理这些规则 我的事实是: 患者-患者信息列表 服务-以前执行的服务。(即:服务代码=D1234,执行日期=日期) 警报-(alertName=“X射线2/12个月期间”) 我需要一条规则,说明当患者在过去12个月内进行了2次或2次以上的D1234检查时,,然后添加一条警告,说明D1234可能在最后

我是个新来的流口水的人,我正在尝试为牙齿保险申请设计一些规则。根据之前执行的服务的历史记录,系统基本上会让用户知道他们将要执行的程序可能不在保险范围内。它还将有其他规则,可能是基于年龄的,但我可以处理这些规则

我的事实是:

  • 患者-患者信息列表
  • 服务-以前执行的服务。(即:服务代码=D1234,执行日期=日期)
  • 警报-(alertName=“X射线2/12个月期间”)
我需要一条规则,说明当患者在过去12个月内进行了2次或2次以上的D1234检查时,,然后添加一条警告,说明D1234可能在最后一次D1234检查后的12个月内不在保险范围内

使情况进一步复杂化的是,可能存在以同样方式受到限制的代码组。因此,规则中列出的代码可能是一个代码数组,而不仅仅是一个代码,但规则仍需要激发

我可以编写一个服务来获取所有已执行的服务,然后就这样做,但我认为最好是将所有事实(以前的服务等)都放到Drools中,然后让它全部完成。这样,我可以为每个患者运行一个规则流程,将他们的警报和以前的服务作为事实,结果是一个警告列表


有人能帮助我理解如何编写上面所需的规则吗?

我将向您展示一些需要执行的不同操作的示例,并让您将它们组合成一个在您的应用程序中工作的规则

警告-我没有执行以下示例,因此可能存在错误/打字错误

首先,下面的代码将收集在工作记忆中对每个患者执行的所有服务

rule "Count patient services"
when
    $patient : Patient()
    $serviceList : ArrayList() from collect (
        Service(patientId == $patient.id)
    )
then
    System.out.println("Patient " + $patient.id 
        + " has received " + $serviceList.size() + " services.");
end
当患者接受了2项以上带有特定代码的服务时,以下匹配:

$serviceList : ArrayList( size > 2 ) from collect (
    Service(
        patientId == $patient.id, 
        serviceCode == "D1234"
    )
)
当患者接受了两项以上与代码列表匹配的服务时,以下匹配

$serviceList : ArrayList( size > 2 ) from collect (
    Service(
        patientId == $patient.id, 
        serviceCode in ("D1234", "E5678")
    )
)
以下内容查找最近匹配的服务日期:

accumulate (
    Service(
        patientId == $patient.id, 
        serviceCode in ("D1234", "E5678"),
        $datePerformed: datePerformed
    );
    $mostRecentDate: max($datePerformed)
)
同样,您可以在日期或其他属性上添加约束

维护代码组的有效机制是插入组成员事实。电子表格或web决策表可以轻松做到这一点,或者您可以查询数据库并通过API插入它们。i、 e

insert( new ServiceGroup( "HighCostService", "D1234" ) );
insert( new ServiceGroup( "HighCostService", "D5678" ) );
然后可以使用以下约束进行匹配:

$highCostServices : ArrayList() from accumulate (
        ServiceGroup( group == "HighCostService", $serviceCode ),
        init( ArrayList list = new ArrayList(); ),
        action( list.add($serviceCode); ),
        reverse( list.remove($serviceCode); ),
        result(list)
)
$serviceList : ArrayList( size > 2 ) from collect (
    Service(
        patientId == $patient.id, 
        serviceCode in $highCostServices
    )
)
n、 蓄能器很容易出错,所以我通常会对它们进行一些单元测试。上面的代码是在这里徒手编写的,没有在任何地方运行它,因此如果它在没有更正的情况下工作,您可能会很幸运

有关更多详细信息,请参阅手册:

匹配列表中的项目:

4.8.3.3.10.10。中的运算符和非中的运算符(复合值限制)

收集匹配事实的列表:

4.8.3.7.3。条件元素集合

用于计算集合的最大值、最小值、总和等值的累加器:

4.8.3.7.4.1。累积CE(首选语法)


我将向您展示一些需要执行的不同操作的示例,并让您将它们组合成在应用程序中工作的规则

警告-我没有执行以下示例,因此可能存在错误/打字错误

首先,下面的代码将收集在工作记忆中对每个患者执行的所有服务

rule "Count patient services"
when
    $patient : Patient()
    $serviceList : ArrayList() from collect (
        Service(patientId == $patient.id)
    )
then
    System.out.println("Patient " + $patient.id 
        + " has received " + $serviceList.size() + " services.");
end
当患者接受了2项以上带有特定代码的服务时,以下匹配:

$serviceList : ArrayList( size > 2 ) from collect (
    Service(
        patientId == $patient.id, 
        serviceCode == "D1234"
    )
)
当患者接受了两项以上与代码列表匹配的服务时,以下匹配

$serviceList : ArrayList( size > 2 ) from collect (
    Service(
        patientId == $patient.id, 
        serviceCode in ("D1234", "E5678")
    )
)
以下内容查找最近匹配的服务日期:

accumulate (
    Service(
        patientId == $patient.id, 
        serviceCode in ("D1234", "E5678"),
        $datePerformed: datePerformed
    );
    $mostRecentDate: max($datePerformed)
)
同样,您可以在日期或其他属性上添加约束

维护代码组的有效机制是插入组成员事实。电子表格或web决策表可以轻松做到这一点,或者您可以查询数据库并通过API插入它们。i、 e

insert( new ServiceGroup( "HighCostService", "D1234" ) );
insert( new ServiceGroup( "HighCostService", "D5678" ) );
然后可以使用以下约束进行匹配:

$highCostServices : ArrayList() from accumulate (
        ServiceGroup( group == "HighCostService", $serviceCode ),
        init( ArrayList list = new ArrayList(); ),
        action( list.add($serviceCode); ),
        reverse( list.remove($serviceCode); ),
        result(list)
)
$serviceList : ArrayList( size > 2 ) from collect (
    Service(
        patientId == $patient.id, 
        serviceCode in $highCostServices
    )
)
n、 蓄能器很容易出错,所以我通常会对它们进行一些单元测试。上面的代码是在这里徒手编写的,没有在任何地方运行它,因此如果它在没有更正的情况下工作,您可能会很幸运

有关更多详细信息,请参阅手册:

匹配列表中的项目:

4.8.3.3.10.10。中的运算符和非中的运算符(复合值限制)

收集匹配事实的列表:

4.8.3.7.3。条件元素集合

用于计算集合的最大值、最小值、总和等值的累加器:

4.8.3.7.4.1。累积CE(首选语法)


非常有用。谢谢你花时间做这件事。对代码进行分组的最佳方式是什么,这样我就不需要为每个规则编写代码。许多规则适用于某些代码组。我可以注册一个全局文件,但如果可能的话,我宁愿在.drl文件中定义它。也许可以用另一条规则来做吗?我希望能够做一些类似的事情:服务(BitewingServiceCodes中的serviceCode)我还认为唯一的事实将是患者和针对特定患者的服务。可以理解的是,只有为该患者提供的服务才是事实。您是否也可以为这个例子提供一个更具体的例子?查找最新的服务?非常有用。谢谢你花时间做这件事。对代码进行分组的最佳方式是什么,这样我就不需要为每个规则编写代码。许多规则适用于某些代码组。我可以注册一个全局文件,但如果可能的话,我宁愿在.drl文件中定义它。也许可以用另一条规则来做吗?我希望能够做一些事情,比如:服务(服务代码在BitewingServiceCodes中)我也很瘦