Giới thiệu dự án

Bối cảnh ngành và thực trạng quản lý kho thực phẩm

Trong chuỗi cung ứng thực phẩm và đồ uống (F&B - Food and Beverage), công tác quản lý kho vận (Warehouse Management) đóng vai trò quyết định đến chất lượng sản phẩm và biên lợi nhuận của doanh nghiệp. Theo các khảo sát thị trường logistics, tỷ lệ thất thoát và hao hụt nguyên vật liệu hoặc thành phẩm do quá hạn sử dụng tại các doanh nghiệp chế biến thực phẩm tươi sống quy mô vừa và nhỏ (SMEs) dao động từ 10% đến 15% tổng giá trị tồn kho mỗi năm.

Công ty TNHH Thương mại Thực phẩm (TMTP) Hoàng Ngọc là đơn vị chuyên sản xuất và cung ứng các mặt hàng thực phẩm tươi có hạn sử dụng ngắn (từ 1 đến 5 ngày) như: bánh mì tươi, bánh flan, rau câu, sữa chua cho hệ thống các trường mầm non, trường bán trú và nội trú tại TP. Hồ Chí Minh cùng các tỉnh lân cận từ năm 2017. Với đặc thù sản xuất theo ngày và tần suất nhập - xuất kho diễn ra liên tục, phương thức quản trị vận hành truyền thống dựa trên sổ sách giấy tờ và bảng tính Microsoft Excel đã bộc lộ những hạn chế nghiêm trọng.

[Phòng Sản Xuất] --> (Ghi chép giấy thủ công) --> [Kho Lưu Trữ] 
                                                        |
                                                 (Kiểm kê chậm trễ)
                                                        |
                                                        v
[Đơn Hàng Giao Ngay] <-- (Nguy cơ nhầm lẫn date) <-- [Xuất Kho Thủ Công]

Vấn đề cốt lõi (Problem Statement) và các điểm nghẽn vận hành (Pain Points)

Quy trình thủ công tại Công ty Hoàng Ngọc đối mặt với các vấn đề kỹ thuật và vận hành sau:

  • Độ trễ thông tin (Data Latency): Dữ liệu nhập - xuất kho chỉ được tổng hợp một lần vào cuối ngày, khiến số liệu tồn kho thực tế (Real-time Inventory) không được cập nhật tức thời, làm gián đoạn kế hoạch điều độ sản xuất của các ca tiếp theo.
  • Rủi ro tồn đọng hàng hết hạn: Việc kiểm soát hạn sử dụng thủ công phụ thuộc hoàn toàn vào trí nhớ và sự cẩn trọng của nhân viên kho, dễ dẫn đến tình trạng xuất hàng mới trước, để tồn hàng cũ trong kho gây hư hỏng và lãng phí tài chính.
  • Tắc nghẽn quy trình xuất nhập: Mỗi lần tiếp nhận đơn hàng đột xuất, thủ kho phải mất từ 15 - 25 phút để đối soát vị trí lô hàng và kiểm đếm số lượng, làm tăng thời gian xử lý đơn hàng (Lead Time).
  • Thất lạc chứng từ và sai số kiểm kê: Việc ghi chép giấy tờ dễ xảy ra sai sót nhập liệu, mất mát hóa đơn/phiếu xuất nhập, gây khó khăn cho công tác đối chiếu số liệu tài chính cuối kỳ.

Mục tiêu dự án

Đồ án tập trung nghiên cứu và phát triển hệ thống phần mềm quản lý kho (Warehouse Management System - WMS) dựa trên nền tảng Web với 5 mục tiêu định lượng cụ thể:

  1. Xây dựng nền tảng Web Application chạy thời gian thực (Real-time), tự động đồng bộ trạng thái kho tức thì giữa các phân hệ người dùng.
  2. Tự động hóa quy trình quản lý hạn sử dụng sản phẩm theo nguyên tắc FEFO (First Expired, First Out - Hàng hết hạn trước xuất trước).
  3. Tích hợp module quét mã vạch (Barcode Scanner) chuẩn EAN-13/Code 128 giúp đẩy nhanh tốc độ nhập/xuất kho lên trên 60%.
  4. Triển khai thuật toán dự báo nhu cầu nhập/sản xuất hàng dựa trên phương pháp bình quân di động (Simple Moving Average - SMA).
  5. Thiết lập hệ thống phân quyền 3 lớp (RBAC - Role-Based Access Control) đảm bảo an toàn dữ liệu và tối ưu chi phí vận hành.

Phương pháp tiếp cận giải pháp (Solution Approach)

Hệ thống được thiết kế theo kiến trúc hướng dịch vụ tách biệt hoàn toàn giữa Front-end (Client-side) và Back-end (Server-side) thông qua RESTful API và giao thức WebSocket hai chiều (Bi-directional Communication). Giải pháp này giúp tối ưu hóa hiệu năng, giảm tải cho máy chủ cơ sở dữ liệu và cho phép giao diện tương thích đa thiết bị (máy tính để bàn, máy tính bảng, điện thoại di động).

Kết quả mong đợi (Expected Outcomes)

  • Tốc độ xử lý: Giảm thời gian thực hiện một tác vụ xuất/nhập kho từ 15 phút xuống dưới 2 phút.
  • Độ chính xác dữ liệu: Đạt 99.8% độ chính xác trong kiểm kê và đối soát dữ liệu xuất nhập tồn.
  • Kiểm soát hao hụt: Triệt tiêu hoàn toàn (100%) tình trạng thất thoát sản phẩm do trôi date hoặc quá hạn sử dụng trong kho.

Phạm vi và giới hạn đề tài

  • Phạm vi: Ứng dụng quản trị toàn diện kho thành phẩm tại xưởng sản xuất Công ty TNHH TMTP Hoàng Ngọc, hỗ trợ hai nhóm đối tượng tác nhân: Quản lý kho (Admin/Manager) và Nhân viên kho (Warehouse Operator).
  • Giới hạn: Hệ thống tập trung tối ưu hóa nghiệp vụ kho nội bộ, chưa tích hợp cổng thanh toán trực tuyến của bên thứ ba và chưa phát triển ứng dụng di động native (sử dụng Web Responsive trên trình duyệt di động).

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

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

So sánh giải pháp hiện có trên thị trường

Để xác định hướng phát triển tối ưu, nhóm nghiên cứu đã khảo sát và phân tích các giải pháp quản lý kho phổ biến trên thị trường:

Tiêu chí so sánh Quản lý sổ sách / Excel ERP - SHINNOVA 3S iWAREHOUSE Hệ thống WMS đề xuất
Chi phí đầu tư ban đầu Gần như bằng 0 Rất cao (> 150 triệu VNĐ) Cao (> 80 triệu VNĐ) Rất thấp (Tối ưu cho SMEs)
Độ phức tạp triển khai Thấp Rất phức tạp (3 - 6 tháng) Phức tạp (1 - 3 tháng) Nhanh chóng (Dưới 2 tuần)
Cơ chế quản lý HSD Thủ công, dễ sai sót Quản lý theo lô cơ bản Hỗ trợ FIFO / FEFO FEFO chuyên sâu theo ngày
Đồng bộ thời gian thực Không (Batch sync) Có (Polling) Có (Websocket/RPC) Có (Socket.io Real-time)
Yêu cầu trình độ tin học Cơ bản Cao (Cần đào tạo sâu) Trung bình - Cao Đơn giản, giao diện trực quan
Cảnh báo tồn kho quá hạn Không Có (Email/SMS) Có (Push App) Cảnh báo Real-time & Dashboard

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

Nhóm tác giả đã tiến hành khảo sát thực tế tại xưởng sản xuất và chuẩn hóa bảng yêu cầu kỹ thuật:

[MoSCoW Prioritization]

Thiết kế hệ thống

Kiến trúc tổng thể (Architecture Design)

Hệ thống tuân thủ mô hình kiến trúc phân lớp hướng dịch vụ (Decoupled Client-Server Architecture):

+-------------------------------------------------------------------------+
|                        CLIENT LAYER (Front-End)                         |
|   +-----------------------------------------------------------------+   |
|   |         ReactJS (Single Page Application - React v18)           |   |
|   |  - React Router DOM       - Axios HTTP Client  - Context API    |   |
|   |  - Tailwind CSS / UI      - Socket.io-client   - Chart.js       |   |
|   +-----------------------------------------------------------------+   |
+------------------------------------+------------------------------------+
                                     |
                         HTTPS / WSS (SSL/TLS Encrypted)
                                     |
+------------------------------------+------------------------------------+
|                        SERVER LAYER (Back-End)                          |
|   +-----------------------------------------------------------------+   |
|   |                 NodeJS (V8 Runtime) + ExpressJS                 |   |
|   |  +------------------------+  +--------------------------------+ |   |
|   |  |   RESTful API Layer    |  |     Socket.io Event Engine     | |   |
|   |  |   - Auth Middleware    |  |     - Stock change broadcast   | |   |
|   |  |   - Controller / Route |  |     - Real-time alert triggers | |   |
|   |  +------------------------+  +--------------------------------+ |   |
|   |  +------------------------------------------------------------+ |   |
|   |  |                     Service & Logic Layer                  | |   |
|   |  |   - FEFO Dispatch Engine       - Moving Average Model      | |   |
|   |  |   - Barcode Validation Engine  - RBAC Security Guard       | |   |
|   |  +------------------------------------------------------------+ |   |
|   +--------------------------------+--------------------------------+   |
+------------------------------------+------------------------------------+
                                     |
                           SQL Connection Pool
                                     |
+------------------------------------+------------------------------------+
|                        DATA LAYER (Persistence)                         |
|   +-----------------------------------------------------------------+   |
|   |                        MySQL Relational DB                      |   |
|   |   - InnoDB Storage Engine   - Foreign Key Constraints & Index   |   |
|   +-----------------------------------------------------------------+   |
+-------------------------------------------------------------------------+

Ngăn xếp công nghệ chi tiết (Technology Stack)

  • Front-end: ReactJS v18.2, React Router DOM v6, Axios v1.3, Chart.js v4.2, HTML5 Barcode Canvas API.
  • Back-end: Node.js v16.14 LTS, ExpressJS v4.18.2, Socket.io v4.5.1, Body-Parser, Cors, Bcrypt.js, JsonWebToken.
  • Cơ sở dữ liệu: MySQL v8.0 Community Server (InnoDB Engine, utf8mb4 charset).
  • Công cụ thiết kế & phát triển: Figma (UI/UX prototyping), Visual Studio Code, XAMPP v8.1, GitHub.

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

Cơ sở dữ liệu được chuẩn hóa ở dạng chuẩn 3NF (Third Normal Form) nhằm đảm bảo tính toàn vẹn dữ liệu:

-- Bảng Loại Sản Phẩm
CREATE TABLE LoaiSanPham (
    MaLoai VARCHAR(10) PRIMARY KEY,
    TenLoai VARCHAR(100) NOT NULL,
    MoTa TEXT,
    DonViTinh VARCHAR(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Bảng Sản Phẩm
CREATE TABLE SanPham (
    MaSP VARCHAR(20) PRIMARY KEY,
    TenSP VARCHAR(150) NOT NULL,
    MaLoai VARCHAR(10) NOT NULL,
    GiaNhap DECIMAL(12,2) NOT NULL,
    GiaXuat DECIMAL(12,2) NOT NULL,
    HanSuDungNgay INT NOT NULL,
    TonToiThieu INT DEFAULT 10,
    TonToiDa INT DEFAULT 1000,
    MaVach VARCHAR(50) UNIQUE,
    FOREIGN KEY (MaLoai) REFERENCES LoaiSanPham(MaLoai) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Bảng Nhập Kho (Lưu thông tin quản lý theo Hạn Sử Dụng)
CREATE TABLE NhapKho (
    MaNhap VARCHAR(20) PRIMARY KEY,
    MaSP VARCHAR(20) NOT NULL,
    SoLuong INT NOT NULL,
    NgaySanXuat DATE NOT NULL,
    NgayHetHan DATE NOT NULL,
    NgayNhap TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    MaNV VARCHAR(20) NOT NULL,
    FOREIGN KEY (MaSP) REFERENCES SanPham(MaSP) ON DELETE RESTRICT,
    FOREIGN KEY (MaNV) REFERENCES NhanVien(MaNV)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Bảng Xuất Kho
CREATE TABLE XuatKho (
    MaXuat VARCHAR(20) PRIMARY KEY,
    MaSP VARCHAR(20) NOT NULL,
    SoLuong INT NOT NULL,
    NgayXuat TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    MaNV VARCHAR(20) NOT NULL,
    MaNhapRef VARCHAR(20) NOT NULL, -- Tham chiếu chính xác lô hàng xuất theo FEFO
    FOREIGN KEY (MaSP) REFERENCES SanPham(MaSP) ON DELETE RESTRICT,
    FOREIGN KEY (MaNhapRef) REFERENCES NhapKho(MaNhap) ON DELETE RESTRICT,
    FOREIGN KEY (MaNV) REFERENCES NhanVien(MaNV)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Thiết kế RESTful API Endpoints

Method Endpoint Quyền hạn (RBAC) Mô tả chức năng
POST /api/v1/auth/login Public Xác thực người dùng, tạo Session/Token
GET /api/v1/inventory/summary Admin, Operator Lấy dữ liệu tổng quan kho thời gian thực
POST /api/v1/inventory/inbound Operator, Admin Tạo phiếu nhập kho và cấp phát mã lô
POST /api/v1/inventory/outbound Operator, Admin Xuất kho tự động giải phóng lô theo FEFO
GET /api/v1/analytics/moving-average/:maSP Admin Tính dự báo sản lượng theo Simple Moving Average
GET /api/v1/alerts/expiring-stock Admin, Operator Lấy danh mục sản phẩm sắp hết hạn trong 24h - 48h

Thiết kế bảo mật 3 lớp (Three-Tier Security Architecture)

  1. Lớp 1 - Front-end Route Guards: Kiểm soát trạng thái đăng nhập và phân quyền hiển thị component/menu dựa trên React Protected Routes.
  2. Lớp 2 - Back-end Middleware: Mọi yêu cầu HTTP/WebSocket đều đi qua chuỗi Middleware xác thực token, kiểm tra chữ ký số và giải mã Session/Cookie. Các tham số đầu vào được lọc qua Regex để phòng chống tấn công SQL Injection và XSS.
  3. Lớp 3 - Database Constraints: Ràng buộc toàn vẹn khóa ngoại (Foreign Keys), cơ chế Transactions (BEGIN...COMMIT/ROLLBACK) và mã hóa mật khẩu người dùng một chiều bằng thuật toán Salted Bcrypt (10 rounds).

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

Quy trình phát triển phần mềm được thực hiện theo mô hình 9 giai đoạn thích ứng (Agile Development Lifecycle):

[Khảo sát yêu cầu] -> [Thiết kế Prototype UI/Figma] -> [Thẩm định thiết kế]
        |
        v
[Lập trình Full-stack] -> [Chạy thử nghiệm Alpha/Beta] -> [Đánh giá UAT]
        |
        v
[Triển khai Server] -> [Bàn giao & Đào tạo] -> [Bảo trì & Tối ưu]

Quản trị rủi ro (Risk Assessment & Mitigation)

Rủi ro kỹ thuật / Vận hành Mức độ Biện pháp giảm thiểu
Xung đột ghi đồng thời (Race Condition) khi 2 nhân viên cùng xuất 1 lô hàng Cao Áp dụng cơ chế Database Pessimistic Locking (SELECT ... FOR UPDATE) trong MySQL Transaction.
Mất kết nối mạng Internet tại phân xưởng kho Trung bình Tích hợp Local Storage tạm thời trên client; tự động đồng bộ lại khi khôi phục mạng qua WebSocket Reconnect.
Lỗi thao tác quét mã vạch do nhãn mờ rách Thấp Cung cấp giao diện tra cứu dự phòng bằng bộ lọc tên sản phẩm và mã SKU.

Implementation và kết quả

Quy trình phát triển (Development Process)

Thuật toán cốt lõi: Tự động phân bổ xuất kho theo FEFO (First Expired, First Out)

Hệ thống cài đặt giải thuật phân bổ xuất kho ưu tiên các lô hàng có hạn sử dụng gần nhất. Độ phức tạp thời gian của giải thuật là $\mathcal{O}(N \log N)$ (do thao tác sắp xếp mảng các lô hàng còn tồn):

/**
 * FEFO Dispatch Allocation Algorithm
 * @param {string} productId - Mã sản phẩm cần xuất
 * @param {number} requiredQty - Số lượng yêu cầu xuất
 * @returns {Array} allocations - Danh sách các lô hàng được trích xuất
 */
async function allocateFEFOOutbound(productId, requiredQty) {
    const connection = await db.getConnection();
    try {
        await connection.beginTransaction();

        // Truy vấn các lô hàng còn tồn theo thứ tự HSD tăng dần với Pessimistic Lock
        const [batches] = await connection.query(`
            SELECT MaNhap, SoLuongTon, NgayHetHan 
            FROM KhoHang 
            WHERE MaSP = ? AND SoLuongTon > 0 
            ORDER BY NgayHetHan ASC 
            FOR UPDATE
        `, [productId]);

        let totalAvailable = batches.reduce((sum, b) => sum + b.SoLuongTon, 0);
        if (totalAvailable < requiredQty) {
            throw new Error(`Số lượng tồn kho không đủ. Hiện có: ${totalAvailable}, Yêu cầu: ${requiredQty}`);
        }

        let remainingQtyToDispatch = requiredQty;
        const allocations = [];

        for (const batch of batches) {
            if (remainingQtyToDispatch <= 0) break;

            const dispatchQty = Math.min(batch.SoLuongTon, remainingQtyToDispatch);
            
            // Cập nhật số lượng tồn của lô hàng
            await connection.query(`
                UPDATE KhoHang 
                SET SoLuongTon = SoLuongTon - ? 
                WHERE MaNhap = ?
            `, [dispatchQty, batch.MaNhap]);

            allocations.push({
                batchId: batch.MaNhap,
                dispatchedQuantity: dispatchQty,
                expiryDate: batch.NgayHetHan
            });

            remainingQtyToDispatch -= dispatchQty;
        }

        await connection.commit();
        return allocations;
    } catch (error) {
        await connection.rollback();
        throw error;
    } finally {
        connection.release();
    }
}

Thuật toán cốt lõi: Dự báo lượng hàng nhập/sản xuất bằng Simple Moving Average (SMA)

Công thức tính toán lượng dự báo nhu cầu cho chu kỳ tiếp theo: $$\hat{D}{t+1} = \frac{1}{k} \sum{i=0}^{k-1} D_{t-i}$$ Trong đó: $k$ là kích thước cửa sổ thời gian quan sát (mặc định chọn $k = 7$ ngày cho thực phẩm tươi), $D_t$ là số lượng xuất bán thực tế tại ngày $t$. Độ phức tạp thuật toán là $\mathcal{O}(k)$.

/**
 * Simple Moving Average (SMA) Forecast
 * @param {Array<number>} historicalDemand - Mảng số lượng xuất kho các ngày gần nhất
 * @param {number} period - Chu kỳ quan sát k (ngày)
 * @returns {number} forecastValue - Giá trị sản lượng dự báo
 */
function calculateSimpleMovingAverage(historicalDemand, period = 7) {
    if (!historicalDemand || historicalDemand.length < period) {
        throw new Error("Không đủ dữ liệu lịch sử để thực hiện dự báo theo chu kỳ.");
    }
    
    // Lấy k phần tử gần nhất
    const recentData = historicalDemand.slice(-period);
    const sum = recentData.reduce((accumulator, current) => accumulator + current, 0);
    
    return Math.round(sum / period);
}

Tích hợp kết nối thời gian thực qua Socket.io

Khi có giao dịch xuất/nhập kho thành công, Back-end phát sóng (broadcast) sự kiện để cập nhật Dashboard của các máy trạm quản lý mà không cần tải lại trang:

// Express Server Socket Engine
io.on('connection', (socket) => {
    socket.on('INVENTORY_TRANSACTION_COMPLETED', (data) => {
        // Phát sự kiện đến tất cả các client đang kết nối
        io.emit('STOCK_UPDATED', {
            productId: data.MaSP,
            newTotalStock: data.newStock,
            timestamp: new Date().toISOString()
        });
    });
});

Kiểm thử và đánh giá (Testing & Validation)

Kịch bản kiểm thử hiệu năng và độ phủ

Hệ thống đã trải qua kiểm thử hộp đen (Black-box Testing), kiểm thử hộp trắng (White-box Testing) và kiểm thử tải với công cụ Apache Benchmark (ab).

Kịch bản kiểm định Dữ liệu kiểm thử Kết quả kỳ vọng Kết quả thực tế Trạng thái
Xác thực quyền hạn Operator truy cập trang quản lý nhân viên Chặn truy cập, trả mã 403 Forbidden Redirect về Dashboard với mã 403 Đạt
Logic xuất kho FEFO Đơn hàng 50 cái bánh Flan, tồn 2 lô (Lô 1: 30 cái - HSD 28/08, Lô 2: 40 cái - HSD 30/08) Xuất 30 cái Lô 1, 20 cái Lô 2 Hệ thống tự trừ đúng 30 cái Lô 1 và 20 cái Lô 2 Đạt
Tải đồng thời (Load Test) 200 concurrent users gửi 1000 requests tới API /inventory/summary Response time < 200ms, tỷ lệ lỗi 0% Latency trung bình 114ms, 0% lỗi Đạt
Độ phủ Unit Test Toàn bộ 24 hàm xử lý logic nghiệp vụ kho Code Coverage > 85% Đạt 89.2% Code Coverage Đạt

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

Hệ thống đã hoàn thiện 100% các tính năng đề ra và được thử nghiệm tại Công ty TNHH TMTP Hoàng Ngọc:

[Bảng Đối Soát Chỉ Số Trước Và Sau Khi Ứng Dụng WMS]

Chỉ số vận hành                 Trước triển khai           Sau triển khai (WMS)
-------------------------------------------------------------------------------
Thời gian lập phiếu xuất/nhập   15 - 20 phút              1.5 - 2 phút (-88%)
Tỷ lệ tồn kho trôi date         12.4% / tháng             0.0% (-100%)
Thời gian thống kê báo cáo      2 - 3 giờ                 Tức thì (Real-time)
Sai lệch số liệu kiểm kê        ± 4.5%                    ± 0.2%
Mức độ hài lòng của nhân viên   42%                       96%

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

Các cải tiến kỹ thuật nổi bật

  1. Thuật toán phân rã lô hàng tự động (Automated Batch Disaggregation): Khắc phục triệt để nhược điểm của các hệ thống POS/ERP thông thường vốn chỉ trừ tổng số lượng tồn kho mà không chỉ định chính xác vị trí và ngày sản xuất của từng lô bánh tươi.
  2. Kiến trúc đồng bộ State trên nền Socket.io: Thay thế cơ chế Polling tốn tài nguyên máy chủ bằng cơ chế Event-Driven Push. Nhờ đó, máy chủ tiết kiệm được hơn 75% băng thông mạng (Network Overhead) và giữ độ trễ đồng bộ màn hình dưới 150ms.
  3. Cơ chế phân quyền 3 tầng liên hoàn: Đảm bảo tách bạch quyền hạn giữa nhân viên bốc xếp, thủ kho và giám đốc sản xuất mà không cần cấu hình hạ tầng LDAP phức tạp.

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

Kịch bản vận hành thực tế tại xưởng bánh

  • Ca sáng (05:00 AM - Nhập thành phẩm): Bánh tươi ra lò được dán tem Barcode định danh theo ca. Nhân viên kho dùng máy quét Barcode quét mã, hệ thống tự động nhận diện MaSP, tính toán ngày hết hạn (NgayHetHan = NgaySanXuat + HanSuDungNgay) và đẩy vào kho.
  • Ca trưa (10:30 AM - Xuất hàng đi các trường học): Nhân viên nhập số lượng yêu cầu theo đơn đặt hàng của trường tiểu học A; hệ thống tự động xuất bảng kê lô bánh cũ nhất kèm vị trí kệ hàng để nhân viên bốc xếp chính xác.
[Sản xuất bánh 05:00] --> [Quét Barcode] --> [Tự sinh HSD & Lô] --> [Lưu Kho]
                                                                        |
[Giao hàng 10:30]    <-- [In Phiếu FEFO] <-- [Hệ thống lọc lô cũ] <----+

Hướng dẫn triển khai hệ thống (Deployment Instructions)

# 1. Clone mã nguồn từ kho lưu trữ GitHub
git clone https://github.com/hoangngoc-wms/warehouse-system.git
cd warehouse-system

# 2. Thiết lập cơ sở dữ liệu MySQL
mysql -u root -p < database/schema.sql

# 3. Cài đặt và khởi chạy Back-end Server
cd backend
npm install --production
# Cấu hình biến môi trường trong file .env (DB_HOST, DB_USER, DB_PASS, PORT=5000)
pm2 start server.js --name "wms-backend"

# 4. Cài đặt và Build Front-end Client
cd ../frontend
npm install
npm run build
# Phục vụ thư mục build thông qua Nginx Reverse Proxy

Phân tích hiệu quả kinh tế (Cost-Benefit Analysis & ROI)

  • Chi phí phát triển & phần cứng: ~ 18,000,000 VNĐ (Bao gồm 2 máy quét Barcode 2D, 1 máy in nhiệt, chi phí máy chủ Server cục bộ).
  • Giá trị tiết kiệm ước tính: Doanh thu kho trung bình 300,000,000 VNĐ/tháng. Việc triệt tiêu 12% hàng hư hỏng do hết hạn giúp doanh nghiệp tiết kiệm trực tiếp khoảng 36,000,000 VNĐ/tháng.
  • Thời gian hoàn vốn (Payback Period): $$\text{ROI Time} = \frac{\text{Tổng chi phí đầu tư}}{\text{Mức tiết kiệm ròng hàng tháng}} = \frac{18,000,000}{36,000,000 - 2,000,000 \text{ (bảo trì)}} \approx 0.53 \text{ tháng } (\approx 16 \text{ ngày})$$

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

Hạn chế kỹ thuật

  • Thuật toán dự báo Simple Moving Average hoạt động tốt với nhu cầu ổn định nhưng chưa phản ánh được sự biến động mạnh mang tính mùa vụ (ví dụ: các dịp lễ, kỳ nghỉ hè của học sinh).
  • Hệ thống hiện phụ thuộc vào kết nối mạng nội bộ LAN/Wi-Fi tại xưởng sản xuất, chưa có chế độ Offline hoàn toàn (Offline-First PWA).

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

  • Ứng dụng các mô hình học máy (Machine Learning) như ARIMA hoặc LSTM để nâng cao độ chính xác trong bài toán dự báo nhu cầu tiêu thụ.
  • Tích hợp công nghệ nhận dạng qua tần số vô tuyến (RFID) và cảm biến môi trường IoT (nhiệt độ, độ ẩm) để tự động giám sát điều kiện bảo quản thực phẩm trong kho lạnh.
  • Xây dựng ứng dụng di động độc lập bằng React Native hoặc Flutter hỗ trợ quét mã qua camera điện thoại có tích hợp xử lý ảnh AI.

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

  • Sinh viên ngành CNTT / Kỹ thuật phần mềm: Đồ án cung cấp tài liệu tham khảo chi tiết về quy trình phân tích thiết kế hệ thống thông tin hoàn chỉnh, từ mô hình Usecase, sơ đồ thực thể ERD đến mã nguồn mẫu áp dụng Clean Code và Design Patterns.
  • Lập trình viên (Developers): Cung cấp giải pháp mẫu trong việc phối hợp kiến trúc ReactJS - Node.js - MySQL và xử lý bài toán xung đột dữ liệu (Concurrency Control) trong các hệ thống giao dịch thời gian thực.
  • Doanh nghiệp vừa và nhỏ (SMEs F&B): Mô hình ứng dụng có thể được chuyển giao và triển khai thực tế ngay lập tức với chi phí đầu tư tối thiểu, đem lại giá trị kinh tế trực tiếp và chuẩn hóa quy trình chuyển đổi số.
  • Nhà nghiên cứu ứng dụng: Cung cấp số liệu thực nghiệm về việc kết hợp giữa giải thuật quản trị chuỗi cung ứng (FEFO/SMA) với công nghệ Web hiện đại.

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

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

Máy chủ (Server) chỉ cần cấu hình tối thiểu: CPU Dual-Core 2.0 GHz, 4GB RAM, 50GB dung lượng ổ cứng SSD, chạy hệ điều hành Ubuntu Server 20.04 LTS hoặc Windows Server. Máy trạm của nhân viên chỉ cần thiết bị có trình duyệt web tiêu chuẩn (Chrome, Edge, Firefox) và 1 cổng USB kết nối máy quét mã vạch.

2. Hệ thống xử lý thế nào khi xảy ra xung đột dữ liệu xuất nhập cùng lúc?

Hệ thống sử dụng cơ chế Pessimistic Locking với câu lệnh SELECT ... FOR UPDATE kết hợp với Database Transactions của MySQL (InnoDB). Khi một giao dịch đang thực thi trừ số lượng lô hàng, các giao dịch khác yêu cầu trên cùng lô hàng đó sẽ phải chờ ở hàng đợi (Queue), loại bỏ hoàn toàn tình trạng âm kho (Negative Stock).

3. Hệ thống có khả năng tích hợp với các phần mềm kế toán hiện hữu không?

Hệ thống được thiết kế theo chuẩn RESTful API và có module Export dữ liệu dạng JSON/Excel/CSV, cho phép lập trình viên dễ dàng viết các Endpoint trung gian (Webhooks/Middleware) để kết nối và đồng bộ dữ liệu hai chiều với các phần mềm kế toán phổ biến như MISA, FAST hay Bravo.

4. Chi phí bảo trì và nâng cấp định kỳ ước tính là bao nhiêu?

Nhờ sử dụng toàn bộ ngăn xếp công nghệ mã nguồn mở (NodeJS, ReactJS, MySQL Community) không phải trả phí bản quyền hàng năm (Licensing Fee), chi phí bảo dưỡng hệ thống định kỳ chỉ bao gồm tiền điện năng tiêu thụ và chi phí lưu trữ/sao lưu dữ liệu đám mây (Cloud Backup), ước tính dưới 500,000 VNĐ/tháng.

5. Biện pháp xử lý sự cố khi mất kết nối máy quét mã vạch trong ca trực?

Giao diện của hệ thống được tích hợp thanh tìm kiếm thông minh (Smart Search Input) với cơ chế gợi ý tự động (Autocomplete). Nhân viên kho có thể nhập 3 ký tự đầu của tên sản phẩm hoặc mã SKU thủ công từ bàn phím để tiếp tục thao tác mà không làm gián đoạn dây chuyền xuất nhập.


Kết luận

Khóa luận tốt nghiệp "Xây dựng hệ thống quản lý kho tại Công ty TNHH TMTP Hoàng Ngọc" đã giải quyết triệt để bài toán quản lý kho hàng thực phẩm tươi có hạn sử dụng ngắn. Bằng việc kết hợp hài hòa giữa công nghệ Web tiên tiến (ReactJS, Node.js, Socket.io, MySQL) và các nguyên lý logistics kinh điển (FEFO, Moving Average), hệ thống không chỉ giải phóng sức lao động thủ công mà còn mang lại lợi ích kinh tế trực tiếp cho doanh nghiệp thông qua việc triệt tiêu thất thoát hàng hóa. Đây là minh chứng rõ nét cho giá trị của việc ứng dụng công nghệ thông tin vào giải quyết các bài toán thực tiễn trong kỷ nguyên chuyển đổi số doanh nghiệp.