{"id":50708073,"url":"https://github.com/meiiie/benh_vien","last_synced_at":"2026-06-09T13:01:59.884Z","repository":{"id":360431371,"uuid":"1250085962","full_name":"meiiie/benh_vien","owner":"meiiie","description":"WiiiCare Nexus by HoLiLiHu · The Wiii Lab: nền tảng bệnh viện số cho EMR/EHR, FHIR, DICOM/PACS, PostgreSQL và Docker DevOps.","archived":false,"fork":false,"pushed_at":"2026-06-02T13:01:14.000Z","size":35909,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-02T13:06:16.741Z","etag":null,"topics":["benh-vien-so","ddd","dicom","docker","ehr","emr","fastify","fhir","healthcare","healthtech","holilihu","interoperability","pacs","postgresql","react","the-wiii-lab","typescript","vietnam","wiiicare-nexus"],"latest_commit_sha":null,"homepage":"https://github.com/meiiie/benh_vien","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/meiiie.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-26T09:40:48.000Z","updated_at":"2026-05-28T06:35:19.000Z","dependencies_parsed_at":null,"dependency_job_id":"27dd42bc-9a65-42e7-af00-f7dc4214a467","html_url":"https://github.com/meiiie/benh_vien","commit_stats":null,"previous_names":["meiiie/benh_vien"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/meiiie/benh_vien","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/meiiie%2Fbenh_vien","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/meiiie%2Fbenh_vien/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/meiiie%2Fbenh_vien/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/meiiie%2Fbenh_vien/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/meiiie","download_url":"https://codeload.github.com/meiiie/benh_vien/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/meiiie%2Fbenh_vien/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34107866,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["benh-vien-so","ddd","dicom","docker","ehr","emr","fastify","fhir","healthcare","healthtech","holilihu","interoperability","pacs","postgresql","react","the-wiii-lab","typescript","vietnam","wiiicare-nexus"],"created_at":"2026-06-09T13:01:59.807Z","updated_at":"2026-06-09T13:01:59.874Z","avatar_url":"https://github.com/meiiie.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WiiiCare Nexus\n\n![WiiiCare Nexus social preview](docs/assets/github-social-preview.jpg)\n\n**WiiiCare Nexus** là dự án nền tảng bệnh viện số do **HoLiLiHu** thuộc **The Wiii Lab** phát triển, tập trung vào hồ sơ bệnh án điện tử, liên thông dữ liệu y tế và kiến trúc mở cho EMR/FHIR/PACS.\n\nMục tiêu trước mắt là tạo một nền tảng monorepo đủ rõ ràng để trình bày, thử nghiệm và mở rộng; chưa giả định đây là phần mềm đạt điều kiện triển khai sản xuất tại bệnh viện.\n\nBrand assets: [docs/BRAND.md](docs/BRAND.md).\n\n## Định hướng kiến trúc\n\n- Bắt đầu bằng **modular monolith theo DDD** để giữ tốc độ phát triển, giảm chi phí vận hành và vẫn có ranh giới nghiệp vụ rõ.\n- Thiết kế các bounded context có thể tách thành microservice khi lưu lượng, đội ngũ hoặc yêu cầu triển khai thật sự cần.\n- Lấy **HL7 FHIR R4** làm ngôn ngữ trao đổi dữ liệu y tế, **DICOM** cho ảnh y khoa, và các hồ sơ IHE như **MHD/PIXm** cho hướng liên thông tài liệu và định danh bệnh nhân.\n- Ưu tiên bảo mật theo “least privilege”, nhật ký kiểm toán, phân quyền theo vai trò và sẵn sàng ký/xác nhận điện tử theo yêu cầu pháp lý.\n\n## Cấu trúc chính\n\n```text\napps/\n  api/      API nghiệp vụ, FHIR facade và điểm tích hợp\n  web/      Giao diện demo để giải thích luồng bệnh án điện tử\npackages/\n  domain/   Mô hình nghiệp vụ lõi theo DDD\n  contracts/ Schema request/response dùng chung\ninfra/      Docker Compose cho hạ tầng thử nghiệm, không tự bật\ndocs/       Kiến trúc, chuẩn tham chiếu, quyết định kỹ thuật, roadmap\nmigrations/ SQL migration cho PostgreSQL\n```\n\n## Luồng giao diện hiện có\n\nỨng dụng web hiện đã có luồng sản phẩm đầy đủ hơn thay vì chỉ một trang demo:\n\n- `Landing`: giới thiệu WiiiCare Nexus, định vị EMR/FHIR và điều hướng vào phiên demo.\n- `Login`: đăng nhập demo phát Bearer token nội bộ cho vai trò bác sĩ, điều dưỡng, kiểm toán hoặc quản trị; đây chưa phải IAM/SSO sản xuất.\n- `Dashboard`: tổng quan số hồ sơ, lượt khám đang mở, dị ứng/cảnh báo, chẩn đoán/vấn đề sức khỏe, chỉ định dịch vụ, công việc thực thi, chỉ định thuốc, cấp phát thuốc, dùng thuốc thực tế, tài liệu nháp và hàng chờ thao tác.\n- `Patient Workspace`: chọn bệnh nhân, xem định danh, mở/kết thúc lượt khám, ghi nhận dị ứng/cảnh báo, chẩn đoán, chỉ định xét nghiệm/hình ảnh/thủ thuật, theo dõi công việc thực thi y lệnh, ghi nhận thủ thuật/hoạt động đã thực hiện, chỉ số sinh hiệu/xét nghiệm, chỉ định thuốc, cấp phát thuốc, xác nhận dùng thuốc thực tế, tạo tài liệu và xem FHIR theo hồ sơ.\n- `Documents`: quản lý tài liệu bệnh án theo nhóm CCD/CCDA/CCR, lab report, medical record và referral.\n- `Audit`: xem nhật ký thao tác nhạy cảm theo bệnh nhân, actor, mục đích sử dụng, tài nguyên, kiểm tra toàn vẹn chuỗi băm audit và xuất FHIR `AuditEvent` Bundle cho kiểm toán viên.\n- `Interop`: kiểm tra FHIR `CapabilityStatement`, `Patient`, `Organization`, `Practitioner`, `PractitionerRole`, `Endpoint`, `Consent`, `Encounter`, `AllergyIntolerance`, `Condition`, `ServiceRequest`, `Task`, `Procedure`, `Observation`, `DiagnosticReport`, `ImagingStudy`, `MedicationRequest`, `MedicationDispense`, `MedicationAdministration`, `DocumentReference`, `Provenance`, `Composition`, `Bundle`, consent chia sẻ hồ sơ, thu hồi consent, gói chuyển hồ sơ liên viện và các hướng mở sang HIS/LIS/PACS.\n- `Settings`: mô tả quyền demo, cấu hình vận hành và các việc cần thay bằng bảo mật thật khi lên production.\n\n## Ảnh kiểm thử giao diện\n\n![WiiiCare Nexus landing](docs/assets/screenshots/wiiicare-lms-style-landing.png)\n\n![WiiiCare Nexus dashboard](docs/assets/screenshots/wiiicare-lms-style-dashboard.png)\n\n## Chạy kiểm tra\n\n```bash\npnpm install\npnpm run ci\n```\n\nKhi cần chạy API sau khi đã cài dependency:\n\n```bash\npnpm dev:api\n```\n\nHạ tầng trong `infra/docker-compose.yml` chỉ là môi trường thí nghiệm. Không nên bật toàn bộ khi chưa xác định rõ mục tiêu demo.\n\n## Docker dev/prod\n\n```bash\ndocker compose --env-file .env.dev.example -f docker-compose.yml -f docker-compose.dev.yml up -d --build\n```\n\nNếu cần bật thêm FHIR server và PACS:\n\n```bash\ndocker compose --env-file .env.dev.example -f docker-compose.yml -f docker-compose.dev.yml --profile interop --profile imaging up -d --build\n```\n\nChi tiết xem [docs/runbooks/DOCKER.md](docs/runbooks/DOCKER.md).\n\n## Backend và cơ sở dữ liệu\n\nBackend hiện dùng Fastify + TypeScript. Trong Docker, API chạy với `BVS_REPOSITORY=postgres`, migration service tạo schema PostgreSQL trước khi API khởi động. Các bảng nền tảng gồm `patients`, `encounters`, `allergy_intolerances`, `conditions`, `service_requests`, `workflow_tasks`, `procedures`, `observations`, `diagnostic_reports`, `imaging_studies`, `medication_requests`, `medication_dispenses`, `medication_administrations`, `clinical_documents`, `consents`, `record_transfers`, `provider_directory_resources`, `audit_events` và `schema_migrations`. Bảng `clinical_documents` lưu thêm metadata tệp đính kèm như MIME type, dung lượng, SHA-1 Base64 và thời điểm tạo tệp để xuất sang FHIR `DocumentReference.content.attachment`. Bảng `consents` có metadata thu hồi để chặn các lần xuất/chuyển hồ sơ mới sau khi người bệnh rút lại đồng ý. Bảng `audit_events` có thêm chuỗi băm `sha256` để phát hiện sửa/xóa log ở mức prototype và có thể xuất thành FHIR `AuditEvent` Bundle cho kiểm toán.\n\nAPI có `/health` cho liveness và `/ready` cho readiness; `/ready` kiểm tra API đọc được repository bệnh nhân và Provider Directory trước khi container được xem là sẵn sàng nhận traffic.\n\nKhi chạy local không Docker, có thể dùng in-memory repository để phát triển nhanh; khi cần kiểm chứng sát thực tế, dùng Docker dev/prod để chạy PostgreSQL. Ở `NODE_ENV=production`, API bắt buộc `BVS_REPOSITORY=postgres` để tránh chạy dữ liệu bệnh án trên store demo trong RAM.\n\nAPI nghiệp vụ yêu cầu đăng nhập qua `POST /api/v1/auth/login` và gửi `Authorization: Bearer \u003ctoken\u003e`. Biến `BVS_AUTH_SECRET` phải dài tối thiểu 32 ký tự; ở `NODE_ENV=production`, API sẽ từ chối khởi động nếu thiếu secret hợp lệ. `BVS_PUBLIC_API_BASE_URL` cũng bắt buộc dùng URL HTTPS public, không phải `localhost`/loopback, để FHIR `CapabilityStatement` không công bố nhầm endpoint nội bộ. Đăng nhập demo mặc định bị tắt trong production và chỉ được bật có chủ đích bằng `BVS_DEMO_AUTH_ENABLED=true` cho phiên smoke/demo có kiểm soát.\n\n## GitHub và release\n\nRepo đã được chuẩn bị cho GitHub Actions:\n\n- CI: TypeScript check, test, build, harness smoke và Docker smoke.\n- Release: tag `v*.*.*` sẽ build/push image API và web lên GHCR.\n- Dependabot: kiểm tra npm, Dockerfile và GitHub Actions hằng tuần.\n- Review context: `.coderabbit.yaml`, `AGENTS.md`, `CLAUDE.md`.\n\nChi tiết version xem [VERSIONING.md](VERSIONING.md).\n\n## Phạm vi phiên bản đầu\n\n- Quản lý hồ sơ bệnh nhân tối thiểu.\n- Quản lý lượt khám/đợt điều trị tối thiểu để tài liệu bệnh án có ngữ cảnh lâm sàng.\n- Xuất biểu diễn bệnh nhân sang FHIR `Patient`.\n- Xuất lượt khám sang FHIR `Encounter`.\n- Quản lý dị ứng/cảnh báo an toàn lâm sàng và xuất sang FHIR `AllergyIntolerance`.\n- Quản lý chẩn đoán/vấn đề sức khỏe có cấu trúc và xuất sang FHIR `Condition`.\n- Quản lý chỉ định xét nghiệm/chẩn đoán hình ảnh/thủ thuật và xuất sang FHIR `ServiceRequest`.\n- Quản lý hàng đợi/công việc thực thi y lệnh và xuất sang FHIR `Task`, nối `ServiceRequest` với kết quả đầu ra như `Observation`, `DiagnosticReport` hoặc `ImagingStudy`.\n- Quản lý thủ thuật/hoạt động y tế đã thực hiện và xuất sang FHIR `Procedure`, nối lại y lệnh gốc, người thực hiện, thời gian thực hiện, vị trí cơ thể, kết quả thủ thuật và báo cáo liên quan.\n- Quản lý chỉ số sinh hiệu/xét nghiệm có cấu trúc và xuất sang FHIR `Observation`.\n- Quản lý báo cáo kết quả xét nghiệm/chẩn đoán hình ảnh và xuất sang FHIR `DiagnosticReport`, có thể nối `basedOn` tới `ServiceRequest` và `result` tới `Observation`.\n- Quản lý metadata ảnh y khoa/PACS tối thiểu và xuất sang FHIR `ImagingStudy`, gồm DICOM Study Instance UID, Accession Number, modality, series, số ảnh, vùng chụp và endpoint PACS/DICOMweb.\n- Quản lý chỉ định thuốc/đơn thuốc tối thiểu và xuất sang FHIR `MedicationRequest`.\n- Quản lý cấp phát thuốc từ khoa dược/kho thuốc và xuất sang FHIR `MedicationDispense`, nối lại chỉ định thuốc gốc, lượt khám, số lượng cấp, số ngày cấp, thời điểm chuẩn bị/bàn giao, người cấp phát và người nhận thuốc.\n- Quản lý lần dùng thuốc thực tế và xuất sang FHIR `MedicationAdministration`, nối lại chỉ định thuốc gốc, lượt khám, chẩn đoán/lý do, người xác nhận, thời điểm dùng và liều thực tế.\n- Quản lý tài liệu bệnh án tối thiểu: tạo bản nháp, lưu metadata tệp đính kèm, ký tài liệu, xuất metadata sang FHIR `DocumentReference` có `contentType`/`size`/`hash`/`creation` và xuất FHIR `Provenance` cho tài liệu đã ký để mô tả người chịu trách nhiệm, thời điểm ký/xác nhận và nguồn tài liệu.\n- Quản lý consent chia sẻ hồ sơ tối thiểu, gồm lưu consent theo bệnh nhân, đơn vị nhận, thời hạn hiệu lực, thu hồi consent khi người bệnh rút lại đồng ý và xuất biểu diễn FHIR `Consent`.\n- Quản lý gói chuyển hồ sơ liên viện tối thiểu bằng `RecordTransfer`, kiểm consent trước khi tạo, nối cơ sở gửi/nhận, loại FHIR Bundle, lý do chuyển, trạng thái vận hành `requested/ready → in-progress → completed` và xuất sang FHIR `Task` điều phối có `executionPeriod`.\n- Quản lý Provider Directory tối thiểu gồm cơ sở y tế/khoa phòng, nhân sự, vai trò nhân sự và endpoint liên thông FHIR/LIS/PACS; xuất sang FHIR `Organization`, `Practitioner`, `PractitionerRole`, `Endpoint`.\n- Ghi audit trail cho thao tác nhạy cảm, kiểm tra toàn vẹn chuỗi băm theo từng bệnh nhân qua API `/api/v1/patients/:patientId/audit-integrity` và xuất FHIR `AuditEvent` Bundle cho mục đích kiểm toán.\n- Công bố FHIR `CapabilityStatement` tại `/api/v1/fhir/metadata` để mô tả facade đang hỗ trợ resource R4 nào, endpoint triển khai và giả định bảo mật của prototype, gồm cả `Provenance` cho nguồn gốc tài liệu đã ký.\n- Xuất gói hồ sơ bệnh nhân sang FHIR `Bundle` dạng `collection` gồm Patient, Provider Directory resources, Consent, Encounter, AllergyIntolerance, Condition, ServiceRequest, Task, Procedure, Observation, DiagnosticReport, ImagingStudy, MedicationRequest, MedicationDispense, MedicationAdministration và DocumentReference; API chỉ cho xuất khi consent còn hiệu lực, chưa bị thu hồi và khớp đơn vị nhận.\n- Xuất gói tài liệu bệnh án sang FHIR `Bundle` dạng `document`, có `Composition` là entry đầu tiên để đóng vai trò mục lục lâm sàng cho hồ sơ chuyển viện/liên viện.\n- Ghi nhật ký kiểm toán tối thiểu cho các thao tác xem/tạo/ký/xuất dữ liệu nhạy cảm.\n- Chặn quyền tối thiểu ở API theo vai trò demo `clinician`, `nurse`, `auditor`, `admin`; Patient Registry có thêm ABAC theo tổ chức điều trị trong Provider Directory.\n- Chuẩn bị đường mở rộng sang hồ sơ lâm sàng, hình ảnh y khoa và liên thông bệnh viện.\n- Tài liệu hóa các quyết định kiến trúc để dễ bảo vệ trước thầy hoặc mở rộng thành đề tài lớn hơn.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmeiiie%2Fbenh_vien","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmeiiie%2Fbenh_vien","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmeiiie%2Fbenh_vien/lists"}