2013-02-26 2 views
3

Я использую Mirth для чтения сообщений HL7 из нашей БД и отправки их в ЭМИ клиента. Для этого конкретного EMR требуется, чтобы OBR и OBX для встроенного PDF форматировались определенным образом. Если OBR.4.1 и OBR.4.2 имеют «0PDF^PDF Report», нам необходимо вставить «^ PDFReport^PDF^Base64» в OBX.5.1, OBX.5.2 и OBX.5.3, как показано в примере ниже.Mirth java код для условного изменения поля

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

Ваш код не соответствует вашему описанию, что вы пытаетесь сделать. Вы говорите, что, когда сегмент OBR имеет определенные значения, вы хотите установить определенные значения в OBX. Однако, глядя на ваш код, становится ясно, что вы сравниваете значения между OBR и OBX. – csj

+0

Добавьте этот вопрос к http://area51.stackexchange.com/proposals/51758/healthcare-it. Мы пытаемся получить сайт обмена стеками Healthcare, и это будет прекрасный вопрос. – ChronoFish

ответ

3

Основная проблема заключается в том, что ваш код предполагает, что сегменты OBR и OBX всегда будут отображаться попарно.

OBR|1|... 
OBX|1|... 
OBR|2|... 
OBX|1|... 
OBR|3|... 
OBX|1|... 

Однако, как только вы бежите в случае, когда число ОБР и 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 не идентично или, даже если число IS идентично, если сегменты не отображаются строго чередующимся образом, тогда нет никакой гарантии, что 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; 
    } 
} 
+0

Точно! Это то, чего он не видел. Он должен перебирать все OBR в сообщении и извлекать соответствующие данные, а затем переходить на OBX. +1 – Sid

+1

Если это помогло кому-то в реальном мире, тогда у нас все будет хороший день. – csj

Смежные вопросы