Какая ошибка в следующей кодировке HL7?

Я пытаюсь закодировать сообщение HL7 типа ORU_R01, используя библиотеку HAPI 2.0 для модуля OpenMRS. Я следовал инструкциям, приведенным в документации HAPI, и в соответствии с ними заполнил обязательные поля сообщения ORU_R01. Теперь я хочу опубликовать это сообщение, используя следующую ссылку:

http://localhost:8080/openmrs/remotecommunication/postHl7.form

Я использую следующее сообщение для тестирования:

MSH|^~\&|||||20140713154042||ORU^R01|20140713154042|P|2.5|1
PID|||1
OBR|1||1234^SensorReading|88304
OBX|0|NM|1||45
OBX|1|NM|2||34
OBX|2|NM|3||23

Я надлежащим образом убедился, что все параметры верны. После публикации сообщения HL7 я запускаю задачу HL7 из планировщика. Затем я перехожу на страницу администратора и нажимаю «Управление ошибками HL7», чтобы посмотреть, приходит ли туда сообщение. Я получаю следующую трассировку стека:

 ca.uhn.hl7v2.HL7Exception: HL7 encoding not supported
...


 Caused by: ca.uhn.hl7v2.parser.EncodingNotSupportedException: Can't parse message beginning MSH|^~\
 at ca.uhn.hl7v2.parser.Parser.parse(Parser.java:140)

Полная трассировка стека находится здесь: http://pastebin.com/ZnbFqfWC. Я написал следующий код для кодирования сообщения HL7 (используя библиотеку HAPI):

public String createHL7Message(int p_id, int concept_id[], String val[])
            throws HL7Exception {

    ORU_R01 message = new ORU_R01();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss",
            Locale.ENGLISH);
    MSH msh = message.getMSH();
    msh.getFieldSeparator().setValue("|");
    msh.getEncodingCharacters().setValue("^~\\&");
    msh.getProcessingID().getProcessingID().setValue("P");
    msh.getSequenceNumber().setValue("1");
    msh.getMessageType().getTriggerEvent().setValue("R01");
    msh.getMessageType().getMessageCode().setValue("ORU");
    msh.getVersionID().getVersionID().setValue("2.5");
    msh.getMessageControlID().setValue(
            sdf.format(Calendar.getInstance().getTime()));
    msh.getDateTimeOfMessage().getTime()
            .setValue(sdf.format(Calendar.getInstance().getTime()));


    ORU_R01_ORDER_OBSERVATION orderObservation = message
            .getPATIENT_RESULT().getORDER_OBSERVATION();
    ca.uhn.hl7v2.model.v25.segment.PID pid = message.getPATIENT_RESULT()
            .getPATIENT().getPID();

    Patient patient = (Patient) Context.getPatientService()
            .getPatient(p_id);
    System.out.println(String.valueOf(p_id) + "  " + patient.getGivenName()
            + "  " + patient.getFamilyName());

    pid.getPatientName(0).getFamilyName().getSurname()
            .setValue(patient.getFamilyName());
    pid.getPatientName(0).getGivenName().setValue(patient.getGivenName());
    pid.getPatientIdentifierList(0).getIDNumber()
            .setValue(String.valueOf(p_id));

    System.out.println();
    // Parser parser = new PipeParser();
    // String encodedMessage = null;
    // encodedMessage = parser.encode(message);
    // System.out.println(encodedMessage);

    // Populate the OBR
    OBR obr = orderObservation.getOBR();
    obr.getSetIDOBR().setValue("1");
    obr.getFillerOrderNumber().getEntityIdentifier().setValue("1234");
    obr.getFillerOrderNumber().getNamespaceID().setValue("SensorReading");
    obr.getUniversalServiceIdentifier().getIdentifier().setValue("88304");
    Varies value = null;
    // Varies value[] = new Varies[4];
    for (int i = 0; i < concept_id.length; i++) {
        ORU_R01_OBSERVATION observation = orderObservation
                .getOBSERVATION(i);
        OBX obx2 = observation.getOBX();
        obx2.getSetIDOBX().setValue(String.valueOf(i));
        obx2.getObservationIdentifier().getIdentifier()
                .setValue(String.valueOf(concept_id[i]));
        obx2.getValueType().setValue("NM");
        NM nm = new NM(message);
        nm.setValue(val[i]);

        value = obx2.getObservationValue(0);
        value.setData(nm);
    }
    Parser parser = new PipeParser();
    String encodedMessage = null;
    encodedMessage = parser.encode(message);
    return encodedMessage;

}

По всей вероятности, что-то не так с MSH-сегментом сообщения, но я не могу понять, что именно. Что я могу сделать, чтобы исправить эту ошибку?


person Octavarium    schedule 13.07.2014    source источник


Ответы (1)


Почему вы объявляете символы кодирования с помощью двойной обратной косой черты?

msh.getEncodingCharacters().setValue("^~\\&");

Разве не должно быть:

msh.getEncodingCharacters().setValue("^~\&");

... и, поскольку в вашем сообщении используются символы кодировки по умолчанию, возможно, вам вообще не нужно их объявлять? Выдержка из класса HAPI MSH ссылка

получить ENCODINGCHARACTERS

public ST getENCODINGCHARACTERS()
Returns MSH-2: "ENCODING CHARACTERS" - creates it if necessary

Обновление У меня нет опыта работы с HAPI. Быстрый поиск в Google нашел пример ORU. Не могли бы вы попробовать инициализировать свой MSH с помощью initQuickstart("ORU", "R01", "P");

Согласно комментариям в примере кода, метод initQuickstart заполняет все обязательные поля в сегменте MSH сообщения, включая тип сообщения, отметку времени и идентификатор элемента управления. (... и, надеюсь, символы кодировки по умолчанию также :-)

person Lars    schedule 13.07.2014
comment
Если вы напишете msh.getEncodingCharacters().setValue(^~\&);, вы получите ошибку Invalid escape sequence. Если вы не установите символы кодировки, вы получите исключение HL7, сообщающее вам, что символы кодировки не были установлены, даже если вы используете только символы кодировки по умолчанию. - person Octavarium; 14.07.2014
comment
@Octavarium Я обновил свой ответ дополнительной информацией. Надеюсь, поможет. - person Lars; 04.08.2014