FHIR in Action

原文链接:FHIR Messages – part2

FHIR Messages – part 2 FHIR 消息:第二篇——V2 消息与 FHIR 消息的工作流程和架构

译者注:消息是医疗信息交换的一种重要模式,从HL7 V2 V3到X12等。对于已经应用了HL7 V2 消息的系统来讲,如何迁移到 FHIR 消息中来,是我们接下来要探讨的话题. 由于原文是2014年10 06日撰写的,但是FHIR Dstu在过去的日子里发生了较大的变化,所以我根据最新的版本对原文中的一些内容进行了修正。 本文以放射学影像报告为例,说明 了系统如何从V2消息转换FHIR 消息的整个流程

整体流程说明

在第一篇里面我们给了一个简单的例子,演示了 V2 消息和FHIR 消息的字段间的具体映射关系,这篇里着重探讨一下工作流程和架构相关的一些内容。

本文中仍然沿用第一篇中的放射学报告的例子来进行说明.

FHIR 消息架构中介绍了消息架构的前提条件和消息交换的模式,这里不在赘述。

简易的架构图如下所示:

消息处理器接受源系统发送的V2消息,将其转换成FHIR消息提交至 ‘Mailbox’服务器节点,该服务器节点处理之后将反馈给消息处理器一个FHIR 消息,消息处理器紧接着将该FHIR 消息转换成 V2消息反馈给源系统。整个架构中我们认为系统间的通信是异步的,但mailbox服务器内部的处理是同步的。

“Server Mailbox” 也就是实际上存储 Observation 的服务器。接口‘mailbox’负责处理消息。 图中 Patient and Provider的存储是与“Server Mailbox” 分离的,但实际上可能是同一个。

假设Message Processor 到 mailbox 服务器间是同步的 HTTP 请求,整体流程总结如下:

  • RIS系统生成一条v2 消息将其发送给消息处理器.
  • 消息处理器根据映射关系生成FHIR 消息,转至‘Mailbox’服务器节点。要给bundle and MessageHeader分配ID(MessageHeader.identifier表示的是业务层面上该消息的标识符,而bundle ID 指的就是这一条消息 这个bundle资源自身的标识)
  • ‘Mailbox’服务器节点根据MessageHeader.event code的值识别出具体的消息类型,完成预设的处理。这里也就是完成数据存储。
  • 在处理完成之后,‘Mailbox’服务器节点新建一个反馈消息,也就是新建一个bundle(分配唯一的bundle.id),其中包含了另一个MessageHeader,MessageHeader中包含了服务器节点的信息也有自己的标识符,其中response元素的值表示它是哪条消息的响应消息(类似于V2中的 ACK消息)。并将反馈消息发送给消息处理器。response元素包含如下元素:
    • an identifier – 也就是请求消息的MessageHeader.identifier。该字段在同步模式下不是必要的,异步模式则是必须存在。
    • a code 表示处理的结果
    • a details是一个OperationOutcome资源,表示错误的具体信息
  • 消息处理器收到反馈消息后,根据它构建一条HL7 V2 ACK消息
  • 消息处理器将ACK消息反馈给RIS系统.

    HTTP 状态码反映了处理的结果。

架构方面的考虑因素

  • Patient & Provider 在哪里存储? 如果和Observation没有存在同一个服务器上,就需要消息处理器负责构建新的Patient & Provider 资源(‘Mailbox’服务器节点能够做的话就另说了)。
  • 消息处理器与‘Mailbox’服务器节点如何通信?可以是同步,或者异步。如果是异步的话, MessageHeader.response.identifier字段必须赋值。
  • 消息处理器如何管理错误,比如消息映射过程中或者是'Mailbox’服务器节点返回的处理错误

Server Mailbox 方面的考虑因素

  • ‘Mailbox’服务器节点是本地存储 Observation还是存储到其他服务器上
  • 如果Patient & Provider resources是存储在‘Mailbox’服务器节点本地的,‘Mailbox’服务器能够新建资源,处理好引用。
  • 如果Patient & Provider resources是存储在其他服务器上,‘Mailbox’服务器能够进行查询并在外部服务器上新建资源。
  • 处理存储数据之外,‘Mailbox’服务器是否还要完成其他处理,比如有新的待评审结果时发送通知
  • 在返回的bundle中‘Mailbox’服务器是否应包含已更新的Observation数据。

策略方面的问题

  • Patient & Provider资源的标识符查询的命名空间是什么?加入V2消息中没有命名空间的话,是否应假设它们就是存储在本地的
  • Patient & Provider如果在本地存储中没有找到该如何处理?到底是报错还是新建,如果是报错的话,该如何管理?
  • 如果多个Patient & Provider拥有同样的标识该如何处理?是报错还是择其一使用?

消息转换方面的问题

  • 消息中source and destination endpoints到底应该是什么,第一篇中我们只是简单的认为消息处理器是发送方,‘Mailbox’服务器是接收方。假如‘Mailbox’服务器能够直接接收其他系统的发送的消息呢?
  • responsible字段该如何赋值?尤其是医嘱和医嘱响应中该怎么使用

总结