# Πώς να αποθηκεύσετε ιατρικά αρχεία χρησιμοποιώντας FHIR R4

> Οδηγός: δημιουργήστε έναν Ασθενή, μια Παρατήρηση (Observation) αρτηριακής πίεσης και μια Κατάσταση (Condition), χρησιμοποιήστε μια συναλλαγή (transaction), αναζητήστε, ενημερώστε με ιστορικό και διαβάστε την προέλευση (provenance) — κάθε αίτημα με curl και την πραγματική απόκριση, στο δωρεάν sandbox.

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

Αυτός ο οδηγός αποθηκεύει ένα μικρό ιατρικό αρχείο ως πόρους HL7 FHIR R4: έναν `Patient`, μια `Observation` αρτηριακής πίεσης και μια διάγνωση ως `Condition`, στη συνέχεια έναν ασθενή και μια μέτρηση μαζί σε μία συναλλαγή. Τα αναζητά, ενημερώνει τη διάγνωση χωρίς να χάσει την προηγούμενη έκδοση και διαβάζει ποιος έγραψε τι. Κάθε αίτημα είναι απλό `curl` εναντίον του δωρεάν Anpheros sandbox, και κάθε απόκριση που εμφανίζεται είναι αυτό που επιστρέφει το API.

Αν είστε νέοι στο FHIR, διαβάστε πρώτα την [Πλατφόρμα FHIR](https://developers.anpheros.com/el/guides/fhir) για τις έννοιες. Αυτή η σελίδα είναι το πρακτικό μέρος.

## Οι τρεις πόροι με τους οποίους ξεκινούν οι περισσότερες εγγραφές

| Πόρος | Τι περιέχει | Κωδικοποιημένος με |
|---|---|---|
| `Patient` | ποιος αφορά η εγγραφή: όνομα, ημερομηνία γέννησης, φύλο, αναγνωριστικά από άλλα συστήματα | τα συστήματα αναγνωριστικών σας |
| `Observation` | οτιδήποτε μετράται ή αναφέρεται: ζωτικά σημεία, αποτελέσματα εργαστηριακών εξετάσεων, ένα βάρος, ένα σκορ συμπτωμάτων | LOINC, μονάδες UCUM |
| `Condition` | μια διάγνωση ή ένα πρόβλημα υγείας, με την κατάστασή του με την πάροδο του χρόνου | ICD-10 (SNOMED CT πίσω από μια άδεια χρήσης) |

Τα φάρμακα (`MedicationStatement`), οι αλλεργίες (`AllergyIntolerance`), οι εμβολιασμοί και τα έγγραφα ακολουθούν το ίδιο μοτίβο· οι [26 υποστηριζόμενοι τύποι πόρων](https://developers.anpheros.com/el/guides/fhir) παρατίθενται στη δήλωση δυνατοτήτων στο `/fhir/R4/metadata`.

## Πριν ξεκινήσετε

Αποκτήστε ένα κλειδί sandbox (`sk_test_…`) στη διεύθυνση [platform.anpheros.com/dashboard](https://platform.anpheros.com/dashboard/) με την επιλογή **Get a sandbox key**. Τίποτα από ό,τι δημιουργείτε εκεί δεν είναι πραγματικά δεδομένα ασθενούς και τίποτα δεν είναι ορατό σε άλλα έργα.

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

## Βήμα 1: Δημιουργία Ασθενούς

```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`, με το αναγνωριστικό (id) και την έκδοση (version) που ανέθεσε ο διακομιστής (server):

```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"}}
```

Διατηρήστε τα δικά σας αναγνωριστικά στο `identifier` με ένα `system` που ελέγχετε (εδώ, ένας αριθμός μητρώου κλινικής), ώστε να μπορείτε πάντα να βρείτε ξανά τον ασθενή με το `GET $BASE/Patient?identifier=https://clinic.example/mrn|MRN-10442`. Το FHIR `id` είναι της πλατφόρμας και είναι συγκεκριμένο για το έργο σας: ένα άλλο έργο βλέπει το ίδιο άτομο με διαφορετικό αναγνωριστικό.

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

## Βήμα 2: Αποθήκευση μιας μέτρησης ως Παρατήρηση (Observation)

Η αρτηριακή πίεση είναι μια παρατήρηση με δύο συνιστώσες, τη συστολική και τη διαστολική, καθεμία με τον δικό της κωδικό LOINC. Αναφέρετε ποιος την μέτρησε: εδώ μια οικιακή συσκευή.

```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]"}}
  ]
}'
```

Η απόκριση είναι ο αποθηκευμένος πόρος (resource) με `id` και `meta.versionId: "1"`. Τρεις λεπτομέρειες είναι σημαντικές για ένα χρήσιμο αρχείο:

- **Κωδικοί, όχι ετικέτες.** Το `85354-9` σημαίνει "blood pressure panel" σε κάθε σύστημα FHIR· το ελεύθερο κείμενο "BP" όχι. Αναζητήστε κωδικούς με `GET /v1/terminology/loinc?q=blood pressure` ([FHIR code systems](https://developers.anpheros.com/el/guides/fhir-code-systems)).
- **Μονάδες UCUM** (`mm[Hg]`, `kg`, `mg/dL`) στο `valueQuantity.code`, ώστε οι τιμές να μπορούν να συγκριθούν και να μετατραπούν.
- **`Idempotency-Key`.** Μια επανάληψη μετά από timeout επιστρέφει την πρώτη απόκριση αντί να αποθηκεύσει τη μέτρηση δύο φορές.

Τα αποτελέσματα εργαστηρίου είναι ο ίδιος πόρος με `category` `laboratory` και συνήθως ένα `referenceRange`. Για να εισαγάγετε ολόκληρες εργαστηριακές αναφορές, δείτε [Πώς να εισαγάγετε εργαστηριακά αποτελέσματα σε ένα αρχείο FHIR](https://developers.anpheros.com/el/guides/import-lab-results-fhir).

## Βήμα 3: Καταγραφή διάγνωσης ως 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` (active, resolved, in remission) και οι `verificationStatus` (confirmed, provisional) είναι σκόπιμα ξεχωριστές: μια υποψήφια διάγνωση δεν είναι το ίδιο με μια επιβεβαιωμένη, και ένα επιλυμένο πρόβλημα παραμένει μέρος του ιστορικού.

## Βήμα 4: Δημιουργία σχετικών πόρων σε μία συναλλαγή

Όταν ένας ασθενής και η πρώτη του μέτρηση φτάνουν μαζί, για παράδειγμα από ένα σύστημα κλινικής, στείλτε τα ως `transaction` Bundle. Είτε αποθηκεύονται όλα είτε τίποτα. Οι αναφορές μεταξύ νέων πόρων χρησιμοποιούν προσωρινά `urn:uuid:` ids που ο διακομιστής αντικαθιστά:

```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` έχει μία καταχώρηση ανά πόρο, με `"status": "201 Created"`, το `location` του και τον αποθηκευμένο πόρο. Το `subject` του Observation τώρα δείχνει στο πραγματικό `Patient/fad3665a-…`.

## Βήμα 5: αναζήτηση

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

Λαμβάνετε ένα `searchset` Bundle με `total` και τους αντίστοιχους πόρους, με τους νεότερους πρώτα. Άλλες αναζητήσεις που θα χρησιμοποιείτε συχνά: `Condition?patient=$PID&clinical-status=active`, `Observation?patient=$PID&category=laboratory`, και `Patient/$PID/$everything` για ολόκληρο το αρχείο.

## Βήμα 6: Ενημέρωση χωρίς απώλεια ιστορικού

Η υπέρταση επιλύεται. Αλλάξτε την κατάσταση και προσθέστε την ημερομηνία λήξης, και χρησιμοποιήστε το `If-Match` με την έκδοση που διαβάσατε, ώστε να μην αντικαταστήσετε ποτέ την αλλαγή κάποιου άλλου:

```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` με `ETag: W/"2"`. Εάν μια άλλη εγγραφή έφτασε εκεί πρώτη, θα λάβετε `412` και θα διαβάσετε ξανά. Η προηγούμενη έκδοση εξακολουθεί να υπάρχει:

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

επιστρέφει και τις δύο εκδόσεις: `versionId` 2 (`resolved`) και 1 (`active`). Το `GET $BASE/Condition/$CID/_history/1` διαβάζει το παλιό. Τίποτα σε ένα αρχείο δεν αντικαθίσταται σιωπηλά.

## Βήμα 7: Δείτε ποιος έγραψε τι

Κάθε εγγραφή δημιουργεί έναν πόρο `Provenance`. Για την καταγραφή της πίεσης του αίματος:

```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": "…"}}]}
```

Ο τύπος συγγραφέα που στείλατε (`device`) καταγράφεται μαζί με το έργο και τον οργανισμό. Στείλτε `X-Anpheros-Author-Ref: Practitioner/<id>` για να ονομάσετε τον κλινικό ιατρό πίσω από μια εγγραφή.

## Βήμα 8: ο φάκελος ως περίληψη

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

επιστρέφει μια Διεθνή Περίληψη Ασθενούς (International Patient Summary): ένα `document` Bundle που ξεκινά με ένα `Composition` και έχει ενότητες όπως Προβλήματα, Φαρμακευτική αγωγή, Αλλεργίες και Ζωτικά σημεία, κατασκευασμένο από τους παραπάνω πόρους. Αυτή είναι η μορφή για να παραδοθεί σε άλλο σύστημα ή να εκτυπωθεί για έναν γιατρό ([FHIR platform](https://developers.anpheros.com/el/guides/fhir)).

## Προτιμάτε JSON χωρίς FHIR;

Τα ίδια δεδομένα είναι διαθέσιμα μέσω μιας απλούστερης REST προβολής, `/v1`, με τα ίδια αναγνωριστικά: το `POST /v1/patients/{id}/observations` λαμβάνει το `{"code": "85354-9", "category": "vital-signs", "effective_at": "…", "components": […]}` και αποθηκεύει την ίδια FHIR Observation. Χρησιμοποιήστε όποια προβολή ταιριάζει στον κώδικά σας. Δείτε το [Medical data API](https://developers.anpheros.com/el/guides/medical-data-api) και τα [SDKs](https://developers.anpheros.com/el/guides/sdks).

## Συχνές Ερωτήσεις

### Ποιος είναι ο καλύτερος τρόπος αποθήκευσης ιατρικών αρχείων;
Ως κωδικοποιημένοι, εκδοτικοί πόροι με αρχείο του ποιος έγραψε τον καθένα. Το HL7 FHIR R4 σας παρέχει τη δομή (Patient, Observation, Condition και άλλα), τυποποιημένα συστήματα κωδικοποίησης όπως LOINC και ICD-10, και ιστορικό. Ένα backend FHIR προσθέτει αναζήτηση, συναίνεση και προέλευση από πάνω.

### Χρειάζομαι έναν FHIR server για να χρησιμοποιήσω FHIR;
Χρειάζεστε κάπου που αποθηκεύει και αναζητά πόρους FHIR και επιβάλλει ποιος μπορεί να τους διαβάσει. Μπορείτε να εκτελέσετε έναν open-source FHIR server μόνοι σας ή να χρησιμοποιήσετε έναν διαχειριζόμενο όπως το Anpheros. Το [Πώς συγκρίνεται το Anpheros με άλλους FHIR servers](https://developers.anpheros.com/el/guides/fhir-server-comparison) σταθμίζει τις επιλογές, και το [FHIR vs. μια προσαρμοσμένη ιατρική βάση δεδομένων](https://developers.anpheros.com/el/guides/fhir-vs-custom-database) καλύπτει τη δημιουργία του δικού σας σχήματος αντ' αυτού.

### Πώς αποθηκεύω την αρτηριακή πίεση σε FHIR;
Ως ένα `Observation` με κωδικό LOINC `85354-9` και δύο `component` καταχωρήσεις: συστολική `8480-6` και διαστολική `8462-4`, καθεμία με ένα `valueQuantity` σε `mm[Hg]`.

### Μπορώ να αλλάξω έναν αποθηκευμένο πόρο;
Ναι, με `PUT` και `If-Match`. Κάθε αλλαγή δημιουργεί μια νέα έκδοση. Οι προηγούμενες εκδόσεις παραμένουν αναγνώσιμες μέσω `_history`, και τα αρχεία Provenance καταγράφουν ποιος έκανε κάθε αλλαγή. Οι διαγραφές είναι "μαλακές" και διατηρούν το ιστορικό.

## Σχετικά

- [Πλατφόρμα FHIR](https://developers.anpheros.com/el/guides/fhir): οι έννοιες, οι τύποι πόρων και οι λειτουργίες
- [Συστήματα κώδικα FHIR](https://developers.anpheros.com/el/guides/fhir-code-systems): LOINC, ICD-10, ATC, UCUM
- [Πώς να εισαγάγετε εργαστηριακά αποτελέσματα σε ένα αρχείο FHIR](https://developers.anpheros.com/el/guides/import-lab-results-fhir)
- [API ιατρικών δεδομένων](https://developers.anpheros.com/el/guides/medical-data-api): η απλούστερη προβολή REST των ίδιων δεδομένων
- [Δωρεάν βάση δεδομένων και sandbox FHIR](https://developers.anpheros.com/el/guides/free-fhir-database)
