我有一个Mirth频道,它设置为一个Web服务侦听器,它接收一个ID,构建一个HL7查询消息并发送该查询并最终得到一个HL7响应。
这是我从查询中收到的典型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);
我似乎无法使用常规转换来检索元素。 谢谢。
答案 0 :(得分:3)
您走在正确的轨道上,但您的更新说明了一些问题。但是,只要在“摘要”选项卡上选中“同步通道”,您使用两个目的地的基本方法就是有效的。
在您的示例中,您要解析的HL7响应采用管道分隔的HL7格式。为了使用E4X表示法访问元素(例如,responseMessage ['QRD'] ['QRD.4'] ['QRD.4.1']),您必须先将其转换为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);