08|與 H13 端點目錄的對照
repo 裡已有一套由互動原型推導的 REST 規格:
用戶需求/H_產品規格/H12_API共用規範.md、H13_API端點目錄.md、H14_畫面與API對照.md、_tools/openapi.yaml(59 個路徑,前綴/api/v1/icu,狀態「未經院方/FPT/DB 核定」)。 本套 FHIR 規格(00–07)是同一批作業需求的另一種介面風格。這一份逐支對照,讓兩邊的人知道「H13 的哪一支=FHIR 的哪一支」,以及 FHIR 這邊目前沒有承接、要補或要決定的地方。對照日期 2026-09-19。H13 以
_tools/openapi.yaml的 59 個路徑為準;FHIR 以openapi/openapi.yaml的 41 個 operation 為準。H13 那一套也有自己的 Swagger 頁:
實作/h13-api/swagger.html(npm run build從原檔產生,不改原檔);規格站上在/h13/。
0. 共用規範的對應(H12 → FHIR)
| H12 的規則 | FHIR 這邊怎麼做 | 出處 |
|---|---|---|
| 三層分離(L1 我方 EMR/L2 HIS 唯讀鏡像/L3 回寫 HIS) | 資源層級的 authority:Patient/Encounter/DiagnosticReport 等 L2 資源不接受 POST/PUT(422 READ-ONLY-SOURCE);L3 只有 $submit 這一條路 |
01 §1.2、03 §3.2 |
| 認證 | Authorization: Bearer <token>;正式環境 SMART on FHIR。參考實作用帳號當權杖(thucdv/nhungtt…) |
05 §5.5 |
| 錯誤格式與錯誤碼 | 一律 OperationOutcome;details.coding.code 是本院錯誤碼(61 個),issue.code 是 R4 issue-type |
05 §5.1–5.2 |
| 稽核 | 伺服器自動寫 AuditEvent(含讀取);客戶端不可建立 |
05 §5.4 |
| 冪等 | 建立用 If-None-Exist(劑次唯一靠部分唯一索引);$submit 用 idempotency_key(資源+版本) |
03 §3.5、06 §6.6 |
| 樂觀鎖 | ETag: W/"n" + If-Match;沒帶 412,過期 409 + currentVersionId |
03 §3.3 |
| 分頁 | Bundle.link[next](keyset 游標 _page),不用 OFFSET |
03 §3.4 |
| 時間格式 | ISO 8601 帶時區(+07:00),沒帶時區 422 TIMEZONE-REQUIRED |
03 §3.9 |
| 版本快照 | 每次寫入 fhir_resource_version append-only;GET …/_history/{n} 讀舊版 |
07 §7.4 |
1. 逐支對照
圖例:✅ 已有對應 🔁 用既有資源組合(前端多打一次或用 batch) ⏳ FHIR 這邊尚未承接,列入待補 🚫 依 H8 裁定不提供
1.1 作業上下文與照護名單
| H13 | 方法 | FHIR 對應 | 狀態 | 備註 |
|---|---|---|---|---|
/me |
GET | GET /Practitioner/$me |
✅ | 2026-09-20 補:回 Practitioner + PractitionerRole(職稱、科別、班別)一組 |
/shifts/current |
GET | GET /Practitioner/$me → PractitionerRole.extension[shift] |
✅ | 2026-09-20 補:班別跟人一起回,不另開端點 |
/assignments |
GET | GET /Patient/$roster |
✅ | 回 Patient(match)+CareTeam(include)+作用中醫囑筆數 |
/assignments/confirm |
POST | POST /Provenance(activity=roster-confirm) |
✅ | 確認是一筆溯源,不是 CareTeam 欄位 |
/worklist |
GET | GET /Patient/$roster + GET /Encounter?status=in-progress + GET /Flag?status=active |
🔁 | 2026-09-10 決議「全院內醫護可查閱」→ 醫護讀取不過濾(07 §7.12 更新);床位在 Encounter.location[physicalType=bd],特殊註記與嚴重度是 Flag |
1.2 病人、就醫與 ICU 照護段
| H13 | 方法 | FHIR 對應 | 狀態 | 備註 |
|---|---|---|---|---|
/patients/{id} |
GET | GET /Patient/{id} |
✅ | 監護人在 contact,健保文字在 extension[insuranceText] |
/encounters/{id} |
GET | GET /Encounter/{id} |
✅ | 主診斷 reasonCode.coding(ICD-10)、預計出院 extension[expectedDischargeDate] |
/encounters/{id}/overview |
GET | POST /(batch Bundle:Observation vital-signs、MedicationRequest active、DiagnosticReport 最新、Task) |
🔁 | 五張卡沒有單一端點;用 batch 一次打回來,或前端並行四支 |
/encounters/{id}/timeline |
GET | Encounter.location[] + GET /Procedure?patient= |
🔁 | 入科/轉床/手術都有時間 |
/episodes/{id} |
GET | Encounter.location[physicalType=wa] |
🔁 | ICU 照護段=科別那一段 location period;未另開 EpisodeOfCare |
1.3 診斷、本日問題與目標
| H13 | 方法 | FHIR 對應 | 狀態 | 備註 |
|---|---|---|---|---|
/encounters/{id}/goals |
GET/POST | GET/POST /Condition?encounter=(診斷)+ GET/POST /Goal?encounter=(本日目標) |
✅ | 2026-09-20 補:兩個資源都限醫師;診斷 ICD-10 必在目錄、代碼不可就地換、排除=verificationStatus=refuted 留版本,_history 就是「診斷演變時間軸」 |
/encounters/{id}/care-focuses |
GET/POST | Goal(description 寫照顧重點)或 Composition section |
🔁 | 原型已併入 goals;FHIR 這邊用 Goal 承接,不另開資源 |
1.4 醫囑開立
| H13 | 方法 | FHIR 對應 | 狀態 | 備註 |
|---|---|---|---|---|
/encounters/{id}/orders |
GET | GET /MedicationRequest?encounter=&_revinclude=MedicationAdministration:request + GET /ServiceRequest?encounter= |
✅ | 藥囑與檢驗檢查是兩個資源 |
/encounters/{id}/orders |
POST | POST /MedicationRequest/POST /ServiceRequest |
✅ | 建立即草稿(draft、notSent) |
/encounters/{id}/orders:batch |
POST | POST /(transaction Bundle) |
✅ | 全成功或全失敗;urn:uuid 內部引用 |
/encounters/{id}/order-cart |
GET | 草稿=MedicationRequest?status=draft&requester=me |
🔁 | 伺服器端購物車=status=draft 的醫囑,不另設資源 |
/order-cart/items |
POST | POST /MedicationRequest(draft) |
🔁 | |
/order-cart/items:batch |
POST | transaction Bundle | 🔁 | 套組展開後逐筆仍各自簽署 |
/order-cart/items/{key} |
DELETE | PUT status=cancelled(草稿) |
🔁 | 本 API 不提供 DELETE |
/orders/{id} |
GET | GET /MedicationRequest/{id}/ServiceRequest/{id} |
✅ | |
/orders/{id}/sign |
POST | POST /MedicationRequest/{id}/$sign |
✅ | 驗證病程來源、只能簽自己的草稿 |
/orders/{id}/send |
POST | POST /MedicationRequest/{id}/$submit |
✅ | 冪等;逾時→unknown、斷線→維持已簽未送 |
/order-safety/assess |
POST | — | 🚫 | H8 §4.4 裁定:院方未核定體重/年齡/腎功能規則前不顯示安全綠燈;不提供 |
1.5 品項目錄與常用
| H13 | 方法 | FHIR 對應 | 狀態 | 備註 |
|---|---|---|---|---|
/catalog/items |
GET | GET /ValueSet/{his-medication|his-service|his-route}/$expand?filter= |
✅ | 可快取一小時 |
/catalog/items/{key} |
GET | $expand?filter= 後由客戶端比對 code |
🔁 | 建議補 CodeSystem/$lookup 精確查一筆 |
/catalog/taxonomy |
GET | GET /ValueSet/order-category/$expand |
✅ | 2026-09-20 補:七分類+套組共 8 筆;院方核定前內容可換,介面不變 |
/catalog/frequencies |
GET | GET /ValueSet/frequency/$expand |
✅ | 2026-09-20 補:19 筆,六組頻率;自訂頻率仍走 Dosage.text |
/catalog/icd10 |
GET | GET /ValueSet/icd10/$expand?filter= |
✅ | 2026-09-20 補:15,994 筆(B 目錄 CSV 匯入),filter 同時比對代碼、越文、英文名 |
/catalog/routes |
GET | GET /ValueSet/his-route/$expand |
✅ | |
/favorites、/favorites/{key} |
GET/PUT | GET /List?code=favorites-personal|favorites-dept&source=、PUT /List/{id}(整份送回) |
✅ | 2026-09-20 補:品項必在目錄;個人常用只有主人能改,科常用另有 favorites-dept |
/order-sets |
GET | GET /PlanDefinition?type=order-set |
✅ | 2026-09-20 補:唯讀、status=draft,院方核准前只當介面示例 |
1.6 醫囑執行
| H13 | 方法 | FHIR 對應 | 狀態 | 備註 |
|---|---|---|---|---|
/orders/{id}/executions |
GET | GET /MedicationAdministration?request=/GET /Procedure?based-on= |
✅ | |
/orders/{id}/executions |
POST | POST /MedicationAdministration(If-None-Exist)/POST /Procedure |
✅ | 五對逐項、劑次唯一、差異原因 |
/executions/{id}/review |
POST | POST /Provenance(activity=clinical-review,target=MedicationAdministration) |
✅ | |
/orders/{id}/infusion-checks |
POST | POST /Observation(partOf=MedicationAdministration) |
✅ | INFUSION-SOURCE-REQUIRED |
1.7 生理量測與檢驗檢查
| H13 | 方法 | FHIR 對應 | 狀態 | 備註 |
|---|---|---|---|---|
/encounters/{id}/observations |
GET/POST | GET/POST /Observation?category=vital-signs |
✅ | 血壓兩個 component;缺值不補 0 |
/encounters/{id}/observations/series |
GET | GET /Observation?code=&date=ge…&_sort=date |
🔁 | 趨勢由客戶端畫 |
/encounters/{id}/lab-results |
GET | GET /DiagnosticReport?patient=&_include=DiagnosticReport:result |
✅ | 矩陣/逐項/趨勢共用 |
/encounters/{id}/reports |
GET | GET /DiagnosticReport?patient= |
✅ | |
/reports/{id} |
GET | GET /DiagnosticReport/{id} |
✅ | HIS 唯讀 |
/reports/{id}/seen |
POST | POST /Provenance(activity=clinical-review,reviewOutcome=seen) |
✅ | 已閱與判讀都是 Provenance,報告本身不動 |
/reports/{id}/processed |
POST | POST /Provenance(reviewOutcome=reviewed/difference+reviewNote) |
✅ | |
/encounters/{id}/procedures |
GET | GET /Procedure?patient= |
✅ | 手術/麻醉唯讀摘要 |
1.8 病歷撰寫與簽署
| H13 | 方法 | FHIR 對應 | 狀態 | 備註 |
|---|---|---|---|---|
/encounters/{id}/compositions |
GET/POST | GET/POST /Composition |
✅ | SOAP 四段必填;author 由權杖填 |
/encounters/{id}/notes |
POST | POST /Composition(type=nursing-note) |
🔁 | 護理自由文字也是文件 |
/compositions/previous-progress |
GET | GET /Composition?type=11506-3&author=me&status=final&_sort=-date&_count=1 |
✅ | 複製前一日病程;複製軌跡放 relatesTo/section 引用 |
/encounters/{id}/writer-sources |
GET | batch:Observation、DiagnosticReport、MedicationRequest active | 🔁 | 側欄帶入來源 |
/compositions/{id} |
GET | GET /Composition/{id} |
✅ | section.entry 一律帶版本 |
/compositions/{id}/sign |
POST | POST /Composition/{id}/$sign |
✅ | |
/compositions/{id}/amend |
POST | POST /Composition(relatesTo.replaces + extension[amendReason]) |
✅ | 留痕更正=新文件,舊版不動 |
/education-sets |
GET | GET /PlanDefinition?type=education-set |
✅ | 2026-09-20 補:與套組同一資源,type 區分 |
/drafts/{kind} |
GET/PUT/DELETE | Composition status=preliminary |
🔁 | 草稿就是未簽署的文件;不另設 draft 儲存 |
1.9 照會、必要溝通、工作、交班、稽核
| H13 | 方法 | FHIR 對應 | 狀態 | 備註 |
|---|---|---|---|---|
/encounters/{id}/consultations |
GET/POST | GET/POST /ServiceRequest?category=consultation |
✅ | 照會醫師的病人範圍由照會單決定 |
/consultations/{id}/response |
POST | POST /Communication(category=consult-reply,basedOn=ServiceRequest) |
✅ | 2026-09-20 補:必須指向照會單;照會醫師可回覆,但不能寫必要溝通;只新增不修改 |
/encounters/{id}/communications |
GET/POST | GET/POST /Communication?encounter=&category=essential |
✅ | 2026-09-20 補:醫護都能寫,說過的話不能改(PUT → SIGNED-IMMUTABLE) |
/tasks |
GET/POST | GET/POST /Task |
✅ | |
/tasks/{id} |
PATCH | PUT /Task/{id}(If-Match) |
✅ | 結案要證據;來源報告要已判讀 |
/handovers |
GET/POST | GET/POST /Composition?type=handover-sbar |
✅ | S/B/A/R 必填、指定接班者 |
/handovers/{id}/receipts |
POST | POST /Composition/{id}/$receive |
✅ | 同交易內轉移 Task.owner |
/audit-events |
GET | GET /AuditEvent |
✅ | 讀取也有紀錄 |
2. 統計
| 數量 | |
|---|---|
| H13 路徑 | 59 |
| ✅ 一對一有對應 | 44(2026-09-19 是 33) |
| 🔁 用既有資源組合 | 14(2026-09-19 是 13) |
| ⏳ FHIR 尚未承接(要決定資源) | 0(2026-09-19 是 12) |
| 🚫 依裁定不提供 | 1 |
3. 待補清單 → 2026-09-20 已全部補上
2026-09-19 列的六項,2026-09-20 都補進 FHIR 這一套(規格 02 §2.9a/§2.11a、參考實作、Swagger 範例、test/new-resources.test.js、流程導覽第六章):
| 原順位 | 補什麼 | 補成什麼 | H13 那邊 |
|---|---|---|---|
| 1 | Condition/Goal(診斷、本日問題與目標、診斷演變) | Condition(category 入院/入科/出院/問題;diagnosisRole/diagnosisEvidence;排除留版本)+ Goal(goalEncounter) |
仍只有 /encounters/{id}/goals,缺診斷與歷程(09 §3 #9) |
| 2 | Communication(照會回覆、必要溝通) | Communication(consult-reply 要 basedOn 照會單;essential 醫護可寫;只新增) |
有 /consultations/{id}/response、/communications,缺按病人/類別查與單筆讀(09 §3 #11) |
| 3 | Practitioner/$me+值班 |
GET /Practitioner/$me 回 Practitioner + PractitionerRole(職稱、科別、extension[shift]);另有 Practitioner 搜尋/讀取 |
有 /me、/shifts/current,缺職稱/科別與找人(09 §3 #10) |
| 4 | ICD-10 ValueSet | ValueSet/icd10(15,994 筆,CSV 匯入,filter 比對代碼/越文/英文) |
有 /catalog/icd10 |
| 5 | List/PlanDefinition | List(favorites-personal/favorites-dept,整份 PUT,品項必在目錄)+ PlanDefinition(order-set/education-set,唯讀 draft) |
有 /favorites、/order-sets、/education-sets;缺科常用(09 §3 #12) |
| 6 | 頻率 ValueSet、七分類映射 | ValueSet/frequency(19)+ ValueSet/order-category(8) |
有 /catalog/frequencies、/catalog/taxonomy |
還沒承接的只剩「值班表」本身(誰今天上哪一班的排班維護):本套只回目前登入者的班別,排班仍由 HIS/人事系統維護。
4. 追溯方式
- H14 的「畫面 × 端點」矩陣可以照本表的第三欄換成 FHIR 路徑,S/N 代碼與需求 ID(R-xxx)不變。
- 參考實作(
實作/fhir-server)的GET /metadata列出實際做得到的資源與操作,是本表 ✅ 欄的機器可讀版本。