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

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

Source: https://developers.anpheros.com/ar/guides/store-medical-records-fhir

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

إذا كنت جديداً على FHIR، اقرأ [منصة FHIR](https://developers.anpheros.com/ar/guides/fhir) أولاً للمفاهيم. هذه الصفحة هي الجزء العملي.

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

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

الأدوية (`MedicationStatement`)، الحساسية (`AllergyIntolerance`)، التطعيمات والمستندات تتبع نفس النمط؛ [26 نوع مورد مدعوم](https://developers.anpheros.com/ar/guides/fhir) مدرجة في بيان القدرات في `/fhir/R4/metadata`.

## قبل البدء

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

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

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

```bash
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`، مع المعرف والإصدار الذي خصصه الخادم:

```json
{"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` هو معرف المنصة، وهو خاص بمشروعك: يرى مشروع آخر نفس الشخص بمعرف مختلف.

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

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

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

```bash
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"`. ثلاثة تفاصيل مهمة لسجل قابل للاستخدام:

- **الرموز، وليس التسميات.** `85354-9` تعني "لوحة ضغط الدم" في كل نظام FHIR؛ "BP" كنص حر لا يعني ذلك. ابحث عن الرموز باستخدام `GET /v1/terminology/loinc?q=blood pressure` ([أنظمة رموز FHIR](https://developers.anpheros.com/ar/guides/fhir-code-systems)).
- **وحدات UCUM** (`mm[Hg]`، `kg`، `mg/dL`) في `valueQuantity.code`، بحيث يمكن مقارنة القيم وتحويلها.
- **`Idempotency-Key`.** إعادة المحاولة بعد انتهاء المهلة تعيد الاستجابة الأولى بدلاً من تخزين القراءة مرتين.

نتائج المختبر هي نفس المورد مع `category` `laboratory` وعادةً `referenceRange`. لجلب تقارير المختبر الكاملة، انظر [كيفية استيراد نتائج المختبر إلى سجل FHIR](https://developers.anpheros.com/ar/guides/import-lab-results-fhir).

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

```bash
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 مؤقتة يستبدلها الخادم:

```bash
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: البحث

```bash
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` مع الإصدار الذي قرأته لتجنب الكتابة فوق تغيير شخص آخر:

```bash
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` وتقوم بالقراءة مرة أخرى. الإصدار الأقدم لا يزال موجودًا:

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

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

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

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

```bash
curl "$BASE/Provenance?target=Observation/$OBS" -H "Authorization: Bearer $KEY"
```

```json
{"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: السجل كملخص

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

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

## تفضل JSON بدون FHIR؟

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

## أسئلة متكررة

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

### هل أحتاج إلى خادم FHIR لاستخدام FHIR؟
تحتاج إلى مكان يقوم بتخزين موارد FHIR والبحث فيها، ويفرض من يمكنه قراءتها. يمكنك تشغيل خادم FHIR مفتوح المصدر بنفسك أو استخدام خادم مُدار مثل Anpheros؛ [كيف تقارن Anpheros بخوادم FHIR الأخرى](https://developers.anpheros.com/ar/guides/fhir-server-comparison) يزن الخيارات، و [FHIR مقابل قاعدة بيانات طبية مخصصة](https://developers.anpheros.com/ar/guides/fhir-vs-custom-database) يغطي بناء مخططك الخاص بدلاً من ذلك.

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

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

## ذات الصلة

- [منصة FHIR](https://developers.anpheros.com/ar/guides/fhir): المفاهيم، أنواع الموارد، والعمليات
- [أنظمة ترميز FHIR](https://developers.anpheros.com/ar/guides/fhir-code-systems): LOINC، ICD-10، ATC، UCUM
- [كيفية استيراد نتائج المختبر إلى سجل FHIR](https://developers.anpheros.com/ar/guides/import-lab-results-fhir)
- [واجهة برمجة تطبيقات البيانات الطبية](https://developers.anpheros.com/ar/guides/medical-data-api): عرض REST الأبسط لنفس البيانات
- [قاعدة بيانات FHIR مجانية وبيئة اختبار](https://developers.anpheros.com/ar/guides/free-fhir-database)
