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