nicb

HL7 decoder

Sep 16th, 2020
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.12 KB | None | 0 0
  1. package it.alten.olympus.poc.referti.server;
  2.  
  3. import ca.uhn.hl7v2.DefaultHapiContext;
  4. import ca.uhn.hl7v2.HL7Exception;
  5. import ca.uhn.hl7v2.HapiContext;
  6. import ca.uhn.hl7v2.model.Message;
  7. import ca.uhn.hl7v2.model.Segment;
  8. import ca.uhn.hl7v2.model.Varies;
  9. import ca.uhn.hl7v2.model.v23.datatype.CM_NDL;
  10. import ca.uhn.hl7v2.model.v23.datatype.XPN;
  11. import ca.uhn.hl7v2.model.v23.group.ORU_R01_OBSERVATION;
  12. import ca.uhn.hl7v2.model.v23.group.ORU_R01_ORDER_OBSERVATION;
  13. import ca.uhn.hl7v2.model.v23.group.ORU_R01_RESPONSE;
  14. import ca.uhn.hl7v2.model.v23.segment.*;
  15. import ca.uhn.hl7v2.model.v23.message.ORU_R01;
  16. import ca.uhn.hl7v2.parser.Parser;
  17. import ca.uhn.hl7v2.parser.PipeParser;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.springframework.boot.autoconfigure.SpringBootApplication;
  20. import java.io.IOException;
  21. import java.nio.file.Files;
  22. import java.nio.file.Path;
  23.  
  24. @Slf4j
  25. @SpringBootApplication
  26. public class HL7Decoder {
  27.     public static void main(String args[]) throws HL7Exception, IOException {
  28.  
  29.         /*
  30.         Lettura del file di esempio inserito momentaneamente nel package resources in formato txt così come inserito fra
  31.         i sorgenti della feature funziona correttamente, se inserito copiandolo com stringa, la stringa va leggermente modifica.
  32.          */
  33.         String txtFile = "src/main/resources/Endobase-ORUR01.txt";
  34.         String msgFile = Files.readString(Path.of(txtFile));
  35.  
  36.         String msg = "MSH|^~\\&|EB^EB^GUID||ORU^ORU^GUID||20200406141607||ORU^R01|B6TVf1U8JWC_qPsZ12wz|P|2.3|||AL|NE\n" +
  37.                 "PID|1||||COGNOME_PAZ^NOME_PAZ||19740121000000|F|||BADIA,291^^PALERMO^^90145||||||||CF_PAZ||||PALERMO\n" +
  38.                 "PV1|1|||||||||||||||||||||||||||||||||||||||||||17530101000000|17530101000000\n" +
  39.                 "OBR|1||43905^Endobase||||20200406133600||||||||||||||Gastroenterologia|20200406141500||Endobase|F|||||||&Scimeca&Daniela&&&Dott.ssa|~~|&Baviera&Giuseppe~&Tuzzolino&Vincenza&&&Sig.ra~\n" +
  40.                 "OBX|1|FT|Esofagogastroduodenoscopia^40635^^^Report|1|REPORT_TEXT_in_ASCII\n" +
  41.                 "OBX|2|RP|Esofagogastroduodenoscopia^40635^^^Report PDF|1|//OLYMPUSSRV/EB3_REPORT/29058_43905_40635.PDF||||||F|||20200406133600";
  42.         String msg2
  43.                 = "MSH|^~\\&|EB^EB^GUID||ORU^ORU^GUID||20200406141607||ORU^R01|B6TVf1U8JWC_qPsZ12wz|P|2.3|||AL|NE\r" +
  44.                 "PI|1||||COGNOME_PAZ^NOME_PAZ||19740121000000|F|||BADIA,291^^PALERMO^^90145||||||||CF_PAZ||||PALERMO\r" +
  45.                 "PV1|1|||||||||||||||||||||||||||||||||||||||||||17530101000000|17530101000000\r" +
  46.                 "OBR|1||43905^Endobase||||20200406133600||||||||||||||Gastroenterologia|20200406141500||Endobase|F|||||||&Scimeca&Daniela&&&Dott.ssa|~~|&Baviera&Giuseppe~&Tuzzolino&Vincenza&&&Sig.ra~\r" +
  47.                 "OBX|1|FT|Esofagogastroduodenoscopia^40635^^^Report|1|REPORT_TEXT_in_ASCII\r" +
  48.                 "OBX|2|RP|Esofagogastroduodenoscopia^40635^^^Report PDF|1|//OLYMPUSSRV/EB3_REPORT/29058_43905_40635.PDF||||||F|||20200406133600";
  49.          /*
  50.         Modifica al messaggio dovuta al fatto che la stringa con i delimitatori \n non veniva correttamente riconosciuta
  51.         (trovato suggerimento su stackOverFlow)
  52.          */
  53.         String msg1 = msg.replace("\n", "\r");
  54.         log.info("msg.replace correct: {}", msg1.equals(msg2));
  55.  
  56.         /*
  57.         HapiContext funge da Factory per tutti gli oggetti che fanno riferimento a questa configurazione
  58.         Cambiando la configurazione verranno conseguentemente modificati i comportamenti di tutti gli HAPI Object
  59.         che fanno riferimento a tale contesto.
  60.          */
  61.         HapiContext context = new DefaultHapiContext();
  62.  
  63.         /*
  64.         PipeParser è una implementazione specifica del GenericParser che viene utilizzata per andare a effettuare il
  65.         parse di tutti i messaggi HL7 codificati in maniera tradizionale senza customizzazioni
  66.         Gli stessi parser possono essere modificati tramite i metodi Set
  67.          */
  68.         Parser p = context.getPipeParser();
  69.         //Parser p = context.getGenericParser();
  70.  
  71.         /*
  72.         Message rappresenta un messaggio HL7 completo, in cui vengono inclusi strutture, campi e segmenti, da cui poi poter
  73.         estrapolare i dati necessari
  74.          */
  75.         Message adt = p.parse(msgFile);
  76.  
  77.         /*
  78.         ORU_R01 rappresenta la tipologia di messaggio che il cliente ci ha rappresentato nel suo esempio.
  79.         Questo tipologia di messaggio si suddivide in 3 componenti:
  80.             -MSH ( intestazione messaggio)
  81.             -ORU_R01_RESPONSE (oggetto Group) che si ripete
  82.             -DSC(Opzionale) Segmento puntatore di continuazione
  83.         ORU^R01|B6TVf1U8JWC_qPsZ12wz|P|2.3||| in questa porzione si specifica tipologia e versione specifica.
  84.         Attenzione: Enorme differenze tra versioni anche se sequenziali, e nessuna retrocompatibilità
  85.         ES= 2.3 != 2.3.1
  86.          */
  87.         ORU_R01 oruMsg = (ORU_R01) adt;
  88.         log.info("ALL ORU MSG: \n{}", ((ORU_R01) adt).printStructure(true));
  89.  
  90.         /*
  91.         Estrpolazione pozione MSH dal messaggio ORU_R01, che sarebbe l'handler del messaggio
  92.         fonte: https://hapifhir.github.io/hapi-hl7v2/v231/apidocs/ca/uhn/hl7v2/model/v231/segment/MSH.html
  93.          */
  94.         MSH msh = oruMsg.getMSH();
  95.         String dataRicezione = msh.getMsh7_DateTimeOfMessage().encode();
  96.         log.info("Data e ora ricezione: {}", dataRicezione);
  97.  
  98.  
  99.         /*
  100.         Ciclo per ogni ORU_R01_RESPONSE che contiene una raccolta ordinata di segmenti di messaggio
  101.         all'interno sono contenuti 2 campi,  ORU_R01_PATIENT (opzionale) ed un gruppo ORU_R01_ORDER_OBSERVATION
  102.         sul quale ciclo ancora per poi estrapolare alcune delle informazioni contenute nel segmento OBR
  103.          */
  104.         for (ORU_R01_RESPONSE response : oruMsg.getRESPONSEAll()) {
  105.             for (ORU_R01_ORDER_OBSERVATION orderObservation : response.getORDER_OBSERVATIONAll()) {
  106.  
  107.                 /*
  108.                 Qui nel ciclo estrapolo per ogni segmento del gruppo la sezione OBR che è la sezione del messaggio che
  109.                 contiene le informazioni inerenti agli accertamenti effettuati dal paziente, e ai vari tecnici e
  110.                 medici che sono intervenuti
  111.                 fonte: https://hapifhir.github.io/hapi-hl7v2/v25/apidocs/ca/uhn/hl7v2/model/v25/segment/OBR.html
  112.                  */
  113.                 OBR obr = orderObservation.getOBR();
  114.                 for (CM_NDL technician : obr.getTechnician()) {
  115.                     String medico = obr.getObr32_PrincipalResultInterpreter().encode();
  116.                     String tecnicoReferto = technician.encode();
  117.                     log.info("Tecnico Referto: {} -- Medico Interprete: {}", tecnicoReferto, medico);
  118.                 }
  119.                 String fillerOrderNumber = obr.getObr3_FillerOrderNumber().encode();
  120.                 log.info("Numero Ordine: {}", fillerOrderNumber);
  121.  
  122.                 /*
  123.                 Qui nel ciclo estrapolo per ogni segmento del gruppo la sezione PID che è la sezione del messaggio che
  124.                 contiene le informazioni inerenti all'identificazione del paziente, quindi l'anagrafica
  125.                 fonte: https://hapifhir.github.io/hapi-hl7v2/v25/apidocs/ca/uhn/hl7v2/model/v25/segment/PID.html
  126.                  */
  127.                 PID pid = response.getPATIENT().getPID();
  128.                 String pazienteCF = pid.getPid19_SSNNumberPatient().encode();
  129.                 log.info("CF_PAZIENTE: {}", pazienteCF);
  130.  
  131.                 for (XPN var : pid.getPatientName()) {
  132.                     String nomePaziente= var.encode();
  133.                     log.info("NOME PAZIENTE: {}", nomePaziente);
  134.                 }
  135.  
  136.                 /*
  137.                 Qui nel ciclo estrapolo per ogni segmento del gruppo la sezione PV1 che è la sezione del messaggio che
  138.                 contiene le informazioni inerenti alla visita del paziente
  139.                 fonte: https://hapifhir.github.io/hapi-hl7v2/v231/apidocs/ca/uhn/hl7v2/model/v231/segment/PV1.html
  140.                  */
  141.                 PV1 pv1 = response.getPATIENT().getVISIT().getPV1();
  142.  
  143.                 /*
  144.                 Qui nel ciclo estrapolo da orderObservation gli oggetti di tipo ORU_R01_OBSERVATION, di tipo Gruppo
  145.                 che contiene 2 tipologie di informazioni OBX e NTE.
  146.                 OBX contiene l'osservazione e il risultato, nel nostro caso specifico il referto in ansi, e il path del
  147.                 referto in pdf, e l'Oggetto NTE con eventuali note riportate, non presenti nel nostro messaggio di riferimento
  148.                 fonte ORU_R01_OBSERVATION: https://hapifhir.github.io/hapi-hl7v2/v25/apidocs/ca/uhn/hl7v2/model/v25/group/ORU_R01_OBSERVATION.html
  149.                 fonte OBX: https://hapifhir.github.io/hapi-hl7v2/v231/apidocs/ca/uhn/hl7v2/model/v231/segment/OBX.html
  150.                  */
  151.                 for (ORU_R01_OBSERVATION observation : orderObservation.getOBSERVATIONAll()) {
  152.                     OBX obx = observation.getOBX();
  153.                     for (Varies path : obx.getObx5_ObservationValue()) {
  154.                         String infoReferto = path.encode();
  155.                         log.info("PATH: {}", infoReferto);
  156.                     }
  157.                 }
  158.             }
  159.         }
  160.     }
  161. }
  162.  
Add Comment
Please, Sign In to add comment