3

我有一个设置为 Web 服务侦听器的 Mirth 通道,它接收一个 ID,构建一个 HL7 查询消息并发送此查询并最终返回一个 HL7 响应。

  • 频道名称:查询频道
  • 源连接器类型:Web 服务侦听器
  • 目标连接器名称:QueryToVista
  • 目标连接器类型:LLP 发件人。

这是我从查询中收到的典型 HL7 响应如下:

MSH|~|\&|VAFC RECV|FACILITY|VAFC TRIGGER||20121011141136-0800||ADR~A19|58269|D|2.4|||NE|NE|USA
MSA|AA|1234|
QRD|20121011051137|R|I|500000001|||1^ICN|***500000001***|ICN|NI|
EVN|A1|20121004064809-0800||A1|0^^^^^^^^USVHA\\0363^L^^^NI^TEST FACILITY ID\050\L|20121004064809-0800|050
PID|1|500000001V075322|500000001V075322^^^USVHA\\0363^NI^VA FACILITY ID\050\L~123123123^^^USSSA\\0363^SS^TEST FACILITY ID\050\L~9^^^USVHA\\0363^PI^VA FACILITY ID\050\L||JOHN^DOE^^^^^L|""|19800502|M||""|""^""^""^""^""^^P^""^""~^^""^""^^^N|""|""|""||S|""||123123123|||""|""||||||""||
PD1|||SOFTWARE SERVICE^D^050
ZPD|1||||||||||||||||""

如果我将 Source 的 Response From 参数设置为QueryToVista ,我可以获得以上所有内容

但是,我只想从上述消息中返回值500000001 。我试图在 QueryChanel 目的地中使用转换器但没有成功。

更新:

我尝试在同一通道中的 QueryToVista 连接器之后添加一个 javascriptwriter 连接器,如下所示:

   var destination = responseMap.get('QueryToVista');
   var responseMessage = destination.getMessage();

   //Fails with following error: TypeError: Cannot read property "QRD.4" from undefined
   var customack = ResponseFactory.getSuccessResponse(responseMessage['QRD']['QRD.4']  ['QRD.4.1'].toString())**


   //work but send the whole HL7 message
   var customack = ResponseFactory.getSuccessResponse(responseMessage.toString())**


   responseMap.put('Barcode', customack);

我似乎根本无法使用正常的转换来检索元素。谢谢你。

4

2 回答 2

3

您走在正确的轨道上,但您的更新说明了几个问题。但是,您使用两个目的地的基本方法是有效的,只要在“摘要”选项卡上选中“同步通道”即可。

第一期

在您的示例中,您要解析的 HL7 响应采用管道分隔的 HL7 形式。为了使用 E4X 表示法访问元素(例如 responseMessage['QRD']['QRD.4']['QRD.4.1']),您必须首先将其转换为 E4X XML 对象。这可以分两步完成。

  • 将管道分隔的 HL7 字符串转换为 XML 字符串。
  • 将 XML 字符串转换为 E4X XML 对象

在 JavaScript Writer 的 Javascript 转换器中(不是 Javascript Writer 脚本本身)

var response = responseMap.get("QueryToVista");
var responseStatus = response.getStatus();

// Get's the pipe delimited HL7 string
var responseMessageString = response.getMessage();

if (responseStatus == "SUCCESS")
{
    // converts the pipe delimited HL7 string into an XML string
    // note: the SerializeFactory object is available for use in transformer
    //       scripts, but not in the Javascript destination script itself
    var responseMessageXMLString = SerializerFactory.getHL7Serializer(false,false,true).toXML(responseMessageString);

    // convert the XML string into an E4X XML object
    var responseMessageXMLE4X = new XML(responseMessageXMLString);

    // grab the value you want
    var ack_msg = responseMessageXMLE4X['QRD']['QRD.4']['QRD.4.1'].toString();

    channelMap.put('ack_msg', ack_msg)
}
else
{
    // responseStatus probably == "FAILURE" but I'm not sure of the full range of possibilities
    // take whatever failure action you feel is appropriate
}

编辑* *

我不相信存在问题 2。在查看了您自己的方法之后,我进一步进行了一些操作,并且相信我已经确认您的方法对于生成 SOAP 响应确实是正确的。我正在编辑此部分以反映仍然有效的更简单的代码。

在 Javascript 编写器脚本中

var barcode = channelMap.get('ack_msg');
var mirthResponse = ResponseFactory.getSuccessResponse(barcode);
responseMap.put('Barcode', mirthResponse);
于 2012-10-16T21:28:21.030 回答
0

非常感谢csj,

我玩弄了我的工作并查看了您的解决方案,您指出了我的瓶颈问题以及 XML 部分,我没有意识到您必须按照新的 XML 将其转换为 XML,而您已经调用 toXML 函数:)

这是我的脚本,虽然很基本,但我认为我会将其发布给任何发现它在路上有用的人。

var destination = responseMap.get('QueryToVista');
var responseMessage = destination.getMessage();
var Xmsg = new XML(SerializerFactory.getHL7Serializer().toXML(responseMessage));

var xml_msg = '<?xml version="1.0" encoding="utf-8" ?>'+
              '<XML><Patient Name="'+Xmsg['PID']['PID.5']['PID.5.1']+
              '" Barcode="'+Xmsg['QRD']['QRD.8']['QRD.8.1']+'" /></XML>';

var sResp = ResponseFactory.getSuccessResponse(xml_msg)

responseMap.put('Response', sResp);
于 2012-10-17T20:43:46.177 回答