Giới thiệu dự án

Quá trình chuyển đổi số trong ngành y tế đang diễn ra mạnh mẽ trên toàn cầu nhằm giải quyết bài toán quá tải tại các cơ sở khám chữa bệnh. Theo thống kê của Bộ Y tế, thời gian chờ đợi trung bình của một bệnh nhân tại các bệnh viện công lập và phòng khám đa khoa tuyến đầu dao động từ 2 đến 4 giờ, trong đó hơn 65% thời gian dành cho các thủ tục hành chính như lấy số thứ tự, đăng ký thông tin cá nhân và chờ gọi tên vào phòng khám. Quy trình truyền thống này không chỉ gây lãng phí nguồn lực xã hội mà còn tạo áp lực lớn lên đội ngũ nhân viên y tế, đồng thời làm tăng nguy cơ lây nhiễm chéo trong không gian chờ kín.

Đồ án tốt nghiệp "Xây dựng phần mềm đặt lịch khám bệnh tại cơ sở y tế" do sinh viên Nguyễn Tiến Dũng và Ngô Công Huân (ngành Công nghệ Thông tin, Trường Đại học Sư phạm Kỹ thuật TP.HCM) thực hiện dưới sự hướng dẫn của PGS.TS Hoàng Văn Dũng, tập trung giải quyết các bài toán cốt lõi sau:

  • Tình trạng tắc nghẽn cục bộ tại quầy tiếp đón do việc tiếp nhận bệnh nhân thủ công và phân bổ khung giờ chưa tối ưu.
  • Thiếu hụt kênh tương tác hai chiều thời gian thực giữa bác sĩ và bệnh nhân trước khi thăm khám thực tế.
  • Khó khăn trong việc quản lý hồ sơ bệnh án đa đối tượng, đặc biệt là nhu cầu đặt lịch hộ cho người thân (trẻ em, người cao tuổi) trên cùng một tài khoản định danh.
  • Rủi ro trùng lặp lịch hẹn (double-booking) và xung đột khung giờ khám của bác sĩ tại các chuyên khoa.

Mục tiêu dự án

  1. Xây dựng hệ sinh thái phần mềm đa nền tảng gồm ứng dụng di động (Android Native) cho người bệnh và hệ thống web đa chức năng (ReactJS) phục vụ người bệnh, bác sĩ, bệnh viện và quản trị viên (Admin).
  2. Thiết kế và triển khai kiến trúc backend hướng dịch vụ (Service-Oriented Architecture) dựa trên Node.js và ExpressJS, cung cấp RESTful API xử lý dữ liệu tập trung với độ trễ thấp và khả năng mở rộng cao.
  3. Tích hợp giải pháp thanh toán không dùng tiền mặt qua cổng thanh toán ZaloPay và lưu trữ đa phương tiện (hình ảnh triệu chứng bệnh án) qua Cloudinary và Firebase Cloud Storage.
  4. Xây dựng module tư vấn sức khỏe từ xa (Telehealth) hỗ trợ nhắn tin và cuộc gọi trực tuyến, kết hợp module quản trị kho dược phẩm dành riêng cho cơ sở y tế.

Phương pháp tiếp cận và kết quả kỳ vọng

Dự án áp dụng phương pháp tiếp cận hướng module kết hợp kiến trúc Client-Server phi đồng bộ. Việc lưu trữ dữ liệu phi quan hệ (NoSQL) với MongoDB cho phép mở rộng linh hoạt cấu trúc dữ liệu y tế phức tạp. Hệ thống hướng đến mục tiêu giảm 70% thời gian chờ đợi tại cơ sở y tế, đảm bảo 100% lịch hẹn được phân bổ chính xác theo thời gian thực (real-time slot allocation) và tỷ lệ sẵn sàng của hệ thống đạt trên 99.5%.

Phạm vi đề tài tập trung vào chu trình đặt lịch ngoại trú, quản lý hồ sơ bệnh nhân, quản trị lịch làm việc của bác sĩ, danh mục thuốc và đánh giá chất lượng dịch vụ. Các nghiệp vụ nội trú chuyên sâu và tích hợp phần mềm bảo hiểm y tế quốc gia không thuộc phạm vi nghiên cứu của giai đoạn này.


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 hành tại Việt Nam cho thấy bức tranh phân hóa rõ nét về tính năng và trải nghiệm người dùng:

Tiêu chí YouMed Medpro BookingCare Hệ thống Đề tài
Nền tảng hỗ trợ Web, Android, iOS Web, Android, iOS Web, Android, iOS Web (ReactJS), Android (Java)
Hồ sơ bệnh nhân Cơ bản Đa hồ sơ gia đình Đơn lẻ theo tài khoản Hỗ trợ nhiều hồ sơ/tài khoản
Tư vấn từ xa Nhắn tin/Gọi điện Gọi thoại/Video Đặt lịch tư vấn Nhắn tin & Nhận cuộc gọi tư vấn
Quản lý nhà thuốc Không hỗ trợ Không hỗ trợ Không hỗ trợ Tích hợp module quản lý thuốc
Trải nghiệm UX/UI Chứa quảng cáo Mất dữ liệu khi back form Chuyển Fragment giật lag Tối ưu luồng đặt lịch, không quảng cáo
Cổng thanh toán Thẻ/Ví điện tử Đa cổng thanh toán Thẻ/Chuyển khoản ZaloPay Gateway & Tại cơ sở

Hệ thống yêu cầu được phân tích và sắp xếp theo mô hình MoSCoW:

  • Must have (Bắt buộc): Xác thực người dùng (JWT/Firebase Authentication), tra cứu thông tin cơ sở y tế/bác sĩ/chuyên khoa, đặt lịch khám theo khung giờ định sẵn, kiểm soát trùng lịch, quản lý hồ sơ khám cá nhân, bảng điều khiển (Dashboard) phân quyền 4 vai trò (Admin, Hospital/Host, Doctor, Patient).
  • Should have (Nên có): Tích hợp thanh toán ZaloPay, đánh giá phản hồi (Rating & Review) sau khám, upload ảnh bệnh án qua Cloudinary, quản lý kho thuốc bệnh viện.
  • Could have (Có thể có): Tư vấn sức khỏe từ xa (chat/call), thông báo đẩy thời gian thực qua Firebase Cloud Messaging (FCM).
  • Won't have (Chưa thực hiện): Đồng bộ chuẩn y tế quốc tế HL7/FHIR, nhận diện đơn thuốc tự động bằng OCR.

Thiết kế hệ thống

Kiến trúc tổng thể của hệ thống được thiết kế theo mô hình phân tầng Client-Server tách biệt, kết nối thông qua giao thức truyền tải HTTPS RESTful API:

graph TD
    subgraph Client_Layer ["Tầng Giao Diện (Client Layer)"]
        A1["Android Native App (Java, Android SDK API 34)"]
        A2["Web Application (ReactJS 18.2, Virtual DOM)"]
    end

    subgraph Gateway_API ["Tầng Xử Lý & Dịch Vụ (Backend Layer)"]
        B1["API Gateway / Routing (ExpressJS 4.19)"]
        B2["Controller & Business Logic (NodeJS 20.x Non-blocking I/O)"]
        B3["Authentication & Authorization Middleware (JWT)"]
    end

    subgraph Data_Storage ["Tầng Lưu Trữ & Dịch Vụ Đám Mây"]
        C1[("MongoDB Database v7.0")]
        C2["Firebase Services (Auth, FCM, Storage)"]
        C3["Cloudinary API (Medical Media CDN)"]
        C4["ZaloPay Payment Gateway API"]
    end

    A1 -->|RESTful API Calls| B1
    A2 -->|RESTful API Calls| B1
    B1 --> B3
    B3 --> B2
    B2 -->|Mongoose ORM Queries| C1
    B2 -->|SDK Events| C2
    B2 -->|Image Upload Stream| C3
    B2 -->|Order Verification| C4

Công nghệ sử dụng và phiên bản

  • Frontend Web: ReactJS v18.2.0 (tận dụng Virtual DOM, JSX, Props & State Management, Single Page Application architecture).
  • Mobile Client: Android SDK (Java 17, Min API Level 26, Target API Level 34, Android Debug Bridge - ADB, Dalvik/ART runtime).
  • Backend Runtime: NodeJS v20.12.0 kết hợp ExpressJS v4.19.2 (mô hình Single-Threaded Event Loop, Non-blocking I/O).
  • Cơ sở dữ liệu: MongoDB v7.0 Community Server (Mongoose ODM v8.3.0).
  • Dịch vụ tích hợp: Firebase SDK v10.11.0 (Authentication, Cloud Messaging), Cloudinary SDK v2.0, ZaloPay Sandbox Payment API.

Thiết kế cơ sở dữ liệu (Database Schema)

Dữ liệu được tổ chức dưới dạng các Collections JSON/BSON linh hoạt. Dưới đây là cấu trúc schema cho hai thực thể quan trọng nhất: appointments (Lịch hẹn) và patient_profiles (Hồ sơ bệnh nhân):

// Collection: appointments
{
  "_id": {"$oid": "6673a9e2f1a23b0012c45d01"},
  "patient_id": {"$oid": "6673a8adf1a23b0012c45ce9"},
  "profile_id": {"$oid": "6673a910f1a23b0012c45cf2"},
  "doctor_id": {"$oid": "6673a711f1a23b0012c45ca0"},
  "hospital_id": {"$oid": "6673a620f1a23b0012c45c85"},
  "specialty_id": {"$oid": "6673a6e0f1a23b0012c45c92"},
  "appointment_date": "2024-07-20T00:00:00.000Z",
  "time_slot": "08:30 - 09:00",
  "symptom_description": "Đau nửa đầu kèm sốt nhẹ kéo dài 3 ngày",
  "symptom_images": [
    "https://res.cloudinary.com/medtech/image/upload/v1/symptoms/symp_01.jpg"
  ],
  "status": "APPROVED", // PENDING, APPROVED, COMPLETED, CANCELLED
  "payment_status": "PAID", // UNPAID, PAID, REFUNDED
  "payment_method": "ZALOPAY", // HOSPITAL_DIRECT, ZALOPAY
  "transaction_id": "ZP_240720_982341",
  "createdAt": "2024-07-15T08:12:30.000Z",
  "updatedAt": "2024-07-15T08:15:00.000Z"
}

Thiết kế RESTful API Endpoints chính

  • POST /api/v1/auth/register: Đăng ký tài khoản người dùng mới (Role: Patient).
  • POST /api/v1/auth/login: Xác thực và cấp phát Access Token (JWT Bearer).
  • GET /api/v1/clinics: Truy vấn danh sách cơ sở y tế kèm phân trang và bộ lọc chuyên khoa.
  • GET /api/v1/doctors?specialty_id={id}&date={date}: Tra cứu bác sĩ theo chuyên khoa và ngày khám khả dụng.
  • POST /api/v1/appointments/book: Khởi tạo yêu cầu đặt lịch khám (Kèm validation khóa khung giờ).
  • POST /api/v1/payments/zalopay/create: Tạo đơn hàng thanh toán qua ZaloPay API Gateway.
  • PUT /api/v1/appointments/:id/status: Bác sĩ/Bệnh viện cập nhật trạng thái duyệt lịch hẹn.
  • GET /api/v1/medicines?hospital_id={id}: Quản lý và tra cứu kho danh mục thuốc theo bệnh viện.

Phương pháp phát triển (Methodology)

Dự án áp dụng quy trình phát triển phần mềm theo mô hình Agile/Scrum rút gọn kéo dài từ ngày 20/02/2024 đến 10/07/2024, chia thành 6 giai đoạn rõ ràng:

[Phase 1: 20/02 - 28/02] ──> Khảo sát yêu cầu, nghiên cứu lý thuyết (ReactJS, Node.js, Android)
[Phase 2: 01/03 - 10/03] ──> Phân tích Use Case, thiết kế cơ sở dữ liệu và kiến trúc hệ thống
[Phase 3: 11/03 - 15/05] ──> Phát triển giao diện UI/UX trên Web Portal và Android Client
[Phase 4: 16/05 - 20/06] ──> Xây dựng logic API, nghiệp vụ đặt lịch, tích hợp Cloudinary/ZaloPay
[Phase 5: 21/06 - 30/06] ──> Kiểm thử đơn vị, kiểm thử tích hợp và tối ưu hóa hiệu năng
[Phase 6: 01/07 - 10/07] ──> Đánh giá UAT, hoàn thiện báo cáo và bảo vệ khóa luận

Implementation và kết quả

Quá trình phát triển và thuật toán cốt lõi

Trong quá trình triển khai backend bằng Node.js và ExpressJS, thuật toán ngăn chặn xung đột lịch khám (Slot Conflict Prevention Algorithm) đóng vai trò trung tâm. Thuật toán đảm bảo tính toàn vẹn khi nhiều bệnh nhân cùng gửi yêu cầu đặt lịch vào một khung giờ của cùng một bác sĩ.

Đoạn mã triển khai logic kiểm tra và cấp phát lịch hẹn tại controllers/appointmentController.js:

const Appointment = require('../models/Appointment');
const DoctorSchedule = require('../models/DoctorSchedule');

/**
 * Xử lý đặt lịch khám bệnh và chống xung đột khung giờ (Concurrency Control)
 */
exports.bookAppointment = async (req, res) => {
  const { doctor_id, appointment_date, time_slot, profile_id, symptom_description, symptom_images, payment_method } = req.body;
  const patient_id = req.user._id;

  try {
    // 1. Kiểm tra lịch làm việc khả dụng của bác sĩ trong ngày
    const schedule = await DoctorSchedule.findOne({
      doctor_id,
      work_date: new Date(appointment_date),
      active: true
    });

    if (!schedule || !schedule.available_slots.includes(time_slot)) {
      return res.status(400).json({ success: false, message: "Khung giờ khám không tồn tại hoặc bác sĩ không làm việc." });
    }

    // 2. Kiểm tra xung đột: Đã có bệnh nhân đặt lịch ở khung giờ này chưa
    const existingBooking = await Appointment.findOne({
      doctor_id,
      appointment_date: new Date(appointment_date),
      time_slot,
      status: { $in: ["PENDING", "APPROVED"] }
    });

    if (existingBooking) {
      return res.status(409).json({ success: false, message: "Khung giờ này vừa có người đặt. Vui lòng chọn giờ khác." });
    }

    // 3. Khởi tạo đối tượng lịch hẹn mới
    const newAppointment = new Appointment({
      patient_id,
      profile_id,
      doctor_id,
      hospital_id: schedule.hospital_id,
      specialty_id: schedule.specialty_id,
      appointment_date,
      time_slot,
      symptom_description,
      symptom_images: symptom_images || [],
      payment_method,
      payment_status: payment_method === "HOSPITAL_DIRECT" ? "UNPAID" : "PENDING",
      status: "PENDING"
    });

    const savedAppointment = await newAppointment.save();
    return res.status(201).json({ success: true, data: savedAppointment });
  } catch (error) {
    return res.status(500).json({ success: false, error: error.message });
  }
};

Kiểm thử và đánh giá hiệu năng (Testing & Validation)

Hệ thống được kiểm thử qua 4 cấp độ: Unit Testing (kiểm thử hàm logic backend bằng Jest), Integration Testing (kiểm thử chuỗi API đặt lịch qua Postman Newman), UI Testing trên Android Emulator (Android Virtual Device - Pixel 6 API 34), và Load Testing bằng công cụ Apache JMeter.

Kịch bản kiểm thử Công cụ Số lượng mẫu / Người dùng Kết quả ghi nhận Trạng thái
Xác thực & Phân quyền JWT Postman 150 test cases 100% Passed (Đúng mã lỗi 401, 403) Đạt
Đặt lịch đồng thời (Concurrency) Apache JMeter 500 requests/giây 0 trường hợp double-booking, 0 lỗi 500 Đạt
Thời gian phản hồi API (Latency) JMeter / Postman 2,000 requests Response time trung bình: 118ms Đạt
Tải ảnh triệu chứng lên Cloud CDN Cloudinary SDK 100 ảnh dung lượng 2-5MB Tỷ lệ thành công 100%, avg time 1.4s Đạt
Khảo sát UAT người dùng Google Form 50 người dùng thử nghiệm Điểm đánh giá mức độ hài lòng: 4.7/5.0 Đạt

Kết quả đạt được

  1. Phía Bệnh nhân (Android App & Web): Tìm kiếm cơ sở y tế theo vị trí/chuyên khoa; chọn ngày, bác sĩ và khung giờ trực quan; đính kèm ảnh chụp bệnh án; quản lý danh sách hồ sơ người thân (đặt lịch hộ); theo dõi tiến trình duyệt lịch và hủy lịch linh hoạt.
  2. Phía Bác sĩ & Bệnh viện (Web Portal): Tiếp nhận danh sách đặt khám theo ngày; chủ động duyệt/từ chối lịch hẹn; tra cứu lịch sử bệnh nhân; quản lý hồ sơ nhân sự y tế và danh mục thuốc của bệnh viện.
  3. Phía Quản trị viên (Admin): Quản lý toàn bộ cây danh mục chuyên khoa, hệ thống phân quyền tài khoản, giám sát hoạt động của các cơ sở y tế trong hệ thống.

Đổi mới và đóng góp

  1. Kiến trúc dữ liệu hồ sơ bệnh nhân linh hoạt (Multi-Profile Abstraction): Khắc phục nhược điểm của các ứng dụng chỉ cho phép một tài khoản gắn liền với một người khám duy nhất. Hệ thống cho phép một tài khoản chủ quản lý không giới hạn hồ sơ thành viên trong gia đình (họ tên, ngày sinh, BHYT, tiền sử dị ứng) và lựa chọn hồ sơ tương ứng khi đặt lịch.
  2. Tích hợp hình ảnh triệu chứng tiền lâm sàng: Khác với các hệ thống chỉ cho phép nhập chuỗi ký tự mô tả triệu chứng, giải pháp tích hợp trực tiếp Cloudinary API cho phép bệnh nhân gửi kèm hình ảnh tổn thương/kết quả xét nghiệm cũ, giúp bác sĩ nắm bắt tình trạng trước khi bước vào ca khám.
  3. Mô hình kết hợp quản lý kho thuốc bệnh viện: Đóng góp thêm module quản lý dược phẩm ngay trên hệ thống đặt lịch ngoại trú, tạo nền tảng chuyển tiếp đơn thuốc điện tử liền mạch từ phòng khám sang quầy thuốc bệnh viện.
  4. Tối ưu hóa hiệu suất giao tiếp: Việc tận dụng non-blocking I/O của Node.js kết hợp chỉ mục (Indexation) tại trường _id, doctor_id, appointment_date trong MongoDB giúp tốc độ truy vấn lịch khám nhanh hơn 40% so với mô hình cơ sở dữ liệu quan hệ truyền thống không đánh chỉ mục.

Ứng dụng thực tế và triển khai

Kịch bản triển khai thực tế

Hệ thống được thiết kế phù hợp để ứng dụng trực tiếp tại:

  • Phòng khám đa khoa và chuyên khoa tư nhân: Tự động hóa hoàn toàn khâu xếp lịch, giảm tải chi phí thuê nhân sự trực tổng đài điện thoại.
  • Bệnh viện công lập cấp quận/huyện: Triển khai làm cổng đăng ký khám bệnh từ xa, phân luồng bệnh nhân đến theo đúng khung giờ, xóa bỏ hiện tượng xếp hàng lấy số từ sáng sớm.
  • Chuỗi trung tâm tiêm chủng và xét nghiệm: Ứng dụng quản lý lịch hẹn kết hợp cập nhật kết quả xét nghiệm đa phương tiện.
graph LR
    subgraph Client_Access ["Truy Cập"]
        User["Người Dùng (Android / Web)"]
    end

    subgraph Production_Server ["Máy Chủ Sản Xuất (Ubuntu Server / AWS EC2)"]
        Nginx["Nginx Reverse Proxy & SSL (Port 80/443)"]
        PM2["PM2 Process Manager (Cluster Mode)"]
        NodeInstance["Node.js / Express.js Backend"]
    end

    subgraph Cloud_Cluster ["Lưu Trữ Đám Mây"]
        MongoAtlas[("MongoDB Atlas Cluster")]
        CDN["Cloudinary & Firebase"]
    end

    User -->|HTTPS| Nginx
    Nginx -->|Proxy Pass 127.0.0.1:5000| PM2
    PM2 --> NodeInstance
    NodeInstance --> MongoAtlas
    NodeInstance --> CDN

Hướng dẫn cài đặt và triển khai hệ thống

1. Yêu cầu môi trường máy chủ

  • Hệ điều hành: Ubuntu 22.04 LTS hoặc Linux tương thích.
  • Runtime & DB: Node.js >= 20.x, MongoDB >= 7.0, Nginx 1.24+.
  • Trình quản lý tiến trình: pm2 (npm install -g pm2).

2. Các bước triển khai Backend

# Bước 1: Clone mã nguồn và cài đặt dependencies
git clone https://github.com/medtech-project/med-booking-backend.git
cd med-booking-backend
npm install --production

# Bước 2: Thiết lập biến môi trường (.env)
cat <<EOF > .env
PORT=5000
MONGODB_URI=mongodb+srv://admin:secure_password@cluster0.mongodb.net/medcare_db
JWT_SECRET=super_secret_jwt_key_2024
CLOUDINARY_CLOUD_NAME=medtech_cloud
CLOUDINARY_API_KEY=1234567890
CLOUDINARY_API_SECRET=abcdefg123456
ZALOPAY_APP_ID=2553
ZALOPAY_KEY1=sdng283746sdg
EOF

# Bước 3: Khởi chạy ứng dụng với PM2 Cluster Mode
pm2 start server.js -i max --name "med-booking-api"
pm2 save
pm2 startup

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Tính năng tư vấn trực tuyến: Hiện tại tính năng gọi thoại và nhắn tin trực tiếp giữa bác sĩ và bệnh nhân mới ở mức thiết lập cơ sở dữ liệu và thông báo tín hiệu, chưa tích hợp giao thức WebRTC hoàn chỉnh để truyền phát video/audio P2P chất lượng cao.
  • Khả năng hoạt động ngoại tuyến (Offline Mode): Phiên bản Android Native phụ thuộc hoàn toàn vào kết nối mạng; chưa có bộ nhớ đệm Room DB cục bộ để xem lại lịch sử khám khi mất sóng.
  • Tiêu chuẩn dữ liệu y tế: Dữ liệu bệnh án chưa được mã hóa theo chuẩn bảo mật y tế chuyên biệt HIPAA hoặc chuẩn trao đổi dữ liệu y tế HL7/FHIR.

Hướng phát triển tiếp theo

  • Nâng cấp module Telehealth với WebRTC và Socket.IO nhằm hỗ trợ khám bệnh từ xa qua video call độ phân giải cao có tính năng ghi âm hội chẩn.
  • Tích hợp mô hình trí tuệ nhân tạo (AI/LLM) hỗ trợ gợi ý chuyên khoa tự động dựa trên phân tích triệu chứng đầu vào của bệnh nhân.
  • Tích hợp giải pháp quét mã căn cước công dân gắn chip (VNeID/QR) để tự động điền hồ sơ bệnh nhân khi đến viện.

Đối tượng hưởng lợi

  • Sinh viên ngành Công nghệ thông tin / Kỹ thuật phần mềm: Là tài liệu tham khảo hoàn chỉnh về kiến trúc ứng dụng Client-Server full-stack, kết nối đa nền tảng (ReactJS + Android Native + Node.js/Express + MongoDB) và kỹ thuật phân quyền RBAC.
  • Lập trình viên (Developers): Cung cấp các mẫu thiết kế giải quyết bài toán chống xung đột thời gian (concurrency booking slot), tích hợp cổng thanh toán ZaloPay và xử lý tải đa phương tiện qua CDN.
  • Các cơ sở y tế và phòng khám: Nhận chuyển giao một giải pháp phần mềm nguồn mở, chi phí thấp nhưng đầy đủ tính năng phục vụ số hóa quy trình tiếp đón và quản lý lịch khám.
  • Nhà nghiên cứu chuyển đổi số y tế: Cơ sở thực nghiệm để đánh giá tác động của việc phân bổ lịch hẹn trước đối với việc tối ưu hóa chuỗi cung ứng dịch vụ chăm sóc sức khỏe.

Câu hỏi thường gặp

1. Yêu cầu kỹ thuật tối thiểu để triển khai ứng dụng trên môi trường sản xuất là gì?
Máy chủ backend yêu cầu tối thiểu 2 vCPU, 4GB RAM chạy hệ điều hành Linux (Ubuntu 20.04/22.04), Node.js v18+ và kết nối cơ sở dữ liệu MongoDB Atlas. Phía người dùng, ứng dụng Android yêu cầu thiết bị chạy Android OS từ phiên bản 8.0 (API Level 26) trở lên, trong khi giao diện Web tương thích với tất cả các trình duyệt hiện đại (Chrome, Safari, Firefox, Edge).

2. Hệ thống xử lý thế nào khi có nhiều bệnh nhân cùng đặt một khung giờ khám?
Hệ thống sử dụng cơ chế kiểm tra trạng thái độc quyền trước khi ghi dữ liệu. Khi nhận request, backend kiểm tra trong collection appointments xem khung giờ đó đã có bản ghi ở trạng thái PENDING hoặc APPROVED chưa. Request đầu tiên hợp lệ sẽ được ghi nhận và khóa slot; các request gửi đến sau mili-giây đó sẽ nhận về mã lỗi HTTP 409 (Conflict) yêu cầu chọn khung giờ khác.

3. Phần mềm có thể tích hợp vào hệ thống phần mềm quản trị bệnh viện (HIS) có sẵn không?
Có. Toàn bộ logic nghiệp vụ được đóng gói dưới dạng các RESTful API chuẩn hóa, trả về định dạng JSON tiêu chuẩn. Đội ngũ kỹ thuật của bệnh viện có thể dễ dàng viết các module trung gian (Webhook/Adapter) để đồng bộ dữ liệu đặt khám sang cơ sở dữ liệu của hệ thống HIS/LIS hiện hữu.

4. Dữ liệu hình ảnh bệnh án của người dùng được bảo vệ như thế nào?
Hình ảnh đính kèm khi đặt lịch được truyền qua kênh mã hóa HTTPS đến dịch vụ lưu trữ đám mây Cloudinary/Firebase Storage với các chuỗi định danh URL băm ngẫu nhiên (UUID). Quyền truy cập hình ảnh chỉ được cấp phát cho tài khoản bệnh nhân sở hữu và tài khoản bác sĩ phụ trách ca khám đó.

5. Chi phí vận hành và thời gian thu hồi vốn (ROI) ước tính cho phòng khám?
Với một phòng khám quy mô vừa (500 lượt khám/ngày), chi phí hạ tầng máy chủ đám mây ước tính khoảng 1.500.000 - 3.000.000 VNĐ/tháng. Việc loại bỏ thủ tục giấy tờ, tối ưu 2 vị trí nhân sự tiếp đón và giảm tỷ lệ hủy hẹn không báo trước giúp phòng khám tiết kiệm từ 15.000.000 - 25.000.000 VNĐ/tháng, đạt điểm hòa vốn và thu hồi chi phí đầu tư sau 3 đến 6 tháng vận hành.


Kết luận

Đồ án tốt nghiệp "Xây dựng phần mềm đặt lịch khám bệnh tại cơ sở y tế" của sinh viên Nguyễn Tiến Dũng và Ngô Công Huân đã hoàn thành đầy đủ các mục tiêu nghiên cứu và thực nghiệm đề ra. Dự án không chỉ giải quyết trọn vẹn bài toán kỹ thuật về xây dựng hệ thống đa nền tảng (Android App, ReactJS Web, Node.js API, MongoDB) mà còn mang lại giá trị thực tiễn to lớn trong việc nâng cao chất lượng dịch vụ y tế, giảm thiểu thời gian chờ đợi và tối ưu hóa nguồn lực cho các cơ sở khám chữa bệnh.

Với kiến trúc module hóa linh hoạt, độ trễ xử lý thấp cùng khả năng tích hợp thanh toán và lưu trữ đám mây hiện đại, phần mềm sẵn sàng để chuyển giao, triển khai thử nghiệm tại các phòng khám thực tế và mở rộng tích hợp các tính năng trí tuệ nhân tạo trong tương lai.