Hướng dẫn triển khai FHIR cốt lõi Việt Nam — VN Core FHIR Implementation Guide
0.10.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 - Draft for Community Review (v0.10.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions
Chiến lược ổn định hoá VN Core bao gồm mô hình mức độ trưởng thành cho tài nguyên, ranh giới giữa VN Core Base, lớp liên thông hồ sơ thanh toán BHYT (BHYT Submission), các gói thuật ngữ và gói thiết bị y tế, cùng các yêu cầu tuân thủ mức cơ sở theo từng vai trò triển khai.
Từ phiên bản 0.3.0, dự án ưu tiên ổn định lõi trước khi mở rộng phạm vi. Điều này giúp giảm thay đổi phá vỡ tương thích, thuận lợi hơn cho giai đoạn thí điểm của HIS/EMR, và giữ được nhịp cập nhật pháp lý nhanh của lớp BHYT mà không làm rung toàn bộ lõi.
Ưu tiên trước thí điểm: Trước khi mở rộng triển khai, VN Core ưu tiên kiểm thử quản trị dữ liệu, định danh theo CCCD, EMR/HSSK, đồng bộ BHYT, lớp ứng dụng người dân và tích hợp, LGSP/API facade và nền tảng an toàn.
VN Core Base, lớp BHYT Submission và các gói thuật ngữ phải được tách logic rõ ràng.| Lớp | Mục tiêu | Tài nguyên tiêu biểu | Nhịp thay đổi |
|---|---|---|---|
VN Core Base |
Liên thông nội bộ FHIR-native cho EMR, HIE, hồ sơ công dân | Patient, RelatedPerson, Encounter, Coverage, DocumentReference, Consent, AuditEvent, Provenance, thuật ngữ nền tảng |
Chậm hơn, ưu tiên ổn định |
BHYT Submission |
Lớp liên thông hồ sơ thanh toán BHYT ở tầng ánh xạ/cổng | VNCoreBHYTSubmissionBundle, 16 logical models (Check-in + XML1–XML15), 3 operations ($validate-bhyt-claim, $submit-bhyt-claim, $reverse-bhyt-claim), MA_LK |
Nhanh hơn, theo quy định BHXH/BYT |
Terminology Clinical |
Quản trị thuật ngữ lâm sàng quy mô lớn | ICD-10 VN, ICD-9-CM, tập con SNOMED CT VN, CLS, LOINC, ConceptMap | Theo từng đợt cập nhật thuật ngữ |
Terminology Traditional Medicine |
Quản trị thuật ngữ Y học cổ truyền | 11 CodeSystem + 11 ValueSet Y học cổ truyền | Theo từng đợt cập nhật chuyên môn |
Device |
Quản trị danh pháp và gói mở rộng thiết bị y tế | VNMedicalDeviceNomenclatureCS, VNMedicalDeviceNomenclatureVS, VNDeviceTypeVS, profile thiết bị mở rộng sau này |
Theo văn bản danh pháp/quản lý pháp quy và thí điểm thiết bị |
Hệ quả thiết kế:
Patient, Coverage, Claim vẫn là tài nguyên FHIR-native.SO_CCCD, MA_LK, yyyyMMddHHmm được gia cố ở lớp liên thông hồ sơ thanh toán BHYT và các tập lệnh kiểm tra tuân thủ.BHYT Submission trước; chỉ đổi Base nếu thực sự ảnh hưởng ngữ nghĩa cốt lõi.LGSP/API facade, tái sử dụng dữ liệu và ma trận vai trò/bộ dữ liệu nằm ở lớp diễn giải/tuân thủ, không đẩy thẳng vào cardinality của tài nguyên lõi nếu chưa có căn cứ ngữ nghĩa đủ mạnh.Từ 0.3.0, repo vẫn được biên soạn bằng một dự án SUSHI dạng monorepo, nhưng pipeline phát hành đã có thể sinh 8 gói mô-đun và 1 gói tổng hợp:
| Gói | Mục đích | Script |
|---|---|---|
hl7.fhir.vn.core |
Gói tổng hợp cho kiểm tra cục bộ và cài đặt trọn bộ | python3 scripts/build-split-packages.py |
hl7.fhir.vn.core.base |
Gói ổn định cho liên thông FHIR-native | python3 scripts/build-split-packages.py |
hl7.fhir.vn.bhyt.submission |
Gói bundle/logical model/operation cho liên thông hồ sơ BHYT, phụ thuộc hl7.fhir.vn.core.base |
python3 scripts/build-split-packages.py |
hl7.fhir.vn.terminology.clinical |
Gói thuật ngữ lâm sàng quy mô lớn | python3 scripts/build-split-packages.py |
hl7.fhir.vn.terminology.traditional-medicine |
Gói thuật ngữ Y học cổ truyền | python3 scripts/build-split-packages.py |
hl7.fhir.vn.device |
Gói mở rộng thiết bị y tế, trước mắt chứa danh pháp QĐ-3107 + QĐ-847 | python3 scripts/build-split-packages.py |
Điểm này cho phép tách nhịp phát hành ở mức gói tiêu thụ mà không phải nhân đôi nguồn biên soạn. Ở trạng thái hiện tại, cả 9 gói (8 mô-đun + gói tổng hợp) đã được dựng; trước khi kênh mirror bên ngoài hoàn tất, kiểm tra cục bộ vẫn nên ưu tiên hl7.fhir.vn.core hoặc truyền đồng thời nhiều -ig.
| Mức | Tiêu chí | Tài nguyên hiện tại |
|---|---|---|
| Ứng viên ổn định | Có profile rõ, ví dụ tốt, tìm kiếm/định danh phù hợp, kiểm tra validation/Tier 2 đã có | VNCorePatient, VNCoreRelatedPerson, VNCoreAddress, VNCoreOrganization, VNCoreEncounter, VNCoreCoverage, VNCoreClaim, VNCoreConsent, VNCoreAuditEvent, VNCoreProvenance |
| Thử nghiệm áp dụng | Đã dùng được nhưng còn phụ thuộc phản hồi và thí điểm | VNCoreComposition, VNCoreDocumentReference, VNCoreClaimResponse, VNCoreExplanationOfBenefit, VNCoreDevice, VNCoreImplantableDevice, VNCoreDeviceUseStatement, VNCoreOrganizationDepartment, VNCoreMedicationDispense, VNCoreImagingStudy, VNCoreDiagnosticReportLab, VNCoreDiagnosticReportImaging, VNCoreDiagnosticReportPathology, các logical model BHYT |
| Thực nghiệm | Chưa nên coi là mức cơ sở quốc gia, còn chờ ca sử dụng rộng hơn | luồng ePrescription, Bulk Data, nhắn tin nâng cao, ánh xạ trao đổi dữ liệu xuyên biên giới |
| Artifact | Mức trưởng thành | Ghi chú MS / phạm vi thay đổi |
|---|---|---|
| VNCorePaymentReconciliation | Thử nghiệm áp dụng (từ v0.5) | Profile mới cho biên bản quyết toán/thanh toán BHYT 06/BH; giữ PaymentReconciliation.outcome chuẩn FHIR và dùng claimAuditStatus cho vòng đời giám định nội địa |
| VNCoreEndpointBHYT | Thử nghiệm áp dụng (từ v0.5) | Profile endpoint cổng gdbhyt cho gửi/tra cứu hồ sơ BHYT; dùng ở gateway/facade, không kéo vào core clinical ngữ nghĩa |
| VNCoreHealthcareService | Thử nghiệm áp dụng (từ v0.5) | Profile dịch vụ y tế, nhất là TYT cấp xã/phường/đặc khu; type extensible với VNHealthcareServiceTypeVS |
| VNCoreCompositionBreachNotification | Thử nghiệm áp dụng (từ v0.5) | Composition có cấu trúc cho Mẫu 08 NĐ 356/2025/NĐ-CP; có section bắt buộc và attester legal warning |
| VNCoreExtLegalBasis | Thử nghiệm áp dụng (từ v0.5) | Extension căn cứ pháp lý có cấu trúc cho artifact/element, dùng VNLegalDocumentRefCS để giảm lệch citation |
| VNCoreExtDeviceRegistrationNumber | Thử nghiệm áp dụng (từ v0.5) | Số lưu hành thiết bị y tế; Must Support trong implantable device C/D ở mức warning để không chặn dữ liệu legacy |
| VNCoreExtClaimAuditStatus | Thử nghiệm áp dụng (từ v0.5) | Trạng thái giám định BHYT cho PaymentReconciliation, Task, ClaimResponse |
| VNCoreOrganizationDepartment | Thử nghiệm áp dụng (từ v0.4) | Profile khoa/phòng với partOf bắt buộc, phân loại khoa tại type[deptClass] và mã cục bộ tại identifier[localCode] |
| VNCoreMedicationDispense | Thử nghiệm áp dụng (từ v0.4) | Profile mới cho cấp phát thuốc, nối chuỗi MedicationRequest → MedicationDispense → Claim/EOB |
| VNCoreImagingStudy | Thử nghiệm áp dụng (từ v0.4) | Profile mới cho DICOM/RIS/PACS siêu dữ liệu và CĐHA |
| VNCoreDiagnosticReportLab | Thử nghiệm áp dụng (từ v0.4) | Sub-profile lab từ parent DiagnosticReport |
| VNCoreDiagnosticReportImaging | Thử nghiệm áp dụng (từ v0.4) | Sub-profile CĐHA, có imagingStudy reference và nhóm chi phí 4 |
| VNCoreDiagnosticReportPathology | Thử nghiệm áp dụng (từ v0.4) | Sub-profile GPB, specimen bắt buộc và conclusionCode extensible |
| VNCoreDevice | Thử nghiệm áp dụng (từ v0.4 (re-classified)) | Update major: mở rộng Must Support từ 2 MS lên 12+ MS, thêm identifier slicing, UDI và vòng đời; deviceGroup chỉ phương án dự phòng vì dữ liệu thanh toán TBYT ưu tiên ở Claim.item; type được relax về 0..1 MS để tránh reject dữ liệu legacy/BHYT |
| VNCoreImplantableDevice | Thử nghiệm áp dụng (từ v0.4) | Profile con patient-bound cho thiết bị cấy ghép; patient/type/status 1..1, UDI/vòng đời/safety MS, không hard mandate UDI toàn Core |
| VNCoreExtDeviceGroup | Thử nghiệm áp dụng (từ v0.4) | Extension cho nhóm TBYT BHYT N01-N09; Claim.item preferred, Device phương án dự phòng |
scripts/validate.sh hoặc scripts/validate-tier2.shChi tiết quản trị công bố công khai, phân loại thay đổi và ngưỡng phát hành tối thiểu đã được tách sang trang Phát hành và quản trị. Phần dưới đây giữ vai trò tóm tắt ở mức tuân thủ.
| Loại thay đổi | Cách versioning | Ví dụ |
|---|---|---|
| Phá vỡ tương thích | Bản phát hành phụ/chính có ghi chú chuyển đổi bắt buộc | Đổi URL tài nguyên, đổi cardinality bắt buộc, đổi binding làm dữ liệu cũ không còn hợp lệ |
| Bổ sung | Bản phát hành phụ | Thêm profile, search parameter, ví dụ, operation, mã mới đang hiệu lực |
| Bản vá/ổn định hoá | Bản vá | Sửa ví dụ, script validation, tài liệu, CapabilityStatement theo từng vai trò triển khai |
deprecated trước.Ma trận đọc theo vai trò triển khai, gói tiêu thụ, checklist sẵn sàng thí điểm và tiêu chí tối thiểu cho từng vai trò đã được tách sang Tuân thủ theo vai trò triển khai. Phần dưới đây chỉ giữ vai trò tóm tắt các CapabilityStatement đang được công bố.
VN Core hiện công bố 10 CapabilityStatement. Năm bản chính:
| CapabilityStatement | Vai trò | Dùng khi nào |
|---|---|---|
VNCoreServer |
Mức cơ sở chung | Tổng quan tối thiểu cho một máy chủ FHIR tuân thủ VN Core |
VNCoreEMRServer |
EMR/EHR nội bộ | Bệnh viện, HIS/EMR, kho dữ liệu lâm sàng nội bộ |
VNBHYTGatewayClient |
Client gửi hồ sơ thanh toán BHYT | Middleware/HIS gửi hồ sơ thanh toán BHYT |
VNBHYTGatewayServer |
Server tiếp nhận hồ sơ thanh toán BHYT | Facade/adapter tiếp nhận hồ sơ thanh toán BHYT |
VNCitizenAppClient |
Ứng dụng người dân/kết nối VNeID | Cổng bệnh nhân, ứng dụng di động, cổng công dân |
Năm bản chuyên biệt còn lại: VNCoreDataResponder và VNCoreDataRequester (trao đổi đọc giữa hai cơ sở), VNFormsDocumentSource và VNFormsDocumentConsumer (trao đổi bảng kê và biểu mẫu đã ký), VNEServiceGateway (cổng dịch vụ công).
CapabilityStatement quá rộng và mơ hồ.Base ổn định hơn, trong khi lớp BHYT Submission vẫn thay đổi theo quy định.Trước 0.10.0, các CapabilityStatement chỉ khai interaction và searchParam. Điều đó đủ để nói làm được gì, nhưng không nói ghi và đọc lại theo luật nào. Hệ quả đo được: hai máy chủ cùng tuyên bố conform một profile vẫn có thể không tương thích khi ghi — không thống nhất chống lost update, không thống nhất cách chống trùng khi gửi lại, và không rõ có đọc lại được phiên bản cũ hay không.
Từ 0.10.0, mọi CapabilityStatement mô tả máy chủ khai thêm hợp đồng ấy ở dạng máy đọc được. Khuôn được chọn theo đúng tương tác mà mục resource ấy khai — một cờ nói về tương tác không tồn tại thì bên đọc không biết tin phần nào:
| Khuôn | Áp cho | Nội dung chính |
|---|---|---|
| Mutable | Mục có update — dữ liệu lâm sàng, hành chính có sửa đổi hợp lệ |
versioning = versioned-update (theo R4: versionId phải đúng khi cập nhật; phía client khai bằng If-Match), readHistory = true, conditionalCreate = true (chống trùng khi gửi lại), updateCreate = false, conditionalUpdate = false, conditionalDelete = not-supported, thêm vread và history-instance |
| CreateOnly | Mục có create nhưng không có update |
versioning = versioned — không dùng versioned-update vì bản khai không có cập nhật để nói tới; readHistory = true kèm vread; conditionalCreate = true; updateCreate, conditionalUpdate tắt; conditionalDelete = not-supported. Không thêm history-instance |
| ReadOnly | Bề mặt đáp ứng dữ liệu cho bên ngoài | versioning = versioned, readHistory = true kèm vread (thiếu vread thì readHistory không có nghĩa), referencePolicy tường minh; mọi ghi có điều kiện đều tắt |
| AppendOnlyEvent | AuditEvent, Provenance |
Không gộp bản ghi trùng, không cập nhật, không xoá — gộp hai bản "trùng" sẽ xoá mất một lần truy cập có thật, và một nhật ký sửa được sau khi ghi thì không còn là nhật ký |
| ImmutableDocument | Bundle tài liệu đã ký (hồ sơ BHYT, bảng kê chi phí) |
Không cập nhật, không xoá — nhưng có conditionalCreate: tài liệu mang định danh nghiệp vụ bắt buộc, nên gửi lại sau khi mất kết nối phải nhận ra là cùng một tài liệu thay vì sinh bản thứ hai |
referencePolicy chỉ khai literal. Cố ý không khai resolves (nghĩa hẹp: máy chủ cố chuyển logical sang literal, thất bại vẫn có thể nhận) và không khai enforced ở khuôn dùng chung — enforced là cam kết toàn vẹn tham chiếu, đúng với kho hồ sơ lâm sàng nhưng thường không đúng với cổng hay proxy. Cơ sở bảo đảm được toàn vẹn thì khai enforced trong CapabilityStatement triển khai của mình.
VNCoreServer và VNCoreEMRServer khai thêm transaction và batch ở cấp REST, kèm ghi chú phân biệt: transaction PHẢI nguyên tử, batch thì không. Máy chủ không bảo đảm được tính nguyên tử thì không khai transaction, và bên gửi phải có hợp đồng bù trừ riêng.
Ba điều hợp đồng này chưa phủ, bên triển khai phải tự chốt trong hợp đồng API: giới hạn kích thước payload và tệp đính kèm, quy tắc phân trang ổn định khi dữ liệu thay đổi giữa hai lần gọi, và chính sách lưu trữ/huỷ dữ liệu theo thời hạn.
Các CapabilityStatement mô tả client (VNCoreDataRequester, VNBHYTGatewayClient, VNCitizenAppClient) cố ý không mang nhóm cờ này: client không quyết định chính sách lưu trữ của máy chủ.
./scripts/validate.sh
Kiểm tra:
Node 22 để khớp với CI; wrapper local sẽ tự chọn node@22 nếu có./scripts/validate-bhyt-submission.sh
Kiểm tra:
VNCoreBHYTSubmissionBundle, 16 logical models (Check-in + XML1–XML15) và 3 operations validate/submit/reverse cho BHYTMA_LK, SO_CCCD, exportDateTime./scripts/validate-tier2.sh
Kiểm tra:
vn-citizen-id-birthplace-prefix-csvn-ward-csCoverage.identifier[BHYT] chỉ nhận mã số BHYT 10 chữ số hiện hành hoặc số thẻ 15 ký tự lịch sử; CCCD của beneficiary được kiểm tra riêng qua Patient.identifier[CCCD]subscriberId khớp identifier[BHYT]SO_CCCD chỉ hợp lệ khi có lý do bất khả kháng hoặc giấy tờ thay thế được profile cho phép (hộ chiếu/giấy khai sinh)MA_LK tồn tại và nhất quán trong bundle BHYTexportDateTime tuân thủ yyyyMMddHHmm./scripts/validate-security-baseline.sh
Kiểm tra:
SMART-on-FHIRsecurity.md có đủ phần ma trận scope, break-glass, bộ dữ liệu lưu giữ tối thiểu và chính sách chữ kýConsent, AuditEvent, Provenance và các ví dụ cốt lõi tồn tại./scripts/validate-bhyt-roundtrip.sh
Kiểm tra:
checkIn, xml1 đến xml15MA_LK đồng nhất giữa các bảng đã sinhxml4 qua DiagnosticReport, xml5, xml7, xml8 qua Composition, xml6 qua hồ sơ HIV/AIDS có security gate, xml9 qua giấy chứng sinh, xml10 qua giấy nghỉ dưỡng thai; xml11 và xml12 chỉ sinh khi có fixture nghỉ việc hưởng BHXH hoặc giám định y khoa tương ứng; xml13 (chuyển tuyến), xml14 (hẹn khám lại) và xml15 (quản lý điều trị lao) chỉ sinh khi có fixture tương ứngoutput/bhyt-roundtrip/README.md và output/bhyt-roundtrip/index.htmlánh xạ ngay trong 16 logical models (Check-in + XML1–XML15) như nguồn sự thật ở mức tài nguyên cho lớp xuất dữ liệuCác chú thích ^mapping này là đặc tả ánh xạ ở mức element để xây dựng và kiểm thử adapter. Chúng không phải một ConceptMap hoàn chỉnh, đã kiểm chứng đầu-cuối cho toàn bộ XML1–XML15 ↔ Claim/ExplanationOfBenefit; không được suy diễn phạm vi đó từ số lượng ConceptMap của package.
./scripts/validate-terminology-governance.sh
Kiểm tra:
0.3.0MedicationAdministration, Specimen, ImagingStudy, CarePlan hoặc hồ sơ chứng từ chuyên khoa sâu hơnfacilityCareLevel/organizationRank chỉ được phát hành khi có target terminology đủ ổn định và equivalence có thể bảo vệ được về mặt ngữ nghĩaMục tiêu QA của VN Core là:
0 errors0 warning do chính tài nguyên của VN Core gây ra nếu có thể sửa bằng nội dung hoặc cấu hìnhURN nội bộ cho danh mục pháp lý/chính sáchVì vậy:
concept.definition, phiên bản mở rộng SNOMED CT, mô tả tài nguyên và cấu hình build phải được sửa tận gốcpatient-citizenship chính thức tới http://hl7.org/fhir/ValueSet/country được coi là phát sinh từ nguồn ngoàiurn:vn-law:* và urn:vn-authority:* được coi là định danh chính sách có chủ đích và được ẩn kèm giải trìnhConsent thay vì custom cục bộ cho đồng ý xử lý dữ liệuAuditEvent cho truy cập/chia sẻProvenance.signature cho xác nhận tài liệu/hồ sơ sốbreak-glass qua chính sách cục bộ + kiểm toán, không mã hoá thành trường tuỳ biến riêng nếu FHIR base đã đủEMR/HSSK, cổng công dân và các luồng chia sẻ dữ liệu dùng chung| Nếu cần | Nên đọc tiếp |
|---|---|
| Kiến trúc gói phát hành | Kiến trúc gói phát hành |
| Quy trình phát hành | Phát hành và quản trị |
| Vai trò triển khai | Tuân thủ theo vai trò triển khai |
| Quyết định thiết kế | Quyết định thiết kế |
This page defines VN Core stability, package boundaries, conformance checks, and release rules. The BHYT layer contains 16 logical models (Check-in plus XML1–XML15) and three operations: validate, submit, and reverse. Element-level ^mapping annotations guide adapters; no end-to-end ConceptMap spanning every table and Claim/ExplanationOfBenefit is published. BHYT identifiers support current 10-digit and legacy 15-character values.