2014-10-28 5 views
0

При попытке использовать ca.uhn.hl7v2.util.Terser для установки пустых полей в конкретном подклассе ca.uhn.hl7v2.model.Message (в этом случае ca .uhn.hl7v2.model.v251.message.ORU_R01), я не получаю сообщений об ошибках во время закрытия .each {}, после чего у объекта сообщения нет заполненных полей.Настройка полей в новом сообщении HL7, обернутом в Terser

hl7Map заполняется на классе конкретизации, со значениями, такими как: Защиту hl7Map = [ "HL7MessageFields": [ 'PID-3-1': "внутренний порядок карта ключ", 'PID-3-4':» внутренний порядок карта ключ», и т.д.]]

код ниже:.

защиту buildHL7Message (заказ) {

def date = new Date() 
    def format = new SimpleDateFormat(hl7Map["dateFormat"]).format(date) 

    //Set date on the Message Header Object 
    hl7Map["MSH"]["-7"]= format 

    def message = (context.getModelClassFactory().getMessageClass(hl7Map["MessageInstantiationMap"]["messageType"], 
                    hl7Map["MessageInstantiationMap"]["version"], 
                    true) as Class).newInstance() 
    Terser terser = new Terser(message) 

    hl7Map["HL7MessageFields"].each{ 
     terser.set(it.key, order[it.value]) 
    } 

    println message 

    return message 

}

конец метода г выходы без вывода и ошибки, регистрируемые в кодировке, MSH-1 является обязательным полем, деминератором канала, но пустым. Если в приведенном выше коде используется message.initQuickstart («ORU», «R01», «T»), заполняются только поля по умолчанию initQuickstart.

Если hl7Map ["HL7MessageFields"] содержит «it.key», который не является допустимым полем «Группа/Сегмент», ошибка регистрируется terser, что ему не удалось найти значение, приведенный выше код с правильно отформатированной картой не вызывает ошибку.

Может кто-нибудь объяснить, почему я еще не получаю ошибок, но мое сообщение пустое, и помочь мне заполнить сообщение соответствующим terser.set (params)?

ответ

1

Нашел решение, которое сработало для меня после нескольких часов поиска.

Внутреннее представление объекта сообщения имеет структуру, подобную дереву, где сегмент MSH является родительским, а сегменты, расположенные после сегмента MSH, являются дочерними сегментами. Из-за этого структурирования поля MSH должны быть установлены как мой исходный код, но поля дочерних сегментов должны быть установлены с помощью «/». (например, «PID-3-1» должно быть «/.PID-3-1» в строке terser.set().

Формат hl7Map был обновлен для лучшей поддержки этого термина. set() синтаксические требования

Из документации по термину/указывает, что поиск должен начинаться с корня сообщения, а из ответа на ссылку списка адресов HAPI, которую я сейчас потерял, указывает, что поиск должен включать дочерние элементы MSH

Полный код ниже:.

защиту buildHL7Message (заказать) {

def date = new Date() 
    def format = new SimpleDateFormat(hl7Map["dateFormat"]).format(date) 

    //Set date on the Message Header Object 
    hl7Map["MSH"]["-7"]= format 

    //See http://stackoverflow.com/questions/576955/groovy-way-to-dynamically-invoke-a-static-method 
    //And 
    //http://stackoverflow.com/questions/7758398/groovy-way-to-dynamically-instantiate-a-class-from-string 

    def message = (context.getModelClassFactory().getMessageClass(hl7Map["MessageInstantiationMap"]["messageType"], 
                    hl7Map["MessageInstantiationMap"]["version"], 
                    true) as Class).newInstance() 
    Terser terser = new Terser(message) 

    hl7Map["MSH"].each{ 
     terser.set("MSH"+it.key, it.value) 
    } 
    hl7Map["HL7MSHChildSegmentMap"].each{ 
     terser.set(("/."+it.key) as String, order[it.value] as String) 
    } 

    println message 

    return message 
}