From be8759983c1ab762c17aaa3ad08a64b998e07797 Mon Sep 17 00:00:00 2001 From: taschi Date: Sun, 15 Nov 2015 17:31:58 +0100 Subject: [PATCH 1/6] funktion erstellt um ADT_A01 Nachrichten erstellen zu koennen - fehler liegt noch im MSH aufgrund der Zeichenkodierung von ^~\& --- src/main/java/de/uniluebeck/mi/projmi6/HL7.java | 83 +++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/main/java/de/uniluebeck/mi/projmi6/HL7.java diff --git a/src/main/java/de/uniluebeck/mi/projmi6/HL7.java b/src/main/java/de/uniluebeck/mi/projmi6/HL7.java new file mode 100644 index 0000000..3d3da32 --- /dev/null +++ b/src/main/java/de/uniluebeck/mi/projmi6/HL7.java @@ -0,0 +1,83 @@ +package de.uniluebeck.mi.projmi6; + +import ca.uhn.hl7v2.model.v251.message.ADT_A01; +import ca.uhn.hl7v2.model.v251.segment.*; +import de.uniluebeck.mi.projmi6.model.Diagnose; +import de.uniluebeck.mi.projmi6.model.Fall; +import de.uniluebeck.mi.projmi6.model.Patient; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by taschi on 15.11.15. + * enthaelt alle Klassen um eine Hl7 Nachricht zu erstellen bzw. zu Parsen. + */ +public class HL7 { + + /** + * 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. + * @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 + */ + public void createMessageADTA01( Fall fall, List diagnosen) throws Exception{ + Patient patient = fall.getPatient (); + ADT_A01 adt = new ADT_A01 (); + + //default MSH Values (Sets Segments: 1,2,7,9 + adt.initQuickstart ("ADT", "A01", "P"); + + //MSH Segment: + MSH mshSegment = adt.getMSH(); + mshSegment.getMsh3_SendingApplication ().getNamespaceID ().setValue ( "KISGruppe6" ); + mshSegment.getMsh5_ReceivingApplication ().getNamespaceID ().setValue("OPS Gruppe von Maurice und Torben"); + mshSegment.getMsh12_VersionID ().getVersionID ().setValue ( "2.2" ); + mshSegment.getMsh15_AcceptAcknowledgmentType ().setValue ( "AL" ); + //Security? + //Message Control ID? + //Processing ID? + //Sequence Number ? + //Contituation Pointer ? + //Cointry Code + //Character Set + //Principal Language of Message + + //EVN Segment: + EVN evnSegment = adt.getEVN (); + evnSegment.getEvn1_EventTypeCode ().setValue ("A01"); + evnSegment.getEvn4_EventReasonCode ().setValue ( "01" ); + //Operator ID + //Event occured + + //PID + PID pidSegment = adt.getPID (); + pidSegment.getPid3_PatientIdentifierList (0).getIDNumber ().setValue ( Integer.toString(patient.getPatID ()) ); + pidSegment.getPid5_PatientName (0).getFamilyName ().getSurname ().setValue ( patient.getNachname () ); + pidSegment.getPid5_PatientName (0).getGivenName ().setValue ( patient.getVorname () ); + pidSegment.getPid7_DateTimeOfBirth ().getTime ().setValue ( patient.getGeburtsdatum ().toString () ); + pidSegment.getPid8_AdministrativeSex ().setValue ( patient.getGeschlecht ().toString () ); + pidSegment.getPid11_PatientAddress (0).getStreetAddress ().getStreetName().setValue ( patient.getStrasse () ); + pidSegment.getPid11_PatientAddress (0).getStreetAddress ().getDwellingNumber ( ).setValue ( patient.getHausnummer () ); + pidSegment.getPid11_PatientAddress (0).getCity ().setValue (patient.getOrt () ); + pidSegment.getPid13_PhoneNumberHome (0).getTelephoneNumber ().setValue ( patient.getTelefon () ); + pidSegment.getPid16_MaritalStatus ().getAlternateIdentifier ().setValue ( patient.getFamilienstand ().toString()); + + //Dg1 (Diagnosen) + List dg1List = new ArrayList<> ( ); + 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 ); + } + + } + +} From 174e579047083eeae94dcb09651a7abf883f9a47 Mon Sep 17 00:00:00 2001 From: taschi Date: Sun, 15 Nov 2015 18:04:37 +0100 Subject: [PATCH 2/6] aktuell mit master --- src/main/java/de/uniluebeck/mi/projmi6/db/MySqlConnFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/uniluebeck/mi/projmi6/db/MySqlConnFactory.java b/src/main/java/de/uniluebeck/mi/projmi6/db/MySqlConnFactory.java index 9c19032..7a6726d 100644 --- a/src/main/java/de/uniluebeck/mi/projmi6/db/MySqlConnFactory.java +++ b/src/main/java/de/uniluebeck/mi/projmi6/db/MySqlConnFactory.java @@ -9,7 +9,7 @@ import java.sql.SQLException; */ public class MySqlConnFactory { private static MySqlConnFactory instance = new MySqlConnFactory(); - public static final String URL = "jdbc:mysql://141.83.20.84:3306/pmiw15g06_v01"; + public static final String URL = "jdbc:mysql://127.0.0.1:3306/pmiw15g06_v01"; public static final String USER = "pmiw15g06"; public static final String PASS = "AX3yQSYJSH43PrSz"; public static final String DRIVER = "com.mysql.jdbc.Driver"; From 513409d45b202ac3804859138881b917e6b68b98 Mon Sep 17 00:00:00 2001 From: taschi Date: Sun, 15 Nov 2015 19:05:46 +0100 Subject: [PATCH 3/6] angefangen parser zu schreiben --- src/main/java/de/uniluebeck/mi/projmi6/HL7.java | 61 ++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/uniluebeck/mi/projmi6/HL7.java b/src/main/java/de/uniluebeck/mi/projmi6/HL7.java index 3d3da32..c5f12d2 100644 --- a/src/main/java/de/uniluebeck/mi/projmi6/HL7.java +++ b/src/main/java/de/uniluebeck/mi/projmi6/HL7.java @@ -1,12 +1,23 @@ package de.uniluebeck.mi.projmi6; +import ca.uhn.hl7v2.DefaultHapiContext; +import ca.uhn.hl7v2.HL7Exception; +import ca.uhn.hl7v2.HapiContext; +import ca.uhn.hl7v2.model.DataTypeException; +import ca.uhn.hl7v2.model.Message; import ca.uhn.hl7v2.model.v251.message.ADT_A01; +import ca.uhn.hl7v2.model.v251.message.BAR_P05; import ca.uhn.hl7v2.model.v251.segment.*; +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 java.io.IOException; +import java.sql.Time; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.ArrayList; import java.util.List; @@ -23,7 +34,7 @@ public class HL7 { * @param diagnosen Liste aller Nebendiagnosen momentan noch als einzelne Liste uebereben. eventuell die Nebendiagnosen direkt im Fall speichern? * @throws Exception */ - public void createMessageADTA01( Fall fall, List diagnosen) throws Exception{ + public void createMessageADTA01( Fall fall, List diagnosen) throws HL7Exception, IOException { Patient patient = fall.getPatient (); ADT_A01 adt = new ADT_A01 (); @@ -77,7 +88,55 @@ public class HL7 { dg1Segment.getDg14_DiagnosisDescription ().setValue ( aDiagnosen.getFreiText () ); dg1List.add ( dg1Segment ); } + //print generated message + // 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 + */ + public void parseMessage(Message msg) throws DataTypeException { + if (msg instanceof BAR_P05) { + BAR_P05 p05 = (BAR_P05) msg; + Patient patient = new Patient(); + Fall fall = new Fall(); + EVN evnSegment = p05.getEVN (); + + + + } + } + + public LocalDateTime generateLocalDateTimeFromHl7(BAR_P05 msg) throws DataTypeException { + EVN evnSegment = msg.getEVN(); + + 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); + LocalDate bearbeitetDate = LocalDate.of(jahr, monat, tag); + LocalDateTime ldt = LocalDateTime.of(bearbeitetDate, bearbeitetZeit); + return ldt; + + } + + + } From 877c71c1b6e35a7a94b70899fb59d960f0f68145 Mon Sep 17 00:00:00 2001 From: taschi Date: Sun, 22 Nov 2015 12:21:30 +0100 Subject: [PATCH 4/6] Hl7 Datei geupdatet --- src/main/java/de/uniluebeck/mi/projmi6/HL7.java | 244 +++++++++++++++++++----- 1 file changed, 191 insertions(+), 53 deletions(-) diff --git a/src/main/java/de/uniluebeck/mi/projmi6/HL7.java b/src/main/java/de/uniluebeck/mi/projmi6/HL7.java index 0e30f21..c513c38 100644 --- a/src/main/java/de/uniluebeck/mi/projmi6/HL7.java +++ b/src/main/java/de/uniluebeck/mi/projmi6/HL7.java @@ -5,38 +5,46 @@ import ca.uhn.hl7v2.HL7Exception; import ca.uhn.hl7v2.HapiContext; import ca.uhn.hl7v2.model.DataTypeException; 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.BAR_P05; import ca.uhn.hl7v2.model.v251.segment.*; 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.sql.Time; +import java.sql.SQLException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.ArrayList; 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. * enthaelt alle Klassen um eine Hl7 Nachricht zu erstellen bzw. zu Parsen. */ public class HL7 { + + /** * 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. * @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 */ - public void createMessageADTA01( Fall fall, List diagnosen) throws HL7Exception, IOException { + public void createMessageADTA01( Fall fall) throws HL7Exception, IOException, SQLException { Patient patient = fall.getPatient (); ADT_A01 adt = new ADT_A01 (); @@ -78,79 +86,209 @@ public class HL7 { pidSegment.getPid13_PhoneNumberHome (0).getTelephoneNumber ().setValue ( patient.getTelefon () ); pidSegment.getPid16_MaritalStatus ().getAlternateIdentifier ().setValue ( patient.getFamilienstand ().toString()); - //Dg1 (Diagnosen) - List dg1List = new ArrayList<> ( ); + //Diagnosen + List diagnosen = getDiagnosenByFall ( fall ); 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 */ - public void parseMessage(Message msg) throws DataTypeException { + public void parseMessage(Message msg) throws HL7Exception, SQLException { if (msg instanceof BAR_P05) { 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(); - 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 diagnosenP05 = new ArrayList<> ( ); + List untersuchungenP05 = new ArrayList<> ( ); + List 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 diagnosenKIS; + //TODO dbHandler query getDiagnosen by FallID um herauszufinden ob DIagnose geupdatet werden soll oder neu erzeugt + List 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 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 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); LocalDate bearbeitetDate = LocalDate.of(jahr, monat, tag); LocalDateTime ldt = LocalDateTime.of(bearbeitetDate, bearbeitetZeit); 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.defaultValidation()); + PipeParser parser = context.getPipeParser(); + try { + parser.encode(msg); + } catch (HL7Exception e) { + System.out.println("invaid message!" +e); + } } + + } From 889e3e7674569592b4dc5928ff76ad190931e6e9 Mon Sep 17 00:00:00 2001 From: taschi Date: Sun, 22 Nov 2015 12:28:44 +0100 Subject: [PATCH 5/6] Hl7Sender erstellt und Methoden von Datei HL7 uebernommen und HL7 datei geloescht --- src/main/java/de/uniluebeck/mi/projmi6/HL7.java | 294 --------------------- .../de/uniluebeck/mi/projmi6/hapi/HL7Sender.java | 143 ++++++++++ 2 files changed, 143 insertions(+), 294 deletions(-) delete mode 100644 src/main/java/de/uniluebeck/mi/projmi6/HL7.java create mode 100644 src/main/java/de/uniluebeck/mi/projmi6/hapi/HL7Sender.java diff --git a/src/main/java/de/uniluebeck/mi/projmi6/HL7.java b/src/main/java/de/uniluebeck/mi/projmi6/HL7.java deleted file mode 100644 index c513c38..0000000 --- a/src/main/java/de/uniluebeck/mi/projmi6/HL7.java +++ /dev/null @@ -1,294 +0,0 @@ -package de.uniluebeck.mi.projmi6; - -import ca.uhn.hl7v2.DefaultHapiContext; -import ca.uhn.hl7v2.HL7Exception; -import ca.uhn.hl7v2.HapiContext; -import ca.uhn.hl7v2.model.DataTypeException; -import ca.uhn.hl7v2.model.Message; -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.BAR_P05; -import ca.uhn.hl7v2.model.v251.segment.*; -import ca.uhn.hl7v2.parser.Parser; -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.sql.SQLException; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.util.ArrayList; -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. - * enthaelt alle Klassen um eine Hl7 Nachricht zu erstellen bzw. zu Parsen. - */ -public class HL7 { - - - - /** - * 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. - * @param fall nach dem Erstellen eines neuen Falls wird diese Methode aufgerufen um Hl7 Nachricht zu erzeugen - * @throws Exception - */ - public void createMessageADTA01( Fall fall) throws HL7Exception, IOException, SQLException { - Patient patient = fall.getPatient (); - ADT_A01 adt = new ADT_A01 (); - - //default MSH Values (Sets Segments: 1,2,7,9 - adt.initQuickstart ("ADT", "A01", "P"); - - //MSH Segment: - MSH mshSegment = adt.getMSH(); - mshSegment.getMsh3_SendingApplication ().getNamespaceID ().setValue ( "KISGruppe6" ); - mshSegment.getMsh5_ReceivingApplication ().getNamespaceID ().setValue("OPS Gruppe von Maurice und Torben"); - mshSegment.getMsh12_VersionID ().getVersionID ().setValue ( "2.2" ); - mshSegment.getMsh15_AcceptAcknowledgmentType ().setValue ( "AL" ); - //Security? - //Message Control ID? - //Processing ID? - //Sequence Number ? - //Contituation Pointer ? - //Cointry Code - //Character Set - //Principal Language of Message - - //EVN Segment: - EVN evnSegment = adt.getEVN (); - evnSegment.getEvn1_EventTypeCode ().setValue ("A01"); - evnSegment.getEvn4_EventReasonCode ().setValue ( "01" ); - //Operator ID - //Event occured - - //PID - PID pidSegment = adt.getPID (); - pidSegment.getPid3_PatientIdentifierList (0).getIDNumber ().setValue ( Integer.toString(patient.getPatID ()) ); - pidSegment.getPid5_PatientName (0).getFamilyName ().getSurname ().setValue ( patient.getNachname () ); - pidSegment.getPid5_PatientName (0).getGivenName ().setValue ( patient.getVorname () ); - pidSegment.getPid7_DateTimeOfBirth ().getTime ().setValue ( patient.getGeburtsdatum ().toString () ); - pidSegment.getPid8_AdministrativeSex ().setValue ( patient.getGeschlecht ().toString () ); - pidSegment.getPid11_PatientAddress (0).getStreetAddress ().getStreetName().setValue ( patient.getStrasse () ); - pidSegment.getPid11_PatientAddress (0).getStreetAddress ().getDwellingNumber ( ).setValue ( patient.getHausnummer () ); - pidSegment.getPid11_PatientAddress (0).getCity ().setValue (patient.getOrt () ); - pidSegment.getPid13_PhoneNumberHome (0).getTelephoneNumber ().setValue ( patient.getTelefon () ); - pidSegment.getPid16_MaritalStatus ().getAlternateIdentifier ().setValue ( patient.getFamilienstand ().toString()); - - //Diagnosen - List diagnosen = getDiagnosenByFall ( fall ); - diagnosen.add(fall.getHauptDiagnose ()); - 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 ); - } - } - - printXMLEncodedMessageADT(adt); - - } - - /** - * - * @param msg - */ - public void parseMessage(Message msg) throws HL7Exception, SQLException { - if (msg instanceof BAR_P05) { - BAR_P05 p05 = (BAR_P05) msg; - PID pidSegment = p05.getPID(); - EVN evnSegment = p05.getEVN (); - Patient patient; - Fall fall; - Station station; - StationsHistorie statHist; - List diagnosenP05 = new ArrayList<> ( ); - List untersuchungenP05 = new ArrayList<> ( ); - List 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 diagnosenKIS; - //TODO dbHandler query getDiagnosen by FallID um herauszufinden ob DIagnose geupdatet werden soll oder neu erzeugt - List 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 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 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 ())); - - } - } - - 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 (); - - LocalTime bearbeitetZeit = LocalTime.of(stunden,minuten,sekunden); - LocalDate bearbeitetDate = LocalDate.of(jahr, monat, tag); - LocalDateTime ldt = LocalDateTime.of(bearbeitetDate, bearbeitetZeit); - - 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.defaultValidation()); - PipeParser parser = context.getPipeParser(); - try { - parser.encode(msg); - } catch (HL7Exception e) { - System.out.println("invaid message!" +e); - } - - } - - - - - -} diff --git a/src/main/java/de/uniluebeck/mi/projmi6/hapi/HL7Sender.java b/src/main/java/de/uniluebeck/mi/projmi6/hapi/HL7Sender.java new file mode 100644 index 0000000..0813474 --- /dev/null +++ b/src/main/java/de/uniluebeck/mi/projmi6/hapi/HL7Sender.java @@ -0,0 +1,143 @@ +package de.uniluebeck.mi.projmi6.hapi; + +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.v251.message.ADT_A01; +import ca.uhn.hl7v2.model.v251.segment.DG1; +import ca.uhn.hl7v2.model.v251.segment.EVN; +import ca.uhn.hl7v2.model.v251.segment.MSH; +import ca.uhn.hl7v2.model.v251.segment.PID; +import ca.uhn.hl7v2.parser.Parser; +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.Diagnose; +import de.uniluebeck.mi.projmi6.model.Fall; +import de.uniluebeck.mi.projmi6.model.Patient; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.sql.SQLException; +import java.time.LocalDateTime; +import java.util.List; + +import static de.uniluebeck.mi.projmi6.db.DBHandler.getDiagnosenByFall; + +/** + * Created by taschi on 22.11.15. + */ +public class HL7Sender { + + /** + * 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. + * @param fall nach dem Erstellen eines neuen Falls wird diese Methode aufgerufen um Hl7 Nachricht zu erzeugen + * @throws Exception + */ + public void createMessageADTA01( Fall fall) throws HL7Exception, IOException, SQLException { + Patient patient = fall.getPatient (); + ADT_A01 adt = new ADT_A01 (); + + //default MSH Values (Sets Segments: 1,2,7,9 + adt.initQuickstart ("ADT", "A01", "P"); + + //MSH Segment: + MSH mshSegment = adt.getMSH(); + mshSegment.getMsh3_SendingApplication ().getNamespaceID ().setValue ( "KISGruppe6" ); + mshSegment.getMsh5_ReceivingApplication ().getNamespaceID ().setValue("OPS Gruppe von Maurice und Torben"); + mshSegment.getMsh12_VersionID ().getVersionID ().setValue ( "2.2" ); + mshSegment.getMsh15_AcceptAcknowledgmentType ().setValue ( "AL" ); + //Security? + //Message Control ID? + //Processing ID? + //Sequence Number ? + //Contituation Pointer ? + //Cointry Code + //Character Set + //Principal Language of Message + + //EVN Segment: + EVN evnSegment = adt.getEVN (); + evnSegment.getEvn1_EventTypeCode ().setValue ("A01"); + evnSegment.getEvn4_EventReasonCode ().setValue ( "01" ); + //Operator ID + //Event occured + + //PID + PID pidSegment = adt.getPID (); + pidSegment.getPid3_PatientIdentifierList (0).getIDNumber ().setValue ( Integer.toString(patient.getPatID ()) ); + pidSegment.getPid5_PatientName (0).getFamilyName ().getSurname ().setValue ( patient.getNachname () ); + pidSegment.getPid5_PatientName (0).getGivenName ().setValue ( patient.getVorname () ); + pidSegment.getPid7_DateTimeOfBirth ().getTime ().setValue ( patient.getGeburtsdatum ().toString () ); + pidSegment.getPid8_AdministrativeSex ().setValue ( patient.getGeschlecht ().toString () ); + pidSegment.getPid11_PatientAddress (0).getStreetAddress ().getStreetName().setValue ( patient.getStrasse () ); + pidSegment.getPid11_PatientAddress (0).getStreetAddress ().getDwellingNumber ( ).setValue ( patient.getHausnummer () ); + pidSegment.getPid11_PatientAddress (0).getCity ().setValue (patient.getOrt () ); + pidSegment.getPid13_PhoneNumberHome (0).getTelephoneNumber ().setValue ( patient.getTelefon () ); + pidSegment.getPid16_MaritalStatus ().getAlternateIdentifier ().setValue ( patient.getFamilienstand ().toString()); + + //Diagnosen + List diagnosen = getDiagnosenByFall ( fall ); + diagnosen.add(fall.getHauptDiagnose ()); + 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 ); + } + } + + 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, 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.defaultValidation()); + PipeParser parser = context.getPipeParser(); + try { + parser.encode(msg); + } catch (HL7Exception e) { + System.out.println("invaid message!" +e); + } + + } + + +} From 289b67f8140d838803d962d9d5b7554fda85136e Mon Sep 17 00:00:00 2001 From: taschi Date: Sun, 22 Nov 2015 12:47:24 +0100 Subject: [PATCH 6/6] MSH der ADT A01 minimal angepasst --- .../de/uniluebeck/mi/projmi6/hapi/HL7Sender.java | 23 ++++++++-------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/main/java/de/uniluebeck/mi/projmi6/hapi/HL7Sender.java b/src/main/java/de/uniluebeck/mi/projmi6/hapi/HL7Sender.java index 0813474..fe1b0f0 100644 --- a/src/main/java/de/uniluebeck/mi/projmi6/hapi/HL7Sender.java +++ b/src/main/java/de/uniluebeck/mi/projmi6/hapi/HL7Sender.java @@ -42,28 +42,21 @@ public class HL7Sender { Patient patient = fall.getPatient (); ADT_A01 adt = new ADT_A01 (); - //default MSH Values (Sets Segments: 1,2,7,9 + //default MSH Values (Sets Segments: 1,2,7,9,11 adt.initQuickstart ("ADT", "A01", "P"); //MSH Segment: MSH mshSegment = adt.getMSH(); - mshSegment.getMsh3_SendingApplication ().getNamespaceID ().setValue ( "KISGruppe6" ); - mshSegment.getMsh5_ReceivingApplication ().getNamespaceID ().setValue("OPS Gruppe von Maurice und Torben"); - mshSegment.getMsh12_VersionID ().getVersionID ().setValue ( "2.2" ); - mshSegment.getMsh15_AcceptAcknowledgmentType ().setValue ( "AL" ); - //Security? - //Message Control ID? - //Processing ID? - //Sequence Number ? - //Contituation Pointer ? - //Cointry Code - //Character Set - //Principal Language of Message + mshSegment.getMsh3_SendingApplication ().getNamespaceID ().parse ( "KISGruppe6" ); + mshSegment.getMsh5_ReceivingApplication ().getNamespaceID ().parse("OPS Gruppe von Maurice und Torben"); + mshSegment.getMsh12_VersionID ().getVersionID ().parse ( "2.51" ); + mshSegment.getMsh15_AcceptAcknowledgmentType ().parse ( "AL" ); + //TODO check ob segment 10 gesetzt wurde //EVN Segment: EVN evnSegment = adt.getEVN (); - evnSegment.getEvn1_EventTypeCode ().setValue ("A01"); - evnSegment.getEvn4_EventReasonCode ().setValue ( "01" ); + evnSegment.getEvn1_EventTypeCode ().parse("A01"); + evnSegment.getEvn4_EventReasonCode ().parse ( "01" ); //Operator ID //Event occured