Hướng dẫn triển khai FHIR cốt lõi Việt Nam — VN Core FHIR Implementation Guide
0.9.0 - Draft for Community Review
Hướng dẫn triển khai FHIR cốt lõi Việt Nam — VN Core FHIR Implementation Guide - Local Development build (v0.9.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions
Hướng dẫn tích hợp đầu–cuối cho một đợt điều trị nội trú: từ nhập viện → điều trị/phẫu thuật → ra viện → thanh toán BHYT. Trang minh họa phương án gửi bằng Bundle.type = transaction khi CapabilityStatement áp dụng cho máy chủ công bố hỗ trợ transaction.
Trang này là integration spec cho vendor HIS/EMR. Để xem walkthrough lâm sàng kể chuyện, đọc Tình huống lâm sàng. Để hiểu bối cảnh thiết kế (đối sánh nền tảng SATUSEHAT Indonesia), xem tài liệu phân tích nội bộ của dự án.
Ca minh họa tổng hợp xuyên suốt: Nguyễn Văn An (nam, CCCD 001085012345, BHYT loại DN 80%) nhập viện BV Chợ Rẫy ngày 10/3/2026 vì viêm ruột thừa cấp (K35.8) có giấy chuyển tuyến hợp lệ (đúng tuyến), phẫu thuật cắt ruột thừa nội soi, nằm viện 7 ngày, ra viện ổn định ngày 17/3/2026. Mọi resource trong trang là Example Instance tổng hợp, không phải hồ sơ người bệnh thật.
| Bao gồm | Không bao gồm |
|---|---|
| Nhập viện (tự đến / từ cấp cứu / chuyển tuyến), điều trị nội trú, chuyển khoa, phẫu thuật/thủ thuật, y lệnh & cấp phát thuốc nội trú, theo dõi, ra viện, thanh toán BHYT nội trú (12 nhóm chi phí + ngày giường) | KCB ngoại trú (→ Playbook Ngoại trú), tiếp nhận cấp cứu ban đầu (→ Playbook Cấp cứu), cấp phát thuốc nhà thuốc bán lẻ (→ Playbook Dược) |
Áp dụng cho mọi CSKCB có giường bệnh, hướng tới yêu cầu bệnh án điện tử theo TT 13/2025/TT-BYT (cơ sở KCB khác hoàn thành chậm nhất 31/12/2026).
| Actor / Hệ thống | Vai trò trong luồng |
|---|---|
| HIS/EMR nội trú | Chủ luồng; có thể tạo transaction Bundle khi máy chủ công bố hỗ trợ |
| Khoa lâm sàng | Ghi diễn biến, y lệnh, chuyển khoa |
| Khoa Dược (nội trú) | Cấp phát thuốc theo y lệnh |
| LIS / RIS-PACS | Trả kết quả XN / CĐHA |
| Cổng giám định BHXH | Nhận dữ liệu đầu ra KCB theo QĐ 3176/QĐ-BYT; QĐ 4210/QĐ-BYT chỉ còn dùng cho dữ liệu lịch sử/chuyển đổi |
| FHIR server quốc gia/vùng | Tiếp nhận theo các tương tác được công bố trong CapabilityStatement; áp dụng $validate khi operation được hỗ trợ |
MA_LUOT_KCB là convention cộng đồng của VN Core, chỉ giữ tương thích với MA_LK khi trao đổi BHYT.Trước khi nộp đợt nội trú, các resource sau PHẢI tồn tại/được nộp kèm:
| # | Resource | Profile | Ghi chú VN |
|---|---|---|---|
| P1 | Cơ sở + khoa/phòng | VNCoreOrganization + VNCoreOrganizationDepartment | mã cơ sở KCB; hạng/tuyến |
| P2 | Địa điểm/giường | VNCoreLocation | cây khoa→phòng→giường để ghi chuyển khoa |
| P3 | Bác sĩ điều trị | VNCorePractitioner + VNCorePractitionerRole | GPHN hiện hành; CCHN chỉ dùng cho dữ liệu lịch sử |
| P4 | Bệnh nhân | VNCorePatient | CCCD là định danh cốt lõi; VNeID chỉ dùng cho xác thực/tích hợp |
| P5 | Thẻ BHYT | VNCoreCoverage | mã số BHYT hiện hành 10 số (trùng mã số BHXH) hoặc số thẻ legacy 15 ký tự; CCCD chỉ dùng làm khóa tra cứu/xuất trình, không thuộc sid/bhyt; nơi ĐKKCB ban đầu; giấy chuyển tuyến (đúng tuyến) |
Khi máy chủ công bố hỗ trợ tương tác transaction, có thể gửi một lượt khám/đợt điều trị bằng Bundle.type = transaction. Toàn bộ resource trong transaction được áp dụng atomic: hoặc tất cả thành công, hoặc toàn bộ thay đổi được hoàn tác. Trước khi áp dụng, bên triển khai phải xác nhận transaction trong CapabilityStatement và hợp đồng tích hợp; hệ thống MAY dùng các tương tác khác đã được công bố.
Ví dụ tổng hợp: Bundle-ExampleBundleInpatientTransaction — minh họa gửi atomic toàn bộ đợt viêm ruột thừa.
| Pattern | request.method |
fullUrl |
Khi nào dùng |
|---|---|---|---|
| PUT update-as-create | PUT + request.url = "ResourceType/{id}" |
canonical URL theo id HIS gán | HIS giữ id ổn định; idempotent khi nộp lại (an toàn cho retry). Mặc định khuyến nghị. |
| POST + conditional create | POST + request.url = "ResourceType" + request.ifNoneExist = "identifier=..." |
urn:uuid:... |
Để server tự sinh id; chống trùng bằng business identifier (vd Patient theo CCCD) |
Trong ví dụ tổng hợp, dữ liệu chủ (Patient/Coverage/Practitioner/Organization) và resource lâm sàng đều dùng PUT update-as-create — đơn giản, idempotent, dễ đối soát BHXH. Tham chiếu nội bộ dùng dạng tương đối
ResourceType/{id}(hợp lệ trong transaction).
serviceProvider), toàn bộ Bundle bị từ chối → tránh dữ liệu nửa vời.Bundle.timestamp bắt buộc (dấu vết kiểm toán, NĐ 137/2024/NĐ-CP).| Bundle.type | Mục đích | Ví dụ |
|---|---|---|
| transaction | Gửi/ghi đợt điều trị lên FHIR server khi CapabilityStatement công bố hỗ trợ |
ExampleBundleInpatientTransaction |
| document | Bệnh án điện tử/Tóm tắt xuất viện bất biến (ký số) — Composition là entry[0] | ExampleBundleInpatientDischarge |
| collection | Hồ sơ thanh toán BHYT gửi cổng giám định | ExampleBHYTSubmissionInpatient |
Patient ─▶ Coverage(BHYT đúng tuyến) ─▶ Encounter(IMP, in-progress)
│ hospitalization.admitSource = chuyển tuyến
┌────────────────────────────────────┼─────────────────────────────────┐
▼ ▼ ▼
Condition(vào viện: K35.8) location[period] (chuyển khoa) Observation(theo dõi)
▼
ServiceRequest ▶ Specimen ▶ DiagnosticReport (giải phẫu bệnh)
▼
Procedure(cắt ruột thừa nội soi) + MedicationRequest(y lệnh) ▶ MedicationDispense(cấp phát)
▼
Encounter(finished + treatmentOutcome=Khỏi + dischargeDisposition=Ra viện)
▼
Composition(tóm tắt xuất viện, LOINC 18842-5)
▼
Claim(12 nhóm + 7 ngày giường) ─▶ ClaimResponse ─▶ ExplanationOfBenefit
│
└────────────────── tất cả gói trong 1 transaction Bundle ──────────────────┘
| # | Bước | Profile | Element chính | Terminology / căn cứ | Example Instance |
|---|---|---|---|---|---|
| 1 | Nhập viện | VNCoreEncounter | class=IMP, status, period.start, hospitalization.admitSource, extension[insuranceVisitType]=Đúng tuyến (legacy MA_LYDO_VVIEN=1), extension[referralMode], identifier[maLuotKcb] là convention VN Core |
QĐ 4210/QĐ-BYT cho mã legacy; identifier cộng đồng tương thích MA_LK của QĐ 3176/QĐ-BYT khi trao đổi BHYT | ExampleEncounterInpatient |
| 2 | Chẩn đoán vào viện | VNCoreConditionDiagnosis | code ICD-10 K35.8 (+ SNOMED 85189001), category=encounter-diagnosis, diagnosis.use=AD |
QĐ 4469/QĐ-BYT | ExampleConditionAppendicitis |
| 3 | Chuyển khoa (nếu có) | VNCoreEncounter.location[] |
location, period mỗi khoa, physicalType |
— | (trong Encounter) |
| 4 | Phẫu thuật/thủ thuật | VNCoreProcedure | code SNOMED 6025007 + ICD-9-CM 47.01, performedDateTime, bodySite, outcome |
TT 23/2024/TT-BYT; QĐ 387/QĐ-BYT | ExampleProcedureAppendectomy |
| 5 | Bệnh phẩm | VNCoreSpecimen | type, collection, request |
SNOMED CT VN body structure (QĐ 2427/QĐ-BYT) | ExampleSpecimenAppendixTissue |
| 6 | Kết quả GPB | VNCoreDiagnosticReportPathology | specimen (1..*), conclusion, conclusionCode |
QĐ 2493/QĐ-BYT (morphology) | ExampleDiagnosticReportPathology |
| 7 | Y lệnh thuốc | VNCoreMedicationRequest | intent=order, medicationCodeableConcept (ATC J01DD04), dosageInstruction, category=inpatient |
TT 26/2025/TT-BYT; Dược thư QG | (trong document Bundle) |
| 8 | Cấp phát thuốc | VNCoreMedicationDispense | authorizingPrescription→MedicationRequest, whenHandedOver (NGAY_CAP), quantity, performer.actor |
QĐ 3176/QĐ-BYT | ExampleMedicationDispenseInpatientAntibiotic |
| 9 | Theo dõi/sinh hiệu | VNCoreObservationVitalSigns (+ HA/mạch/SpO2…) | chuỗi theo thời gian; sinh hiệu trước ra viện | LOINC | — |
| 10 | Sử dụng thuốc thực tế | VNCoreMedicationAdministration | effective[x] (NGAY_TH_YL), request→MedicationRequest (khép chuỗi) |
QĐ 3176/QĐ-BYT; TT 13/2025/TT-BYT | ExampleMedicationAdministrationInpatient |
Mỗi Condition biểu diễn một vấn đề/chẩn đoán lâm sàng.
Condition.codecó thể chứa nhiều Coding tương đương cho cùng khái niệm, chẳng hạn một coding ICD-10 VN bắt buộc và một coding SNOMED CT; không gộp nhiều chẩn đoán khác nghĩa vào một resource. Mọi datetime có offset+07:00.
VNCoreEncounter: status = finished + period.end + extension[treatmentOutcome] (KET_QUA_DTRI — ví dụ 1 = Khỏi) + hospitalization.dischargeDisposition (MA_LOAI_RV — ví dụ 1 = Ra viện). Chẩn đoán ra viện (Condition category/diagnosis.use) phải có mặt khi đóng.
Cuối đợt, lập VNCoreComposition tóm tắt xuất viện (LOINC 18842-5 — Discharge summary) với các section chuẩn theo TT 13/2025/TT-BYT: lý do nhập viện, chẩn đoán, thủ thuật, thuốc, khám trước ra viện, tóm tắt ra viện. Đóng gói thành document Bundle (Composition là entry[0]) để ký số và lưu trữ bất biến.
Ví dụ Composition: ExampleCompositionDischargeSummary. Ví dụ document Bundle hoàn chỉnh (Composition là entry[0]): ExampleBundleInpatientDischarge.
Có thể đồng thời cập nhật Sổ Sức khỏe điện tử (VNeID) dạng VNCoreCompositionHealthRecordSummary (IPS, LOINC 60591-5) — bản tóm tắt longitudinal.
| Bước | Profile | Nội dung |
|---|---|---|
| Yêu cầu thanh toán | VNCoreClaim | type=institutional, subType=1.1 (đúng tuyến), item.category từ 12 nhóm chi phí QĐ 697/QĐ-BYT gồm ngày giường (2.2: 7 ngày × 360.000), khám, phẫu thuật (ICD-9-CM 47.01), thuốc (Ceftriaxone), thiết bị y tế. Đúng 1 thẻ BHYT focal=true. Ví dụ: ExampleClaimBHYT (tổng ~14,82 triệu VND, gồm 1,77 triệu thuốc ngoài danh mục BHYT tự trả) |
| Phản hồi | VNCoreClaimResponse | adjudication theo từng item. ExampleClaimResponseBHYT |
| Giải trình quyền lợi | VNCoreExplanationOfBenefit | mức hưởng/đồng chi trả. ExampleExplanationOfBenefitBHYT |
| Quyết toán | VNCorePaymentReconciliation | đối soát kỳ thanh toán |
| Gói gửi BHXH | VNCoreBHYTSubmissionBundle | Cầu nối dữ liệu đầu ra KCB theo QĐ 3176/QĐ-BYT; QĐ 4210/QĐ-BYT chỉ dùng cho dữ liệu lịch sử/chuyển đổi. ExampleBHYTSubmissionInpatient |
Kiểm tra ngày giường: số lượng item[category=2.2].quantity phải được tính theo quy tắc nghiệp vụ/giám định hiện hành và đối chiếu với Encounter.period. Không suy ra máy móc chỉ bằng phép trừ hai timestamp khi có ngày vào/ra không trọn ngày, chuyển khoa hoặc ngoại lệ thanh toán. Trong ca minh họa, kết quả nghiệp vụ là 7 ngày (10/3 → 17/3).
| FHIR path | ValueSet / CodeSystem | Căn cứ |
|---|---|---|
Condition.code |
ICD-10 VN | QĐ 4469/QĐ-BYT; QĐ 98/QĐ-BYT |
Procedure.code |
DVKT / ICD-9-CM VN | TT 23/2024/TT-BYT; QĐ 387/QĐ-BYT |
Encounter.extension[insuranceVisitType] |
MA_LYDO_VVIEN (legacy; mã 1–4) | QĐ 4210/QĐ-BYT; mã 5 là mở rộng dự án chờ nguồn. Hiện hành dùng MA_DOI_TUONG_KCB theo QĐ 3176/QĐ-BYT/QĐ 3276/QĐ-BYT |
Encounter.extension[treatmentOutcome] |
KET_QUA_DTRI | QĐ 3176/QĐ-BYT |
Claim.item.category |
Nhóm chi phí (12) | QĐ 697/QĐ-BYT |
Specimen body site |
SNOMED CT VN | QĐ 2427/QĐ-BYT |
Xem thêm Hướng dẫn terminology.
Checklist khi chọn phương án transaction Bundle:
Bundle.type = transaction và mỗi entry có request.method + request.url (FHIR bdl-3).class=IMP, có subject + serviceProvider + period.start + hospitalization.admitSource.code có coding ICD-10 VN bắt buộc và có thể có thêm coding tương đương, không gộp nhiều chẩn đoán khác nghĩa.authorizingPrescription (không cấp phát "mồ côi").focal=true.datetime có offset +07:00.ResourceType/{id} hoặc urn:uuid).Ví dụ OperationOutcome — Encounter thiếu serviceProvider (cả Bundle bị từ chối):
{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"required",
"details":{"text":"Encounter.serviceProvider là bắt buộc (VN-RULE-ENC-001)"},
"expression":["Bundle.entry[4].resource.serviceProvider"]}]}
Ví dụ — số ngày giường không khớp:
{"resourceType":"OperationOutcome","issue":[{"severity":"error","code":"business-rule",
"details":{"text":"Số ngày giường (item 2.2) không phù hợp quy tắc nghiệp vụ/giám định hoặc không đối chiếu được với đợt nằm viện (VN-RULE-CLM-014)"},
"expression":["Bundle.entry[11].resource.item.where(category.coding.code='2.2')"]}]}
Lỗi thường gặp:
| Lỗi | Nguyên nhân | Xử lý |
|—|—|—|
| Cả Bundle bị từ chối dù chỉ 1 resource sai | Bản chất atomic của transaction | Sửa resource lỗi, nộp lại toàn bộ |
| Tạo bản trùng khi retry | Dùng POST không có ifNoneExist | Chuyển sang PUT update-as-create hoặc thêm ifNoneExist |
| Tham chiếu không giải được | Trộn urn:uuid và id thật không nhất quán | Thống nhất 1 kiểu reference trong Bundle |
| GAP | Ảnh hưởng | Priority |
|---|---|---|
| ✅ Đã bổ sung VNCoreMedicationAdministration (khép chuỗi y lệnh → cấp phát → sử dụng) | resolved | |
| ✅ Đã bổ sung VNCoreEpisodeOfCare | resolved | |
✅ Chuyển khoa đã mô hình bằng Encounter.location[].period; diễn biến/biện luận dùng VNCoreClinicalImpression + Observation theo thời gian |
resolved (guidance) |
Ca sử dụng nội trú thuộc phạm vi gia cố cho thí điểm — xem Checklist sẵn sàng thí điểm.
| Nếu cần | Đọc tiếp |
|---|---|
| Walkthrough lâm sàng kể chuyện | Tình huống lâm sàng |
| Cơ chế nộp BHYT chi tiết | BHYT Submission |
| Kiểm tra hợp lệ | Hướng dẫn kiểm tra hợp lệ |
| Danh mục hồ sơ | Profiles |
This page is the inpatient integration playbook for VN Core. It specifies the end-to-end FHIR workflow for one inpatient stay (admission → treatment/surgery → discharge → BHYT claim). A coherent synthetic example (ExampleBundleInpatientTransaction) demonstrates the PUT update-as-create pattern in an atomic transaction Bundle when the applicable server CapabilityStatement advertises transaction support, alongside a discharge-summary document Bundle and a BHYT submission collection Bundle. The page lists prerequisites, the resource sequence, terminology bindings with Vietnamese legal basis, and a validation checklist with OperationOutcome samples.