Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Cum se integrează sistemele clinice cu un backend FHIR
Tutorial: conectați un EMR de clinică la dosarele FHIR R4 ale pacienților — director de medici, potrivire după numărul dosarului, o vizită ca o singură tranzacție cu medicul ca autor, rapoarte de laborator, date de la alți furnizori și webhooks.
Acest tutorial conectează software-ul unei clinici (un EMR, un sistem de management al practicii sau un instrument de rezervare) la înregistrările HL7 FHIR R4 ale pacienților din Anpheros: clinica și medicii săi sunt înregistrați în director, pacienții sunt potriviți după numărul de înregistrare al clinicii, o vizită este înregistrată ca o singură tranzacție cu medicul numit ca autor, iar clinica află despre datele pe care le adaugă alți furnizori. Fiecare cerere este curl împotriva sandbox-ului gratuit, iar răspunsurile sunt ale platformei.
Integrarea rulează pe serverul clinicii, cu o cheie API de proiect pentru pacienții pe care clinica îi înregistrează și, pentru persoanele care au deja o înregistrare Anpheros, o autorizație OAuth pe care o aprobă.
Ce se mapează la ce
| În sistemul clinicii | În FHIR R4 |
|---|---|
| clinica, departamentele sale | Organization |
| un medic sau asistent medical | Practitioner |
| acea persoană care lucrează la acea clinică, cu o specialitate | PractitionerRole |
| fișa pacientului și numărul acesteia | Patient cu un identifier în sistemul clinicii |
| o vizită | Encounter |
| semne vitale, rezultate măsurate în timpul vizitei | Observation legate de Encounter |
| un diagnostic | Condition (ICD-10), cu verificationStatus provizoriu sau confirmat |
| o prescripție, tratament curent | MedicationStatement (ATC) |
| o scrisoare, un sumar de externare, o scanare | DocumentReference cu fișierul |
| rezultate de laborator | conectorul de laborator, în Observation |
Pasul 1: înregistrați clinica și medicii săi
Resursele de tip Director nu au pacienți. Alte proiecte din același mediu le pot citi, astfel încât alți furnizori ai unui pacient să vadă cine a scris ce, dar numai proiectul dumneavoastră le poate modifica.
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"}]}'
Păstrați ID-urile returnate lângă înregistrările personalului dumneavoastră. Când cineva pleacă, setați PractitionerRole la "active": false; scrierile lor anterioare își păstrează numele, iar ei nu mai pot acționa prin sistemul dumneavoastră.
Pasul 2: potrivirea pacienților
Pentru pacienții pe care clinica îi înregistrează, creați Patient cu numărul de înregistrare al clinicii ca identificator:
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"}'
De atunci, găsiți pacientul după acel număr, niciodată după nume și data nașterii:
curl "$BASE/Patient?identifier=https://clinic.example/mrn|MRN-20981" -H "Authorization: Bearer $KEY"
Când persoana are deja o înregistrare Anpheros, din propria aplicație sau de la un alt furnizor, clinica nu creează o a doua. Aceasta solicită persoanei acces cu OAuth, de pe o tabletă la recepție sau printr-un link trimis înainte de vizită, folosind o aplicație confidențială (serverul clinicii păstrează secretul). Persoana își alege înregistrarea și cât timp clinica poate accesa aceasta. Pașii sunt detaliați în Cum se implementează consimțământul pacientului cu SMART on FHIR; câmpul patient al token-ului este id-ul de stocat cu fișierul dumneavoastră.
Pasul 3: scrieți o vizită ca o singură tranzacție
O vizită produce mai multe resurse care aparțin împreună. Trimiteți-le într-o transaction pentru ca acestea să fie stocate toate odată sau deloc, și specificați cine lucrează: X-Anpheros-Acting-As numește rolul medicului. Acesta devine autorul în Provenance, este scris în logul de acces și este afișat pacientului pe nume.
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 are 201 Created pentru Encounter, Observation și Condition. Observation și Condition indică acum Encounter/0ca25459-… real. Provenance-ul fiecăruia numește rolul medicului, clinica și sistemul sursă:
"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"}}}]
Diagnosticul este provisional până când este confirmat. Actualizați-l la confirmed mai târziu, iar istoricul păstrează ambele. Ce înseamnă fiecare câmp este explicat în Medical data provenance explained.
Pasul 4: Rezultate de laborator și documente
Rezultatele de la laboratorul propriu al clinicii sau rapoartele aduse de pacient trec prin conectorul de laborator într-o singură cerere per 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
Scrisorile și rezumatele de externare sunt documente: creați un DocumentReference prin /v1/patients/{id}/documents și încărcați PDF-ul. Fișierul original nu este niciodată modificat, iar valorile extrase din acesta indică înapoi către el. Consultați Cum se importă rezultatele de laborator într-un fișier FHIR și API-ul de date medicale.
Pasul 5: citiți ce au scris alți furnizori și respectați-vă aria de competență
Cu consimțământul pacientului, clinica citește întregul dosar în limitele domeniilor sale de aplicare, inclusiv ceea ce au adăugat alte clinici, laboratoare și pacientul. Poate modifica doar ceea ce a scris ea însăși. O actualizare sau ștergere a unui resursă al altei organizații va returna 403, iar originalul va rămâne așa cum a fost. Pentru a corecta ceva scris de un alt furnizor, scrieți propria resursă (de exemplu, un nou Condition cu evaluarea dumneavoastră) și lăsați dosarul să arate ambele, fiecare cu autorul său.
Înainte de o vizită, GET $BASE/Patient/$PID/$summary oferă rezumatul internațional al pacientului din dosar: probleme, medicamente, alergii și semne vitale recente, din fiecare sursă.
Pasul 6: Aflați despre date noi
Înregistrați un webhook o singură dată pentru proiectul clinicii:
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"]}'
Când un alt proiect scrie într-o înregistrare la care clinica dvs. are acces, evenimentul indică acest lucru cu data.external: true și sursa, astfel încât EMR-ul dvs. să poată afișa „rezultate noi de la un alt laborator” fără a interoga. Un eveniment consent.revoked înseamnă că persoana a retras accesul clinicii: opriți sincronizarea acelei înregistrări. Semnăturile, reîncercările și sarcinile utile sunt acoperite în Webhooks.
Ce vede pacientul
Pacientul vede vizita, ritmul cardiac și diagnosticul provizoriu în fișa sa, fiecare marcat ca fiind adăugat de Dr. Ana Popescu de la Clinica Cardio Nord. În conexiunile sale, aplicația clinicii listează fiecare acces, după nume atunci când un practician a acționat. Această transparență este ceea ce îi face pe pacienți dispuși să acorde acces următoarei clinici.
Listă de verificare pentru lansarea în producție
- [ ] Organizații, Practicieni și Roluri Practician înregistrate; persoanele care părăsesc organizația setate ca inactive
- [ ] Pacienți identificați prin identificatorul clinicii, niciodată prin nume
- [ ] Înregistrări existente accesate prin consimțământ OAuth, fără duplicări
- [ ] Fiecare cerere de la personalul clinic conține
X-Anpheros-Acting-As - [ ] Vizite înregistrate ca tranzacții; diagnostice cu statutul corect de verificare
- [ ] Sistemul sursă setat la fiecare scriere; rapoarte de laborator prin conector
- [ ] Endpoint webhook care verifică semnăturile;
consent.revokedgestionat - [ ] Proiect de producție cu un DPA semnat (chei
sk_live_…); vezi Prețuri
Întrebări frecvente
Are Anpheros un conector gata făcut pentru EMR-ul meu?
Nu. Nu există conectori gata făcuți pentru EMR-uri sau sisteme de laborator specifice; integrarea se construiește pe baza API-urilor FHIR R4 și REST, de obicei ca un mic serviciu lângă EMR. Mesajele de laborator HL7 v2 sunt acceptate așa cum sunt.
Poate un medic să lucreze pentru două clinici?
Da. Un Practitioner poate avea un PractitionerRole la fiecare organizație. Rolul menționat în X-Anpheros-Acting-As decide pentru ce clinică este înregistrat fiecare scriere.
Ce se întâmplă când pacientul revocă accesul clinicii?
Apelurile clinicii pentru acea înregistrare răspund cu 401, iar un webhook consent.revoked este trimis. Ceea ce a scris clinica rămâne în dosarul pacientului cu proveniența sa; clinica pur și simplu nu mai poate citi sau modifica.
Conexe
- Integrații în domeniul sănătății: toate modelele de integrare dintr-o privire
- Proveniența datelor medicale explicată
- Cum să implementați consimțământul pacientului cu SMART on FHIR
- Cum să importați rezultatele de laborator într-un fișier FHIR
- Interoperabilitatea datelor din domeniul sănătății
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card