Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Як інтегрувати клінічні системи з FHIR бекендом
Посібник: підключіть клінічну EMR до FHIR R4 записів пацієнтів — каталог лікарів, зіставлення за номером запису, візит як одна транзакція з лікарем як автором, лабораторні звіти, дані інших постачальників та вебхуки.
Цей посібник підключає програмне забезпечення клініки (ЕМР, систему управління практикою або інструмент бронювання) до записів пацієнтів 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"}]}'
Зберігайте повернуті ідентифікатори поруч із записами вашого персоналу. Коли хтось звільняється, встановіть його 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 токена є id для зберігання у вашому файлі.
Крок 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 пізніше, і історія збереже обидва. Що означає кожне поле, пояснюється в Пояснення походження медичних даних.
Крок 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 та API медичних даних.
Крок 5: читайте, що написали інші провайдери, і дотримуйтесь своєї компетенції
За згодою пацієнта клініка читає весь запис у межах своїх областей, включаючи те, що додали інші клініки, лабораторії та сам пацієнт. Вона може змінювати лише те, що написала сама. Оновлення або видалення ресурсу іншої організації призведе до відповіді 403, а оригінал залишиться незмінним. Щоб виправити щось, написане іншим провайдером, створіть власний ресурс (наприклад, новий Condition з вашою оцінкою) і дозвольте запису відображати обидва, кожен зі своїм автором.
Перед візитом GET $BASE/Patient/$PID/$summary надає Міжнародний резюме пацієнта (International Patient Summary) запису: проблеми, ліки, алергії та останні життєві показники з кожного джерела.
Крок 6: дізнатися про нові дані
Зареєструйте webhook один раз для проєкту клініки:
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 означає, що особа відкликала доступ клініки: припиніть синхронізацію цього запису. Підписи, повторні спроби та корисне навантаження розглядаються в розділі Webhooks.
Що бачить пацієнт
Пацієнт бачить візит, пульс та попередній діагноз у своєму записі, кожен з яких позначений як доданий доктором Аною Попеску з клініки Cardio Nord. У своїх підключеннях додаток клініки перелічує кожен доступ, із зазначенням імені, коли діяв практикуючий лікар. Саме така прозорість спонукає пацієнтів надавати доступ наступній клініці.
Чекліст для запуску в експлуатацію
- [ ] Організації, Практики та Ролі Практиків зареєстровані; особи, що пішли, встановлені як неактивні
- [ ] Пацієнти зіставляються за ідентифікатором клініки, ніколи за іменем
- [ ] Існуючі записи досягаються через згоду OAuth, не дублюються
- [ ] Кожен запит від клінічного персоналу містить
X-Anpheros-Acting-As - [ ] Візити записуються як транзакції; діагнози з правильним статусом верифікації
- [ ] Системне джерело встановлено при кожному записі; лабораторні звіти через конектор
- [ ] Кінцева точка Webhook перевіряє підписи;
consent.revokedоброблено - [ ] Проект для продакшену з підписаним DPA (ключі
sk_live_…); див. Ціни
Часті запитання
Чи має Anpheros готовий конектор для моєї EMR?
Ні. Готових конекторів до конкретних EMR або лабораторних систем немає; інтеграція будується на основі FHIR R4 та REST API, зазвичай як невеликий сервіс поруч з EMR. Лабораторні повідомлення HL7 v2 приймаються як є.
Чи може лікар працювати у двох клініках?
Так. Один Practitioner може мати PractitionerRole у кожній організації. Роль, зазначена в X-Anpheros-Acting-As, визначає, для якої клініки записується кожен запис.
Що відбувається, коли пацієнт відкликає доступ клініки?
Запити клініки до цього запису повертають 401, і надсилається webhook consent.revoked. Те, що клініка записала, залишається в записі пацієнта з його походженням; клініка просто більше не може його читати чи змінювати.
Пов'язане
- Інтеграції в галузі охорони здоров'я: усі шаблони інтеграції з першого погляду
- Пояснення походження медичних даних
- Як реалізувати згоду пацієнта за допомогою SMART on FHIR
- Як імпортувати результати лабораторних досліджень до запису FHIR
- Сумісність медичних даних
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card