====== std.hl7.orders ====== Order Management — parst und erzeugt ORM^O01- (General Order), OML^O21- (Lab Order) und RAS^O17-Nachrichten (Medication Administration). Liefert Auftrags-Kontrollinfos aus ORC, Untersuchungsdetails aus OBR und Medikamentengabe-Daten aus RXA in einem einheitlichen Struct. import std.hl7.orders; import std.alloc; // ORM^O01 parsen var order: int64 := alloc(HL7_ORD_SIZE); Hl7OrmParse(msgBuf, msgLen, order); // STAT-Auftrag erkennen if (peek64(order + HL7_ORD_ISSTAT) == 1) { // Sofortpriorität — zuerst bearbeiten } // Leistungs-ID und Auftragnehmer-Nr auslesen var svc: int64 := peek64(order + HL7_ORD_SERVICE); var filler: int64 := peek64(order + HL7_ORD_FILLER); // Auftragsbestätigung ORR^O02 senden var outBuf: int64 := alloc(2048); var outLen: int64 := Hl7OrrWrite(order, "OK"c as int64, outBuf, 2048); free(outBuf, 2048); free(order, HL7_ORD_SIZE); ---- ===== Imports ===== * ''std.hl7.core'' * ''std.alloc'' ---- ===== Structs ===== ==== Hl7Order — Auftragsstruktur (HL7_ORD_SIZE = 192 Bytes) ==== Kombiniert Felder aus ORC, OBR, PID und PV1 der geparsten Nachricht in einem flachen Struct. ^ Offset-Konstante ^ Offset ^ Quelle ^ Inhalt ^ | ''HL7_ORD_CTRL / _LEN'' | 0 / 8 | ORC-1 | Auftrags-Kontroll-Code (NW=New, CA=Cancel, DC=Discontinue, SC=Status Change, RP=Replace) | | ''HL7_ORD_PLACER / _LEN'' | 16 / 24 | ORC-2 | Auftraggeber-Nummer (Placer) | | ''HL7_ORD_FILLER / _LEN'' | 32 / 40 | ORC-3 | Auftragnehmer-Nummer (Filler) | | ''HL7_ORD_STATUS / _LEN'' | 48 / 56 | ORC-5 | Auftragsstatus | | ''HL7_ORD_SERVICE / _LEN'' | 64 / 72 | OBR-4 | Universal Service ID (Leistungsschlüssel) | | ''HL7_ORD_PRIORITY / _LEN'' | 80 / 88 | OBR-5 | Priorität (R=Routine, S=STAT, A=ASAP, T=Timing Critical, C=Callback) | | ''HL7_ORD_REQ_DT / _LEN'' | 96 / 104 | OBR-6 | Gewünschter Durchführungszeitpunkt | | ''HL7_ORD_OBS_DT / _LEN'' | 112 / 120 | OBR-7 | Tatsächlicher Beobachtungszeitpunkt | | ''HL7_ORD_PROVIDER / _LEN'' | 128 / 136 | ORC-12 | Anfordernder Arzt | | ''HL7_ORD_PAT_ID / _LEN'' | 144 / 152 | PID-3.1 | Patienten-ID (erste Komponente) | | ''HL7_ORD_VISIT / _LEN'' | 160 / 168 | PV1-19 | Besuchsnummer | | ''HL7_ORD_MSGTYPE'' | 176 | — | Nachrichtentyp: ''1'' = ORM, ''2'' = OML | | ''HL7_ORD_ISSTAT'' | 184 | — | ''1'' wenn Priorität 'S' (STAT) — Sofortauftrag | ==== Hl7RxAdmin — Medikamentengabe (HL7_RXA_SIZE = 112 Bytes) ==== Wird durch ''Hl7RasParse'' (RAS^O17) befüllt. Enthält alle relevanten Felder aus dem RXA-Segment. ^ Offset-Konstante ^ Offset ^ RXA-Feld ^ Inhalt ^ | ''HL7_RXA_DRUG / _LEN'' | 0 / 8 | RXA-5 | Verabreichter Wirkstoff/Code | | ''HL7_RXA_DOSE / _LEN'' | 16 / 24 | RXA-6 | Verabreichte Menge | | ''HL7_RXA_UNIT / _LEN'' | 32 / 40 | RXA-7 | Einheit (z. B. mg, ml, IE) | | ''HL7_RXA_ROUTE / _LEN'' | 48 / 56 | RXA-12 | Applikationsweg (PO=oral, IV=intravenös, SC=subkutan …) | | ''HL7_RXA_START / _LEN'' | 64 / 72 | RXA-3 | Beginn der Verabreichung | | ''HL7_RXA_STOP / _LEN'' | 80 / 88 | RXA-4 | Ende der Verabreichung | | ''HL7_RXA_ADMIN_BY / _LEN'' | 96 / 104 | RXA-10 | Verabreichende Person | ---- ===== Funktionen ===== ==== Segmente einzeln parsen ==== ^ Signatur ^ Beschreibung ^ | ''Hl7OrcParse(seg: int64, segLen: int64, order: int64): void'' | Parst ORC-Segment → füllt CTRL, PLACER, FILLER, STATUS, PROVIDER | | ''Hl7ObrParse(seg: int64, segLen: int64, order: int64): void'' | Parst OBR-Segment → füllt SERVICE, PRIORITY, REQ_DT, OBS_DT; setzt ISSTAT=1 wenn OBR-5='S' | | ''Hl7RxaParse(seg: int64, segLen: int64, admin: int64): void'' | Parst RXA-Segment → füllt DRUG, DOSE, UNIT, ROUTE, START, STOP, ADMIN_BY | ==== Vollständige Nachrichten parsen ==== ^ Signatur ^ Beschreibung ^ | ''Hl7OrmParse(msg: int64, len: int64, order: int64): void'' | Parst ORM^O01; findet ORC, OBR, PID, PV1 automatisch; setzt MSGTYPE=1 | | ''Hl7OmlParse(msg: int64, len: int64, order: int64): void'' | Parst OML^O21 (Labor-Auftrag); identisches Layout wie ORM; setzt MSGTYPE=2 | | ''Hl7RasParse(msg: int64, len: int64, admin: int64): void'' | Parst RAS^O17 (Medikamentengabe); extrahiert RXA-Segment in admin-Struct | ==== Nachrichten schreiben ==== ^ Signatur ^ Beschreibung ^ | ''Hl7OrmWrite(order: int64, out: int64, outMax: int64): int64'' | Schreibt ORM^O01 (MSH+ORC+OBR); gibt Bytes zurück | | ''Hl7OmlWrite(order: int64, out: int64, outMax: int64): int64'' | Schreibt OML^O21 (MSH+ORC+OBR); gibt Bytes zurück | | ''Hl7OrrWrite(order: int64, status: int64, out: int64, outMax: int64): int64'' | Schreibt ORR^O02 (ORM-Antwort) oder ORL^O22 (OML-Antwort) abhängig von MSGTYPE; enthält MSA+ORC mit Placer/Filler; ''status'' null-terminiert (z. B. ''„OK"'' oder ''„ER"'') | ---- ===== ORC Kontroll-Codes ===== ^ Code ^ Bedeutung ^ | NW | New — neuer Auftrag | | CA | Cancel — Stornierung | | DC | Discontinue — Abbruch laufender Auftrag | | SC | Status Changed — Statusänderung | | RP | Replace — Ersetzen durch neuen Auftrag | ---- ===== Codebeispiel — Labor-Auftrag und Quittung ===== import std.hl7.orders; import std.alloc; fn handleLabOrder(msgBuf: int64, msgLen: int64): void { var order: int64 := alloc(HL7_ORD_SIZE); // OML^O21 parsen Hl7OmlParse(msgBuf, msgLen, order); var ctrl: int64 := peek64(order + HL7_ORD_CTRL); var svcP: int64 := peek64(order + HL7_ORD_SERVICE); var svcL: int64 := peek64(order + HL7_ORD_SERVICE_LEN); var patId: int64 := peek64(order + HL7_ORD_PAT_ID); // STAT-Auftrag bevorzugt bearbeiten var isStat: int64 := peek64(order + HL7_ORD_ISSTAT); if (isStat == 1) { // Sofortverarbeitung } // Erfolgs-Quittung ORL^O22 senden var outBuf: int64 := alloc(2048); var outLen: int64 := Hl7OrrWrite(order, "OK"c as int64, outBuf, 2048); // TcpWrite(sockFd, outBuf, outLen); free(outBuf, 2048); free(order, HL7_ORD_SIZE); } fn handleMedication(msgBuf: int64, msgLen: int64): void { var admin: int64 := alloc(HL7_RXA_SIZE); Hl7RasParse(msgBuf, msgLen, admin); var drug: int64 := peek64(admin + HL7_RXA_DRUG); var dose: int64 := peek64(admin + HL7_RXA_DOSE); var unit: int64 := peek64(admin + HL7_RXA_UNIT); var route: int64 := peek64(admin + HL7_RXA_ROUTE); // Medikamentengabe in Krankenakte dokumentieren ... free(admin, HL7_RXA_SIZE); } ---- ===== Hinweise ===== * **ORM vs. OML**: ORM^O01 ist der allgemeine Auftragstyp (Röntgen, EKG, Konsil); OML^O21 ist speziell für Laboraufträge (Blutbild, Urinanalyse). Beide erzeugen identische Struct-Layouts — nur ''HL7_ORD_MSGTYPE'' unterscheidet sich. * **STAT-Erkennung**: ''HL7_ORD_ISSTAT'' wird automatisch gesetzt wenn OBR-5 = 'S'. STAT-Aufträge erfordern in der Praxis sofortige Bearbeitung (< 60 Minuten). * **Placer vs. Filler**: Der Auftraggeber (Placer = anfordernde Station) vergibt ORC-2; der Auftragnehmer (Filler = Labor/Radiologie) vergibt ORC-3. Die Quittung ''Hl7OrrWrite'' spiegelt beide Nummern zurück. * **Zero-Copy**: Alle ''Parse''-Funktionen setzen Zeiger in den Originalpuffer. ''Write''-Funktionen erzeugen neue Nachrichten und sind unabhängig vom Eingabepuffer. ---- ===== Quelldatei ===== ^ Unit ^ Datei ^ | ''std.hl7.orders'' | ''std/hl7/orders.lyx'' | Letzte Aktualisierung: 2026-06-16