Bối cảnh và vấn đề nghiên cứu
Tại các thành phố lớn như Thành phố Hồ Chí Minh, hệ thống các bệnh viện tuyến trung tâm thường xuyên đối mặt với tình trạng quá tải nghiêm trọng. Người dân từ các tỉnh thành xa phải di chuyển từ sáng sớm để xếp hàng lấy số thứ tự khám bệnh. Thực trạng này dẫn đến nhiều bất cập như người bệnh không đủ chỗ ngồi chờ, mệt mỏi, chen lấn và phải tốn nhiều thời gian chờ đợi mà không thể rời khỏi khu vực phòng khám. Đặc biệt, trong bối cảnh bùng phát của dịch bệnh COVID-19, việc tập trung đông người tại các cơ sở y tế tiềm ẩn nguy cơ lây nhiễm chéo cao, khiến nhu cầu ứng dụng công nghệ để phân luồng khám bệnh và theo dõi sức khỏe tại nhà trở nên cấp thiết.
Nhằm giải quyết những bất cập trên, đề tài khóa luận "Xây dựng app đặt lịch khám bệnh và theo dõi sức khỏe" (ứng dụng mang tên "my-doctor") được thực hiện với các mục tiêu và nhiệm vụ nghiên cứu cụ thể:
- Nghiên cứu tổng quan và ứng dụng các công nghệ lập trình hiện đại gồm React Native (ứng dụng di động), ReactJS (giao diện web quản trị/bác sĩ) và NodeJS (hệ thống máy chủ dịch vụ).
- Xây dựng ứng dụng di động hỗ trợ bệnh nhân đặt lịch khám bệnh theo khoa hoặc theo bác sĩ, quản lý hồ sơ bệnh án cá nhân, theo dõi các chỉ số sinh hiệu (BMI, huyết áp, nhịp tim) và nhận thông báo số thứ tự khám theo thời gian thực.
- Tích hợp giải pháp trí tuệ nhân tạo thông qua API của EndlessMedical nhằm hỗ trợ dự đoán sơ bộ các nguy cơ bệnh lý dựa trên bảng khảo sát triệu chứng y tế.
- Xây dựng trang web quản trị dành cho nhân viên y tế (Bác sĩ, Y tá) và Quản trị viên (Admin) để quản lý lịch khám, tiếp nhận bệnh nhân, cập nhật bệnh án, kê đơn thuốc và quản lý dịch vụ y tế.
Đối tượng nghiên cứu của đề tài là quy trình đăng ký, tiếp nhận khám chữa bệnh ngoại trú và phương thức quản lý dữ liệu sức khỏe cá nhân. Phạm vi nghiên cứu bao gồm việc thiết kế, xây dựng và kiểm thử hệ sinh thái phần mềm gồm ứng dụng di động chạy trên hai hệ điều hành Android và iOS kết hợp cổng quản trị trên nền tảng Web, được thực hiện tại Khoa Công nghệ Thông tin – Trường Đại học Sư phạm Kỹ thuật Thành phố Hồ Chí Minh vào tháng 07 năm 2022.
Cơ sở lý thuyết và phương pháp
Đề tài áp dụng các cơ sở lý thuyết về kỹ thuật phần mềm, mô hình phân tích thiết kế hệ thống hướng đối tượng và kiến trúc phân tầng:
- Kiến trúc phần mềm: Áp dụng mô hình MVC (Model - View - Controller) nhằm tách biệt logic xử lý dữ liệu, giao diện người dùng và khối điều hướng điều khiển.
- Môi trường thực thi và Web Framework: Sử dụng JavaScript Runtime NodeJS chạy trên nền tảng Google V8 Engine với cơ chế I/O bất đồng bộ (Non-blocking I/O) và Event Loop (gồm Call Stack hoạt động theo cơ chế LIFO, Event Queue hoạt động theo FIFO, phân tách xử lý Microtask cho Promise và Macrotask cho các hàm định thời). Phía máy chủ sử dụng Express Framework để xây dựng hệ thống REST API theo chuẩn giao thức HTTP với các phương thức GET, POST, PUT, DELETE và hệ thống mã phản hồi chuẩn (200 OK, 204, 4xx Client Error, 5xx Server Error).
- Công nghệ phát triển giao diện (Front-end):
- React Native: Framework phát triển ứng dụng di động đa nền tảng (Android, iOS) thông qua việc kết nối JSX với các API Native (Objective-C API trên iOS và Java API trên Android).
- ReactJS: Thư viện xây dựng ứng dụng web đơn trang (Single Page Application - SPA) với cơ chế luồng dữ liệu một chiều (one-way data binding) và DOM ảo (Virtual DOM) giúp tối ưu hóa hiệu năng kết xuất giao diện.
- Cơ sở dữ liệu và dịch vụ hỗ trợ: Kết hợp hệ quản trị cơ sở dữ liệu quan hệ MySQL cho dữ liệu nghiệp vụ chính cùng nền tảng đám mây Firebase (Firebase Authentication xác thực OTP qua SMS, Cloud Firestore quản lý dữ liệu dạng NoSQL JSON và Firebase Cloud Messaging để đẩy thông báo đến thiết bị qua mã Token).
- Mô hình chẩn đoán AI: Tích hợp bộ API từ dịch vụ EndlessMedical với cơ chế phiên làm việc (Session) để thu thập triệu chứng và trả về danh sách dự đoán bệnh.
Phương pháp nghiên cứu thực tế bao gồm: phương pháp khảo sát hiện trạng các ứng dụng y tế đang vận hành; phương pháp phân tích yêu cầu phần mềm; phương pháp mô hình hóa chức năng (Sơ đồ phân rã chức năng, Use Case Diagram, Activity Diagram); phương pháp thiết kế cơ sở dữ liệu và phương pháp kiểm thử chức năng trên công cụ Postman và Visual Studio Code.
Thiết kế và triển khai
Hệ thống được thiết kế thành hai phân hệ độc lập nhưng đồng bộ dữ liệu: phân hệ Ứng dụng di động (dành cho Bệnh nhân) và phân hệ Quản trị Web (dành cho Bác sĩ, Y tá, Quản trị viên).
1. Ánh xạ thành phần giao diện React Native
React Native ánh xạ các thẻ thành phần cơ bản sang các đối tượng tương ứng trên từng nền tảng:
| Thẻ React Native |
Thành phần Android |
Thành phần iOS |
Thành phần Web |
<View> |
<ViewGroup> |
<UIView> |
<div> |
<Text> |
<TextView> |
<UIText> |
<p> |
<TextInput> |
<EditText> |
<UITextField> |
<input type='text'> |
<Image> |
<ImageView> |
<UIImageView> |
<img> |
2. Tích hợp quy trình chẩn đoán EndlessMedical API
Hệ thống kết nối trực tiếp với máy chủ EndlessMedical thông qua URL cơ sở http://api.com/v1/dx theo quy trình gồm 5 bước:
| Bước thực hiện |
Endpoint API |
Phương thức |
Dữ liệu trả về khi thành công |
Dữ liệu trả về khi thất bại |
| Khởi tạo phiên (Session) |
/InitSession |
GET |
{"status": "ok", "SessionID": "<string>"} |
- |
| Ký cam kết điều khoản |
/AcceptTermsOfUse |
POST |
{"status": "ok"} |
{"status": "error", "error": "Couldn't find SessionID."} |
| Thêm/Sửa triệu chứng |
/UpdateFeature |
POST |
{"status": "ok"} |
{"status": "error", "error": "Couldn't find SessionID."} |
| Xóa triệu chứng |
/DeleteFeature |
POST |
{"status": "ok"} |
{"status": "error", "error": "Couldn't find SessionID."} |
| Phân tích và chẩn đoán |
/Analyze |
GET |
{"status": "ok", "Diseases": [...]} |
{"status": "error", "error": "Couldn't find SessionID."} |
3. Ma trận phân quyền hệ thống (Role-based Access Matrix)
Hệ thống thiết lập ma trận phân quyền chi tiết cho 3 nhóm đối tượng: Quản trị viên (Admin), Bác sĩ và Bệnh nhân.
| STT |
Chức năng nghiệp vụ |
Quản trị |
Bác sĩ |
Bệnh nhân |
| 1 |
Đăng nhập hệ thống |
X |
X |
X |
| 2 |
Đăng xuất |
X |
X |
X |
| 3 |
Đăng ký tài khoản |
- |
X |
X |
| 4 |
Quên mật khẩu / Đổi mật khẩu |
- |
X |
X |
| 5 |
Xác thực OTP / Cập nhật hồ sơ cá nhân |
- |
- |
X |
| 6 |
Quản lý chỉ số BMI, huyết áp, nhịp tim |
- |
- |
X |
| 7 |
Đặt lịch khám theo khoa / theo bác sĩ |
- |
- |
X |
| 8 |
Theo dõi số thứ tự khám thời gian thực |
- |
- |
X |
| 9 |
Đăng nhập hệ thống Web |
X |
X |
- |
| 10 |
Xem biểu đồ thống kê |
X |
X |
- |
| 11 |
Tạo số thứ tự khám bệnh trực tiếp trên Web |
X |
X |
- |
| 12 |
Xem thông tin chi tiết / Tìm kiếm bác sĩ |
X |
X |
X |
| 13 |
Quản lý dịch vụ bác sĩ |
X |
- |
- |
| 14 |
Đăng ký & Thanh toán dịch vụ y tế |
X |
- |
X |
| 15 |
Quản lý danh sách bệnh nhân đăng ký dịch vụ |
X |
X |
- |
| 16 |
Tạo bệnh án, chẩn đoán và kê đơn thuốc |
X |
X |
- |
| 17 |
Xem danh sách STT khám và lọc theo phòng |
X |
X |
- |
| 18 |
Chẩn đoán sơ bộ bằng AI |
X |
X |
X |
| 19 |
Nhắn tin tư vấn Bác sĩ - Bệnh nhân |
X |
X |
X |
| 20 |
Cài đặt nhắc nhở uống thuốc |
- |
- |
X |
| 21 |
Quản lý phòng khám & Thêm lịch khám bác sĩ |
X |
- |
- |
(Ghi chú: Ký hiệu "X" biểu thị vai trò có quyền truy cập và thực thi chức năng; ký hiệu "-" biểu thị không có quyền).
Nội dung chính theo từng chương
Phần mở đầu
Tác giả trình bày tính cấp thiết của đề tài xuất phát từ nhu cầu giảm tải cho các bệnh viện tuyến đầu tại TP.HCM, hạn chế tụ tập đông người phòng chống dịch bệnh COVID-19, giúp người dân ở xa chủ động đăng ký số thứ tự khám từ xa. Đề tài đặt mục tiêu xây dựng thành công ứng dụng "my-doctor" bằng bộ công nghệ React Native, ReactJS và NodeJS.
Chương 1: Cơ sở lý thuyết
Chương này tổng kết toàn bộ kiến thức chuyên ngành liên quan đến công nghệ phát triển hệ thống:
- Phân tích các đặc trưng của React Native, bao gồm cơ chế rendering native, phân loại 6 nhóm Component (Component cơ bản, User Interface, ListView, Component cho Android, Component cho iOS, Component tiện ích khác), các ưu điểm về tái sử dụng mã nguồn và nhược điểm về hiệu năng quản lý bộ nhớ.
- Trình bày cơ chế hoạt động của NodeJS: V8 Engine, Non-blocking I/O, mô hình luồng đơn (Single-threaded) kết hợp Event Loop để giải quyết bài toán nghẽn I/O khi phục vụ nhiều yêu cầu client đồng thời.
- Giới thiệu kiến trúc RESTful API xây dựng bằng Express, mô tả cấu trúc JSON và các chuẩn mã phản hồi HTTP.
- Tổng quan về ReactJS (Virtual DOM, SPA), các dịch vụ nền tảng Firebase (SMS OTP, Cloud Firestore, Cloud Messaging) và bộ API chẩn đoán y tế EndlessMedical.
Chương 2: Khảo sát hiện trạng
Tác giả tiến hành khảo sát, đánh giá ưu điểm và khuyết điểm của 3 ứng dụng y tế phổ biến trên thị trường:
| Tên ứng dụng |
Ưu điểm chính |
Hạn chế / Khuyết điểm |
| UMC – Đăng ký khám bệnh Online |
Cho phép chọn bác sĩ, khung giờ khám; đặt lịch cho người thân; thanh toán trực tuyến; gửi thông tin số thứ tự qua email; có nhắc uống thuốc. |
Bảo mật chưa cao (chỉ đăng nhập một lần); không lưu trữ các thông số sức khỏe; thiếu tính năng nhắn tin tư vấn trực tiếp với bác sĩ. |
| AIHealth |
Mạng lưới phòng khám rộng; hỗ trợ tìm bác sĩ riêng, chat, video call; mua thuốc online giao tận nơi; lưu trữ lịch sử khám và sổ hiến máu; bảo mật OTP. |
Chưa có dịch vụ chăm sóc khách hàng miễn phí; giao diện người dùng còn rối mắt; không hỗ trợ lưu trữ chỉ số sinh hiệu cá nhân. |
| eDoctor |
Kết nối bác sĩ nhanh chóng; hỏi đáp miễn phí; cung cấp dịch vụ chăm sóc sức khỏe tại nhà; tích hợp đếm bước chân trên iOS; có nhà thuốc trực tuyến. |
Bố cục giao diện tương đối phức tạp; thiếu kênh nhắn tin tư vấn trực tiếp với bác sĩ. |
Từ kết quả khảo sát, tác giả định vị ứng dụng "my-doctor" tập trung khắc phục điểm yếu của các giải pháp trước đó bằng cách kết hợp đồng thời: Đặt lịch khám, theo dõi số thứ tự trực tuyến, lưu trữ chỉ số sức khỏe định kỳ (BMI, huyết áp, tim mạch), nhắn tin tư vấn kèm hình ảnh/số liệu sinh hiệu và tích hợp chẩn đoán triệu chứng thông minh.
Chương 3: Tài liệu mô tả hệ thống chức năng
Nội dung chương 3 chi tiết hóa toàn bộ đặc tả hệ thống phần mềm:
- Yêu cầu chức năng: Xác định rõ ràng các luồng nghiệp vụ trên Mobile App (Xác thực OTP, Quản lý chỉ số BMI/huyết áp/nhịp tim, Đặt lịch theo khoa/bác sĩ, Theo dõi STT, Xem hồ sơ bệnh án, Nhắn tin tư vấn, Chẩn đoán AI) và Web App (Đăng nhập y bác sĩ, Cập nhật trạng thái số thứ tự khám, Nhập STT xét nghiệm, Kê đơn thuốc, Quản trị danh mục phòng khám và bác sĩ).
- Đặc tả Use Case chi tiết: Mô tả cấu trúc luồng sự kiện chính (Basic Flow), luồng thay thế (Alternative Flow), điều kiện tiên quyết (Pre-conditions) và điều kiện sau (Post-conditions) cho các nghiệp vụ cốt lõi như Đăng nhập, Đăng xuất, Đặt lịch khám, Đoán bệnh.
- Mô tả giao diện điều khiển (UI Controls): Liệt kê chi tiết các thành phần Input, Button, Text điều hướng và sơ đồ hoạt động (Activity Diagram) tương ứng.
Thiết kế phần mềm, Cài đặt và kiểm thử
Chương này mô tả chi tiết sơ đồ cơ sở dữ liệu quan hệ MySQL, cấu trúc lưu trữ NoSQL trên Cloud Firestore, sơ đồ phân rã chức năng và kết quả cài đặt các màn hình ứng dụng thực tế. Quy trình kiểm thử API được thực hiện qua công cụ Postman để xác nhận tính toàn vẹn của dữ liệu và các luồng phản hồi trạng thái HTTP.
Phần kết luận
Đánh giá tổng kết các kết quả đạt được sau quá trình nghiên cứu và phát triển sản phẩm, đối chiếu với các ứng dụng hiện có trên thị trường, chỉ ra các nhược điểm còn tồn đọng và đề xuất định hướng phát triển trong tương lai.
Kết quả và đóng góp
Kết quả đạt được
- Xây dựng hoàn chỉnh ứng dụng di động: Triển khai thành công ứng dụng "my-doctor" trên nền tảng React Native, hỗ trợ bệnh nhân thực hiện trọn vẹn quy trình: đăng ký tài khoản qua SMS OTP, quản lý nhật ký chỉ số BMI và huyết áp/nhịp tim, đặt lịch khám theo chuyên khoa hoặc theo bác sĩ, theo dõi số thứ tự phòng khám theo thời gian thực và cài đặt lịch nhắc uống thuốc theo toa.
- Xây dựng phân hệ Web quản trị: Triển khai giao diện web bằng ReactJS phục vụ công tác điều phối phòng khám, cập nhật tình trạng khám bệnh theo lượt, tạo hồ sơ bệnh án điện tử, kê đơn thuốc và quản lý dữ liệu lịch làm việc của đội ngũ y bác sĩ.
- Tích hợp thành công các dịch vụ bên thứ ba: Kết nối hệ thống xác thực và thông báo đẩy Firebase (Cloud Messaging, Authentication) và tích hợp hoàn chỉnh 5 endpoint của EndlessMedical API để chẩn đoán sơ bộ danh sách bệnh lý dựa trên tập triệu chứng người dùng cung cấp.
Giải pháp và đóng góp của đề tài
- Đề xuất mô hình tích hợp đồng thời giữa quản lý chỉ số sinh hiệu cá nhân định kỳ với quy trình khám chữa bệnh ngoại trú tại bệnh viện.
- Giải quyết triệt để bài toán chờ đợi tại cơ sở y tế thông qua cơ chế theo dõi số thứ tự khám trực tuyến từ xa, giúp giảm thiểu tình trạng tập trung đông người.
- Cung cấp kênh tương tác trực tiếp (nhắn tin, gửi số đo sức khỏe, hình ảnh) giữa bệnh nhân và bác sĩ phụ trách.
Hạn chế và hướng nghiên cứu tiếp
Hạn chế
- Ứng dụng React Native gặp một số giới hạn về khả năng quản lý bộ nhớ khi xử lý lượng lớn dữ liệu hoặc các tác vụ đồ họa phức tạp.
- Một số tính năng chuyên sâu và việc tối ưu giao diện cho toàn bộ các dòng máy di động với kích thước màn hình khác nhau vẫn cần được hoàn thiện thêm.
- Hệ thống chưa tích hợp tính năng gọi thoại/video call trực tiếp để khám bệnh từ xa.
Hướng nghiên cứu tiếp
- Tích hợp tính năng gọi video call trực tuyến giữa bệnh nhân và bác sĩ nhằm phục vụ công tác khám bệnh từ xa hoàn chỉnh.
- Mở rộng tích hợp các cổng thanh toán trực tuyến đa dạng để hoàn thiện chu trình thanh toán viện phí và dịch vụ y tế trên app.
- Nâng cấp, tối ưu hóa thuật toán gợi ý chuyên khoa và tiếp tục hoàn thiện giao diện người dùng trên nhiều phân khúc thiết bị.
Giá trị tham khảo
Báo cáo khóa luận là tài liệu tham khảo phù hợp cho:
- Sinh viên ngành Công nghệ Thông tin, Kỹ thuật Phần mềm: Tham khảo cách thức tổ chức cấu trúc dự án kết hợp giữa ứng dụng di động React Native, ứng dụng web ReactJS và máy chủ NodeJS/Express; phương pháp thiết kế RESTful API và mô hình hóa hệ thống bằng UML.
- Các nhà phát triển ứng dụng y tế (MedTech): Tham khảo quy trình phân quyền người dùng y tế (Admin - Bác sĩ/Y tá - Bệnh nhân), phương thức tích hợp SMS OTP, Firebase Cloud Messaging và quy trình kết nối API chẩn đoán bệnh từ bên thứ ba (EndlessMedical).
Câu hỏi thường gặp
1. Ứng dụng "my-doctor" sử dụng những công nghệ cốt lõi nào để phát triển?
Hệ thống sử dụng ngôn ngữ lập trình JavaScript với kiến trúc MVC. Phía ứng dụng di động xây dựng bằng React Native; phía ứng dụng Web quản trị xây dựng bằng ReactJS; phía máy chủ (Back-end) xây dựng bằng NodeJS kết hợp Express Framework. Cơ sở dữ liệu sử dụng MySQL và Firebase (Cloud Firestore, Firebase Authentication, Firebase Cloud Messaging).
2. Quy trình dự đoán bệnh bằng AI thông qua EndlessMedical API được thực hiện như thế nào?
Quy trình gồm 5 bước gọi API tuần tự: Khởi tạo phiên qua /InitSession để nhận SessionID; Xác nhận điều khoản sử dụng qua /AcceptTermsOfUse; Thêm hoặc chỉnh sửa thông tin triệu chứng của bệnh nhân qua /UpdateFeature; Xóa triệu chứng sai sót qua /DeleteFeature; và gửi yêu cầu phân tích chẩn đoán qua /Analyze để nhận về danh sách các bệnh lý dự đoán kèm trọng số.
3. Phương thức xác thực người dùng trên ứng dụng di động được triển khai ra sao?
Ứng dụng sử dụng dịch vụ Firebase Authentication để gửi mã xác thực ngẫu nhiên OTP qua tin nhắn SMS đến số điện thoại đăng ký của người dùng. Người dùng phải nhập chính xác mã OTP trong một khoảng thời gian nhất định để hoàn tất các thao tác như đăng ký tài khoản mới, xác thực đổi mật khẩu hoặc lấy lại mật khẩu đã quên.
4. Bệnh nhân có thể theo dõi những chỉ số sức khỏe cá nhân nào trên ứng dụng?
Bệnh nhân có thể nhập, chỉnh sửa, xóa và theo dõi thống kê theo ngày, tháng, năm cho các chỉ số: chiều cao và cân nặng (để tính chỉ số khối cơ thể BMI), nhịp tim, huyết áp tâm thu và huyết áp tâm trương. Dữ liệu này có thể được chia sẻ trực tiếp cho bác sĩ phụ trách khi nhắn tin tư vấn.
5. Khảo sát hiện trạng trong khóa luận chỉ ra nhược điểm chung nào của các ứng dụng UMC, AIHealth và eDoctor?
Khảo sát hiện trạng chỉ ra rằng ứng dụng UMC thiếu tính năng lưu trữ thông số sức khỏe và không có kênh nhắn tin trực tiếp với bác sĩ; ứng dụng AIHealth có giao diện rối mắt và không hỗ trợ lưu chỉ số sức khỏe; trong khi ứng dụng eDoctor cũng có bố cục phức tạp và thiếu tính năng nhắn tin tư vấn trực tiếp với bác sĩ.
Kết luận
Khóa luận tốt nghiệp của sinh viên Lê Nhật Thu An và Lê Thị Ngọc Yến đã hoàn thành trọn vẹn mục tiêu xây dựng ứng dụng "my-doctor" phục vụ đặt lịch khám bệnh và theo dõi sức khỏe cá nhân. Bằng việc kết hợp hiệu quả giữa React Native, ReactJS, NodeJS, Firebase và EndlessMedical API, đề tài đã cung cấp một giải pháp phần mềm hoàn chỉnh giúp giải quyết bài toán quá tải bệnh viện và hạn chế tập trung đông người. Toàn bộ nội dung báo cáo được xây dựng rõ ràng, mạch lạc từ khâu phân tích lý thuyết, khảo sát hiện trạng đến mô hình hóa chức năng và cài đặt thực nghiệm.