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