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
4 bước để cài thử VN Core, build cục bộ và kiểm tra hợp lệ tài nguyên đầu tiên.
Quy mô phiên bản hiện hành xem tại Trang chủ.
Sơ đồ này nhấn mạnh 3 điểm: VN Core được biên soạn từ một workspace thống nhất, artifact được tách rõ giữa profiles/extensions/terminology/examples, và các gói phát hành đi ra nhiều lớp triển khai khác nhau thay vì ép mọi nhu cầu vào cùng một gói.
| Thành phần | Vai trò | Ví dụ |
|---|---|---|
| Hồ sơ | Định nghĩa cấu trúc tài nguyên phù hợp Việt Nam | VNCorePatient: CCCD, tên tiếng Việt, dân tộc |
| Phần mở rộng | Thêm phần tử dữ liệu đặc thù Việt Nam | vn-ext-ethnicity: 54 dân tộc |
| CodeSystems | Bộ mã chuẩn hoá | VNEthnicityCS: mã 01=Kinh, 02=Tày… |
| ValueSets | Tập giá trị cho phép | VNEthnicityVS: bind từ VNEthnicityCS |
| NamingSystems | Định danh identifier | VN-CCCD: http://fhir.hl7.org.vn/core/sid/cccd |
| Examples | Dữ liệu mẫu | Bệnh nhân Nguyễn Văn An, BV Chợ Rẫy |
Khi triển khai thật, 3 lớp hướng dẫn bắt buộc phải đọc:
| Gói | Vai trò | Dùng khi nào |
|---|---|---|
hl7.fhir.vn.core |
Gói tổng hợp | Kiểm tra cục bộ, đào tạo, thử nghiệm nhanh và cài đặt trọn bộ |
hl7.fhir.vn.core.base |
Gói lõi ổn định | EMR, HIE, hồ sơ công dân, dữ liệu dùng chung và liên thông FHIR-native |
hl7.fhir.vn.pharmacy |
Gói chuyên đề dược | Đơn thuốc điện tử ngoại trú và y học cổ truyền, cấp phát và bán thuốc theo đơn, liên thông Cơ sở dữ liệu về dược; phụ thuộc hl7.fhir.vn.core.base |
hl7.fhir.vn.bhyt.submission |
Gói liên thông hồ sơ thanh toán BHYT | Gateway, adapter, kiểm tra và ánh xạ hồ sơ thanh toán; phụ thuộc hl7.fhir.vn.core.base |
hl7.fhir.vn.patient-access |
Gói truy cập của người dân | Sổ sức khoẻ điện tử trên VNeID, khám sức khoẻ định kỳ và chứng nhận sức khoẻ; phụ thuộc hl7.fhir.vn.core.base và hl7.fhir.vn.pharmacy |
hl7.fhir.vn.legal |
Gói hành lang pháp lý | Danh mục văn bản pháp lý (VNLegalDocumentRefCS) và trạng thái hiệu lực máy-đọc; nền tảng trích dẫn cho mọi gói khác |
hl7.fhir.vn.terminology.clinical |
Gói thuật ngữ lâm sàng | ICD-10 VN, ICD-9-CM, SNOMED CT VN subset, CLS, LOINC, ConceptMap lâm sàng |
hl7.fhir.vn.terminology.traditional-medicine |
Gói thuật ngữ Y học cổ truyền | 10 bộ mã theo QĐ 2552/QĐ-BYT và QĐ 3080/QĐ-BYT |
hl7.fhir.vn.device |
Gói thiết bị y tế | Danh pháp thiết bị, DeviceDefinition, regulatory workflow, UDI guidance, kiểm định, asset và procurement khi có use case |
| Phần mềm | Phiên bản | Mục đích |
|---|---|---|
| Node.js | .nvmrc cho contributor/CI (hiện 24); governance/toolchain-pins.json cho evidence release (hiện 26) |
Chạy bộ công cụ theo đúng mục đích của pin |
| SUSHI | Bản khoá trong .github/tooling/package.json và lockfile |
Biên dịch FSH → JSON qua make sushi |
| Java JDK | >= 17 | Chạy IG Publisher |
| Ruby + Jekyll | Homebrew Ruby >= 3.x | IG Publisher dùng Jekyll để render HTML |
Muốn chạy thử ngay trên máy mình? Repo có starter-kit/ (wiki quản trị dự án) — FHIR server bằng Docker, nạp gói theo đúng thứ tự phụ thuộc, 5 giao dịch mẫu và bảng "vai nào đọc kế hoạch kiểm thử nào" (10 phút).
Đang nâng cấp từ bản cũ? Xem Hướng dẫn di trú 0.7.0 → 0.10.0 — bảng đổi field-level cho ICD-10 edition 2026, trục Invoice và obligation theo actor.
Repo công khai sẽ được công bố sau khi quản trị và kênh đóng góp được chốt. Trong giai đoạn thí điểm, nhóm triển khai nhận gói nguồn trực tiếp từ Omi HealthTech hoặc qua kênh rà soát được chỉ định.
# Dùng runtime contributor/CI trong .nvmrc (ví dụ với nvm)
nvm use
# Cài bộ công cụ repo-local đúng lockfile
npm ci --prefix .github/tooling
# Cài Jekyll (cần cho IG Publisher full build)
# macOS/Homebrew Ruby được khuyến nghị để tránh dùng system Ruby 2.6
export PATH="/opt/homebrew/opt/ruby/bin:$PATH"
gem install jekyll bundler --no-document
export PATH="$(/opt/homebrew/opt/ruby/bin/gem env gemdir)/bin:$PATH"
jekyll --version
# Biên dịch FSH → JSON bằng entrypoint chuẩn và PATH đã khoá
env PATH="$PWD/.github/tooling/node_modules/.bin:$PATH" make sushi
# Kết quả bắt buộc: SUSHI 0 lỗi; cảnh báo được phân loại trong hồ sơ QA
# Sinh các gói phát hành
python3 scripts/build-split-packages.py
make sushi dùng SUSHI repo-local và áp lại grouping sau biên dịch. Khi thay nguồn terminology hoặc văn bản, làm theo chuỗi make regen-full của SOP; không gọi SUSHI trực tiếp và không sửa tay tài nguyên sinh trong input/resources/.
# Chuẩn bị input-cache/publisher.jar đúng version; đối chiếu SHA-256 với
# binaries.igPublisherJar.sha256 trong governance/toolchain-pins.json
shasum -a 256 input-cache/publisher.jar
# Build phát triển (runtime contributor trong .nvmrc) → output/; không tạo hồ sơ phát hành
env PATH="$PWD/.github/tooling/node_modules/.bin:$PATH" \
IG_PUBLISHER_TX=na bash scripts/build-ig.sh
# Chỉ maintainer chạy sau chuỗi txgw SOP §5.5 và lệnh phát hành tường minh, dưới đúng
# runtime release đã pin (Node/Java major trong tools của governance/toolchain-pins.json)
python3 scripts/validate-toolchain-pins.py
env PATH="$PWD/.github/tooling/node_modules/.bin:$PATH" \
IG_PUBLISHER_TX=http://localhost:8090/fhir bash scripts/release-pipeline.sh
# Xem kết quả
open output/index.html # Website IG
open output/qa.html # Báo cáo QA
scripts/build-ig.sh là entrypoint phát triển và tự dò jekyll trong Homebrew Ruby gem bin khi cần. Bản phát hành chỉ đi qua scripts/release-pipeline.sh: pipeline phân loại QA, rồi maintainer commit tệp sinh, tạo evidence trên cây sạch, chạy validate-release-evidence.py --strict và commit evidence-only. Không biên dịch hoặc regen sau mốc evidence cuối.
Ví dụ JSON — bệnh nhân có CCCD, thẻ BHYT, dân tộc Kinh:
{
"resourceType": "Patient",
"meta": {
"profile": ["http://fhir.hl7.org.vn/core/StructureDefinition/vn-core-patient"]
},
"identifier": [
{
"type": {
"coding": [{
"system": "http://fhir.hl7.org.vn/core/CodeSystem/vn-identifier-type-cs",
"code": "CCCD"
}]
},
"system": "http://fhir.hl7.org.vn/core/sid/cccd",
"value": "001090012345"
},
{
"type": {
"coding": [{
"system": "http://fhir.hl7.org.vn/core/CodeSystem/vn-identifier-type-cs",
"code": "BHYT"
}]
},
"system": "http://fhir.hl7.org.vn/core/sid/bhyt",
"value": "0179012345"
}
],
"name": [{
"use": "official",
"text": "Nguyễn Văn An",
"family": "Nguyễn",
"given": ["Văn", "An"]
}],
"gender": "male",
"birthDate": "1990-05-15",
"address": [{
"use": "home",
"text": "123 Nguyễn Huệ, Phường Ngọc Hà, Hà Nội",
"state": "Hà Nội",
"extension": [
{
"url": "http://fhir.hl7.org.vn/core/StructureDefinition/vn-ext-province",
"valueCoding": {
"system": "http://fhir.hl7.org.vn/core/CodeSystem/vn-province-cs",
"code": "01",
"display": "Thành phố Hà Nội"
}
},
{
"url": "http://fhir.hl7.org.vn/core/StructureDefinition/vn-ext-ward",
"valueCoding": {
"system": "http://fhir.hl7.org.vn/core/CodeSystem/vn-ward-cs",
"code": "00008",
"display": "Phường Ngọc Hà"
}
}
]
}],
"extension": [
{
"url": "http://fhir.hl7.org.vn/core/StructureDefinition/vn-ext-ethnicity",
"valueCodeableConcept": {
"coding": [{
"system": "http://fhir.hl7.org.vn/core/CodeSystem/vn-ethnicity-cs",
"code": "01",
"display": "Kinh"
}]
}
}
]
}
# Chuẩn bị .validator/validator_cli.jar đúng version; đối chiếu SHA-256 với
# binaries.fhirValidatorJar.sha256 trong governance/toolchain-pins.json
shasum -a 256 .validator/validator_cli.jar
# Tạo local package snapshot (nếu chưa có)
env PATH="$PWD/.github/tooling/node_modules/.bin:$PATH" \
IG_PUBLISHER_TX=na bash scripts/build-ig.sh
# Validate bằng local package snapshot
java -jar .validator/validator_cli.jar patient.json \
-ig output/package.tgz \
-profile http://fhir.hl7.org.vn/core/StructureDefinition/vn-core-patient
# Chạy thêm Tier 2 executable checks của repo
./scripts/validate-tier2.sh
./scripts/validate-security-baseline.sh
./scripts/validate-bhyt-roundtrip.sh
./scripts/validate-terminology-governance.sh
# Mở báo cáo coverage round-trip BHYT
open output/bhyt-roundtrip/index.html
# Build từ source (khuyến nghị cho phiên bản hiện hành 0.10.0)
env PATH="$PWD/.github/tooling/node_modules/.bin:$PATH" make sushi
# Sinh các gói phát hành
python3 scripts/build-split-packages.py
# Sử dụng NPM package (khi đã publish lên registry — chưa áp dụng cho 0.10.0)
# npm --registry https://packages.fhir.org install [email protected]
hl7.fhir.vn.core) hay một trong 8 gói mô-đun: core.base, legal, terminology.clinical, terminology.traditional-medicine, pharmacy, bhyt.submission, patient-access, devicevalidate-tier2.sh, validate-security-baseline.sh, validate-bhyt-roundtrip.sh, validate-terminology-governance.shHướng dẫn tích hợp theo vai trò cụ thể xem Tuân thủ theo vai trò triển khai.
| Lỗi | Nguyên nhân thường gặp | Xem thêm |
|---|---|---|
Unknown code in system cho CCCD/BHYT |
Dùng sai system URI — phải dùng http://fhir.hl7.org.vn/core/sid/cccd |
Registry định danh |
Profile validation error trên Patient.name |
Tiếng Việt có dấu không đúng encoding (phải là UTF-8 NFC) | Tìm kiếm chuỗi & Unicode |
Slice not found trên Patient.identifier |
Thiếu slice cho CCCD hoặc dùng sai discriminator | Hướng dẫn Must Support |
Code not found in ValueSet trên địa chỉ |
Dùng nhầm tập chọn hiện hành cho hồ sơ cũ, hoặc sai canonical/mã. Giữ mã và ngày hồ sơ trong history binding; không tự đổi mã cũ sang một trong 34 mã hiện hành | Hướng dẫn chung |
Coverage.period không hợp lệ |
Ngày hiệu lực BHYT phải theo format FHIR YYYY-MM-DD, không phải DD/MM/YYYY |
Liên thông hồ sơ BHYT |
| Build SUSHI thành công nhưng IG Publisher báo lỗi | Thường là thuật ngữ không phân giải được — kiểm tra output/qa.html |
Hướng dẫn kiểm tra hợp lệ |
Nếu lỗi không có trong bảng trên, xem Hướng dẫn kiểm tra hợp lệ hoặc liên hệ [email protected].
| Tài nguyên | Liên kết |
|---|---|
| FHIR R4 Specification | hl7.org/fhir/R4/ |
| FSH School | fshschool.org |
| FHIR Validator | confluence.hl7.org |
| SUSHI Documentation | fshschool.org/docs/sushi/ |
| VN Core — Liên hệ | [email protected] |
| Hướng dẫn kiểm tra hợp lệ | validation-guidance.html |
| Tình huống lâm sàng | clinical-scenarios.html |
| Nếu cần | Nên đọc tiếp |
|---|---|
| Xác định nghĩa vụ tuân thủ theo vai trò (Producer/Consumer/Gateway) | Tuân thủ theo vai trò |
| Hiểu quy tắc nền chung về tên, địa chỉ, định danh và pattern datatype | Hướng dẫn chung |
| Tra cứu các NamingSystem và hệ thống định danh y tế Việt Nam | Danh mục định danh |
| Diễn giải Must Support và cẩm nang ánh xạ HIS → FHIR | Must Support |
| Nắm hành vi tìm kiếm của FHIR server | Tìm kiếm |
| Thiết kế kiểm tra hợp lệ 3 tầng cho resource | Kiểm tra hợp lệ |
| Triển khai liên thông hồ sơ BHYT với Cổng giám định BHXH | Liên thông BHYT |
This quickstart covers prerequisites, local build, first validation, and next guidance. Install repository-local SUSHI from .github/tooling; run it through the pinned PATH with make sushi. Use scripts/build-ig.sh with explicit IG_PUBLISHER_TX=na for development. Release only after SOP §5.5, explicit authorization, and scripts/release-pipeline.sh; pinned jars and clean-tree strict evidence are required.