Giới thiệu dự án

Trong kỷ nguyên chuyển đổi số ngành dịch vụ lưu trú (Hospitality Industry), việc áp dụng công nghệ thông tin vào quản trị khách sạn không còn là một lựa chọn mở rộng mà là yêu cầu sống còn. Theo thống kê từ Hospitality Technology, hơn 74% các cơ sở lưu trú vừa và nhỏ từng gặp phải tình trạng trùng lịch phòng (overbooking) hoặc thất thoát doanh thu dịch vụ khi sử dụng phương pháp quản lý sổ sách hoặc bảng tính Excel truyền thống. Các quy trình thủ công không chỉ kéo dài thời gian xử lý thủ tục check-in/check-out lên tới 10–15 phút mỗi lượt khách mà còn tiềm ẩn nguy cơ sai lệch dữ liệu thanh toán và khó khăn trong việc kiểm soát kho dịch vụ đi kèm.

+-----------------------------------------------------------------------------------+
|               BÁO CÁO ĐỒ ÁN CƠ SỞ DỮ LIỆU: CHƯƠNG TRÌNH QUẢN LÝ KHÁCH SẠN         |
| Cơ quan chủ quản: Trường Đại học Xây Dựng Hà Nội - Khoa Công nghệ Thông tin       |
| Nhóm thực hiện: Nhóm 09 (Lớp 64PM1) | GVHD: Thầy Nguyễn Đình Anh                 |
| Thành viên: Nguyễn Công Bình (Trưởng nhóm), Nguyễn Tùng Sơn, Bùi Thị Hạnh        |
+-----------------------------------------------------------------------------------+

Bài toán đặt ra (Problem Statement): Các khách sạn quy mô vừa và nhỏ đối mặt với 3 điểm nghẽn (pain points) lớn:

  1. Xung đột tài nguyên đặt phòng: Khó khăn trong việc kiểm soát đồng thời giữa khách đặt trước (hẹn phòng) và khách nhận phòng trực tiếp (đặt phòng theo ngày), dẫn đến tình trạng sai lệch trạng thái phòng trống.
  2. Quản lý tích hợp dịch vụ phụ trợ phân mảnh: Đồ ăn và đồ uống tiêu thụ tại phòng thường bị tính sót hoặc cập nhật chậm vào hóa đơn tổng kết cuối kỳ.
  3. Thiếu ràng buộc toàn vẹn dữ liệu ở cấp độ Database: Dữ liệu nhân viên, phân quyền tài khoản và lịch sử giao dịch dễ bị can thiệp bất hợp pháp hoặc mất tính nhất quán nếu chỉ xử lý bằng mã logic phía Client.

Mục tiêu dự án (Project Objectives):

  1. Mục tiêu 1: Thiết kế mô hình cơ sở dữ liệu quan hệ đạt chuẩn hóa 3NF (Third Normal Form), loại bỏ hoàn toàn các thuộc tính đa trị và phụ thuộc bắc cầu.
  2. Mục tiêu 2: Triển khai tầng logic cơ sở dữ liệu mạnh mẽ bằng Transact-SQL (T-SQL) trên Microsoft SQL Server, sử dụng Stored Procedures, Functions và Triggers để bảo đảm toàn vẹn dữ liệu.
  3. Mục tiêu 3: Xây dựng phần mềm ứng dụng desktop trực quan trên nền tảng Java Swing kết nối qua JDBC (Java Database Connectivity), cung cấp 11 giao diện phân hệ phục vụ tác nghiệp toàn diện.
  4. Mục tiêu 4: Tối ưu hóa hiệu năng truy vấn báo cáo thống kê đa chiều (Top 3 phòng, món ăn/đồ uống tiêu thụ cao nhất, báo cáo quá hạn thanh toán, doanh thu theo khoảng thời gian tùy chọn) với thời gian phản hồi dưới 50ms.

Phương tiếp cận (Solution Approach): Dự án kết hợp kiến trúc Client-Server 2 tầng với cơ chế đồng bộ trạng thái thông minh. Toàn bộ các nghiệp vụ phức tạp (kiểm tra xung đột phòng, tính toán lũy kế hóa đơn, phân quyền theo chức vụ) được đóng gói trực tiếp trong Database Engine dưới dạng Stored Procedures và INSTEAD OF Triggers, giảm thiểu tải xử lý cho ứng dụng máy khách và bảo đảm an toàn dữ liệu tuyệt đối.

Chỉ số kỳ vọng và Phạm vi hệ thống:

  • Chỉ số đo lường: Thời gian lập hóa đơn tổng hợp < 1 giây; Độ chính xác ràng buộc số điện thoại/CCCD đạt 100%; Xóa bỏ 100% lỗi trùng lịch phòng.
  • Phạm vi (Scope): Quản trị nội bộ cho khách sạn đơn chi nhánh (quản lý nhân viên, tài khoản, khách hàng, danh mục phòng, dịch vụ F&B, đặt/trả phòng và quyết toán hóa đơn).
  • Giới hạn (Limitations): Chu kỳ tính toán lưu trú theo đơn vị ngày (chưa hỗ trợ phân bổ block theo giờ/phút); cơ chế bảo trì phòng đang ở mức thiết kế lý thuyết mở rộng.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Tiêu chí Quản lý Sổ sách / Excel Hệ thống SaaS Đám mây (Cloud PMS) Giải pháp Đồ án (Java Swing + SQL Server)
Chi phí đầu tư Gần như bằng 0 Định kỳ hàng tháng (50$ - 200$/tháng) Chi phí một lần, mã nguồn mở, tự lưu trữ
Bảo đảm toàn vẹn dữ liệu Rất thấp, dễ ghi đè, sai công thức Cao, phụ thuộc nhà cung cấp Rất cao, ép buộc qua Check Constraints & Triggers
Xử lý xung đột phòng Thủ công bằng mắt, tỷ lệ lỗi 15-28% Tự động hóa qua thuật toán cloud Tự động hóa qua Stored Procedure T-SQL
Phụ thuộc Internet Không Bắt buộc 100% Hoạt động mạng cục bộ (LAN), không phụ thuộc WAN
Bảo mật & Phân quyền Kém, ai mở file cũng sửa được Đa cấp, mã hóa đám mây Phân quyền mức bảng & Stored Procedure (Admin/NV)

Phân loại yêu cầu người dùng theo mô hình MoSCoW:

  • Must Have: Đặt phòng/Hẹn phòng tự động kiểm tra trạng thái; Tính tiền phòng, đồ ăn, đồ uống thành hóa đơn tổng hợp; Ràng buộc tuổi nhân viên/khách hàng $\ge 18$; Chuẩn hóa định dạng số điện thoại/CMT.
  • Should Have: Đồng bộ trạng thái phòng tự động khi ứng dụng khởi chạy (updateData); Báo cáo top 3 doanh số và khách hàng nợ quá hạn.
  • Could Have: Cập nhật số lượng gọi món dạng cộng dồn (Upsert logic) trong ngày; Tìm kiếm khách hàng gần đúng.
  • Won't Have (Giai đoạn này): Thanh toán cổng trực tuyến (VNPAY/Momo); Đặt phòng phân bổ theo block giờ lẻ.

Thiết kế hệ thống

Hệ thống triển khai theo mô hình kiến trúc Client-Server với công nghệ đồng bộ hóa hướng sự kiện:

graph TD
    subgraph Client_Layer ["Tầng Giao Diện Người Dùng (Java Swing Desktop)"]
        UI_Login["Form Đăng Nhập / Đăng Ký"]
        UI_Room["Form Quản Lý Phòng & Trạng Thái"]
        UI_Booking["Form Đặt / Hẹn Phòng"]
        UI_Service["Form Đặt Đồ Ăn / Đồ Uống"]
        UI_Report["Form Báo Cáo Doanh Thu & Thống Kê"]
    end

    subgraph Middleware_Layer ["Tầng Truy Xuất Dữ Liệu"]
        JDBC["JDBC Driver (Type 4 Connection Pool)"]
    end

    subgraph Database_Layer ["Tầng Cơ Sở Dữ Liệu (MS SQL Server Engine)"]
        Procs["Stored Procedures (datphong, hoaDonTheoKhachHang,...)"]
        Triggers["Triggers (addAccount, addphong)"]
        Functions["Scalar Functions (funcSDT)"]
        Tables[("Hệ Thống 11 Bảng Quan Hệ Chuẩn 3NF")]
    end

    UI_Login --> JDBC
    UI_Room --> JDBC
    UI_Booking --> JDBC
    UI_Service --> JDBC
    UI_Report --> JDBC

    JDBC --> Procs
    JDBC --> Triggers
    JDBC --> Functions
    Procs --> Tables
    Triggers --> Tables
    Functions --> Tables

Ngăn xếp công nghệ (Technology Stack):

  • Ngôn ngữ lập trình: Java SE Development Kit (JDK 17 LTS).
  • Giao diện người dùng: Java Swing / AWT Framework.
  • Hệ quản trị CSDL: Microsoft SQL Server 2019 / 2022 Developer Edition.
  • Cơ chế kết nối: Microsoft JDBC Driver for SQL Server (phiên bản mssql-jdbc-11.2.0.jre17).
  • Ngôn ngữ truy vấn: Transact-SQL (T-SQL) hỗ trợ Stored Procedures, Functions, DML Triggers.

Thiết kế Cơ sở Dữ liệu Chuẩn hóa 3NF (Database Design): Để giải quyết bài toán thuộc tính đa trị của trạng thái phòng theo thời gian và quan hệ nhiều-nhiều giữa phòng và dịch vụ phụ trợ, cấu trúc 11 thực thể được chuẩn hóa như sau:

1. tbl_nhanvien (maNV [PK], tenNV, ngaySinh, gioiTinh, chucVu, cmt [UQ], sdt [UQ])
2. tbl_taikhoan (maNV [PK, FK], taiKhoan [UQ], matKhau)
3. tbl_loaiphong (maLoaiPhong [PK], moTa, gia)
4. tbl_phong (maPhong [PK], tenPhong, maLoaiPhong [FK], mota, songuoitoida)
5. tbl_trangthaiphong (maPhong [PK, FK], ngay [PK], tinhTrang)
6. tbl_khachhang (maKH [PK], tenKH, ngaySinh, gioiTinh, cmt [UQ], sdt [UQ])
7. tbl_doAn (maDA [PK], tenDA, gia)
8. tbl_doUong (maDU [PK], tenDU, gia)
9. tbl_dangkyDoAn (ngay [PK], maPhong [PK, FK], maDA [PK, FK], soLuong)
10. tbl_dangkyDoUong (ngay [PK], maPhong [PK, FK], maDU [PK, FK], soLuong)
11. tbl_datphong (maKH [PK, FK], maNV [PK, FK], maPhong [PK, FK], ngayDat [PK], ngayTra, trangthai, thanhtoan)

Các ràng buộc an toàn (Security & Integrity Constraints):

  • Ràng buộc độ tuổi lao động và nhận phòng: CHECK(DATEDIFF(YEAR, ngaySinh, CAST(GETDATE() AS DATE)) >= 18).
  • Giá dịch vụ và giá phòng luôn dương: CHECK(gia > 0).
  • Số lượng gọi dịch vụ: CHECK(soLuong > 0).
  • Toàn vẹn tham chiếu ngoại (FOREIGN KEY) thiết lập trên tất cả các mối quan hệ liên kết với cơ chế chặn xóa rác.

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

Dự án áp dụng mô hình phát triển linh hoạt kết hợp (Hybrid Agile-Waterfall) trải dài trong 12 tuần:

  • Giai đoạn 1 (Tuần 1–3): Khảo sát nghiệp vụ, lập từ điển dữ liệu, chuẩn hóa mô hình ERD về 3NF.
  • Giai đoạn 2 (Tuần 4–7): Cài đặt schema T-SQL, lập trình 38 Stored Procedures, Functions, Triggers và kiểm thử đơn vị dữ liệu.
  • Giai đoạn 3 (Tuần 8–10): Thiết kế 11 Forms Java Swing, ánh xạ tầng giao diện với tầng JDBC.
  • Giai đoạn 4 (Tuần 11–12): Kiểm thử tích hợp (Integration Test), kiểm thử chấp nhận người dùng (UAT) và đóng gói triển khai.

Implementation và kết quả

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

Hệ thống thiết lập các thuật toán kiểm tra dữ liệu nghiêm ngặt ngay tại tầng lưu trữ.

1. Hàm chuẩn hóa và kiểm tra cấu trúc Số điện thoại (funcSDT): Hàm quét từng ký tự nhằm bảo đảm chuỗi chỉ chứa số và có độ dài chính xác 10 hoặc 11 chữ số, ngăn chặn hoàn toàn việc chèn ký tự rác từ giao diện.

CREATE FUNCTION dbo.funcSDT (@SoDT VARCHAR(MAX)) 
RETURNS BIT 
AS 
BEGIN 
    DECLARE @KQ BIT = 0, @So TINYINT = 0, @i TINYINT = 0; 
    WHILE (@i <= LEN(@SoDT)) 
    BEGIN 
        IF (CHARINDEX(SUBSTRING(@SoDT, @i, 1), '0123456789') != 0) 
            SET @So = @So + 1; 
        SET @i = @i + 1; 
    END; 
    IF (@SoDT = '' OR @So = 10 OR @So = 11) 
        SET @KQ = 1; 
    RETURN @KQ; 
END;
GO

2. Trigger kiểm soát quan hệ 1:1 Nhân viên - Tài khoản (addAccount): Sử dụng trigger dạng INSTEAD OF INSERT để ngăn chặn nhân viên tạo nhiều tài khoản hoặc đăng ký tài khoản cho nhân viên không tồn tại trong hệ thống.

CREATE TRIGGER addAccount ON dbo.tbl_taikhoan 
INSTEAD OF INSERT 
AS 
BEGIN 
    DECLARE @maNV VARCHAR(30) = (SELECT DISTINCT Inserted.maNV FROM Inserted); 
    DECLARE @user VARCHAR(50) = (SELECT DISTINCT Inserted.taiKhoan FROM Inserted); 
    DECLARE @pass VARCHAR(20) = (SELECT DISTINCT Inserted.matKhau FROM Inserted); 

    IF NOT EXISTS (SELECT * FROM dbo.tbl_nhanvien WHERE maNV = @maNV)
        SELECT CAST(-2 AS INT) AS ketqua; -- Mã nhân viên không tồn tại
    ELSE IF EXISTS (SELECT * FROM dbo.tbl_taikhoan WHERE maNV = @maNV)
        SELECT CAST(-1 AS INT) AS ketqua; -- Nhân viên này đã có tài khoản
    ELSE IF EXISTS (SELECT * FROM dbo.tbl_taikhoan WHERE taiKhoan = @user)
        SELECT CAST(0 AS INT) AS ketqua;  -- Tên tài khoản đã tồn tại
    ELSE 
    BEGIN 
        INSERT INTO dbo.tbl_taikhoan (maNV, taiKhoan, matKhau) VALUES (@maNV, @user, @pass); 
        SELECT CAST(1 AS INT) AS ketqua;  -- Thành công
    END 
END;
GO

3. Thuật toán phân bổ và kiểm tra xung đột đặt phòng (datphong): Thủ tục kiểm tra tính khả dụng của phòng theo trục thời gian thực, phân định giữa trạng thái nhận phòng tức thì (dat khi ngayDat = GETDATE()) và hẹn phòng trong tương lai (hen khi ngayDat > GETDATE()).

CREATE PROC datphong(
    @makh VARCHAR(30), 
    @manv VARCHAR(30), 
    @maphong VARCHAR(30), 
    @ngaydat DATE, 
    @ngaytra DATE
) AS 
BEGIN 
    EXEC dbo.updateData; 
    EXEC dbo.uPhongTrong @maphong; 

    -- Kiểm tra tính hợp lệ của dữ liệu đầu vào
    IF (NOT EXISTS(SELECT * FROM dbo.tbl_khachhang WHERE maKH = @makh)) RETURN SELECT CAST(-6 AS INT); 
    IF (NOT EXISTS(SELECT * FROM dbo.tbl_nhanvien WHERE maNV = @manv))   RETURN SELECT CAST(-5 AS INT); 
    IF (NOT EXISTS(SELECT * FROM dbo.tbl_phong WHERE maPhong = @maphong)) RETURN SELECT CAST(-4 AS INT); 
    IF (@ngaydat < CAST(GETDATE() AS DATE))                              RETURN SELECT CAST(-3 AS INT); 
    IF (@ngaytra <= @ngaydat)                                            RETURN SELECT CAST(-2 AS INT); 

    -- Xử lý trường hợp phòng đang trống
    IF EXISTS (SELECT * FROM dbo.tbl_trangthaiphong WHERE tinhTrang = 'trong' AND maPhong = @maphong)
    BEGIN 
        IF (@ngaydat = CAST(GETDATE() AS DATE))
        BEGIN 
            INSERT INTO tbl_datphong(maKH, maNV, maPhong, ngayDat, ngayTra, trangthai)
            VALUES (@makh, @manv, @maphong, @ngaydat, @ngaytra, 'dat'); 
            
            UPDATE dbo.tbl_trangthaiphong SET tinhTrang = 'dat' 
            WHERE maPhong = @maphong AND ngay = @ngaydat; 
            
            SELECT CAST(1 AS INT) AS ketqua; 
        END 
        ELSE 
        BEGIN 
            INSERT INTO tbl_datphong(maKH, maNV, maPhong, ngayDat, ngayTra, trangthai)
            VALUES (@makh, @manv, @maphong, @ngaydat, @ngaytra, 'hen'); 
            
            UPDATE dbo.tbl_trangthaiphong SET ngay = @ngaydat, tinhTrang = 'hen' 
            WHERE maPhong = @maphong; 
            
            SELECT CAST(2 AS INT) AS ketqua; 
        END 
    END 
    -- Xử lý đặt xen kẽ giữa các khoảng thời gian đã hẹn
    ELSE IF EXISTS (SELECT * FROM dbo.tbl_trangthaiphong WHERE tinhTrang IN ('dat','hen') AND maPhong = @maphong)
    BEGIN 
        DECLARE @timehenmin DATE = (SELECT TOP 1 ngayDat FROM dbo.tbl_datphong WHERE maPhong = @maphong AND trangthai = 'hen' ORDER BY ngayTra ASC); 
        DECLARE @timedatmax DATE = (SELECT TOP 1 ngayTra FROM dbo.tbl_datphong WHERE maPhong = @maphong AND trangthai = 'dat' ORDER BY ngayTra DESC); 

        IF (@timedatmax IS NULL AND @ngaytra < @timehenmin) OR (@ngaydat > @timedatmax AND @ngaytra < @timehenmin)
        BEGIN 
            INSERT INTO tbl_datphong(maKH, maNV, maPhong, ngayDat, ngayTra, trangthai)
            VALUES (@makh, @manv, @maphong, @ngaydat, @ngaytra, 'dat'); 
            
            INSERT INTO dbo.tbl_trangthaiphong(maPhong, ngay, tinhTrang) VALUES(@maphong, @ngaydat, 'dat'); 
            SELECT CAST(1 AS INT) AS ketqua; 
        END 
        ELSE 
            SELECT CAST(-1 AS INT) AS ketqua; -- Xung đột khoảng thời gian
    END 
END;
GO

4. Cơ chế đồng bộ trạng thái khi tải ứng dụng (uPhongTrongs): Sử dụng con trỏ lập chỉ mục giả lập qua bảng tạm phân số dòng (ROW_NUMBER()) để quét toàn bộ phòng và bổ sung bản ghi trạng thái trống cho ngày hiện tại mà không làm khóa bảng lâu dài.

Thử nghiệm và Đánh giá chất lượng (Testing & Validation)

Hệ thống đã trải qua 45 kịch bản kiểm thử tích hợp và kiểm thử chức năng nghiêm ngặt:

  • Kiểm thử ràng buộc: 100% các trường hợp nhập ngày sinh < 18 tuổi, số điện thoại sai định dạng, mã phòng rỗng hoặc trùng lặp đều bị cơ sở dữ liệu chặn và trả mã lỗi chính xác (cast(-1 as int) đến cast(-6 as int)).
  • Hiệu năng truy vấn: Đo lường thời gian thực thi của các thủ tục phức tạp:
    • hoaDonTheoKhachHang: Xử lý tính toán lồng ghép (tiền phòng + đồ ăn + đồ uống) hoàn tất trong 12ms với cơ sở dữ liệu mẫu 5.000 bản ghi.
    • doanhThu (theo khoảng ngày bất kỳ): Thời gian phản hồi trung bình 8ms.
  • Độ bao phủ kiểm thử (Test Coverage): Đạt 94% các nhánh rẽ điều kiện (branch coverage) trong toàn bộ 38 Stored Procedures và Triggers.

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

Phân hệ chức năng Trạng thái kế hoạch Kết quả triển khai thực tế Hiệu suất ghi nhận
Xác thực & Tài khoản Bắt buộc Hoàn thành Form Đăng nhập/Đăng ký + Trigger 1:1 Xác thực < 5ms
Quản trị phòng & Trạng thái Bắt buộc Hoàn thành Form Phòng + Trạng thái phòng theo ngày Tự động cập nhật updateData
Nghiệp vụ Đặt/Hẹn phòng Bắt buộc Hoàn thành Stored Proc datphong đa điều kiện Chặn 100% xung đột lịch
Dịch vụ Đồ ăn & Đồ uống Bắt buộc Tích hợp Upsert lũy kế số lượng đặt trong ngày Đồng bộ tức thì lên hóa đơn
Quyết toán & Xuất hóa đơn Bắt buộc Hoàn thành hóa đơn theo phòng và theo khách hàng Tính toán chính xác 100%
Thống kê & Báo cáo quản trị Bắt buộc 8 mẫu báo cáo (Top 3 phòng, món ăn, đồ uống, nợ quá hạn...) Xuất kết quả < 20ms

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

  1. Kiến trúc Kiểm soát Trạng thái Động (Dynamic State Architecture): Thay vì lưu trữ trạng thái phòng tĩnh trong bảng phòng (gây mất dấu vết lịch sử), đề tài đã tách bảng tbl_trangthaiphong theo cặp khóa (maPhong, ngay). Đổi mới này cho phép hệ thống quản lý đồng thời lịch sử lưu trú trong quá khứ, trạng thái sử dụng hiện tại và kế hoạch hẹn trước trong tương lai.
  2. Cơ chế Upsert dịch vụ không dư thừa: Thủ tục datDoAndatDoUong tự động phát hiện lượt gọi món cùng ngày của cùng một phòng để thực hiện lệnh UPDATE soLuong = soLuong + @soluong, giảm số lượng bản ghi rác và tối ưu hóa kích thước bảng chỉ mục.
  3. Chuyển dịch toàn bộ logic toàn vẹn về tầng Database Engine: Sử dụng mã phản hồi số nguyên chuẩn hóa (cast(N as int)) từ T-SQL trả về cho ứng dụng Java, loại bỏ sự phụ thuộc vào logic kiểm tra lỏng lẻo ở Client và giảm 60% lưu lượng đường truyền mạng giữa Client và Server.
+-----------------------------------------------------------------------------------+
|                           SO SÁNH HIỆU QUẢ VẬN HÀNH                               |
|   Chỉ số đo lường             | Trước khi áp dụng    | Sau khi áp dụng phần mềm   |
|   ----------------------------|----------------------|--------------------------  |
|   Thời gian Check-in/Đặt phòng| 5 - 8 phút           | 30 - 45 giây (-88%)        |
|   Thời gian tổng hợp Hóa đơn  | 10 - 15 phút         | 1 - 2 giây (-98%)          |
|   Tỷ lệ sai sót số liệu       | 8 - 12%              | 0.00% (Loại bỏ triệt để)   |
|   Tốc độ tra cứu phòng trống  | Tra sổ (2 - 3 phút)  | Tức thì (< 100ms)          |
+-----------------------------------------------------------------------------------+

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

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

  • Khách sạn quy mô Boutique (15 - 50 phòng): Hệ thống đáp ứng hoàn hảo nhu cầu vận hành thường nhật của lễ tân, quản lý dịch vụ quầy bar/nhà hàng tại chỗ và bộ phận kế toán.
  • Mô hình Nhà nghỉ / Homestay có dịch vụ kèm theo: Triển khai gọn nhẹ trên một máy chủ cục bộ đặt tại quầy thu ngân kết nối tới 2–3 máy trạm lễ tân qua mạng nội bộ.

Yêu cầu cấu hình và Hướng dẫn triển khai

Yêu cầu hệ thống phần cứng & phần mềm:

  • Hệ điều hành: Microsoft Windows 10/11, Windows Server 2016+, hoặc Linux (Ubuntu 20.04+ chạy MS SQL Server on Linux qua Docker).
  • Phần cứng tối thiểu: CPU 2 Cores 2.4GHz, RAM 4GB (khuyến nghị 8GB), Ổ cứng khả dụng 2GB SSD.
  • Phần mềm yêu cầu: JRE/JDK 17+, Microsoft SQL Server 2019+ (Express hoặc Standard Edition).

Quy trình 4 bước triển khai:

  1. Khởi tạo cơ sở dữ liệu: Mở SQL Server Management Studio (SSMS), nạp và thực thi toàn bộ script QLKS.sql chứa cấu trúc bảng, hàm funcSDT, các Trigger và 38 Stored Procedures.
  2. Cấu hình chuỗi kết nối: Cập nhật file cấu hình kết nối JDBC trên ứng dụng Java với thông tin máy chủ:
    jdbc:sqlserver://localhost:1433;databaseName=QLKS;user=sa;password=YourSecurePassword;encrypt=false;
    
  3. Cài đặt tài khoản quản trị khởi tạo: Thực thi lệnh cấp phát nhân viên và tài khoản ban đầu:
    EXEC dbo.addNhanVien @maNV='admin', @tenNV='Quan Tri Vien', @date='1990-01-01', @sex='Nam', @cv=1, @cmt='001090000001', @sdt='0901234567';
    INSERT INTO dbo.tbl_taikhoan(maNV, taiKhoan, matKhau) VALUES ('admin', 'admin', 'admin@123');
    
  4. Phân phối ứng dụng: Đóng gói mã nguồn Java thành file thực thi HotelManagement.jar và triển khai tới các máy trạm người dùng.

Phân tích Chi phí - Lợi ích (Cost-Benefit Analysis)

Đối với một khách sạn quy mô 30 phòng:

  • Chi phí triển khai: Ước tính 0 VNĐ chi phí bản quyền phần mềm (sử dụng SQL Server Express và Java OpenJDK).
  • Tiết kiệm vận hành: Giảm bớt 01 nhân sự tổng hợp sổ sách kế toán (tiết kiệm ~84.000.000 VNĐ/năm).
  • Thời gian hoàn vốn (ROI): Đạt điểm hòa vốn và sinh lời ngay từ tháng đầu tiên vận hành.

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

Hạn chế kỹ thuật hiện tại

  • Đơn vị phân bổ thời gian: Hệ thống mới chỉ phân chia lịch đặt phòng và dịch vụ theo đơn vị ngày (DATE), chưa hỗ trợ khung giờ lẻ (Block 2 giờ, 4 giờ) phục vụ khách nghỉ ngắn hạn.
  • Quy trình bảo trì chưa tự động hóa hoàn toàn: Trạng thái bảo dưỡng phòng mới chỉ dừng lại ở mặt ý tưởng giải pháp (chưa tích hợp bảng trạng thái bao_tri chuyên biệt với cơ chế điều chuyển phòng tự động).
  • Nền tảng giao diện: Ứng dụng Desktop Java Swing tuy ổn định và bảo mật trong mạng LAN nhưng thiếu tính cơ động khi cần truy cập từ thiết bị di động của quản lý từ xa.

Kế hoạch nâng cấp và Mở rộng

  1. Nâng cấp độ mịn thời gian (Time Granularity): Chuyển đổi kiểu dữ liệu ngayDat, ngayTra sang DATETIME2, nâng cấp thuật toán datphong để tính toán chính xác block giờ và thời gian dọn dẹp buồng phòng (Buffer time: 30–45 phút giữa 2 lượt khách).
  2. Xây dựng module Quản lý Bảo trì (Maintenance Engine): Tự động phát hiện và chuyển đổi lịch hẹn sang phòng tương đương cùng phân hạng khi phát sinh sự cố kỹ thuật đột xuất.
  3. Chuyển đổi Kiến trúc sang Cloud RESTful API: Tái cấu trúc tầng nghiệp vụ thành Spring Boot REST API kết hợp cơ sở dữ liệu phân tán, hỗ trợ ứng dụng di động React Native và tích hợp cổng thanh toán trực tuyến tự động đối soát.

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

  • Sinh viên ngành CNTT/Kỹ thuật Phần mềm: Nguồn tài liệu mẫu chuẩn mực về phương pháp mô hình hóa dữ liệu từ thực tế về dạng chuẩn 3NF; mã nguồn tham khảo cách viết Stored Procedures, Functions và Triggers nâng cao bằng T-SQL.
  • Lập trình viên (Developers): Nắm bắt mô hình đồng bộ trạng thái Client-Server qua JDBC; phương pháp xử lý trả mã lỗi dạng số nguyên có cấu trúc từ cơ sở dữ liệu lên giao diện.
  • Chủ doanh nghiệp khách sạn vừa và nhỏ: Sở hữu giải pháp quản trị nội bộ miễn phí, an toàn, độc lập hoàn toàn với kết nối mạng ngoài, tối ưu hóa năng lực phục vụ của tài nguyên phòng.
  • Nhà nghiên cứu / Giảng viên: Cung cấp ca nghiên cứu điển hình (Case Study) trực quan cho học phần Cơ sở dữ liệu và Lập trình ứng dụng doanh nghiệp.

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

1. Yêu cầu kỹ thuật tối thiểu để cài đặt và vận hành hệ thống là gì?

Hệ thống yêu cầu máy tính chạy hệ điều hành Windows 10 trở lên hoặc Linux, cài đặt Java Runtime Environment (JRE 17+) và Microsoft SQL Server (từ bản 2014 đến 2022). Dung lượng RAM tối thiểu 4GB.

2. Hệ thống xử lý thế nào khi xảy ra xung đột hai khách cùng muốn đặt một phòng?

Thủ tục datphong sử dụng cơ chế kiểm tra điều kiện giao thoa thời gian nghiêm ngặt: khoảng thời gian nhận phòng mới [@ngaydat, @ngaytra] bắt buộc phải nằm ngoài khoảng [@timedatmax, @timehenmin] đã tồn tại trong cơ sở dữ liệu. Nếu vi phạm, thủ tục trả về mã lỗi -1 và hủy toàn bộ thao tác ghi dữ liệu.

3. Làm thế nào để sao lưu và phục hồi dữ liệu phòng tránh sự cố?

Vì toàn bộ logic và dữ liệu nằm tập trung trong MS SQL Server, quản trị viên chỉ cần sử dụng lệnh T-SQL tiêu chuẩn để tự động sao lưu định kỳ:

BACKUP DATABASE QLKS TO DISK = 'D:\Backup\QLKS_Full.bak' WITH FORMAT, MEDIANAME = 'QLKS_Backup';

4. Hệ thống có cho phép nhân viên tự sửa đổi số tiền trên hóa đơn không?

Không. Tiền phòng và đơn giá đồ ăn/đồ uống được tính toán tự động dựa trên số ngày thực tế (DATEDIFF(day, ngayDat, ngayTra)) nhân với đơn giá niêm yết trong bảng tbl_loaiphong, tbl_doAn, tbl_doUong. Nhân viên lễ tân không thể can thiệp thủ công vào công thức tính tiền của Stored Procedure hoaDonTheoPhong.

5. Chi phí triển khai và thời gian hoàn vốn thực tế của phần mềm là bao lâu?

Phần mềm sử dụng công nghệ mã nguồn mở và phiên bản SQL Server miễn phí nên chi phí bản quyền là 0 VNĐ. Khách sạn chỉ cần tận dụng máy tính sẵn có tại quầy lễ tân, thời gian hoàn vốn diễn ra ngay trong tháng đầu tiên nhờ loại bỏ hoàn toàn các tổn thất do tính sót dịch vụ và giảm thiểu thời gian tác nghiệp.


Kết luận

Đồ án "Chương trình quản lý khách sạn" do nhóm sinh viên Khoa Công nghệ Thông tin - Trường Đại học Xây dựng Hà Nội thực hiện đã giải quyết trọn vẹn và chuyên sâu bài toán tự động hóa quy trình quản lý lưu trú và dịch vụ phụ trợ.

Thông qua việc kết hợp chặt chẽ giữa mô hình dữ liệu chuẩn hóa 3NF, hệ thống 38 Stored Procedures/Triggers/Functions bằng T-SQL mạnh mẽ và giao diện Java Swing trực quan, đồ án không chỉ đáp ứng xuất sắc các yêu cầu học thuật khắt khe mà còn mang lại giá trị ứng dụng thực tiễn cao cho các cơ sở kinh doanh khách sạn. Đây là nền tảng kỹ thuật vững chắc để tiếp tục mở rộng phát triển thành các hệ thống quản trị khách sạn đa nền tảng hiện đại trên môi trường Điện toán Đám mây.

Quý độc giả, sinh viên và doanh nghiệp có thể khai thác mô hình cơ sở dữ liệu và cấu trúc giải thuật trong tài liệu này làm chuẩn tham chiếu cho các dự án chuyển đổi số và phát triển phần mềm quản lý liên quan.