====== 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