Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Jak zintegrować systemy przychodni z backendem FHIR
Samouczek: połącz EMR przychodni z repozytoriami FHIR R4 pacjentów — katalog lekarzy, dopasowanie numerem rekordu, wizyta jako jedna transakcja z lekarzem jako autorem, wyniki laboratoryjne, dane od innych dostawców i webhooks.
Ten samouczek łączy oprogramowanie kliniki (system EMR, system zarządzania praktyką lub narzędzie do rezerwacji) z rekordami HL7 FHIR R4 pacjentów w Anpheros: klinika i jej lekarze są zarejestrowani w katalogu, pacjenci są dopasowywani według numeru rekordu kliniki, wizyta jest zapisywana jako jedna transakcja z lekarzem wskazanym jako autor, a klinika dowiaduje się o danych dodawanych przez innych dostawców. Każde zapytanie jest curl kierowane do darmowego środowiska sandbox, a odpowiedzi pochodzą z platformy.
Integracja działa na serwerze kliniki, z kluczem API projektu dla pacjentów, których klinika rejestruje, oraz, dla osób posiadających już rekord Anpheros, z udzielonym przez nich upoważnieniem OAuth.
Co się do czego mapuje
| W systemie kliniki | W FHIR R4 |
|---|---|
| klinika, jej oddziały | Organization |
| lekarz lub pielęgniarka | Practitioner |
| ta osoba pracująca w tej klinice, ze specjalizacją | PractitionerRole |
| karta pacjenta i jej numer | Patient z identifier w systemie kliniki |
| wizyta | Encounter |
| parametry życiowe, wyniki zmierzone podczas wizyty | Observation powiązane z Encounter |
| diagnoza | Condition (ICD-10), z verificationStatus tymczasowa lub potwierdzona |
| recepta, bieżące leczenie | MedicationStatement (ATC) |
| list, karta wypisu, skan | DocumentReference z plikiem |
| wyniki laboratoryjne | łącznik laboratoryjny, do Observation |
Krok 1: rejestracja kliniki i jej lekarzy
Zasoby katalogowe nie zawierają pacjentów. Inne projekty w tym samym środowisku mogą je odczytywać, dzięki czemu inni świadczeniodawcy pacjenta widzą, kto co napisał, ale tylko Twój projekt może je modyfikować.
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"}]}'
Zachowaj zwrócone identyfikatory obok rekordów personelu. Gdy ktoś odchodzi, ustaw jego PractitionerRole na "active": false; jego wcześniejsze wpisy zachowują jego imię, a on nie może już działać za pośrednictwem Twojego systemu.
Krok 2: dopasowanie pacjentów
Dla pacjentów rejestrowanych przez klinikę, utwórz Patient z numerem rekordu kliniki jako identyfikatorem:
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"}'
Od tego momentu wyszukuj pacjenta według tego numeru, nigdy według imienia i daty urodzenia:
curl "$BASE/Patient?identifier=https://clinic.example/mrn|MRN-20981" -H "Authorization: Bearer $KEY"
Gdy osoba posiada już rekord w Anpheros, ze swojej własnej aplikacji lub od innego dostawcy, klinika nie tworzy drugiego rekordu. Prosi osobę o dostęp za pomocą OAuth, z tabletu przy recepcji lub linku wysłanego przed wizytą, używając poufnej aplikacji (serwer kliniki przechowuje sekret). Osoba wybiera swój rekord i czas, przez jaki klinika może mieć do niego dostęp. Kroki opisano w Jak zaimplementować zgodę pacjenta z SMART on FHIR; pole patient tokenu to identyfikator do przechowywania w pliku.
Krok 3: zapis wizyty jako jedna transakcja
Wizyta generuje kilka zasobów, które do siebie należą. Wyślij je w ramach transaction, aby zostały zapisane od razu lub wcale, i określ, kto pracuje: X-Anpheros-Acting-As określa rolę lekarza. Staje się ona autorem w Provenance, jest zapisywana w logu dostępu i jest wyświetlana pacjentowi pod nazwiskiem.
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 zawiera 201 Created dla Encounter, Observation i Condition. Observation i Condition wskazują teraz na rzeczywiste Encounter/0ca25459-…. Provenance każdego z nich określa rolę lekarza, klinikę i system źródłowy:
"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"}}}]
Diagnoza jest provisional do momentu jej potwierdzenia. Zaktualizuj ją do confirmed później, a historia zachowa obie wersje. Znaczenie każdego pola jest wyjaśnione w Wyjaśnienie pochodzenia danych medycznych.
Krok 4: Wyniki laboratoryjne i dokumenty
Wyniki z własnego laboratorium kliniki lub przyniesione przez pacjenta raporty przechodzą przez konektor laboratorium w jednym żądaniu na raport:
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
Listy i podsumowania wypisu to dokumenty: utwórz DocumentReference poprzez /v1/patients/{id}/documents i prześlij plik PDF. Oryginalny plik nigdy nie jest modyfikowany, a wyodrębnione z niego wartości wskazują na niego. Zobacz Jak zaimportować wyniki laboratoryjne do rekordu FHIR i API danych medycznych.
Krok 5: odczytaj, co napisali inni dostawcy, i trzymaj się swojej roli
Za zgodą pacjenta klinika odczytuje cały rekord w ramach swoich zakresów, w tym to, co dodały inne kliniki, laboratoria i sam pacjent. Może zmieniać tylko to, co sama napisała. Aktualizacja lub usunięcie zasobu innej organizacji skutkuje odpowiedzią 403, a oryginał pozostaje niezmieniony. Aby poprawić coś, co napisał inny dostawca, napisz własny zasób (na przykład nowy Condition ze swoją oceną) i pozwól, aby rekord zawierał oba, każdy ze swoim autorem.
Przed wizytą GET $BASE/Patient/$PID/$summary udostępnia Międzynarodowe Podsumowanie Pacjenta (International Patient Summary) dotyczące problemów, leków, alergii i ostatnich parametrów życiowych, pochodzących ze wszystkich źródeł.
Krok 6: Informacje o nowych danych
Zarejestruj webhook raz dla projektu kliniki:
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"]}'
Gdy inny projekt zapisze dane do rekordu, do którego Twoja klinika ma dostęp, zdarzenie poinformuje o tym za pomocą data.external: true oraz źródła, dzięki czemu Twoje EMR może wyświetlić komunikat "nowe wyniki z innego laboratorium" bez konieczności ciągłego odpytywania. Zdarzenie consent.revoked oznacza, że osoba wycofała dostęp kliniki: przestań synchronizować ten rekord. Podpisy, ponawianie prób i ładunki (payloads) są omówione w sekcji Webhooks.
Co widzi pacjent
Pacjent widzi wizytę, tętno i wstępną diagnozę w swojej karcie, każdą oznaczoną jako dodaną przez Dr. Ana Popescu z Clinica Cardio Nord. W swoich połączeniach aplikacja kliniki wymienia każdy dostęp, podając nazwisko, gdy działał lekarz. Ta przejrzystość sprawia, że pacjenci chętnie udzielają dostępu kolejnej klinice.
Lista kontrolna przed uruchomieniem
- [ ] Zarejestrowano organizacje, praktyków i role praktyków; osoby odchodzące ustawione jako nieaktywne
- [ ] Pacjenci dopasowywani za pomocą identyfikatora kliniki, nigdy po nazwisku
- [ ] Istniejące rekordy dostępne poprzez zgodę OAuth, bez duplikowania
- [ ] Każde żądanie od personelu klinicznego zawiera
X-Anpheros-Acting-As - [ ] Wizyty zapisywane jako transakcje; diagnozy z odpowiednim statusem weryfikacji
- [ ] System źródłowy ustawiony przy każdym zapisie; raporty laboratoryjne przez konektor
- [ ] Punkt końcowy webhook weryfikujący podpisy; obsługa
consent.revoked - [ ] Projekt produkcyjny z podpisaną umową DPA (klucze
sk_live_…); zobacz Cennik
Najczęściej zadawane pytania
Czy Anpheros posiada gotowy konektor do mojego systemu EMR?
Nie. Nie ma gotowych konektorów do konkretnych systemów EMR ani laboratoryjnych; integracja jest budowana w oparciu o FHIR R4 i API REST, zazwyczaj jako mała usługa obok systemu EMR. Wiadomości laboratoryjne HL7 v2 są akceptowane w obecnej formie.
Czy lekarz może pracować dla dwóch przychodni?
Tak. Jeden Practitioner może mieć PractitionerRole w każdej organizacji. Rola określona w X-Anpheros-Acting-As decyduje, dla której przychodni jest rejestrowany każdy wpis.
Co się dzieje, gdy pacjent odwoła dostęp przychodni?
Wywołania przychodni dla tego rekordu zwracają 401, a wysyłany jest webhook consent.revoked. To, co przychodnia zapisała, pozostaje w rekordzie pacjenta wraz z jego pochodzeniem; przychodnia po prostu nie może już go odczytać ani zmienić.
Powiązane
- Integracje w opiece zdrowotnej: wszystkie wzorce integracji w skrócie
- Wyjaśnienie pochodzenia danych medycznych
- Jak zaimplementować zgodę pacjenta za pomocą SMART on FHIR
- Jak zaimportować wyniki laboratoryjne do rekordu FHIR
- Interoperacyjność danych w opiece zdrowotnej
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card