AnpherosAnpheros PlatformDevelopers

Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card

كيفية استيراد نتائج المختبر إلى سجل FHIR

برنامج تعليمي: استيراد تقرير مختبر كملف CSV و HL7 v2 ORU^R01 إلى ملاحظات FHIR R4 مع رموز LOINC ونطاقات مرجعية، والتعامل مع العلامات غير المطابقة والتقارير المعاد إرسالها، وتتبع كل نتيجة إلى مختبرها.

يأخذ هذا الدليل التعليمي تقرير مختبر كملف CSV وكمرسلة HL7 v2 ORU^R01، ويستورده إلى سجل HL7 FHIR R4 لمريض في طلب واحد لكل منهما، ويوضح ما تحصل عليه: موارد Observation مختبر مع رموز LOINC، ونطاقات مرجعية، ومصدر. كما يغطي المشكلتين اللتين تواجههما كل عملية تكامل مختبر: العلامات التي لا يمكن تعيينها تلقائيًا والتقارير التي يتم إرسالها مرتين. كل شيء يعمل على البيئة التجريبية المجانية مع مريض اصطناعي.

لماذا يصعب تخزين نتائج المختبر

تبدو تقارير المختبر بسيطة: علامة، قيمة، وحدة، نطاق مرجعي، تاريخ. في الممارسة العملية، تسمي كل مختبر العلامات بطريقته الخاصة ("Hemoglobina glicozilata"، "HbA1c"، "Glycated haemoglobin")، وتستخدم الفواصل أو النقاط للأرقام العشرية، وتكتب النطاقات على شكل 4,0-5,6، <5 أو >3.5، وتعيد إرسال نفس التقرير عند فشل شيء ما. عند تخزين هذه النتائج كنص حر، لا يمكن مقارنتها بمرور الوقت، أو رسمها بيانيًا، أو مشاركتها مع تطبيق آخر، أو تقديمها لنموذج ذكاء اصطناعي بثقة.

يسجل سجل FHIR كل نتيجة كمورد Observation مع رمز LOINC، ووحدة UCUM، وقيمة، ونطاق مرجعي، وتاريخ، ويحتفظ بمن أرسلها في مورد Provenance. يقوم موصل المختبر بإجراء هذا التحويل نيابة عنك.

 lab report (CSV, HL7 v2, JSON)
        │  POST /v1/patients/{id}/labs/import
        ▼
 ┌──────────────────────────────────────────────┐
 │ parse rows → map marker to LOINC → parse     │
 │ value, unit, range → stable id per row       │
 └──────────────────────────────────────────────┘
        │
        ▼
 Observation (category laboratory) + Provenance (author_type import, source system, report id)
        │
        ├─► the patient's app and every app they consented to
        └─► webhooks: resource.created per Observation

قبل البدء

تحتاج إلى مفتاح صندوق رمل (sk_test_…) من platform.anpheros.com/dashboard (الحصول على مفتاح صندوق رمل). تستخدم الأمثلة curl؛ تحتوي SDKs على نفس الاستدعاءات (labs.importCsv، labs.importHl7، labs.importItems).

export BASE=https://platform.anpheros.com
export KEY=sk_test_…
# Elena Ionescu, a synthetic patient with type 2 diabetes
export PID=$(curl -s "$BASE/fhir/R4/Patient?identifier=https://anpheros.com/fhir/sid/sandbox-persona|p02" \
  -H "Authorization: Bearer $KEY" | jq -r '.entry[0].resource.id')

الخطوة 1: استيراد تقرير CSV

هذه هي الطريقة التي قد يقوم بها مختبر روماني بتصدير تقرير: فواصل منقوطة، فواصل عشرية، أسماء أعمدة رومانية وتواريخ مثل DD.MM.YYYY. يتعرف الموصل على أسماء الأعمدة الرومانية والإنجليزية.

cat > report.csv <<'EOF'
Analiza;Rezultat;UM;Interval de referinta;Data
Hemoglobina glicozilata (HbA1c);6,9;%;4,0-5,6;01.10.2026
Glicemie;131;mg/dL;70-100;01.10.2026
TSH;2,1;mUI/L;0,4-4,0;01.10.2026
Marker foarte rar;12;U/L;0-20;01.10.2026
EOF

curl -X POST "$BASE/v1/patients/$PID/labs/import" -H "Authorization: Bearer $KEY" \
     -H "Content-Type: text/csv" -H "X-Anpheros-Source-System: labx" \
     -H "Idempotency-Key: report-2026-10-01-elena" --data-binary @report.csv

الاستجابة (201):

{"created": 4, "skipped": 0, "unmapped": ["Marker foarte rar"], "warnings": [],
 "observations": [
  {"id": "ff0bbb44-…", "marker": "Hemoglobina glicozilata (HbA1c)", "code": "4548-4", "system": "http://loinc.org", "value": 6.9, "unit": "%", "date": "2026-10-01"},
  {"id": "ebe5522f-…", "marker": "Glicemie", "code": "2345-7", "system": "http://loinc.org", "value": 131.0, "unit": "mg/dL", "date": "2026-10-01"},
  {"id": "bace44a8-…", "marker": "TSH", "code": "3016-3", "system": "http://loinc.org", "value": 2.1, "unit": "mUI/L", "date": "2026-10-01"},
  {"id": "26fd2270-…", "marker": "Marker foarte rar", "code": "marker_foarte_rar", "system": "urn:anpheros:lab-code", "value": 12.0, "unit": "U/L", "date": "2026-10-01"}]}

تم تعيين HbA1c والجلوكوز و TSH إلى LOINC من أسمائها. أصبحت الفواصل العشرية أرقامًا، وأصبحت النطاقات referenceRange. عادت صف واحد في unmapped. لا يزال مخزنًا، تحت رمز المختبر الخاص (urn:anpheros:lab-code) مع النص الدقيق من التقرير، لذلك لم يُفقد شيء.

الخطوة 2: التعامل مع العلامات غير المعينة

بعض الأسماء تحتاج إلى قرار. "Glicemie" (سكر الدم) مثال جيد: لدى LOINC رمز واحد للجلوكوز في المصل أو البلازما (2345-7، عينة وريدية تؤخذ في المختبر) ورمز آخر للجلوكوز في الدم الكامل (2339-0، على سبيل المثال وخزة إصبع). في تقرير المختبر، يتم تعيين "Glicemie" المجردة إلى المصل أو البلازما. يتم تعيين اسم يقول "capilar" أو "capillary" أو "sânge integral" إلى الدم الكامل:

{"created": 1, "skipped": 0, "unmapped": [], "warnings": [],
 "observations": [{"id": "00480a6d-…", "marker": "Glicemie capilara", "code": "2339-0", "system": "http://loinc.org", "value": 140.0, "unit": "mg/dL", "date": "2026-10-02"}]}

بالنسبة للعلامات التي لا يتعرف عليها الموصل، ابحث عن الرمز:

curl "$BASE/v1/terminology/loinc?q=glucose" -H "Authorization: Bearer $KEY"
{"data": [
  {"system": "http://loinc.org", "code": "2339-0", "display": "Glucose [Mass/volume] in Blood", "display_ro": "Glicemie (sânge)", "category": "laboratory", "unit": "mg/dL"},
  {"system": "http://loinc.org", "code": "2345-7", "display": "Glucose [Mass/volume] in Serum or Plasma", "display_ro": "Glicemie (ser)", "category": "laboratory", "unit": "mg/dL"}],
 "total": 2}

ثم أرسل الرمز في عمود LOINC. الرمز الموجود في التقرير يفوز دائمًا على الاسم. احتفظ بهذا التعيين لكل مختبر على جانبك وأضف العمود إلى كل تقرير منه:

Analiza;Rezultat;UM;Interval de referinta;Data;LOINC
Glicemie;99;mg/dL;70-100;04.10.2026;2339-0

العلامات التي لا يغطيها LOINC على الإطلاق، مثل "Marker foarte rar" المخترع، يمكن أن تبقى تحت رمز المختبر. يتم عرضها للمريض وتضمينها في السجل. لا يمكن مقارنتها بنتائج المختبرات الأخرى.

الخطوة 3: إرسال نفس التقرير مرتين

تعيد المختبرات إرسال التقارير. تحصل كل صف على معرف ثابت مبني من معرف التقرير، والرمز، والتاريخ، والقيمة، لذا فإن استيرادًا ثانيًا لنفس التقرير لا ينشئ شيئًا:

{"created": 0, "skipped": 4, "unmapped": ["Marker foarte rar"], "warnings": [], "observations": []}

يتم استيراد الصفوف التي تغيرت، مثل قيمة مصححة على سبيل المثال، كنتائج جديدة. يضيف رأس Idempotency-Key ضمانًا ثانيًا: إعادة محاولة الشبكة بنفس المفتاح تعيد الاستجابة الأولى دون تغيير.

الخطوة 4: استيراد رسالة HL7 v2 ORU^R01

تتحدث معظم أنظمة معلومات المختبرات بلغة HL7 v2. أرسل الرسالة كما هي (نص ER7، مقاطع مفصولة بـ CR أو LF):

MSH|^~\&|LABX|LAB1|ANPHEROS|EHR|202610010930||ORU^R01|MSG00077|P|2.5.1
PID|1||12345||Ionescu^Elena||19850903|F
OBR|1||R-77|24331-1^Lipid panel^LN|||202610010800
OBX|1|NM|2093-3^Cholesterol [Mass/volume] in Serum or Plasma^LN||212|mg/dL|<200|H|||F|||202610010800
OBX|2|NM|2085-9^HDL Cholesterol^LN||52|mg/dL|>40|N|||F|||202610010800
curl -X POST "$BASE/v1/patients/$PID/labs/import" -H "Authorization: Bearer $KEY" \
     -H "Content-Type: x-application/hl7-v2+er7" --data-binary @oru.hl7
{"created": 2, "skipped": 0, "unmapped": [], "warnings": [],
 "observations": [
  {"id": "b562045b-…", "marker": "Cholesterol [Mass/volume] in Serum or Plasma", "code": "2093-3", "system": "http://loinc.org", "value": 212.0, "unit": "mg/dL", "date": "2026-10-01T08:00:00Z"},
  {"id": "9b3274e4-…", "marker": "HDL Cholesterol", "code": "2085-9", "system": "http://loinc.org", "value": 52.0, "unit": "mg/dL", "date": "2026-10-01T08:00:00Z"}]}

يتم استخدام OBX-3 مع نظام الترميز LN كنظام LOINC مباشرة. يصبح OBX-7 النطاق المرجعي و OBX-8 (H، N) التفسير. يتم الاحتفاظ بـ OBR-3 (R-77) كمعرف التقرير في المصدر. المريض هو الموجود في عنوان URL: لا يتم استخدام المقطع PID للعثور على مريض، لذلك لا يمكن لـ PID خاطئ إرفاق النتائج بشخص آخر.

هل لديك نتائج محللة بالفعل؟ أرسل JSON: {"date": "2026-10-01", "origin": "report-77", "items": [{"marker": "Ferritin", "value": 38, "unit": "ng/mL", "ref_low": 15, "ref_high": 150}]}. يتم تعيين الفيريتين إلى LOINC 2276-4.

الخطوة 5: قراءة النتائج بصيغة FHIR

curl "$BASE/fhir/R4/Observation?patient=$PID&code=http://loinc.org|4548-4&_sort=-date&_count=1" \
     -H "Authorization: Bearer $KEY"

تم استيراد HbA1c، كما تم تخزينه:

{
  "resourceType": "Observation",
  "id": "62b1b0c0-…",
  "meta": {"versionId": "1", "lastUpdated": "2026-10-12T20:05:57.011Z"},
  "identifier": [{"system": "urn:anpheros:lab-import", "value": "c52d3cd6449291d34f6bef1516d0ac05"}],
  "status": "final",
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "laboratory"}]}],
  "code": {"coding": [{"system": "http://loinc.org", "code": "4548-4", "display": "Hemoglobin A1c/Hemoglobin.total in Blood"}],
           "text": "Hemoglobina glicozilata (HbA1c)"},
  "subject": {"reference": "Patient/…"},
  "effectiveDateTime": "2026-10-01",
  "valueQuantity": {"value": 6.9, "unit": "%"},
  "referenceRange": [{"low": {"value": 4.0, "unit": "%"}, "high": {"value": 5.6, "unit": "%"}}]
}

اسم العرض الخاص بـ LOINC هو الاسم القياسي باللغة الإنجليزية. code.text يحتفظ بالصياغة الخاصة بالمختبر، لذلك لا يزال المريض يرى ما كان على التقرير الورقي. لمزيد من المعلومات حول الموارد والبحث، راجع دليل منصة FHIR و أنظمة أكواد FHIR.

الخطوة 6: التحقق من المرسل

curl "$BASE/v1/patients/$PID/provenance/Observation/62b1b0c0-…" -H "Authorization: Bearer $KEY"
{"data": [{"version": 1, "activity": "CREATE", "recorded": "2026-10-12T20:05:57.011000Z",
           "author_type": "import", "author": "proj_…", "source_system": "labx", "origin_id": null,
           "fhir": "Provenance/f15c4fee-…"}], "total": 1}

تبقى author_type: import و source_system: labx مع القيمة. عندما يقرأ تطبيق الذكاء الاصطناعي لاحقًا هذه النتيجة عبر واجهة برمجة تطبيقات السياق، يتم تمييزها بـ [import/labx]، حتى يتمكن النموذج من التمييز بين نتيجة مختبر وقيمة أدخلها المريض.

ماذا يحدث بعد ذلك

أسئلة متكررة

ما هي صيغ تقارير المختبر التي يمكن استيرادها إلى FHIR؟

CSV مع صف رأس (فاصلة، فاصلة منقوطة أو علامة جدولة، فاصلة عشرية مقبولة)، رسائل HL7 v2 ORU^R01 و JSON. يمكن تخزين تقارير PDF كمستندات؛ تشير القيم المستخرجة منها إلى المستند.

ماذا يحدث للعلامات التي لا تحتوي على رمز LOINC؟

يتم تخزينها تحت رمز المختبر الخاص بها مع النص الدقيق من التقرير وتُدرج في unmapped. أضف عمود LOINC لهذا المختبر وسيتم تعيينها. يأخذ الرمز الموجود في التقرير دائمًا الأولوية على الاسم.

هل من الآمن إعادة إرسال تقرير؟

نعم. كل صف له معرف ثابت مبني من التقرير والرمز والتاريخ والقيمة، لذلك يتم تخطي الصفوف التي تم استيرادها بالفعل؛ يتم استيراد الصفوف المتغيرة كنتائج جديدة.

هل يمكن للمختبر استيراد نتائج لأي مريض؟

لا. يستورد المختبر إلى المرضى الذين أنشأ مشروعهم أو الذين شارك سجلاتهم الشخص معهم عبر OAuth. المرضى الآخرون غير موجودين بالنسبة له (404).

ذات الصلة

Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card

Product updates by email

New features, guides and the end of the beta. One email a month at most.

Send me occasional Anpheros Platform updates by email (new features, API changes, guides). I'll confirm by email and can unsubscribe in one click from any email. Privacy