====== std.hl7.adt ====== Patient Administration (ADT) — parst und erzeugt ADT^Axx-Nachrichten für alle Patientenvorgänge: Aufnahme, Entlassung, Verlegung, Datenänderung und Patientenzusammenführung (Merge). Die Unit dekodiert PID, PV1, MRG und NK1 aus einer einzigen Nachricht in klar strukturierte Structs. import std.hl7.adt; import std.alloc; // ADT^A01 (Aufnahme) parsen var adt: int64 := alloc(HL7_ADT_SIZE); Hl7AdtParse(msgBuf, msgLen, adt); // Patienten-ID auslesen var pid: int64 := adt + HL7_ADT_PID; var idPtr: int64 := peek64(pid + HL7_PID_ID1); var idLen: int64 := peek64(pid + HL7_PID_ID1_LEN); // Bettbelegung auslesen var pv1: int64 := adt + HL7_ADT_PV1; var bed: int64 := peek64(pv1 + HL7_PV1_LBED); // Merge-Ereignis erkennen if (peek64(adt + HL7_ADT_ISMERGE) == 1) { var mrg: int64 := adt + HL7_ADT_MRG; var oldId: int64 := peek64(mrg + HL7_MRG_PID); // Zusammenführung durchführen ... } free(adt, HL7_ADT_SIZE); ---- ===== Imports ===== * ''std.hl7.core'' * ''std.alloc'' ---- ===== Structs ===== Alle Structs verwenden das Zero-Copy-Prinzip: Zeiger verweisen in den Originalnachrichtenpuffer. ==== Hl7Pid — Patient Identification (HL7_PID_SIZE = 176 Bytes) ==== ^ Offset-Konstante ^ Offset ^ HL7-Feld ^ Inhalt ^ | ''HL7_PID_ID1 / _LEN'' | 0 / 8 | PID-3[1] | Erste Patienten-ID (z. B. MPI) | | ''HL7_PID_ID2 / _LEN'' | 16 / 24 | PID-3[2] | Zweite Patienten-ID (Repeat) | | ''HL7_PID_ID3 / _LEN'' | 32 / 40 | PID-3[3] | Dritte Patienten-ID (Repeat) | | ''HL7_PID_NAME / _LEN'' | 48 / 56 | PID-5 | Vollständiges Namensfeld (Rohwert) | | ''HL7_PID_FAMILY / _LEN'' | 64 / 72 | PID-5.1 | Nachname | | ''HL7_PID_GIVEN / _LEN'' | 80 / 88 | PID-5.2 | Vorname | | ''HL7_PID_BIRTH / _LEN'' | 96 / 104 | PID-7 | Geburtsdatum (YYYYMMDD) | | ''HL7_PID_SEX / _LEN'' | 112 / 120 | PID-8 | Geschlecht (M/F/U) | | ''HL7_PID_ADDR / _LEN'' | 128 / 136 | PID-11 | Adresse | | ''HL7_PID_PHONE / _LEN'' | 144 / 152 | PID-13 | Telefonnummer | | ''HL7_PID_INSID / _LEN'' | 160 / 168 | PID-19 | Versicherten-/Sozialversicherungsnummer | PID-3 kann bis zu 3 Wiederholungen enthalten (Tilde ''~'' als Trennzeichen). ''Hl7PidParse'' füllt alle drei ID-Slots. ==== Hl7Pv1 — Patient Visit (HL7_PV1_SIZE = 160 Bytes) ==== ^ Offset-Konstante ^ Offset ^ HL7-Feld ^ Inhalt ^ | ''HL7_PV1_VISIT / _LEN'' | 0 / 8 | PV1-19 | Besuchsnummer | | ''HL7_PV1_CLASS / _LEN'' | 16 / 24 | PV1-2 | Patientenklasse (I/O/E) | | ''HL7_PV1_LOC / _LEN'' | 32 / 40 | PV1-3 | Standort vollständig (Rohwert) | | ''HL7_PV1_LPOINT / _LEN'' | 48 / 56 | PV1-3.1 | Standort-Punkt | | ''HL7_PV1_LROOM / _LEN'' | 64 / 72 | PV1-3.2 | Zimmer | | ''HL7_PV1_LBED / _LEN'' | 80 / 88 | PV1-3.3 | Bett | | ''HL7_PV1_LFAC / _LEN'' | 96 / 104 | PV1-3.4 | Einrichtung | | ''HL7_PV1_ATTDOC / _LEN'' | 112 / 120 | PV1-7 | Behandelnder Arzt | | ''HL7_PV1_ADMIT / _LEN'' | 128 / 136 | PV1-44 | Aufnahmezeit | | ''HL7_PV1_DISCH / _LEN'' | 144 / 152 | PV1-45 | Entlassungszeit | Patientenklassen: ''I'' = Inpatient (stationär), ''O'' = Outpatient (ambulant), ''E'' = Emergency (Notfall) ==== Hl7Mrg — Patient Merge (HL7_MRG_SIZE = 48 Bytes) ==== ^ Offset-Konstante ^ Offset ^ HL7-Feld ^ Inhalt ^ | ''HL7_MRG_PID / _LEN'' | 0 / 8 | MRG-1 | Alte Patienten-ID (wird aufgelöst) | | ''HL7_MRG_ACCT / _LEN'' | 16 / 24 | MRG-3 | Alte Kontonummer | | ''HL7_MRG_VISIT / _LEN'' | 32 / 40 | MRG-5 | Alte Besuchsnummer | ==== Hl7Nk1 — Next of Kin (HL7_NK1_SIZE = 48 Bytes) ==== ^ Offset-Konstante ^ Offset ^ HL7-Feld ^ Inhalt ^ | ''HL7_NK1_NAME / _LEN'' | 0 / 8 | NK1-2 | Name des Angehörigen | | ''HL7_NK1_REL / _LEN'' | 16 / 24 | NK1-3 | Beziehung (z. B. „SPO" für Ehepartner) | | ''HL7_NK1_PHONE / _LEN'' | 32 / 40 | NK1-5 | Telefonnummer | ==== Hl7Adt — Vollständige ADT-Nachricht (HL7_ADT_SIZE = 544 Bytes) ==== Kombinierter Struct mit direkt eingebetteten Sub-Structs. Zeiger auf die Sub-Structs über Offset-Konstanten: ^ Offset-Konstante ^ Offset ^ Inhalt ^ | ''HL7_ADT_EVENT / _LEN'' | 0 / 8 | Trigger-Event (z. B. „A01") | | ''HL7_ADT_ISMERGE'' | 16 | ''1'' wenn dies ein Merge-Ereignis ist (A34–A45) | | ''HL7_ADT_HASMRG'' | 24 | ''1'' wenn MRG-Segment in der Nachricht vorhanden | | ''HL7_ADT_SEND_APP / _LEN'' | 32 / 40 | Sendende Applikation | | ''HL7_ADT_SEND_FAC / _LEN'' | 48 / 56 | Sendende Einrichtung | | ''HL7_ADT_RECV_APP / _LEN'' | 64 / 72 | Empfangende Applikation | | ''HL7_ADT_RECV_FAC / _LEN'' | 80 / 88 | Empfangende Einrichtung | | ''HL7_ADT_CTRL_ID / _LEN'' | 96 / 104 | Nachrichten-Kontroll-ID | | ''HL7_ADT_PID'' | 112 | Beginn des PID-Structs (176 Bytes) | | ''HL7_ADT_PV1'' | 288 | Beginn des PV1-Structs (160 Bytes) | | ''HL7_ADT_MRG'' | 448 | Beginn des MRG-Structs (48 Bytes) | | ''HL7_ADT_NK1'' | 496 | Beginn des NK1-Structs (48 Bytes) | ---- ===== Funktionen ===== ==== Segmente einzeln parsen ==== ^ Signatur ^ Beschreibung ^ | ''Hl7PidParse(seg: int64, segLen: int64, pid: int64): void'' | Parst PID-Segment; behandelt Wiederholungen (''~'') in PID-3; extrahiert Nachname/Vorname aus PID-5 Komponenten | | ''Hl7Pv1Parse(seg: int64, segLen: int64, pv1: int64): void'' | Parst PV1-Segment; zerlegt PV1-3 in Standort-Komponenten (Punkt/Zimmer/Bett/Einrichtung) | | ''Hl7MrgParse(seg: int64, segLen: int64, mrg: int64): void'' | Parst MRG-Segment | | ''Hl7Nk1Parse(seg: int64, segLen: int64, nk1: int64): void'' | Parst NK1-Segment | ==== Vollständige Nachricht parsen / schreiben ==== ^ Signatur ^ Beschreibung ^ | ''Hl7AdtParse(msg: int64, len: int64, adt: int64): void'' | Parst vollständige ADT-Nachricht; findet Segmente automatisch per CR+3-Buchstaben-Name-Scan; füllt alle Sub-Structs; setzt ''HL7_ADT_HASMRG=1'' wenn MRG gefunden; setzt ''HL7_ADT_ISMERGE'' via ''Hl7AdtIsMerge'' | | ''Hl7AdtWrite(adt: int64, event: int64, out: int64, outMax: int64): int64'' | Schreibt MSH+PID+PV1+[MRG wenn HASMRG=1]; ''event'' null-terminiert (z. B. ''„A01"''); schreibt MSH-11=''P'' und MSH-12=''2.5.1''; gibt Bytes zurück | | ''Hl7AdtIsMerge(eventPtr: int64, eventLen: int64): int64'' | ''1'' wenn das Event ein Merge-Ereignis ist (A34, A35, A36, A39–A45) | ---- ===== Merge-Ereignisse ===== ''Hl7AdtIsMerge'' erkennt folgende Trigger-Events als Merge: ^ Event ^ Bedeutung ^ | A34 | Merge Patient Info — Patient ID only | | A35 | Merge Patient Info — Account Number only | | A36 | Merge Patient Info — Patient ID and Account Number | | A39 | Merge Person — Patient ID | | A40 | Merge Patient — Patient Identifier List | | A41 | Merge Account — Patient Account Number | | A42 | Merge Visit — Visit Number | | A43 | Move Patient Information — Patient Identifier List | | A44 | Move Account Information — Patient Account Number | | A45 | Move Visit Information — Visit Number | Bei Merge-Ereignissen enthält ''HL7_ADT_MRG'' die alte (aufzulösende) Identität; ''HL7_ADT_PID'' enthält die neue (verbleibende) Identität. ---- ===== Codebeispiel — Aufnahme und Verlegung ===== import std.hl7.adt; import std.alloc; fn handleAdmission(msgBuf: int64, msgLen: int64) { var adt: int64 := alloc(HL7_ADT_SIZE); Hl7AdtParse(msgBuf, msgLen, adt); var pid: int64 := adt + HL7_ADT_PID; var pv1: int64 := adt + HL7_ADT_PV1; // Patientenname und ID var fam: int64 := peek64(pid + HL7_PID_FAMILY); var giv: int64 := peek64(pid + HL7_PID_GIVEN); var pid1: int64 := peek64(pid + HL7_PID_ID1); // Stationszuweisung var room: int64 := peek64(pv1 + HL7_PV1_LROOM); var bed: int64 := peek64(pv1 + HL7_PV1_LBED); var cls: int64 := peek64(pv1 + HL7_PV1_CLASS); // Merge-Sonderfall if (peek64(adt + HL7_ADT_ISMERGE) == 1) { var mrg: int64 := adt + HL7_ADT_MRG; var oldPid: int64 := peek64(mrg + HL7_MRG_PID); // mergePatients(oldPid, pid1); } // Neue ADT-A08-Nachricht (Update) erstellen var outBuf: int64 := alloc(4096); var outLen: int64 := Hl7AdtWrite(adt, "A08"c as int64, outBuf, 4096); free(outBuf, 4096); free(adt, HL7_ADT_SIZE); } ---- ===== Hinweise ===== * **Zero-Copy**: Alle ''Parse''-Funktionen setzen Zeiger in den Originalpuffer — kein Kopieren. Der Nachrichtenpuffer muss während der gesamten Verarbeitung des ADT-Structs gültig bleiben. * **PID-3 Repeats**: ''Hl7PidParse'' verarbeitet bis zu drei ''~''-getrennte Wiederholungen in PID-3 (ID1, ID2, ID3). In der Praxis enthält PID-3 oft nur eine ID. * **Merge-Logik**: ''Hl7AdtIsMerge'' prüft den Event-Code; ''HL7_ADT_HASMRG'' zeigt an ob physisch ein MRG-Segment vorhanden war. Beide können zusammen auftreten. * **Hl7AdtWrite**: Erzeugt immer MSH+PID+PV1. MRG wird nur angehängt wenn ''HL7_ADT_HASMRG=1''. NK1 wird nicht geschrieben (nur lesbar). ---- ===== Quelldatei ===== ^ Unit ^ Datei ^ | ''std.hl7.adt'' | ''std/hl7/adt.lyx'' | Letzte Aktualisierung: 2026-06-16