|
|
|
@@ -0,0 +1,150 @@ |
|
|
|
package de.uniluebeck.mi.projmi6.hapi2; |
|
|
|
|
|
|
|
import ca.uhn.hl7v2.HL7Exception; |
|
|
|
import ca.uhn.hl7v2.model.AbstractMessage; |
|
|
|
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.protocol.ReceivingApplication; |
|
|
|
import ca.uhn.hl7v2.protocol.ReceivingApplicationException; |
|
|
|
import de.uniluebeck.mi.projmi6.model.*; |
|
|
|
|
|
|
|
import java.io.IOException; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
/** |
|
|
|
* Created by nils on 20.11.2015. |
|
|
|
*/ |
|
|
|
public class HL7Recever2<T extends AbstractMessage> implements ReceivingApplication { |
|
|
|
private final Class<T> type; |
|
|
|
|
|
|
|
public HL7Recever2(Class<T> type) { |
|
|
|
this.type = type; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
public Message processMessage(Message message, Map<String, Object> metadata) throws ReceivingApplicationException, HL7Exception { |
|
|
|
|
|
|
|
if (type == ADT_A01.class) { |
|
|
|
return processADT_A01(message, metadata); |
|
|
|
} |
|
|
|
if (type == BAR_P05.class) { |
|
|
|
return processBAR_P05(message, metadata); |
|
|
|
} |
|
|
|
|
|
|
|
// TODO: Handle unknown Messages, maybe write to database, sen ACK and go on. |
|
|
|
try { |
|
|
|
return message.generateACK(); |
|
|
|
} catch (IOException e) { |
|
|
|
throw new HL7Exception(e); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public boolean canProcess(Message message) { |
|
|
|
// TODO: Erstmal alles processen. |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
private Message generateACK(Message message) throws HL7Exception { |
|
|
|
try { |
|
|
|
return message.generateACK(); |
|
|
|
} catch (IOException e) { |
|
|
|
throw new HL7Exception(e); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private Message processBAR_P05(Message message, Map<String, Object> metadata) throws HL7Exception { |
|
|
|
Patient patient = new Patient(); |
|
|
|
List<Fall> faelle = new ArrayList<>(); |
|
|
|
List<Untersuchung> ALLE_UNTERSUCHUNGEN = new ArrayList<>(); |
|
|
|
List<Diagnose> ALLE_DIAGNOSEN = new ArrayList<>(); |
|
|
|
|
|
|
|
BAR_P05 bar_p05 = (BAR_P05) message; |
|
|
|
|
|
|
|
MSH msh = bar_p05.getMSH(); |
|
|
|
PID pid = bar_p05.getPID(); |
|
|
|
|
|
|
|
patient.setPatID(Integer.parseInt(pid.getPatientID().encode())); |
|
|
|
|
|
|
|
List<BAR_P05_VISIT> visits = bar_p05.getVISITAll(); |
|
|
|
|
|
|
|
// Ab hier wird es dirty. |
|
|
|
for (BAR_P05_VISIT visit : visits) { |
|
|
|
|
|
|
|
Fall fall = new Fall(); |
|
|
|
fall.setPatient(patient); |
|
|
|
|
|
|
|
List<Diagnose> diagnosen = new ArrayList<>(); |
|
|
|
List<Untersuchung> untersuchungen = new ArrayList<>(); |
|
|
|
|
|
|
|
PV1 pv1 = visit.getPV1(); |
|
|
|
// TODO: Extract Station(PV1-3-1),Fachabteilung(PV1-3-4),Aufnahmedatum(PV1-44),Entlassungsdatum(PV1-45),Fallnummer(PV1-19) |
|
|
|
Station station = new Station(); |
|
|
|
station.setStation(pv1.getAssignedPatientLocation().getPointOfCare().encode()); |
|
|
|
station.setAbteilung(pv1.getAssignedPatientLocation().getFacility().encode()); |
|
|
|
StationsHistorie hist = new StationsHistorie(); |
|
|
|
hist.setStationKey(station.getStation()); |
|
|
|
hist.setAufnahmeDatum(HL7Util2.parseLocalDateTime(pv1.getAdmitDateTime().getTime())); |
|
|
|
hist.setEntlassungsDatum(HL7Util2.parseLocalDateTime(pv1.getDischargeDateTime()[0].getTime())); |
|
|
|
fall.setFallID(Integer.parseInt(pv1.getVisitNumber().encode())); |
|
|
|
|
|
|
|
List<DG1> dg1s = visit.getDG1All(); |
|
|
|
for (DG1 dg1 : dg1s) { |
|
|
|
Icd10Code icd10code = new Icd10Code(dg1.getDiagnosisCodeDG1().getIdentifier().encode(), "", 20); // TODO: Version hard gecoded. |
|
|
|
// TODO: Mitarbeiter ID anhand von EinweisenderArzt erkennen! |
|
|
|
String einweisenderarzt = dg1.getDiagnosingClinician(0).encode(); // TODO: Wir holen uns immer den ersten der verantwortlichen Aerzte... |
|
|
|
int mitarbid = 1000; // TODO: SQL: SELECT * FROM Mitarbeiter WHERE einweisenderarzt = ... |
|
|
|
Mitarbeiter mitarbeiter = new Mitarbeiter(mitarbid); |
|
|
|
|
|
|
|
Diagnose diagnose = new Diagnose(); |
|
|
|
diagnose.setIcd10code(icd10code); |
|
|
|
diagnose.setArzt(mitarbeiter); // TODO: (DG1-16) |
|
|
|
diagnose.setFall(fall); |
|
|
|
// diagnose.setDiagArt(); // TODO: (DG1-6) // Enum umstellen???? |
|
|
|
|
|
|
|
diagnosen.add(diagnose); |
|
|
|
} |
|
|
|
List<BAR_P05_PROCEDURE> procedures = visit.getPROCEDUREAll(); |
|
|
|
for (BAR_P05_PROCEDURE procedure : procedures) { |
|
|
|
PR1 pr1 = procedure.getPR1(); |
|
|
|
Untersuchung untersuchung = new Untersuchung(); |
|
|
|
untersuchung.setFall(fall); |
|
|
|
|
|
|
|
OpsCode opscode = new OpsCode(pr1.getProcedureCode().encode(), "", 20); // TODO: Version hardcoded... |
|
|
|
untersuchung.setOpscode(opscode); |
|
|
|
untersuchung.setUntersuchungsdatum(HL7Util2.parseLocalDateTime(pr1.getProcedureDateTime().getTime())); |
|
|
|
|
|
|
|
String einweisenderarzt = pr1.getPr112_ProcedurePractitioner(0).encode(); // TODO: Wieder nur den ersten Arzt.. |
|
|
|
int mitarbid = 1000; // TODO: Siehe oben |
|
|
|
untersuchung.setDurchfuehrenderArzt(new Mitarbeiter(mitarbid)); |
|
|
|
|
|
|
|
// TODO: Extract OPS(3), Zeitpunkt(5), Arzt(12) |
|
|
|
|
|
|
|
untersuchungen.add(untersuchung); |
|
|
|
} |
|
|
|
|
|
|
|
// TODO: hier jeweils Fall, Untersuchung und Diagnosen in die Datenbank schreiben... |
|
|
|
faelle.add(fall); |
|
|
|
ALLE_DIAGNOSEN.addAll(diagnosen); |
|
|
|
ALLE_UNTERSUCHUNGEN.addAll(untersuchungen); |
|
|
|
} |
|
|
|
|
|
|
|
return generateACK(message); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private Message processADT_A01(Message message, Map<String, Object> metadata) throws HL7Exception { |
|
|
|
ADT_A01 adt_a01 = (ADT_A01) message; |
|
|
|
System.out.println(adt_a01.toString()); |
|
|
|
|
|
|
|
return generateACK(message); |
|
|
|
} |
|
|
|
|
|
|
|
} |