0

OpenMRS モジュール用の HAPI 2.0 ライブラリを使用して、ORU_R01 タイプの HL7 メッセージをエンコードしようとしています。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 セグメントに何か問題があると思われますが、それが何であるかはわかりません。このエラーを修正するにはどうすればよいですか?

4

1 に答える 1

1

2 つのバックスラッシュを使用してエンコード文字を宣言するのはなぜですか?

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

そうではありませんか:

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

...そして、あなたのメッセージはデフォルトのエンコーディング文字を使用しているので、それらを宣言する必要さえないのでしょうか? HAPI MSH クラス リファレンスからの抜粋

getENCODINGCHARACTERS

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

更新 HAPI の使用経験はありません。簡単なグーグルでORUの例を見つけました。MSHを初期化してみてくださいinitQuickstart("ORU", "R01", "P");

コード例のコメントによると、initQuickstart メソッドは、メッセージ タイプ、タイムスタンプ、コントロール ID など、メッセージの MSH セグメントのすべての必須フィールドにデータを入力します。(...そしてうまくいけば、デフォルトのエンコーディング文字も:-)

于 2014-07-13T22:57:21.453 に答える