iT邦幫忙

2026 iThome 鐵人賽

DAY 2
0

前言

在上一篇文章中,我們認識了Encounter Resource。

Encounter用來表示一次門診、急診或住院等就醫過程,而病人在這次就醫中被記錄的疾病、問題或診斷,則可能使用Condition Resource表示。

例如,王小明因為頭暈到醫院看診:

  • 「頭暈」可能是就醫原因或症狀。
  • 「血壓測量結果」可以使用Observation。
  • 「本次門診」可以使用Encounter。
  • 經醫師評估後記錄的疾病或健康問題,可以使用Condition。

這些資料彼此相關,但代表的概念不同,不能全部放進同一個Resource。

今天不進行實際操作,而是透過一筆虛構Condition,認識FHIR如何表示疾病、健康問題及診斷。

本文中的病人、診斷及時間均為虛構教學範例,不可作為任何人的疾病判斷或醫療建議。


Condition是什麼?

Condition可以用來表示與病人健康有關的狀況,例如:

  • 疾病
  • 診斷
  • 健康問題
  • 症狀
  • 傷害
  • 長期慢性病
  • 醫療人員關注的臨床狀況
  • 已經改善或解除的問題

Condition通常會回答:

  1. 這是什麼疾病或健康問題?
  2. 這項Condition屬於哪位病人?
  3. 目前處於活動、緩解還是已解除狀態?
  4. 診斷是否已經確認?
  5. 它是問題清單項目,還是本次就醫診斷?
  6. 從什麼時候開始?
  7. 何時改善或結束?
  8. 由誰記錄或確認?
  9. 有哪些相關證據?

Condition不一定都是已確認診斷

看到Condition時,不能直接認定病人一定罹患某項疾病。

Condition也可能記錄:

  • 尚未確認的問題
  • 初步診斷
  • 鑑別診斷
  • 已被排除的診斷
  • 誤輸入的資料
  • 已經解除的疾病
  • 病人自己提供但尚未確認的資訊

因此,閱讀Condition時,不能只看code,還要同時查看:

  • clinicalStatus
  • verificationStatus
  • category
  • onset[x]
  • abatement[x]

一份Condition範例

以下是一份簡化的FHIR R4 Condition:

{
  "resourceType": "Condition",
  "id": "condition-001",
  "identifier": [
    {
      "system": "https://hospital.example.org/condition-number",
      "value": "C0001"
    }
  ],
  "clinicalStatus": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/condition-clinical",
        "code": "active",
        "display": "Active"
      }
    ],
    "text": "目前存在"
  },
  "verificationStatus": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status",
        "code": "confirmed",
        "display": "Confirmed"
      }
    ],
    "text": "已確認"
  },
  "category": [
    {
      "coding": [
        {
          "system": "http://terminology.hl7.org/CodeSystem/condition-category",
          "code": "encounter-diagnosis",
          "display": "Encounter Diagnosis"
        }
      ],
      "text": "本次就醫診斷"
    }
  ],
  "severity": {
    "text": "依臨床評估記錄"
  },
  "code": {
    "coding": [
      {
        "system": "http://hl7.org/fhir/sid/icd-10",
        "code": "I10",
        "display": "Essential (primary) hypertension"
      }
    ],
    "text": "原發性高血壓"
  },
  "subject": {
    "reference": "Patient/patient-001",
    "display": "王小明"
  },
  "encounter": {
    "reference": "Encounter/encounter-001",
    "display": "2026年9月3日門診"
  },
  "onsetDateTime": "2026-09-03",
  "recordedDate": "2026-09-03T09:15:00+08:00",
  "recorder": {
    "reference": "Practitioner/doctor-001",
    "display": "陳醫師"
  },
  "asserter": {
    "reference": "Practitioner/doctor-001",
    "display": "陳醫師"
  },
  "note": [
    {
      "text": "虛構教學用診斷資料"
    }
  ]
}

這份範例描述:

王小明在2026年9月3日的門診中,被記錄一項目前存在且已確認的Condition,並由陳醫師記錄。

這只是用來說明FHIR結構的虛構資料,不代表單次血壓數值就能形成高血壓診斷。


resourceType與id

"resourceType": "Condition",
"id": "condition-001"

resourceType表示這是一筆Condition Resource。

id則是Condition在FHIR Server中的邏輯識別碼。

它的邏輯位置可能是:

Condition/condition-001

Encounter或其他Resource可以透過Reference連結這筆Condition。


identifier:Condition的業務識別碼

"identifier": [
  {
    "system": "https://hospital.example.org/condition-number",
    "value": "C0001"
  }
]

identifier可以表示醫療機構實務上替這筆疾病或問題紀錄建立的編號。

可以比較:

欄位 用途
id FHIR Server中的Resource識別碼
identifier 醫療或行政流程使用的業務識別碼

不是每一筆Condition都一定需要業務編號,是否使用應依系統及Profile要求決定。


clinicalStatus:疾病目前處於什麼狀態?

"clinicalStatus": {
  "coding": [
    {
      "system": "http://terminology.hl7.org/CodeSystem/condition-clinical",
      "code": "active",
      "display": "Active"
    }
  ],
  "text": "目前存在"
}

clinicalStatus描述Condition目前的臨床狀態。

FHIR R4常見代碼包括:

code 基本意義
active 目前存在或活動中
recurrence 再次發生
relapse 復發
inactive 目前不活動
remission 緩解
resolved 已解除

active和resolved有什麼不同?

active

active

表示Condition目前仍然存在或持續受到關注。

resolved

resolved

表示Condition已經解除。

不過,Condition是否已解除,需要依照醫療專業判斷及資料來源決定,不能只因為病人目前沒有症狀就自行改成resolved


clinicalStatus不是診斷可信度

clinicalStatus回答的是:

這項Condition現在處於什麼臨床狀態?

它不負責回答:

這項診斷是否已經被確認?

診斷是否確認,要查看verificationStatus


verificationStatus:診斷是否已確認?

"verificationStatus": {
  "coding": [
    {
      "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status",
      "code": "confirmed",
      "display": "Confirmed"
    }
  ],
  "text": "已確認"
}

verificationStatus表示這項Condition的確認程度或驗證狀態。

FHIR R4常見代碼包括:

code 基本意義
unconfirmed 尚未確認
provisional 暫定
differential 鑑別診斷
confirmed 已確認
refuted 已排除
entered-in-error 誤輸入

provisional和differential的差異

provisional

表示目前暫定使用的診斷,未來仍可能因檢查結果或臨床變化而調整。

differential

表示列入鑑別診斷,也就是醫療人員正在考慮的可能疾病之一。

它們都不等於confirmed

因此,如果Condition的code寫著某種疾病,但verificationStatus是:

differential

就不能直接把它解讀成病人已經確診。


refuted和entered-in-error不同

refuted

refuted

表示這項疾病或問題曾經被考慮,但後續已被排除。

entered-in-error

entered-in-error

表示這筆Condition本身是誤建或錯誤輸入。

兩者差異是:

狀態 意義
refuted 曾合理考慮過,但後續被排除
entered-in-error 這筆紀錄不應被建立

如果是誤輸入資料,不應只將clinicalStatus改成resolved,因為「疾病已解除」和「資料一開始就是錯的」是不同概念。


clinicalStatus和verificationStatus比較

欄位 回答的問題 範例
clinicalStatus 疾病現在處於什麼狀態? active、resolved
verificationStatus 診斷是否已確認? provisional、confirmed

例如:

目前存在且已確認

clinicalStatus:active
verificationStatus:confirmed

正在考慮的鑑別診斷

clinicalStatus:active
verificationStatus:differential

曾考慮但已排除

verificationStatus:refuted

閱讀Condition時,需要將兩個欄位一起理解。


category:這筆Condition用在哪裡?

"category": [
  {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/condition-category",
        "code": "encounter-diagnosis",
        "display": "Encounter Diagnosis"
      }
    ],
    "text": "本次就醫診斷"
  }
]

category用來說明Condition的分類或使用情境。

FHIR R4常見類別包括:

code 基本意義
problem-list-item 問題清單項目
encounter-diagnosis 本次就醫診斷

problem-list-item和encounter-diagnosis

problem-list-item

表示這項Condition被放在病人的健康問題清單中,可能跨越多次就醫持續追蹤。

例如:

  • 長期慢性疾病
  • 持續存在的健康問題
  • 需要後續照護的狀況

encounter-diagnosis

表示這項Condition是某次Encounter中的診斷。

例如:

  • 本次門診診斷
  • 急診診斷
  • 住院期間診斷

同一項疾病可能同時和問題清單及特定就醫有關,實際表示方式要依Profile及業務規則決定。


severity:嚴重程度

"severity": {
  "text": "依臨床評估記錄"
}

severity用來記錄Condition的嚴重程度。

例如可能表達:

  • 輕度
  • 中度
  • 重度

不過,嚴重程度不能由系統只看疾病名稱後自動推測,也不一定適用於所有Condition。

實際使用時應選擇適當的標準代碼,並依照臨床評估及Profile要求記錄。


code:這是什麼疾病或健康問題?

"code": {
  "coding": [
    {
      "system": "http://hl7.org/fhir/sid/icd-10",
      "code": "I10",
      "display": "Essential (primary) hypertension"
    }
  ],
  "text": "原發性高血壓"
}

code表示Condition實際描述的疾病、症狀或健康問題。

它使用CodeableConcept,可以包含:

  • 一組或多組Coding
  • 人類可閱讀的text

範例中使用:

欄位 內容
system ICD-10代碼系統URI
code I10
display Essential (primary) hypertension
text 原發性高血壓

不同國家及醫療情境可能使用不同版本的ICD或其他臨床術語系統,不能只看到相同代碼就假設意義完全一致。


subject:這項Condition屬於誰?

"subject": {
  "reference": "Patient/patient-001",
  "display": "王小明"
}

subject表示這項Condition的對象。

一般情況下會指向Patient,也可能在特定情境中指向Group。

Condition必須和正確病人建立關係。只依靠display中的姓名並不足夠,因為可能有同名病人。

真正的連結是:

Patient/patient-001

encounter:在哪次就醫中產生?

"encounter": {
  "reference": "Encounter/encounter-001",
  "display": "2026年9月3日門診"
}

encounter表示這項Condition與哪一次就醫有關。

例如:

  • 在某次門診中記錄
  • 在急診評估時提出
  • 在住院期間確認
  • 在特定照護過程中更新

不過,Condition本身可能持續存在於Encounter結束之後。

例如:

Encounter:2026年9月3日門診,當天結束
Condition:慢性疾病,後續仍持續存在

所以Encounter的status變成finished,不代表Condition也會自動變成resolved


onset[x]:Condition從什麼時候開始?

FHIR使用onset[x]表示Condition開始出現的時間。

其中[x]代表可以使用多種資料型別。

常見形式包括:

  • onsetDateTime
  • onsetAge
  • onsetPeriod
  • onsetRange
  • onsetString

onsetDateTime

如果知道確切日期,可以使用:

"onsetDateTime": "2026-09-03"

表示Condition在2026年9月3日開始。


onsetAge

如果只知道發生時的年齡,可以使用:

"onsetAge": {
  "value": 30,
  "unit": "years",
  "system": "http://unitsofmeasure.org",
  "code": "a"
}

表示大約在30歲時開始。


onsetPeriod

如果只知道Condition在某段期間開始,可以使用:

"onsetPeriod": {
  "start": "2026-08-01",
  "end": "2026-09-03"
}

onsetString

如果來源資料只能提供文字,可以使用:

"onsetString": "大約數年前開始"

結構化日期通常較方便電腦處理,但不能為了取得結構化資料而捏造不知道的日期。


abatement[x]:Condition何時改善或解除?

abatement[x]用來表示Condition改善、消退或結束的時間。

常見形式包括:

  • abatementDateTime
  • abatementAge
  • abatementPeriod
  • abatementRange
  • abatementString

例如:

"abatementDateTime": "2026-10-01"

表示Condition在該日期解除。

abatement[x]應與clinicalStatus合理搭配。

如果Condition的狀態是:

resolved

通常可能會有相應的abatement資訊。

如果仍為:

active

卻同時記錄已經結束的日期,就需要確認資料是否一致。


recordedDate:這筆資料何時被記錄?

"recordedDate": "2026-09-03T09:15:00+08:00"

recordedDate表示這筆Condition被寫入紀錄的時間。

它和onsetDateTime不同:

欄位 意義
onsetDateTime Condition實際開始時間
recordedDate 資料被記錄的時間

例如,病人可能表示症狀在一週前開始,但今天才到醫院:

onsetDateTime:一週前
recordedDate:今天

不能把記錄日期直接當成疾病開始日期。


recorder:誰建立這筆紀錄?

"recorder": {
  "reference": "Practitioner/doctor-001",
  "display": "陳醫師"
}

recorder表示實際記錄Condition的人或角色。

它可能指向:

  • Practitioner
  • PractitionerRole
  • Patient
  • RelatedPerson

記錄資料的人不一定就是最初判斷Condition的人。


asserter:誰認為這項Condition成立?

"asserter": {
  "reference": "Practitioner/doctor-001",
  "display": "陳醫師"
}

asserter表示提出或確認這項Condition的人。

可能是:

  • 醫療人員
  • 病人本人
  • 家屬或相關人士

可以比較:

欄位 回答的問題
recorder 誰把資料記錄進系統?
asserter 誰提出或確認這項Condition?

兩者可能是同一個人,也可能不同。


evidence:支持Condition的資料

Condition可以使用evidence記錄支持這項疾病或問題的資訊。

簡化範例如下:

"evidence": [
  {
    "detail": [
      {
        "reference": "Observation/observation-001",
        "display": "相關檢驗或觀察結果"
      }
    ]
  }
]

evidence.detail可以連結相關Resource,例如:

  • Observation
  • DiagnosticReport
  • 其他臨床資料

不過,Observation和Condition仍然是不同Resource。

Observation提供觀察或檢驗結果,Condition則記錄臨床問題或診斷。


stage:疾病階段

部分Condition需要記錄疾病階段,例如特定癌症或其他具有分期概念的疾病。

FHIR可以使用stage表示:

  • 階段摘要
  • 支持分期的評估資料
  • 相關證據

簡化範例如下:

"stage": [
  {
    "summary": {
      "text": "依臨床分期記錄"
    }
  }
]

並不是所有Condition都需要stage,應依疾病性質及Profile要求使用。


note:補充說明

"note": [
  {
    "text": "虛構教學用診斷資料"
  }
]

note可以提供無法完全由其他結構化欄位表達的補充內容。

不過,重要的疾病狀態、診斷代碼及時間不應全部只放在自由文字note中,否則其他系統很難進一步搜尋及處理。


Condition和Observation有什麼不同?

這是FHIR中很容易混淆的兩種Resource。

Observation

表示觀察、測量或檢驗結果,例如:

  • 血壓120/80 mmHg
  • 體溫37.2°C
  • 血糖95 mg/dL
  • 疼痛分數3分

Condition

表示疾病、症狀、問題或診斷,例如:

  • 高血壓
  • 糖尿病
  • 肺炎
  • 頭痛

可以比較:

Resource 回答的問題
Observation 觀察或測量到什麼?
Condition 病人具有什麼健康問題或診斷?

一筆Observation結果異常,不代表系統可以自動建立Condition。診斷通常需要醫療專業判斷。


症狀一定使用Condition嗎?

不一定。

症狀的FHIR表示方式要看使用情境。

例如「頭暈」可能是:

  • 病人的就醫原因
  • Encounter的reasonCode
  • 醫師關注的健康問題
  • Condition
  • 問卷或評估結果的一部分
  • 其他臨床紀錄

FHIR Resource的選擇不只取決於文字內容,也取決於這項資料在臨床流程中的角色。


Condition和Encounter diagnosis的關係

Encounter可以透過diagnosis連結Condition:

"diagnosis": [
  {
    "condition": {
      "reference": "Condition/condition-001"
    },
    "rank": 1
  }
]

Condition本身則可以連回Encounter:

"encounter": {
  "reference": "Encounter/encounter-001"
}

兩者共同表達:

這筆Condition與這次Encounter有關,並被列為本次就醫的診斷之一。

Encounter不需要重新複製Condition的所有欄位,而是透過Reference建立關係。


Condition和AllergyIntolerance不同

藥物、食物或其他物質引起的過敏及不耐受,通常有專門的AllergyIntolerance Resource。

例如:

  • 藥物過敏
  • 食物過敏
  • 其他物質不耐受

這些資料可能包含:

  • 引發反應的物質
  • 過敏類型
  • 臨床狀態
  • 確認狀態
  • 過敏反應
  • 嚴重程度

不應因為過敏也是健康問題,就全部以一般Condition取代。Resource選擇應符合資料用途及FHIR規範。


Condition的狀態會改變

Condition不是建立後就永遠保持相同內容。

它可能經歷:

provisional
     ↓
confirmed

也可能經歷:

active
   ↓
remission
   ↓
resolved

或:

differential
      ↓
refuted

當Condition狀態改變時,系統需要更新Resource並保留適當的時間、版本及稽核資訊。

不能只修改顯示文字,卻沒有同步更新clinicalStatusverificationStatus


錯誤資料不能假裝成已解除

假設某筆Condition建立在錯誤病人身上。

這時不應將:

clinicalStatus

改成:

resolved

因為resolved表示Condition曾經存在,但目前已解除。

如果整筆資料是誤建,應使用:

verificationStatus:entered-in-error

依照系統規範表示這筆資料輸入錯誤。

正確區分「已解除」和「輸入錯誤」,對病歷可信度及病人安全非常重要。


Condition資料涉及的隱私與安全

Condition可能直接透露病人的:

  • 疾病
  • 症狀
  • 精神健康狀況
  • 傳染病資訊
  • 慢性病
  • 傷害
  • 生殖健康資訊
  • 其他敏感健康資料

因此,正式FHIR系統需要控制:

  • 誰可以讀取Condition
  • 是否與病人具有照護關係
  • 可以查看哪些Condition
  • 是否需要病人同意
  • 是否限制特定敏感資料
  • 是否留下查詢及修改紀錄
  • 是否符合資料最小化原則

FHIR提供資料結構,但不代表所有使用者都能查看所有Condition。


Condition結構整理

Condition
├── identifier:業務識別碼
├── clinicalStatus:目前臨床狀態
├── verificationStatus:確認程度
├── category:問題清單或本次就醫診斷
├── severity:嚴重程度
├── code:疾病、症狀或健康問題
├── bodySite:相關身體部位
├── subject:病人
├── encounter:相關就醫事件
├── onset[x]:開始時間
├── abatement[x]:改善或解除時間
├── recordedDate:記錄時間
├── recorder:記錄者
├── asserter:提出或確認者
├── stage:疾病階段
├── evidence:支持資料
└── note:補充說明

實際Condition不一定同時包含所有欄位,仍要依FHIR規範、Profile及臨床情境決定。


今日小結

今天認識了FHIR Condition Resource。

Condition可以表示疾病、症狀、診斷及其他健康問題。閱讀Condition時,不能只看疾病名稱,還要一起理解:

  • clinicalStatus
  • verificationStatus
  • category
  • code
  • subject
  • encounter
  • onset[x]
  • abatement[x]
  • recordedDate

其中最重要的是分清楚:

  • clinicalStatus表示疾病目前的臨床狀態。
  • verificationStatus表示診斷是否已確認。
  • Observation表示測量或觀察結果。
  • Condition表示疾病、健康問題或診斷。
  • Encounter表示一次就醫過程。

一筆異常Observation不能自動等同於Condition,而Encounter結束也不表示Condition已解除。

下一篇將介紹MedicationRequest,看看醫師開立藥物後,FHIR如何表示藥品、用藥對象、開立時間、劑量及使用方式。

明日預告

Day 24|MedicationRequest:醫師開藥後資料去哪裡?

參考資料

  1. HL7 FHIR R4:Condition
    https://hl7.org/fhir/R4/condition.html

  2. HL7 FHIR R4:Condition Definitions
    https://hl7.org/fhir/R4/condition-definitions.html

  3. HL7 FHIR R4:Observation
    https://hl7.org/fhir/R4/observation.html

  4. HL7 FHIR R4:Encounter
    https://hl7.org/fhir/R4/encounter.html

  5. HL7 FHIR R4:AllergyIntolerance
    https://hl7.org/fhir/R4/allergyintolerance.html

  6. World Health Organization:International Classification of Diseases
    https://www.who.int/standards/classifications/classification-of-diseases


上一篇
Day 22|Encounter:記錄病人的一次就醫過程
下一篇
Day 24|MedicationRequest:醫師開藥後資料去哪裡?
系列文
《醫資生的 FHIR 30日入門:用 Postman 讀懂醫療資料交換》30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言