📍 المقالة الرئيسية للمجموعة: الصحة الرقمية CEDEAO 2026.
FHIR (Fast Healthcare Interoperability Resources) هو معيار HL7 الذي فُرض في 2026 للتبادلات الصحية الرقمية. كل نظام صحي حديث يجب أن يكون FHIR-compliant. CEDEAO اعتمد FHIR R4 كمعيار للتبادلات عبر الحدود في 2025. هذا الدرس يفصل التكامل العملي بين OpenMRS وHAPI FHIR Server، تبادل البيانات بين منشأة طبية ومختبر وصيدلية، مع كود جاهز للنسخ.
المتطلبات
OpenMRS في الإنتاج (راجع درس النشر). معرفة REST APIs وJSON. المستوى المتوقع: متقدم. الوقت المقدر: 4 إلى 6 ساعات للتكامل الكامل + اختبارات.
الخطوة 1 — تفعيل OpenMRS FHIR Module
OpenMRS 3.x يأتي مع FHIR2 module مدمج. تحقق من تفعيله:
Admin → Manage Modules → ابحث «fhir2»
# Status: Started
# Version: 1.10+ (2026)
إذا غير مثبت: addons.openmrs.org/show/org.openmrs.module.fhir2. تنزيل OMOD، استيراد عبر Admin → Manage Modules → Add or Upgrade Module.
الخطوة 2 — اختبار FHIR endpoints
FHIR module يكشف الموارد على /openmrs/ws/fhir2/R4/. اختبار سريع:
# Patient resources
curl -u admin:Admin123 https://emr.votre-hopital.com/openmrs/ws/fhir2/R4/Patient
# Patient محدد بـ UUID
curl -u admin:Admin123 https://emr.votre-hopital.com/openmrs/ws/fhir2/R4/Patient/UUID-PATIENT
# Search by family name
curl -u admin:Admin123 "https://emr.votre-hopital.com/openmrs/ws/fhir2/R4/Patient?family=Diallo"
الاستجابة JSON FHIR R4. FHIR module يدعم: Patient، Practitioner، Location، Encounter، Observation، MedicationRequest، DiagnosticReport، AllergyIntolerance، Condition، ServiceRequest. أكثر من 30 مورد متاح.
الخطوة 3 — مصادقة OAuth2
HTTP Basic للاختبار، OAuth2 للإنتاج. تثبيت OpenMRS OAuth2 module:
# تكوين OAuth2 server
Admin → OAuth2 → Add Client
Client ID: lab_partner
Client Secret: secret-très-fort
Grant Types: authorization_code, refresh_token
Redirect URIs: https://lab.partenaire.com/oauth/callback
Scopes: patient/*.read, observation/*.read
المختبر الشريك يستخدم Client ID/Secret للحصول على access tokens، ثم يستفسر FHIR endpoints مع Bearer token.
الخطوة 4 — تثبيت HAPI FHIR Server (وسط)
HAPI FHIR Server هو وسيط يجمع البيانات من عدة مصادر (OpenMRS، LIMS مختبر، PACS imaging) ويعرضها كـ FHIR موحد. حاسم للتبادل البيني.
docker run -d -p 8080:8080 --name hapi-fhir \
-e spring.datasource.url=jdbc:postgresql://hapi-db:5432/hapi \
-e spring.datasource.username=hapi \
-e spring.datasource.password=hapipass \
hapiproject/hapi:latest
الواجهة على http://server:8080. اختبر إنشاء Patient عبر POST /Patient.
الخطوة 5 — تكامل OpenMRS → HAPI
OpenMRS يدفع التغييرات إلى HAPI عبر HTTP webhook. مديول OpenMRS Atom Feed يولد events لكل create/update.
# سكربت Python لتزامن OpenMRS → HAPI
import requests, time
def sync_patients():
# الحصول على Patient resources من OpenMRS
r = requests.get('https://emr.votre-hopital.com/openmrs/ws/fhir2/R4/Patient',
auth=('admin', 'Admin123'),
headers={'Accept': 'application/fhir+json'})
bundle = r.json()
for entry in bundle.get('entry', []):
patient = entry['resource']
# دفع نحو HAPI
requests.put(f'https://hapi.votre-hopital.com/Patient/{patient["id"]}',
json=patient,
headers={'Content-Type': 'application/fhir+json'})
time.sleep(0.1) # rate limit
while True:
sync_patients()
time.sleep(300) # كل 5 دقائق
الخطوة 6 — تكامل LIMS مختبر
المختبر الشريك يكشف الـ DiagnosticReport عبر FHIR. تكامل ثنائي الاتجاه:
# مستشفى → مختبر: ServiceRequest (طلب اختبار)
POST https://lab.partenaire.com/fhir/ServiceRequest
{
"resourceType": "ServiceRequest",
"status": "active",
"intent": "order",
"code": {"coding": [{"system": "http://loinc.org", "code": "718-7", "display": "Hemoglobin"}]},
"subject": {"reference": "Patient/UUID-DIALLO"},
"encounter": {"reference": "Encounter/UUID-ENCOUNTER"},
"requester": {"reference": "Practitioner/UUID-DR-DIOP"}
}
# مختبر → مستشفى: DiagnosticReport (نتيجة)
PUT https://emr.votre-hopital.com/openmrs/ws/fhir2/R4/DiagnosticReport/UUID
{
"resourceType": "DiagnosticReport",
"status": "final",
"code": {"coding": [{"system": "http://loinc.org", "code": "58410-2"}]},
"subject": {"reference": "Patient/UUID-DIALLO"},
"result": [{"reference": "Observation/UUID-HB-VALUE"}]
}
الخطوة 7 — تكامل صيدلية
الوصفة الإلكترونية عبر MedicationRequest. الطبيب يولد، الصيدلي يصرف. التتبع كامل.
POST https://pharmacy.partenaire.com/fhir/MedicationRequest
{
"resourceType": "MedicationRequest",
"status": "active",
"intent": "order",
"medicationCodeableConcept": {
"coding": [{"system": "http://snomed.info/sct", "code": "387207008", "display": "Paracetamol"}]
},
"subject": {"reference": "Patient/UUID-DIALLO"},
"dosageInstruction": [{
"text": "1 comprimé 3 fois par jour",
"timing": {"repeat": {"frequency": 3, "period": 1, "periodUnit": "d"}},
"doseAndRate": [{"doseQuantity": {"value": 500, "unit": "mg"}}]
}],
"dispenseRequest": {"quantity": {"value": 15, "unit": "tablet"}}
}
الخطوة 8 — التشفير والأمن
FHIR على HTTPS فقط (TLS 1.3). mTLS للتبادل بين منشآت موصى به: شهادة client + شهادة server يثبتان هويتهما المتبادلة.
# Caddy mTLS
emr.votre-hopital.com {
reverse_proxy localhost:8080
tls /etc/ssl/server.pem /etc/ssl/server-key.pem {
client_auth {
mode require_and_verify
trusted_ca_cert_file /etc/ssl/ca-bundle.pem
}
}
}
الخطوة 9 — Audit Trail FHIR
كل وصول إلى مورد FHIR يُسجَّل. AuditEvent resource:
{
"resourceType": "AuditEvent",
"type": {"system": "http://terminology.hl7.org/CodeSystem/audit-event-type", "code": "rest"},
"action": "R",
"recorded": "2026-04-27T14:30:00Z",
"outcome": "0",
"agent": [{
"who": {"reference": "Practitioner/UUID-DR-DIOP"},
"requestor": true,
"network": {"address": "192.168.1.50", "type": "2"}
}],
"entity": [{
"what": {"reference": "Patient/UUID-DIALLO"},
"type": {"system": "http://hl7.org/fhir/resource-types", "code": "Patient"}
}]
}
الأخطاء الشائعة
| الخطأ | السبب | الحل |
|---|---|---|
| FHIR endpoints 404 | FHIR module غير مفعَّل | Admin → Modules → Start fhir2 |
| JSON invalid | schema FHIR R4 صارم | تحقق بـ HAPI Validator |
| OAuth2 token expired | 1h لكل token | refresh tokens |
| Sync بطيء | polling 5min | Atom Feed events realtime |
| mTLS handshake fail | CA chain غير صحيح | تحقق ssl_trace |
| Patient duplicates | لا identifier موحد | NIN كـ MasterID |
التكيف مع السياق
ثلاث توضيحات. NIN كـ MasterID. رقم الهوية الوطني يجب أن يكون identifier أساسي للمريض. تجنب duplicates عند التبادل بين منشآت. الترميزات المحلية. CIM-10 standard + ICPC-2 + ترميزات وطنية. ضمنّ في FHIR Coding مع system URL محدد. اتصال متقطع. المستشفيات الريفية في الساحل تفقد internet ساعات. وضع store-and-forward: store events محلياً، forward عند العودة.
دروس الإخوة
الأسئلة المتكررة
FHIR vs HL7v2؟ HL7v2 قديم (segments نصية)، FHIR R4 = REST + JSON حديث. كل النظم الجديدة FHIR.
HAPI FHIR enterprise؟ Open source، production-ready. Smile CDR (commercial، 50,000+ USD/سنة) لـ enterprise مع دعم.
الترميزات SNOMED CT vs ICD-10؟ SNOMED CT أكثر دقة (350,000+ concepts) لكنه يتطلب رخصة (مجاني للسنغال/كوت ديفوار/المغرب). ICD-10 = WHO، مجاني.
التبادل عبر الحدود CEDEAO؟ CEDEAO Health Data Sharing Framework يعتمد FHIR R4. مشاريع pilot 2025-2027.
للاستزادة
- 🔝 المرجع: الصحة الرقمية CEDEAO
- FHIR docs: hl7.org/fhir
- HAPI FHIR: hapifhir.io