
Revita
Thông tin chung
Hệ thống quản lý khám bệnh thông minh tích hợp gợi ý chẩn đoán và chatbot dành cho phòng khám đa khoa
Thành viên
- Lê Hoàng Khang · developer@iamhoangkhang.id.vn
- Trần Đình Kiên
Mã nguồn
| Thành phần | Chức năng | Công nghệ | Thực hiện | |
|---|---|---|---|---|
| Frontend | Giao diện web quản trị và đặt lịch khám | Next.js | Khang, Kiên | GitHub |
| Backend | API server và logic nghiệp vụ | NestJS | Khang, Kiên | GitHub |
| Desktop | Ứng dụng desktop cho màn hình chờ và kiosk | Electron | Khang | GitHub |
| Mobile | Ứng dụng di động cho bệnh nhân và bác sĩ | React Native | Kiên | GitHub |
| Sympdiag | Gợi ý chẩn đoán dựa trên triệu chứng | FastAPI, scikit-learn | Khang | GitHub |
I. Giới thiệu
Quy trình khám bệnh tại các phòng khám đa khoa ở Việt Nam gồm nhiều giai đoạn nối tiếp: lấy số thứ tự, làm thủ tục hành chính để đăng ký khám, chỉ định các dịch vụ chẩn đoán và thủ thuật cần thiết, thanh toán chi phí, rồi bác sĩ chẩn đoán và kê đơn. Quy trình này cần nhân viên hành chính, bác sĩ, bệnh nhân và thu ngân phối hợp chặt chẽ. Dân số già hóa nhanh và nhu cầu y tế ngày càng tăng khiến việc giữ hiệu quả và công bằng rất khó, nhất là khi các bước thủ công gây ùn tắc và sai sót.
Để giải quyết vấn đề này, nhóm xây dựng Revita, hệ thống quản lý khám bệnh thông minh tích hợp gợi ý chẩn đoán và chatbot cho phòng khám đa khoa, nhằm tối ưu và tự động hóa toàn bộ quy trình khám. Hệ thống giảm tải công việc hành chính và nâng cao trải nghiệm của cả bệnh nhân lẫn bác sĩ.
Revita chạy trên web, di động và máy tính để bàn, xây dựng bằng Next.js, NestJS, React Native và Electron, cho phép người dùng tương tác mọi lúc, mọi nơi: từ đặt lịch khám trực tuyến đến hiển thị số thứ tự theo thời gian thực trên kiosk.
Điểm nổi bật là hệ thống gợi ý chẩn đoán dựa trên ghi chú y khoa, hỗ trợ bác sĩ phân tích triệu chứng và đề xuất các tình trạng bệnh phù hợp. Hệ thống dùng xử lý ngôn ngữ tự nhiên (NLP) để trích xuất thông tin từ văn bản lâm sàng, kết hợp thuật toán gợi ý dựa trên nội dung để đưa ra đề xuất nhanh và chính xác.
II. Kiến trúc phần mềm
Web, mobile, desktop. Chỉ hiển thị dữ liệu và thu thập tương tác.
Cổng vào duy nhất: TLS, định tuyến theo kênh, cân bằng tải, WebSocket.
Backend-for-Frontend cho từng kênh người dùng, kèm dịch vụ gợi ý chẩn đoán.
Quy tắc nghiệp vụ: lịch khám, độ ưu tiên, thanh toán, mã hóa bệnh án.
Prisma Client kết hợp Repository Pattern, an toàn kiểu dữ liệu.
Dữ liệu quan hệ, dữ liệu thuốc phi cấu trúc, cache và hàng đợi sự kiện.
Revita dùng kiến trúc phân tầng (layered architecture): mỗi tầng có trách nhiệm riêng, tách biệt giao diện, nghiệp vụ và dữ liệu, giúp hệ thống dễ bảo trì và mở rộng.
Tầng giao diện người dùng (Client Layer)
Ba ứng dụng khác nền tảng nhưng thống nhất trải nghiệm:
- Web xây dựng bằng Next.js với App Router
- Ứng dụng di động bằng React Native, tối ưu hiệu năng trên cả iOS và Android
- Ứng dụng desktop đóng gói bằng Electron cho các tác vụ nặng tại phòng khám
Các ứng dụng chỉ hiển thị dữ liệu và thu thập tương tác, không chứa logic nghiệp vụ.
Tầng trình diễn (Presentation Layer)
Nginx là cổng giao tiếp duy nhất với bên ngoài: chấm dứt kết nối TLS, định tuyến theo kênh người dùng, cân bằng tải, giới hạn tần suất truy cập và chuyển tiếp WebSocket mà không làm gián đoạn luồng dữ liệu thời gian thực. Khi triển khai, Nginx do Coolify tích hợp và quản lý tự động.
Tầng ứng dụng (Application Layer)
Các instance NestJS tổ chức theo mô hình Backend-for-Frontend. Mỗi instance phục vụ một kênh người dùng qua các Controller riêng: tiếp nhận yêu cầu, xác thực phiên, kiểm tra dữ liệu đầu vào và điều phối xuống các tầng dưới. Cách tách này cho phép tối ưu cấu trúc phản hồi theo từng nền tảng mà không làm API phức tạp thêm. Tầng này còn chứa dịch vụ gợi ý chẩn đoán viết bằng FastAPI.
Tầng dịch vụ (Service Layer)
Nơi tập trung toàn bộ quy tắc nghiệp vụ cốt lõi. Các Service là đơn vị xử lý thuần, không phụ thuộc cơ sở dữ liệu hay giao thức truyền tải, nên nhất quán và kiểm thử độc lập được. Tại đây diễn ra các quyết định như:
- Kiểm tra ràng buộc lịch khám
- Tính độ ưu tiên khi phân phối bệnh nhân vào quầy thủ tục, phòng khám, buồng khám phù hợp
- Xử lý thanh toán đa phương thức (tiền mặt, chuyển khoản)
- Mã hóa và giải mã thông tin bệnh án khi lưu và đọc
Tầng truy cập dữ liệu (Data Access Layer)
Prisma Client kết hợp Repository Pattern, là trung gian duy nhất giữa nghiệp vụ và các cơ sở dữ liệu, cung cấp giao diện thống nhất và an toàn kiểu dữ liệu cho mọi thao tác đọc ghi. Mô hình dữ liệu thay đổi thì mã truy cập được sinh lại và phản ánh ngay trên toàn hệ thống.
Tầng lưu trữ (Persistence Layer)
Dùng đồng thời ba hệ quản trị cơ sở dữ liệu theo đặc thù dữ liệu:
- PostgreSQL: bảo đảm toàn vẹn và nhất quán cho các thực thể có quan hệ phức tạp, đặc biệt quan trọng trong lĩnh vực y tế.
- MongoDB: lưu dữ liệu thuốc lấy từ OpenFDA. Dữ liệu dược rất lớn và cấu trúc đa dạng nên tách khỏi cơ sở dữ liệu chính để giảm thời gian sao lưu và tận dụng MongoDB cho tìm kiếm thuốc.
- Redis: bộ nhớ đệm, và Redis Stream làm message queue để xử lý yêu cầu đồng thời với độ trễ thấp, nhận và phát sự kiện khi bệnh nhân bốc số vào quầy thủ tục hoặc phòng khám.
III. Sơ đồ triển khai hệ thống
Application server riêng
Hệ thống triển khai theo mô hình CI/CD tự động bằng Coolify và Docker trên DigitalOcean. Khi đẩy mã lên GitHub, Coolify nhận webhook, kéo phiên bản mới nhất, build Docker image rồi triển khai lên application server. Nginx tích hợp trong Coolify quản lý định tuyến HTTPS và WebSocket, giữ kết nối an toàn và thời gian thực giữa các client (web, mobile, desktop) và server.
PostgreSQL (dữ liệu cấu trúc), MongoDB (dữ liệu phi cấu trúc) và Redis (cache, session, stream) chạy trực tiếp trên server. Redis Stream đóng vai trò hàng đợi sự kiện, xử lý bất đồng bộ các tác vụ như thông báo, cập nhật lịch hẹn và đồng bộ dữ liệu thời gian thực qua WebSocket.
Các dịch vụ bên thứ ba được tích hợp:
- Gemini 2.5 Flash: gợi ý AI
- Resend: gửi email thông báo
- Supabase: lưu trữ ảnh, tài liệu
- AWS SNS: gửi mã OTP qua SMS
- PayOS: thanh toán trực tuyến
- TinyMCE: soạn thảo văn bản
Mô hình gợi ý chẩn đoán huấn luyện bằng Python với scikit-learn, triển khai thành microservice FastAPI. Khi bác sĩ yêu cầu gợi ý, NestJS chuẩn hóa dữ liệu đầu vào rồi gọi HTTPS tới FastAPI để nhận danh sách chẩn đoán đề xuất.
IV. Công nghệ sử dụng
Next.js
Giao diện web quản trị và đặt lịch khám 24/7, dùng SSR và SSG để tải trang nhanh, tốt cho SEO và mượt trên mọi thiết bị.
NestJS
Backend trung tâm: lịch khám, hồ sơ bệnh nhân, độ ưu tiên theo quy định pháp luật và thanh toán chuyển khoản.
React Native
Ứng dụng di động cho bệnh nhân và bác sĩ: đặt lịch, nhận thông báo, tra cứu hồ sơ trên iOS và Android từ một mã nguồn.
Electron
Ứng dụng desktop cho màn hình chờ và kiosk tự phục vụ, hiển thị số thứ tự theo thời gian thực.
FastAPI
Microservice AI xử lý gợi ý chẩn đoán từ ghi chú y khoa và chatbot hỗ trợ bệnh nhân.
Gemini 2.5 Flash
Lõi AI của chatbot tư vấn 24/7 cho bệnh nhân khi đến khám.
PostgreSQL
Cơ sở dữ liệu chính cho toàn bộ nghiệp vụ của Revita.
Redis
Bộ nhớ đệm hiệu năng cao, Redis Streams lưu luồng sự kiện theo thời gian thực.
MongoDB
Lưu trữ dữ liệu thuốc khối lượng lớn, cấu trúc linh hoạt.
Supabase
Lưu trữ tệp đa phương tiện của hệ thống.
Docker
Chuẩn hóa môi trường triển khai, đồng nhất giữa phát triển và vận hành.
Nginx
Reverse proxy và SSL termination, định tuyến request tới Next.js, NestJS, FastAPI, tự cấp và gia hạn chứng chỉ Let’s Encrypt.
Swagger
Tự sinh tài liệu API tương tác cho NestJS, thử endpoint ngay trên trình duyệt, giúp web và mobile tích hợp nhanh.
V. Quy trình khám chữa bệnh
- 1
Bệnh nhân đặt lịch trước (hoặc đến trực tiếp) và nhập thông tin khám. Người khám lần đầu nhập thông tin mới; người đã từng khám nhập mã hồ sơ, số điện thoại hoặc mã đặt lịch. Hệ thống phân phối bệnh nhân vào các quầy thủ tục theo cơ chế xoay vòng có ưu tiên.
- 2
Nhân viên quầy thủ tục gọi bệnh nhân; bệnh nhân theo dõi màn hình chờ để biết khi nào tới lượt.
- 3
Sau khi làm thủ tục, bệnh nhân mang phiếu chỉ định đến quầy thu ngân. Thu ngân tạo hóa đơn cho các dịch vụ bệnh nhân muốn thực hiện. Thanh toán bằng tiền mặt (thu ngân xác nhận khi nhận tiền) hoặc chuyển khoản qua mã thanh toán của hóa đơn; chuyển khoản thành công thì hệ thống tự cập nhật và xuất hóa đơn.
- 4
Nếu bệnh nhân đã đặt lịch hoặc chọn bác sĩ ở quầy thủ tục, thanh toán xong sẽ vào thẳng hàng chờ của bác sĩ đó. Nếu không, bệnh nhân check-in tại kiosk hoặc nhờ nhân viên khu khám xác nhận để vào hàng chờ.
- 5
Bác sĩ gọi bệnh nhân theo thứ tự hàng chờ, chẩn đoán, tạo bệnh án và đơn thuốc. Cần thêm dịch vụ thì bác sĩ tạo phiếu chỉ định, bệnh nhân quay lại bước 3.
- 6
Làm xong các dịch vụ được chỉ định, bệnh nhân quay lại khu khám check-in để chờ kết quả.
VI. Chức năng chính
- Đề xuất và xác nhận lịch làm việc
- Đặt lịch hẹn khám bệnh
- Lấy số thứ tự đến quầy thủ tục
- Cập nhật bệnh án, kết quả sau khi khám hoặc thực hiện dịch vụ
- Quản lý phiếu chỉ định, bệnh án, đơn thuốc
- Chatbot hỗ trợ bệnh nhân (không chẩn đoán, không kê đơn hay đưa lời khuyên ảnh hưởng tới sức khỏe)
- Gợi ý chẩn đoán dựa trên bệnh án (chỉ dành cho bác sĩ trong hệ thống)
VII. Sơ đồ lớp
VIII. Hiện thực
Màn hình tiếp nhận bệnh nhân
Nhân viên xem thông tin bệnh nhân khi bệnh nhân lấy số đến quầy thủ tục.

Diễn đàn bài viết của phòng khám

Quản lý thông tin cơ sở của phòng khám

Quản lý các dịch vụ tại phòng khám

Quản lý lịch khám chữa bệnh của bác sĩ

Tạo phiếu chỉ định cho bệnh nhân

Xem thông tin bệnh án

Xem thông tin bệnh nhân
Thông tin hành chính, các bệnh án, lịch sử khám chữa bệnh tại phòng khám.

Thanh toán dịch vụ

