当前位置: 首页 > 知识库问答 >
问题:

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

唐昊焜
2023-03-14

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

我的事实是:

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

我需要一条规则,说明患者在过去12个月内进行了2次或以上的D1234手术,然后添加一条警告,说明D1234可能在最后一次D1234服务后的12个月内不在保险范围内。

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

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

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

共有1个答案

后星河
2023-03-14

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

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

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

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、 蓄能器很容易出错,所以我通常会对其进行一些单元测试。上面的代码是在这里徒手编写的,没有在任何地方运行它,因此如果它在没有更正的情况下工作,您可能会很幸运。

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

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

匹配列表中的项目:

4.8.3.3.10.10.10. in和not in中的运算符(复合值限制)

收集匹配事实的列表:

4.8.3.7.3. 条件元素集合

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

4.8.3.7.4.1.累积CE(首选语法)

 类似资料:
  • 我们目前正在将jBPM(7.37.final)规则部署到一个Kie执行服务器,并使用执行服务器自动公开的REST API调用规则。 但是由于一些体系结构的限制,我们不能使用REST API调用规则。该选项是执行一个基于jar(kie服务器客户机或其他)的集成,并从客户机(java应用程序)远程调用执行服务器上的规则。 Virges Vinay

  • 当规则应用程序在KIE服务器上运行时,如何启用规则引擎跟踪/日志记录? 规则应用程序是在工作台中创建的,不包含自定义代码。我能够使用KIE REST API执行规则,但是规则应用程序没有产生预期的结果。 环境: 我尝试了以下步骤: 使用Git在本地克隆工作台项目 将logback.xml添加到项目的根目录 将更改推回到工作台git repo 在工作台项目编辑器视图中添加了日志作为依赖项 更新项目版

  • “Drools骆驼服务器”和“KIE-WB执行服务器”有什么区别?它们是否服务于在远程服务器中执行规则/进程的相同目的?

  • 我有这样的情况,在规则文件中的所有规则必须检查执行。如果我的理解是正确的,文档所说的规则将由引擎任意执行。 我有一个或多个疑问。 > 我在许多地方得到了答案,我必须使用显著性功能来按顺序执行它们。如果我使用显著性,并且我有执行所有规则的要求,它真的会大规模地影响性能吗?如果是,它会如何影响性能,甚至规则引擎也会任意执行所有规则,比如一些随机顺序。 提前谢谢。

  • 我在同一个drl文件中有两个Drools规则,如下所示: 我的想法是用第一条规则处理所有处于临界状态的事件。然后使用第二个规则,如果任何阀门有警报,这是由“如果临界”规则设置的,发送一个短信。 你知道吗?用口水可能吗?

  • 我最近开始研究口水。我只是设计了一个简单的应用程序来更好地理解它。 谢谢。