AnpherosAnpheros PlatformDevelopers

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

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

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

يربط هذا الدليل التعليمي برنامج العيادة (نظام سجل طبي إلكتروني 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 مع الملف
نتائج المختبر موصل المختبر، إلى Observation

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

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

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 باستخدام رقم سجل العيادة كمعرف:

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"}'

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

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

عندما يكون للشخص سجل Anpheros بالفعل، من تطبيقه الخاص أو من مزود آخر، لا تنشئ العيادة سجلًا ثانيًا. تطلب العيادة من الشخص الوصول باستخدام OAuth، من جهاز لوحي في مكتب الاستقبال أو رابط تم إرساله قبل الزيارة، باستخدام تطبيق سري (يحتفظ خادم العيادة بالسر). يختار الشخص سجله ومدة وصول العيادة إليه. الخطوات موجودة في كيفية تنفيذ موافقة المريض باستخدام SMART on FHIR؛ حقل patient في الرمز المميز هو المعرف الذي يجب تخزينه مع ملفك.

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

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

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 لكل منها دور الطبيب والعيادة ونظام المصدر:

"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 للبيانات الطبية.

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

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

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 و واجهة برمجة تطبيقات البيانات الطبية.

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

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

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

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

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

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 أن الشخص قد سحب وصول العيادة: توقف عن مزامنة هذا السجل. يتم تغطية التوقيعات وإعادة المحاولة والحمولات في خطافات الويب.

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

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

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

أسئلة متكررة

هل لدى Anpheros موصل جاهز لـ EMR الخاص بي؟

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

هل يمكن للطبيب العمل في عيادتين؟

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

ماذا يحدث عندما يلغي المريض وصول العيادة؟

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

ذات الصلة

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