# Jak przechowywać dokumentację medyczną przy użyciu FHIR R4

> Samouczek: utwórz Pacjenta, Obserwację ciśnienia krwi i Stan, użyj transakcji, wyszukaj, zaktualizuj z historią i odczytaj proweniencję — każde żądanie z curl i rzeczywistą odpowiedzią, w darmowym piaskownicy.

Source: https://developers.anpheros.com/pl/guides/store-medical-records-fhir

Ten samouczek przechowuje niewielką dokumentację medyczną jako zasoby HL7 FHIR R4: `Patient`, `Observation` ciśnienia krwi i diagnozę jako `Condition`, a następnie pacjenta i pomiar razem w jednej transakcji. Wyszukuje je, aktualizuje diagnozę bez utraty wcześniejszej wersji i odczytuje, kto co napisał. Każde żądanie to zwykły `curl` do darmowej piaskownicy Anpheros, a każda pokazana odpowiedź to to, co zwraca API.

Jeśli dopiero zaczynasz z FHIR, najpierw przeczytaj [Platforma FHIR](https://developers.anpheros.com/pl/guides/fhir) aby zapoznać się z koncepcjami. Ta strona to część praktyczna.

## Trzy zasoby, od których zaczyna się większość rekordów

| Zasób | Co zawiera | Kodowane za pomocą |
|---|---|---|
| `Patient` | kim jest osoba, której dotyczy rekord: imię, data urodzenia, płeć, identyfikatory z innych systemów | Twoje systemy identyfikatorów |
| `Observation` | wszystko, co zostało zmierzone lub zgłoszone: parametry życiowe, wyniki badań laboratoryjnych, waga, wynik oceny objawów | LOINC, jednostki UCUM |
| `Condition` | diagnoza lub problem zdrowotny, wraz z jego statusem w czasie | ICD-10 (SNOMED CT za flagą licencyjną) |

Leki (`MedicationStatement`), alergie (`AllergyIntolerance`), szczepienia i dokumenty podążają za tym samym wzorcem; [26 obsługiwanych typów zasobów](https://developers.anpheros.com/pl/guides/fhir) znajduje się w oświadczeniu o możliwościach (capability statement) pod adresem `/fhir/R4/metadata`.

## Zanim zaczniesz

Uzyskaj klucz sandbox (`sk_test_…`) na stronie [platform.anpheros.com/dashboard](https://platform.anpheros.com/dashboard/) za pomocą opcji **Get a sandbox key**. Nic, co tam utworzysz, nie jest rzeczywistymi danymi pacjentów i nic nie jest widoczne dla innych projektów.

```bash
export BASE=https://platform.anpheros.com/fhir/R4
export KEY=sk_test_…
```

## Krok 1: Utwórz pacjenta

```bash
curl -X POST "$BASE/Patient" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" -d '{
  "resourceType": "Patient",
  "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-10442"}],
  "name": [{"family": "Marin", "given": ["Ioana"]}],
  "gender": "female",
  "birthDate": "1979-04-12"
}'
```

`201 Created`, z identyfikatorem i wersją przypisanymi przez serwer:

```json
{"resourceType": "Patient",
 "identifier": [{"system": "https://clinic.example/mrn", "value": "MRN-10442"}],
 "name": [{"family": "Marin", "given": ["Ioana"]}], "gender": "female", "birthDate": "1979-04-12",
 "id": "d09e3942-ed86-4458-b099-fa674ab21b84",
 "meta": {"versionId": "1", "lastUpdated": "2026-10-12T20:16:51.043Z"}}
```

Zachowaj własne identyfikatory w `identifier` za pomocą `system`, nad którym masz kontrolę (tutaj numer rekordu kliniki), aby zawsze móc ponownie odnaleźć pacjenta za pomocą `GET $BASE/Patient?identifier=https://clinic.example/mrn|MRN-10442`. Identyfikator FHIR `id` należy do platformy i jest specyficzny dla Twojego projektu: inny projekt widzi tę samą osobę pod innym identyfikatorem.

```bash
export PID=d09e3942-ed86-4458-b099-fa674ab21b84
```

## Krok 2: Zapisz pomiar jako Obserwacja

Ciśnienie krwi jest jedną obserwacją z dwoma komponentami, skurczowym i rozkurczowym, z których każdy ma swój własny kod LOINC. Podaj, kto dokonał pomiaru: tutaj urządzenie domowe.

```bash
curl -X POST "$BASE/Observation" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H "X-Anpheros-Author-Type: device" -H "Idempotency-Key: bp-2026-10-10-0830" -d '{
  "resourceType": "Observation",
  "status": "final",
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs"}]}],
  "code": {"coding": [{"system": "http://loinc.org", "code": "85354-9", "display": "Blood pressure panel"}]},
  "subject": {"reference": "Patient/'$PID'"},
  "effectiveDateTime": "2026-10-10T08:30:00Z",
  "component": [
    {"code": {"coding": [{"system": "http://loinc.org", "code": "8480-6"}]},
     "valueQuantity": {"value": 138, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]"}},
    {"code": {"coding": [{"system": "http://loinc.org", "code": "8462-4"}]},
     "valueQuantity": {"value": 88, "unit": "mmHg", "system": "http://unitsofmeasure.org", "code": "mm[Hg]"}}
  ]
}'
```

Odpowiedź to zapisany zasób z `id` i `meta.versionId: "1"`. Trzy szczegóły mają znaczenie dla użytecznego rekordu:

- **Kody, nie etykiety.** `85354-9` oznacza „panel ciśnienia krwi” w każdym systemie FHIR; tekst swobodny „BP” nie. Kody można wyszukać za pomocą `GET /v1/terminology/loinc?q=blood pressure` ([Systemy kodów FHIR](https://developers.anpheros.com/pl/guides/fhir-code-systems)).
- **Jednostki UCUM** (`mm[Hg]`, `kg`, `mg/dL`) w `valueQuantity.code`, dzięki czemu wartości można porównywać i konwertować.
- **`Idempotency-Key`.** Ponowienie próby po upływie limitu czasu zwraca pierwszą odpowiedź zamiast dwukrotnego zapisywania odczytu.

Wyniki laboratoryjne to ten sam zasób z `category` `laboratory` i zazwyczaj `referenceRange`. Aby zaimportować całe raporty laboratoryjne, zobacz [Jak zaimportować wyniki laboratoryjne do rekordu FHIR](https://developers.anpheros.com/pl/guides/import-lab-results-fhir).

## Krok 3: Rejestrowanie diagnozy jako Stanu (Condition)

```bash
curl -X POST "$BASE/Condition" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H "X-Anpheros-Author-Type: practitioner" -d '{
  "resourceType": "Condition",
  "subject": {"reference": "Patient/'$PID'"},
  "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "active"}]},
  "verificationStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status", "code": "confirmed"}]},
  "code": {"coding": [{"system": "http://hl7.org/fhir/sid/icd-10", "code": "I10", "display": "Essential (primary) hypertension"}]},
  "onsetDateTime": "2026-03-02"
}'
```

`clinicalStatus` (aktywny, rozwiązany, w remisji) i `verificationStatus` (potwierdzony, tymczasowy) są celowo rozdzielone: podejrzewana diagnoza to nie to samo co potwierdzona, a rozwiązany problem nadal stanowi część historii.

## Krok 4: Tworzenie powiązanych zasobów w jednej transakcji

Gdy pacjent i jego pierwszy pomiar przybywają razem, na przykład z systemu klinicznego, wyślij je jako `transaction` Bundle. Albo wszystko zostanie zapisane, albo nic. Odniesienia między nowymi zasobami używają tymczasowych `urn:uuid:` identyfikatorów, które serwer zastępuje:

```bash
curl -X POST "$BASE" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" -d '{
  "resourceType": "Bundle", "type": "transaction",
  "entry": [
    {"fullUrl": "urn:uuid:9f1c0d1e-0000-4000-8000-000000000001",
     "resource": {"resourceType": "Patient", "name": [{"family": "Stan", "given": ["Mihai"]}], "gender": "male", "birthDate": "1990-02-01"},
     "request": {"method": "POST", "url": "Patient"}},
    {"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": "29463-7", "display": "Body weight"}]},
       "subject": {"reference": "urn:uuid:9f1c0d1e-0000-4000-8000-000000000001"},
       "effectiveDateTime": "2026-10-10",
       "valueQuantity": {"value": 82.4, "unit": "kg", "system": "http://unitsofmeasure.org", "code": "kg"}},
     "request": {"method": "POST", "url": "Observation"}}
  ]
}'
```

`transaction-response` zawiera jeden wpis na zasób, z `"status": "201 Created"`, jego `location` i zapisanym zasobem. `subject` zasobu Observation wskazuje teraz na rzeczywisty `Patient/fad3665a-…`.

## Krok 5: wyszukiwanie

```bash
curl "$BASE/Observation?patient=$PID&code=http://loinc.org|85354-9&date=ge2026-10-01&_sort=-date" \
     -H "Authorization: Bearer $KEY"
```

Otrzymasz `searchset` Bundle z `total` i pasującymi zasobami, w kolejności od najnowszych. Inne często używane wyszukiwania to: `Condition?patient=$PID&clinical-status=active`, `Observation?patient=$PID&category=laboratory` i `Patient/$PID/$everything` dla całego rekordu.

## Krok 6: aktualizacja bez utraty historii

Nadciśnienie ustępuje. Zmień status i dodaj datę zakończenia, używając `If-Match` z odczytaną wersją, aby nigdy nie nadpisać zmian wprowadzonych przez kogoś innego:

```bash
curl -X PUT "$BASE/Condition/$CID" -H "Authorization: Bearer $KEY" -H "Content-Type: application/fhir+json" \
     -H 'If-Match: W/"1"' -d '{ …the same Condition…, "clinicalStatus": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/condition-clinical", "code": "resolved"}]}, "abatementDateTime": "2026-10-11" }'
```

`200 OK` z `ETag: W/"2"`. Jeśli inny zapis pojawił się tam pierwszy, otrzymasz `412` i musisz odczytać ponownie. Wcześniejsza wersja nadal tam jest:

```bash
curl "$BASE/Condition/$CID/_history" -H "Authorization: Bearer $KEY"
```

zwraca obie wersje: `versionId` 2 (`resolved`) i 1 (`active`). `GET $BASE/Condition/$CID/_history/1` odczytuje starą wersję. Nic w rekordzie nie jest nadpisywane bez powiadomienia.

## Krok 7: zobacz, kto co napisał

Każde zapisanie tworzy zasób `Provenance`. Dla odczytu ciśnienia krwi:

```bash
curl "$BASE/Provenance?target=Observation/$OBS" -H "Authorization: Bearer $KEY"
```

```json
{"resourceType": "Provenance",
 "target": [{"reference": "Observation/d83d9075-…/_history/1"}],
 "recorded": "2026-10-12T20:16:51.056000Z",
 "activity": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/v3-DataOperation", "code": "CREATE"}]},
 "agent": [{"type": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/provenance-participant-type", "code": "author"}]},
            "who": {"identifier": {"system": "https://anpheros.com/fhir/CodeSystem/author-type", "value": "device"}, "display": "proj_…"},
            "onBehalfOf": {"identifier": {"system": "https://anpheros.com/fhir/sid/organization", "value": "org_…"}, "display": "…"}}]}
```

Typ autora, który wysłałeś (`device`), jest rejestrowany wraz z projektem i organizacją. Wyślij `X-Anpheros-Author-Ref: Practitioner/<id>`, aby nazwać lekarza stojącego za zapisem.

## Krok 8: rekord jako podsumowanie

```bash
curl "$BASE/Patient/$PID/\$summary" -H "Authorization: Bearer $KEY"
```

zwraca Międzynarodowe Podsumowanie Pacjenta (International Patient Summary): `document` Bundle, który zaczyna się od `Composition` i zawiera sekcje takie jak Problemy, Leki, Alergie i Parametry życiowe, zbudowane z powyższych zasobów. Jest to format do przekazania innemu systemowi lub wydrukowania dla lekarza ([FHIR platform](https://developers.anpheros.com/pl/guides/fhir)).

## Preferujesz JSON bez FHIR?

Te same dane są dostępne za pośrednictwem prostszego widoku REST, `/v1`, z tymi samymi identyfikatorami: `POST /v1/patients/{id}/observations` pobiera `{"code": "85354-9", "category": "vital-signs", "effective_at": "…", "components": […]}` i przechowuje tę samą obserwację FHIR. Użyj tego, co lepiej pasuje do Twojego kodu. Zobacz [API danych medycznych](https://developers.anpheros.com/pl/guides/medical-data-api) i [SDK](https://developers.anpheros.com/pl/guides/sdks).

## Najczęściej zadawane pytania

### Jaki jest najlepszy sposób przechowywania dokumentacji medycznej?
Jako zakodowane, wersjonowane zasoby z zapisem tego, kto je utworzył. HL7 FHIR R4 zapewnia strukturę (Patient, Observation, Condition i inne), standardowe systemy kodowania, takie jak LOINC i ICD-10, oraz historię; backend FHIR dodaje wyszukiwanie, zgody i pochodzenie.

### Czy potrzebuję serwera FHIR, aby korzystać z FHIR?
Potrzebujesz miejsca, które przechowuje i wyszukuje zasoby FHIR oraz egzekwuje, kto może je odczytywać. Możesz samodzielnie uruchomić serwer FHIR typu open-source lub skorzystać z zarządzanego, takiego jak Anpheros; [Jak Anpheros wypada na tle innych serwerów FHIR](https://developers.anpheros.com/pl/guides/fhir-server-comparison) analizuje opcje, a [FHIR vs. niestandardowa baza danych medycznych](https://developers.anpheros.com/pl/guides/fhir-vs-custom-database) omawia tworzenie własnego schematu.

### Jak przechowywać ciśnienie krwi w FHIR?
Jako jedno `Observation` z kodem LOINC `85354-9` i dwa wpisy `component`: skurczowe `8480-6` i rozkurczowe `8462-4`, każdy z `valueQuantity` w `mm[Hg]`.

### Czy mogę zmienić zapisany zasób?
Tak, za pomocą `PUT` i `If-Match`. Każda zmiana tworzy nową wersję; wcześniejsze wersje pozostają czytelne poprzez `_history`, a rekordy Provenance zapisują, kto dokonał każdej zmiany. Usunięcia są miękkie i zachowują historię.

## Powiązane

- [Platforma FHIR](https://developers.anpheros.com/pl/guides/fhir): koncepcje, typy zasobów i operacje
- [Systemy kodowania FHIR](https://developers.anpheros.com/pl/guides/fhir-code-systems): LOINC, ICD-10, ATC, UCUM
- [Jak zaimportować wyniki laboratoryjne do rekordu FHIR](https://developers.anpheros.com/pl/guides/import-lab-results-fhir)
- [API danych medycznych](https://developers.anpheros.com/pl/guides/medical-data-api): prostszy widok REST tych samych danych
- [Darmowa baza danych i piaskownica FHIR](https://developers.anpheros.com/pl/guides/free-fhir-database)
