设置Mirth目标以将变换数据作为自定义ACK发回

时间:2012-10-16 17:17:40

标签: mirth mirth-connect

我有一个Mirth频道,它设置为一个Web服务侦听器,它接收一个ID,构建一个HL7查询消息并发送该查询并最终得到一个HL7响应。

  • 频道名称:QueryChanel
  • 源连接器类型: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);

我似乎无法使用常规转换来检索元素。 谢谢。

2 个答案:

答案 0 :(得分:3)

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

第1期

在您的示例中,您要解析的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 Writer脚本中

var barcode = channelMap.get('ack_msg');
var mirthResponse = ResponseFactory.getSuccessResponse(barcode);
responseMap.put('Barcode', mirthResponse);

答案 1 :(得分:0)

非常感谢csj,

我玩了,让我的工作和看你的解决方案,你指出我的瓶颈问题,这是XML部分,我没有意识到你必须按照新的XML将其转换为XML当你已经调用了XML函数时:)

这是我的剧本,虽然基本的我认为我发布的任何人发现它在路上很有用。

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);
相关问题