Lesson 0005 · FHIR · Modul Resource · ±25 menit

Reference (Encounter); Observation: CodeableConcept vs Coding

Cara resource saling merujuk, dan JSON Observation yang kemungkinan besar ditunjukkan interviewer

Di lesson 0004 Anda membedakan id dan identifier. Sekarang kita lihat bagaimana resource memakai keduanya untuk saling merujuk (lewat Encounter), lalu membaca nilai berkode di Observation.

Target lesson ini: Anda bisa menjawab "Jelaskan JSON Observation ini. Apa itu CodeableConcept, dan kenapa ada beberapa Coding?" tanpa catatan: menunjuk status, code, subject, valueQuantity, membedakan Coding dan CodeableConcept, menjelaskan bahwa beberapa Coding adalah translasi konsep yang sama, serta menyebut bentuk Reference (literal, logical, display).

Semua JSON di lesson ini diadaptasi (dipendekkan) dari contoh resmi spesifikasi FHIR R4 (4.0.1); tautannya ada di setiap blok. Tanpa lab: cukup baca, jawab kuis, lalu latihan lisan. Kuis di sini adalah feedback cepat; bukti penguasaan hanya dari review campuran 0012.

1. Reference, lewat Encounter (±10 menit)

Encounter adalah "An interaction between a patient and healthcare provider(s) for the purpose of providing healthcare service(s) or assessing the health status of a patient": kunjungan rawat jalan, IGD, rawat inap, kunjungan virtual. [4] Potongan contoh resmi (kunjungan kardiologi): [7]

{
  "resourceType": "Encounter",
  "id": "f001",
  "identifier": [{ "use": "official", "system": "http://www.amc.nl/zorgportal/identifiers/visits", "value": "v1451" }],
  "status": "finished",                                   // 1..1, planned | arrived | in-progress | finished | ...
  "class": { "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
             "code": "AMB", "display": "ambulatory" },    // R4: Coding, bukan CodeableConcept
  "type": [{ "coding": [{ "system": "http://snomed.info/sct", "code": "270427003",
                          "display": "Patient-initiated encounter" }] }],
  "subject": { "reference": "Patient/f001", "display": "P. van de Heuvel" },
  "participant": [{ "individual": { "reference": "Practitioner/f002", "display": "P. Voigt" } }],
  "length": { "value": 140, "unit": "min", "system": "http://unitsofmeasure.org", "code": "min" },
  "reasonCode": [{ "coding": [{ "system": "http://snomed.info/sct", "code": "34068001",
                                "display": "Heart valve replacement" }] }],
  "serviceProvider": { "reference": "Organization/f001", "display": "Burgers University Medical Center" }
}

Tipe Reference berisi "at least one of a reference (literal reference), an identifier (logical reference), and a display (text description of target)". [2]

BentukContohKapan
Literal, relatif"reference": "Patient/f001"paling umum; relatif terhadap service base URL (atau fullUrl di Bundle)
Literal, absolut"reference": "http://example.org/fhir/Patient/f001"resource di server lain
Versi tertentu"Observation/1x2/_history/2"audit/provenance: menunjuk versi persis, bukan yang terbaru
Internal (contained)"reference": "#p1"menunjuk resource di contained (lesson 0007)
Logical"identifier": { "system": "http://hl7.org/fhir/sid/us-ssn", "value": "000111111" }hanya tahu business identifier, tidak tahu URL-nya
+ display"display": "P. van de Heuvel"teks pendek untuk UI, bukan kunci

Semua contoh tabel dari halaman References. [2]

Latihan 1 — Reference

2. Observation: CodeableConcept vs Coding (±12 menit)

Ini JSON yang kemungkinan besar ditunjukkan interviewer. Contoh resmi berat badan, utuh kecuali narrative: [6]

{
  "resourceType": "Observation",
  "id": "example",
  "status": "final",                                       // 1..1, modifier (?!)
  "category": [{ "coding": [{ "system": "http://terminology.hl7.org/CodeSystem/observation-category",
                              "code": "vital-signs", "display": "Vital Signs" }] }],
  "code": {                                                // 1..1 CodeableConcept: APA yang diukur
    "coding": [
      { "system": "http://loinc.org",       "code": "29463-7",  "display": "Body Weight" },
      { "system": "http://loinc.org",       "code": "3141-9",   "display": "Body weight Measured" },
      { "system": "http://snomed.info/sct", "code": "27113001", "display": "Body weight" },
      { "system": "http://acme.org/devices/clinical-codes", "code": "body-weight", "display": "Body Weight" }
    ]
  },
  "subject": { "reference": "Patient/example" },           // SIAPA
  "encounter": { "reference": "Encounter/example" },       // DALAM kunjungan mana
  "effectiveDateTime": "2016-03-28",                       // KAPAN (choice type effective[x])
  "valueQuantity": {                                       // HASIL (choice type value[x])
    "value": 185, "unit": "lbs", "system": "http://unitsofmeasure.org", "code": "[lb_av]"
  }
}

Spesifikasi punya dua tipe untuk nilai berkode: [1]

type Coding = { system?: string; version?: string; code?: string; display?: string; userSelected?: boolean };
type CodeableConcept = { coding?: Coding[]; text?: string };

// Cari berdasarkan system, jangan coding[0]: urutan coding tidak bermakna.
const loinc = (cc: CodeableConcept) => cc.coding?.find(c => c.system === "http://loinc.org")?.code;
// Untuk UI: text dulu, lalu display coding mana pun, lalu code.
const label = (cc: CodeableConcept) => cc.text ?? cc.coding?.find(c => c.display)?.display ?? cc.coding?.[0]?.code;

Kenapa empat Coding? [1]

Jebakan versi: di R4, Encounter.class bertipe Coding 1..1, jadi JSON-nya objek { system, code, display } tanpa coding: [...] (lihat bagian 1). [4] Di R5 elemen itu menjadi CodeableConcept 0..*. [8] Bentuk JSON ditentukan oleh tipe di definisi, jadi baca definisinya, jangan menebak.

Latihan 2 — Coding atau CodeableConcept?

Latihan 3 — Ucapkan dengan suara keras

Pasang timer dan jawab dengan suara keras, seolah sedang interview. Jangan buka jawaban contoh sebelum selesai.

Interviewer menunjukkan JSON Observation berat badan dari bagian 2. "Jelaskan JSON ini. Apa itu CodeableConcept, dan kenapa ada beberapa Coding?" (90 detik)
Bandingkan dengan jawaban contoh dan checklist-nya

"Ini Observation, satu pengukuran: status final, subject merujuk Patient/example dengan reference relatif, dan hasilnya di valueQuantity: 185 dengan unit UCUM. value[x] adalah choice type, jadi nama property-nya ikut tipe. Apa yang diukur ada di code, bertipe CodeableConcept: daftar Coding plus text opsional. Setiap Coding adalah pasangan system + code (+ display), dan code hanya bermakna bersama system-nya. Ada empat Coding karena konsep yang sama dikodekan di beberapa sistem: dua LOINC, satu SNOMED CT, dan satu kode lokal. Itu translasi, urutannya tidak bermakna. Kode lokal berguna untuk debugging, kode standar untuk interoperabilitas. Di kode saya, saya cari Coding dengan system yang saya butuhkan, misalnya http://loinc.org, bukan mengambil coding[0]."

Checklist: apakah Anda menyebut…

  • resource Observation: status, subject (Reference ke Patient), dan nilai di valueQuantity?
  • CodeableConcept = daftar Coding plus text; Coding = system + code (+ display)?
  • beberapa Coding = konsep sama di beberapa code system (translasi), urutan tidak bermakna?
  • LOINC untuk Observation.code dan SNOMED CT / kode lokal sebagai translasi?
  • code selalu dibaca bersama system; di kode klien cari berdasarkan system, bukan coding[0]?
  • value[x] adalah choice type: nama property ikut tipe (valueQuantity, unit UCUM)?

Lulus kalau minimal 4 dari 6.

Ringkasan untuk dicetak: Reference: Anatomi resource + datatype · Istilah: GLOSSARY.md (bagian "Resource dan datatype")

Ada yang belum jelas? Tanyakan ke saya (agent) di terminal, misalnya: "kapan Observation memakai component alih-alih beberapa Observation?", "bagaimana mengetik resource FHIR di TypeScript tanpa menulis semuanya sendiri?", atau "apa beda ValueSet dan CodeSystem?"

Sumber (semua diakses 26 Oktober 2026): [1] Data Types · [2] Resource References · [3] Using Codes in Resources · [4] Encounter · [5] Observation · [6] Contoh Observation (berat badan) · [7] Contoh Encounter f001 · [8] Encounter (R5)