# 情境三:跨院病歷整合管理系統
## 2.1 主題
**跨院病歷整合管理系統(Cross-Hospital Record Administration and Synchronization System)**
> 管理員透過中央 FHIR 平台監控並整合不同醫院的病歷資料(Patient),
> 使用 `Person` 建立唯一身份索引,確保資料正確對應並維持系統同步狀態。
> 系統支援審核、授權、資料一致性檢查、以及異常警示。
---
## 2.2 應用情境(User Story)
**主要參與者:** 系統管理員、醫院資訊部門(HIS 管理員)、FHIR 中央伺服器(Central FHIR Server)
**使用者故事:**
> 作為一名系統管理員,我希望能在中央平台上整合與管理來自多家醫院的病歷資料,
> 並確保所有 `Patient` 都正確連結至唯一的 `Person` 身份,避免重複登錄或錯誤配對。
>
> 當新醫院加入、病歷更新或異常發生時,我能即時檢視同步狀態、修正連結、或停用不活躍帳號,
> 以維持跨院資料的完整性與一致性。
---
## 2.3 系統流程與 CRUD 對應
| 流程階段 | 管理員操作說明 | CRUD 類型 | 使用的 FHIR 資源 |
| ------------- | ------------------------------------------------ | -------------------------- | --------------------------------- |
| (1) 醫院註冊與授權 | 管理員建立 `Organization` 並核發授權金鑰,允許其上傳病歷資料。 | **C(Create)** | `Organization`, `Practitioner` |
| (2) 身分驗證與資料整合 | 管理員審核新上傳的 `Patient` 資料,並建立或連結對應的 `Person`。 | **C / U(Create / Update)** | `Person`, `Patient` |
| (3) 資料查詢與稽核 | 管理員可查詢各醫院同步狀況、資料異常、重複紀錄與更新歷程。 | **R(Read)** | `Patient`, `Person`, `AuditEvent` |
| (4) 資料修正與同步 | 管理員可手動修正 `Person.link` 或 `Patient.link`,確保跨院一致性。 | **U(Update)** | `Person`, `Patient` |
| (5) 停用或封存資料 | 若發現重複或不合法紀錄,管理員可標記為不活躍狀態。 | **D(Deactivate)** | `Patient`, `Person` |
---
## 2.4 使用的 FHIR 資源
| 資源名稱 | 主要欄位 | 說明 |
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------ | ------------------- |
| **Person** | `identifier`, `name`, `gender`, `birthDate`, `link`, `active` | 作為中央身分索引,統一連結多院病歷 |
| **Patient** | `identifier`, `name`, `gender`, `birthDate`, `managingOrganization`, `generalPractitioner`, `link`, `active` | 來自各醫院的個別病歷資料 |
| **Organization** | `id`, `name`, `address`, `type`, `telecom` | 醫療機構資訊與授權來源 |
| **Observation** | `code`, `valueQuantity`, `effectiveDateTime`, `subject` | 管理員可查閱同步的病人觀察資料 |
| **AuditEvent** | `action`, `recorded`, `agent`, `entity`, `outcome` | 系統稽核事件(登入、修改、資料異常等) |
| **Link (Person.link / Patient.link)** | `other`, `type` | 管理員可用於修正或建立跨院關聯 |
---
## 2.5 範例程式碼(FHIR Person、Patient、Observation、Organization)
### ✅ (1) 管理員建立醫院組織(Organization)
```python
import requests
org = {
"resourceType": "Organization",
"id": "hospitalA",
"name": "台北醫學中心",
"type": [{"text": "Hospital"}],
"address": [{"city": "台北市", "line": ["仁愛路三段"]}],
"telecom": [{"system": "phone", "value": "02-12345678"}]
}
res = requests.post("http://central.fhir.server/Organization", json=org)
print(res.status_code)
```
---
### ✅ (2) 管理員建立 Person(中央身分索引)
```python
person = {
"resourceType": "Person",
"identifier": [{"system": "http://national-id.tw", "value": "A123456789"}],
"name": [{"use": "official", "family": "林", "given": ["小華"]}],
"gender": "female",
"birthDate": "1985-06-10",
"active": True
}
res = requests.post("http://central.fhir.server/Person", json=person)
print(res.status_code)
```
---
### ✅ (3) 管理員連結多院病人(Person.link)
```python
link_update = {
"resourceType": "Person",
"id": "12345",
"link": [
{"target": {"reference": "Patient/HOSP-A-123"}},
{"target": {"reference": "Patient/HOSP-B-456"}}
]
}
res = requests.put("http://central.fhir.server/Person/12345", json=link_update)
print(res.status_code)
```
---
### ✅ (4) 稽核紀錄查詢(AuditEvent)
```python
audit_query = "http://central.fhir.server/AuditEvent?_sort=-recorded&_count=10"
result = requests.get(audit_query).json()
for entry in result["entry"]:
e = entry["resource"]
print(f"[{e['recorded']}] {e['action']} by {e['agent'][0]['who']['display']}")
```
---
### ✅ (5) 停用不活躍病歷
```python
deactivate = {
"resourceType": "Patient",
"id": "HOSP-A-123",
"active": False
}
requests.put("http://central.fhir.server/Patient/HOSP-A-123", json=deactivate)
```
---
## 2.6 延伸應用
1. **跨院資料稽核平台**:管理員可視覺化監控各醫院上傳頻率、異常狀況、同步延遲等。
2. **角色權限管理**:區分醫師、護理師、行政人員、資料管理者不同權限層級。
3. **自動比對重複資料**:利用姓名、身分證字號、生日自動比對重複的 `Patient`,自動建立或提示 `Person.link`。
4. **FHIR Subscription 通知**:當新醫院上傳病歷或異常發生時,系統自動通知管理員。
5. **AI 驗證輔助**:可利用 NLP 模型檢測跨院紀錄中可能的資料不一致性。