Im Rahmen der Veranstaltung "CS3330 - Projektpraktikum MedizinischeInformatik" an der Universität zu Lübeck entstandenes Krankenhausinformationssystem (KIS).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

157 lines
6.9 KiB

  1. package de.uniluebeck.mi.projmi6;
  2. import ca.uhn.hl7v2.DefaultHapiContext;
  3. import ca.uhn.hl7v2.HL7Exception;
  4. import ca.uhn.hl7v2.HapiContext;
  5. import ca.uhn.hl7v2.model.DataTypeException;
  6. import ca.uhn.hl7v2.model.Message;
  7. import ca.uhn.hl7v2.model.v25.datatype.DTM;
  8. import ca.uhn.hl7v2.model.v251.datatype.FN;
  9. import ca.uhn.hl7v2.model.v251.message.ADT_A01;
  10. import ca.uhn.hl7v2.model.v251.message.BAR_P05;
  11. import ca.uhn.hl7v2.model.v251.segment.*;
  12. import ca.uhn.hl7v2.parser.Parser;
  13. import de.uniluebeck.mi.projmi6.model.Diagnose;
  14. import de.uniluebeck.mi.projmi6.model.Fall;
  15. import de.uniluebeck.mi.projmi6.model.Patient;
  16. import java.io.IOException;
  17. import java.sql.Time;
  18. import java.time.LocalDate;
  19. import java.time.LocalDateTime;
  20. import java.time.LocalTime;
  21. import java.util.ArrayList;
  22. import java.util.List;
  23. /**
  24. * Created by taschi on 15.11.15.
  25. * enthaelt alle Klassen um eine Hl7 Nachricht zu erstellen bzw. zu Parsen.
  26. */
  27. public class HL7 {
  28. /**
  29. * erstellt eine ADT_A0 nachricht, welche anschließend an die OPS Gruppe verschickt werden soll.
  30. * TODO Mit OPS Gruppe absprechen, welche Informationen sie auf jeden Fall benötigen und Code entsprechend anpassen.
  31. * @param fall nach dem Erstellen eines neuen Falls wird diese Methode aufgerufen um Hl7 Nachricht zu erzeugen
  32. * @param diagnosen Liste aller Nebendiagnosen momentan noch als einzelne Liste uebereben. eventuell die Nebendiagnosen direkt im Fall speichern?
  33. * @throws Exception
  34. */
  35. public void createMessageADTA01( Fall fall, List<Diagnose> diagnosen) throws HL7Exception, IOException {
  36. Patient patient = fall.getPatient ();
  37. ADT_A01 adt = new ADT_A01 ();
  38. //default MSH Values (Sets Segments: 1,2,7,9
  39. adt.initQuickstart ("ADT", "A01", "P");
  40. //MSH Segment:
  41. MSH mshSegment = adt.getMSH();
  42. mshSegment.getMsh3_SendingApplication ().getNamespaceID ().setValue ( "KISGruppe6" );
  43. mshSegment.getMsh5_ReceivingApplication ().getNamespaceID ().setValue("OPS Gruppe von Maurice und Torben");
  44. mshSegment.getMsh12_VersionID ().getVersionID ().setValue ( "2.2" );
  45. mshSegment.getMsh15_AcceptAcknowledgmentType ().setValue ( "AL" );
  46. //Security?
  47. //Message Control ID?
  48. //Processing ID?
  49. //Sequence Number ?
  50. //Contituation Pointer ?
  51. //Cointry Code
  52. //Character Set
  53. //Principal Language of Message
  54. //EVN Segment:
  55. EVN evnSegment = adt.getEVN ();
  56. evnSegment.getEvn1_EventTypeCode ().setValue ("A01");
  57. evnSegment.getEvn4_EventReasonCode ().setValue ( "01" );
  58. //Operator ID
  59. //Event occured
  60. //PID
  61. PID pidSegment = adt.getPID ();
  62. pidSegment.getPid3_PatientIdentifierList (0).getIDNumber ().setValue ( Integer.toString(patient.getPatID ()) );
  63. pidSegment.getPid5_PatientName (0).getFamilyName ().getSurname ().setValue ( patient.getNachname () );
  64. pidSegment.getPid5_PatientName (0).getGivenName ().setValue ( patient.getVorname () );
  65. pidSegment.getPid7_DateTimeOfBirth ().getTime ().setValue ( patient.getGeburtsdatum ().toString () );
  66. pidSegment.getPid8_AdministrativeSex ().setValue ( patient.getGeschlecht ().toString () );
  67. pidSegment.getPid11_PatientAddress (0).getStreetAddress ().getStreetName().setValue ( patient.getStrasse () );
  68. pidSegment.getPid11_PatientAddress (0).getStreetAddress ().getDwellingNumber ( ).setValue ( patient.getHausnummer () );
  69. pidSegment.getPid11_PatientAddress (0).getCity ().setValue (patient.getOrt () );
  70. pidSegment.getPid13_PhoneNumberHome (0).getTelephoneNumber ().setValue ( patient.getTelefon () );
  71. pidSegment.getPid16_MaritalStatus ().getAlternateIdentifier ().setValue ( patient.getFamilienstand ().toString());
  72. //Dg1 (Diagnosen)
  73. List<DG1> dg1List = new ArrayList<> ( );
  74. diagnosen.add(fall.getHauptDiagnose ());
  75. DG1 dg1Segment = adt.getDG1 ();
  76. for (Diagnose aDiagnosen : diagnosen) {
  77. dg1Segment = adt.getDG1 ();
  78. dg1Segment.getDg12_DiagnosisCodingMethod ().setValue ( "ICD10" );
  79. dg1Segment.getDg13_DiagnosisCodeDG1 ().getIdentifier ().setValue ( "CODE" );
  80. dg1Segment.getDg14_DiagnosisDescription ().setValue ( aDiagnosen.getFreiText () );
  81. dg1List.add ( dg1Segment );
  82. }
  83. //print generated message
  84. // printXMLEncodedMessageADT(adt);
  85. }
  86. /**
  87. * gibt erzeugte hl7 Nachricht auf der Konsole aus (Kann nach Debug phase wieder geloescht werden)
  88. * @param msg
  89. * @throws HL7Exception
  90. */
  91. public void printXMLEncodedMessageADT(Message msg) throws HL7Exception {
  92. HapiContext context = new DefaultHapiContext ();
  93. Parser parser = context.getXMLParser();
  94. String encodedMessage = parser.encode (msg);
  95. System.out.println (encodedMessage);
  96. }
  97. /**
  98. *
  99. * @param msg
  100. */
  101. public void parseMessage(Message msg) throws DataTypeException {
  102. if (msg instanceof BAR_P05) {
  103. BAR_P05 p05 = (BAR_P05) msg;
  104. Patient patient = new Patient();
  105. Fall fall = new Fall();
  106. EVN evnSegment = p05.getEVN ();
  107. LocalDateTime ldt = generateLocalDateTimeFromHl7(p05);
  108. patient.setBearbeitetDatumZeit(ldt);
  109. //patient.setBearbeiter(evnSegment.getEvn5_OperatorID(0).getIDNumber());
  110. PID pidSegment = p05.getPID();
  111. patient.setPatID(Integer.valueOf(pidSegment.getPid3_PatientIdentifierList(0).getIDNumber().getValue()));//evt das 4. Segment
  112. patient.setNachname(pidSegment.getPid5_PatientName(0).getFamilyName().getName());
  113. patient.setVorname(pidSegment.getPid5_PatientName(0).getGivenName().getValue());
  114. ca.uhn.hl7v2.model.v251.datatype.DTM geburtsTag = pidSegment.getPid7_DateTimeOfBirth().getTime();
  115. LocalDate ld = LocalDate.of(geburtsTag.getYear(),geburtsTag.getMonth(),geburtsTag.getDay());
  116. patient.setGeburtsdatum(ld);
  117. // patient.setGeschlecht(pidSegment.getPid8_AdministrativeSex().getValue());
  118. }
  119. }
  120. public LocalDateTime generateLocalDateTimeFromHl7(BAR_P05 msg) throws DataTypeException {
  121. EVN evnSegment = msg.getEVN();
  122. int stunden = evnSegment.getEvn2_RecordedDateTime ().getTime ().getHour ();
  123. int minuten = evnSegment.getEvn2_RecordedDateTime ().getTime ().getMinute ();
  124. int sekunden = evnSegment.getEvn2_RecordedDateTime ().getTime ().getSecond ();
  125. int tag = evnSegment.getEvn2_RecordedDateTime ().getTime ().getDay ();
  126. int monat = evnSegment.getEvn2_RecordedDateTime ().getTime ().getMonth ();
  127. int jahr = evnSegment.getEvn2_RecordedDateTime ().getTime ().getYear ();
  128. LocalTime bearbeitetZeit = LocalTime.of(stunden,minuten,sekunden);
  129. LocalDate bearbeitetDate = LocalDate.of(jahr, monat, tag);
  130. LocalDateTime ldt = LocalDateTime.of(bearbeitetDate, bearbeitetZeit);
  131. return ldt;
  132. }
  133. }