- 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>
272 lines
12 KiB
Lua
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,
|
|
}
|