Tran Manh Tuan

Waroku Hospital Karte

Waroku Hospital Karte là nền tảng hồ sơ bệnh án điện tử và workflow lâm sàng trên cloud dành cho bệnh viện tâm thần tại Nhật Bản. Đây không chỉ là nơi xem bệnh án: bác sĩ, điều dưỡng và các bộ phận hỗ trợ dùng hệ thống để tìm bệnh nhân, vận hành điều trị nội trú và ngoại trú, quản lý ward và giường bệnh, lịch, task, bàn giao — và quan trọng nhất là tạo, xác nhận, tiếp nhận và thực thi clinical order.

Giai đoạn 2021–2022, tôi là Tech Lead của team phát triển tại Việt Nam. Phạm vi của team là frontend bằng Vue, Nuxt và TypeScript, trên codebase và cấu trúc component có sẵn; team gồm frontend developer, IT communicator và các thành viên junior, còn specification đến từ phía Nhật.

Vì sao đây là dự án hệ thống quản lý: một hệ thống bệnh viện là hàng chục module dùng chung một bệnh nhân, một tổ chức và một bộ nhân sự, giường bệnh và order. Một thao tác nhỏ có thể đổi trạng thái bệnh nhân, giường bệnh, order, lịch và người phải hành động tiếp theo. Màn hình trông đúng vẫn có thể làm sai clinical workflow — nên dẫn dắt team nghĩa là phải hiểu workflow đủ sâu để chặn điều đó.

Các module và cách người dùng đi vào

Mọi module dùng chung một lõi: định danh bệnh nhân, hospital và organization, định danh bác sĩ và điều dưỡng, khoa, ward, buồng và giường, order, lịch, trạng thái thực thi và lịch sử lâm sàng.

Tổng quan hệ thống Waroku Hospital KarteBác sĩ, điều dưỡng và staff đăng nhập qua authentication theo role, rồi vào context của hospital / organization. Context đó quyết định global header và global menu theo role. Header dẫn tới patient search, search mở Karte của bệnh nhân. Global menu dẫn tới Karte, nội trú, ngoại trú, order management, schedule / task, điều dưỡng, rehabilitation, và nhóm conference / PSW / support. Từ Karte, người dùng tạo order và quản lý schedule.

Bác sĩ / Điều dưỡng / Staff

Authentication / Role

Hospital / Organization Context

Global Header

Role-based Global Menu

Patient Search

Karte / Patient Chart

Nội trú

Ngoại trú

Order Management

Schedule / Task

Điều dưỡng

Rehabilitation

Conference / PSW / Support

Sơ đồ vừa khung

Authentication và context của hospital đi trước; chúng quyết định header và menu hiển thị những gì.

Vai trò của tôi

  • Nắm kiến trúc tổng thể của frontend và cách tích hợp với API, hướng dẫn team phát triển theo codebase và cấu trúc component có sẵn.
  • Review implementation và pull request, giữ component dùng chung, modal dùng lại và convention nhất quán trên một số lượng màn hình rất lớn.
  • Cùng team phân tích screen specification và API specification, giải thích nghiệp vụ lâm sàng phía sau.
  • Nhận các màn hình có business rule phức tạp và dependency giữa nhiều màn hình / module; đánh giá ảnh hưởng của thay đổi lên các workflow liên quan.
  • Hỗ trợ debug các vấn đề giữa frontend và API.
  • Theo dõi tiến độ kỹ thuật của team, hỗ trợ thành viên junior và intern.
  • Làm cầu nối kỹ thuật giữa specification phía Nhật và implementation phía Việt Nam.

Một điểm vào: đăng nhập, context bệnh viện và tìm bệnh nhân

Nhân viên đăng nhập bằng login ID và mật khẩu, có reset và đổi mật khẩu; xác thực hai lớp nằm trong yêu cầu. Session không chỉ quyết định quyền truy cập mà còn quyết định menu và workflow người dùng được phép dùng. Một người dùng có thể thuộc và chuyển giữa nhiều hospital trong cùng group và organization, và một số menu — ví dụ sub-menu rehabilitation và instruction — khác nhau theo hospital, nên menu lấy từ API thay vì hard-code.

Global header cho phép tìm bệnh nhân từ bất kỳ đâu: tên Katakana tìm theo forward match, số bệnh nhân tìm theo exact match. Kết quả mở Karte của bệnh nhân, biến tìm kiếm thành điểm vào của clinical workflow.

Từ tìm kiếm bệnh nhân tới workflow của bệnh nhânNgười dùng đăng nhập, chọn hoặc xác định hospital, rồi dùng global header để tìm bệnh nhân. Kết quả tìm kiếm mở Karte của bệnh nhân; từ Karte người dùng đi tiếp tới order, schedule, lịch sử và thông tin lâm sàng.

Login

Chọn / xác định Hospital

Global Header

Tìm bệnh nhân

Kết quả tìm kiếm

Karte

Order

Schedule

Lịch sử

Thông tin lâm sàng

Sơ đồ vừa khung

Từ đăng nhập tới hồ sơ bệnh nhân chỉ qua vài bước, dù người dùng bắt đầu từ màn hình nào.

Menu đi theo role

Global menu là bản đồ công việc của bệnh viện, không phải thanh điều hướng tĩnh. Menu gom các chức năng dùng chung (work task, schedule, countersignature, announcement, handover), công việc ward / nội trú (nhật ký quản lý điều dưỡng, danh sách trạng thái bệnh nhân, danh sách bệnh nhân cho bác sĩ và cho điều dưỡng, bed map, nhập liệu khi đi buồng, flow sheet, ra ngoài và ngủ qua đêm, hạn chế vận động, nhật ký điều dưỡng ward), danh sách và nhật ký ngoại trú, order (order list, execution list, order đã hoàn tất, xác nhận booking, output xét nghiệm), rehabilitation cá nhân và nhóm, instruction cá nhân và nhóm, conference, và consultation log / PSW log.

Điều hướng theo roleNgười dùng đăng nhập được phân theo role / authority thành ba nhóm menu. Menu bác sĩ dẫn tới order, chẩn đoán, Karte và danh sách bệnh nhân của bác sĩ. Menu điều dưỡng dẫn tới nhật ký điều dưỡng, flow sheet và danh sách bệnh nhân của điều dưỡng. Menu dùng chung dẫn tới task / schedule, chat / announcement và tìm kiếm bệnh nhân.

Người dùng đã đăng nhập

Role / Authority

Menu bác sĩ

Menu điều dưỡng

Menu dùng chung

Order / Chẩn đoán / Karte

Danh sách bệnh nhân của bác sĩ

Nhật ký điều dưỡng / Flow Sheet

Danh sách bệnh nhân của điều dưỡng

Task / Schedule

Chat / Announcement

Tìm kiếm bệnh nhân

Sơ đồ vừa khung

Bác sĩ và điều dưỡng không có cùng menu, cũng không có cùng quyền; role quyết định cả hai.

Karte

Karte — hồ sơ bệnh nhân — là trung tâm workflow của bệnh nhân: basic tab và thông tin bệnh nhân, lịch của bệnh nhân, life history, ghi chép vào chart, order entry và order history, thông tin lâm sàng. Từ đây bác sĩ và điều dưỡng xem lịch sử, nhập thông tin lâm sàng, tạo order, quản lý lịch và chuyển sang các module chuyên môn. Lịch không chỉ là calendar: nó kết hợp lịch hẹn của bệnh nhân với lịch của staff, của facility, task và ToDo.

Clinical order: module lớn nhất

Order là một trong những workflow cốt lõi của cả hệ thống. Có năm loại cơ bản — kê đơn, tiêm, xét nghiệm, điều trị và chẩn đoán hình ảnh — cùng các order chuyên biệt như xét nghiệm tâm lý và sinh lý, CT và X-Ray, bữa ăn, chuyển khoa / buồng, chỉ định task, ra viện hoặc chuyển sang ngoại trú. Loại order mới có thể được thêm qua API, nên module vận hành như một order framework, trong đó mỗi loại mang form và rule riêng.

Các nhóm clinical orderMột clinical order có năm nhóm cơ bản: kê đơn, tiêm, xét nghiệm, điều trị và chẩn đoán hình ảnh. Xét nghiệm chia thành xét nghiệm tâm lý và xét nghiệm sinh lý; chẩn đoán hình ảnh gồm CT / X-Ray. Ngoài ra còn các order bữa ăn, chuyển khoa / buồng / giường, chỉ định task và ra viện / chuyển ngoại trú.

Clinical Order

Kê đơn

Tiêm

Xét nghiệm

Điều trị

Hình ảnh

Xét nghiệm tâm lý

Xét nghiệm sinh lý

CT / X-Ray

Bữa ăn

Chuyển khoa / buồng / giường

Chỉ định task

Ra viện / chuyển ngoại trú

Sơ đồ vừa khung

Một order framework, nhiều loại order, mỗi loại có form và rule riêng.
  • Order thường và order có điều kiện. Bên cạnh order thường, IF order chỉ được thực thi khi một điều kiện xác định xảy ra, nên phải lưu trigger condition, title, comment, state và execution logic.
  • Order cart. Trên Karte, bác sĩ nhập order theo từng tab; order chỉ được tạo cho tab hiện tại khi thêm vào cart, còn dữ liệu đã nhập ở các tab khác vẫn được giữ. Cart đóng vai trò staging area trước khi xác nhận clinical order.
  • Xác nhận. Một số order cần approval, consent, countersign hoặc nhiều mức xác nhận, và order list thể hiện từng bước xác nhận.
  • Tiếp nhận và thực thi. Sau khi được xác nhận, order chuyển sang các danh sách order toàn hệ thống, nơi staff phù hợp tiếp nhận và trở thành người phụ trách thực thi. Lần thực thi ghi lại ngày giờ, người thực thi, trạng thái và các input riêng của order; X-Ray, tiêm và điều trị có màn hình thực thi riêng.
  • Thực thi hàng loạt chỉ được phép khi hợp lý: checkbox bị disable với các order không thể thực thi cùng nhau, tùy loại order, trạng thái, yêu cầu booking, yêu cầu tiếp nhận và mức sẵn sàng.
  • Tìm kiếm lọc theo bệnh nhân, tuổi, giới tính, ngày order, khoa, ward, bác sĩ, điều dưỡng và team rehabilitation; người dùng có thể lưu, xóa và dùng lại điều kiện tìm kiếm.
Vòng đời của một clinical orderBác sĩ mở Karte, chọn loại order, nhập thông tin rồi thêm vào order cart. Bước review / confirm kiểm tra xem có cảnh báo hoặc cần approval không: nếu có thì xử lý cảnh báo hoặc xác nhận trước, nếu không thì phát hành order ngay. Order đã phát hành vào order list, staff phụ trách tiếp nhận, thực thi rồi chuyển sang completed. Order đã phát hành hoặc đã được tiếp nhận vẫn có thể bị thay đổi, suspend hoặc cancel.

Có

Không

Bác sĩ mở Karte

Chọn loại Order

Nhập thông tin Order

Thêm vào Order Cart

Review / Confirm

Có cảnh báo hoặc cần approval?

Xử lý cảnh báo / xác nhận

Phát hành Order

Order List

Staff tiếp nhận Order

Thực thi

Completed

Change / Suspend / Cancel

Sơ đồ vừa khung

Order không đi thẳng từ tạo tới hoàn tất. Nó được xác nhận, tiếp nhận và thực thi bởi những người khác nhau — và có thể bị đổi, suspend hoặc cancel dọc đường.

Các loại order có rule riêng

  • Kê đơn: nội trú hoặc ngoại trú, khoa, bảo hiểm, loại đơn, ngày bắt đầu và kết thúc, thông tin thuốc, đơn trước đó, comment, phiếu thông tin thuốc, IF order và thực thi ngay. Hệ thống có thể đưa ra cảnh báo trước khi tạo order; bác sĩ xác nhận cảnh báo, quay lại sửa, hoặc tiếp tục — một bước an toàn lâm sàng nằm ngay trong workflow.
  • Xét nghiệm và hình ảnh: xét nghiệm tâm lý, sinh lý, xét nghiệm cận lâm sàng, CT và X-Ray, mỗi loại có khoa, bảo hiểm, lịch, cách chỉ định và trạng thái thực thi. Chỉ định hình ảnh có thể là tạm thời hoặc định kỳ, cho một ngày, nhiều ngày, một khoảng ngày hoặc ngày chưa xác định; thực thi X-Ray ghi số order, thời gian, người thực thi, và yêu cầu xác nhận lại khi order thay đổi.
  • Điều trị: tạm thời hoặc định kỳ, có lịch thực thi, comment và staff phụ trách.
  • Bữa ăn: order và lịch sử bữa ăn, loại bữa và khung giờ, thay đổi tạm thời, comment và thời gian áp dụng thay đổi.
  • Chuyển khoa / buồng / giường: ngày giờ, khoa, bảo hiểm, tòa nhà, buồng, giường và bác sĩ chính.
  • Ra viện và chuyển sang ngoại trú: một thay đổi trạng thái mà các module khác phải đi theo.

Nội trú và điều dưỡng

Công việc nội trú có danh sách và màn hình riêng: danh sách trạng thái bệnh nhân, danh sách bệnh nhân cho bác sĩ và cho điều dưỡng, bed map theo ward / buồng / giường, nhập liệu của bác sĩ khi đi buồng, flow sheet, nhật ký điều dưỡng ward và ngoại trú. Ra ngoài và ngủ qua đêm có cả vòng đời yêu cầu — thời hạn, trạng thái, lịch sử, hủy yêu cầu và trạng thái trở về — còn hạn chế vận động có danh sách riêng. Vì chuyển buồng và ra viện làm đổi trạng thái giường, bed map phải luôn khớp với việc di chuyển của bệnh nhân.

Workflow bệnh nhân nội trúBệnh nhân nội trú có trạng thái bệnh nhân và vị trí ward / buồng / giường. Trạng thái bệnh nhân dẫn tới doctor round, workflow điều dưỡng và flow sheet. Bệnh nhân còn liên quan tới bữa ăn, chuyển khoa / buồng, ra ngoài / ngủ qua đêm, hạn chế vận động và các clinical order. Clinical order có thể dẫn tới ra viện; việc chuyển buồng cập nhật lại ward / buồng / giường.

Bệnh nhân nội trú

Trạng thái bệnh nhân

Ward / Buồng / Giường

Doctor Round

Workflow điều dưỡng

Flow Sheet

Bữa ăn

Chuyển khoa / buồng

Ra ngoài / ngủ qua đêm

Hạn chế vận động

Clinical Orders

Ra viện

Sơ đồ vừa khung

Bệnh nhân nội trú nằm ở trung tâm của trạng thái, vị trí, chăm sóc và order — và tất cả đều thay đổi.

Lịch, task và giao tiếp trong team

Việc chăm sóc được tổ chức thành task của team: mỗi task có người thực thi, nội dung chỉ định, comment, người ra chỉ định, deadline và trạng thái, và có thể đăng ký ngay từ hồ sơ bệnh nhân. Xung quanh task là bàn giao, announcement, notification và entry point tới chat trên header.

Schedule và taskLịch của bệnh nhân, của staff và của facility cùng đổ vào một schedule. Schedule sinh ra task / ToDo, và task nối vào clinical workflow hằng ngày.

Bệnh nhân

Staff

Facility

Schedule

Task / ToDo

Clinical Workflow

Sơ đồ vừa khung

Lịch của bệnh nhân, staff và facility gặp nhau ở một chỗ và biến thành task trong ngày.

Xây một frontend quy mô lớn

Frontend dùng file-based routing của Nuxt, tách riêng components, components dùng chung, hooks, pages, plugins và assets. Các phần dùng chung — staff selector, modal, form component dùng lại — được viết một lần; Vuetify là UI framework, SCSS để override style, Axios để gọi API. Để phát triển nhiều màn hình song song khi API chưa xong, project định nghĩa API mock bằng axios-mock-server, nên frontend không phải chờ backend.

Quy trình phát triển frontendScreen và API specification được chuyển thành API mock, còn thiết kế UI từ XD được dựng thành Vue component. Component dùng dữ liệu mock để lắp thành Nuxt page, qua code review, rồi tích hợp với API thật và test / debug.

Screen / API Specification

Thiết kế UI / XD

API Mock

Vue Components

Nuxt Page

Code Review

Tích hợp API thật

Test / Debug

Sơ đồ vừa khung

Specification thành mock và component trước; API thật đến ở cuối, không phải ở đầu.

Kiến trúc

Trình duyệt chạy ứng dụng Nuxt, Vue và TypeScript, gọi backend API qua Axios. Tài liệu development mô tả PostgreSQL trên AWS RDS, Redis trong luồng đăng nhập, và S3 cho image / content ở một số luồng. Backend framework không được nêu ở đây vì tài liệu nguồn chưa đủ để xác định chắc chắn.

Kiến trúc kỹ thuật mức high-level của Waroku Hospital KarteTrình duyệt của nhân viên bệnh viện chạy ứng dụng Nuxt, Vue và TypeScript, giao diện dựng bằng Vuetify và SCSS. Ứng dụng gọi backend API qua Axios API client. Backend API làm việc với PostgreSQL trên AWS RDS, Redis và AWS S3. Backend framework cụ thể không được ghi vì tài liệu nguồn chưa đủ để xác định.

Trình duyệt của nhân viên bệnh viện

Nuxt / Vue / TypeScript

Vuetify / SCSS

Axios API Client

Backend APIs

Redis

AWS RDS PostgreSQL

AWS S3

Sơ đồ vừa khung

Sơ đồ mức thành phần theo những gì tài liệu dự án thể hiện — không phải bản sao hạ tầng production.

Dự án bao phủ những gì

Bài toán của một hệ thống quản lý lớnThể hiện trong Waroku Hospital Karte
Nhiều role, một hệ thốngMenu bác sĩ, điều dưỡng và bộ phận hỗ trợ dựng từ role và authority
Cấu hình nhiều tổ chứcContext group, organization và hospital; menu riêng theo hospital lấy từ API
Workflow có nhiều người tham giaOrder được tạo, xác nhận, tiếp nhận và thực thi bởi những người khác nhau; đổi, suspend, cancel; order có điều kiện
Kiểm tra an toàn ngay trong workflowCảnh báo kê đơn, approval, consent và countersign trước khi order được phát hành
Tài nguyên phải luôn nhất quánVị trí ward / buồng / giường khớp với chuyển buồng và ra viện
Lập lịch cho người và nơi chốnLịch bệnh nhân, staff và facility đổ vào task của team
Số lượng màn hình rất lớnComponent dùng chung, modal dùng lại, convention và API mock để làm song song
Specification bằng ngôn ngữ khácScreen / API specification tiếng Nhật chuyển thành implementation bởi team tại Việt Nam

Các sơ đồ được dựng lại ở mức thành phần từ specification của dự án. Chúng lược bỏ URL nội bộ, định danh hệ thống, source code độc quyền và dữ liệu thật của bệnh nhân hay bệnh viện. Ảnh chụp là wireframe demo với dữ liệu mẫu.

Ảnh 1 trên 9