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

时间:2013-10-23 01:35:24

标签: drools

我是Drools的新手,我正在尝试为牙科保险申请设计一些规则。系统将基本上让用户知道他们将要执行的过程何时可能不会被基于先前执行的服务的历史的保险所涵盖。它还有其他规则,可能是基于年龄的,但我可以处理这些规则。

我的事实是:

  • 患者 - 患者信息列表。
  • 服务 - 以前执行的服务。 (即:serviceCode = D1234,datePerformed = Date)
  • 提醒 - (alertName =“Xrays 2/12 Month Period”)

我需要一条规则,说 WHEN 患者在过去12个月内进行了2次或更多次D1234 然后添加警告说D1234可能不是在最后一次D1234服务之日起<12个月之前由保险承保。

使情况更加复杂的是,可能存在以相同方式限制的代码组。因此,规则中列出的代码可能是一个代码数组而不仅仅是一个代码,但规则仍然需要触发。

我可以写一个服务来获取所有执行的服务,就这样做,但我认为将所有事实(以前的服务等)扔进Drools并让它全部工作就更好了。通过这种方式,我可以为每个患者运行一个规则流程,将其警报和先前的服务作为事实,并将结果作为警告列表。

有人可以帮我理解如何编写我上面需要的规则吗?

1 个答案:

答案 0 :(得分:3)

我将向您展示一些您需要做的不同事情的示例,并留给您将它们组合成适用于您的应用程序的规则。

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

首先,以下代码将收集工作记忆中每位患者的所有服务。

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"
    )
)

当患者收到超过2项与代码列表匹配的服务时,以下匹配。

$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插入它们。即。

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.b。 - 累加器很容易出错,所以我通常会对它们进行一些单元测试。上面的代码是在这里徒手写的,无需在任何地方运行,所以如果没有更正的话,你可能会很幸运。

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

  

http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/

匹配列表中的项目:

  

4.8.3.3.10.10。运营商是否进入(复合价值限制)

收集匹配事实的清单:

  

4.8.3.7.3。条件元素收集

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

  

4.8.3.7.4.1。累积CE(首选语法)