在上一篇文章中,我們認識了Encounter Resource。
Encounter用來表示一次門診、急診或住院等就醫過程,而病人在這次就醫中被記錄的疾病、問題或診斷,則可能使用Condition Resource表示。
例如,王小明因為頭暈到醫院看診:
這些資料彼此相關,但代表的概念不同,不能全部放進同一個Resource。
今天不進行實際操作,而是透過一筆虛構Condition,認識FHIR如何表示疾病、健康問題及診斷。
本文中的病人、診斷及時間均為虛構教學範例,不可作為任何人的疾病判斷或醫療建議。
Condition可以用來表示與病人健康有關的狀況,例如:
Condition通常會回答:
看到Condition時,不能直接認定病人一定罹患某項疾病。
Condition也可能記錄:
因此,閱讀Condition時,不能只看code,還要同時查看:
clinicalStatus
verificationStatus
category
onset[x]
abatement[x]
以下是一份簡化的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": "Condition",
"id": "condition-001"
resourceType表示這是一筆Condition Resource。
id則是Condition在FHIR Server中的邏輯識別碼。
它的邏輯位置可能是:
Condition/condition-001
Encounter或其他Resource可以透過Reference連結這筆Condition。
"identifier": [
{
"system": "https://hospital.example.org/condition-number",
"value": "C0001"
}
]
identifier可以表示醫療機構實務上替這筆疾病或問題紀錄建立的編號。
可以比較:
| 欄位 | 用途 |
|---|---|
id |
FHIR Server中的Resource識別碼 |
identifier |
醫療或行政流程使用的業務識別碼 |
不是每一筆Condition都一定需要業務編號,是否使用應依系統及Profile要求決定。
"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
表示Condition目前仍然存在或持續受到關注。
resolved
表示Condition已經解除。
不過,Condition是否已解除,需要依照醫療專業判斷及資料來源決定,不能只因為病人目前沒有症狀就自行改成resolved。
clinicalStatus回答的是:
這項Condition現在處於什麼臨床狀態?
它不負責回答:
這項診斷是否已經被確認?
診斷是否確認,要查看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 |
誤輸入 |
表示目前暫定使用的診斷,未來仍可能因檢查結果或臨床變化而調整。
表示列入鑑別診斷,也就是醫療人員正在考慮的可能疾病之一。
它們都不等於confirmed。
因此,如果Condition的code寫著某種疾病,但verificationStatus是:
differential
就不能直接把它解讀成病人已經確診。
refuted
表示這項疾病或問題曾經被考慮,但後續已被排除。
entered-in-error
表示這筆Condition本身是誤建或錯誤輸入。
兩者差異是:
| 狀態 | 意義 |
|---|---|
refuted |
曾合理考慮過,但後續被排除 |
entered-in-error |
這筆紀錄不應被建立 |
如果是誤輸入資料,不應只將clinicalStatus改成resolved,因為「疾病已解除」和「資料一開始就是錯的」是不同概念。
| 欄位 | 回答的問題 | 範例 |
|---|---|---|
clinicalStatus |
疾病現在處於什麼狀態? | active、resolved |
verificationStatus |
診斷是否已確認? | provisional、confirmed |
例如:
clinicalStatus:active
verificationStatus:confirmed
clinicalStatus:active
verificationStatus:differential
verificationStatus:refuted
閱讀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 |
本次就醫診斷 |
表示這項Condition被放在病人的健康問題清單中,可能跨越多次就醫持續追蹤。
例如:
表示這項Condition是某次Encounter中的診斷。
例如:
同一項疾病可能同時和問題清單及特定就醫有關,實際表示方式要依Profile及業務規則決定。
"severity": {
"text": "依臨床評估記錄"
}
severity用來記錄Condition的嚴重程度。
例如可能表達:
不過,嚴重程度不能由系統只看疾病名稱後自動推測,也不一定適用於所有Condition。
實際使用時應選擇適當的標準代碼,並依照臨床評估及Profile要求記錄。
"code": {
"coding": [
{
"system": "http://hl7.org/fhir/sid/icd-10",
"code": "I10",
"display": "Essential (primary) hypertension"
}
],
"text": "原發性高血壓"
}
code表示Condition實際描述的疾病、症狀或健康問題。
它使用CodeableConcept,可以包含:
text
範例中使用:
| 欄位 | 內容 |
|---|---|
system |
ICD-10代碼系統URI |
code |
I10 |
display |
Essential (primary) hypertension |
text |
原發性高血壓 |
不同國家及醫療情境可能使用不同版本的ICD或其他臨床術語系統,不能只看到相同代碼就假設意義完全一致。
"subject": {
"reference": "Patient/patient-001",
"display": "王小明"
}
subject表示這項Condition的對象。
一般情況下會指向Patient,也可能在特定情境中指向Group。
Condition必須和正確病人建立關係。只依靠display中的姓名並不足夠,因為可能有同名病人。
真正的連結是:
Patient/patient-001
"encounter": {
"reference": "Encounter/encounter-001",
"display": "2026年9月3日門診"
}
encounter表示這項Condition與哪一次就醫有關。
例如:
不過,Condition本身可能持續存在於Encounter結束之後。
例如:
Encounter:2026年9月3日門診,當天結束
Condition:慢性疾病,後續仍持續存在
所以Encounter的status變成finished,不代表Condition也會自動變成resolved。
FHIR使用onset[x]表示Condition開始出現的時間。
其中[x]代表可以使用多種資料型別。
常見形式包括:
onsetDateTime
onsetAge
onsetPeriod
onsetRange
onsetString
如果知道確切日期,可以使用:
"onsetDateTime": "2026-09-03"
表示Condition在2026年9月3日開始。
如果只知道發生時的年齡,可以使用:
"onsetAge": {
"value": 30,
"unit": "years",
"system": "http://unitsofmeasure.org",
"code": "a"
}
表示大約在30歲時開始。
如果只知道Condition在某段期間開始,可以使用:
"onsetPeriod": {
"start": "2026-08-01",
"end": "2026-09-03"
}
如果來源資料只能提供文字,可以使用:
"onsetString": "大約數年前開始"
結構化日期通常較方便電腦處理,但不能為了取得結構化資料而捏造不知道的日期。
abatement[x]用來表示Condition改善、消退或結束的時間。
常見形式包括:
abatementDateTime
abatementAge
abatementPeriod
abatementRange
abatementString
例如:
"abatementDateTime": "2026-10-01"
表示Condition在該日期解除。
abatement[x]應與clinicalStatus合理搭配。
如果Condition的狀態是:
resolved
通常可能會有相應的abatement資訊。
如果仍為:
active
卻同時記錄已經結束的日期,就需要確認資料是否一致。
"recordedDate": "2026-09-03T09:15:00+08:00"
recordedDate表示這筆Condition被寫入紀錄的時間。
它和onsetDateTime不同:
| 欄位 | 意義 |
|---|---|
onsetDateTime |
Condition實際開始時間 |
recordedDate |
資料被記錄的時間 |
例如,病人可能表示症狀在一週前開始,但今天才到醫院:
onsetDateTime:一週前
recordedDate:今天
不能把記錄日期直接當成疾病開始日期。
"recorder": {
"reference": "Practitioner/doctor-001",
"display": "陳醫師"
}
recorder表示實際記錄Condition的人或角色。
它可能指向:
記錄資料的人不一定就是最初判斷Condition的人。
"asserter": {
"reference": "Practitioner/doctor-001",
"display": "陳醫師"
}
asserter表示提出或確認這項Condition的人。
可能是:
可以比較:
| 欄位 | 回答的問題 |
|---|---|
recorder |
誰把資料記錄進系統? |
asserter |
誰提出或確認這項Condition? |
兩者可能是同一個人,也可能不同。
Condition可以使用evidence記錄支持這項疾病或問題的資訊。
簡化範例如下:
"evidence": [
{
"detail": [
{
"reference": "Observation/observation-001",
"display": "相關檢驗或觀察結果"
}
]
}
]
evidence.detail可以連結相關Resource,例如:
不過,Observation和Condition仍然是不同Resource。
Observation提供觀察或檢驗結果,Condition則記錄臨床問題或診斷。
部分Condition需要記錄疾病階段,例如特定癌症或其他具有分期概念的疾病。
FHIR可以使用stage表示:
簡化範例如下:
"stage": [
{
"summary": {
"text": "依臨床分期記錄"
}
}
]
並不是所有Condition都需要stage,應依疾病性質及Profile要求使用。
"note": [
{
"text": "虛構教學用診斷資料"
}
]
note可以提供無法完全由其他結構化欄位表達的補充內容。
不過,重要的疾病狀態、診斷代碼及時間不應全部只放在自由文字note中,否則其他系統很難進一步搜尋及處理。
這是FHIR中很容易混淆的兩種Resource。
表示觀察、測量或檢驗結果,例如:
表示疾病、症狀、問題或診斷,例如:
可以比較:
| Resource | 回答的問題 |
|---|---|
| Observation | 觀察或測量到什麼? |
| Condition | 病人具有什麼健康問題或診斷? |
一筆Observation結果異常,不代表系統可以自動建立Condition。診斷通常需要醫療專業判斷。
不一定。
症狀的FHIR表示方式要看使用情境。
例如「頭暈」可能是:
reasonCode
FHIR Resource的選擇不只取決於文字內容,也取決於這項資料在臨床流程中的角色。
Encounter可以透過diagnosis連結Condition:
"diagnosis": [
{
"condition": {
"reference": "Condition/condition-001"
},
"rank": 1
}
]
Condition本身則可以連回Encounter:
"encounter": {
"reference": "Encounter/encounter-001"
}
兩者共同表達:
這筆Condition與這次Encounter有關,並被列為本次就醫的診斷之一。
Encounter不需要重新複製Condition的所有欄位,而是透過Reference建立關係。
藥物、食物或其他物質引起的過敏及不耐受,通常有專門的AllergyIntolerance Resource。
例如:
這些資料可能包含:
不應因為過敏也是健康問題,就全部以一般Condition取代。Resource選擇應符合資料用途及FHIR規範。
Condition不是建立後就永遠保持相同內容。
它可能經歷:
provisional
↓
confirmed
也可能經歷:
active
↓
remission
↓
resolved
或:
differential
↓
refuted
當Condition狀態改變時,系統需要更新Resource並保留適當的時間、版本及稽核資訊。
不能只修改顯示文字,卻沒有同步更新clinicalStatus或verificationStatus。
假設某筆Condition建立在錯誤病人身上。
這時不應將:
clinicalStatus
改成:
resolved
因為resolved表示Condition曾經存在,但目前已解除。
如果整筆資料是誤建,應使用:
verificationStatus:entered-in-error
依照系統規範表示這筆資料輸入錯誤。
正確區分「已解除」和「輸入錯誤」,對病歷可信度及病人安全非常重要。
Condition可能直接透露病人的:
因此,正式FHIR系統需要控制:
FHIR提供資料結構,但不代表所有使用者都能查看所有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:醫師開藥後資料去哪裡?
HL7 FHIR R4:Condition
https://hl7.org/fhir/R4/condition.html
HL7 FHIR R4:Condition Definitions
https://hl7.org/fhir/R4/condition-definitions.html
HL7 FHIR R4:Observation
https://hl7.org/fhir/R4/observation.html
HL7 FHIR R4:Encounter
https://hl7.org/fhir/R4/encounter.html
HL7 FHIR R4:AllergyIntolerance
https://hl7.org/fhir/R4/allergyintolerance.html
World Health Organization:International Classification of Diseases
https://www.who.int/standards/classifications/classification-of-diseases