文章
· 三月 14 阅读大约需 5 分钟

使用 FHIR 适配器在旧系统上提供 FHIR 服务 - 发布资源

在上一篇文章中,我们了解了如何恢复存储在特定 HIS 数据库中的资源,因此今天我们将了解如何在 HIS 中添加新记录,其来源是我们在系统中收到的 FHIR 资源。

FHIR 的 CRUD 操作

FHIR 的主要功能之一是通过 Rest API 支持 CRUD 操作,这意味着任何使用 FHIR 的系统都必须提供对 GET、POST、PUT 和 DELETE 类型的 HTTP 调用的支持。在今天的文章中,我们将了解如何管理对安装 FHIR 适配器时自动配置的端点的 POST 调用。

如果我们回顾资源存储调用的 FHIR 规范,我们会发现它告诉我们,用于调用的 URL 必须遵循以下格式:

http(s)://server_url/{endpoint}/{Resource}

在我们的示例中,我们将不使用安全调用,因此我们的 URL 将如下所示:

http://localhost:52774/Adapter/r4/Patient

由于我们想要记录新患者,因此我们必须在调用正文中使用患者数据进行 POST 调用。在我们的例子中,调用格式将是 application/fhir+json,不过我们也可以使用XML格式的application/fhir+xml,不会有任何问题。

保存患者资源

在上一篇文章中我们已经看到了Patient资源的定义,所以这里不再重复,我们将看到的是我们格式化的测试患者是什么样子的。这将是我们的病人:

 { "resourceType" : "Patient" , "address" : [ { "city" : "SALAMANCA" , "line" : [ "CALLE LAMENTOS 2 1ºA" ], "postalCode" : "45021" } ], "birthDate" : "1988-01-23" , "gender" : "F" , "identifier" : [ { "type" : { "text" : "NHC" }, "value" : "803987" }, { "type" : { "text" : "DNI" }, "value" : "87654321F" } ], "name" : [ { "family" : "SANZ LÓPEZ" , "given" : [ "REBECA" ] } ], "telecom" : [ { "system" : "phone" , "value" : "699850017" }, { "system" : "email" , "value" : "rebek1988@hotmail.com" } ] }

正如您所看到的,它是一个 Patient 类型的资源,我们将它从Postman发送到服务器端点:

太棒了,我们已经收到了 200,并且我们的患者已在我们的 HIS 中注册,让我们看看我们的患者表的样子:

这样,Rebeca 就完美地在 HIS 中记录了我们在 POST 请求响应中收到的标识符。现在,让我们进入生产系统,看看我们的 FHIR 消息在 IRIS 中的传输路径。

在IRIS 中使用患者资源

到目前为止,我们已经了解了如何将 FHIR 资源发送到服务器的端点,下面让我们看看如何转换接收到的 FHIR 资源并将其插入到我们特定的 HIS 中。

请记住我们是如何配置生产系统的:

我们的消息将通过InteropService到达,并转发到ProcessFHIRBP,其中FromAdapterToHIS将被调用来执行相应的操作。现在让我们看看接收到的消息的踪迹。

在这里我们可以看到收到的消息的详细信息,如您所见,我们已经收到了对 Patient 端点的 HTTP POST请求,我们还看到QuickStreamId有一个值,表明我们的消息包含在Stream中。

我们的 BO 将如何处理此消息?

 elseif (requestData.Request.RequestPath [ "Patient" ) { if (requestData.Request.RequestMethod = "POST" ) { If requestData.QuickStreamId '= "" { Set quickStreamIn = ##class (HS.SDA3.QuickStream). %OpenId (requestData.QuickStreamId,, .tSC) set dynamicPatient = ##class ( %DynamicAbstractObject ). %FromJSON (quickStreamIn) set sc = ..InsertPatient (dynamicPatient, .response) } } elseif (requestData.Request.RequestMethod = "GET" ) { set patientId = $Piece (requestData.Request.RequestPath, "/" , 2 ) set sc = ..GetPatient (patientId, .response) } }

非常简单,利用从接收到的请求中获得的信息,我们可以将信息重定向到适当的方法,我们要验证这是一个来自患者资源的特定请求,并且方法是 POST,因此我们将恢复存储信息的流,并将其转换为 %DynamicObject,下面我们将从 InsertPatient 方法中处理它,让我们看看该方法的代码:

 Method InsertPatient(dynamicPatient As %DynamicAbstractObject , Output patient As Adapter.Message.FHIRResponse) As %Status { Set tSC = $$$OK kill pResp set pResp= $$$NULLOREF set sqlInsert= "INSERT INTO his.patient (name, lastname, phone, address, city, email, nhc, postal_code, birth_date, dni, gender) values (?,?,?,?,?,?,?,?,?,?,?)" //perform the Insert set tSC = ..Adapter .ExecuteUpdate(.nrows, sqlInsert, dynamicPatient. %Get ( "name" ). %Get ( 0 ). %Get ( "given" ). %Get ( 0 ), dynamicPatient. %Get ( "name" ). %Get ( 0 ). %Get ( "family" ), dynamicPatient. %Get ( "telecom" ). %Get ( 0 ).value, dynamicPatient. %Get ( "address" ). %Get ( 0 ). %Get ( "line" ). %Get ( 0 ), dynamicPatient. %Get ( "address" ). %Get ( 0 ). %Get ( "city" ), dynamicPatient. %Get ( "telecom" ). %Get ( 1 ).value, dynamicPatient. %Get ( "identifier" ). %Get ( 1 ).value, dynamicPatient. %Get ( "address" ). %Get ( 0 ). %Get ( "postalCode" ), dynamicPatient. %Get ( "birthDate" ), dynamicPatient. %Get ( "identifier" ). %Get ( 2 ).value, dynamicPatient. %Get ( "gender" )) set sql= "SELECT id, name, lastname, phone, address, city, email, nhc, postal_code, birth_date, dni, gender FROM his.patient WHERE nhc = ?" //perform the Select set tSC = ..Adapter .ExecuteQuery(.resultSet, sql, dynamicPatient. %Get ( "identifier" ). %Get ( 1 ).value) If resultSet.Next() { set personResult = { "id" :(resultSet.GetData( 1 )), "name" : (resultSet.GetData( 2 )), "lastname" : (resultSet.GetData( 3 )), "phone" : (resultSet.GetData( 4 )), "address" : (resultSet.GetData( 5 )), "city" : (resultSet.GetData( 6 )), "email" : (resultSet.GetData( 7 )), "nhc" : (resultSet.GetData( 8 )), "postalCode" : (resultSet.GetData( 9 )), "birthDate" : (resultSet.GetData( 10 )), "dni" : (resultSet.GetData( 11 )), "gender" : (resultSet.GetData( 12 )), "type" : ( "Patient" )} } else { set personResult = {} } //create the response message do patient.Resource.Insert(personResult. %ToJSON ()) Return tSC }

好吧,正如您所看到的,我们做的第一件事是在 HIS 的 Patient 表上执行插入(我们假设有人之前已确保该患者不存在),插入完成后,我们将在同一个表来获取为该患者生成的标识符,并能够将其返回给向我们发送请求的客户端应用程序。为了完成响应消息,我们可以恢复我们认为最相关的字段。

恢复患者数据后,我们将返回到我们的 BP,它将执行必要的转换以生成我们可以返回给客户端的患者类型资源。

可以参考上一篇文章中的改造。

生成资源后,我们会将其转换为 Stream,将其包含在响应中并将其返回给客户端应用程序:

正如您所看到的,这非常简单,我们只需从患者资源中检索数据并将其插入到相应的表中即可。最后,我们将以与 GET 请求相同的方式返回注册的对象。

在下一篇文章中,我们将了解如何处理捆绑包或一组资源。感谢您的关注!

讨论 (0)1
登录或注册以继续