Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package it.alten.olympus.poc.referti.server;
- import ca.uhn.hl7v2.DefaultHapiContext;
- import ca.uhn.hl7v2.HL7Exception;
- import ca.uhn.hl7v2.HapiContext;
- import ca.uhn.hl7v2.model.Message;
- import ca.uhn.hl7v2.model.Segment;
- import ca.uhn.hl7v2.model.Varies;
- import ca.uhn.hl7v2.model.v23.datatype.CM_NDL;
- import ca.uhn.hl7v2.model.v23.datatype.XPN;
- import ca.uhn.hl7v2.model.v23.group.ORU_R01_OBSERVATION;
- import ca.uhn.hl7v2.model.v23.group.ORU_R01_ORDER_OBSERVATION;
- import ca.uhn.hl7v2.model.v23.group.ORU_R01_RESPONSE;
- import ca.uhn.hl7v2.model.v23.segment.*;
- import ca.uhn.hl7v2.model.v23.message.ORU_R01;
- import ca.uhn.hl7v2.parser.Parser;
- import ca.uhn.hl7v2.parser.PipeParser;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import java.io.IOException;
- import java.nio.file.Files;
- import java.nio.file.Path;
- @Slf4j
- @SpringBootApplication
- public class HL7Decoder {
- public static void main(String args[]) throws HL7Exception, IOException {
- /*
- Lettura del file di esempio inserito momentaneamente nel package resources in formato txt così come inserito fra
- i sorgenti della feature funziona correttamente, se inserito copiandolo com stringa, la stringa va leggermente modifica.
- */
- String txtFile = "src/main/resources/Endobase-ORUR01.txt";
- String msgFile = Files.readString(Path.of(txtFile));
- String msg = "MSH|^~\\&|EB^EB^GUID||ORU^ORU^GUID||20200406141607||ORU^R01|B6TVf1U8JWC_qPsZ12wz|P|2.3|||AL|NE\n" +
- "PID|1||||COGNOME_PAZ^NOME_PAZ||19740121000000|F|||BADIA,291^^PALERMO^^90145||||||||CF_PAZ||||PALERMO\n" +
- "PV1|1|||||||||||||||||||||||||||||||||||||||||||17530101000000|17530101000000\n" +
- "OBR|1||43905^Endobase||||20200406133600||||||||||||||Gastroenterologia|20200406141500||Endobase|F|||||||&Scimeca&Daniela&&&Dott.ssa|~~|&Baviera&Giuseppe~&Tuzzolino&Vincenza&&&Sig.ra~\n" +
- "OBX|1|FT|Esofagogastroduodenoscopia^40635^^^Report|1|REPORT_TEXT_in_ASCII\n" +
- "OBX|2|RP|Esofagogastroduodenoscopia^40635^^^Report PDF|1|//OLYMPUSSRV/EB3_REPORT/29058_43905_40635.PDF||||||F|||20200406133600";
- String msg2
- = "MSH|^~\\&|EB^EB^GUID||ORU^ORU^GUID||20200406141607||ORU^R01|B6TVf1U8JWC_qPsZ12wz|P|2.3|||AL|NE\r" +
- "PI|1||||COGNOME_PAZ^NOME_PAZ||19740121000000|F|||BADIA,291^^PALERMO^^90145||||||||CF_PAZ||||PALERMO\r" +
- "PV1|1|||||||||||||||||||||||||||||||||||||||||||17530101000000|17530101000000\r" +
- "OBR|1||43905^Endobase||||20200406133600||||||||||||||Gastroenterologia|20200406141500||Endobase|F|||||||&Scimeca&Daniela&&&Dott.ssa|~~|&Baviera&Giuseppe~&Tuzzolino&Vincenza&&&Sig.ra~\r" +
- "OBX|1|FT|Esofagogastroduodenoscopia^40635^^^Report|1|REPORT_TEXT_in_ASCII\r" +
- "OBX|2|RP|Esofagogastroduodenoscopia^40635^^^Report PDF|1|//OLYMPUSSRV/EB3_REPORT/29058_43905_40635.PDF||||||F|||20200406133600";
- /*
- Modifica al messaggio dovuta al fatto che la stringa con i delimitatori \n non veniva correttamente riconosciuta
- (trovato suggerimento su stackOverFlow)
- */
- String msg1 = msg.replace("\n", "\r");
- log.info("msg.replace correct: {}", msg1.equals(msg2));
- /*
- HapiContext funge da Factory per tutti gli oggetti che fanno riferimento a questa configurazione
- Cambiando la configurazione verranno conseguentemente modificati i comportamenti di tutti gli HAPI Object
- che fanno riferimento a tale contesto.
- */
- HapiContext context = new DefaultHapiContext();
- /*
- PipeParser è una implementazione specifica del GenericParser che viene utilizzata per andare a effettuare il
- parse di tutti i messaggi HL7 codificati in maniera tradizionale senza customizzazioni
- Gli stessi parser possono essere modificati tramite i metodi Set
- */
- Parser p = context.getPipeParser();
- //Parser p = context.getGenericParser();
- /*
- Message rappresenta un messaggio HL7 completo, in cui vengono inclusi strutture, campi e segmenti, da cui poi poter
- estrapolare i dati necessari
- */
- Message adt = p.parse(msgFile);
- /*
- ORU_R01 rappresenta la tipologia di messaggio che il cliente ci ha rappresentato nel suo esempio.
- Questo tipologia di messaggio si suddivide in 3 componenti:
- -MSH ( intestazione messaggio)
- -ORU_R01_RESPONSE (oggetto Group) che si ripete
- -DSC(Opzionale) Segmento puntatore di continuazione
- ORU^R01|B6TVf1U8JWC_qPsZ12wz|P|2.3||| in questa porzione si specifica tipologia e versione specifica.
- Attenzione: Enorme differenze tra versioni anche se sequenziali, e nessuna retrocompatibilità
- ES= 2.3 != 2.3.1
- */
- ORU_R01 oruMsg = (ORU_R01) adt;
- log.info("ALL ORU MSG: \n{}", ((ORU_R01) adt).printStructure(true));
- /*
- Estrpolazione pozione MSH dal messaggio ORU_R01, che sarebbe l'handler del messaggio
- fonte: https://hapifhir.github.io/hapi-hl7v2/v231/apidocs/ca/uhn/hl7v2/model/v231/segment/MSH.html
- */
- MSH msh = oruMsg.getMSH();
- String dataRicezione = msh.getMsh7_DateTimeOfMessage().encode();
- log.info("Data e ora ricezione: {}", dataRicezione);
- /*
- Ciclo per ogni ORU_R01_RESPONSE che contiene una raccolta ordinata di segmenti di messaggio
- all'interno sono contenuti 2 campi, ORU_R01_PATIENT (opzionale) ed un gruppo ORU_R01_ORDER_OBSERVATION
- sul quale ciclo ancora per poi estrapolare alcune delle informazioni contenute nel segmento OBR
- */
- for (ORU_R01_RESPONSE response : oruMsg.getRESPONSEAll()) {
- for (ORU_R01_ORDER_OBSERVATION orderObservation : response.getORDER_OBSERVATIONAll()) {
- /*
- Qui nel ciclo estrapolo per ogni segmento del gruppo la sezione OBR che è la sezione del messaggio che
- contiene le informazioni inerenti agli accertamenti effettuati dal paziente, e ai vari tecnici e
- medici che sono intervenuti
- fonte: https://hapifhir.github.io/hapi-hl7v2/v25/apidocs/ca/uhn/hl7v2/model/v25/segment/OBR.html
- */
- OBR obr = orderObservation.getOBR();
- for (CM_NDL technician : obr.getTechnician()) {
- String medico = obr.getObr32_PrincipalResultInterpreter().encode();
- String tecnicoReferto = technician.encode();
- log.info("Tecnico Referto: {} -- Medico Interprete: {}", tecnicoReferto, medico);
- }
- String fillerOrderNumber = obr.getObr3_FillerOrderNumber().encode();
- log.info("Numero Ordine: {}", fillerOrderNumber);
- /*
- Qui nel ciclo estrapolo per ogni segmento del gruppo la sezione PID che è la sezione del messaggio che
- contiene le informazioni inerenti all'identificazione del paziente, quindi l'anagrafica
- fonte: https://hapifhir.github.io/hapi-hl7v2/v25/apidocs/ca/uhn/hl7v2/model/v25/segment/PID.html
- */
- PID pid = response.getPATIENT().getPID();
- String pazienteCF = pid.getPid19_SSNNumberPatient().encode();
- log.info("CF_PAZIENTE: {}", pazienteCF);
- for (XPN var : pid.getPatientName()) {
- String nomePaziente= var.encode();
- log.info("NOME PAZIENTE: {}", nomePaziente);
- }
- /*
- Qui nel ciclo estrapolo per ogni segmento del gruppo la sezione PV1 che è la sezione del messaggio che
- contiene le informazioni inerenti alla visita del paziente
- fonte: https://hapifhir.github.io/hapi-hl7v2/v231/apidocs/ca/uhn/hl7v2/model/v231/segment/PV1.html
- */
- PV1 pv1 = response.getPATIENT().getVISIT().getPV1();
- /*
- Qui nel ciclo estrapolo da orderObservation gli oggetti di tipo ORU_R01_OBSERVATION, di tipo Gruppo
- che contiene 2 tipologie di informazioni OBX e NTE.
- OBX contiene l'osservazione e il risultato, nel nostro caso specifico il referto in ansi, e il path del
- referto in pdf, e l'Oggetto NTE con eventuali note riportate, non presenti nel nostro messaggio di riferimento
- fonte ORU_R01_OBSERVATION: https://hapifhir.github.io/hapi-hl7v2/v25/apidocs/ca/uhn/hl7v2/model/v25/group/ORU_R01_OBSERVATION.html
- fonte OBX: https://hapifhir.github.io/hapi-hl7v2/v231/apidocs/ca/uhn/hl7v2/model/v231/segment/OBX.html
- */
- for (ORU_R01_OBSERVATION observation : orderObservation.getOBSERVATIONAll()) {
- OBX obx = observation.getOBX();
- for (Varies path : obx.getObx5_ObservationValue()) {
- String infoReferto = path.encode();
- log.info("PATH: {}", infoReferto);
- }
- }
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment