aether-framework/sql/aether_medical.sql
Jerrit Fritzsche e4b82dd685 Aether-Framework: Fachmodule, Admin-Panel und Docker-Datenbank
- aether-medical: Stationen/Belegung, Intensivstation, Blutbank, Fuhrpark,
  Nachrichten/Aushänge, Berichte und Textbausteine (server + NUI)
- aether-admin: vollständiges Server-Admin-Panel als echtes FiveM-Resource,
  an aether-core gekoppelt (Rechte über aether_users.admin_group), mit
  WebRTC-Live-Kameras (Bildschirmfreigabe) und separatem Media-Server (SFU)
- Prototypen admin/ vervollständigt
- SQL-Schema aether_admin.sql
- Docker-Compose mit MariaDB und idempotenter Auto-Migration (schema_migrations)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-27 18:55:32 +02:00

608 lines
28 KiB
SQL

-- =====================================================================
-- aether-medical — Datenbankschema
--
-- Grundsatz, der sich durch das ganze Schema zieht:
-- Das System unterstuetzt medizinische Entscheidungen — es trifft
-- niemals selbst welche.
--
-- Deshalb hat JEDER Vorgang, der eine Entscheidung darstellt, eine
-- Spalte mit dem verantwortlichen Mediziner. Es gibt keine Spalte,
-- die das System ohne einen Menschen dahinter fuellen wuerde.
-- Aufnahmen, Entlassungen, Diagnosen, Medikamentengaben und
-- Todesfeststellungen tragen immer einen Namen.
-- =====================================================================
-- ---------------------------------------------------------------------
-- Personal
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_personal` (
`character` INT UNSIGNED NOT NULL COMMENT 'Charakter aus aether_characters',
`personalnummer` VARCHAR(16) NOT NULL COMMENT 'z. B. LSMC-0421',
`rolle` VARCHAR(32) NOT NULL DEFAULT 'praktikant',
`station` VARCHAR(32) NOT NULL DEFAULT 'notaufnahme',
`rechte_extra` LONGTEXT DEFAULT NULL COMMENT 'Zusaetzlich gewaehrte Rechte als JSON',
`rechte_entzug` LONGTEXT DEFAULT NULL COMMENT 'Einzeln entzogene Rechte als JSON',
`eingestellt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`aktiv` TINYINT(1) NOT NULL DEFAULT 1,
`notiz` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`character`),
UNIQUE KEY `uniq_personalnummer` (`personalnummer`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Dienstzeiten (nur Protokoll, keine Auswertung zur Bewertung)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_dienst` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`character` INT UNSIGNED NOT NULL,
`beginn` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`ende` DATETIME DEFAULT NULL,
`sekunden` INT UNSIGNED NOT NULL DEFAULT 0,
`station` VARCHAR(32) DEFAULT NULL,
`funktion` VARCHAR(24) NOT NULL DEFAULT 'station'
COMMENT 'rtw/notarzt/station/op/leitstelle',
PRIMARY KEY (`id`),
KEY `idx_character` (`character`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Patientenstammdaten
-- Werden ausschliesslich von Medizinern gepflegt.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_patient` (
`character` INT UNSIGNED NOT NULL,
`blutgruppe` VARCHAR(8) DEFAULT NULL COMMENT 'Erst nach Bestimmung im Labor',
`allergien` VARCHAR(512) DEFAULT NULL,
`vorerkrankungen` VARCHAR(1000) DEFAULT NULL,
`dauermedikation` VARCHAR(1000) DEFAULT NULL,
`implantate` VARCHAR(512) DEFAULT NULL,
`organspender` VARCHAR(16) DEFAULT NULL COMMENT 'ja/nein/unbekannt',
`notfallkontakt` VARCHAR(160) DEFAULT NULL,
`hinweis` VARCHAR(512) DEFAULT NULL COMMENT 'Warnhinweis, z. B. Gerinnungsstoerung',
`lichtbild` VARCHAR(512) DEFAULT NULL COMMENT 'Bildadresse fuer die Patientenakte',
`aktualisiert_von` INT UNSIGNED DEFAULT NULL,
`aktualisiert_am` DATETIME DEFAULT NULL,
PRIMARY KEY (`character`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Kurze Vermerke zu einem Patienten ausserhalb einer Akte
CREATE TABLE IF NOT EXISTS `medical_patient_notiz` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`patient` INT UNSIGNED NOT NULL,
`text` VARCHAR(1000) NOT NULL,
`von` INT UNSIGNED NOT NULL,
`am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_patient` (`patient`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Akten und ihre Versionen
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_akte` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`aktenzeichen` VARCHAR(24) NOT NULL,
`patient` INT UNSIGNED DEFAULT NULL,
`typ` VARCHAR(24) NOT NULL DEFAULT 'behandlung',
`titel` VARCHAR(160) NOT NULL,
`status` VARCHAR(16) NOT NULL DEFAULT 'entwurf'
COMMENT 'entwurf/offen/freigegeben/geschlossen',
`inhalt` LONGTEXT DEFAULT NULL,
`erstellt_von` INT UNSIGNED NOT NULL,
`erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`freigabe_von` INT UNSIGNED DEFAULT NULL,
`freigabe_am` DATETIME DEFAULT NULL,
`version` INT UNSIGNED NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_aktenzeichen` (`aktenzeichen`),
KEY `idx_patient` (`patient`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `medical_akte_version` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`akte` INT UNSIGNED NOT NULL,
`version` INT UNSIGNED NOT NULL,
`inhalt` LONGTEXT DEFAULT NULL,
`geaendert_von` INT UNSIGNED NOT NULL,
`geaendert_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`kommentar` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_akte` (`akte`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Verknuepfungen zwischen Vorgaengen (Akte <-> Einsatz <-> OP <-> Labor)
CREATE TABLE IF NOT EXISTS `medical_verknuepfung` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`von_typ` VARCHAR(24) NOT NULL,
`von_id` VARCHAR(64) NOT NULL,
`zu_typ` VARCHAR(24) NOT NULL,
`zu_id` VARCHAR(64) NOT NULL,
`von` INT UNSIGNED DEFAULT NULL,
`am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_von` (`von_typ`, `von_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Aufnahme
-- Es gibt KEINE automatische Aufnahme und KEINE automatische
-- Entlassung. Beides traegt immer einen Mediziner als Verantwortlichen.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_aufnahme` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`patient` INT UNSIGNED NOT NULL,
`grund` VARCHAR(512) NOT NULL,
`prioritaet` TINYINT NOT NULL DEFAULT 3 COMMENT '1 = sofort … 4 = nachrangig',
`station` VARCHAR(32) DEFAULT NULL,
`zimmer` INT UNSIGNED DEFAULT NULL,
`status` VARCHAR(16) NOT NULL DEFAULT 'wartend'
COMMENT 'wartend/aufgenommen/entlassen',
`aufgenommen_von` INT UNSIGNED NOT NULL COMMENT 'Wer hat aufgenommen',
`aufgenommen_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
-- Entlassung geschieht ausschliesslich manuell:
`entlassen_von` INT UNSIGNED DEFAULT NULL,
`entlassen_am` DATETIME DEFAULT NULL,
`entlass_grund` VARCHAR(512) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_patient` (`patient`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Behandlungsdokumentation
-- Das System speichert AUSSCHLIESSLICH die Dokumentation. Es heilt
-- nichts, es diagnostiziert nichts, es schlaegt keine Diagnose vor.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_behandlung` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`kennung` VARCHAR(24) NOT NULL,
`patient` INT UNSIGNED NOT NULL,
`aufnahme` INT UNSIGNED DEFAULT NULL,
`einsatz` INT UNSIGNED DEFAULT NULL,
`symptome` TEXT DEFAULT NULL COMMENT 'Was der Patient schildert',
`untersuchung` TEXT DEFAULT NULL COMMENT 'Was der Mediziner erhebt',
`diagnose` TEXT DEFAULT NULL COMMENT 'Vom Mediziner gestellt, nie berechnet',
`massnahmen` TEXT DEFAULT NULL,
`empfehlung` TEXT DEFAULT NULL,
`nachsorge` TEXT DEFAULT NULL,
`status` VARCHAR(16) NOT NULL DEFAULT 'laufend'
COMMENT 'laufend/abgeschlossen',
`erstellt_von` INT UNSIGNED NOT NULL,
`erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`abgeschlossen_von` INT UNSIGNED DEFAULT NULL,
`abgeschlossen_am` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_kennung` (`kennung`),
KEY `idx_patient` (`patient`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Verabreichte Medikamente — immer mit dem Mediziner, der sie gegeben hat
CREATE TABLE IF NOT EXISTS `medical_behandlung_medikament` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`behandlung` INT UNSIGNED NOT NULL,
`medikament` INT UNSIGNED NOT NULL,
`dosierung` VARCHAR(64) DEFAULT NULL,
`menge` INT NOT NULL DEFAULT 1,
`gegeben_von` INT UNSIGNED NOT NULL,
`gegeben_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`hinweis` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_behandlung` (`behandlung`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Operationen
-- Werden vollstaendig manuell dokumentiert. Keine Durchfuehrung
-- durch das System, kein automatischer Ausgang.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_operation` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`kennung` VARCHAR(24) NOT NULL,
`patient` INT UNSIGNED NOT NULL,
`aufnahme` INT UNSIGNED DEFAULT NULL,
`art` VARCHAR(160) NOT NULL,
`saal` INT UNSIGNED DEFAULT NULL,
`geplant_fuer` DATETIME DEFAULT NULL COMMENT 'Ab hier erinnert das System nur',
`beginn` DATETIME DEFAULT NULL COMMENT 'Vom OP-Team eingetragen',
`ende` DATETIME DEFAULT NULL COMMENT 'Vom OP-Team eingetragen',
`verlauf` TEXT DEFAULT NULL,
`komplikationen` TEXT DEFAULT NULL,
`nachsorge` TEXT DEFAULT NULL,
`status` VARCHAR(16) NOT NULL DEFAULT 'geplant'
COMMENT 'geplant/laufend/abgeschlossen/abgesagt',
`erstellt_von` INT UNSIGNED NOT NULL,
`erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_kennung` (`kennung`),
KEY `idx_patient` (`patient`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `medical_operation_team` (
`operation` INT UNSIGNED NOT NULL,
`character` INT UNSIGNED NOT NULL,
`funktion` VARCHAR(48) NOT NULL DEFAULT 'assistenz'
COMMENT 'operateur/assistenz/anaesthesie/pflege',
PRIMARY KEY (`operation`, `character`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Medikamente
-- Bestandsfuehrung. Eine Ausgabe bucht der Mediziner selbst —
-- das System gibt nichts aus und verordnet nichts.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_medikament` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`kennung` VARCHAR(24) NOT NULL,
`name` VARCHAR(120) NOT NULL,
`wirkstoff` VARCHAR(120) DEFAULT NULL,
`kategorie` VARCHAR(48) NOT NULL DEFAULT 'sonstiges',
`dosierung_standard` VARCHAR(64) DEFAULT NULL COMMENT 'Nur ein Vorschlag',
`einheit` VARCHAR(24) NOT NULL DEFAULT 'Stück',
`bestand` INT NOT NULL DEFAULT 0,
`mindestbestand` INT NOT NULL DEFAULT 0 COMMENT 'Ab hier erinnert das System',
`lagerort` VARCHAR(64) DEFAULT NULL,
`verfaellt_am` DATE DEFAULT NULL,
`hinweis` VARCHAR(255) DEFAULT NULL COMMENT 'z. B. Wechselwirkungen',
`betaeubungsmittel` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Erfordert besondere Doku',
`aktiv` TINYINT(1) NOT NULL DEFAULT 1,
`sortierung` INT NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_kennung` (`kennung`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `medical_medikament_buchung` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`medikament` INT UNSIGNED NOT NULL,
`art` VARCHAR(16) NOT NULL COMMENT 'eingang/ausgabe/ruecknahme/verfall/korrektur',
`menge` INT NOT NULL,
`bestand_danach` INT NOT NULL,
`patient` INT UNSIGNED DEFAULT NULL,
`grund` VARCHAR(255) DEFAULT NULL,
`gebucht_von` INT UNSIGNED NOT NULL,
`gebucht_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_medikament` (`medikament`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Labor
-- Das Labor speichert Ergebnisse. Es stellt keine Diagnose —
-- die Bewertung eines Befundes bleibt dem Mediziner ueberlassen.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_labor` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`kennung` VARCHAR(24) NOT NULL,
`patient` INT UNSIGNED NOT NULL,
`art` VARCHAR(32) NOT NULL COMMENT 'blut/dna/urin/gewebe/toxikologie',
`fragestellung` VARCHAR(512) DEFAULT NULL COMMENT 'Wonach wird gesucht',
`dringend` TINYINT(1) NOT NULL DEFAULT 0,
`status` VARCHAR(16) NOT NULL DEFAULT 'offen'
COMMENT 'offen/in_arbeit/fertig/verworfen',
`auftrag_von` INT UNSIGNED NOT NULL,
`auftrag_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`bearbeitet_von` INT UNSIGNED DEFAULT NULL,
`bearbeitet_am` DATETIME DEFAULT NULL,
`ergebnis` TEXT DEFAULT NULL COMMENT 'Messwerte, vom Labor eingetragen',
`befund` TEXT DEFAULT NULL COMMENT 'Bewertung durch einen Mediziner',
`befund_von` INT UNSIGNED DEFAULT NULL,
`befund_am` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_kennung` (`kennung`),
KEY `idx_patient` (`patient`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Blutbank
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_blut` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`konserve` VARCHAR(24) NOT NULL,
`blutgruppe` VARCHAR(8) NOT NULL,
`menge_ml` INT NOT NULL DEFAULT 500,
`lagerort` VARCHAR(64) DEFAULT NULL,
`eingelagert_von` INT UNSIGNED NOT NULL,
`eingelagert_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`verfaellt_am` DATE DEFAULT NULL COMMENT 'Ab hier erinnert das System nur',
`status` VARCHAR(16) NOT NULL DEFAULT 'vorraetig'
COMMENT 'vorraetig/reserviert/ausgegeben/verworfen',
`reserviert_fuer` INT UNSIGNED DEFAULT NULL,
`reserviert_von` INT UNSIGNED DEFAULT NULL,
`ausgegeben_von` INT UNSIGNED DEFAULT NULL,
`ausgegeben_am` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_konserve` (`konserve`),
KEY `idx_blutgruppe` (`blutgruppe`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Krankenhaus: Stationen, Zimmer, Belegung
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_station` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`kennung` VARCHAR(24) NOT NULL,
`name` VARCHAR(120) NOT NULL,
`art` VARCHAR(24) NOT NULL DEFAULT 'normal'
COMMENT 'notaufnahme/normal/intensiv/op/behandlung',
`etage` VARCHAR(24) DEFAULT NULL,
`aktiv` TINYINT(1) NOT NULL DEFAULT 1,
`sortierung` INT NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_kennung` (`kennung`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `medical_zimmer` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`station` INT UNSIGNED NOT NULL,
`kennung` VARCHAR(24) NOT NULL,
`betten` INT NOT NULL DEFAULT 1,
`art` VARCHAR(24) NOT NULL DEFAULT 'bett'
COMMENT 'bett/behandlung/op/intensiv/isolierung',
`status` VARCHAR(16) NOT NULL DEFAULT 'frei'
COMMENT 'frei/belegt/reinigung/gesperrt — immer manuell gesetzt',
`hinweis` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_station` (`station`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `medical_belegung` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`zimmer` INT UNSIGNED NOT NULL,
`bett` INT NOT NULL DEFAULT 1,
`patient` INT UNSIGNED NOT NULL,
`aufnahme` INT UNSIGNED DEFAULT NULL,
`belegt_von` INT UNSIGNED NOT NULL,
`belegt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`frei_von` INT UNSIGNED DEFAULT NULL,
`frei_am` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_zimmer` (`zimmer`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Intensivstation
-- Keine automatischen Statusaenderungen. Jeder Verlaufseintrag
-- stammt von einem Menschen.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_intensiv` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`patient` INT UNSIGNED NOT NULL,
`aufnahme` INT UNSIGNED DEFAULT NULL,
`zimmer` INT UNSIGNED DEFAULT NULL,
`geraete` VARCHAR(512) DEFAULT NULL COMMENT 'Angeschlossene Geraete als Text',
`verantwortlich` INT UNSIGNED DEFAULT NULL COMMENT 'Zustaendiger Arzt',
`zustand` VARCHAR(24) NOT NULL DEFAULT 'stabil'
COMMENT 'stabil/kritisch/besserung — immer manuell gesetzt',
`notiz` VARCHAR(1000) DEFAULT NULL,
`aufgenommen_von` INT UNSIGNED NOT NULL,
`aufgenommen_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`beendet_von` INT UNSIGNED DEFAULT NULL,
`beendet_am` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_patient` (`patient`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `medical_intensiv_verlauf` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`intensiv` INT UNSIGNED NOT NULL,
`text` VARCHAR(1000) NOT NULL,
`von` INT UNSIGNED NOT NULL,
`am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_intensiv` (`intensiv`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Einsaetze und Leitstelle
-- Ein Notruf erzeugt einen OFFENEN Einsatz. Zugewiesen wird
-- ausschliesslich durch die Leitstelle, nie durch das System.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_einsatz` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`nummer` VARCHAR(24) NOT NULL,
`titel` VARCHAR(160) NOT NULL,
`kategorie` VARCHAR(32) NOT NULL DEFAULT 'notruf',
`prioritaet` TINYINT NOT NULL DEFAULT 3,
`ort` VARCHAR(160) DEFAULT NULL,
`pos_x` FLOAT DEFAULT NULL,
`pos_y` FLOAT DEFAULT NULL,
`pos_z` FLOAT DEFAULT NULL,
`beschreibung` TEXT DEFAULT NULL,
`status` VARCHAR(16) NOT NULL DEFAULT 'offen'
COMMENT 'offen/laufend/abgeschlossen',
`quelle` VARCHAR(24) NOT NULL DEFAULT 'manuell'
COMMENT 'manuell/notruf/polizei/system',
`erstellt_von` INT UNSIGNED DEFAULT NULL,
`erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`geschlossen_von` INT UNSIGNED DEFAULT NULL,
`geschlossen_am` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_nummer` (`nummer`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `medical_einsatz_kraft` (
`einsatz` INT UNSIGNED NOT NULL,
`character` INT UNSIGNED NOT NULL,
`seit` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`bis` DATETIME DEFAULT NULL,
PRIMARY KEY (`einsatz`, `character`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `medical_einsatz_notiz` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`einsatz` INT UNSIGNED NOT NULL,
`text` VARCHAR(1000) NOT NULL,
`von` INT UNSIGNED NOT NULL,
`am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_einsatz` (`einsatz`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Berichtswesen
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_bericht` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`nummer` VARCHAR(24) NOT NULL,
`patient` INT UNSIGNED DEFAULT NULL,
`behandlung` INT UNSIGNED DEFAULT NULL,
`einsatz` INT UNSIGNED DEFAULT NULL,
`titel` VARCHAR(160) NOT NULL,
`symptome` TEXT DEFAULT NULL,
`untersuchung` TEXT DEFAULT NULL,
`diagnose` TEXT DEFAULT NULL,
`massnahmen` TEXT DEFAULT NULL,
`empfehlung` TEXT DEFAULT NULL,
`anlagen` LONGTEXT DEFAULT NULL COMMENT 'JSON: Bilder und Dokumente',
`status` VARCHAR(16) NOT NULL DEFAULT 'entwurf'
COMMENT 'entwurf/eingereicht/freigegeben',
`erstellt_von` INT UNSIGNED NOT NULL,
`erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`unterschriften` LONGTEXT DEFAULT NULL COMMENT 'JSON: wer hat gegengezeichnet',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_nummer` (`nummer`),
KEY `idx_patient` (`patient`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Fuhrpark
-- Standort, Tank und Zustand sind GEMELDETE Tatsachen.
-- Zuweisung und Wartungsstatus setzt immer ein Mensch.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_fahrzeug` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`kennzeichen` VARCHAR(12) NOT NULL,
`modell` VARCHAR(48) NOT NULL,
`bezeichnung` VARCHAR(64) NOT NULL COMMENT 'z. B. RTW 1',
`art` VARCHAR(24) NOT NULL DEFAULT 'rtw'
COMMENT 'rtw/nef/ktw/hubschrauber/sonstiges',
`station` VARCHAR(32) DEFAULT NULL,
`status` VARCHAR(24) NOT NULL DEFAULT 'verfuegbar'
COMMENT 'verfuegbar/im_einsatz/werkstatt/ausser_dienst',
`wartung` VARCHAR(16) NOT NULL DEFAULT 'ok' COMMENT 'ok/faellig/werkstatt',
`ausstattung` VARCHAR(512) DEFAULT NULL,
`tank` FLOAT DEFAULT NULL COMMENT 'Gemeldet',
`zustand` FLOAT DEFAULT NULL COMMENT 'Gemeldet',
`letzter_fahrer` INT UNSIGNED DEFAULT NULL COMMENT 'Gemeldet',
`pos_x` FLOAT DEFAULT NULL,
`pos_y` FLOAT DEFAULT NULL,
`pos_z` FLOAT DEFAULT NULL,
`gemeldet_am` DATETIME DEFAULT NULL,
`zugewiesen_an` INT UNSIGNED DEFAULT NULL COMMENT 'Manuell zugewiesen',
`notiz` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_kennzeichen` (`kennzeichen`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Interne Kommunikation
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_nachricht` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`absender` INT UNSIGNED NOT NULL,
`empfaenger` VARCHAR(64) NOT NULL COMMENT 'Charakter-ID, Station oder "alle"',
`empf_typ` VARCHAR(16) NOT NULL DEFAULT 'person'
COMMENT 'person/station/rundmeldung',
`betreff` VARCHAR(160) DEFAULT NULL,
`text` TEXT NOT NULL,
`gesendet` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_empfaenger` (`empfaenger`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `medical_nachricht_gelesen` (
`nachricht` INT UNSIGNED NOT NULL,
`character` INT UNSIGNED NOT NULL,
`gelesen_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`nachricht`, `character`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `medical_aushang` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`titel` VARCHAR(160) NOT NULL,
`text` TEXT NOT NULL,
`kategorie` VARCHAR(24) NOT NULL DEFAULT 'information'
COMMENT 'anweisung/information/warnung/hygiene',
`station` VARCHAR(32) DEFAULT NULL COMMENT 'NULL = gesamte Klinik',
`angeheftet` TINYINT(1) NOT NULL DEFAULT 0,
`kenntnispflicht` TINYINT(1) NOT NULL DEFAULT 0,
`frist` DATETIME DEFAULT NULL,
`erstellt_von` INT UNSIGNED NOT NULL,
`erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`archiviert_von` INT UNSIGNED DEFAULT NULL,
`archiviert_am` DATETIME DEFAULT NULL,
`aktiv` TINYINT(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`id`),
KEY `idx_aktiv` (`aktiv`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `medical_aushang_kenntnis` (
`aushang` INT UNSIGNED NOT NULL,
`character` INT UNSIGNED NOT NULL,
`bestaetigt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`aushang`, `character`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Hinweise und Erinnerungen
-- Sie erinnern ausschliesslich. Kein Hinweis fuehrt etwas aus.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_hinweis` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`character` INT UNSIGNED DEFAULT NULL COMMENT 'NULL = an alle im Dienst',
`kategorie` VARCHAR(32) NOT NULL
COMMENT 'einsatz/patient/labor/medikament/blut/op/doku/system',
`prioritaet` VARCHAR(16) NOT NULL DEFAULT 'normal',
`titel` VARCHAR(160) NOT NULL,
`text` VARCHAR(512) DEFAULT NULL,
`ziel_typ` VARCHAR(24) DEFAULT NULL COMMENT 'Wohin springt ein Klick',
`ziel_id` VARCHAR(64) DEFAULT NULL,
`gelesen` TINYINT(1) NOT NULL DEFAULT 0,
`erstellt_am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_character` (`character`, `gelesen`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Protokoll — wer, wann, was, warum
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_protokoll` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`character` INT UNSIGNED DEFAULT NULL,
`personalnummer` VARCHAR(16) DEFAULT NULL,
`modul` VARCHAR(32) NOT NULL,
`aktion` VARCHAR(64) NOT NULL,
`ziel_typ` VARCHAR(24) DEFAULT NULL,
`ziel_id` VARCHAR(64) DEFAULT NULL,
`details` LONGTEXT DEFAULT NULL COMMENT 'JSON: was genau geaendert wurde',
`grund` VARCHAR(255) DEFAULT NULL,
`am` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_modul` (`modul`),
KEY `idx_character` (`character`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Systemeinstellungen (aktive Module, Vorlagen)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_einstellung` (
`schluessel` VARCHAR(64) NOT NULL,
`wert` LONGTEXT DEFAULT NULL,
PRIMARY KEY (`schluessel`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------------
-- Vorlagen fuer Dokumentation (Administration pflegt sie)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `medical_vorlage` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`kennung` VARCHAR(24) NOT NULL,
`bereich` VARCHAR(24) NOT NULL COMMENT 'behandlung/bericht/op/labor',
`name` VARCHAR(120) NOT NULL,
`inhalt` LONGTEXT DEFAULT NULL COMMENT 'JSON: vorbelegte Felder',
`aktiv` TINYINT(1) NOT NULL DEFAULT 1,
`sortierung` INT NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_kennung` (`kennung`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;