aether-framework/resources/[aether]/aether-medical/shared/config.lua
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

272 lines
12 KiB
Lua

-- =====================================================================
-- aether-medical — Konfiguration
--
-- Alles, was ein Serverbetreiber anpassen will, ohne Code zu ändern.
-- Kein Wert hier löst je eine medizinische Maßnahme aus — es sind
-- Kategorien, Orte und Erinnerungsfristen.
-- =====================================================================
Medizin = Medizin or {}
Medizin.Config = {}
-- Klinik
Medizin.Config.Klinik = 'Los Santos Medical Center'
Medizin.Config.Kuerzel = 'LSMC'
-- Reichweite, in der ein Terminal bedient werden kann (Meter)
Medizin.Config.TerminalWeite = 2.5
-- Terminals: Krankenhaus-PCs an festen Orten
Medizin.Config.Terminals = {
{ name = 'Notaufnahme', pos = vector3(309.05, -595.20, 43.28) },
{ name = 'Empfang', pos = vector3(298.60, -584.60, 43.26) },
{ name = 'Intensiv', pos = vector3(331.20, -595.30, 43.28) },
{ name = 'Sandy Shores', pos = vector3(1839.60, 3672.90, 34.28) },
{ name = 'Paleto Bay', pos = vector3(-247.60, 6331.30, 32.43) },
}
-- Stationen der Klinik. Die Kennung wird im Personaldatensatz gespeichert.
Medizin.Config.Stationen = {
{ id = 'notaufnahme', name = 'Notaufnahme', art = 'notaufnahme' },
{ id = 'rettung', name = 'Rettungsdienst', art = 'notaufnahme' },
{ id = 'chirurgie', name = 'Chirurgie', art = 'normal' },
{ id = 'innere', name = 'Innere Medizin', art = 'normal' },
{ id = 'intensiv', name = 'Intensivstation', art = 'intensiv' },
{ id = 'op', name = 'OP-Bereich', art = 'op' },
{ id = 'labor', name = 'Labor', art = 'behandlung' },
{ id = 'leitstelle', name = 'Leitstelle', art = 'normal' },
}
-- Arten einer Station. Reine Einordnung — keine Art schränkt ein,
-- welcher Patient dort liegen darf. Das entscheidet die Station selbst.
Medizin.Config.Stationsarten = {
{ id = 'notaufnahme', name = 'Notaufnahme' },
{ id = 'normal', name = 'Normalstation' },
{ id = 'intensiv', name = 'Intensivstation' },
{ id = 'op', name = 'OP-Bereich' },
{ id = 'behandlung', name = 'Behandlungsbereich' },
}
-- Arten eines Zimmers
Medizin.Config.Zimmerarten = {
{ id = 'bett', name = 'Bettenzimmer' },
{ id = 'behandlung', name = 'Behandlungsraum' },
{ id = 'intensiv', name = 'Intensivplatz' },
{ id = 'isolierung', name = 'Isolierzimmer' },
{ id = 'op', name = 'Operationssaal' },
}
-- Zimmerstatus. Jeder wird von Hand gesetzt — kein Zimmer wechselt
-- ihn von selbst, auch nicht, wenn der letzte Patient gegangen ist.
Medizin.Config.Zimmerstatus = {
{ id = 'frei', name = 'Frei', farbe = '#34d399' },
{ id = 'reinigung', name = 'Reinigung', farbe = '#f59e0b' },
{ id = 'gesperrt', name = 'Gesperrt', farbe = '#ef4444' },
}
-- Dienstfunktion: was macht jemand gerade konkret?
Medizin.Config.Dienstfunktionen = {
{ id = 'station', name = 'Stationsdienst', recht = nil },
{ id = 'rtw', name = 'Rettungswagen', recht = nil },
{ id = 'notarzt', name = 'Notarzt', recht = 'dienst.notarzt' },
{ id = 'op', name = 'OP-Dienst', recht = 'dienst.op' },
{ id = 'leitstelle', name = 'Leitstelle', recht = 'dienst.leitstelle' },
}
-- Dienststatus, den ein Mediziner selbst wählt
Medizin.Config.Dienststatus = {
{ id = 'verfuegbar', name = 'Verfügbar', farbe = '#34d399' },
{ id = 'im_einsatz', name = 'Im Einsatz', farbe = '#f59e0b' },
{ id = 'am_patient', name = 'Am Patienten', farbe = '#38bdf8' },
{ id = 'im_op', name = 'Im OP', farbe = '#a78bfa' },
{ id = 'pause', name = 'Pause', farbe = '#8a93a5' },
{ id = 'nicht_frei', name = 'Nicht verfügbar', farbe = '#ef4444' },
}
-- Einsatzkategorien der Leitstelle
Medizin.Config.Einsatzkategorien = {
{ id = 'notruf', name = 'Notruf 112', farbe = '#ef4444' },
{ id = 'bewusstlos', name = 'Bewusstlose Person', farbe = '#e0503f' },
{ id = 'verkehr', name = 'Verkehrsunfall', farbe = '#f59e0b' },
{ id = 'schuss', name = 'Schussverletzung', farbe = '#ff2e57' },
{ id = 'explosion', name = 'Explosion', farbe = '#f97316' },
{ id = 'grossschaden', name = 'Großschadenslage', farbe = '#dc2626' },
{ id = 'verlegung', name = 'Verlegung', farbe = '#38bdf8' },
{ id = 'polizei', name = 'Polizeianforderung', farbe = '#4aa8ff' },
{ id = 'unterstuetzung', name = 'Unterstützung', farbe = '#a78bfa' },
{ id = 'sonstiges', name = 'Sonstiges', farbe = '#8a93a5' },
}
-- Aktenarten
Medizin.Config.Aktenarten = {
{ id = 'behandlung', name = 'Behandlungsakte' },
{ id = 'notfall', name = 'Notfallakte' },
{ id = 'op', name = 'OP-Akte' },
{ id = 'befund', name = 'Befundakte' },
{ id = 'pflege', name = 'Pflegebericht' },
{ id = 'gutachten', name = 'Gutachten' },
}
-- Stationen eines Berichts auf seinem Weg. Jeder Schritt wird von
-- Hand gegangen — kein Bericht reift von selbst zur Freigabe.
Medizin.Config.Berichtstatus = {
{ id = 'entwurf', name = 'Entwurf', farbe = '#8697a4' },
{ id = 'eingereicht', name = 'Eingereicht', farbe = '#f59e0b' },
{ id = 'freigegeben', name = 'Freigegeben', farbe = '#34d399' },
}
-- Laborauftragsarten
Medizin.Config.Laborarten = {
{ id = 'blut', name = 'Blutprobe' },
{ id = 'dna', name = 'DNA-Probe' },
{ id = 'urin', name = 'Urinprobe' },
{ id = 'gewebe', name = 'Gewebeprobe' },
{ id = 'toxikologie', name = 'Toxikologie' },
}
-- Blutgruppen für die Blutbank
Medizin.Config.Blutgruppen = {
'0-', '0+', 'A-', 'A+', 'B-', 'B+', 'AB-', 'AB+',
}
-- Status einer Blutkonserve. Jeder wird von Hand gesetzt — auch eine
-- abgelaufene Konserve bleibt vorrätig, bis jemand sie verwirft.
Medizin.Config.Blutstatus = {
{ id = 'vorraetig', name = 'Vorrätig', farbe = '#34d399' },
{ id = 'reserviert', name = 'Reserviert', farbe = '#f59e0b' },
{ id = 'ausgegeben', name = 'Ausgegeben', farbe = '#38bdf8' },
{ id = 'verworfen', name = 'Verworfen', farbe = '#8a93a5' },
}
-- Lagerorte der Blutbank
Medizin.Config.Blutlagerorte = {
'Blutbank Kühlschrank A', 'Blutbank Kühlschrank B',
'Notaufnahme', 'OP-Bereich', 'Intensivstation', 'Rettungswagen',
}
-- Nachschlagetabelle: welche Konserve passt zu welchem Empfänger.
--
-- Das ist eine AUSKUNFT und nichts weiter. Das System sperrt keine
-- Konserve, wählt keine aus und verhindert keine Ausgabe — es weist
-- nur darauf hin, wenn eine Kombination von der Tabelle abweicht.
-- Ob transfundiert wird, entscheidet immer ein Arzt.
Medizin.Config.Blutvertraeglichkeit = {
['0-'] = { '0-' },
['0+'] = { '0-', '0+' },
['A-'] = { '0-', 'A-' },
['A+'] = { '0-', '0+', 'A-', 'A+' },
['B-'] = { '0-', 'B-' },
['B+'] = { '0-', '0+', 'B-', 'B+' },
['AB-'] = { '0-', 'A-', 'B-', 'AB-' },
['AB+'] = { '0-', '0+', 'A-', 'A+', 'B-', 'B+', 'AB-', 'AB+' },
}
-- Kategorien im Medikamentenschrank
Medizin.Config.Medikamentkategorien = {
{ id = 'analgetika', name = 'Schmerzmittel' },
{ id = 'antibiotika', name = 'Antibiotika' },
{ id = 'kreislauf', name = 'Kreislauf & Herz' },
{ id = 'narkose', name = 'Narkose & Sedierung' },
{ id = 'infusion', name = 'Infusionen' },
{ id = 'verband', name = 'Verbandmaterial' },
{ id = 'sonstiges', name = 'Sonstiges' },
}
-- Zustand eines Intensivpatienten. Wird ausschliesslich von Hand
-- gesetzt — weder eine Messung noch ein Zeitablauf ändert ihn je.
-- Die Reihenfolge bestimmt nur, was in der Liste oben steht.
Medizin.Config.Intensivzustaende = {
{ id = 'kritisch', name = 'Kritisch', farbe = '#ef4444' },
{ id = 'stabil', name = 'Stabil', farbe = '#38bdf8' },
{ id = 'besserung', name = 'Besserung', farbe = '#34d399' },
}
-- Vorschläge für angeschlossene Geräte. Reine Textbausteine — das
-- System steuert kein Gerät, liest von keinem einen Wert und meldet
-- keinen Alarm. Es hält nur fest, was jemand angeschlossen hat.
Medizin.Config.Intensivgeraete = {
'Beatmung', 'Monitoring', 'Perfusor', 'Dialyse', 'ZVK',
'Arterie', 'Magensonde', 'Blasenkatheter', 'Schrittmacher', 'ECMO',
}
-- Kategorien für Aushänge am Schwarzen Brett. Keine Kategorie löst
-- etwas aus — auch eine Dienstanweisung bleibt Text an einer Wand.
Medizin.Config.Aushangkategorien = {
{ id = 'anweisung', name = 'Dienstanweisung', farbe = '#ef4444' },
{ id = 'warnung', name = 'Warnung', farbe = '#f59e0b' },
{ id = 'hygiene', name = 'Hygiene', farbe = '#38bdf8' },
{ id = 'information', name = 'Information', farbe = '#8697a4' },
}
-- Arten von Rettungsfahrzeugen
Medizin.Config.Fahrzeugarten = {
{ id = 'rtw', name = 'Rettungswagen' },
{ id = 'nef', name = 'Notarzteinsatzfahrzeug' },
{ id = 'ktw', name = 'Krankentransportwagen' },
{ id = 'hubschrauber', name = 'Rettungshubschrauber' },
{ id = 'sonstiges', name = 'Sonstiges' },
}
-- Einsatzstatus eines Fahrzeugs. Wird von Hand gesetzt — keine
-- Telemetrie und kein Einsatz ändert ihn je von selbst.
Medizin.Config.Fahrzeugstatus = {
{ id = 'verfuegbar', name = 'Verfügbar', farbe = '#34d399' },
{ id = 'im_einsatz', name = 'Im Einsatz', farbe = '#f59e0b' },
{ id = 'werkstatt', name = 'In der Werkstatt', farbe = '#38bdf8' },
{ id = 'ausser_dienst', name = 'Außer Dienst', farbe = '#8a93a5' },
}
-- Wartungsstatus. Auch dieser wird ausschliesslich eingetragen.
Medizin.Config.Wartungsstatus = {
{ id = 'ok', name = 'In Ordnung' },
{ id = 'faellig', name = 'Wartung fällig' },
{ id = 'werkstatt', name = 'In der Werkstatt' },
}
-- Vorschläge für die Ausstattung. Reine Textbausteine — das System
-- prüft nicht nach, ob etwas an Bord ist.
Medizin.Config.Fahrzeugausstattung = {
'Defibrillator', 'Beatmungsgerät', 'Notfallrucksack', 'Trage',
'Vakuummatratze', 'Spineboard', 'Sauerstoff', 'Absaugpumpe',
'Perfusor', 'Notfallmedikamente',
}
-- Funktionen im OP-Team
Medizin.Config.OpFunktionen = {
{ id = 'operateur', name = 'Operateur' },
{ id = 'assistenz', name = 'Assistenz' },
{ id = 'anaesthesie', name = 'Anästhesie' },
{ id = 'pflege', name = 'OP-Pflege' },
}
-- ---------------------------------------------------------------------
-- Erinnerungen (NUR Hinweise — keine davon führt etwas aus)
-- ---------------------------------------------------------------------
Medizin.Config.Erinnerungen = {
-- Wie oft die Fristen geprüft werden (Millisekunden)
pruefIntervall = 60000,
-- Nach wie vielen Minuten ein wartender Patient gemeldet wird
warteZeitStufen = { 10, 30, 60 },
-- Wie viele Minuten vor einer geplanten OP erinnert wird
opVorlauf = { 30, 10 },
-- Nach wie vielen Minuten eine offene Behandlungsdoku gemeldet wird
dokuOffenNach = 45,
-- Nach wie vielen Minuten ohne Verlaufseintrag ein Intensivpatient
-- in Erinnerung gerufen wird
intensivStilleNach = 30,
-- Wie viele Tage vor Ablauf einer Blutkonserve erinnert wird
blutVorlaufTage = 3,
-- Ab wie wenigen vorrätigen Konserven je Blutgruppe erinnert wird
blutMindestbestand = 2,
-- Ab welchem gemeldeten Tankstand (Prozent) an ein Fahrzeug erinnert wird
fahrzeugTankUnter = 20,
-- Ab welchem gemeldeten Zustand (Prozent) an ein Fahrzeug erinnert wird
fahrzeugZustandUnter = 60,
-- Ab wann eine Fahrzeugmeldung als veraltet gilt (Minuten)
fahrzeugMeldungAltNach = 15,
-- Wie viele Tage vor Ablauf eines Medikaments erinnert wird
medikamentVorlaufTage = 14,
-- Wie viele Minuten vor Ablauf einer Kenntnisnahmefrist erinnert wird
aushangVorwarnung = 60,
}