我成功地将HL7 V2消息转换为FHIR资源并将它们发布到服务器。然而,让我感到头疼的是我如何避免在更新或重新发布POST时创建重复项的问题。
实施例: 我收到带有PID的V2 ADT_A01消息。#3 = 12345 所以我创建了一个带有标识符
的患者资源 <identifier>
<use value="usual"/>
<label value="MRN"/>
<system value="urn:oid:0.1.2.3.4.5.6.7"/>
<value value="12345"/>
</identifier>
并将其发布到服务器。通过系统和价值确定患者在任何环境中都应该是独一无二的,即使有多个系统将患者送往服务器。
接下来,我收到一条ADT_A08消息,想要更新我的病人 所以我创建了另一个具有上述相同标识符的资源 但如果我将它发布到服务器,我将得到两名患者而不是一名更新的患者。 使用PUT而不是POST不是一种选择,因为PUT要求我提供患者的网址,我不知道我正在尝试处理的V2消息。
Ewout通过条件处理向我推荐了DSTU2交易,它允许我将我的Patient Resource放入Bundle并添加状态“匹配”与搜索属性。 e.g。
<Bundle xmlns="http://hl7.org/fhir" xmlns:xhtml="http://www.w3.org/1999/xhtml">
<id value="20141213205602" />
<type value="transaction" />
<base value="base" />
<entry>
<status value="match" />
<search value="Patient?identifier=urn:oid:0.1.2.3.4.5.6.7|12345" />
<resource>
<Patient>
<id value="myTempIDforInternalReferencingWithinTheBundle"/>
<identifier>
<use value="usual" />
<label value="MRN" />
<system value="urn:oid:0.1.2.3.4.5.6.7" />
<value value="12345" />
</identifier>...
服务器端行为的规范说明:“如果搜索返回一个匹配项,则服务器使用已存在的匹配资源,并忽略提交的资源。” 因此,这应该防止意外地创造相同的患者两次。 但由于肯定的匹配导致服务器忽略了提供的数据,我仍然无法更新我的病人。
当然,我总是可以先通过标识符运行查询,然后通过它的ID更新返回的ressource。但由于服务器显然不将标识符视为唯一约束,因此我无法确定我的搜索是否会产生一个结果。因此,每次服务器返回多个结果时都需要进行人工交互。
长话短说: 系统通过标识符了解患者的建议程序是什么,而不是通过它向fhir服务器提交更新的URL?
致以最诚挚的问候,
西蒙
答案 0 :(得分:2)
这应该可以在不需要交易的情况下运行。服务器应对您的标识符强制执行唯一性。正如您所说,您可以查询A08中的ID,并且您应该始终在响应中返回0或1。如果你不这样做,那么你就是在与一台实施不佳的服务器进行对话。
您还需要考虑特定服务器的使用者在决定是创建(POST)还是更新(PUT)之前甚至不能检查这一点。他们可以将所有A01和A08视为创造。根据我的经验,我已经看到了来自注册系统的流,这些流可能不按顺序到达。如果客户端在ID上找不到匹配项,则可以合理地为A08发送创建,但是一个行为良好的客户端也应该在获得A01时检查现有资源。
在任何情况下,REST事务都是无状态的,服务器应该能够处理客户端发送的任何内容。
在您描述的方案中,如果您尝试使用相同的ID创建新的Patient资源,则服务器应检测到该资源已存在。并且它应该通过冲突响应(HTTP状态409)失败,并且在OperationOutcome中包含一个原因,该原因指出具有该ID的患者资源已经存在,以及该资源的URL。这将指示您应该再次尝试,使用A08中的数据更新引用的Patient资源。