Mirth java代码有条件地改变一个字段

时间:2013-02-26 05:04:07

标签: javascript e4x hl7 mirth

我正在使用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--;
    }
}

1 个答案:

答案 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;
    }
}