# كيفية دمج أنظمة العيادات مع الواجهة الخلفية لـ FHIR

> دليل تعليمي: ربط نظام السجل الطبي الإلكتروني (EMR) للعيادة بسجلات FHIR R4 للمرضى — دليل الأطباء، المطابقة برقم السجل، الزيارة كمعاملة واحدة مع الطبيب كمؤلف، تقارير المختبر، بيانات مقدمي الخدمة الآخرين، وخطافات الويب (webhooks).

Source: https://developers.anpheros.com/ar/guides/integrate-clinic-systems-fhir

**يربط هذا الدليل التعليمي برنامج العيادة (نظام سجل طبي إلكتروني EMR، نظام إدارة الممارسات، أو أداة حجز) بسجلات HL7 FHIR R4 للمرضى في Anpheros: يتم تسجيل العيادة وأطبائها في الدليل، ويتم مطابقة المرضى برقم سجل العيادة، وتُكتب الزيارة كمعاملة واحدة مع تسمية الطبيب كمؤلف، وتتعرف العيادة على البيانات التي يضيفها مقدمو الخدمة الآخرون.** يتم `curl` كل طلب مقابل البيئة التجريبية المجانية، والاستجابات هي استجابات المنصة الخاصة.

يعمل التكامل على خادم العيادة، مع مفتاح API للمشروع للمرضى الذين تسجلهم العيادة، وبالنسبة للأشخاص الذين لديهم بالفعل سجل Anpheros، يتم منحهم موافقة OAuth يوافقون عليها.

## ما يقابله ماذا

| في نظام العيادة | في FHIR R4 |
|---|---|
| العيادة، أقسامها | `Organization` |
| طبيب أو ممرضة | `Practitioner` |
| هذا الشخص الذي يعمل في تلك العيادة، مع تخصص | `PractitionerRole` |
| ملف المريض ورقمه | `Patient` مع `identifier` في نظام العيادة |
| زيارة | `Encounter` |
| العلامات الحيوية، النتائج المقاسة أثناء الزيارة | `Observation` مرتبطة بـ `Encounter` |
| تشخيص | `Condition` (ICD-10)، مع `verificationStatus` مؤقت أو مؤكد |
| وصفة طبية، علاج حالي | `MedicationStatement` (ATC) |
| خطاب، ملخص خروج، مسح ضوئي | `DocumentReference` مع الملف |
| نتائج المختبر | [موصل المختبر](https://developers.anpheros.com/guides/lab-connector)، إلى `Observation` |

## الخطوة 1: تسجيل العيادة وأطبائها

موارد الدليل لا تحتوي على مرضى. يمكن للمشاريع الأخرى في نفس البيئة قراءتها، لذا يرى مقدمو الخدمة الآخرون للمريض من كتب ماذا، ولكن مشروعك فقط هو من يمكنه تغييرها.

```bash
export BASE=https://platform.anpheros.com/fhir/R4
export KEY=sk_test_…
H=(-H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json")

curl -X POST $BASE/Organization "${H[@]}" -d '{"resourceType": "Organization", "active": true, "name": "Clinica Cardio Nord",
  "identifier": [{"system": "https://clinic.example/org", "value": "CCN"}]}'

curl -X POST $BASE/Practitioner "${H[@]}" -d '{"resourceType": "Practitioner", "active": true,
  "name": [{"family": "Popescu", "given": ["Ana"], "prefix": ["Dr."]}]}'

curl -X POST $BASE/PractitionerRole "${H[@]}" -d '{"resourceType": "PractitionerRole", "active": true,
  "practitioner": {"reference": "Practitioner/'$PRACTITIONER'"},
  "organization": {"reference": "Organization/'$ORG'"},
  "code": [{"text": "Cardiologist"}]}'
```

احتفظ بمعرفات (IDs) المُرجعة بجوار سجلات موظفيك. عندما يغادر شخص ما، قم بتعيين `PractitionerRole` الخاص به إلى `"active": false`؛ كتاباته السابقة تحتفظ باسمه، ولا يمكنه التصرف من خلال نظامك بعد الآن.

## الخطوة 2: مطابقة المرضى

بالنسبة للمرضى الذين تسجلهم العيادة، قم بإنشاء `Patient` باستخدام رقم سجل العيادة كمعرف:

```bash
curl -X POST $BASE/Patient "${H[@]}" -d '{"resourceType": "Patient",
  "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-20981"}],
  "name": [{"family": "Dinu", "given": ["Andrei"]}], "gender": "male", "birthDate": "1968-11-05"}'
```

منذ ذلك الحين، ابحث عن المريض بهذا الرقم، وليس بالاسم وتاريخ الميلاد أبدًا:

```bash
curl "$BASE/Patient?identifier=https://clinic.example/mrn|MRN-20981" -H "Authorization: Bearer $KEY"
```

**عندما يكون للشخص سجل Anpheros بالفعل**، من تطبيقه الخاص أو من مزود آخر، لا تنشئ العيادة سجلًا ثانيًا. تطلب العيادة من الشخص الوصول باستخدام OAuth، من جهاز لوحي في مكتب الاستقبال أو رابط تم إرساله قبل الزيارة، باستخدام تطبيق **سري** (يحتفظ خادم العيادة بالسر). يختار الشخص سجله ومدة وصول العيادة إليه. الخطوات موجودة في [كيفية تنفيذ موافقة المريض باستخدام SMART on FHIR](https://developers.anpheros.com/ar/guides/smart-on-fhir-backend)؛ حقل `patient` في الرمز المميز هو المعرف الذي يجب تخزينه مع ملفك.

## الخطوة 3: كتابة زيارة كمعاملة واحدة

تنتج الزيارة عدة موارد تنتمي معًا. أرسلها في `transaction` ليتم تخزينها دفعة واحدة أو لا على الإطلاق، وحدد من يعمل: `X-Anpheros-Acting-As` تسمي دور الطبيب. يصبح المؤلف في Provenance، ويكتب في سجل الوصول، ويظهر للمريض بالاسم.

```bash
curl -X POST $BASE "${H[@]}" \
  -H "X-Anpheros-Acting-As: PractitionerRole/$ROLE" \
  -H "X-Anpheros-Author-Type: practitioner" \
  -H "X-Anpheros-Source-System: ccn-emr" -d '{
  "resourceType": "Bundle", "type": "transaction",
  "entry": [
    {"fullUrl": "urn:uuid:aa000000-0000-4000-8000-000000000001",
     "resource": {"resourceType": "Encounter", "status": "finished",
       "class": {"system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", "code": "AMB", "display": "ambulatory"},
       "subject": {"reference": "Patient/'$PID'"},
       "serviceProvider": {"reference": "Organization/'$ORG'"},
       "participant": [{"individual": {"reference": "PractitionerRole/'$ROLE'"}}],
       "period": {"start": "2026-10-09T10:00:00Z", "end": "2026-10-09T10:30:00Z"}},
     "request": {"method": "POST", "url": "Encounter"}},
    {"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": "8867-4", "display": "Heart rate"}]},
       "subject": {"reference": "Patient/'$PID'"},
       "encounter": {"reference": "urn:uuid:aa000000-0000-4000-8000-000000000001"},
       "effectiveDateTime": "2026-10-09T10:10:00Z",
       "valueQuantity": {"value": 92, "unit": "/min", "system": "http://unitsofmeasure.org", "code": "/min"}},
     "request": {"method": "POST", "url": "Observation"}},
    {"resource": {"resourceType": "Condition",
       "subject": {"reference": "Patient/'$PID'"},
       "encounter": {"reference": "urn:uuid:aa000000-0000-4000-8000-000000000001"},
       "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "active"}]},
       "verificationStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", "code": "provisional"}]},
       "code": {"coding": [{"system": "http://hl7.org/fhir/sid/icd-10", "code": "I48.0", "display": "Paroxysmal atrial fibrillation"}]}},
     "request": {"method": "POST", "url": "Condition"}}
  ]}'
```

يحتوي `transaction-response` على `201 Created` لـ Encounter و Observation و Condition. يشير Observation و Condition الآن إلى `Encounter/0ca25459-…` الحقيقي. يحدد Provenance لكل منها دور الطبيب والعيادة ونظام المصدر:

```json
"agent": [{"who": {"reference": "PractitionerRole/e6d8c227-…",
                   "identifier": {"system": "https://anpheros.com/fhir/CodeSystem/author-type", "value": "practitioner"}},
           "onBehalfOf": {"reference": "Organization/c3a56a4b-…", "display": "Clinica Cardio Nord"}}],
"entity": [{"role": "source", "what": {"identifier": {"system": "ccn-emr"}}}]
```

التشخيص هو `provisional` حتى يتم تأكيده. قم بتحديثه إلى `confirmed` لاحقًا، ويحتفظ السجل بكليهما. ما يعنيه كل حقل موضح في [شرح Provenance للبيانات الطبية](https://developers.anpheros.com/ar/guides/medical-data-provenance).

## الخطوة 4: نتائج المختبر والمستندات

تنتقل النتائج من مختبر العيادة الخاص، أو التقارير التي يحضرها المريض، عبر موصل المختبر في طلب واحد لكل تقرير:

```bash
curl -X POST "https://platform.anpheros.com/v1/patients/$PID/labs/import" -H "Authorization: Bearer $KEY" \
     -H "Content-Type: x-application/hl7-v2+er7" -H "X-Anpheros-Source-System: ccn-lab" --data-binary @oru.hl7
```

الرسائل وملخصات الخروج هي مستندات: قم بإنشاء `DocumentReference` عبر `/v1/patients/{id}/documents` وقم بتحميل ملف PDF. لا يتم تعديل الملف الأصلي أبدًا، وتشير القيم المستخرجة منه إليه. انظر [كيفية استيراد نتائج المختبر إلى سجل FHIR](https://developers.anpheros.com/ar/guides/import-lab-results-fhir) و [واجهة برمجة تطبيقات البيانات الطبية](https://developers.anpheros.com/ar/guides/medical-data-api).

## الخطوة 5: قراءة ما كتبه مقدمو الخدمة الآخرون، والبقاء ضمن نطاقك

بموافقة المريض، تقرأ العيادة السجل بأكمله ضمن نطاقها، بما في ذلك ما أضافته العيادات الأخرى والمختبرات والمريض. يمكنها تغيير ما كتبته هي فقط. أي تحديث أو حذف لمورد لمنظمة أخرى سيؤدي إلى استجابة `403`، وسيظل الأصل كما كان. لتصحيح شيء كتبه مقدم خدمة آخر، اكتب موردك الخاص (على سبيل المثال، `Condition` جديد بتقييمك) ودع السجل يظهر كليهما، مع تحديد مؤلف كل منهما.

قبل الزيارة، تقدم `GET $BASE/Patient/$PID/$summary` الملخص الدولي للمريض للسجل: المشاكل، الأدوية، الحساسية، والعلامات الحيوية الحديثة، من كل مصدر.

## الخطوة 6: الاستماع إلى البيانات الجديدة

سجّل خطاف ويب مرة واحدة لمشروع العيادة:

```bash
curl -X POST https://platform.anpheros.com/v1/webhooks -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
     -d '{"url": "https://ccn.example/anpheros/hook", "events": ["resource.created", "resource.updated", "consent.revoked"]}'
```

عندما يكتب مشروع آخر في سجل يمكن لعيادتك الوصول إليه، يوضح الحدث ذلك باستخدام `data.external: true` والمصدر، حتى يتمكن نظام السجلات الطبية الإلكترونية (EMR) الخاص بك من عرض "نتائج جديدة من مختبر آخر" دون الحاجة إلى الاستقصاء. يعني حدث `consent.revoked` أن الشخص قد سحب وصول العيادة: توقف عن مزامنة هذا السجل. يتم تغطية التوقيعات وإعادة المحاولة والحمولات في [خطافات الويب](https://developers.anpheros.com/ar/guides/webhooks).

## ما يراه المريض

يرى المريض الزيارة، ومعدل ضربات القلب، والتشخيص المبدئي في سجله، وكلها معلمة على أنها أضيفت بواسطة د. آنا بوبيسكو في Clinica Cardio Nord. في اتصالاتهم، يسرد تطبيق العيادة كل وصول، بالاسم عندما كان ممارس صحي يتصرف. هذه الشفافية هي ما يجعل المرضى على استعداد لمنح الوصول إلى العيادة التالية.

## قائمة التحقق للانتقال إلى الإنتاج

- [ ] تم تسجيل المنظمة والممارسين وأدوار الممارسين؛ تم تعيين المغادرين على أنهم غير نشطين
- [ ] تم مطابقة المرضى بواسطة معرف العيادة، وليس بالاسم مطلقًا
- [ ] تم الوصول إلى السجلات الموجودة من خلال موافقة OAuth، ولم يتم تكرارها
- [ ] كل طلب من الموظفين السريريين يحمل `X-Anpheros-Acting-As`
- [ ] تمت كتابة الزيارات كمعاملات؛ تم كتابة التشخيصات بحالة التحقق الصحيحة
- [ ] تم تعيين نظام المصدر عند كل عملية كتابة؛ تم إرسال تقارير المختبر عبر الموصل
- [ ] نقطة نهاية Webhook تتحقق من التوقيعات؛ تم التعامل مع `consent.revoked`
- [ ] مشروع الإنتاج مع اتفاقية حماية البيانات (DPA) موقعة (مفاتيح `sk_live_…`)؛ انظر [التسعير](https://developers.anpheros.com/ar/guides/pricing)

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

### هل لدى Anpheros موصل جاهز لـ EMR الخاص بي؟
لا. لا توجد موصلات جاهزة لأنظمة EMR أو أنظمة المختبرات المحددة؛ يتم بناء التكامل مقابل واجهات برمجة تطبيقات FHIR R4 و REST، وعادة ما يكون كخدمة صغيرة بجوار EMR. يتم قبول رسائل مختبر HL7 v2 كما هي.

### هل يمكن للطبيب العمل في عيادتين؟
نعم. يمكن أن يكون لدى `Practitioner` `PractitionerRole` في كل منظمة. الدور المسمى في `X-Anpheros-Acting-As` يقرر أي عيادة يتم تسجيل كل كتابة لها.

### ماذا يحدث عندما يلغي المريض وصول العيادة؟
تستجيب استدعاءات العيادة لهذا السجل بـ `401`، ويتم إرسال خطاف استدعاء `consent.revoked`. ما كتبته العيادة يبقى في سجل المريض مع مصدره؛ العيادة ببساطة لم تعد قادرة على قراءته أو تغييره.

## ذات الصلة

- [تكاملات الرعاية الصحية](https://developers.anpheros.com/ar/guides/healthcare-integrations): جميع أنماط التكامل بنظرة عامة
- [شرح مصدر بيانات السجلات الطبية](https://developers.anpheros.com/ar/guides/medical-data-provenance)
- [كيفية تطبيق موافقة المريض باستخدام SMART on FHIR](https://developers.anpheros.com/ar/guides/smart-on-fhir-backend)
- [كيفية استيراد نتائج المختبر إلى سجل FHIR](https://developers.anpheros.com/ar/guides/import-lab-results-fhir)
- [قابلية التشغيل البيني لبيانات الرعاية الصحية](https://developers.anpheros.com/ar/guides/interoperability)
