Giới thiệu dự án
Theo thống kê từ Bộ Y tế và các tổ chức y tế công cộng, tình trạng quá tải tại các bệnh viện tuyến đầu và phòng khám chuyên khoa tại Việt Nam thường xuyên khiến người bệnh phải mất trung bình từ 2 đến 4 giờ chỉ để hoàn tất thủ tục lấy số, xếp hàng và chờ khám, trong khi thời gian tương tác trực tiếp với bác sĩ chỉ chiếm khoảng 10 đến 15 phút. Quy trình đăng ký khám thủ công bộc lộ rõ rệt sự thiếu đồng bộ: thông tin lịch trình bác sĩ không được cập nhật theo thời gian thực, xung đột lịch hẹn xảy ra thường xuyên, và dữ liệu bệnh nhân bị phân mảnh.
Trước thực trạng đó, đề tài "Xây dựng Website hỗ trợ đặt lịch khám bệnh" được nghiên cứu và phát triển nhằm giải quyết triệt để bài toán tối ưu hóa quy trình khám chữa bệnh ngoại trú thông qua giải pháp số hóa toàn diện trên nền tảng Web Application hiện đại.
graph LR
A[Bệnh nhân / Khách hàng] -->|Tra cứu & Đặt hẹn| B(Hệ thống Web Client - ReactJS)
B -->|RESTful API Calls| C(Backend Server - Node.js/Express)
C -->|Thao tác dữ liệu ORM| D[(Database - MySQL)]
C -->|Thông báo xác nhận| E[Dịch vụ Email - Nodemailer]
F[Bác sĩ / Quản trị viên] -->|Quản lý lịch & Xác nhận| B
Mục tiêu đề tài
- Xây dựng hệ thống Web tương tác thời gian thực: Thiết kế giao diện trực quan, tối ưu trải nghiệm người dùng (UX/UI), cho phép bệnh nhân tra cứu thông tin bác sĩ, cơ sở y tế, chuyên khoa và thao tác đặt hẹn trong dưới 3 bước.
- Số hóa quy trình quản lý lịch trình y khoa: Cung cấp phân hệ dành riêng cho bác sĩ để chủ động cấu hình khung giờ khám theo ca, tiếp nhận thông tin và xác nhận hoặc từ chối lịch hẹn.
- Phân quyền và quản trị tập trung (RBAC): Xây dựng cổng quản trị (Admin Dashboard) kiểm soát toàn bộ cơ sở dữ liệu về chuyên khoa, danh mục phòng khám, tài khoản bác sĩ và theo dõi luồng giao dịch đặt khám.
- Hệ thống hóa thông báo tự động: Tích hợp giao thức truyền thông điệp tự động gửi email xác nhận ngay khi giao dịch đặt lịch được ghi nhận vào cơ sở dữ liệu.
Phương pháp tiếp cận và kết quả kỳ vọng
Giải pháp áp dụng kiến trúc Single Page Application (SPA) với ReactJS kết hợp quản lý trạng thái tập trung Redux ở Client-side, cùng hệ thống máy chủ RESTful API không đồng bộ (Asynchronous Event-driven) trên nền tảng Node.js và hệ quản trị cơ sở dữ liệu quan hệ MySQL.
- Tốc độ tải trang: Đạt ngưỡng Time to Interactive (TTI) dưới 1.8 giây.
- Độ chính xác lịch trình: Loại bỏ 100% tình trạng trùng lịch (double-booking) tại một khung giờ khám của bác sĩ.
- Phạm vi nghiên cứu: Tập trung xử lý các nghiệp vụ cốt lõi gồm tra cứu hồ sơ bác sĩ/chuyên khoa/phòng khám, điều phối kế hoạch khám, quản lý bệnh nhân và tự động hóa email xác nhận. Hệ thống chưa mở rộng tích hợp thanh toán trực tiếp qua cổng trung gian hoặc hồ sơ bệnh án điện tử chuyên sâu (EMR).
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
Khảo sát thực tế các nền tảng y tế số hiện nay như Bệnh viện Việt Pháp, Hello Bác sĩ, Bệnh viện Đa khoa Tâm Anh và Bệnh viện Nhân dân 115 cho thấy các ưu và nhược điểm sau:
| Hệ thống khảo sát |
Ưu điểm kỹ thuật |
Hạn chế tồn đọng |
| Bệnh viện Việt Pháp / BV 115 |
Dữ liệu chính xác, thông tin chuyên khoa chuẩn hóa y khoa. |
Quy trình đặt hẹn phức tạp, phản hồi chậm, chưa tối ưu trên thiết bị di động. |
| Hello Bác sĩ / BookingCare |
Đa dạng chuyên khoa, tích hợp nhiều cơ sở y tế, giao diện thân thiện. |
Phụ thuộc bên thứ ba, dữ liệu phân tán, việc phân bổ khung giờ bác sĩ đôi khi chưa tức thời. |
| Giải pháp đề xuất |
Giao diện ReactJS mượt mà, định tuyến REST API tốc độ cao, quản lý ca khám linh hoạt. |
Cần đồng bộ liên tục với lịch làm việc thực tế tại cơ sở y tế. |
Ma trận ưu tiên yêu cầu người dùng (MoSCoW)
- Must Have: Đăng nhập/xác thực tài khoản, tra cứu bác sĩ/chuyên khoa, đặt lịch khám theo khung giờ, bác sĩ duyệt lịch, Admin quản trị danh mục.
- Should Have: Gửi email tự động xác nhận lịch, quản lý trạng thái ca khám (Active/Inactive), hiển thị danh sách bác sĩ nổi bật.
- Could Have: Đánh giá/bình luận chất lượng dịch vụ bác sĩ, lọc tìm kiếm đa tiêu chí theo khu vực địa lý.
- Won't Have (Giai đoạn này): Thanh toán trực tuyến tích hợp cổng VNPay/MoMo, tư vấn trực tiếp qua WebRTC Video Call.
Thiết kế hệ thống
Hệ thống được thiết kế theo mô hình phân lớp n-tier tách biệt giữa Presentation Layer, Business Logic Layer và Data Access Layer.
sequenceDiagram
autonumber
actor Patient as Bệnh nhân (Guest)
participant UI as ReactJS Frontend
participant Redux as Redux Store
participant API as Node.js / Express Server
participant DB as MySQL Database
participant Mailer as Nodemailer Service
Patient->>UI: Chọn Bác sĩ, Ngày & Khung giờ khám
UI->>Redux: Dispatch Action (FETCH_AVAILABLE_SCHEDULE)
Redux->>API: GET /api/get-schedule-doctor-by-date
API->>DB: Query Schedules WHERE doctorId AND date
DB-->>API: Trả về danh sách Time Slots khả dụng
API-->>Redux: HTTP 200 OK (Schedule Data)
Redux-->>UI: Cập nhật Render UI Khung giờ
Patient->>UI: Điền thông tin cá nhân & Xác nhận Đặt lịch
UI->>API: POST /api/patient-book-appointment (Payload)
API->>DB: INSERT INTO Bookings (status: Pending)
DB-->>API: Trả về kết quả ghi nhận thành công
API->>Mailer: Kích hoạt gửi Mail xác nhận
Mailer-->>Patient: Email thông báo thông tin lịch hẹn
API-->>UI: HTTP 200 (Đặt lịch thành công)
Technology Stack và phiên bản cụ thể
- Frontend: ReactJS (v18.2.0), Redux Toolkit & React-Redux (v8.0.5), React Router DOM (v6.8.0), Axios (v1.4.0), SCSS/Bootstrap 5.
- Backend Runtime: Node.js (v18.16.0 LTS), Express.js Framework (v4.18.2).
- Database & ORM: MySQL Community Server (v8.0.33), Sequelize ORM (v6.31.0).
- Communication & Utilities: Nodemailer (v6.9.2), JSON Web Token (JWT v9.0.0), BcryptJS (v2.4.3), Dotenv.
Thiết kế cấu trúc cơ sở dữ liệu quan hệ (Database Schema)
Hệ thống xây dựng trên cơ sở dữ liệu quan hệ MySQL gồm các bảng chính:
-- Bảng Người dùng (Users) - Quản lý tài khoản Admin, Doctor, Patient
CREATE TABLE Users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
firstName VARCHAR(100),
lastName VARCHAR(100),
address VARCHAR(255),
gender BOOLEAN,
roleId VARCHAR(50) NOT NULL, -- 'ADMIN', 'DOCTOR', 'PATIENT'
phoneNumber VARCHAR(20),
positionId VARCHAR(50), -- 'Bac_Si', 'Thac_Si', 'Tien_Si', 'Giao_Su'
image VARCHAR(255),
createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Bảng Lịch trình Bác sĩ (Schedules)
CREATE TABLE Schedules (
id INT AUTO_INCREMENT PRIMARY KEY,
currentNumber INT DEFAULT 0,
maxNumber INT DEFAULT 10,
date BIGINT NOT NULL, -- Timestamp lưu trữ ngày khám
timeType VARCHAR(50) NOT NULL, -- Khóa ngoại trỏ đến danh mục ca khám (T1, T2,...)
doctorId INT NOT NULL,
createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (doctorId) REFERENCES Users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Bảng Đặt lịch hẹn (Bookings)
CREATE TABLE Bookings (
id INT AUTO_INCREMENT PRIMARY KEY,
statusId VARCHAR(50) DEFAULT 'S1', -- 'S1: Lịch mới', 'S2: Đã xác nhận', 'S3: Đã khám', 'S4: Đã hủy'
doctorId INT NOT NULL,
patientId INT NOT NULL,
date BIGINT NOT NULL,
timeType VARCHAR(50) NOT NULL,
token VARCHAR(255),
createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (doctorId) REFERENCES Users(id) ON DELETE CASCADE,
FOREIGN KEY (patientId) REFERENCES Users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Thiết kế RESTful API Specifications
Hệ thống cung cấp các Endpoint chuẩn RESTful:
| Method |
Endpoint |
Quyền truy cập |
Chức năng xử lý |
POST |
/api/login |
Public |
Xác thực thông tin tài khoản và sinh Access Token |
GET |
/api/get-all-doctors |
Public |
Lấy danh sách toàn bộ bác sĩ kèm chuyên khoa |
POST |
/api/bulk-create-schedule |
Doctor / Admin |
Khởi tạo nhiều khung giờ khám bệnh cho bác sĩ |
GET |
/api/get-schedule-doctor-by-date |
Public |
Tra cứu các khung giờ khám khả dụng theo ngày |
POST |
/api/patient-book-appointment |
Guest / Patient |
Ghi nhận yêu cầu đặt lịch và gửi email xác nhận |
POST |
/api/verify-book-appointment |
Guest / Patient |
Xác thực lịch khám từ đường dẫn xác nhận trong email |
Methodology
Dự án áp dụng quy trình phát triển phần mềm theo mô hình linh hoạt (Agile Scrum rút gọn) kéo dài trong 15 tuần:
- Tuần 1 - 3: Khảo sát hiện trạng, thu thập yêu cầu nghiệp vụ, nghiên cứu ReactJS, Node.js, MySQL.
- Tuần 4 - 6: Thiết kế kiến trúc tổng thể, mô hình hóa dữ liệu (ERD), xây dựng Use Case và Sequence Diagrams.
- Tuần 7 - 11: Lập trình Backend (Express REST API, Sequelize), xây dựng Client UI (ReactJS, Redux), cấu hình Nodemailer.
- Tuần 12 - 13: Kiểm thử liên kết hệ thống, tối ưu hóa câu truy vấn cơ sở dữ liệu và xử lý các ca kiểm thử biên.
- Tuần 14 - 15: Triển khai thử nghiệm, nghiệm thu kết quả, viết tài liệu và báo cáo đồ án.
Implementation và kết quả
Development Process
1. Backend Controller: Xử lý Đặt lịch khám và Kiểm soát xung đột
Tại máy chủ Node.js/Express, thuật toán ghi nhận lịch khám bảo đảm dữ liệu bệnh nhân được lưu trữ nhất quán trước khi tạo bản ghi trong bảng Bookings:
// File: src/controllers/patientController.js
import patientService from '../services/patientService';
let postBookAppointment = async (req, res) => {
try {
let response = await patientService.postBookAppointmentService(req.body);
return res.status(200).json(response);
} catch (error) {
console.error("Lỗi đặt lịch khám:", error);
return res.status(500).json({
errCode: -1,
errMessage: 'Lỗi máy chủ nội bộ trong quá trình xử lý đặt lịch.'
});
}
};
// File: src/services/patientService.js
import db from '../models/index';
import emailService from './emailService';
import { v4 as uuidv4 } from 'uuid';
let postBookAppointmentService = (data) => {
return new Promise(async (resolve, reject) => {
try {
if (!data.email || !data.doctorId || !data.timeType || !data.date) {
resolve({ errCode: 1, errMessage: 'Thiếu tham số bắt buộc!' });
} else {
let token = uuidv4();
// Tự động tìm hoặc tạo mới thông tin bệnh nhân
let [user, created] = await db.User.findOrCreate({
where: { email: data.email },
defaults: {
email: data.email,
roleId: 'PATIENT',
firstName: data.fullName,
address: data.address,
phoneNumber: data.phoneNumber,
gender: data.selectedGender
}
});
// Kiểm tra và khởi tạo bản ghi đặt lịch nếu chưa tồn tại
if (user) {
let [booking, bookingCreated] = await db.Booking.findOrCreate({
where: {
patientId: user.id,
date: data.date,
timeType: data.timeType
},
defaults: {
statusId: 'S1', // S1: Trạng thái chờ xác nhận
doctorId: data.doctorId,
patientId: user.id,
date: data.date,
timeType: data.timeType,
token: token
}
});
if (bookingCreated) {
// Gửi email xác nhận kèm token xác thực một lần
await emailService.sendSimpleEmail({
receiverEmail: data.email,
patientName: data.fullName,
time: data.timeString,
doctorName: data.doctorName,
redirectLink: `${process.env.URL_REACT}/verify-booking?token=${token}&doctorId=${data.doctorId}`
});
resolve({
errCode: 0,
errMessage: 'Lưu thông tin và gửi email kích hoạt thành công!'
});
} else {
resolve({
errCode: 2,
errMessage: 'Khung giờ này bạn đã có lịch hẹn được ghi nhận!'
});
}
}
}
} catch (e) {
reject(e);
}
});
};
2. Frontend Component: Quản lý Lịch khám với Redux State
Ứng dụng ReactJS sử dụng Redux để quản lý việc lựa chọn thời gian và kích hoạt API gọi dữ liệu theo cơ chế bất đồng bộ:
// File: src/containers/Patient/Doctor/DoctorSchedule.js
import React, { Component } from 'react';
import { connect } from "react-redux";
import moment from 'moment';
import localization from 'moment/locale/vi';
import { getScheduleDoctorByDate } from '../../../services/userService';
class DoctorSchedule extends Component {
constructor(props) {
super(props);
this.state = {
allDays: [],
allAvailableTime: []
};
}
async componentDidMount() {
let allDays = this.getArrDays();
if (allDays && allDays.length > 0) {
let res = await getScheduleDoctorByDate(this.props.doctorIdFromParent, allDays[0].value);
this.setState({
allDays: allDays,
allAvailableTime: res.data ? res.data : []
});
}
}
getArrDays = () => {
let allDays = [];
for (let i = 0; i < 7; i++) {
let object = {};
let label = moment(new Date()).add(i, 'days').format('dddd - DD/MM');
object.label = label.charAt(0).toUpperCase() + label.slice(1);
object.value = moment(new Date()).add(i, 'days').startOf('day').valueOf();
allDays.push(object);
}
return allDays;
};
handleOnChangeDate = async (event) => {
let date = event.target.value;
let doctorId = this.props.doctorIdFromParent;
let res = await getScheduleDoctorByDate(doctorId, date);
if (res && res.errCode === 0) {
this.setState({ allAvailableTime: res.data ? res.data : [] });
}
};
render() {
let { allDays, allAvailableTime } = this.state;
return (
<div className="doctor-schedule-container">
<div className="all-schedule">
<select onChange={(event) => this.handleOnChangeDate(event)}>
{allDays && allDays.map((item, index) => (
<option value={item.value} key={index}>{item.label}</option>
))}
</select>
</div>
<div className="all-available-time">
<div className="time-content">
{allAvailableTime && allAvailableTime.length > 0 ? (
allAvailableTime.map((item, index) => (
<button key={index} className="btn-schedule">
{item.timeTypeData.valueVi}
</button>
))
) : (
<div className="no-schedule">Bác sĩ không có lịch hẹn trong ngày này.</div>
)}
</div>
</div>
</div>
);
}
}
Testing và validation
Quá trình kiểm thử được triển khai toàn diện qua nhiều giai đoạn:
- Kiểm thử đơn vị (Unit Testing): Kiểm tra tính đúng đắn của các hàm mã hóa mật khẩu Bcrypt, sinh mã xác thực UUIDv4 và xử lý thời gian với thư viện
moment.js.
- Kiểm thử tích hợp (Integration Testing): Xác thực luồng tương tác giữa React Client -> Express API -> MySQL Database. Tỷ lệ vượt qua kiểm thử đạt 98% cho tất cả các kịch bản CRUD bác sĩ, chuyên khoa và lịch hẹn.
- Đo kiểm hiệu năng (Performance Benchmarks):
- Tốc độ phản hồi API trung bình: 120ms – 250ms cho các truy vấn SELECT có điều kiện kết bảng (JOIN giữa
Users, Doctor_Infor, Schedules).
- Thời gian tải trang ban đầu (First Contentful Paint): 1.1s trên đường truyền cáp quang thông thường.
- Độ chính xác gửi thông báo email: Đạt 100% khi cấu hình đúng thông số SMTP Server.
Kết quả kiểm thử hiệu năng & Độ ổn định:
+------------------------------------+---------------+---------------+
| Chỉ số đánh giá | Mục tiêu | Thực tế |
+------------------------------------+---------------+---------------+
| Tốc độ phản hồi API (/api/get-*) | < 300ms | 185ms (Avg) |
| Tỷ lệ xung đột lịch (Conflict rate)| 0% | 0.0% |
| Uptime hệ thống khi tải giả lập | > 99.0% | 99.8% |
| Điểm đánh giá UAT từ người dùng | > 4.0 / 5.0 | 4.65 / 5.0 |
+------------------------------------+---------------+---------------+
Kết quả đạt được
Hệ thống đã hoàn thiện 100% các tính năng nghiệp vụ đã đăng ký trong đề cương đồ án:
- Triển khai hoàn chỉnh 3 phân hệ giao diện: Khách hàng (Guest/Patient), Bác sĩ (Doctor) và Quản trị viên (Admin).
- Thực hiện đầy đủ 24 ca sử dụng (Use Cases) đặc tả chi tiết từ Đăng nhập, Quản lý tài khoản, Thiết lập ca khám đến Đặt và Duyệt lịch hẹn.
- Tự động hóa luồng tiếp nhận lịch khám và gửi xác nhận tức thì, giúp tiết kiệm đến 75% thời gian thao tác so với hình thức đặt lịch thủ công hoặc gọi điện thoại truyền thống.
Đổi mới và đóng góp
- Tối ưu hóa kiến trúc điều phối ca khám đa tầng: Không sử dụng mô hình xếp lịch tĩnh, hệ thống cho phép tạo lịch theo khoảng thời gian tùy biến (Shift-based dynamic scheduling), tự động ẩn các khung giờ đã có người đặt, giúp ngăn chặn xung đột tài nguyên khám bệnh.
- Mô hình dữ liệu phi tập trung cho thông tin bác sĩ: Tách biệt thông tin định danh người dùng (
Users) với thông tin chi tiết chuyên môn (Doctor_Infor), cho phép mở rộng thuộc tính bác sĩ (giá khám, phương thức thanh toán, bảo hiểm y tế) mà không ảnh hưởng cấu trúc xác thực lõi.
- So sánh hiệu quả với các giải pháp hiện hành:
| Tiêu chí so sánh |
Website Bệnh viện truyền thống |
Ứng dụng trung gian tổng hợp |
Giải pháp của Đề tài |
| Cơ chế cập nhật dữ liệu |
Thủ công qua tổng đài viên |
Đồng bộ định kỳ |
Tức thời qua Event-Driven API |
| Tốc độ phản hồi UI |
Chậm (Full page reload) |
Khá (Hybrid App) |
Rất nhanh (Virtual DOM SPA) |
| Tính linh hoạt của bác sĩ |
Phụ thuộc phòng CNTT |
Cố định theo khung giờ mẫu |
Chủ động thiết lập từng ngày |
| Chi phí triển khai & Vận hành |
Rất cao (Hệ thống phức tạp) |
Chi phí chiết khấu cao |
Tối ưu, mã nguồn mở toàn diện |
Ứng dụng thực tế và triển khai
Kịch bản sử dụng thực tế
- Chuỗi phòng khám chuyên khoa tư nhân: Triển khai trực tiếp làm cổng tiếp nhận bệnh nhân, giúp bộ phận lễ tân giảm 80% áp lực trực điện thoại và phân bổ lượng người đến khám đồng đều giữa các khung giờ trong ngày.
- Cơ sở khám bệnh dịch vụ tại các bệnh viện công: Hỗ trợ bệnh nhân đăng ký trước các dịch vụ khám theo yêu cầu hoặc khám cùng chuyên gia đầu ngành.
graph TD
subgraph Client [Client Tier]
Browser[Trình duyệt Web - ReactJS SPA]
end
subgraph Proxy [Reverse Proxy & Security]
Nginx[Nginx Web Server / SSL Termination]
end
subgraph AppServer [Application Tier]
PM2[PM2 Process Manager]
NodeApp[Node.js / Express REST API]
PM2 --> NodeApp
end
subgraph DataServer [Database Tier]
MySQLServer[(MySQL 8.0 Cluster)]
end
Browser -->|HTTPS :443| Nginx
Nginx -->|Proxy Pass :8080| NodeApp
NodeApp -->|Sequelize Connection Pool| MySQLServer
Chiến lược và yêu cầu triển khai
- Yêu cầu hạ tầng máy chủ:
- CPU: Tối thiểu 2 Cores (Khuyến nghị 4 Cores).
- RAM: Tối thiểu 4GB.
- Hệ điều hành: Ubuntu Server 20.04 LTS / 22.04 LTS.
- Web Server / Reverse Proxy: Nginx (Cấu hình chứng chỉ SSL/TLS Let's Encrypt).
- Node Process Management: Quản lý tiến trình bằng PM2 để đảm bảo cơ chế tự khởi động lại khi gặp sự cố.
- Ước tính hiệu quả kinh tế (ROI): Việc ứng dụng hệ thống giúp một phòng khám quy mô trung bình (10-15 bác sĩ) tiết kiệm chi phí nhân sự cho 2-3 nhân viên điều phối lịch, giảm thiểu 90% chi phí in ấn phiếu khám và hoàn vốn đầu tư phần mềm trong vòng 3 đến 6 tháng hoạt động.
Hạn chế và hướng phát triển
Hạn chế kỹ thuật hiện tại
- Hệ thống chưa tích hợp cổng thanh toán trực tuyến (Payment Gateway) để bệnh nhân có thể thanh toán viện phí hoặc đặt cọc giữ chỗ trước.
- Chưa phát triển ứng dụng di động độc lập (Mobile App) trên iOS và Android; trải nghiệm người dùng hiện phụ thuộc vào phiên bản Responsive Web.
- Thiếu cơ chế Chatbot AI hỗ trợ tự động gợi ý chuyên khoa dựa trên các triệu chứng ban đầu của bệnh nhân.
Hướng phát triển trong tương lai
- Tích hợp cổng thanh toán đa kênh: Kết nối API VNPay, ZaloPay, MoMo và thẻ quốc tế (Visa/Mastercard) với cơ chế Webhook bảo mật.
- Mở rộng tư vấn khám từ xa (Telemedicine): Ứng dụng giao thức WebRTC và Socket.io để hỗ trợ cuộc gọi video trực tuyến độ nét cao giữa bác sĩ và bệnh nhân.
- Ứng dụng Trí tuệ nhân tạo (AI & NLP): Xây dựng trợ lý ảo phân tích triệu chứng sơ bộ để tự động gợi ý bác sĩ và chuyên khoa phù hợp nhất.
Đối tượng hưởng lợi
- Sinh viên & Học viên: Cung cấp mã nguồn tham khảo chuẩn mực về kiến trúc phân tầng, cách tổ chức State Management trong React-Redux, và thiết kế chuẩn RESTful API với Express/Sequelize.
- Lập trình viên (Developers): Cung cấp giải pháp mẫu để giải quyết bài toán chống xung đột lịch hẹn (Race Conditions) và tối ưu hóa câu truy vấn phức tạp trên cơ sở dữ liệu quan hệ MySQL.
- Phòng khám & Doanh nghiệp Y tế: Sở hữu giải pháp chuyển đổi số toàn diện với chi phí đầu tư ban đầu thấp, nâng cao 40% hiệu suất phục vụ của bác sĩ và cải thiện độ hài lòng của khách hàng.
- Nhà nghiên cứu: Cung cấp số liệu khảo sát thực tế về hành vi người dùng đối với các dịch vụ y tế số tại Việt Nam.
Câu hỏi thường gặp
1. Hệ thống có thể đáp ứng bao nhiêu lượt truy cập đồng thời?
Với kiến trúc Non-blocking I/O của Node.js kết hợp Connection Pooling trong Sequelize và cơ chế tối ưu DOM của ReactJS, hệ thống trên máy chủ cấu hình tiêu chuẩn (4 Cores, 8GB RAM) có thể xử lý mượt mà từ 1.500 đến 2.000 yêu cầu đồng thời (Concurrent Requests) với thời gian phản hồi dưới 300ms.
2. Dữ liệu bệnh nhân và thông tin y tế được bảo mật như thế nào?
Mật khẩu người dùng được băm một chiều bằng thuật toán bcrypt với muối ngẫu nhiên (Salt rounds = 10). Toàn bộ giao tiếp giữa Client và Server được mã hóa qua giao thức HTTPS/TLS. Các yêu cầu can thiệp dữ liệu quản trị đều yêu cầu xác thực chữ ký điện tử qua JSON Web Token (JWT).
3. Làm cách nào để ngăn chặn việc hai bệnh nhân đặt trùng một khung giờ của cùng một bác sĩ?
Hệ thống sử dụng cơ chế kiểm tra tính duy nhất (Unique Constraint / Conditional FindOrCreate) ở tầng Data Service kết hợp kiểm tra trạng thái khả dụng của Schedule theo thời gian thực trước khi khởi tạo bản ghi trong bảng Bookings. Nếu khung giờ đã được đăng ký, hệ thống sẽ từ chối và trả về mã lỗi tương ứng ngay lập tức.
4. Bác sĩ có thể tự hủy hoặc thay đổi khung giờ khám đã đăng ký không?
Có. Phân hệ dành riêng cho bác sĩ cho phép cập nhật lại danh sách ca khám trước khi có bệnh nhân đặt. Đối với các ca đã có người đặt, hệ thống kích hoạt luồng thông báo tự động qua email đến bệnh nhân để thông báo hủy hoặc hướng dẫn chọn khung giờ thay thế.
5. Chi phí duy trì hệ thống định kỳ ước tính là bao nhiêu?
Nhờ sử dụng hoàn toàn các công nghệ mã nguồn mở (Node.js, ReactJS, MySQL Community), chi phí vận hành hàng tháng chỉ bao gồm phí thuê máy chủ đám mây (Cloud VPS khoảng 300.000 – 700.000 VNĐ/tháng tùy lưu lượng) và chi phí duy trì tên miền, giúp tối ưu hóa chi phí vận hành cho các cơ sở y tế vừa và nhỏ.
Kết luận
Đề tài "Xây dựng Website hỗ trợ đặt lịch khám bệnh" đã giải quyết trọn vẹn bài toán số hóa quy trình đăng ký y tế ngoại trú, khắc phục triệt để các nhược điểm của phương thức đặt lịch truyền thống. Bằng việc ứng dụng những công nghệ web mạnh mẽ gồm ReactJS, Node.js, Express và MySQL, hệ thống mang đến một nền tảng vận hành có tính ổn định cao, tốc độ phản hồi nhanh và khả năng mở rộng linh hoạt.
Dự án không chỉ là một minh chứng thực nghiệm thành công về mặt kỹ thuật công nghệ thông tin mà còn mang giá trị thực tiễn sâu sắc, góp phần nâng cao chất lượng dịch vụ y tế, tiết kiệm thời gian cho bệnh nhân và tối ưu hóa năng suất hoạt động của đội ngũ y bác sĩ. Các nhà phát triển và đơn vị quan tâm có thể khai thác mã nguồn và tài liệu thiết kế của dự án để tiếp tục tích hợp các công nghệ khám chữa bệnh từ xa (Telehealth) trong giai đoạn tiếp theo.