Revita
Next.js
NestJS
React Native
Electron
FastAPI
PostgreSQL
MongoDB
Redis
Docker

Revita

0 lượt xem

Thông tin chung

Đồ án tốt nghiệp01/2024 – 06/2024 · 6 tháng phát triển

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

Mã nguồn

Thành phầnChức năngCông nghệThực hiện
FrontendGiao diện web quản trị và đặt lịch khámNext.jsKhang, KiênGitHub
BackendAPI server và logic nghiệp vụNestJSKhang, KiênGitHub
DesktopỨng dụng desktop cho màn hình chờ và kioskElectronKhangGitHub
MobileỨng dụng di động cho bệnh nhân và bác sĩReact NativeKiênGitHub
SympdiagGợi ý chẩn đoán dựa trên triệu chứngFastAPI, scikit-learnKhangGitHub

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

Giao diện người dùngClient Layer

Web, mobile, desktop. Chỉ hiển thị dữ liệu và thu thập tương tác.

Next.jsReact NativeElectron
Trình diễnPresentation Layer

Cổng vào duy nhất: TLS, định tuyến theo kênh, cân bằng tải, WebSocket.

Nginx
Backend · NestJS + FastAPI
Ứng dụngApplication Layer

Backend-for-Frontend cho từng kênh người dùng, kèm dịch vụ gợi ý chẩn đoán.

NestJSFastAPI
Dịch vụService Layer

Quy tắc nghiệp vụ: lịch khám, độ ưu tiên, thanh toán, mã hóa bệnh án.

Truy cập dữ liệuData Access Layer

Prisma Client kết hợp Repository Pattern, an toàn kiểu dữ liệu.

Prisma
Lưu trữPersistence Layer

Dữ liệu quan hệ, dữ liệu thuốc phi cấu trúc, cache và hàng đợi sự kiện.

PostgreSQLRedisMongoDB

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

Người dùng
Desktop AppElectron · kiosk, màn hình chờ
Mobile AppReact Native
BrowserWeb quản trị, đặt lịch
Lập trình viên
GitHubpush mã nguồn
Internet / DNS
Server · DigitalOcean (Coolify quản lý)
NginxTLS, định tuyến HTTPS và WebSocket
Front-EndNext.js
Back-EndNestJS
Redis Streamhàng đợi sự kiện
Coolifydeploy Front-End, Back-End, Nginx
Docker
Cơ sở dữ liệu
PostgreSQL
MongoDB
Redis
Dịch vụ bên ngoài
Gemini2.5 Flash
Resendemail
Supabaselưu trữ tệp
AWS SNSOTP qua SMS
PayOSthanh toán
TinyMCEsoạn thảo
Gợi ý chẩn đoán

Application server riêng

FastAPI
Python
scikit-learn

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. 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. 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. 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. 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. 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. 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

Sơ đồ lớp của Revita

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.

Màn hình tiếp nhận bệnh nhân

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

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ý 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ý 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ĩ

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

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

Xem thông tin bệ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.

Xem thông tin bệnh nhân

Thanh toán dịch vụ

Thanh toán dịch vụ