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 ORMO01; findet ORC, OBR, PID, PV1 automatisch; setzt MSGTYPE=1
Hl7OmlParse(msg: int64, len: int64, order: int64): void Parst OMLO21 (Labor-Auftrag); identisches Layout wie ORM; setzt MSGTYPE=2
Hl7RasParse(msg: int64, len: int64, admin: int64): void Parst RASO17 (Medikamentengabe); extrahiert RXA-Segment in admin-Struct

Nachrichten schreiben

Signatur Beschreibung
Hl7OrmWrite(order: int64, out: int64, outMax: int64): int64 Schreibt ORMO01 (MSH+ORC+OBR); gibt Bytes zurück
Hl7OmlWrite(order: int64, out: int64, outMax: int64): int64 Schreibt OMLO21 (MSH+ORC+OBR); gibt Bytes zurück
Hl7OrrWrite(order: int64, status: int64, out: int64, outMax: int64): int64 Schreibt ORRO02 (ORM-Antwort) oder ORLO22 (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