AnpherosAnpheros PlatformDevelopers

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

كيفية تخزين السجلات الطبية باستخدام FHIR R4

برنامج تعليمي: إنشاء مريض (Patient)، ملاحظة ضغط دم (Observation)، وحالة (Condition)، واستخدام معاملة (transaction)، والبحث، والتحديث مع التاريخ، وقراءة المصدر — كل طلب باستخدام curl والاستجابة الحقيقية، على بيئة الاختبار المجانية.

يخزن هذا البرنامج التعليمي سجلاً طبياً صغيراً كموارد HL7 FHIR R4: مريض (Patient)، ملاحظة ضغط الدم (Observation)، وتشخيص كـ (Condition)، ثم مريض وقياس معاً في معاملة واحدة. يقوم بالبحث عنها، وتحديث التشخيص دون فقدان الإصدار السابق، وقراءة من كتب ماذا. كل طلب هو curl عادي مقابل البيئة التجريبية المجانية لـ Anpheros، وكل استجابة معروضة هي ما تعيده الـ API.

إذا كنت جديداً على FHIR، اقرأ منصة FHIR أولاً للمفاهيم. هذه الصفحة هي الجزء العملي.

الموارد الثلاثة التي تبدأ بها معظم السجلات

المورد ما يحتويه مُرمّز بـ
Patient من هو الشخص الذي يتعلق به السجل: الاسم، تاريخ الميلاد، الجنس، المعرفات من أنظمة أخرى أنظمة المعرفات الخاصة بك
Observation أي شيء تم قياسه أو الإبلاغ عنه: العلامات الحيوية، نتائج المختبر، الوزن، درجة الأعراض وحدات LOINC، UCUM
Condition تشخيص أو مشكلة صحية، مع حالتها بمرور الوقت ICD-10 (SNOMED CT خلف علامة ترخيص)

الأدوية (MedicationStatement)، الحساسية (AllergyIntolerance)، التطعيمات والمستندات تتبع نفس النمط؛ 26 نوع مورد مدعوم مدرجة في بيان القدرات في /fhir/R4/metadata.

قبل البدء

احصل على مفتاح صندوق رمل (sk_test_…) من platform.anpheros.com/dashboard باستخدام خيار Get a sandbox key. لا توجد بيانات مرضى حقيقية في أي شيء تنشئه هناك، ولا يمكن رؤية أي شيء من قبل مشاريع أخرى.

export BASE=https://platform.anpheros.com/fhir/R4
export KEY=sk_test_…

الخطوة 1: إنشاء مريض

curl -X POST "$BASE/Patient" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" -d '{
  "resourceType": "Patient",
  "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-10442"}],
  "name": [{"family": "Marin", "given": ["Ioana"]}],
  "gender": "female",
  "birthDate": "1979-04-12"
}'

201 Created، مع المعرف والإصدار الذي خصصه الخادم:

{"resourceType": "Patient",
 "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-10442"}],
 "name": [{"family": "Marin", "given": ["Ioana"]}], "gender": "female", "birthDate": "1979-04-12",
 "id": "d09e3942-ed86-4458-b099-fa674ab21b84",
 "meta": {"versionId": "1", "lastUpdated": "2026-10-12T20:16:51.043Z"}}

احتفظ بمعرفاتك الخاصة في identifier باستخدام system تتحكم فيه (هنا رقم سجل العيادة)، حتى تتمكن دائمًا من العثور على المريض مرة أخرى باستخدام GET $BASE/Patient?identifier=https://clinic.example/mrn|MRN-10442. معرف FHIR id هو معرف المنصة، وهو خاص بمشروعك: يرى مشروع آخر نفس الشخص بمعرف مختلف.

export PID=d09e3942-ed86-4458-b099-fa674ab21b84

الخطوة 2: تخزين قياس كملاحظة

ضغط الدم هو ملاحظة واحدة لها مكونان، الانقباضي والانبساطي، ولكل منهما رمز LOINC الخاص به. قل من قام بالقياس: هنا جهاز منزلي.

curl -X POST "$BASE/Observation" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H "X-Anpheros-Author-Type: device" -H "Idempotency-Key: bp-2026-10-10-0830" -d '{
  "resourceType": "Observation",
  "status": "final",
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
  "code": {"coding": [{"system": "http://loinc.org", "code": "85354-9", "display": "Blood pressure panel"}]},
  "subject": {"reference": "Patient/'$PID'"},
  "effectiveDateTime": "2026-10-10T08:30:00Z",
  "component": [
    {"code": {"coding": [{"system": "http://loinc.org", "code": "8480-6"}]},
     "valueQuantity": {"value": 138, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]"}},
    {"code": {"coding": [{"system": "http://loinc.org", "code": "8462-4"}]},
     "valueQuantity": {"value": 88, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]"}}
  ]
}'

الاستجابة هي المورد المخزن مع id و meta.versionId: "1". ثلاثة تفاصيل مهمة لسجل قابل للاستخدام:

نتائج المختبر هي نفس المورد مع category laboratory وعادةً referenceRange. لجلب تقارير المختبر الكاملة، انظر كيفية استيراد نتائج المختبر إلى سجل FHIR.

الخطوة 3: تسجيل تشخيص كحالة (Condition)

curl -X POST "$BASE/Condition" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H "X-Anpheros-Author-Type: practitioner" -d '{
  "resourceType": "Condition",
  "subject": {"reference": "Patient/'$PID'"},
  "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "active"}]},
  "verificationStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", "code": "confirmed"}]},
  "code": {"coding": [{"system": "http://hl7.org/fhir/sid/icd-10", "code": "I10", "display": "Essential (primary) hypertension"}]},
  "onsetDateTime": "2026-03-02"
}'

clinicalStatus (نشط، تم حله، في هدأة) و verificationStatus (مؤكد، مبدئي) منفصلان عن قصد: التشخيص المشتبه به ليس هو نفسه التشخيص المؤكد، والمشكلة التي تم حلها لا تزال جزءًا من التاريخ.

الخطوة 4: إنشاء موارد ذات صلة في معاملة واحدة

عندما يصل المريض وقياسه الأول معًا، على سبيل المثال من نظام عيادة، أرسلهما كـ transaction Bundle. إما أن يتم تخزين كل شيء أو لا شيء. تشير المراجع بين الموارد الجديدة إلى urn:uuid: ids مؤقتة يستبدلها الخادم:

curl -X POST "$BASE" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" -d '{
  "resourceType": "Bundle", "type": "transaction",
  "entry": [
    {"fullUrl": "urn:uuid:9f1c0d1e-0000-4000-8000-000000000001",
     "resource": {"resourceType": "Patient", "name": [{"family": "Stan", "given": ["Mihai"]}], "gender": "male", "birthDate": "1990-02-01"},
     "request": {"method": "POST", "url": "Patient"}},
    {"resource": {"resourceType": "Observation", "status": "final",
       "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
       "code": {"coding": [{"system": "http://loinc.org", "code": "29463-7", "display": "Body weight"}]},
       "subject": {"reference": "urn:uuid:9f1c0d1e-0000-4000-8000-000000000001"},
       "effectiveDateTime": "2026-10-10",
       "valueQuantity": {"value": 82.4, "unit": "kg", "system": "http://unitsofmeasure.org", "code": "kg"}},
     "request": {"method": "POST", "url": "Observation"}}
  ]
}'

يحتوي transaction-response على إدخال واحد لكل مورد، مع "status": "201 Created"، و location الخاص به، والمورد المخزن. يشير subject الخاص بالملاحظة الآن إلى Patient/fad3665a-… الحقيقي.

الخطوة 5: البحث

curl "$BASE/Observation?patient=$PID&code=http://loinc.org|85354-9&date=ge2026-10-01&_sort=-date" \
     -H "Authorization: Bearer $KEY"

تحصل على searchset Bundle تحتوي على total والموارد المطابقة، الأحدث أولاً. عمليات البحث الأخرى التي ستستخدمها بشكل متكرر هي: Condition?patient=$PID&clinical-status=active، Observation?patient=$PID&category=laboratory، و Patient/$PID/$everything للسجل بأكمله.

الخطوة 6: التحديث دون فقدان السجل

يتم حل ارتفاع ضغط الدم. قم بتغيير الحالة وإضافة تاريخ الانتهاء، واستخدم If-Match مع الإصدار الذي قرأته لتجنب الكتابة فوق تغيير شخص آخر:

curl -X PUT "$BASE/Condition/$CID" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H 'If-Match: W/"1"' -d '{ …the same Condition…, "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "resolved"}]}, "abatementDateTime": "2026-10-11" }'

مع 200 OK و ETag: W/"2". إذا وصل تحديث آخر قبلك، فستحصل على 412 وتقوم بالقراءة مرة أخرى. الإصدار الأقدم لا يزال موجودًا:

curl "$BASE/Condition/$CID/_history" -H "Authorization: Bearer $KEY"

يعيد كلا الإصدارين: versionId 2 (resolved) و 1 (active). GET $BASE/Condition/$CID/_history/1 يقرأ الإصدار القديم. لا يتم الكتابة فوق أي شيء في السجل بصمت.

الخطوة 7: معرفة من كتب ماذا

كل عملية كتابة تنشئ موردًا من نوع Provenance. بالنسبة لقراءة ضغط الدم:

curl "$BASE/Provenance?target=Observation/$OBS" -H "Authorization: Bearer $KEY"
{"resourceType": "Provenance",
 "target": [{"reference": "Observation/d83d9075-…/_history/1"}],
 "recorded": "2026-10-12T20:16:51.056000Z",
 "activity": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/v3-DataOperation", "code": "CREATE"}]},
 "agent": [{"type": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/provenance-participant-type", "code": "author"}]},
            "who": {"identifier": {"system": "https://anpheros.com/fhir/CodeSystem/author-type", "value": "device"}, "display": "proj_…"},
            "onBehalfOf": {"identifier": {"system": "https://anpheros.com/fhir/sid/organization", "value": "org_…"}, "display": "…"}}]}

يتم تسجيل نوع المؤلف الذي أرسلته (device) مع المشروع والمؤسسة. أرسل X-Anpheros-Author-Ref: Practitioner/<id> لتسمية الطبيب وراء عملية الكتابة.

الخطوة 8: السجل كملخص

curl "$BASE/Patient/$PID/\$summary" -H "Authorization: Bearer $KEY"

يعيد ملخص المريض الدولي (International Patient Summary): وهو document Bundle يبدأ بـ Composition ويحتوي على أقسام مثل المشاكل (Problems)، والأدوية (Medications)، والحساسيات (Allergies)، والعلامات الحيوية (Vital signs)، مبنيًا من الموارد المذكورة أعلاه. هذا هو التنسيق الذي يتم تسليمه إلى نظام آخر أو طباعته لطبيب (منصة FHIR).

تفضل JSON بدون FHIR؟

نفس البيانات متاحة عبر واجهة REST أبسط، /v1، بنفس المعرفات: POST /v1/patients/{id}/observations يأخذ {"code": "85354-9", "category": "vital-signs", "effective_at": "…", "components": […]} ويخزن نفس FHIR Observation. استخدم أيًا منهما يناسب الكود الخاص بك. انظر Medical data API و SDKs.

أسئلة متكررة

ما هي أفضل طريقة لتخزين السجلات الطبية؟

كموارد مرمزة، ومُصنفة، مع سجل لمن كتب كل منها. يوفر HL7 FHIR R4 الهيكل (Patient، Observation، Condition وغيرها)، وأنظمة الترميز القياسية مثل LOINC و ICD-10، والتاريخ؛ يضيف خادم FHIR البحث، والموافقة، والمصدر فوق ذلك.

هل أحتاج إلى خادم FHIR لاستخدام FHIR؟

تحتاج إلى مكان يقوم بتخزين موارد FHIR والبحث فيها، ويفرض من يمكنه قراءتها. يمكنك تشغيل خادم FHIR مفتوح المصدر بنفسك أو استخدام خادم مُدار مثل Anpheros؛ كيف تقارن Anpheros بخوادم FHIR الأخرى يزن الخيارات، و FHIR مقابل قاعدة بيانات طبية مخصصة يغطي بناء مخططك الخاص بدلاً من ذلك.

كيف أقوم بتخزين ضغط الدم في FHIR؟

كملاحظة واحدة Observation مع رمز LOINC 85354-9 ومدخلين component: الانقباضي 8480-6 والانبساطي 8462-4، كل منهما مع قيمة valueQuantity في وحدات mm[Hg].

هل يمكنني تغيير مورد مُخزن؟

نعم، مع PUT و If-Match. كل تغيير ينشئ إصدارًا جديدًا؛ تظل الإصدارات السابقة قابلة للقراءة من خلال _history، وتسجل سجلات Provenance من قام بكل تغيير. عمليات الحذف ناعمة وتحافظ على التاريخ.

ذات الصلة

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