Im Rahmen der Veranstaltung "CS3330 - Projektpraktikum MedizinischeInformatik" an der Universität zu Lübeck entstandenes Krankenhausinformationssystem (KIS).
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

844 righe
36 KiB

  1. package de.uniluebeck.mi.projmi6.db;
  2. import de.uniluebeck.mi.projmi6.model.*;
  3. import java.sql.*;
  4. import java.time.LocalDateTime;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. /**
  8. * Handler fuer alle DB Interaktionen.
  9. */
  10. public class DBHandler {
  11. private static final String SELECT_ALL_PATIENTS = "SELECT * FROM `patient`";
  12. private static final String SELECT_PATIENT_BY_ID = "SELECT * FROM `patient` WHERE `id` = ?";
  13. private static final String UPDATE_PATIENT = "UPDATE `patient`" +
  14. "SET `CAVE`=?," +
  15. "`Vorname`=?," +
  16. "`Geburtsname`=?," +
  17. "`Nachname`=?," +
  18. "`Geburtsdatum`=?," +
  19. "`Geschlecht`=?," +
  20. "`Familienstand`=?," +
  21. "`Strasse`=?," +
  22. "`Hausnummer`=?," +
  23. "`PLZ`=?," +
  24. "`Ort`=?," +
  25. "`Telefon`=?," +
  26. "`KassenID`=?," +
  27. "`Versichertennummer`=?," +
  28. "`LetzterBearbeiter`=? " +
  29. "WHERE `ID`=?";
  30. private static final String INSERT_PATIENT = "INSERT INTO `patient`" +
  31. "(`CAVE`," +
  32. "`Vorname`," +
  33. "`Geburtsname`," +
  34. "`Nachname`," +
  35. "`Geburtsdatum`," +
  36. "`Geschlecht`," +
  37. "`Familienstand`," +
  38. "`Strasse`," +
  39. "`Hausnummer`," +
  40. "`PLZ`," +
  41. "`Ort`," +
  42. "`Telefon`," +
  43. "`KassenID`," +
  44. "`Versichertennummer`," +
  45. "`LetzterBearbeiter`," +
  46. "`Ersteller`)" +
  47. "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
  48. private static final String SELECT_ALL_STATIONEN = "SELECT *,`r`.`abteilung` AS abteilung " +
  49. "FROM `stammstation` s " +
  50. "INNER JOIN `relfachrichtungstation` r ON s.station = r.station";
  51. private static final String SELECT_FAELLE_BY_PATID = "SELECT * FROM `fall` WHERE `patientid` = ?";
  52. private static final String INSERT_FALL = "INSERT INTO `fall`" +
  53. "(`Aufnahmedatum`," +
  54. "`Entlassungsdatum`," +
  55. "`Vorstelldatum`," +
  56. "`EinweisenderArzt`," +
  57. "`Fallart`," +
  58. "`Selbsteinweisung`," +
  59. "`Hauptdiagnose`," +
  60. "`Versichertennummer`," +
  61. "`KassenID`," +
  62. "`storniert`," +
  63. "`LetzterBearbeiter`," +
  64. "`PatientID`," +
  65. "`Ersteller`)" +
  66. "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
  67. private static final String UPDATE_FALL = "UPDATE `fall`" +
  68. "SET `Aufnahmedatum`=?," +
  69. "`Entlassungsdatum`=?," +
  70. "`Vorstelldatum`=?," +
  71. "`EinweisenderArzt`=?," +
  72. "Fallart=?," +
  73. "`Selbsteinweisung`=?," +
  74. "Hauptdiagnose=?," +
  75. "`Versichertennummer`=?," +
  76. "KassenID=?," +
  77. "`storniert`=?," +
  78. "LetzterBearbeiter=? " +
  79. "WHERE `FallID`=?";
  80. private static final String SELECT_DIAGNOSE_BY_ID = "SELECT * FROM `diagnose` WHERE `diagid` = ?";
  81. private static final String SELECT_ALL_ICD10CODES = "SELECT * FROM `stammicd10`";
  82. private static final String SELECT_ALL_OPSCODES = "SELECT * FROM `stammops`";
  83. private static final String SELECT_ICD10CODE_BY_ID = "SELECT * FROM `stammicd10` WHERE `icd10code` = ? AND `version` = ?";
  84. private static final String SELECT_OPSCODE_BY_ID = "SELECT * FROM `stammops` WHERE `opscode` = ? AND `version` = ?";
  85. private static final String SELECT_ALL_MITARBEITER = "SELECT * FROM `mitarbeiter`";
  86. private static final String SELECT_UNTERS_BY_FALLID = "SELECT * FROM `untersuchung` WHERE `fallid` = ?";
  87. private static final String INSERT_UNTERSUCHUNG = "INSERT INTO `untersuchung`" +
  88. "(`DurchfuehrenderArzt`," +
  89. "`FallID`," +
  90. "`OPSCode`," +
  91. "`OPSVersion`," +
  92. "`storniert`," +
  93. "`Untersuchungsdatum`," +
  94. "`LetzterBearbeiter`," +
  95. "`Ersteller`)" +
  96. "VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
  97. private static final String UPDATE_UNTERSUCHUNG = "UPDATE `untersuchung` " +
  98. "SET `DurchfuehrenderArzt`=?," +
  99. "`FallID`=?," +
  100. "`OPSCode`=?," +
  101. "`OPSVersion`=?," +
  102. "`storniert`=?," +
  103. "`Untersuchungsdatum`=?," +
  104. "`LetzterBearbeiter`=? " +
  105. "WHERE `UntersID`=?";
  106. private static final String SELECT_MITARBEITER_BY_ID = "SELECT * FROM `mitarbeiter` WHERE `mitarbid` = ?";
  107. private static final String SELECT_DIAGNOSE_BY_FALLID = "SELECT * FROM `diagnose` WHERE `fallid` = ?";
  108. private static final String SELECT_ALL_KASSEN = "SELECT * FROM `kasse`";
  109. private static final String SELECT_KASSE_BY_KASSENID = "SELECT * FROM `kasse` WHERE `kasse`.`KassenID` = ?";
  110. private static final String SELECT_STATHIST_BY_FALLID = "SELECT * FROM `stationshistorie` WHERE `stationshistorie`.`fallid` = ?";
  111. private static final String SELECT_STATUBERITEMS_BY_STATION = "SELECT p.id AS patid," +
  112. "concat(p.nachname, ', ', p.vorname) AS patname," +
  113. "p.geburtsdatum AS dob," +
  114. "timestampdiff(YEAR, p.geburtsdatum, curdate()) AS patage," +
  115. "f.aufnahmedatum AS aufnahme," +
  116. "f.entlassungsdatum AS entlassung," +
  117. "f.fallid AS fallid " +
  118. "FROM stationshistorie s " +
  119. "INNER JOIN fall f ON s.fallid = f.fallid " +
  120. "INNER JOIN patient p ON f.patientid = p.id " +
  121. "WHERE s.station = ?";
  122. private static final String INSERT_STATHISTENTRY = "INSERT INTO `stationshistorie`" +
  123. "(`Aufnahmedatum`," +
  124. "`Entlassungsdatum`," +
  125. "`FallID`," +
  126. "`LetzterBearbeiter`," +
  127. "`Station`," +
  128. "`Ersteller`)" +
  129. "VALUES (?, ?, ?, ?, ?, ?)";
  130. private static final String UPDATE_STATHISTENTRY = "UPDATE `stationshistorie` " +
  131. "SET `Aufnahmedatum`=?," +
  132. "`Entlassungsdatum`=?," +
  133. "`FallID`=?," +
  134. "`LetzterBearbeiter`=?," +
  135. "`Station`=? " +
  136. "WHERE `StatHistID`=?";
  137. private static final String SELECT_LAST_HL7ENTRIES = "SELECT * FROM `hl7_nachrichten` limit ?";
  138. private static final String INSERT_HL7NACHRICHT = "INSERT INTO `hl7_nachrichten` " +
  139. "(`hl7msg`," +
  140. "`timestamp`," +
  141. "`source`) " +
  142. "VALUES (?, ?, ?)";
  143. private static final String INSERT_DIAGNOSE = "INSERT INTO `diagnose` " +
  144. "(`Arzt`," +
  145. "`DiagArt`," +
  146. "`Ersteller`," +
  147. "`Freitext`," +
  148. "`ICD10Code`," +
  149. "`ICD10Version`," +
  150. "`LetzterBearbeiter`," +
  151. "`FallID`) " +
  152. "VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
  153. private static final String DELETE_STATHIST = "DELETE FROM `stationshistorie` WHERE `StatHistID` =?";
  154. private DBHandler() {
  155. }
  156. /**
  157. * Gibt alle {@link Patient} aus der DB zurueck.
  158. *
  159. * @return Liste aller {@link Patient}.
  160. * @throws SQLException wenn Fehler bei der SQL Verarbeitung auftreten.
  161. */
  162. public static List<Patient> getAllPatients() throws SQLException {
  163. Statement statement = MySqlConnectionFactory.getConnection().createStatement();
  164. ResultSet rs = statement.executeQuery(SELECT_ALL_PATIENTS);
  165. List<Patient> patients = new ArrayList<>();
  166. while (rs.next()) {
  167. patients.add(getPatient(rs));
  168. }
  169. return patients;
  170. }
  171. /**
  172. * Extrahiert ein Objekt {@link Patient} aus einem gegebenen {@link ResultSet}.
  173. *
  174. * @param rs ResultSet from Database Query.
  175. * @return {@link Patient}
  176. * @throws SQLException
  177. */
  178. private static Patient getPatient(ResultSet rs) throws SQLException {
  179. Patient patient = new Patient();
  180. patient.setPatID(rs.getInt("id"));
  181. patient.setGeburtsname(rs.getString("geburtsname"));
  182. patient.setVorname(rs.getString("vorname"));
  183. patient.setNachname(rs.getString("nachname"));
  184. if (rs.getDate("geburtsdatum") != null) {
  185. patient.setGeburtsdatum(rs.getDate("geburtsdatum").toLocalDate());
  186. }
  187. patient.setCave(rs.getString("cave"));
  188. patient.setStrasse(rs.getString("strasse"));
  189. patient.setHausnummer(rs.getString("hausnummer"));
  190. patient.setPlz(rs.getString("plz"));
  191. patient.setOrt(rs.getString("ort"));
  192. patient.setTelefon(rs.getString("telefon"));
  193. if (rs.getString("familienstand") != null) {
  194. patient.setFamilienstand(Patient.Familienstand.parseChar(rs.getString("familienstand").charAt(0)));
  195. }
  196. if (rs.getString("geschlecht") != null) {
  197. patient.setGeschlecht(Patient.Geschlecht.parseChar(rs.getString("geschlecht").charAt(0)));
  198. }
  199. patient.setVersichertennummer(rs.getString("versichertennummer"));
  200. patient.setKassenID(rs.getInt("kassenid"));
  201. setVersionInformation(patient, rs);
  202. return patient;
  203. }
  204. // TODO: Never used.
  205. public static Patient getPatient(int id) throws SQLException {
  206. PreparedStatement statement = MySqlConnectionFactory.getConnection().prepareStatement(SELECT_PATIENT_BY_ID);
  207. ResultSet rs;
  208. statement.setInt(1, id);
  209. rs = statement.executeQuery();
  210. return getPatient(rs);
  211. }
  212. /**
  213. * Fuehrt {@code INSERT} bei einem neuen Datensatz und {@code UPDATE} bei einem existierenden Datensatz aus.
  214. *
  215. * @param patient zu verarbeitender Datensatz.
  216. * @param mitarbid {@link Mitarbeiter#mitarbID} des aktuellen Benutzers/Mitarbeiters.
  217. * @param isUpdate {@code true} wenn der Datensatz bereits existiert, sonst {@code false}.
  218. * @throws SQLException wenn Fehler bei der SQL Verarbeitung auftreten.
  219. */
  220. public static void setPatient(Patient patient, int mitarbid, boolean isUpdate) throws SQLException {
  221. PreparedStatement statement;
  222. if (isUpdate) {
  223. statement = MySqlConnectionFactory.getConnection().prepareStatement(UPDATE_PATIENT);
  224. } else {
  225. statement = MySqlConnectionFactory.getConnection().prepareStatement(INSERT_PATIENT);
  226. }
  227. statement.setString(1, patient.getCave()); // CAVE
  228. statement.setString(2, patient.getVorname()); // Vorname
  229. statement.setString(3, patient.getGeburtsname()); // Geburtsname
  230. statement.setString(4, patient.getNachname()); // Nachname
  231. statement.setDate(5, Date.valueOf(patient.getGeburtsdatum())); // Geburtsdatum
  232. if (patient.getGeschlecht() != null) {
  233. statement.setString(6, String.valueOf(patient.getGeschlecht().id())); // Geschlecht
  234. } else {
  235. statement.setString(6, String.valueOf(Patient.Geschlecht.OTHER.id()));
  236. }
  237. if (patient.getFamilienstand() != null) {
  238. statement.setString(7, String.valueOf(patient.getFamilienstand().id()));// Familienstand
  239. } else {
  240. statement.setString(7, String.valueOf(Patient.Familienstand.LEDIG.id()));
  241. }
  242. statement.setString(8, patient.getStrasse()); // Strasse
  243. statement.setString(9, patient.getHausnummer()); // Hausnummer
  244. statement.setString(10, patient.getPlz()); // PLZ
  245. statement.setString(11, patient.getOrt()); // Ort
  246. statement.setString(12, patient.getTelefon()); // Telefon
  247. statement.setInt(13, patient.getKassenID()); // KassenID
  248. statement.setString(14, patient.getVersichertennummer()); // Versichertennummer
  249. statement.setInt(15, mitarbid); // LetzterBearbeiter
  250. if (!isUpdate) {
  251. statement.setInt(16, mitarbid); // Ersteller
  252. } else {
  253. statement.setInt(16, patient.getPatID()); // PatID (WHERE)
  254. }
  255. statement.execute();
  256. }
  257. public static List<Station> getAllStationen() throws SQLException {
  258. Statement statement = MySqlConnectionFactory.getConnection().createStatement();
  259. ResultSet rs = statement.executeQuery(SELECT_ALL_STATIONEN);
  260. List<Station> stationen = new ArrayList<>();
  261. while (rs.next()) {
  262. stationen.add(getStation(rs));
  263. }
  264. return stationen;
  265. }
  266. /**
  267. * Extrahiert ein Objekt {@link Station} aus einem gegebenen {@link ResultSet}.
  268. *
  269. * @param rs ResultSet from Database Query.
  270. * @return {@link Station}
  271. * @throws SQLException wenn Fehler bei der SQL Verarbeitung auftreten.
  272. */
  273. private static Station getStation(ResultSet rs) throws SQLException {
  274. Station station = new Station();
  275. station.setStation(rs.getString("station"));
  276. station.setBezeichnung(rs.getString("bezeichnung"));
  277. station.setBezeichnungLang(rs.getString("bezeichnunglang"));
  278. station.setStationstyp(rs.getInt("stationstyp"));
  279. station.setAbteilung(rs.getString("abteilung"));
  280. return station;
  281. }
  282. public static List<StationsUebersichtsItem> getStationsUebersichtsItems(String station) throws SQLException {
  283. PreparedStatement statement = MySqlConnectionFactory.getConnection().prepareStatement(SELECT_STATUBERITEMS_BY_STATION);
  284. statement.setString(1, station);
  285. ResultSet rs = statement.executeQuery();
  286. List<StationsUebersichtsItem> statUeberItems = new ArrayList<>();
  287. while (rs.next()) {
  288. statUeberItems.add(getStatUeberItem(rs));
  289. }
  290. return statUeberItems;
  291. }
  292. private static StationsUebersichtsItem getStatUeberItem(ResultSet rs) throws SQLException {
  293. StationsUebersichtsItem item = new StationsUebersichtsItem();
  294. item.setFallId(rs.getInt("fallid"));
  295. item.setPatId(rs.getInt("patid"));
  296. item.setPatName(rs.getString("patname"));
  297. item.setPatAge(rs.getInt("patage"));
  298. item.setPatBirthdate(rs.getDate("dob").toLocalDate());
  299. if (rs.getDate("aufnahme") != null) {
  300. item.setStationAufnahme(rs.getDate("aufnahme").toLocalDate());
  301. }
  302. if (rs.getDate("entlassung") != null) {
  303. item.setStationEntlassung(rs.getDate("entlassung").toLocalDate());
  304. }
  305. return item;
  306. }
  307. public static List<StationsHistorie> getStationsHistorieByFall(Fall fall) throws SQLException {
  308. PreparedStatement statement = MySqlConnectionFactory.getConnection().prepareStatement(SELECT_STATHIST_BY_FALLID);
  309. statement.setInt(1, fall.getFallID());
  310. ResultSet rs = statement.executeQuery();
  311. List<StationsHistorie> historie = new ArrayList<>();
  312. while (rs.next()) {
  313. historie.add(getStationsHistorie(rs));
  314. }
  315. return historie;
  316. }
  317. public static void setStationsHistorie(StationsHistorie hist, boolean isUpdate) throws SQLException {
  318. PreparedStatement statement;
  319. if (isUpdate) {
  320. statement = MySqlConnectionFactory.getConnection().prepareStatement(UPDATE_STATHISTENTRY);
  321. } else {
  322. statement = MySqlConnectionFactory.getConnection().prepareStatement(INSERT_STATHISTENTRY);
  323. }
  324. if (hist.getAufnahmeDatum() != null) {
  325. statement.setTimestamp(1, Timestamp.valueOf(hist.getAufnahmeDatum())); // `Aufnahmedatum`
  326. } else {
  327. statement.setTimestamp(1, null);
  328. }
  329. if (hist.getEntlassungsDatum() != null) {
  330. statement.setTimestamp(2, Timestamp.valueOf(hist.getEntlassungsDatum())); // `Entlassungsdatum`
  331. } else {
  332. statement.setTimestamp(2, null);
  333. }
  334. statement.setInt(3, hist.getFallID()); // `FallID`
  335. statement.setInt(4, hist.getBearbeiter()); // `LetzterBearbeiter`
  336. statement.setString(5, hist.getStationKey()); // `Station`
  337. if (isUpdate) {
  338. statement.setInt(6, hist.getStatHistID()); // `StatHistID`
  339. statement.executeUpdate();
  340. } else {
  341. statement.setInt(6, hist.getErsteller()); // `Ersteller`
  342. statement.execute();
  343. }
  344. }
  345. public static void delStationsHistorie(StationsHistorie hist) throws SQLException {
  346. PreparedStatement statement = MySqlConnectionFactory.getConnection().prepareStatement(DELETE_STATHIST);
  347. statement.setInt(1, hist.getStatHistID());
  348. statement.execute();
  349. }
  350. private static StationsHistorie getStationsHistorie(ResultSet rs) throws SQLException {
  351. StationsHistorie hist = new StationsHistorie();
  352. hist.setStatHistID(rs.getInt("stathistid"));
  353. if (rs.getTimestamp("aufnahmedatum") != null) {
  354. hist.setAufnahmeDatum(rs.getTimestamp("aufnahmedatum").toLocalDateTime());
  355. }
  356. if (rs.getTimestamp("entlassungsdatum") != null) {
  357. hist.setEntlassungsDatum(rs.getTimestamp("entlassungsdatum").toLocalDateTime());
  358. }
  359. hist.setStationKey(rs.getString("station"));
  360. return hist;
  361. }
  362. public static List<Fall> getFaelleByPatID(int id) throws SQLException {
  363. PreparedStatement statement = MySqlConnectionFactory.getConnection().prepareStatement(SELECT_FAELLE_BY_PATID);
  364. statement.setInt(1, id);
  365. ResultSet rs = statement.executeQuery();
  366. List<Fall> faelle = new ArrayList<>();
  367. while (rs.next()) {
  368. faelle.add(getFall(rs));
  369. }
  370. return faelle;
  371. }
  372. /**
  373. * Extrahiert ein Objekt {@link Fall} aus einem gegebenen {@link ResultSet}.
  374. *
  375. * @param rs ResultSet from Database Query.
  376. * @return {@link Fall}
  377. * @throws SQLException wenn Fehler bei der SQL Verarbeitung auftreten.
  378. */
  379. private static Fall getFall(ResultSet rs) throws SQLException {
  380. Fall fall = new Fall();
  381. fall.setFallID(rs.getInt("fallid"));
  382. if (rs.getTimestamp("aufnahmedatum") != null) {
  383. fall.setAufnahmeDatum(rs.getTimestamp("aufnahmedatum").toLocalDateTime());
  384. }
  385. if (rs.getTimestamp("entlassungsdatum") != null) {
  386. fall.setEntlassungsDatum(rs.getTimestamp("entlassungsdatum").toLocalDateTime());
  387. }
  388. if (rs.getInt("hauptdiagnose") != 0) {
  389. fall.setHauptDiagnose(getDiagnose(rs.getInt("hauptdiagnose"), fall));
  390. }
  391. if (rs.getString("versichertennummer") != null) {
  392. fall.setVersichertenNummer(rs.getString("versichertennummer"));
  393. }
  394. if (rs.getInt("kassenid") != 0) {
  395. fall.setKasse(getKasse(rs.getInt("kassenid")));
  396. }
  397. fall.setFallArt(FallArt.parseString(rs.getString("fallart")));
  398. fall.setEinweisenderArzt(rs.getString("einweisenderarzt"));
  399. fall.setStorniert(rs.getBoolean("storniert"));
  400. return fall;
  401. }
  402. /**
  403. * Fuehrt {@code INSERT} bei einem neuen Datensatz und {@code UPDATE} bei einem existierenden Datensatz aus.
  404. *
  405. * @param fall zu verarbeitender Datensatz.
  406. * @param mitarbid {@link Mitarbeiter#mitarbID} des aktuellen Benutzers/Mitarbeiters.
  407. * @param isUpdate {@code true} wenn der Datensatz bereits existiert, sonst {@code false}.
  408. * @throws SQLException wenn Fehler bei der SQL Verarbeitung auftreten.
  409. */
  410. public static void setFall(Fall fall, int mitarbid, boolean isUpdate) throws SQLException {
  411. PreparedStatement statement;
  412. if (isUpdate) {
  413. statement = MySqlConnectionFactory.getConnection().prepareStatement(UPDATE_FALL);
  414. } else {
  415. statement = MySqlConnectionFactory.getConnection().prepareStatement(INSERT_FALL);
  416. }
  417. if (fall.getAufnahmeDatum() != null) {
  418. statement.setTimestamp(1, Timestamp.valueOf(fall.getAufnahmeDatum())); // Aufnahmedatum
  419. } else {
  420. statement.setTimestamp(1, null);
  421. }
  422. if (fall.getEntlassungsDatum() != null) {
  423. statement.setTimestamp(2, Timestamp.valueOf(fall.getEntlassungsDatum())); // Entlassungsdatum
  424. } else {
  425. statement.setTimestamp(2, null);
  426. }
  427. if (fall.getVorstellDatum() != null) {
  428. statement.setTimestamp(3, Timestamp.valueOf(fall.getVorstellDatum())); // Vorstelldatum
  429. } else {
  430. statement.setTimestamp(3, null);
  431. }
  432. if (fall.getEinweisenderArzt() != null) {
  433. statement.setString(4, fall.getEinweisenderArzt()); // EinweisenderArzt
  434. } else {
  435. statement.setTimestamp(4, null);
  436. }
  437. if (fall.getFallArt() != null) {
  438. statement.setString(5, fall.getFallArt().id()); // Fallart
  439. } else {
  440. statement.setString(5, null);
  441. }
  442. statement.setBoolean(6, fall.getSelbsteinweisung()); // Selbsteinweisung
  443. if (fall.getHauptdiagnoseId() != 0) {
  444. statement.setInt(7, fall.getHauptdiagnoseId()); // Hauptdiagnose
  445. } else {
  446. statement.setTimestamp(7, null);
  447. }
  448. statement.setString(8, fall.getVersichertenNummer()); // Versichertennummer
  449. if (fall.getKasse() != null) {
  450. statement.setInt(9, fall.getKasse().getKassenID()); // KassenID
  451. } else {
  452. statement.setTimestamp(9, null);
  453. }
  454. statement.setBoolean(10, fall.getStorniert()); // storniert
  455. statement.setInt(11, mitarbid); // Letzter Bearbeiter
  456. if (!isUpdate) {
  457. statement.setInt(12, fall.getPatient().getPatID()); // PatientID
  458. statement.setInt(13, mitarbid); // Ersteller
  459. }
  460. if (isUpdate) {
  461. statement.setInt(12, fall.getFallID());
  462. }
  463. statement.execute();
  464. }
  465. /**
  466. * Fuehrt {@code INSERT} eines neuen Datensatz durch.
  467. *
  468. * @param fall zu verarbeitender Datensatz.
  469. * @param mitarbid {@link Mitarbeiter#mitarbID} des aktuellen Benutzers/Mitarbeiters.
  470. * @throws SQLException wenn Fehler bei der SQL Verarbeitung auftreten.
  471. */
  472. public static void setFall(Fall fall, int mitarbid) throws SQLException {
  473. setFall(fall, mitarbid, false);
  474. }
  475. private static Diagnose getDiagnose(int diagid, Fall fall) throws SQLException {
  476. Diagnose diagnose = getDiagnose(diagid);
  477. diagnose.setFall(fall);
  478. return diagnose;
  479. }
  480. private static Diagnose getDiagnose(int id) throws SQLException {
  481. PreparedStatement statement = MySqlConnectionFactory.getConnection().prepareStatement(SELECT_DIAGNOSE_BY_ID);
  482. statement.setInt(1, id);
  483. ResultSet rs = statement.executeQuery();
  484. rs.next(); // TODO
  485. return getDiagnose(rs);
  486. }
  487. /**
  488. * Extrahiert ein Objekt {@link Diagnose} aus einem gegebenen {@link ResultSet}.
  489. *
  490. * @param rs ResultSet from Database Query.
  491. * @return {@link Diagnose}
  492. * @throws SQLException wenn Fehler bei der SQL Verarbeitung auftreten.
  493. */
  494. private static Diagnose getDiagnose(ResultSet rs) throws SQLException {
  495. Diagnose diagnose = new Diagnose();
  496. diagnose.setDiagID(rs.getInt("diagid"));
  497. diagnose.setFreiText(rs.getString("freitext"));
  498. diagnose.setArzt(new Mitarbeiter(rs.getInt("arzt")));
  499. diagnose.setDiagArt(DiagArt.parseInt(rs.getInt("diagart")));
  500. setVersionInformation(diagnose, rs);
  501. diagnose.setIcd10code(getIcd10Code(rs.getString("icd10code"), rs.getInt("icd10version")));
  502. return diagnose;
  503. }
  504. private static void setVersionInformation(Version version, ResultSet rs) throws SQLException {
  505. version.setErsteller(rs.getInt("ersteller"));
  506. if (rs.getTimestamp("erstelldatum") != null) {
  507. version.setErstellDatumZeit(rs.getTimestamp("erstelldatum").toLocalDateTime());
  508. }
  509. version.setBearbeiter(rs.getInt("letzterbearbeiter"));
  510. if (rs.getTimestamp("letztesbearbeitungsdatum") != null) {
  511. version.setBearbeitetDatumZeit(rs.getTimestamp("letztesbearbeitungsdatum").toLocalDateTime());
  512. }
  513. }
  514. public static List<Icd10Code> getAllIcd10Codes() throws SQLException {
  515. Statement statement = MySqlConnectionFactory.getConnection().createStatement();
  516. ResultSet rs = statement.executeQuery(SELECT_ALL_ICD10CODES);
  517. List<Icd10Code> icd10codes = new ArrayList<>();
  518. while (rs.next()) {
  519. icd10codes.add(getIcd10Code(rs));
  520. }
  521. return icd10codes;
  522. }
  523. private static Icd10Code getIcd10Code(String code, int version) throws SQLException {
  524. PreparedStatement statement = MySqlConnectionFactory.getConnection().prepareStatement(SELECT_ICD10CODE_BY_ID);
  525. ResultSet rs;
  526. statement.setString(1, code);
  527. statement.setInt(2, version);
  528. rs = statement.executeQuery();
  529. rs.next(); // TODO
  530. return getIcd10Code(rs);
  531. }
  532. /**
  533. * Extrahiert ein Objekt {@link Icd10Code} aus einem gegebenen {@link ResultSet}.
  534. *
  535. * @param rs ResultSet from Database Query.
  536. * @return {@link Icd10Code}
  537. * @throws SQLException wenn Fehler bei der SQL Verarbeitung auftreten.
  538. */
  539. private static Icd10Code getIcd10Code(ResultSet rs) throws SQLException {
  540. String code = rs.getString("icd10code");
  541. String text = rs.getString("text");
  542. int version = rs.getInt("version");
  543. return new Icd10Code(code, text, version);
  544. }
  545. public static List<OpsCode> getAllOpsCodes() throws SQLException {
  546. Statement statement = MySqlConnectionFactory.getConnection().createStatement();
  547. ResultSet rs = statement.executeQuery(SELECT_ALL_OPSCODES);
  548. List<OpsCode> opscodes = new ArrayList<>();
  549. while (rs.next()) {
  550. opscodes.add(getOpsCode(rs));
  551. }
  552. return opscodes;
  553. }
  554. private static OpsCode getOpsCode(String code, int version) throws SQLException {
  555. PreparedStatement statement = MySqlConnectionFactory.getConnection().prepareStatement(SELECT_OPSCODE_BY_ID);
  556. ResultSet rs;
  557. statement.setString(1, code);
  558. statement.setInt(2, version);
  559. rs = statement.executeQuery();
  560. rs.next(); // TODO
  561. return getOpsCode(rs);
  562. }
  563. /**
  564. * Extrahiert ein Objekt {@link OpsCode} aus einem gegebenen {@link ResultSet}.
  565. *
  566. * @param rs ResultSet from Database Query.
  567. * @return {@link OpsCode}
  568. * @throws SQLException wenn Fehler bei der SQL Verarbeitung auftreten.
  569. */
  570. private static OpsCode getOpsCode(ResultSet rs) throws SQLException {
  571. String code = rs.getString("opscode");
  572. String text = rs.getString("text");
  573. int version = rs.getInt("version");
  574. return new OpsCode(code, text, version);
  575. }
  576. public static List<Mitarbeiter> getAllMitarbeiter() throws SQLException {
  577. Statement statement = MySqlConnectionFactory.getConnection().createStatement();
  578. ResultSet rs = statement.executeQuery(SELECT_ALL_MITARBEITER);
  579. List<Mitarbeiter> mitarbeiters = new ArrayList<>();
  580. while (rs.next()) {
  581. mitarbeiters.add(getMitarbeiter(rs));
  582. }
  583. return mitarbeiters;
  584. }
  585. private static Mitarbeiter getMitarbeiter(int id) throws SQLException {
  586. PreparedStatement statement = MySqlConnectionFactory.getConnection().prepareStatement(SELECT_MITARBEITER_BY_ID);
  587. ResultSet rs;
  588. statement.setInt(1, id);
  589. rs = statement.executeQuery();
  590. rs.next(); // TODO
  591. return getMitarbeiter(rs);
  592. }
  593. /**
  594. * Extrahiert ein Objekt {@link Mitarbeiter} aus einem gegebenen {@link ResultSet}.
  595. *
  596. * @param rs ResultSet from Database Query.
  597. * @return {@link Mitarbeiter}
  598. * @throws SQLException wenn Fehler bei der SQL Verarbeitung auftreten.
  599. */
  600. private static Mitarbeiter getMitarbeiter(ResultSet rs) throws SQLException {
  601. Mitarbeiter mitarbeiter = new Mitarbeiter(rs.getInt("mitarbid"));
  602. mitarbeiter.setTitel(rs.getString("titel"));
  603. mitarbeiter.setVorname(rs.getString("vorname"));
  604. mitarbeiter.setNachname(rs.getString("nachname"));
  605. mitarbeiter.setEinweisenderArzt(rs.getString("einweisenderarzt"));
  606. return mitarbeiter;
  607. }
  608. /**
  609. * Gibt gibt alle {@link Untersuchung} zu einem {@link Fall} aus.
  610. *
  611. * @param fall Parent {@link Fall}
  612. * @return Liste aller {@link Untersuchung} zu einem {@link Fall}.
  613. * @throws SQLException wenn Fehler bei der SQL Verarbeitung auftreten.
  614. */
  615. public static List<Untersuchung> getUntersuchungByFall(Fall fall) throws SQLException {
  616. PreparedStatement statement = MySqlConnectionFactory.getConnection().prepareStatement(SELECT_UNTERS_BY_FALLID);
  617. statement.setInt(1, fall.getFallID());
  618. ResultSet rs = statement.executeQuery();
  619. List<Untersuchung> untersuchungen = new ArrayList<>();
  620. while (rs.next()) {
  621. untersuchungen.add(getUntersuchung(rs, fall));
  622. }
  623. return untersuchungen;
  624. }
  625. private static Untersuchung getUntersuchung(ResultSet rs, Fall fall) throws SQLException {
  626. Untersuchung untersuchung = new Untersuchung();
  627. untersuchung.setUntersID(rs.getInt("untersid"));
  628. untersuchung.setFall(fall);
  629. untersuchung.setDurchfuehrenderArzt(getMitarbeiter(rs.getInt("durchfuehrenderarzt")));
  630. untersuchung.setUntersuchungsdatum(rs.getTimestamp("untersuchungsdatum").toLocalDateTime());
  631. untersuchung.setOpscode(getOpsCode(rs.getString("opscode"), rs.getInt("opsversion")));
  632. untersuchung.setStorniert(rs.getBoolean("storniert"));
  633. setVersionInformation(untersuchung, rs);
  634. return untersuchung;
  635. }
  636. /**
  637. * Fuehrt {@code INSERT} bei einem neuen Datensatz und {@code UPDATE} bei einem existierenden Datensatz aus.
  638. *
  639. * @param untersuchung zu verarbeitender Datensatz.
  640. * @param mitarbid {@link Mitarbeiter#mitarbID} des aktuellen Benutzers/Mitarbeiters.
  641. * @param isUpdate {@code true} wenn der Datensatz bereits existiert, sonst {@code false}.
  642. * @throws SQLException wenn Fehler bei der SQL Verarbeitung auftreten.
  643. */
  644. public static void setUntersuchung(Untersuchung untersuchung, int mitarbid, boolean isUpdate) throws SQLException {
  645. PreparedStatement statement;
  646. if (isUpdate) {
  647. statement = MySqlConnectionFactory.getConnection().prepareStatement(UPDATE_UNTERSUCHUNG);
  648. } else {
  649. statement = MySqlConnectionFactory.getConnection().prepareStatement(INSERT_UNTERSUCHUNG);
  650. }
  651. statement.setInt(1, untersuchung.getDurchfuehrenderArzt().getMitarbID()); // DurchfuehrenderArzt
  652. statement.setInt(2, untersuchung.getFall().getFallID()); // FallID
  653. statement.setString(3, untersuchung.getOpscode().getOpsCode()); // OPSCode
  654. statement.setInt(4, untersuchung.getOpscode().getVersion()); // OPSVersion
  655. statement.setBoolean(5, untersuchung.getStorniert()); // storniert
  656. statement.setTimestamp(6, Timestamp.valueOf(untersuchung.getUntersuchungsdatum())); // Untersuchungsdatum
  657. statement.setInt(7, mitarbid); // Letzter Bearbeiter
  658. if (isUpdate) {
  659. statement.setInt(8, untersuchung.getUntersID()); // `UntersID`
  660. } else {
  661. statement.setInt(8, mitarbid); // Ersteller
  662. }
  663. statement.execute();
  664. }
  665. public static List<Diagnose> getDiagnosenByFall(Fall fall) throws SQLException {
  666. PreparedStatement statement = MySqlConnectionFactory.getConnection().prepareStatement(SELECT_DIAGNOSE_BY_FALLID);
  667. statement.setInt(1, fall.getFallID());
  668. ResultSet rs = statement.executeQuery();
  669. List<Diagnose> diagnosen = new ArrayList<>();
  670. while (rs.next()) {
  671. diagnosen.add(getDiagnose(rs.getInt("diagid"), fall));
  672. }
  673. return diagnosen;
  674. }
  675. public static List<Kasse> getAllKassen() throws SQLException {
  676. Statement statement = MySqlConnectionFactory.getConnection().createStatement();
  677. ResultSet rs = statement.executeQuery(SELECT_ALL_KASSEN);
  678. List<Kasse> kassen = new ArrayList<>();
  679. while (rs.next()) {
  680. kassen.add(getKasse(rs));
  681. }
  682. return kassen;
  683. }
  684. private static Kasse getKasse(int kassenid) throws SQLException {
  685. PreparedStatement statement = MySqlConnectionFactory.getConnection().prepareStatement(SELECT_KASSE_BY_KASSENID);
  686. statement.setInt(1, kassenid);
  687. ResultSet rs = statement.executeQuery();
  688. rs.next(); // TODO
  689. return getKasse(rs);
  690. }
  691. /**
  692. * Extrahiert ein Objekt {@link Kasse} aus einem gegebenen {@link ResultSet}.
  693. *
  694. * @param rs ResultSet from Database Query.
  695. * @return {@link Kasse}
  696. * @throws SQLException wenn Fehler bei der SQL Verarbeitung auftreten.
  697. */
  698. private static Kasse getKasse(ResultSet rs) throws SQLException {
  699. Kasse kasse = new Kasse();
  700. kasse.setKassenID(rs.getInt("kassenid"));
  701. kasse.setName(rs.getString("name"));
  702. kasse.setAdresse(rs.getString("adresse"));
  703. kasse.setPrivat(rs.getBoolean("privat"));
  704. setVersionInformation(kasse, rs);
  705. return kasse;
  706. }
  707. public static void setDiagnose(Diagnose diagnose) throws SQLException {
  708. PreparedStatement statement = MySqlConnectionFactory.getConnection().prepareStatement(INSERT_DIAGNOSE);
  709. statement.setInt(1, diagnose.getArzt().getMitarbID()); // `Arzt`
  710. statement.setInt(2, diagnose.getDiagArt().id()); // `DiagArt`
  711. statement.setInt(3, diagnose.getErsteller()); // `Ersteller`
  712. statement.setString(4, diagnose.getFreiText()); // `Freitext`
  713. statement.setString(5, diagnose.getIcd10code().getCode()); // `ICD10Code`
  714. statement.setInt(6, diagnose.getIcd10code().getVersion()); // `ICD10Version`
  715. statement.setInt(7, diagnose.getBearbeiter()); // `LetzterBearbeiter`
  716. statement.setInt(8, diagnose.getFall().getFallID()); // `FallID`
  717. statement.execute();
  718. }
  719. public static void setHL7Nachricht(String hl7msg, LocalDateTime timestamp, String source) throws SQLException {
  720. PreparedStatement statement = MySqlConnectionFactory.getConnection().prepareStatement(INSERT_HL7NACHRICHT);
  721. statement.setString(1, hl7msg);
  722. statement.setTimestamp(2, Timestamp.valueOf(timestamp));
  723. statement.setString(3, source);
  724. statement.execute();
  725. }
  726. public static List<HL7LogEntry> getLastHL7LogEntries() throws SQLException {
  727. return getLastHL7LogEntries(30);
  728. }
  729. public static List<HL7LogEntry> getLastHL7LogEntries(int last) throws SQLException {
  730. PreparedStatement statement = MySqlConnectionFactory.getConnection().prepareStatement(SELECT_LAST_HL7ENTRIES);
  731. statement.setInt(1, last);
  732. ResultSet rs = statement.executeQuery();
  733. List<HL7LogEntry> hl7entries = new ArrayList<>();
  734. while (rs.next()) {
  735. hl7entries.add(getHL7LogEntry(rs));
  736. }
  737. return hl7entries;
  738. }
  739. private static HL7LogEntry getHL7LogEntry(ResultSet rs) throws SQLException {
  740. HL7LogEntry entry = new HL7LogEntry(rs.getInt("msgid"));
  741. entry.setMessage(rs.getString("hl7msg"));
  742. entry.setTimestamp(rs.getTimestamp("timestamp").toLocalDateTime());
  743. entry.setSource(rs.getString("source"));
  744. return entry;
  745. }
  746. }