Giới thiệu dự án

Trong ngành công nghiệp thực phẩm và bánh ngọt (F&B - Food and Beverage), việc kiểm soát tồn kho và theo dõi chuỗi cung ứng nguyên vật liệu đóng vai trò sống còn đối với biên lợi nhuận của doanh nghiệp. Theo các khảo sát thị trường từ Tổng cục Thống kê và Hiệp hội Bán lẻ, việc thất thoát và lãng phí nguyên vật liệu do quản lý thủ công hoặc sử dụng phần mềm rời rạc chiếm từ 12% đến 18% tổng chi phí vận hành của các chuỗi bánh tươi. Chuỗi cửa hàng bánh ABC Bakery với quy mô phân phối rộng khắp toàn quốc đối mặt với bài toán phức tạp: quản lý đồng thời hai dòng sản phẩm có vòng đời khác biệt hoàn toàn—nguyên vật liệu sản xuất thô (bột, bơ, men có hạn dùng ngắn) và thành phẩm bánh tươi (yêu cầu xuất hủy hoặc bán trong ngày).

[Vấn đề cốt lõi]
├── Thất thoát nguyên vật liệu (12-18% chi phí do quản lý thủ công)
├── Xung đột dòng dữ liệu: Nguyên liệu thô vs. Thành phẩm bánh tươi
├── Thiếu cơ chế theo dõi đa dạng hóa đơn (Xuất hủy, Xuất trả, Nhập nội bộ)
└── Rủi ro bảo mật & phân quyền dữ liệu tài chính/kho

Vấn đề thực tiễn (Problem Statement)

Hệ thống quản lý vận hành hiện tại bộc lộ nhiều điểm nghẽn nghiêm trọng (pain points):

  • Sai lệch dữ liệu tồn kho thời gian thực: Không có sự liên kết chặt chẽ giữa xuất kho nguyên liệu cho sản xuất và nhập kho thành phẩm bánh, dẫn đến hiện tượng chênh lệch số liệu tồn thực tế và số liệu sổ sách.
  • Phân loại chứng từ nhập/xuất chưa chuyên biệt: Thiếu cơ chế ghi nhận chi tiết cho các nghiệp vụ đặc thù ngành bánh như: xuất hủy do hỏng hóc, xuất trả nhà cung cấp, xuất luân chuyển nội bộ giữa các chi nhánh, và xuất phục vụ xưởng sản xuất.
  • Rủi ro kiểm soát phân quyền (Access Control): Việc không có cơ chế phân quyền dựa trên vai trò (Role-Based Access Control - RBAC) chi tiết khiến nhân viên thu ngân hoặc thủ kho có thể vô tình hoặc cố ý can thiệp vào các báo cáo doanh thu và chi phí nhạy cảm.

Mục tiêu dự án

  1. Xây dựng kiến trúc phần mềm chuyên biệt: Thiết kế và hiện thực hóa ứng dụng quản lý kho chuyên sâu bằng ngôn ngữ C# (.NET Framework / .NET Core) kết hợp hệ quản trị cơ sở dữ liệu Microsoft SQL Server 2022.
  2. Số hóa 100% quy trình xuất/nhập đa kênh: Tự động hóa 8 luồng nghiệp vụ hóa đơn: Xuất hủy nguyên liệu/bánh, Xuất trả, Xuất luân chuyển nội bộ, Xuất phục vụ sản xuất, Nhập mua ngoài và Nhập nội bộ.
  3. Hiện thực hóa mô hình RBAC theo thời gian: Cung cấp mô-đun phân quyền chi tiết (Thêm, Sửa, Xóa, Xem chi tiết) gắn liền với khoảng thời gian áp dụng (NgayApDung - NgayKetThuc).
  4. Tối ưu hóa hiệu năng báo cáo & in ấn: Đảm bảo khả năng kết xuất dữ liệu phiếu thu/chi, báo cáo doanh thu và in hóa đơn tùy biến (cho phép ẩn/hiện danh mục theo nhu cầu) với độ trễ dưới 1.5 giây.

Giải pháp kỹ thuật và Phạm vi

Hệ thống được phát triển dưới dạng ứng dụng Desktop (WinForms Application) theo mô hình kiến trúc phân tầng (3-Tier Architecture), đảm bảo khả năng hoạt động ổn định trên hạ tầng mạng nội bộ (LAN) của các chi nhánh cửa hàng kết hợp đồng bộ cơ sở dữ liệu tập trung.

Phạm vi áp dụng:

  • Mô-đun chức năng: Quản lý danh mục Khách hàng, Danh mục Bánh, Danh mục Nguyên liệu, Hệ thống Hóa đơn Nhập/Xuất đa dạng, Quản lý Nhân viên & Phân quyền, Báo cáo Doanh thu & Phiếu Thu/Chi.
  • Giới hạn hệ thống: Phần mềm tập trung tối ưu cho môi trường máy trạm Windows tại quầy thu ngân và phòng quản lý kho; các tính năng thanh toán qua cổng trực tuyến bên thứ ba (VNPay/Momo) và tích hợp chuỗi cung ứng tự động qua ERP nằm ngoài phạm vi của phiên bản này.

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

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

Để định hình rõ năng lực cạnh tranh và giải quyết trúng điểm nghẽn của ABC Bakery, nhóm tiến hành phân tích ma trận so sánh giữa các giải pháp hiện hành:

Tiêu chí kỹ thuật Quản lý sổ sách / Excel POS thương mại (KiotViet / Sapo) Phần mềm quản lý kho ABC Bakery
Độ trễ cập nhật tồn kho Thủ công (Trễ 24h - 48h) Thời gian thực (Cần Internet liên tục) Tức thời trên LAN/WAN (Hỗ trợ offline cache)
Nghiệp vụ xuất sản xuất bánh Không hỗ trợ Rất cơ bản (Cần mua gói sản xuất riêng) Chuyên sâu: Định mức xuất phục vụ sản xuất & xuất hủy
Phân quyền người dùng Không có (File chia sẻ chung) Phân quyền tĩnh theo nhóm mặc định Phân quyền động theo thời hạn (NgayApDung - NgayKetThuc)
Tùy biến in ấn báo cáo Thủ công chỉnh sửa ô Mẫu cố định, khó ẩn dòng động Tích hợp cờ trạng thái Ẩn/Hiện sản phẩm khi in
Chi phí triển khai Thấp (Rủi ro mất dữ liệu cao) Thu phí thuê bao định kỳ hàng tháng Chi phí đầu tư một lần, tối ưu TCO

Ma trận yêu cầu người dùng theo phương pháp MoSCoW:

  • Must Have (Bắt buộc có): Đăng nhập xác thực; CRUD khách hàng, bánh, nguyên liệu; Lập hóa đơn nhập/xuất theo 8 loại nghiệp vụ; Khấu trừ tự động kho; Phân quyền Admin - Kế toán - Nhân viên; Lập phiếu thu/chi.
  • Should Have (Nên có): Tính năng ẩn/hiện dòng sản phẩm khi in phiếu; Lọc dữ liệu đa tiêu chí (mã, tên, loại); Thống kê doanh thu theo ngày/tháng/quý/năm.
  • Could Have (Có thể có): Gợi ý nhập nguyên liệu khi tồn kho chạm ngưỡng an toàn; Xuất báo cáo ra định dạng Excel/PDF.
  • Won't Have (Chưa phát triển trong phiên bản này): Đồng bộ hóa đơn điện tử trực tiếp với Tổng cục Thuế; Ứng dụng di động quản trị từ xa.

Thiết kế hệ thống

1. Kiến trúc phân tầng (3-Tier Architecture)

[Presentation Layer] -> Windows Forms (UI Controls, Custom GridView, Infragistics)
        │ (Data Transfer Objects / ViewModels)
[Business Logic Layer (BLL)] -> Validation, Inventory Rules, RBAC Interceptor, Tax/Cost Calculator
        │ (Entity Mapping / Transactions)
[Data Access Layer (DAL)] -> ADO.NET Connection Pool, SQL Parameterized Queries, Stored Procedures
        │ (TCP/IP Port 1433)
[Database Layer] -> Microsoft SQL Server 2022 (Tables, Indexes, Triggers, Views)

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

Hệ thống chuẩn hóa dữ liệu đạt dạng chuẩn 3NF (Third Normal Form) nhằm loại bỏ dư thừa dữ liệu và đảm bảo tính toàn vẹn tham chiếu (Referential Integrity):

-- Bảng Phân quyền tài khoản theo thời gian hiệu lực
CREATE TABLE TaiKhoan (
    TenTaiKhoan VARCHAR(50) PRIMARY KEY,
    MatKhauHash VARCHAR(256) NOT NULL,
    MaNhanVien VARCHAR(10) NOT NULL,
    TrangThai BIT DEFAULT 1
);

CREATE TABLE PhanQuyen (
    MaPhanQuyen INT IDENTITY(1,1) PRIMARY KEY,
    TenTaiKhoan VARCHAR(50) FOREIGN KEY REFERENCES TaiKhoan(TenTaiKhoan),
    QuyenThem BIT DEFAULT 0,
    QuyenSua BIT DEFAULT 0,
    QuyenXoa BIT DEFAULT 0,
    QuyenXemChiTiet BIT DEFAULT 1,
    NgayApDung DATETIME NOT NULL,
    NgayKetThuc DATETIME NOT NULL
);

-- Bảng Nguyên liệu & Thành phẩm Bánh
CREATE TABLE NguyenLieu (
    MaNguyenLieu VARCHAR(20) PRIMARY KEY,
    TenNguyenLieu NVARCHAR(100) NOT NULL,
    LoaiNguyenLieu NVARCHAR(50) NOT NULL,
    DonViTinh NVARCHAR(20) NOT NULL,
    GiaTien DECIMAL(18,2) NOT NULL,
    SoLuongTon FLOAT NOT NULL CHECK (SoLuongTon >= 0),
    TrangThaiAnHien BIT DEFAULT 1
);

CREATE TABLE Banh (
    MaBanh VARCHAR(20) PRIMARY KEY,
    TenBanh NVARCHAR(100) NOT NULL,
    LoaiBanh NVARCHAR(50) NOT NULL,
    DonViTinh NVARCHAR(20) NOT NULL,
    GiaBan DECIMAL(18,2) NOT NULL,
    SoLuongTon INT NOT NULL CHECK (SoLuongTon >= 0),
    TrangThaiAnHien BIT DEFAULT 1
);

-- Bảng Quản lý Giao dịch Xuất Nhập Tổng hợp
CREATE TABLE HoaDon (
    MaHoaDon VARCHAR(30) PRIMARY KEY,
    LoaiGiaoDich VARCHAR(10) NOT NULL, -- 'NHAP' hoặc 'XUAT'
    PhanLoaiNghiepVu NVARCHAR(50) NOT NULL, -- 'XuatHuy', 'XuatTra', 'XuatSanXuat', 'NhapNoiBo', etc.
    LoaiDoiTuong VARCHAR(20) NOT NULL, -- 'BANH' hoặc 'NGUYENLIEU'
    NgayLap DATETIME DEFAULT GETDATE(),
    MaNhanVien VARCHAR(10) NOT NULL,
    MaKhachHang VARCHAR(20) NULL,
    TongTien DECIMAL(18,2) NOT NULL,
    GhiChu NVARCHAR(255) NULL
);

3. Thiết kế Bảo mật & Hiệu năng

  • Bảo mật cơ sở dữ liệu: Toàn bộ mật khẩu lưu trữ trong bảng TaiKhoan đều được băm bằng thuật toán mật mã SHA-256 kết hợp Salt. Mọi thao tác truy vấn đều sử dụng SqlParameter để ngăn chặn hoàn toàn tấn công SQL Injection.
  • Tính toàn vẹn giao dịch (ACID): Áp dụng cấp độ cô lập giao dịch IsolationLevel.ReadCommitted kết hợp SqlTransaction để giải quyết triệt để xung đột dữ liệu (Concurrency Control) khi nhiều máy trạm cùng xuất kho một mặt hàng.

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, chia nhỏ vòng đời dự án thành 5 mốc lớn với tổng thời gian thực thi 12 tuần:

[Tuần 1-2: SRS & UML] ──> [Tuần 3-4: DB & UI Design] ──> [Tuần 5-8: Core Development] ──> [Tuần 9-10: Testing & Fixes] ──> [Tuần 11-12: UAT & Handover]

Bảng ma trận rủi ro và phương án ứng phó:

Rủi ro kỹ thuật Mức độ Khả năng Chiến lược giảm thiểu (Mitigation Strategy)
Xung đột ghi đè dữ liệu tồn kho Cao Cao Bọc các thao tác trừ kho trong SqlTransaction có khóa mức dòng (ROWLOCK).
Mất kết nối LAN đột ngột Trung bình Trung bình Tích hợp cơ chế Retry Pattern trong Data Access Layer và thông báo lỗi rõ ràng.
Nhân viên thao tác sai quyền Cao Thấp Xây dựng Middleware kiểm tra phân quyền tại BLL trước khi nạp giao diện Form.

Implementation và kết quả

Development process

Quá trình phát triển tập trung vào việc hiện thực hóa các thuật toán xử lý hóa đơn phức tạp, đảm bảo tính toàn vẹn dữ liệu kho và kiểm soát chặt chẽ quyền truy cập người dùng.

1. Thuật toán kiểm soát xuất kho nguyên liệu & Cập nhật tồn kho tự động

Đoạn mã C# dưới đây minh họa việc thực thi Transaction xử lý xuất hủy nguyên liệu với cơ chế kiểm tra tồn kho và ghi nhật ký hóa đơn đồng thời:

using System;
using System.Data;
using System.Data.SqlClient;

namespace ABCBakery.BLL
{
    public class InventoryService
    {
        private readonly string _connectionString = "Server=.;Database=ABCBakeryDB;Trusted_Connection=True;";

        public bool ProcessMaterialExport(string invoiceId, string materialId, double exportQuantity, string employeeId, string reason)
        {
            using (SqlConnection conn = new SqlConnection(_connectionString))
            {
                conn.Open();
                SqlTransaction transaction = conn.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    // 1. Kiểm tra số lượng tồn kho với khóa cập nhật (UPDLOCK)
                    string checkStockQuery = @"SELECT SoLuongTon, GiaTien FROM NguyenLieu WITH (UPDLOCK) 
                                               WHERE MaNguyenLieu = @MaNL";
                    
                    double currentStock = 0;
                    decimal unitPrice = 0;

                    using (SqlCommand cmdCheck = new SqlCommand(checkStockQuery, conn, transaction))
                    {
                        cmdCheck.Parameters.Add("@MaNL", SqlDbType.VarChar).Value = materialId;
                        using (SqlDataReader reader = cmdCheck.ExecuteReader())
                        {
                            if (!reader.Read())
                                throw new Exception("Mã nguyên liệu không tồn tại trong hệ thống.");

                            currentStock = Convert.ToDouble(reader["SoLuongTon"]);
                            unitPrice = Convert.ToDecimal(reader["GiaTien"]);
                        }
                    }

                    if (currentStock < exportQuantity)
                    {
                        throw new InvalidOperationException($"Số lượng tồn kho không đủ. Tồn: {currentStock}, Cần xuất: {exportQuantity}");
                    }

                    // 2. Khấu trừ số lượng tồn kho
                    string updateStockQuery = @"UPDATE NguyenLieu SET SoLuongTon = SoLuongTon - @ExportQty 
                                                WHERE MaNguyenLieu = @MaNL";
                    using (SqlCommand cmdUpdate = new SqlCommand(updateStockQuery, conn, transaction))
                    {
                        cmdUpdate.Parameters.Add("@ExportQty", SqlDbType.Float).Value = exportQuantity;
                        cmdUpdate.Parameters.Add("@MaNL", SqlDbType.VarChar).Value = materialId;
                        cmdUpdate.ExecuteNonQuery();
                    }

                    // 3. Tạo bản ghi hóa đơn xuất kho
                    string insertInvoiceQuery = @"INSERT INTO HoaDon (MaHoaDon, LoaiGiaoDich, PhanLoaiNghiepVu, LoaiDoiTuong, NgayLap, MaNhanVien, TongTien, GhiChu) 
                                                  VALUES (@MaHD, 'XUAT', 'XuatHuy', 'NGUYENLIEU', GETDATE(), @MaNV, @TongTien, @GhiChu)";
                    using (SqlCommand cmdInvoice = new SqlCommand(insertInvoiceQuery, conn, transaction))
                    {
                        cmdInvoice.Parameters.Add("@MaHD", SqlDbType.VarChar).Value = invoiceId;
                        cmdInvoice.Parameters.Add("@MaNV", SqlDbType.VarChar).Value = employeeId;
                        cmdInvoice.Parameters.Add("@TongTien", SqlDbType.Decimal).Value = (decimal)exportQuantity * unitPrice;
                        cmdInvoice.Parameters.Add("@GhiChu", SqlDbType.NVarChar).Value = reason;
                        cmdInvoice.ExecuteNonQuery();
                    }

                    // Commit giao dịch khi tất cả bước thành công
                    transaction.Commit();
                    return true;
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    // Log lỗi ngoại lệ vào hệ thống giám sát
                    throw new ApplicationException("Lỗi giao dịch kho: " + ex.Message, ex);
                }
            }
        }
    }
}

2. Thuật toán kiểm tra quyền người dùng động theo thời gian hiệu lực

Hệ thống áp dụng logic kiểm tra quyền dựa trên thời hạn hiệu lực của bản ghi phân quyền trước khi cho phép người dùng kích hoạt các hành động CUD (Create/Update/Delete):

public bool CheckUserPermission(string username, string actionType)
{
    string query = @"SELECT QuyenThem, QuyenSua, QuyenXoa, QuyenXemChiTiet 
                     FROM PhanQuyen 
                     WHERE TenTaiKhoan = @User 
                       AND GETDATE() BETWEEN NgayApDung AND NgayKetThuc";

    using (SqlConnection conn = new SqlConnection(_connectionString))
    using (SqlCommand cmd = new SqlCommand(query, conn))
    {
        cmd.Parameters.AddWithValue("@User", username);
        conn.Open();
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            if (reader.Read())
            {
                switch (actionType.ToUpper())
                {
                    case "CREATE": return Convert.ToBoolean(reader["QuyenThem"]);
                    case "UPDATE": return Convert.ToBoolean(reader["QuyenSua"]);
                    case "DELETE": return Convert.ToBoolean(reader["QuyenXoa"]);
                    case "VIEW":   return Convert.ToBoolean(reader["QuyenXemChiTiet"]);
                    default: return false;
                }
            }
        }
    }
    return false; // Hết hạn quyền hoặc không tìm thấy cấu hình
}

Testing và validation

Nhóm áp dụng các phương pháp kiểm thử hộp đen (Black-box Testing) như Phân vùng tương đương (Equivalence Partitioning)Phân tích giá trị biên (Boundary Value Analysis) kết hợp kiểm thử tự động tầng BLL bằng NUnit.

Bảng tổng hợp kịch bản kiểm thử và số liệu thực thi:

Mã kịch bản Mô-đun kiểm thử Dữ liệu đầu vào (Test Input) Kết quả kỳ vọng Kết quả thực tế Tình trạng
TC_INV_01 Xuất kho nguyên liệu Số lượng xuất: 50.0 kg, Tồn kho: 30.0 kg Hệ thống báo lỗi "Số lượng tồn không đủ", Rollback Transaction Báo lỗi chính xác, tồn kho giữ nguyên 30.0 kg Passed
TC_INV_02 Xuất kho nguyên liệu biên Số lượng xuất: 30.0 kg, Tồn kho: 30.0 kg Trừ tồn kho về 0.0 kg, tạo hóa đơn thành công Tồn kho = 0.0, sinh mã HĐ tự động Passed
TC_AUTH_01 Phân quyền quá hạn User: ketoan01, Ngày hiện tại > NgayKetThuc Vô hiệu hóa các nút Thêm/Sửa/Xóa Giao diện tự động khóa các nút chức năng Passed
TC_RPT_01 In phiếu có lọc ẩn Chọn ẩn 2 loại bánh có cờ TrangThaiAnHien = 0 Bản in bỏ qua 2 sản phẩm này, tổng tiền tính lại đúng Bản in hiển thị đúng danh sách được chọn Passed

Số liệu kiểm chuẩn hiệu năng (Performance Benchmarks):

  • Code Coverage (Độ bao phủ mã nguồn): Đạt 86.4% đối với các lớp xử lý nghiệp vụ (BLL).
  • Thời gian phản hồi truy vấn tìm kiếm: Trung bình 38ms trên tập dữ liệu 50,000 bản ghi sản phẩm.
  • Tốc độ kết xuất báo cáo doanh thu quý: Đạt 1.12 giây cho tập dữ liệu 120,000 giao dịch.
  • Thống kê lỗi (Defect Tracking): Tổng cộng phát hiện 42 bugs trong các giai đoạn Sprint; 100% lỗi nghiêm trọng (Critical/High) đã được khắc phục trước giai đoạn bàn giao nghiệm thu.

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

Hệ thống đã được nghiệm thu thực tế với sự tham gia của Product Owner và đại diện quản lý cửa hàng ABC Bakery:

  • 100% tính năng cam kết trong tài liệu SRS được hoàn thành đầy đủ và chính xác.
  • Độ chính xác dữ liệu tồn kho: Đạt 99.9%, loại bỏ hoàn toàn tình trạng thất thoát số liệu do ghi chép thiếu đồng bộ.
  • Điểm đánh giá mức độ hài lòng người dùng (UAT CSAT): Đạt 4.8 / 5.0, trong đó tiêu chí dễ sử dụng và tốc độ xử lý thanh toán nhận được đánh giá cao nhất.

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

  1. Chuẩn hóa nghiệp vụ xuất/nhập đa chiều chuyên biệt cho F&B: Khác biệt với các hệ thống POS thông thường chỉ có chức năng Bán lẻ và Nhập hàng, hệ thống ABC Bakery thiết kế riêng biệt 8 nhánh nghiệp vụ hóa đơn, đặc biệt là cơ chế Xuất phục vụ sản xuất (trừ nguyên liệu, tạo tiền đề tính giá thành bánh) và Xuất hủy/Xuất trả, giúp ban quản lý kiểm soát chính xác tỷ lệ hao hụt nguyên liệu.
  2. Cơ chế Ẩn/Hiện dữ liệu in ấn linh hoạt: Giải quyết nhu cầu thực tế của cửa hàng khi cần xuất các biên bản nội bộ hoặc phiếu bán hàng cho các nhóm khách hàng đặc biệt mà không làm sai lệch tính toàn vẹn của cơ sở dữ liệu gốc.
  3. Mô hình Phân quyền động gắn thời gian thực (Time-bound RBAC): Cho phép người quản trị cấp quyền tạm thời cho nhân viên thời vụ hoặc kế toán thử việc với thuộc tính NgayKetThuc tự động vô hiệu hóa quyền hạn mà không cần can thiệp thủ công.
  4. Hiệu quả định lượng vượt trội:
    • Cắt giảm 65% thời gian kiểm kê kho định kỳ cuối ngày (từ 2 giờ xuống còn 40 phút).
    • Giảm thiểu 22% lượng nguyên liệu quá hạn nhờ cơ chế theo dõi sát sao số lượng tồn thời gian thực.
    • Tăng tốc độ in ấn hóa đơn và chứng từ thanh toán lên 45%.

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

Kịch bản vận hành thực tế

Hệ thống vận hành trơn tru trong kịch bản hàng ngày tại cửa hàng ABC Bakery:

  • Buổi sáng (06:00): Quản lý kho thực hiện Hóa đơn xuất nguyên liệu phục vụ sản xuất cho xưởng bánh; hệ thống lập tức trừ kho bột, bơ, sữa. Đến 07:30, xưởng bánh bàn giao, quản trị viên lập Hóa đơn nhập bánh nội bộ để sẵn sàng mở bán.
  • Trong ngày: Nhân viên thu ngân thực hiện bán hàng và in phiếu bán hàng; kế toán theo dõi biểu đồ doanh thu và lập các Phiếu Thu/Chi phát sinh ngoài luồng.
  • Cuối ngày (22:00): Thủ kho kiểm tra bánh tồn thừa, lập Hóa đơn xuất hủy bánh hoặc Xuất trả bánh về xưởng; hệ thống tự động tổng hợp báo cáo lãi/lỗ trong ngày.
[06:00 - Xuất NL Sản Xuất] ──> [07:30 - Nhập Bánh Thành Phẩm] ──> [08:00-21:30 - Bán Hàng & In Phiếu] ──> [22:00 - Xuất Hủy/Trả & Chốt Sổ]

Yêu cầu triển khai hệ thống (Deployment Prerequisites)

  • Môi trường Server: Windows Server 2019/2022 hoặc Windows 10/11 Pro (dành cho máy chủ đặt tại chi nhánh); RAM tối thiểu 8GB; Ổ cứng SSD còn trống tối thiểu 20GB; Cài đặt Microsoft SQL Server 2019/2022.
  • Môi trường Client (Máy trạm): Windows 7 SP1 / Windows 10 / Windows 11; RAM 4GB; Màn hình độ phân giải tối thiểu 1366x768; Cài đặt .NET Framework 4.8 runtime.
  • Thiết bị ngoại vi: Kết nối máy in hóa đơn nhiệt (khổ 80mm hoặc A5) qua cổng USB/LAN.

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

  • Chi phí đầu tư ban đầu: Khoảng 15 - 20 triệu VNĐ (Hạ tầng phần cứng và chi phí triển khai hệ thống 1 lần).
  • Chi phí tiết kiệm hàng tháng: Giảm hao hụt nguyên vật liệu ước tính 4.5 triệu VNĐ/tháng; Tiết kiệm 3.0 triệu VNĐ/tháng chi phí nhân sự kiểm kê và giấy tờ hành chính.
  • Thời gian hoàn vốn (Payback Period): Ước tính trong vòng 2.6 đến 3.2 tháng sau khi đưa vào vận hành chính thức.

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

Hạn chế hiện tại

  • Phụ thuộc nền tảng Desktop: Ứng dụng WinForms yêu cầu cài đặt trực tiếp trên hệ điều hành Windows, chưa hỗ trợ truy cập giám sát nhanh trên các thiết bị di động (iOS/Android) của chủ chuỗi cửa hàng.
  • Đồng bộ đa điểm (Multi-branch Sync): Hiện tại hệ thống đang tối ưu tốt nhất trên mô hình cơ sở dữ liệu tập trung qua IP tĩnh hoặc mạng nội bộ chi nhánh; cơ chế đồng bộ phân tán đa vùng (Offline-first Replication) chưa được tích hợp.

Lộ trình nâng cấp và mở rộng

  1. Kiến trúc Cloud & Web API: Chuyển đổi tầng BLL thành các dịch vụ ASP.NET Core Web API, cho phép triển khai ứng dụng quản trị Web-based (React/Angular) và Mobile App (Flutter).
  2. Tích hợp thuật toán dự báo nguyên liệu (AI/ML): Ứng dụng mô hình dự báo chuỗi thời gian (Time-series Forecasting như ARIMA hoặc LSTM) dựa trên lịch sử bán hàng để tự động đề xuất số lượng nguyên liệu cần nhập theo mùa vụ và thời tiết.
  3. Mã vạch & QR Code tự động: Tích hợp máy quét mã vạch 2D và máy in nhãn tự động để quét mã lô nguyên vật liệu khi nhập/xuất kho, nâng cao độ chính xác lên mức tuyệt đối.

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

  • Sinh viên & Học viên chuyên ngành CNTT/KTPM: Là tài liệu tham khảo thực chiến toàn diện về việc xây dựng tài liệu đặc tả SRS, thiết kế Use Case, chuẩn hóa CSDL quan hệ 3NF và tổ chức kiến trúc phần mềm 3-Tier chuẩn mực.
  • Kỹ sư phần mềm (Developers): Cung cấp các mẫu thiết kế (Design Patterns) thực tế trong việc xử lý Transaction phân tán, kiểm soát truy cập RBAC động và kỹ thuật Data Binding tùy biến trên Windows Forms.
  • Chủ doanh nghiệp & Quản lý chuỗi F&B: Mô hình hóa rõ nét bài toán dòng chảy nguyên vật liệu ngành bánh, mang lại giải pháp quản trị tồn kho và doanh thu thực tiễn, tối ưu chi phí vận hành.
  • Nhà nghiên cứu ứng dụng: Cung cấp dữ liệu thực nghiệm về việc chuyển đổi quy trình bán lẻ truyền thống sang hệ thống số hóa có đo lường và kiểm chứng định lượng.

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

1. Phần mềm có yêu cầu kết nối Internet liên tục để bán hàng không?

Không bắt buộc. Trong mô hình triển khai máy chủ SQL Server đặt tại mạng nội bộ (LAN) của cửa hàng, mọi tác vụ nhập/xuất, in phiếu và thống kê đều diễn ra bình thường với tốc độ tối đa ngay cả khi mất kết nối Internet ra bên ngoài.

2. Làm thế nào để xử lý khi hai nhân viên cùng xuất một mặt hàng tại cùng một thời điểm?

Hệ thống sử dụng cơ chế khóa mức dòng (WITH (UPDLOCK)) và giao dịch bọc kín SqlTransaction với cấp độ cô lập ReadCommitted. Giao dịch của nhân viên thứ hai sẽ chờ giao dịch thứ nhất hoàn tất để đọc lại số lượng tồn kho mới nhất, ngăn chặn tuyệt đối tình trạng tồn kho bị âm.

3. Tính năng ẩn/hiện sản phẩm khi in phiếu có làm mất dữ liệu trong database không?

Không. Thuộc tính TrangThaiAnHien chỉ đóng vai trò là một cờ logic (flag) phục vụ việc lọc dữ liệu trên giao diện in ấn (Data Filtering). Mọi dữ liệu gốc về giao dịch, lịch sử và giá trị hóa đơn trong hệ thống vẫn được lưu trữ nguyên vẹn để phục vụ báo cáo tài chính.

4. Chi phí bảo trì và nâng cấp hệ thống định kỳ như thế nào?

Nhờ kiến trúc phân tầng 3-Tier tách biệt hoàn toàn giữa giao diện, logic nghiệp vụ và truy xuất CSDL, việc nâng cấp tính năng mới hoặc sửa lỗi có thể thực hiện bằng cách cập nhật các file thư viện DLL tương ứng mà không làm ảnh hưởng đến cấu trúc dữ liệu đang chạy.

5. Dữ liệu bán hàng và kho được bảo vệ thế nào trước nguy cơ mất điện hoặc hỏng ổ cứng?

Hệ thống tích hợp quy trình tự động sao lưu dữ liệu (Auto-backup Database) định kỳ hàng ngày sang ổ đĩa thứ hai hoặc đồng bộ lên dịch vụ lưu trữ đám mây. Đồng thời tính chất nguyên tử (Atomicity) của SQL Transaction đảm bảo không xảy ra hiện tượng ghi đè dữ liệu dở dang khi mất nguồn đột ngột.


Kết luận

Đồ án "Thiết kế phần mềm quản lý kho cho cửa hàng ABC Bakery" của nhóm sinh viên Trường Đại học Tôn Đức Thắng là một công trình nghiên cứu ứng dụng có giá trị thực tiễn cao. Bằng việc kết hợp chặt chẽ giữa cơ sở lý thuyết công nghệ phần mềm hiện đại (quy trình SRS chuẩn mực, kiến trúc 3-Tier, chuẩn hóa dữ liệu 3NF) và nhu cầu nghiệp vụ đặc thù của chuỗi cửa hàng bánh tươi, hệ thống đã giải quyết triệt để bài toán thất thoát nguyên vật liệu và tối ưu hóa quy trình kiểm soát thu chi. Kết quả kiểm thử hiệu năng và nghiệm thu thực tế chứng minh giải pháp hoàn toàn đủ năng lực triển khai thực tế trên diện rộng, mở ra tiềm năng thương mại hóa và phát triển thành giải pháp quản trị chuỗi cung ứng toàn diện cho ngành F&B.