ITSkillsCenter
الأمن السيبراني

FHIR والتشغيل البيني الصحي: درس عملي 2026

4 min de lecture

📍 المقالة الرئيسية للمجموعة: الصحة الرقمية 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.

للاستزادة

Besoin d'un site web ?

Confiez-nous la Création de Votre Site Web

Site vitrine, e-commerce ou application web — nous transformons votre vision en réalité digitale. Accompagnement personnalisé de A à Z.

À partir de 250.000 FCFA
Parlons de Votre Projet
Publicité