| @@ -5,38 +5,46 @@ import ca.uhn.hl7v2.HL7Exception; | |||||
| import ca.uhn.hl7v2.HapiContext; | import ca.uhn.hl7v2.HapiContext; | ||||
| import ca.uhn.hl7v2.model.DataTypeException; | import ca.uhn.hl7v2.model.DataTypeException; | ||||
| import ca.uhn.hl7v2.model.Message; | import ca.uhn.hl7v2.model.Message; | ||||
| import ca.uhn.hl7v2.model.v25.datatype.DTM; | |||||
| import ca.uhn.hl7v2.model.v251.datatype.FN; | |||||
| import ca.uhn.hl7v2.model.v251.group.BAR_P05_PROCEDURE; | |||||
| import ca.uhn.hl7v2.model.v251.group.BAR_P05_VISIT; | |||||
| import ca.uhn.hl7v2.model.v251.message.ADT_A01; | import ca.uhn.hl7v2.model.v251.message.ADT_A01; | ||||
| import ca.uhn.hl7v2.model.v251.message.BAR_P05; | import ca.uhn.hl7v2.model.v251.message.BAR_P05; | ||||
| import ca.uhn.hl7v2.model.v251.segment.*; | import ca.uhn.hl7v2.model.v251.segment.*; | ||||
| import ca.uhn.hl7v2.parser.Parser; | import ca.uhn.hl7v2.parser.Parser; | ||||
| import de.uniluebeck.mi.projmi6.model.Diagnose; | |||||
| import de.uniluebeck.mi.projmi6.model.Fall; | |||||
| import de.uniluebeck.mi.projmi6.model.Patient; | |||||
| import ca.uhn.hl7v2.parser.PipeParser; | |||||
| import ca.uhn.hl7v2.validation.ValidationContext; | |||||
| import ca.uhn.hl7v2.validation.impl.ValidationContextFactory; | |||||
| import de.uniluebeck.mi.projmi6.model.*; | |||||
| import java.io.BufferedWriter; | |||||
| import java.io.File; | |||||
| import java.io.FileWriter; | |||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.sql.Time; | |||||
| import java.sql.SQLException; | |||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||
| import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
| import java.time.LocalTime; | import java.time.LocalTime; | ||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.List; | import java.util.List; | ||||
| import static de.uniluebeck.mi.projmi6.db.DBHandler.getDiagnosenByFall; | |||||
| import static de.uniluebeck.mi.projmi6.db.DBHandler.getPatient; | |||||
| /** | /** | ||||
| * Created by taschi on 15.11.15. | * Created by taschi on 15.11.15. | ||||
| * enthaelt alle Klassen um eine Hl7 Nachricht zu erstellen bzw. zu Parsen. | * enthaelt alle Klassen um eine Hl7 Nachricht zu erstellen bzw. zu Parsen. | ||||
| */ | */ | ||||
| public class HL7 { | public class HL7 { | ||||
| /** | /** | ||||
| * erstellt eine ADT_A0 nachricht, welche anschließend an die OPS Gruppe verschickt werden soll. | * erstellt eine ADT_A0 nachricht, welche anschließend an die OPS Gruppe verschickt werden soll. | ||||
| * TODO Mit OPS Gruppe absprechen, welche Informationen sie auf jeden Fall benötigen und Code entsprechend anpassen. | * TODO Mit OPS Gruppe absprechen, welche Informationen sie auf jeden Fall benötigen und Code entsprechend anpassen. | ||||
| * @param fall nach dem Erstellen eines neuen Falls wird diese Methode aufgerufen um Hl7 Nachricht zu erzeugen | * @param fall nach dem Erstellen eines neuen Falls wird diese Methode aufgerufen um Hl7 Nachricht zu erzeugen | ||||
| * @param diagnosen Liste aller Nebendiagnosen momentan noch als einzelne Liste uebereben. eventuell die Nebendiagnosen direkt im Fall speichern? | |||||
| * @throws Exception | * @throws Exception | ||||
| */ | */ | ||||
| public void createMessageADTA01( Fall fall, List<Diagnose> diagnosen) throws HL7Exception, IOException { | |||||
| public void createMessageADTA01( Fall fall) throws HL7Exception, IOException, SQLException { | |||||
| Patient patient = fall.getPatient (); | Patient patient = fall.getPatient (); | ||||
| ADT_A01 adt = new ADT_A01 (); | ADT_A01 adt = new ADT_A01 (); | ||||
| @@ -78,79 +86,209 @@ public class HL7 { | |||||
| pidSegment.getPid13_PhoneNumberHome (0).getTelephoneNumber ().setValue ( patient.getTelefon () ); | pidSegment.getPid13_PhoneNumberHome (0).getTelephoneNumber ().setValue ( patient.getTelefon () ); | ||||
| pidSegment.getPid16_MaritalStatus ().getAlternateIdentifier ().setValue ( patient.getFamilienstand ().toString()); | pidSegment.getPid16_MaritalStatus ().getAlternateIdentifier ().setValue ( patient.getFamilienstand ().toString()); | ||||
| //Dg1 (Diagnosen) | |||||
| List<DG1> dg1List = new ArrayList<> ( ); | |||||
| //Diagnosen | |||||
| List<Diagnose> diagnosen = getDiagnosenByFall ( fall ); | |||||
| diagnosen.add(fall.getHauptDiagnose ()); | diagnosen.add(fall.getHauptDiagnose ()); | ||||
| DG1 dg1Segment = adt.getDG1 (); | |||||
| for (Diagnose aDiagnosen : diagnosen) { | |||||
| dg1Segment = adt.getDG1 (); | |||||
| dg1Segment.getDg12_DiagnosisCodingMethod ().setValue ( "ICD10" ); | |||||
| dg1Segment.getDg13_DiagnosisCodeDG1 ().getIdentifier ().setValue ( "CODE" ); | |||||
| dg1Segment.getDg14_DiagnosisDescription ().setValue ( aDiagnosen.getFreiText () ); | |||||
| dg1List.add ( dg1Segment ); | |||||
| if(!diagnosen.isEmpty ()) { | |||||
| for (Diagnose diagnose : diagnosen) { | |||||
| DG1 dg1Segment = adt.getDG1 (); | |||||
| dg1Segment.getDg13_DiagnosisCodeDG1 ().getIdentifier ().parse ( diagnose.getIcd10code ().getCode () ); | |||||
| dg1Segment.getDg16_DiagnosisType ().setValue ( String.valueOf ( diagnose.getIcd10code ().getVersion () ) ); | |||||
| dg1Segment.getDg116_DiagnosingClinician ()[0].parse ( diagnose.getArzt ().toString () ); | |||||
| dg1Segment.getDg14_DiagnosisDescription ().parse ( diagnose.getFreiText () ); | |||||
| dg1Segment.getDg16_DiagnosisType ().parse ( diagnose.getDiagArt ().toString () ); | |||||
| adt.getDG1All ().add ( dg1Segment ); | |||||
| } | |||||
| } | } | ||||
| //print generated message | |||||
| // printXMLEncodedMessageADT(adt); | |||||
| } | |||||
| printXMLEncodedMessageADT(adt); | |||||
| /** | |||||
| * gibt erzeugte hl7 Nachricht auf der Konsole aus (Kann nach Debug phase wieder geloescht werden) | |||||
| * @param msg | |||||
| * @throws HL7Exception | |||||
| */ | |||||
| public void printXMLEncodedMessageADT(Message msg) throws HL7Exception { | |||||
| HapiContext context = new DefaultHapiContext (); | |||||
| Parser parser = context.getXMLParser(); | |||||
| String encodedMessage = parser.encode (msg); | |||||
| System.out.println (encodedMessage); | |||||
| } | } | ||||
| /** | /** | ||||
| * | * | ||||
| * @param msg | * @param msg | ||||
| */ | */ | ||||
| public void parseMessage(Message msg) throws DataTypeException { | |||||
| public void parseMessage(Message msg) throws HL7Exception, SQLException { | |||||
| if (msg instanceof BAR_P05) { | if (msg instanceof BAR_P05) { | ||||
| BAR_P05 p05 = (BAR_P05) msg; | BAR_P05 p05 = (BAR_P05) msg; | ||||
| Patient patient = new Patient(); | |||||
| Fall fall = new Fall(); | |||||
| EVN evnSegment = p05.getEVN (); | |||||
| LocalDateTime ldt = generateLocalDateTimeFromHl7(p05); | |||||
| patient.setBearbeitetDatumZeit(ldt); | |||||
| //patient.setBearbeiter(evnSegment.getEvn5_OperatorID(0).getIDNumber()); | |||||
| PID pidSegment = p05.getPID(); | PID pidSegment = p05.getPID(); | ||||
| patient.setPatID(Integer.valueOf(pidSegment.getPid3_PatientIdentifierList(0).getIDNumber().getValue()));//evt das 4. Segment | |||||
| patient.setNachname(pidSegment.getPid5_PatientName(0).getFamilyName().getName()); | |||||
| patient.setVorname(pidSegment.getPid5_PatientName(0).getGivenName().getValue()); | |||||
| ca.uhn.hl7v2.model.v251.datatype.DTM geburtsTag = pidSegment.getPid7_DateTimeOfBirth().getTime(); | |||||
| LocalDate ld = LocalDate.of(geburtsTag.getYear(),geburtsTag.getMonth(),geburtsTag.getDay()); | |||||
| patient.setGeburtsdatum(ld); | |||||
| // patient.setGeschlecht(pidSegment.getPid8_AdministrativeSex().getValue()); | |||||
| EVN evnSegment = p05.getEVN (); | |||||
| Patient patient; | |||||
| Fall fall; | |||||
| Station station; | |||||
| StationsHistorie statHist; | |||||
| List<Diagnose> diagnosenP05 = new ArrayList<> ( ); | |||||
| List<Untersuchung> untersuchungenP05 = new ArrayList<> ( ); | |||||
| List<BAR_P05_VISIT> visitList = p05.getVISITAll (); | |||||
| int pid = Integer.valueOf(pidSegment.getPid3_PatientIdentifierList(0).getIDNumber().encode ());//evt das 4. Segment ? | |||||
| if (getPatient(pid) != null) { | |||||
| patient = getPatient(pid); | |||||
| //TODO wie bekommen wir hier den aktuellen Fall ? | |||||
| fall = null; | |||||
| List<Diagnose> diagnosenKIS; | |||||
| //TODO dbHandler query getDiagnosen by FallID um herauszufinden ob DIagnose geupdatet werden soll oder neu erzeugt | |||||
| List<Untersuchung> untersuchungenKIS; | |||||
| } else { | |||||
| //neuen Patienten anlegen | |||||
| patient = new Patient (); | |||||
| fall = new Fall(); | |||||
| fall.setPatient ( patient ); | |||||
| patient.setPatID(Integer.valueOf(pidSegment.getPid3_PatientIdentifierList(0).getIDNumber().encode ()));//evt das 4. Segment | |||||
| patient.setNachname(pidSegment.getPid5_PatientName(0).getFamilyName().encode ()); | |||||
| patient.setVorname(pidSegment.getPid5_PatientName(0).getGivenName().encode ()); | |||||
| ca.uhn.hl7v2.model.v251.datatype.DTM geburtsTag = pidSegment.getPid7_DateTimeOfBirth().getTime(); | |||||
| LocalDate ld = LocalDate.of(geburtsTag.getYear(),geburtsTag.getMonth(),geburtsTag.getDay()); | |||||
| patient.setGeburtsdatum(ld); | |||||
| //TODO funktion in den Enums anlegen | |||||
| // patient.setGeschlecht(pidSegment.getPid8_AdministrativeSex().getValue()); | |||||
| //patient.setFamilienstand(); | |||||
| //TODO patient in datenbank neu anlegen | |||||
| } | |||||
| //Stationshistorie aktualisieren | |||||
| for (BAR_P05_VISIT visit: visitList) { | |||||
| PV1 pv1Segment =visit.getPV1 (); | |||||
| if(stationExists()) { | |||||
| //TODO getStationshistorie | |||||
| statHist = new StationsHistorie (); | |||||
| } else { | |||||
| station = new Station(); | |||||
| station.setStation ( pv1Segment.getPv13_AssignedPatientLocation ().getPointOfCare ().encode () ); | |||||
| station.setAbteilung ( pv1Segment.getPv13_AssignedPatientLocation ().getFacility ().encode () ); | |||||
| statHist = new StationsHistorie (); | |||||
| statHist.setStation ( station ); | |||||
| } | |||||
| statHist.setFallID ( fall.getFallID () ); | |||||
| statHist.setAufnahmeDatum (generateLocalDateTimeFromHl7(pv1Segment.getPv144_AdmitDateTime ().getTime ()) ); | |||||
| statHist.setEntlassungsDatum(generateLocalDateTimeFromHl7(pv1Segment.getPv145_DischargeDateTime ()[0].getTime ())); | |||||
| //Untersuchungen | |||||
| List<BAR_P05_PROCEDURE> procedureList = visit.getPROCEDUREAll(); | |||||
| for (BAR_P05_PROCEDURE procedure : procedureList) { | |||||
| PR1 pr1Segment = procedure.getPR1(); | |||||
| Untersuchung untersuchung = new Untersuchung(); | |||||
| OpsCode opscode = new OpsCode(pr1Segment.getPr13_ProcedureCode ().encode (), "", Integer.valueOf ( pr1Segment.getProcedureDescription ().getVersion ())); | |||||
| untersuchung.setOpscode(opscode); | |||||
| untersuchung.setUntersuchungsdatum(generateLocalDateTimeFromHl7 (pr1Segment.getProcedureDateTime().getTime())); | |||||
| untersuchung.setFall(fall); | |||||
| //TODO dbHandler query was genau ist die untersID? | |||||
| String einweisenderarzt = pr1Segment.getPr112_ProcedurePractitioner(0).encode(); | |||||
| untersuchung.setDurchfuehrenderArzt(new Mitarbeiter(0)); | |||||
| untersuchungenP05.add(untersuchung); | |||||
| } | |||||
| // Diagnosen | |||||
| List<DG1> dg1Segmente = visit.getDG1All (); | |||||
| for ( DG1 dg1Segment : dg1Segmente) { | |||||
| Icd10Code icd10code; | |||||
| if(icd10CodeExists ()) { | |||||
| //TODO get icd Code | |||||
| icd10code = null; | |||||
| } else { | |||||
| icd10code = new Icd10Code(dg1Segment.getDg13_DiagnosisCodeDG1 ().getIdentifier().encode(), "", Integer.valueOf ( dg1Segment.getDg16_DiagnosisType ().getVersion ())); | |||||
| } | |||||
| String einweisenderArzt = dg1Segment.getDg116_DiagnosingClinician ()[0].encode (); | |||||
| //TODO dbHandler query | |||||
| Mitarbeiter mitarbeiter = new Mitarbeiter(0); | |||||
| //TODO herausfinden ob diagnose bereits existiert | |||||
| Diagnose diagnose = new Diagnose(); | |||||
| diagnose.setIcd10code(icd10code); | |||||
| diagnose.setArzt(mitarbeiter); | |||||
| diagnose.setFall(fall); | |||||
| diagnose.setFreiText ( dg1Segment.getDg14_DiagnosisDescription ().encode () ); | |||||
| //TODO Diagnoseart | |||||
| diagnosenP05.add(diagnose); | |||||
| } | |||||
| //ACK generieren aenderungen in db schreiben. | |||||
| } | |||||
| LocalDateTime ldt = generateLocalDateTimeFromHl7(evnSegment.getEventOccurred ().getTime ()); | |||||
| patient.setBearbeitetDatumZeit(ldt); | |||||
| patient.setBearbeiter(Integer.valueOf ( evnSegment.getEvn5_OperatorID(0).getIDNumber().encode ())); | |||||
| } | } | ||||
| } | } | ||||
| public LocalDateTime generateLocalDateTimeFromHl7(BAR_P05 msg) throws DataTypeException { | |||||
| EVN evnSegment = msg.getEVN(); | |||||
| private boolean icd10CodeExists() { | |||||
| return false; | |||||
| } | |||||
| private LocalDateTime generateLocalDateTimeFromHl7( ca.uhn.hl7v2.model.v251.datatype.DTM dtm) throws DataTypeException { | |||||
| int stunden = dtm.getHour (); | |||||
| int minuten = dtm.getMinute (); | |||||
| int sekunden = dtm.getSecond (); | |||||
| int jahr = dtm.getYear (); | |||||
| int monat = dtm.getMonth (); | |||||
| int tag = dtm.getDay (); | |||||
| int stunden = evnSegment.getEvn2_RecordedDateTime ().getTime ().getHour (); | |||||
| int minuten = evnSegment.getEvn2_RecordedDateTime ().getTime ().getMinute (); | |||||
| int sekunden = evnSegment.getEvn2_RecordedDateTime ().getTime ().getSecond (); | |||||
| int tag = evnSegment.getEvn2_RecordedDateTime ().getTime ().getDay (); | |||||
| int monat = evnSegment.getEvn2_RecordedDateTime ().getTime ().getMonth (); | |||||
| int jahr = evnSegment.getEvn2_RecordedDateTime ().getTime ().getYear (); | |||||
| LocalTime bearbeitetZeit = LocalTime.of(stunden,minuten,sekunden); | LocalTime bearbeitetZeit = LocalTime.of(stunden,minuten,sekunden); | ||||
| LocalDate bearbeitetDate = LocalDate.of(jahr, monat, tag); | LocalDate bearbeitetDate = LocalDate.of(jahr, monat, tag); | ||||
| LocalDateTime ldt = LocalDateTime.of(bearbeitetDate, bearbeitetZeit); | LocalDateTime ldt = LocalDateTime.of(bearbeitetDate, bearbeitetZeit); | ||||
| return ldt; | return ldt; | ||||
| } | |||||
| public boolean abteilungExists(String abteilungsID) { | |||||
| return false; | |||||
| } | |||||
| public boolean stationExists() { | |||||
| return false; | |||||
| } | |||||
| /** | |||||
| * gibt erzeugte hl7 Nachricht auf der Konsole aus (Kann nach Debug phase wieder geloescht werden) | |||||
| * @param msg | |||||
| * @throws HL7Exception | |||||
| */ | |||||
| public void printXMLEncodedMessageADT(Message msg) throws HL7Exception, IOException { | |||||
| HapiContext context = new DefaultHapiContext (); | |||||
| Parser parser = context.getXMLParser(); | |||||
| String encodedMessage = parser.encode(msg); | |||||
| LocalDateTime ldt = LocalDateTime.now(); | |||||
| File file = new File("ADTA01Messafge" +LocalDateTime.now().toString() +"xml" ); | |||||
| if (!file.exists()) { | |||||
| file.createNewFile(); | |||||
| } | |||||
| FileWriter fw = new FileWriter(file.getAbsoluteFile()); | |||||
| BufferedWriter bw = new BufferedWriter(fw); | |||||
| bw.write(encodedMessage); | |||||
| bw.close(); | |||||
| System.out.println (encodedMessage); | |||||
| } | |||||
| /** | |||||
| * | |||||
| * @param msg | |||||
| */ | |||||
| public void validateMessage(Message msg) { | |||||
| HapiContext context = new DefaultHapiContext(); | |||||
| context.setValidationContext(ValidationContextFactory.<ValidationContext>defaultValidation()); | |||||
| PipeParser parser = context.getPipeParser(); | |||||
| try { | |||||
| parser.encode(msg); | |||||
| } catch (HL7Exception e) { | |||||
| System.out.println("invaid message!" +e); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||