瀏覽代碼

Hl7 Datei geupdatet

master
taschi 10 年之前
父節點
當前提交
877c71c1b6
共有 1 個檔案被更改,包括 191 行新增53 行删除
  1. +191
    -53
      src/main/java/de/uniluebeck/mi/projmi6/HL7.java

+ 191
- 53
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.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);
}


} }








} }

Loading…
取消
儲存