我正在使用Mirth从我们的数据库中读取HL7消息并将它们发送到客户端的EMR。此特定EMR要求嵌入式PDF的OBR和OBX以特定方式格式化。如果OBR.4.1和OBR.4.2有“0PDF ^ PDF报告”,我们需要在OBX.5.1,OBX.5.2和OBX.5.3中插入“^ PDFReport ^ PDF ^ Base64”,如下例所示。
OBR|2||13PS061163CYT|0PDF^PDF Report|
OBX|1|ED|0PDF^PDF Report|1|^PDFReport^PDF^Base64^JVBERi0xLjMNJf////
我们目前使用的代码99%的时间都可以使用,但似乎在特定报告类型上有所突破。特别是当OBR比OBX更多的时候。
任何帮助解决此问题将不胜感激。我们目前使用的代码如下。
for (var i=0;i<msg['OBX'].length();i++ ){
var Access=msg['OBR'][i]['OBR.3']['OBR.3.1'].toString()
var Report=msg['OBX'][i]['OBX.5']['OBX.5.1'].toString()
var ID=msg['OBR'][i]['OBR.2']['OBR.2.1'].toString()
if(msg['OBX'][i]['OBX.3']['OBX.3.1'].toString() == Access + ".PDF"){
msg['OBX'][i]['OBX.3']['OBX.3.1'] = "0PDF"
msg['OBX'][i]['OBX.3']['OBX.3.2'] = "PDF Report"
msg['OBX'][i]['OBX.5']['OBX.5.1'] = ID
msg['OBX'][i]['OBX.5']['OBX.5.2'] = "PDFReport"
msg['OBX'][i]['OBX.5']['OBX.5.3'] = "PDF"
msg['OBX'][i]['OBX.5']['OBX.5.4'] = "Base64"
msg['OBX'][i]['OBX.5']['OBX.5.5'] = Report
i--;
}
}
答案 0 :(得分:3)
问题的关键在于您的代码假定OBR和OBX段始终成对出现。
OBR|1|...
OBX|1|...
OBR|2|...
OBX|1|...
OBR|3|...
OBX|1|...
但是,一旦遇到OBR和OBX段的数量不匹配或者没有严格交替出现的情况,事情就会开始破坏。
OBR|1|... oh oh, this obr is followed by two obx segments
OBX|1|...
OBX|2|...
OBR|2|... oh oh, this obr isn't followed by an obx segment at all.
OBR|3|...
OBX|1|...
您需要先了解以下代码行的含义。
var obrSegments = msg['OBR'];
var obxSegments = msg['OBX'];
在这个例子中,obrSegments是一个数组,你猜对了,obr段。同样,obxSegments是一个obxSegments数组。这些数组都没有构建出任何关于obx段相对于obr段的定位的意识。
如果您可以保证消息中的obr段和obx段始终以严格交替的方式出现,那么您可以保证obrSegments [i]和obxSegments [i]始终是顺序的。
另一方面,如果obr和obx段的数量不相同,或者,即使数量相同,如果段不以严格交替的方式出现,则不能保证obrSegments [ i]紧随其后的是obxSegments [i]。
你的问题的措词不是100%明确。但是,我推断,无论何时检查OBR的内容,您都希望有条件地更改紧随其后的所有obx段的内容。
我推荐更像这样的东西。
var obrSegments = msg['OBR'];
// iterate through the OBR segments
for each (var obr in obrSegments) {
// extract the field components that you need from this OBR
// don't assume I've done this correctly. The text of your
// question didn't match your example code, so I don't exactly know what you need
var OBR4_1 = obr['OBR.4']['OBR.4.1'];
var OBR4_2 = obr['OBR.4']['OBR.4.2'];
// now iterate through the OBX segments that immediately follow this OBR.
// This is a bit tricky to do, but here's how I approach the problem
// you need an XML list of all the segments, not just the current OBR
var segments = obr.parent().children();
// you need to know the current OBR's index in the segments list
var obrIndex = obr.childIndex();
// theoretically, at this point, obr should refer to exactly the same
// data as segments[obrIndex]
// to do the actual OBX iteration:
var nextIndex = obrIndex + 1;
while (nextIndex < segments.length()) {
var nextSegment = segments[nextIndex];
var nextSegmentType = nextSegment.localName();
if (nextSegmentType == 'OBX') {
var obx = nextSegment;
// Bearing in mind that I haven't tested this code and have just been spewing it
// off into my web browser,
// you can now be confident that variable obx refers to one of the obx
// segments immediately following variable obr.
if (OBR4_1 == blah blah blah) {
obx['OBX.5']['OBX.5.1'] = blah blah blah;
obx['OBX.5']['OBX.5.2'] = blah blah blah;
}
else {
// looks like we've finished processing all the OBX segments for the current
// obr, time to break out of the inner loop.
break;
}
++nextIndex;
}
}