Im Rahmen der Veranstaltung "CS3330 - Projektpraktikum MedizinischeInformatik" an der Universität zu Lübeck entstandenes Krankenhausinformationssystem (KIS).
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

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