1

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

我的事实是:

  • 患者 - 患者信息列表。
  • 服务 - 以前执行的服务。(即:serviceCode=D1234,datePerformed=Date)
  • 警报 - (alertName = "X 射线 2/12 个月期间")

我需要一条规则,说明患者在过去 12 个月内执行了 2 次或多次 D1234 时,然后添加一条警告,说明 D1234 可能直到最后一次 D1234 服务日期后 12 个月才被保险覆盖。

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

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

有人可以帮助我了解如何编写我需要的规则吗?

4

1 回答 1

4

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

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

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

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

同样,您可以添加对日期或其他属性的约束。

维护代码组的一种有效机制是插入组成员资格事实。电子表格或网络决策表可以轻松完成此操作,或者您可以查询数据库并通过 API 插入它们。IE

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

nb - 累加器很容易出错,所以我通常会围绕它们进行一些单元测试。上面的代码是在这里徒手编写的,没有在任何地方运行它,所以如果它在没有更正的情况下工作,你可能会很幸运。

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

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

列表中的匹配项:

4.8.3.3.10.10。in 和 not in 的运算符(复合值限制)

收集匹配事实的列表:

4.8.3.7.3。条件元素收集

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

4.8.3.7.4.1。累积 CE(首选语法)

于 2013-10-23T11:47:38.020 回答