# FHIR kaydına laboratuvar sonuçlarını içe aktarma

> Eğitim: Bir laboratuvar raporunu CSV ve HL7 v2 ORU^R01 olarak FHIR R4 Gözlemleri'ne LOINC kodları ve referans aralıklarıyla içe aktarın, eşlenmemiş işaretçileri ve yeniden gönderilen raporları işleyin ve her sonucu laboratuvarına izleyin.

Source: https://developers.anpheros.com/tr/guides/import-lab-results-fhir

**Bu eğitim, bir laboratuvar raporunu CSV dosyası ve HL7 v2 ORU^R01 mesajı olarak alır, her biri için tek bir istekte hastanın HL7 FHIR R4 kaydına içe aktarır ve geri dönenleri gösterir: LOINC kodları, referans aralıkları ve köken bilgileri içeren laboratuvar `Observation` kaynakları.** Ayrıca, her laboratuvar entegrasyonunun karşılaştığı iki sorunu da kapsar: otomatik olarak eşlenemeyen işaretçiler ve iki kez gönderilen raporlar. Her şey, sentetik bir hasta ile ücretsiz sandbox üzerinde çalışır.

## Laboratuvar Sonuçlarının Saklanmasının Zorlukları

Bir laboratuvar raporu basit görünür: bir işaretleyici, bir değer, bir birim, bir referans aralığı, bir tarih. Pratikte her laboratuvar işaretleyicileri kendi yöntemleriyle adlandırır ("Hemoglobina glicozilata", "HbA1c", "Glycated haemoglobin"), ondalık sayılar için virgül veya nokta kullanır, aralıkları `4,0-5,6`, `<5` veya `>3.5` şeklinde yazar ve bir şeyler başarısız olduğunda aynı raporu yeniden gönderir. Serbest metin olarak saklanan bu sonuçlar zaman içinde karşılaştırılamaz, grafiklenemez, başka bir uygulamayla paylaşılamaz veya bir yapay zeka modeline güvenle verilemez.

Bir FHIR kaydı, her sonucu bir `Observation` olarak LOINC kodu, bir UCUM birimi, bir değer, bir referans aralığı ve bir tarih ile saklar ve kimin gönderdiğini bir `Provenance` kaynağında tutar. [Laboratuvar bağlayıcısı](https://developers.anpheros.com/tr/guides/lab-connector) bu dönüşümü sizin için yapar.

```
 lab report (CSV, HL7 v2, JSON)
        │  POST /v1/patients/{id}/labs/import
        ▼
 ┌──────────────────────────────────────────────┐
 │ parse rows → map marker to LOINC → parse     │
 │ value, unit, range → stable id per row       │
 └──────────────────────────────────────────────┘
        │
        ▼
 Observation (category laboratory) + Provenance (author_type import, source system, report id)
        │
        ├─► the patient's app and every app they consented to
        └─► webhooks: resource.created per Observation
```

## Başlamadan Önce

[platform.anpheros.com/dashboard](https://platform.anpheros.com/dashboard/) adresinden bir sandbox anahtarına (`sk_test_…`) ihtiyacınız olacak (**Bir sandbox anahtarı alın**). Örnekler `curl`'ü kullanır; [SDK'lar](https://developers.anpheros.com/tr/guides/sdks) aynı çağrıları kullanır (`labs.importCsv`, `labs.importHl7`, `labs.importItems`).

```bash
export BASE=https://platform.anpheros.com
export KEY=sk_test_…
# Elena Ionescu, a synthetic patient with type 2 diabetes
export PID=$(curl -s "$BASE/fhir/R4/Patient?identifier=https://anpheros.com/fhir/sid/sandbox-persona|p02" \
  -H "Authorization: Bearer $KEY" | jq -r '.entry[0].resource.id')
```

## Adım 1: Bir CSV raporu içe aktarın

Bir Romen laboratuvarının raporu şu şekilde dışa aktarabileceği durum: noktalı virgüller, ondalık virgüller, Romen sütun adları ve tarihler `DD.MM.YYYY` olarak. Bağlayıcı, Romen ve İngilizce sütun adlarını tanır.

```bash
cat > report.csv <<'EOF'
Analiza;Rezultat;UM;Interval de referinta;Data
Hemoglobina glicozilata (HbA1c);6,9;%;4,0-5,6;01.10.2026
Glicemie;131;mg/dL;70-100;01.10.2026
TSH;2,1;mUI/L;0,4-4,0;01.10.2026
Marker foarte rar;12;U/L;0-20;01.10.2026
EOF

curl -X POST "$BASE/v1/patients/$PID/labs/import" -H "Authorization: Bearer $KEY" \
     -H "Content-Type: text/csv" -H "X-Anpheros-Source-System: labx" \
     -H "Idempotency-Key: report-2026-10-01-elena" --data-binary @report.csv
```

Yanıt (`201`):

```json
{"created": 4, "skipped": 0, "unmapped": ["Marker foarte rar"], "warnings": [],
 "observations": [
  {"id": "ff0bbb44-…", "marker": "Hemoglobina glicozilata (HbA1c)", "code": "4548-4", "system": "http://loinc.org", "value": 6.9, "unit": "%", "date": "2026-10-01"},
  {"id": "ebe5522f-…", "marker": "Glicemie", "code": "2345-7", "system": "http://loinc.org", "value": 131.0, "unit": "mg/dL", "date": "2026-10-01"},
  {"id": "bace44a8-…", "marker": "TSH", "code": "3016-3", "system": "http://loinc.org", "value": 2.1, "unit": "mUI/L", "date": "2026-10-01"},
  {"id": "26fd2270-…", "marker": "Marker foarte rar", "code": "marker_foarte_rar", "system": "urn:anpheros:lab-code", "value": 12.0, "unit": "U/L", "date": "2026-10-01"}]}
```

HbA1c, glukoz ve TSH, adlarından LOINC'e eşleştirildi. Ondalık virgüller sayılara dönüştü ve aralıklar `referenceRange` oldu. `unmapped` içinde bir satır geri geldi. Laboratuvarın kendi kodu (`urn:anpheros:lab-code`) altında, rapordaki tam metinle birlikte hala saklanmaktadır, bu nedenle hiçbir şey kaybolmaz.

## Adım 2: Eşlenmemiş işaretçileri işleme

Bazı isimler bir karar gerektirir. "Glicemie" (kan şekeri) iyi bir örnektir: LOINC'in serum veya plazmadaki glikoz için bir kodu (`2345-7`, laboratuvarda alınan venöz bir örnek) ve tam kanda glikoz için başka bir kodu (`2339-0`, örneğin parmaktan alınan bir örnek) vardır. Bir laboratuvar raporunda, sadece "Glicemie" serum veya plazmaya eşlenir. "Capilar", "capillary" veya "sânge integral" diyen bir isim tam kana eşlenir:

```json
{"created": 1, "skipped": 0, "unmapped": [], "warnings": [],
 "observations": [{"id": "00480a6d-…", "marker": "Glicemie capilara", "code": "2339-0", "system": "http://loinc.org", "value": 140.0, "unit": "mg/dL", "date": "2026-10-02"}]}
```

Bağlayıcının tanımadığı işaretçiler için kodu arayın:

```bash
curl "$BASE/v1/terminology/loinc?q=glucose" -H "Authorization: Bearer $KEY"
```

```json
{"data": [
  {"system": "http://loinc.org", "code": "2339-0", "display": "Glucose [Mass/volume] in Blood", "display_ro": "Glicemie (sânge)", "category": "laboratory", "unit": "mg/dL"},
  {"system": "http://loinc.org", "code": "2345-7", "display": "Glucose [Mass/volume] in Serum or Plasma", "display_ro": "Glicemie (ser)", "category": "laboratory", "unit": "mg/dL"}],
 "total": 2}
```

Ardından kodu `LOINC` sütununa gönderin. Rapordaki bir kod her zaman isme üstün gelir. Bu eşlemeyi laboratuvar başına kendi tarafınızda saklayın ve her rapordan buna bir sütun ekleyin:

```
Analiza;Rezultat;UM;Interval de referinta;Data;LOINC
Glicemie;99;mg/dL;70-100;04.10.2026;2339-0
```

LOINC'in hiç kapsamadığı, uydurma "Marker foarte rar" gibi işaretçiler laboratuvarın kodu altında kalabilir. Hastaya gösterilir ve kayda dahil edilir. Diğer laboratuvarların sonuçlarıyla karşılaştırılamazlar.

## Adım 3: Raporu İki Kez Gönderme

Laboratuvarlar raporları yeniden gönderir. Her satır, rapor kimliği, kod, tarih ve değerden oluşan kararlı bir tanımlayıcı alır, bu nedenle aynı raporun ikinci bir içe aktarılması hiçbir şey oluşturmaz:

```json
{"created": 0, "skipped": 4, "unmapped": ["Marker foarte rar"], "warnings": [], "observations": []}
```

Değişen satırlar, örneğin düzeltilmiş bir değer, yeni sonuçlar olarak içe aktarılır. `Idempotency-Key` üstbilgisi ikinci bir güvence ekler: aynı anahtarla bir ağ yeniden denemesi ilk yanıtı değişmeden döndürür.

## Adım 4: Bir HL7 v2 ORU^R01 mesajı içe aktarın

Laboratuvar bilgi sistemlerinin çoğu HL7 v2 kullanır. Mesajı olduğu gibi (ER7 metni, segmentler CR veya LF ile ayrılmış) gönderin:

```
MSH|^~\&|LABX|LAB1|ANPHEROS|EHR|202610010930||ORU^R01|MSG00077|P|2.5.1
PID|1||12345||Ionescu^Elena||19850903|F
OBR|1||R-77|24331-1^Lipid panel^LN|||202610010800
OBX|1|NM|2093-3^Cholesterol [Mass/volume] in Serum or Plasma^LN||212|mg/dL|<200|H|||F|||202610010800
OBX|2|NM|2085-9^HDL Cholesterol^LN||52|mg/dL|>40|N|||F|||202610010800
```

```bash
curl -X POST "$BASE/v1/patients/$PID/labs/import" -H "Authorization: Bearer $KEY" \
     -H "Content-Type: x-application/hl7-v2+er7" --data-binary @oru.hl7
```

```json
{"created": 2, "skipped": 0, "unmapped": [], "warnings": [],
 "observations": [
  {"id": "b562045b-…", "marker": "Cholesterol [Mass/volume] in Serum or Plasma", "code": "2093-3", "system": "http://loinc.org", "value": 212.0, "unit": "mg/dL", "date": "2026-10-01T08:00:00Z"},
  {"id": "9b3274e4-…", "marker": "HDL Cholesterol", "code": "2085-9", "system": "http://loinc.org", "value": 52.0, "unit": "mg/dL", "date": "2026-10-01T08:00:00Z"}]}
```

`OBX-3`, `LN` kodlama sistemi ile doğrudan LOINC olarak kullanılır. `OBX-7` referans aralığı olur ve `OBX-8` (`H`, `N`) yorum olur. `OBR-3` (`R-77`) provenance'da rapor kimliği olarak saklanır. Hasta URL'deki hastadır: `PID` segmenti hasta bulmak için kullanılmaz, bu nedenle yanlış bir `PID` başkasının sonuçlarını ekleyemez.

Zaten ayrıştırılmış sonuçlarınız mı var? JSON gönderin: `{"date": "2026-10-01", "origin": "report-77", "items": [{"marker": "Ferritin", "value": 38, "unit": "ng/mL", "ref_low": 15, "ref_high": 150}]}`. Ferritin, LOINC `2276-4`'e eşlenir.

## Adım 5: Sonuçları FHIR olarak okuma

```bash
curl "$BASE/fhir/R4/Observation?patient=$PID&code=http://loinc.org|4548-4&_sort=-date&_count=1" \
     -H "Authorization: Bearer $KEY"
```

İçe aktarılan HbA1c, şu şekilde saklanır:

```json
{
  "resourceType": "Observation",
  "id": "62b1b0c0-…",
  "meta": {"versionId": "1", "lastUpdated": "2026-10-12T20:05:57.011Z"},
  "identifier": [{"system": "urn:anpheros:lab-import", "value": "c52d3cd6449291d34f6bef1516d0ac05"}],
  "status": "final",
  "category": [{"coding": [{"system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "laboratory"}]}],
  "code": {"coding": [{"system": "http://loinc.org", "code": "4548-4", "display": "Hemoglobin A1c/Hemoglobin.total in Blood"}],
           "text": "Hemoglobina glicozilata (HbA1c)"},
  "subject": {"reference": "Patient/…"},
  "effectiveDateTime": "2026-10-01",
  "valueQuantity": {"value": 6.9, "unit": "%"},
  "referenceRange": [{"low": {"value": 4.0, "unit": "%"}, "high": {"value": 5.6, "unit": "%"}}]
}
```

LOINC gösterimi standart İngilizce isimdir. `code.text` laboratuvarın kendi ifadesini korur, böylece hasta kağıt raporda gördüğünü görmeye devam eder. Kaynaklar ve arama hakkında daha fazla bilgi için [FHIR platformu](https://developers.anpheros.com/tr/guides/fhir) kılavuzuna ve [FHIR kod sistemlerine](https://developers.anpheros.com/tr/guides/fhir-code-systems) bakın.

## Adım 6: Göndereni Kontrol Etme

```bash
curl "$BASE/v1/patients/$PID/provenance/Observation/62b1b0c0-…" -H "Authorization: Bearer $KEY"
```

```json
{"data": [{"version": 1, "activity": "CREATE", "recorded": "2026-10-12T20:05:57.011000Z",
           "author_type": "import", "author": "proj_…", "source_system": "labx", "origin_id": null,
           "fhir": "Provenance/f15c4fee-…"}], "total": 1}
```

`author_type: import` ve `source_system: labx` değerle birlikte kalır. Bir yapay zeka uygulaması bu sonucu daha sonra [bağlam API'si](https://developers.anpheros.com/tr/guides/llm-healthcare-data) aracılığıyla okuduğunda, bu `[import/labx]` olarak etiketlenir, böylece model bir laboratuvar sonucunu hastanın girdiği bir değerden ayırt edebilir.

## Sonraki Adımlar

- Hasta sonuçları uygulamasında görür. Onay verdiği herhangi bir uygulama, kapsamları dahilinde bunları okuyabilir ([Onay ve Erişim Modeli](https://developers.anpheros.com/tr/guides/consent)).
- Her Gözlem (Observation) için bir `resource.created` [webhook](https://developers.anpheros.com/tr/guides/webhooks) tetiklenir, böylece bir klinik panosu veya yapay zeka özeti yoklama yapmadan güncellenebilir.
- `POST /fhir/R4/Observation/$validate?profile=eu-lab`, bir sonucun HL7 Europe laboratuvar rapor profiline nasıl uyduğunu bildirir.
- İstek başına en fazla 500 satır; sınırlar [Sınırlar ve Hız Sınırları](https://developers.anpheros.com/tr/guides/limits) bölümünde listelenmiştir.

## Sıkça Sorulan Sorular

### FHIR'a hangi laboratuvar raporu formatları aktarılabilir?
Başlık satırı olan CSV (virgül, noktalı virgül veya sekme, ondalık virgül kabul edilir), HL7 v2 ORU^R01 mesajları ve JSON. PDF raporları belge olarak saklanabilir; bunlardan çıkarılan değerler belgeye geri işaret eder.

### LOINC kodu olmayan işaretleyicilere ne olur?
Laboratuvarın kendi kodu altında, rapordaki tam metinle birlikte saklanır ve `unmapped`'te listelenir. O laboratuvar için bir LOINC sütunu eklenirse eşleştirilir. Rapordaki bir kod her zaman adın önüne geçer.

### Bir raporu yeniden göndermek güvenli midir?
Evet. Her satır, rapor, kod, tarih ve değerden oluşan kararlı bir tanımlayıcıya sahiptir, bu nedenle zaten aktarılmış satırlar atlanır; değiştirilen satırlar yeni sonuçlar olarak aktarılır.

### Bir laboratuvar herhangi bir hasta için sonuçları aktarabilir mi?
Hayır. Bir laboratuvar, projesinin oluşturduğu veya kişinin OAuth aracılığıyla paylaştığı kayıtların bulunduğu hastalara aktarım yapar. Diğer hastalar onun için mevcut değildir (`404`).

## İlgili Konular

- [Laboratuvar sonuçları API'si](https://developers.anpheros.com/tr/guides/lab-results-api): HL7 v2 ve FHIR yan yana ve bir sonucun ne taşıması gerektiği
- [Laboratuvar bağlayıcısı](https://developers.anpheros.com/tr/guides/lab-connector): her sütun adı, HL7 alanı ve yanıt alanı
- [Sağlık verileri birlikte çalışabilirliği](https://developers.anpheros.com/tr/guides/interoperability): kodlar ve köken bilgisi neden değiş tokuş edilen verileri kullanılabilir hale getirir
- [Sağlık entegrasyonları](https://developers.anpheros.com/tr/guides/healthcare-integrations): klinikler, laboratuvarlar, cihazlar ve üçüncü taraf uygulamalar
- [Tıbbi veri API'si](https://developers.anpheros.com/tr/guides/medical-data-api): tekil gözlemler, durumlar ve ilaçlar yazma
- [FHIR arka ucu ile bir yapay zeka sağlık uygulaması nasıl oluşturulur](https://developers.anpheros.com/tr/guides/build-ai-healthcare-app): bu sonuçların bir yapay zeka yanıtında kullanılması
