Tiêm chủng và TCMR qua FHIR — đưa Sổ tiêm chủng số vào Luật 114/2025 Phòng bệnh

Luật 114/2025/QH15 (ban hành 10/12/2025, hiệu lực 01/07/2026) thay thế Luật Phòng, chống bệnh truyền nhiễm 2007 (Luật 03/2007/QH12). Luật mới yêu cầu hệ thống thông tin phòng bệnh có dữ liệu tiêm chủng được kết nối, chia sẻ trong cơ sở dữ liệu y tế và báo cáo tiêm chủng theo quy định của Bộ Y tế. Trang này hướng dẫn cách dùng ba Resource FHIR R4 — Immunization, ImmunizationRecommendation, ImmunizationEvaluation — cùng VNeID Sổ sức khỏe điện tử để xây dựng hồ sơ tiêm chủng đời người (life-long), phục vụ cả Tiêm chủng mở rộng (TCMR) và tiêm chủng dịch vụ trên nền chuẩn quốc tế.

Tóm tắt nhanh

  • FHIR R4 cung cấp ba Resource đủ dùng: Immunization ghi liều đã tiêm, ImmunizationRecommendation dự báo liều kế tiếp, ImmunizationEvaluation đánh giá tính hợp lệ của liều.
  • Luật 114/2025/QH15 (hiệu lực 01/07/2026) yêu cầu dữ liệu tiêm chủng kết nối, chia sẻ trong cơ sở dữ liệu y tế quốc gia — không bắt buộc realtime, nhưng phải đúng quy định báo cáo của BYT.
  • VN Core dùng CodeSystem http://fhir.hl7.org.vn/core/CodeSystem/vn-vaccine-type-cs cho mã loại vaccine theo bệnh; ATC (http://www.whocc.no/atc) bổ sung cho mức sản phẩm dược.
  • Workflow chuẩn: Patient sơ sinh → ImmunizationRecommendation pre-loaded theo lịch TCMR → nhắc qua VNeID/SMS → tiêm và ký số → ImmunizationEvaluation tự động → đẩy hồ sơ lên cổng quốc gia và VNeID.
  • Phản ứng có hại (AEFI) ghi qua Resource AdverseEvent, liên kết về Immunization gốc; outcome dùng đúng mã FHIR R4 (resolved, recovering, ongoing...).

1. Bối cảnh — Luật 114/2025 và Chương trình TCMR

Tiêm chủng là một trong những can thiệp y tế công cộng có hiệu quả cao nhất. Việt Nam triển khai Chương trình Tiêm chủng mở rộng (TCMR) từ năm 1981 và đến nay đã khống chế thành công nhiều bệnh truyền nhiễm. Tuy nhiên, hạ tầng dữ liệu tiêm chủng phân mảnh giữa cơ sở tư, cơ sở công và cổng báo cáo Bộ Y tế khiến công tác giám sát thiếu thời gian thực, gây khó khăn khi truy ngược lịch sử tiêm của một cá nhân.

Luật 114/2025/QH15 (Quốc hội thông qua 10/12/2025, hiệu lực 01/07/2026) là Luật Phòng bệnh thay thế Luật Phòng, chống bệnh truyền nhiễm 2007 (Luật 03/2007/QH12). Luật mới mở rộng phạm vi sang quản lý các bệnh không lây nhiễm và đặt ra yêu cầu hệ thống thông tin phòng bệnh được kết nối, chia sẻ dữ liệu trong cơ sở dữ liệu y tế quốc gia. Riêng tiêm chủng, Luật quy định trách nhiệm báo cáo tiêm chủng theo hướng dẫn của Bộ Y tế, làm cơ sở pháp lý để các cơ sở tiêm chủng bắt buộc cập nhật dữ liệu lên hệ thống chung.

Đi cùng Luật 114/2025 là Quyết định 1332/QĐ-BYT về Sổ sức khỏe điện tử trên VNeID, Thông tư 13/2025/TT-BYT về bệnh án điện tử (hiệu lực 21/07/2025) và Quyết định 2780/QĐ-BYT ngày 29/08/2025 về Kế hoạch Tiêm chủng mở rộng giai đoạn 2026-2028. Bộ ba văn bản này định hình ngữ cảnh kỹ thuật: dữ liệu tiêm chủng phải số hóa, gắn với số định danh cá nhân, ký số theo quy định và đẩy về sổ tiêm chủng cá nhân trên VNeID.

2. Bài toán hiện tại của ngành

Khi đặt câu hỏi đơn giản — “bé này đã tiêm đủ 5in1 chưa?” — đáp án thường phụ thuộc vào tờ giấy hồng nhăn nhúm trong túi mẹ. Bốn vấn đề thường gặp:

  • Sổ tiêm chủng giấy dễ thất lạc, dễ rách, không thể truy xuất từ xa khi gia đình chuyển nơi cư trú.
  • Bác sĩ tuyến trên không truy được lịch sử tiêm tuyến dưới, dẫn tới tiêm trùng hoặc bỏ sót liều.
  • Báo cáo dịch tễ chậm 1-3 tháng do tổng hợp thủ công từ cơ sở lên Trung tâm Kiểm soát bệnh tật cấp tỉnh và Bộ Y tế.
  • Đại dịch COVID-19 phơi bày điểm yếu này: việc xác minh chứng nhận tiêm chủng phải xây vội qua nền tảng riêng, không tích hợp được với hệ thống TCMR sẵn có.

FHIR R4 không phát minh ra giải pháp mới mà chuẩn hóa cách dữ liệu di chuyển giữa các hệ thống. Khi cơ sở tiêm chủng, kho dữ liệu tỉnh, cổng quốc gia và VNeID cùng nói cùng một “ngôn ngữ” — Resource Immunization với cùng các trường tối thiểu — hồ sơ tiêm chủng đời người trở nên khả thi.

3. Kiến trúc dữ liệu FHIR cho tiêm chủng

Mô hình tham chiếu chia làm bốn lớp, với FHIR là lớp giao tiếp giữa các hệ thống:

[Cơ sở tiêm chủng — TYT xã, BV, phòng tiêm dịch vụ]
   ↓ tạo Immunization, ký số theo NĐ 137/2024
[FHIR Server cấp tỉnh — kho dữ liệu sức khỏe]
   ↓ aggregate, đối soát theo CCCD
[Cổng dữ liệu quốc gia — Bộ Y tế / Cục Phòng bệnh]
   ↓ báo cáo định kỳ và đột xuất
[Dashboard giám sát dịch tễ + WHO/Gavi report]

   ↓ push hồ sơ cá nhân
[VNeID — Sổ sức khỏe điện tử / Sổ tiêm chủng]

Lớp “FHIR Server cấp tỉnh” không nhất thiết phải tự xây mới — có thể là module trong HIS, là FHIR façade trước cơ sở dữ liệu cũ, hoặc là dịch vụ dùng chung do Sở Y tế triển khai. Điểm cốt lõi là mọi hệ thống đẩy dữ liệu vào đều tuân thủ profile VNCoreImmunization để giữ ngữ nghĩa thống nhất khi tổng hợp.

4. Ba Resource cốt lõi

4.1. Immunization — sự kiện tiêm

Resource Immunization ghi lại một liều đã tiêm hoặc lý do không tiêm. Trong VN Core, chúng tôi yêu cầu Must Support cho các trường: vaccineCode (mã loại vaccine VN bắt buộc, ATC khuyến nghị), patient, occurrenceDateTime, lotNumber, performer, protocolApplied (chuỗi liều). Ví dụ một liều 5in1 thứ hai trong TCMR:

{
  "resourceType": "Immunization",
  "status": "completed",
  "vaccineCode": {
    "coding": [
      {
        "system": "http://fhir.hl7.org.vn/core/CodeSystem/vn-vaccine-type-cs",
        "code": "dpt",
        "display": "Bạch hầu-Ho gà-Uốn ván (DPT-VGB-Hib 5in1)"
      },
      {
        "system": "http://www.whocc.no/atc",
        "code": "J07CA09",
        "display": "Diphtheria-Haemophilus influenzae B-pertussis-poliomyelitis-tetanus-hepatitis B"
      }
    ],
    "text": "Vaccine 5in1 (DPT-VGB-Hib) — TCMR"
  },
  "patient": { "reference": "Patient/baby-001" },
  "encounter": { "reference": "Encounter/imm-enc-001" },
  "occurrenceDateTime": "2026-09-15T09:30:00+07:00",
  "primarySource": true,
  "location": { "reference": "Location/tyt-phuong-vinh-tuy" },
  "manufacturer": { "reference": "Organization/polyvac" },
  "lotNumber": "L2026-0915-A",
  "expirationDate": "2027-12-31",
  "site": {
    "coding": [
      { "system": "http://terminology.hl7.org/CodeSystem/v3-ActSite", "code": "LT", "display": "Left thigh" }
    ]
  },
  "route": {
    "coding": [
      { "system": "http://terminology.hl7.org/CodeSystem/v3-RouteOfAdministration", "code": "IM", "display": "Intramuscular" }
    ]
  },
  "doseQuantity": { "value": 0.5, "unit": "mL", "system": "http://unitsofmeasure.org", "code": "mL" },
  "performer": [
    { "actor": { "reference": "Practitioner/dd-le-thi-hoa" } }
  ],
  "protocolApplied": [
    {
      "series": "TCMR Quốc gia — 5in1",
      "doseNumberPositiveInt": 2,
      "seriesDosesPositiveInt": 3,
      "targetDisease": [
        { "coding": [{ "system": "http://fhir.hl7.org.vn/core/CodeSystem/vn-vaccine-type-cs", "code": "diphtheria", "display": "Bạch hầu" }] },
        { "coding": [{ "system": "http://fhir.hl7.org.vn/core/CodeSystem/vn-vaccine-type-cs", "code": "pertussis", "display": "Ho gà" }] },
        { "coding": [{ "system": "http://fhir.hl7.org.vn/core/CodeSystem/vn-vaccine-type-cs", "code": "tetanus", "display": "Uốn ván" }] },
        { "coding": [{ "system": "http://fhir.hl7.org.vn/core/CodeSystem/vn-vaccine-type-cs", "code": "hep-b", "display": "Viêm gan B" }] },
        { "coding": [{ "system": "http://fhir.hl7.org.vn/core/CodeSystem/vn-vaccine-type-cs", "code": "hib", "display": "Hib" }] }
      ]
    }
  ]
}

4.2. ImmunizationRecommendation — gợi ý liều kế tiếp

Resource ImmunizationRecommendation là kết quả của một engine quy tắc (rule engine) chạy trên lịch TCMR và lịch sử tiêm của bệnh nhân. Mỗi recommendation chỉ rõ vaccine, bệnh đích, thứ tự liều và mốc thời gian khuyến cáo.

{
  "resourceType": "ImmunizationRecommendation",
  "patient": { "reference": "Patient/baby-001" },
  "date": "2026-09-15",
  "recommendation": [
    {
      "vaccineCode": [
        {
          "coding": [
            { "system": "http://fhir.hl7.org.vn/core/CodeSystem/vn-vaccine-type-cs", "code": "dpt", "display": "DPT-VGB-Hib (5in1)" }
          ]
        }
      ],
      "targetDisease": {
        "coding": [
          { "system": "http://fhir.hl7.org.vn/core/CodeSystem/vn-vaccine-type-cs", "code": "diphtheria", "display": "Bạch hầu" }
        ]
      },
      "forecastStatus": {
        "coding": [
          { "system": "http://terminology.hl7.org/CodeSystem/immunization-recommendation-status", "code": "due", "display": "Due" }
        ]
      },
      "doseNumberPositiveInt": 3,
      "seriesDosesPositiveInt": 3,
      "dateCriterion": [
        {
          "code": {
            "coding": [
              { "system": "http://loinc.org", "code": "30981-5", "display": "Earliest date to give" }
            ]
          },
          "value": "2026-10-15"
        },
        {
          "code": {
            "coding": [
              { "system": "http://loinc.org", "code": "30980-7", "display": "Date vaccine due" }
            ]
          },
          "value": "2026-10-30"
        }
      ]
    }
  ]
}

4.3. ImmunizationEvaluation — đánh giá liều

Sau khi tiêm, hệ thống cần xác định liều vừa rồi có hợp lệ hay không (đúng tuổi, đủ khoảng cách so với liều trước, đúng vaccine cho bệnh đích...). Đây là vai trò của ImmunizationEvaluation:

{
  "resourceType": "ImmunizationEvaluation",
  "status": "completed",
  "patient": { "reference": "Patient/baby-001" },
  "date": "2026-09-15",
  "immunizationEvent": { "reference": "Immunization/imm-001" },
  "targetDisease": {
    "coding": [
      { "system": "http://fhir.hl7.org.vn/core/CodeSystem/vn-vaccine-type-cs", "code": "pertussis", "display": "Ho gà" }
    ]
  },
  "doseStatus": {
    "coding": [
      { "system": "http://terminology.hl7.org/CodeSystem/immunization-evaluation-dose-status", "code": "valid", "display": "Valid" }
    ]
  },
  "doseNumberPositiveInt": 2,
  "seriesDosesPositiveInt": 3
}

Khi doseStatus trả về valid, hệ thống cập nhật chuỗi liều và tính toán lại ImmunizationRecommendation kế tiếp. Nếu invalid (ví dụ tiêm sớm hơn khoảng cách tối thiểu), liều sẽ không được tính và bé phải tiêm lại.

5. Mã hóa vaccine — vn-vaccine-type-cs và ATC

VN Core khuyến nghị mỗi vaccineCode mang ít nhất hai mã:

  • Mã loại vaccine theo bệnh — CodeSystem http://fhir.hl7.org.vn/core/CodeSystem/vn-vaccine-type-cs. Đây là danh mục bắt buộc trong profile VNCoreImmunization, cấp 25 mã ban đầu (BCG, viêm gan B, DPT, bại liệt, Hib, sởi, rubella, Sởi-Rubella, viêm não Nhật Bản, rotavirus, phế cầu, HPV, uốn ván, cúm, dại, thủy đậu, COVID-19...).
  • ATC của WHO — CodeSystem http://www.whocc.no/atc. Dùng để giao tiếp với hệ thống quốc tế theo mức sản phẩm dược, ví dụ J07CA09 cho vaccine 5in1 (DTP-Hib-Polio-HepB), J07AM01 cho vaccine uốn ván, J07BC01 cho viêm gan B đơn giá. Khi dùng ATC, phải chọn đúng mã tổ hợp tương ứng với loại vaccine — không gán J07AM01 (uốn ván) cho lọ 5in1.

Bên cạnh mã, ba thuộc tính lotNumber, expirationDate, manufacturer đóng vai trò quan trọng trong truy xuất nguồn gốc khi có sự cố lô vaccine. Hệ thống nên cảnh báo trước hạn dùng 3 tháng và chặn sử dụng lô quá hạn ngay tại điểm tiêm.

6. Workflow đầy đủ — từ sơ sinh đến hết tuổi tiêm

  1. Đăng ký Patient. Khi trẻ sinh ra, cơ sở y tế tạo Resource Patient và liên thông giấy khai sinh điện tử với Bộ Công an để cấp số định danh cá nhân (12 số). Số này được ghi vào identifier slice cccd.
  2. Pre-load ImmunizationRecommendation. Ngay sau khi có Patient, engine sinh sẵn lịch tiêm chủng trọn đời theo TCMR Quốc gia.
  3. Nhắc lịch. Trước mỗi mốc tiêm 7-14 ngày, hệ thống đẩy notification qua VNeID hoặc SMS tới cha/mẹ — nội dung gồm tên vaccine, mốc thời gian, địa điểm gợi ý.
  4. Verify tại điểm tiêm. Điều dưỡng quét mã QR trên VNeID hoặc nhập CCCD để load Patient + Recommendation hiện hành; kiểm tra vaccine, lô, hạn dùng, chống chỉ định (qua AllergyIntolerance).
  5. Tiêm và ký số. Ngay sau mũi tiêm, hệ thống tạo Resource Immunization với status = completed và áp chữ ký số của người thực hiện theo NĐ 137/2024/NĐ-CP.
  6. Đẩy lên cổng quốc gia. Bundle chứa Immunization được POST lên FHIR Server tỉnh, sau đó tổng hợp về cổng dữ liệu quốc gia.
  7. Auto-evaluate. Engine tạo ImmunizationEvaluation tự động — nếu valid, đánh dấu liều hoàn thành và sinh Recommendation kế tiếp.
  8. Đồng bộ VNeID. Bản ghi đẩy về Sổ sức khỏe điện tử của bé trên VNeID, hiển thị cho cha/mẹ trong vòng vài phút.

Bước 6-8 là “mô hình tham chiếu — chờ spec chính thức”: API VNeID cho push tiêm chủng đang trong quá trình hoàn thiện. Khi spec ra mắt, bộ Bundle này có thể cần thêm Composition và Provenance để đáp ứng yêu cầu định dạng.

7. Lịch TCMR quốc gia 2026 và mã loại vaccine

Bảng dưới phản ánh lịch TCMR theo Quyết định 2780/QĐ-BYT giai đoạn 2026-2028, ánh xạ với mã trong CodeSystem vn-vaccine-type-cs để engine có thể truy vấn trực tiếp:

Vaccine vn-vaccine-type-cs Tuổi tiêm Số liều
Lao (BCG)bcgSơ sinh1
Viêm gan B sơ sinhhep-bTrong 24h sau sinh1 (kèm mũi trong 5in1)
5in1 (DPT-VGB-Hib)dpt2-3-4 tháng3
Bại liệt uống (OPV)polio2-3-4 tháng3
Bại liệt tiêm (IPV)polio5 tháng1
Sởi đơnmeasles9 tháng1
Sởi-Rubellameasles-rubella18 tháng1
DPT nhắc lạidpt18 tháng1
Viêm não Nhật Bản Bje12-18 tháng3
Phế cầu (mới từ 2026)pneumococcal2-4-6 tháng3
HPV (mới từ 2026)hpvNữ 9-14 tuổi2

Engine sinh ImmunizationRecommendation đọc bảng này như nguồn dữ liệu tham chiếu, kết hợp với lịch sử Immunization của bệnh nhân để tính lịch catch-up khi trẻ tiêm trễ hoặc bỏ liều.

8. Sổ tiêm chủng trên VNeID

QĐ 1332/QĐ-BYT đặt nền tảng cho Sổ sức khỏe điện tử trên VNeID, trong đó Sổ tiêm chủng là một module quan trọng. Cấu trúc dữ liệu khuyến nghị là một Bundle document gồm:

Bundle (type = document)
├── Composition (title = "Sổ tiêm chủng — Họ tên BN")
├── Patient (chủ thể, có CCCD/số định danh cá nhân)
├── Immunization × N (mọi liều đã tiêm theo thứ tự thời gian)
├── ImmunizationRecommendation (liều sắp tới và mốc thời gian)
└── Provenance (chữ ký số của cơ sở phát hành)

Bundle này có thể được công dân chia sẻ qua VNeID khi đi du lịch, du học hoặc khám bệnh ở nước ngoài. Để tương thích quốc tế, có thể dùng profile IPS (International Patient Summary) làm phiên bản rút gọn — đây là “mô hình tham chiếu — chờ spec chính thức” từ HL7 Vietnam và Bộ Y tế.

9. Báo cáo dịch tễ và đa nguồn dữ liệu

Khi mọi cơ sở tiêm chủng đẩy Resource Immunization chuẩn hóa lên cổng quốc gia, dashboard dịch tễ có thể truy vấn theo cú pháp FHIR Search:

GET /Immunization?vaccine-code=http://fhir.hl7.org.vn/core/CodeSystem/vn-vaccine-type-cs|measles
   &date=ge2026-09-01&date=le2026-09-30
   &_count=0
→ Bundle (searchset) — total = số liều sởi đã tiêm trong tháng 9/2026

Dashboard có thể nhóm theo tỉnh/xã, theo lứa tuổi, theo loại vaccine để phát hiện vùng phủ thấp. Báo cáo định kỳ cho WHO, UNICEF và Gavi có thể tự động hóa qua API mà không cần tổng hợp Excel thủ công. Lưu ý: dữ liệu gửi ra ngoài lãnh thổ phải tuân thủ Luật 91/2025/QH15 về Bảo vệ dữ liệu cá nhân và NĐ 356/2025/NĐ-CP — yêu cầu hồ sơ đánh giá chuyển dữ liệu xuyên biên giới.

10. ADR/AEFI — phản ứng có hại sau tiêm

Phản ứng có hại sau tiêm chủng (Adverse Event Following Immunization — AEFI) ghi qua Resource AdverseEvent, liên kết về Immunization gốc qua trường suspectEntity.instance. FHIR R4 yêu cầu outcome dùng đúng mã trong CodeSystem chính thức: resolved, recovering, ongoing, resolvedWithSequelae, fatal, unknown. Mã recovered không hợp lệ trong R4 — nhiều ví dụ trên mạng dùng nhầm.

{
  "resourceType": "AdverseEvent",
  "actuality": "actual",
  "category": [
    {
      "coding": [
        { "system": "http://terminology.hl7.org/CodeSystem/adverse-event-category", "code": "product-use-error", "display": "Product Use Error" }
      ],
      "text": "Phản ứng sau tiêm chủng (AEFI)"
    }
  ],
  "subject": { "reference": "Patient/baby-001" },
  "date": "2026-09-15T18:00:00+07:00",
  "suspectEntity": [
    {
      "instance": { "reference": "Immunization/imm-001" }
    }
  ],
  "outcome": {
    "coding": [
      { "system": "http://hl7.org/fhir/adverse-event-outcome", "code": "resolved", "display": "Resolved" }
    ]
  },
  "seriousness": {
    "coding": [
      { "system": "http://terminology.hl7.org/CodeSystem/adverse-event-seriousness", "code": "Non-serious", "display": "Non-serious" }
    ]
  }
}

Cảnh báo nghiệp vụ

Mọi AEFI nghiêm trọng (sốc phản vệ, tử vong, di chứng nặng) phải báo cáo về Cục Quản lý Dược trong vòng 24-48 giờ theo quy định an toàn thuốc, đồng thời gửi tới VigiBase của WHO. Hệ thống nên có kênh ưu tiên cho các AEFI đánh dấu seriousness = serious.

11. Câu hỏi thường gặp

11.1. TCMR và tiêm dịch vụ khác nhau ra sao trên FHIR?

Cùng dùng Resource Immunization. Sự khác biệt nằm ở mã loại trong vn-vaccine-type-cs (thuộc tính class phân biệt tcmrdich-vu) cũng như nguồn chi trả, thường ghi qua Encounter hoặc Coverage liên kết.

11.2. Trẻ sơ sinh chưa có CCCD thì làm thế nào?

Theo hướng dẫn của profile VNCorePatient, trẻ sinh từ năm 2016 được cấp số định danh cá nhân ngay khi đăng ký khai sinh — số này điền vào identifier slice cccd. Trường hợp đặc biệt chưa kịp cấp, dùng tạm identifier slice gks (số giấy khai sinh) kèm data-absent-reason cho CCCD. Thông tin của cha mẹ thuộc về RelatedPerson với role guardian, không nhồi vào Patient.identifier.

11.3. Làm sao kiểm tra dị ứng trước khi tiêm?

Tích hợp Resource AllergyIntolerance vào màn hình verify. Trước khi ấn “tiêm”, hệ thống truy vấn AllergyIntolerance của Patient và đối chiếu với thành phần vaccine — đặc biệt với người dị ứng trứng (vaccine cúm, sởi) hoặc dị ứng latex.

11.4. Vaccine COVID-19 có thuộc TCMR không?

Hiện tại COVID-19 (mã covid-19) được phân loại chien-dich trong vn-vaccine-type-cs, không phải tcmr. Bộ Y tế có thể điều chỉnh trong tương lai khi tình hình dịch tễ thay đổi.

11.5. Có bắt buộc realtime không?

Luật 114/2025 không quy định mốc “realtime” cụ thể. Yêu cầu thực tế là dữ liệu được kết nối, chia sẻ theo quy định BYT — thường dao động từ vài phút đến cuối ngày tùy loại báo cáo. Hệ thống nên thiết kế để có thể đồng bộ trong vài phút, đáp ứng cả nhu cầu giám sát đột xuất.

12. Tài liệu tham chiếu