文章
Qiao Peng · 四月 25 阅读大约需 12 分钟

InterSystems互操作进阶 - 第一篇:InterSystems流程自动化与工作流引擎

InterSystems流程自动化与工作流引擎

 

InterSystems工作流程引擎的主要功能    2

使用InterSystems工作流程引擎    3

场景描述    3

环境配置与测试    5

任务管理    15

任务API和自定义任务用户界面    16

展望    17

15

 

集成平台除了集成业务系统,打通数据与业务流程外,另一个核心的功能就是流程自动化(BPA)。

流程自动化涉及几个重要的特性:

  1. 流程建模
  2. 流程协同
  3. 决策自动化
  4. 低代码工作流程自动化
  5. 任务协同与任务管理

其中第4和5点都是和工作流程相关的。

 

什么是工作流程(Workflow)?它和业务流程(Business Process)有何区别?为何集成平台要涉及对工作流程的管理?

工作流程是对人工工作任务的流程及其各操作步骤之间业务规则的抽象、概括描述。所以它针对的是人工工作任务,而非业务系统的接口。业务流程与工作流不同,业务流程描述的是特定的业务在各个IT系统间和人工任务间的流程过程和业务抽象。也就是说业务流程范围比工作流程大,是包括工作流程的。

为何要在集成平台里提供工作流程建模和管理的能力?其实医院的所有业务系统都是执行人工任务的,例如医生在HIS中给患者录入诊断、下达医嘱。但并非所有的人工任务和流程在现有的业务系统中都有,例如越来越多的辅助决策系统会提供给医护人员决策建议,这些建议需要医护人员确认才能被采纳。这些辅助决策系统需要被集成平台持续集成:拿到辅助决策的上下文数据,并实时反馈决策建议给业务系统。但它的决策建议缺很难集成进业务系统的工作流程中,这涉及对业务系统的改造 – 改造现有业务系统的流程和用户界面,时间和费用成本高昂。随着辅助决策使用的范围与深度的扩大,通过改造业务系统以纳入对不断涌现的辅助决策支持内容变得越发难以为继。

工作流程引擎可以帮助解决这样的需求,快速满足业务流程优化和再造的需要,创造持续集成的价值。

InterSystems工作流程引擎的主要功能

InterSystems IRIS数据平台、Health Connect医疗集成平台和Ensemble集成平台都内建有工作流引擎。工作流程引擎具有以下功能:

  1. 任务角色和用户管理 – 对工作任务的角色定义和角色用户的管理
  2. 任务抽象与建模 – 对工作任务的上下文数据模型和任务动作的建模
  3. 任务列表 – 对任务进行管理的
  4. 任务分配 – 对工作任务进行分配与管理,例如按什么顺序分配任务?任务退回后如何重分配?
  5. 任务流程建模和自动化 – 通常工作流程是业务流程的一部分,按业务流程图建立工作流程模型,并自动化执行
  6. 任务门户 – 提供给用户的任务界面,用以查看、接受、执行或退回任务
  7. 任务API – 提供给第三方系统用以集成的任务查询、接受、执行、退回的API

 

       InterSystems数据平台提供了一个针对工作任务的标准业务操作类 -EnsLib.Workflow.Operation,将这个业务操作加入到业务流程即可。它有对应的任务请求消息 –EnsLib.Workflow.TaskRequest 任务响应消息 - EnsLib.Workflow.TaskResponse。这些类都无需修改,直接使用。

使用InterSystems工作流程引擎

场景描述

       我们以一个简化的示例为例,说明如何使用工作流。这个示例不需要写代码,完全通过图形化工具和配置工具完成。场景如下:

       医生通过医生站下达药嘱后,药嘱发送给药房系统。现在医院上了一套基于机器学习的药品知识库,通过患者的年龄信息、诊断和药嘱,判断药嘱是否有风险。但药房系统尚无法与药品知识库做流程集成,因此我们用InterSystems工作流来做对药剂师的药嘱风险进行提示。整体业务流程图如下:

       

 

       医生站会发出HL7 V2的药嘱消息OMG_O19,药房系统也接受HL7 V2的药嘱消息OMG_O19。而药品知识库提供服务,需要的请求消息,包含患者诊断、药嘱,并返回警告级别和警告内容。

我们的用例中,医生为控制患者血压开了美托洛尔,但患者有糖尿病,美托洛尔是β受体阻滞剂药物,会影响血糖和血脂的代谢。因此药品知识库会给出药品风险提示。

环境配置

  1. 演示环境安装和配置

初始的演示环境在这里下载

将它导入您的IRIS或HealthConnect平台,如果还没有IRIS,可以下载免费的社区版

导入后,会看到有Demo.BP.Workflow这个非常简单的业务流程:

             

              Production中只有一个业务服务,用来通过文件接收HL7 V2消息,默认的接收文件目录是 C:\Temp\hl7v2\,处理过的HL7文件会保存在C:\Temp\hl7v2\Archive。请配置这2个目录到你本地的可用且有权限的目录。

下载包中提供了样例HL7 V2消息文件,测试时,将其拷贝到接收文件目录即可。

  1. 现在我们增加“药剂师复核”的工作任务

向Production中增加操作,弹出页面中:

  • 类名称 选择 EnsLib.Workflow.Operation
  • 操作名称 可以填写“药剂师
  • 自动创建角色 选择 。这样系统会自动检查任务角色名称,如果没有“药剂师”任务角色,会自动帮我们创建

  1. 修改业务流程,增加对药剂师角色的任务流程调度

将“待实现药剂师任务”的<empty>流程节点删除,并在原节点上增加“调用(<call>)”流程节点。选择目标为“药剂师”业务操作;取消选中“异步”;给它的名称设置为“提示药剂师药品风险”。

  1. 配置药剂师任务

4.1配置任务请求消息 – 应选择EnsLib.Workflow.TaskRequest。这个消息中有这些属性:

%Actions字符串类型,用来让用户执行的操作,如果有多个操作,用逗号分隔。这里我们给药剂师二个操作选项:"取消药嘱,忽略提示"。

%Subject: 字符串类型,任务的主题。今后可用于任务的分析、分配。这里我们设置为"药嘱风险处理"。

%Message字符串类型,任务的描述。这里我们不赋值。

%Priority: 整数型,任务优先级,1为最高,默认值为3。我们将任务优先级设置为药品风险级别: context.DrugAlertLevel。

%UserName字符串类型,用于指定任务分配到的具体用户。这里我们计划分配给角色,而不是具体的用户(药剂师),因此不用赋值。

%Title字符串类型,任务的名称。它和主题不同,是任务的具体名称。这里我们不赋值。

%TaskHandler字符串类型,任务句柄,设置为响应消息的类名。不用设置。

%Command字符串类型,用于向任务句柄传递参数。不用设置。

%FormTemplate 字符串类型,用于设置用户自定义任务界面的CSP网页名。不用设置。

%FormFields字符串类型,用于设置任务用户界面的显示项目名称,多个显示项目名称间用逗号分隔。我们需要显示患者姓名、药品名称、患者诊断、药品风险级别和药品风险信息,设置为"患者姓名,药品名称,患者诊断,药品风险级别,药品风险"。

%FormValues字符串数组类型,对应%FormFields每个显示项目的值。%FormValues的下标(Key)就是对应的%FormFields的每个显示项目的名称。

其中Key为"患者姓名"的数据从请求HL7消息的PID段的PatientName字节获取,因此值设置为request.{PIDgrp.PID:PatientName};

Key为"药品名称"的数据从上下文变量context的Msg4DrugDB属性的Drug属性中获取,因此值拖拽为context.Msg4DrugDB.Drug;

Key为"患者诊断"的数据从上下文变量context的Msg4DrugDB属性的Diagnoses属性中获取,因此值拖拽为context.Msg4DrugDB.Diagnoses;

Key为"药品风险级别"的数据从上下文变量context的DrugAlertLevel属性中获取,因此值拖拽为context.DrugAlertLevel;

Key为"药品风险"的数据从上下文变量context的DrugAlert属性中获取,因此值拖拽为context.DrugAlert。

4.2配置任务响应消息 – 应配置为EnsLib.Workflow.TaskResponse。这个消息中有这些属性:

%Action记录了药剂师完成任务时选择了哪个操作。我们需要将它保存到上下文中。直接拖拽callresponse的%Action到context的PharmacistDecision:

%Priority任务优先级,是从任务请求消息拷贝来的。我们无需处理它。

%UserName记录哪个用户执行了该任务。我们需要将它保存到上下文中。

%UserTitle记录执行该任务的用户头衔。我们无需处理它。

%UserRanking记录执行该任务的用户在该角色组中的排序。我们无需处理它。

%RoleName记录执行该任务的角色名称。我们无需处理它。

%Subject任务的主题,是从任务请求消息拷贝来的。我们无需处理它。

%Message任务的描述,是从任务请求消息拷贝来的。我们无需处理它。

%Actions用来让用户执行的操作,是从任务请求消息拷贝来的。我们无需处理它。

%FormTemplate用户自定义任务界面的CSP网页名,是从任务请求消息拷贝来的。我们无需处理它。

%FormFields任务用户界面的显示项目名称,是从任务请求消息拷贝来的。我们无需处理它。

%FormValues任务用户界面的项目值。我们无需处理它。

%Status任务状态,用于查询任务状态。我们无需处理它。

%TaskStatus任务状态,用于工作流引擎分配和管理任务。我们无需处理它。

  1. 添加业务流程分支,以响应药剂师不同的任务执行结果

在“提示药剂师药品风险”流程节点后面增加对任务执行结果判断,这里需要用“分支<branch>”,而不是“if” -  “分支<branch>”可以返回到任何的“标签<label>”节点。

对“分支<branch>”节点,需要设置其条件标签,在满足条件时转到标签继续执行。因此条件设置为药剂师没有选择“取消医嘱”: context.PharmacistDecision'="取消医嘱";标签选择“药房”。

 

  1. 编译并启动Production

祝贺大家看到这里了,主要工作已经完成,我们没有写任何一行代码、完全通过配置,已经有了如下完整的业务流程图,保存并编译它。

启动Production。

  1. 配置工作流角色与工作流用户

启动Production后,系统会自动帮助我们创建“药剂师”工作流角色。可以到管理门户>Interoperability>管理>工作流>工作流角色 确认。

现在要增加一个工作流用户。可以使用你正在使用的IRIS账户作为药剂师用户账户。在管理门户>Interoperability>管理>工作流>工作流用户 页面中选择你的IRIS账户,我这里选择的是SuperUser;并给他一个全名,然后保存。

 

然后将这个工作流用户加入“药剂师”工作流角色:在工作流角色管理界面点击添加,在用户名中选中刚才创建的工作流用户,其它不用选中,点击确定。现在我们有了可用于测试的工作流用户。

 

  1. 测试

现在我们开始测试:

8.1 检查一下Production是否处于启动状态;然后将示例HL7 V2文件拷贝到接收HL7目录,应该看到这个文件很快就消(处)失(理)了。

8.2登录到任务门户:以药剂师用户帐号登录到管理门户>Analytics>用户门户>工作流收件箱。

可以看到有一个新的“药嘱风险处理”任务,“已分配给”字段时空的,也就是说这个给药剂师角色的人物还没有分配给任何用户。

8.3 这时,我们是看不到任务详情的,但有一个“接受”按钮。点击它就会接受该任务。当任务被接受,其他用户就看不到该任务了。

 

现在,就可以看到任务详情了:我们设置的任务上下文信息,例如患者姓名、药品名称、药品风险提示都可以看到了。同时,页面上面有4个按钮,其中2个“取消药嘱”、“忽略提示”是我们设置给药剂师的操作。

另外2个按钮是什么?

用户接受了、或被分配了任务,但可以点击“放弃”以退回任务,这样任务又称为“未分配”状态,其他用户就可以看到它并点击“接受”以接受任务。

保存”是用于未完成任务,但中途需要保存信息时使用。例如任务需要用户书写记录,记录书写到一半离开去忙别的事情,可以点击“保存”以保存已经书写的内容。注意,这时任务并没有完成。

 

8.4 现在我们让药剂师忽略药嘱风险提示,点击“忽略提示”继续发药流程。

8.5 现在让我们回顾一下完整的业务流程:

在可视化追踪中查看刚才的业务,我们可以看到业务流程按照设计,在药品知识库有提示的情况下,启动了药剂师药嘱风险决策支持任务,并在药剂师忽略提示后,将药嘱发送给药房系统。

 

 

          大家可以更改一下药剂师的决策,看看流程有什么变化。

 

任务管理

     平台管理员可以查看、分配、重分配、修改优先级和取消任务。

       以管理员身份登录到管理门户>Interoperability>管理>工作流>工作流任务,可以查看包括完成的任务在内的所有任务,并可按不同的条件排序。

       如果要分配任务,在“用户名”中选择要分配给的用户;

     如果要调整任务优先级,选择“优先级”;

如果要取消任务,选中“是否取消”选择框,即可取消。

另外,任务管理员可以将已取消或已完成的任务重新激活。

 

 

任务API和自定义任务用户界面

       前面介绍了工作流建模、使用工作流门户管理工作任务。如何使用自己的应用或界面管理工作流任务?

       有几种方法:

  1. 管理门户是网页,它可以被嵌入到其它应用中。即其它应用可以直接通过单点登录,登录到管理门户进行操作。
  2. 使用InterSystems平台的任务管理API,然后自己开发任务用户界面或直接在自己的应用中调用。

 

我个人推荐方法2:

社区里有一篇非常棒的文章,介绍任务管理API和如何使用这些API和Angular进行自定义的任务用户界面开发。

其中任务管理API可以在此下载

自定义任务管理界面可以在此下载

 

展望

现在的IT应用都是“复合应用”:当今所有应用系统建设即不是原来的纯单体应用开发项目、也不是仅与其它系统整合的集成项目,而是一个复合应用项目 – 每个新业务都需要快速开发并和别的应用集成。

InterSystems工作流引擎为人工工作流程建模提供了低代码/免代码开发的支持。同时,它也赋能复合应用开发:

  1. 使用InterSystems工作流和业务流程建模、自动化机器学习引擎或第三方机器学习引擎,可以将基于机器学习的辅助决策支持整合到业务流程中,形成决策过程闭环和机器学习优化闭环。
  2. 基于InterSystems工作流,可以将传统编码开发实现的人工工作流程开发通过低代码的业务流程建模方式实现,赋能业务团队高度参与到业务流程梳理、建模与优化中;它将业务流程逻辑与用户界面分离,从而提高业务团队参与度、降低开发成本、快速满足业务进化需求、提高架构灵活性。
2
2 138
讨论 (0)1
登录或注册以继续