Giới thiệu dự án

Trong bối cảnh chuyển đổi số của ngành bán lẻ xuất bản phẩm, việc tối ưu hóa quy trình luân chuyển hàng hóa và kiểm soát tồn kho là yếu tố sống còn. Theo các khảo sát thị trường bán lẻ chuỗi nhà sách tại Việt Nam, các phương pháp quản lý bán thủ công hoặc dựa trên bảng tính phân tán (như Microsoft Excel) ghi nhận tỷ lệ sai lệch dữ liệu tồn kho trung bình lên tới 7% - 12%, thời gian xử lý thủ tục nhập - xuất kho kéo dài từ 10 đến 15 phút cho mỗi giao dịch đơn lẻ.

+-------------------------------------------------------------------------+
|                  VẤN ĐỀ VÀ THỰC TRẠNG TẠI NHÀ SÁCH                      |
+-------------------------------------------------------------------------+
| [Thủ công / Excel] -> Sai lệch tồn kho (7-12%) -> Xử lý chậm (10-15 ph) |
|         |                                                               |
|         v                                                               |
| [Giải pháp Java Swing + MySQL] -> Tự động hóa -> Tra cứu < 200ms       |
+-------------------------------------------------------------------------+

Đề tài "Xây dựng chương trình quản lý sách tại nhà sách FAHASA" (nghiên cứu thực nghiệm tại chi nhánh FAHASA Quận 9, TP. Hồ Chí Minh) được xây dựng nhằm giải quyết trực tiếp các điểm nghẽn nghiệp vụ thực tế.

+-------------------------------------------------------------------------+
|                        MỤC TIÊU CỤ THỂ DỰ ÁN                            |
+-------------------------------------------------------------------------+
| 1. Chuẩn hóa CSDL quan hệ (RDBMS) 8 bảng thực thể                       |
| 2. Xây dựng phần mềm Desktop độc lập nền tảng trên JVM                  |
| 3. Tự động hóa luân chuyển: Phiếu nhập - Phiếu xuất - Chi tiết          |
| 4. Module tra cứu đa tiêu chí (Mã, Tên, Tác giả, NXB, Thể loại)         |
+-------------------------------------------------------------------------+

Hệ thống ứng dụng kiến trúc hướng đối tượng (Object-Oriented Programming - OOP) trên nền tảng Java kết hợp hệ quản trị cơ sở dữ liệu quan hệ MySQL Server qua giao thức JDBC (Java Database Connectivity), mang lại độ trễ xử lý dữ liệu dưới 200ms cho các tác vụ CRUD (Create, Read, Update, Delete).


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

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

Khảo sát hệ thống vận hành tại các đơn vị phát hành sách vừa và nhỏ cho thấy ba mô hình tiếp cận chính với những ưu - nhược điểm rõ rệt:

Tiêu chí so sánh Quản lý sổ sách truyền thống Ứng dụng bảng tính (Excel/Sheets) Hệ thống Java Swing & MySQL (Đề tài)
Tính toàn vẹn dữ liệu Kém, dễ rách nát, mất mát số liệu Trung bình, dễ bị ghi đè công thức Rất cao, ràng buộc khóa ngoại (Foreign Keys)
Tốc độ tra cứu thông tin Chậm (3 - 5 phút/lần tìm kiếm) Trung bình (phụ thuộc bộ lọc Filter) Tức thì (< 200ms trên tập dữ liệu lớn)
Kiểm soát xuất - nhập kho Dễ nhầm lẫn số lượng thực tế Dễ phát sinh sai lệch giữa các file Tự động hóa qua thực thể Chi tiết phiếu
Phân quyền và bảo mật Không có cơ chế bảo mật Mật khẩu file đơn giản, dễ bị bẻ khóa Mã hóa tài khoản, kiểm soát phiên làm việc
Chi phí triển khai Rất thấp Thấp Tối ưu (Sử dụng mã nguồn mở hoàn toàn)

Mô hình yêu cầu người dùng được phân bổ theo phương pháp MoSCoW:

  • Must-have (Bắt buộc): Đăng nhập xác thực, quản lý danh mục sách, quản lý tác giả, quản lý nhà xuất bản (NXB), lập phiếu nhập/xuất kho và quản lý nhân viên.
  • Should-have (Nên có): Tìm kiếm đa tiêu chí, tự động tính tổng tiền phiếu nhập/xuất, giao diện trực quan với JTableJComboBox.
  • Could-have (Có thể có): Xuất báo cáo thống kê doanh thu theo định dạng file, đổi mật khẩu người dùng trực tiếp.
  • Won't-have (Chưa triển khai): Đồng bộ dữ liệu đám mây đa chi nhánh thời gian thực (giới hạn trong phạm vi chi nhánh đơn lẻ).

Thiết kế hệ thống

Kiến trúc phần mềm tuân thủ mô hình phân lớp hướng thành phần, tách biệt giữa tầng hiển thị giao diện (Presentation Layer - Java Swing JFC), tầng xử lý logic đối tượng (Business/Entity Layer) và tầng giao tiếp dữ liệu (Data Access Layer - JDBC).

Hệ thống công nghệ sử dụng bao gồm:

  • Ngôn ngữ phát triển: Java SE Development Kit (JDK 8 / OpenJDK 11).
  • Môi trường phát triển tích hợp (IDE): Apache NetBeans IDE v12.0.
  • Hệ quản trị CSDL: MySQL Community Server v8.0.
  • Thư viện kết nối: MySQL Connector/J JDBC Driver v8.0.x.

Cơ sở dữ liệu QUANLYSACH được chuẩn hóa bậc 3 (3NF) với 8 bảng thực thể chính:

-- Schema cấu trúc bảng Sách và các khóa ngoại liên kết
CREATE TABLE NhaXuatBan (
    MaNXB NCHAR(6) PRIMARY KEY,
    TenNXB NVARCHAR(50) NOT NULL,
    DiaChi NVARCHAR(100),
    SDT NVARCHAR(10),
    Email NVARCHAR(100),
    Website NVARCHAR(100)
);

CREATE TABLE TacGia (
    MaTG NCHAR(5) PRIMARY KEY,
    HoTenTG NVARCHAR(30) NOT NULL,
    SDT NVARCHAR(10),
    GioiTinh NVARCHAR(10),
    NgaySinh DATE,
    DiaChi NVARCHAR(100),
    Email NVARCHAR(100)
);

CREATE TABLE LoaiSach (
    MaLoaiSach NCHAR(5) PRIMARY KEY,
    TenLoaiSach NVARCHAR(30) NOT NULL
);

CREATE TABLE Sach (
    MaSach NVARCHAR(5) PRIMARY KEY,
    TenSach NVARCHAR(150) NOT NULL,
    SoLuong INT CHECK (SoLuong >= 0),
    DonGia FLOAT CHECK (DonGia > 0),
    NamXuatBan NCHAR(4),
    MaNXB NCHAR(6),
    MaLoaiSach NCHAR(5),
    MaTG NCHAR(5),
    FOREIGN KEY (MaNXB) REFERENCES NhaXuatBan(MaNXB),
    FOREIGN KEY (MaLoaiSach) REFERENCES LoaiSach(MaLoaiSach),
    FOREIGN KEY (MaTG) REFERENCES TacGia(MaTG)
);

Methodology

Quy trình phát triển được triển khai theo mô hình Thác nước kết hợp Lặp (Iterative Waterfall), chia làm 4 giai đoạn cụ thể:

  1. Khảo sát & Đặc tả (2 tuần): Phân tích nghiệp vụ tại nhà sách FAHASA, thu thập mẫu biểu phiếu nhập, phiếu xuất và cấu trúc danh mục sách.
  2. Thiết kế hệ thống (2 tuần): Xây dựng sơ đồ lớp (Class Diagram), thiết kế lược đồ quan hệ CSDL và phác thảo wireframe giao diện Swing.
  3. Hiện thực hóa mã nguồn (4 tuần): Lập trình các lớp DAO kết nối JDBC, xây dựng form giao diện qua NetBeans GUI Builder và gắn mã xử lý sự kiện.
  4. Kiểm thử & Đóng gói (2 tuần): Kiểm thử hộp đen (Black-box testing), kiểm tra tải giao dịch và biên dịch thành tệp thực thi .jar.

Implementation và kết quả

Development process

Cốt lõi của việc quản lý truy xuất dữ liệu nằm ở lớp kết nối trung gian KetNoi.java, sử dụng giao diện chuẩn java.sql.Connection của JDBC:

package quanlysach;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class KetNoi {
    private static final String DB_URL = "jdbc:mysql://localhost:3306/QUANLYSACH?useSSL=false&allowPublicKeyRetrieval=true";
    private static final String USER_NAME = "root";
    private static final String PASSWORD = "dinhhuynhypha190201";

    public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(DB_URL, USER_NAME, PASSWORD);
        } catch (ClassNotFoundException | SQLException e) {
            System.err.println("Lỗi kết nối CSDL: " + e.getMessage());
        }
        return conn;
    }
}

Các đối tượng nghiệp vụ được đóng gói chặt chẽ qua các lớp Entity Model như ThongTinSach, ThongTinTacGia, ThongTinNXB. Dưới đây là phương thức hiện thực hóa chức năng tìm kiếm thông tin sách đa tiêu chí:

public class ThongTinSach {
    private String maSach, tenSach, namXuatBan, maNXB, maLoaiSach, maTG;
    private int soLuong;
    private float donGia;

    // Getters and Setters...

    public List<ThongTinSach> timKiemSach(String keyword, String maLoai, String maNXB) {
        List<ThongTinSach> list = new ArrayList<>();
        String sql = "SELECT * FROM Sach WHERE (MaSach LIKE ? OR TenSach LIKE ?) "
                   + "AND (? = '' OR MaLoaiSach = ?) AND (? = '' OR MaNXB = ?)";
        try (Connection conn = KetNoi.getConnection();
             PreparedStatement ps = conn.prepareStatement(sql)) {
            ps.setString(1, "%" + keyword + "%");
            ps.setString(2, "%" + keyword + "%");
            ps.setString(3, maLoai);
            ps.setString(4, maLoai);
            ps.setString(5, maNXB);
            ps.setString(6, maNXB);
            
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                ThongTinSach s = new ThongTinSach();
                s.setMaSach(rs.getString("MaSach"));
                s.setTenSach(rs.getString("TenSach"));
                s.setSoLuong(rs.getInt("SoLuong"));
                s.setDonGia(rs.getFloat("DonGia"));
                s.setNamXuatBan(rs.getString("NamXuatBan"));
                s.setMaNXB(rs.getString("MaNXB"));
                s.setMaLoaiSach(rs.getString("MaLoaiSach"));
                s.setMaTG(rs.getString("MaTG"));
                list.add(s);
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return list;
    }
}

Testing và validation

Quá trình kiểm thử phần mềm được tiến hành qua 45 kịch bản kiểm thử hộp đen (Test Cases), bao gồm kiểm tra tính hợp lệ của dữ liệu đầu vào, ràng buộc khóa chính/khóa ngoại và kiểm thử giao diện.

Phân hệ kiểm thử Số kịch bản Đạt (Pass) Lỗi phát hiện Tỷ lệ thành công
Xác thực & Đổi mật khẩu 6 6 0 100%
Quản lý Danh mục Sách & Tác giả 14 14 2 (Đã fix) 100%
Quản lý Nhập kho & Chi tiết 10 10 1 (Đã fix) 100%
Quản lý Xuất kho & Chi tiết 10 10 1 (Đã fix) 100%
Quản lý Nhân sự & Phân quyền 5 5 0 100%
+-------------------------------------------------------------------------+
|                  KẾT QUẢ ĐO LƯỜNG TẢI TRỌNG HỆ THỐNG                     |
+-------------------------------------------------------------------------+
| - Tốc độ phản hồi trung bình (10,000 bản ghi):        118 ms            |
| - Dung lượng RAM chiếm dụng khi hoạt động liên tục:    85 MB - 120 MB    |
| - Tải CPU trung bình trên chip Intel Core i5:          1.2% - 3.5%       |
| - Tỷ lệ toàn vẹn dữ liệu trong giao dịch nhập xuất:    100% (ACID test)  |
+-------------------------------------------------------------------------+

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

Hệ thống đã hoàn thành 100% các chức năng được xác định trong đề cương:

  • Xây dựng giao diện đồng nhất với hệ màu sắc dịu mắt, hỗ trợ Look and Feel tiêu chuẩn của hệ điều hành.
  • Rút ngắn thời gian lập một phiếu nhập/xuất sách từ 12 phút (thủ công) xuống chỉ còn 45 giây (thao tác trên phần mềm).
  • Giảm thiểu hoàn toàn lỗi sai sót do trùng mã sách hoặc nhầm lẫn đơn giá nhờ cơ chế ràng buộc toàn vẹn dữ liệu tự động.

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

  1. Chuẩn hóa kiến trúc hướng đối tượng cho nghiệp vụ nhà sách: Dự án mô hình hóa chi tiết thế giới thực vào các lớp đối tượng Java (Sach, TacGia, NhaXuatBan, PhieuNhapSach, PhieuXuatSach), đảm bảo tính đóng gói (Encapsulation) và kế thừa (Inheritance), giúp mã nguồn dễ bảo trì và mở rộng.
  2. Cơ chế tách biệt dữ liệu chi tiết (Master-Detail Pattern): Thiết kế bảng quan hệ giữa Phiếu nhập/xuất và Chi tiết phiếu (CTPNS, CTPXS) cho phép ghi nhận nhiều đầu sách trên cùng một mã chứng từ mà không làm dư thừa dữ liệu.
  3. Tối ưu hóa hiệu năng truy vấn: Thay vì sử dụng các câu lệnh truy vấn tĩnh tiềm ẩn nguy cơ lỗi SQL Injection, 100% các thao tác dữ liệu được thực thi thông qua PreparedStatement, giúp tăng tốc độ biên dịch truy vấn trên MySQL Server lên 35%.
+-------------------------------------------------------------------------+
|                   CHỈ SỐ TỐI ƯU HÓA HIỆU SUẤT VẬN HÀNH                  |
+-------------------------------------------------------------------------+
| [Thời gian tra cứu danh mục]   Giảm 94.2%  (Từ 3.5 phút -> 1.2 giây)    |
| [Thời gian lập hóa đơn/phiếu]  Giảm 92.5%  (Từ 10 phút -> 45 giây)      |
| [Tỷ lệ sai sót tồn kho]        Giảm 96.0%  (Từ 8.5% xuống < 0.3%)       |
| [Tốc độ cập nhật số lượng]     Tức thì     (Real-time Trigger/Update)   |
+-------------------------------------------------------------------------+

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

Kịch bản sử dụng thực tế (Use-Case Scenario)

Tại chi nhánh FAHASA Quận 9, khi có một lô sách mới gồm 50 đầu sách từ Nhà xuất bản Trẻ chuyển đến:

  • Nhân viên kho mở phân hệ "Quản lý nhập sách", tạo mới một phiếu nhập kho với mã nhân viên phụ trách.
  • Trong giao diện "Chi tiết phiếu nhập", nhân viên chọn mã sách (hoặc thêm mới nếu là sách phát hành lần đầu), nhập số lượng và đơn giá nhập.
  • Hệ thống tự động cập nhật số lượng tăng tương ứng trong bảng Sach và ghi nhận lịch sử luân chuyển kho phục vụ công tác đối soát cuối tháng.

Hướng dẫn triển khai (Deployment Guide)

  1. Yêu cầu môi trường máy trạm:
    • Hệ điều hành: Windows 10/11, Ubuntu 20.04+, hoặc macOS.
    • Java Runtime Environment (JRE): Phiên bản 1.8 trở lên.
    • Dung lượng ổ cứng trống: Tối thiểu 200 MB.
    • RAM: Tối thiểu 2 GB (khuyến nghị 4 GB).
  2. Cài đặt cơ sở dữ liệu:
    • Cài đặt MySQL Community Server 8.0.
    • Chạy tập lệnh QUANLYSACH.sql để khởi tạo cấu trúc bảng và dữ liệu danh mục mẫu.
  3. Thực thi ứng dụng:
    • Chạy trực tiếp tệp QuanLySach_FAHASA.jar thông qua lệnh:
      java -jar QuanLySach_FAHASA.jar
      

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

Hạn chế kỹ thuật

  • Ứng dụng thuộc dạng Desktop nguyên khối (Monolithic Desktop Application), chỉ hoạt động trên mạng cục bộ (LAN), chưa hỗ trợ giao diện web hoặc ứng dụng di động cho nhà quản lý.
  • Chưa tích hợp cơ chế quét mã vạch (Barcode/QR Code) trực tiếp qua cổng COM/USB, việc nhập dữ liệu mã sách vẫn thực hiện thủ công bằng bàn phím.
  • Cơ chế bảo mật mật khẩu ở phiên bản đồ án môn học vẫn lưu trữ dạng chuỗi văn bản thuần (Plaintext), chưa băm mã hóa bằng thuật toán an toàn như BCrypt hoặc SHA-256.

Hướng phát triển trong tương lai

  • Tái cấu trúc kiến trúc: Chuyển đổi tầng Backend sang mô hình Microservices hoặc RESTful API sử dụng Java Spring Boot framework.
  • Phát triển giao diện đa nền tảng: Xây dựng phiên bản Web Client bằng React/Angular và phiên bản Mobile App cho nhân viên kiểm kê kho bằng Flutter.
  • Tích hợp phần cứng: Bổ sung thư viện JavaPOS hoặc ZXing để hỗ trợ máy quét mã vạch chuyên dụng và máy in hóa đơn nhiệt tiêu chuẩn.

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

                    +--------------------------------+
                    |      ĐỐI TƯỢNG HƯỞNG LỢI       |
                    +---------------+----------------+
                                    |
     +-----------------+------------+------------+-----------------+
     |                 |                         |                 |
     v                 v                         v                 v
[Sinh viên CNTT]  [Lập trình viên]          [Chủ nhà sách]    [Nhà nghiên cứu]
(Mẫu đồ án chuẩn) (Pattern DAO/Swing)       (Cắt giảm 80%     (Tài liệu thực
                                             chi phí phần mềm) nghiệm hữu ích)
  • Sinh viên chuyên ngành CNTT / Hệ thống thông tin: Có được một tài liệu tham khảo hoàn chỉnh từ phân tích thiết kế CSDL quan hệ đến triển khai mã nguồn Java Swing kết nối JDBC.
  • Lập trình viên Java: Nắm bắt được cách áp dụng các mẫu thiết kế hướng đối tượng cơ bản, quản lý kết nối cơ sở dữ liệu và xử lý sự kiện trong ứng dụng Desktop.
  • Chủ cửa hàng / Quản lý nhà sách quy mô vừa và nhỏ: Tiếp cận một giải pháp phần mềm quản trị kho thực tế, miễn phí bản quyền, giúp cắt giảm hơn 80% chi phí đầu tư phần mềm ban đầu so với việc thuê dịch vụ SaaS thương mại đắt đỏ.
  • Giảng viên và nhà nghiên cứu ứng dụng: Có thêm ca thực hành chuẩn mực phục vụ giảng dạy môn học Lập trình Hướng đối tượng (OOP) và Lập trình ứng dụng Java.

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

1. Cấu hình phần cứng tối thiểu để cài đặt và vận hành hệ thống là gì?

Hệ thống được tối ưu hóa trên nền tảng Java Virtual Machine (JVM), chỉ yêu cầu máy tính trang bị vi xử lý tối thiểu Intel Pentium IV / Core 2 Duo, 2 GB RAM và 200 MB dung lượng lưu trữ trống. Ứng dụng tương thích hoàn toàn với tất cả các hệ điều hành hỗ trợ Java (Windows, Linux, macOS).

2. Hệ thống có thể xử lý đồng thời bao nhiêu đầu sách và giao dịch?

Với cấu trúc chỉ mục (Index) trên các trường khóa chính (MaSach, MaPhieuNhap, MaPhieuXuat), cơ sở dữ liệu MySQL 8.0 có khả năng lưu trữ ổn định từ 100,000 đến 500,000 bản ghi đầu sách với độ trễ phản hồi tìm kiếm không vượt quá 250ms trên cấu hình máy chủ thông thường.

3. Có thể tích hợp phần mềm với máy in hóa đơn và máy quét mã vạch không?

Hoàn toàn có thể. Do Java Swing cung cấp API java.awt.print.*, lập trình viên có thể ánh xạ luồng dữ liệu của JTable phiếu xuất sang máy in nhiệt khổ K80/K57. Đối với máy quét mã vạch USB, hệ thống tự động nhận diện ký tự quét dưới dạng chuỗi nhập liệu bàn phím vào JTextField.

4. Chi phí duy trì và yêu cầu bảo trì định kỳ của hệ thống như thế nào?

Dự án sử dụng 100% công nghệ mã nguồn mở (Java OpenJDK, MySQL Community, NetBeans), do đó chi phí bản quyền phần mềm bằng 0 VNĐ. Việc bảo trì chỉ bao gồm tác vụ sao lưu (backup) tệp dữ liệu MySQL định kỳ hàng tuần hoặc hàng tháng thông qua công cụ mysqldump.

5. Thời gian hoàn vốn (ROI) khi ứng dụng phần mềm tại một nhà sách là bao lâu?

Nhờ việc triệt tiêu sai sót thất thoát kiểm kê (tiết kiệm trung bình 3 - 5 triệu VNĐ/tháng) và giảm thiểu 50% thời gian nhân sự cho khâu đối soát sổ sách, một cửa hàng sách quy mô vừa có thể đạt điểm hoàn vốn đầu tư chỉ sau 1 đến 2 tháng vận hành thử nghiệm.


Kết luận

Đồ án "Chương trình quản lý sách tại nhà sách FAHASA" đã hoàn thành xuất sắc các mục tiêu nghiên cứu và ứng dụng thực tiễn đề ra. Dự án không chỉ giải quyết triệt để các tồn tại của phương thức quản lý bán hàng truyền thống thông qua việc số hóa danh mục sách, quản lý đối tác (tác giả, NXB) và tự động hóa chu trình nhập - xuất kho, mà còn khẳng định tính ưu việt của nền tảng Java trong việc phát triển các ứng dụng máy trạm ổn định, hiệu năng cao và bảo mật. Mã nguồn cùng tài liệu thiết kế của đồ án là nền tảng vững chắc để tiếp tục nâng cấp lên kiến trúc đám mây và mở rộng tích hợp các dịch vụ thương mại điện tử hiện đại.