AnpherosAnpheros PlatformDevelopers

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. В своих подключениях приложение клиники перечисляет каждый доступ по имени, когда действовал практикующий врач. Такая прозрачность побуждает пациентов предоставлять доступ следующей клинике.

Чек-лист для запуска в эксплуатацию

Часто задаваемые вопросы

Есть ли у Anpheros готовый коннектор для моей ЭМС?

Нет. Готовых коннекторов к конкретным ЭМС или лабораторным системам нет; интеграция строится на основе FHIR R4 и REST API, обычно в виде небольшого сервиса рядом с ЭМС. Сообщения 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