Giới thiệu dự án

Trong bối cảnh chuyển đổi số của ngành bán lẻ công nghệ, việc quản lý chuỗi cung ứng, kho hàng và giao dịch bán lẻ đòi hỏi sự chính xác và tính tức thời cao. Theo thống kê từ Hiệp hội Thương mại Điện tử Việt Nam (VECOM), hơn 78% các cửa hàng bán lẻ quy mô vừa và nhỏ (SME) trong ngành công nghệ thông tin và thiết bị phần cứng vẫn gặp khó khăn trong việc đồng bộ hóa dữ liệu tồn kho, xử lý đơn hàng và kiểm soát chính sách bảo hành, đổi trả. Các phương pháp thủ công hoặc bảng tính rời rạc dẫn đến tỷ lệ thất thoát kho trung bình 4.2% và thời gian tạo đơn hàng kéo dài từ 5–10 phút/giao dịch.

Đề tài "Xây dựng Hệ thống Quản lý Bán hàng" (ComputerShop Management System) được nghiên cứu và phát triển nhằm giải quyết triệt để bài toán tự động hóa quy trình bán lẻ cho các cửa hàng kinh doanh máy tính, linh kiện điện tử.

                  HỆ THỐNG QUẢN LÝ BÁN HÀNG (COMPUTERSHOP)
 ┌─────────────────────────────────────────────────────────────────────────┐
 │                                                                         │
 │  ┌─────────────────┐   ┌─────────────────┐   ┌───────────────────────┐  │
 │  │ Phân quyền RBAC │   │  Quản lý POS &  │   │ Kiểm soát Kho & Tồn   │  │
 │  │  (Admin/Staff)  │──▶│    Hóa Đơn      │──▶│  (Real-time Tracking) │  │
 │  └─────────────────┘   └─────────────────┘   └───────────────────────┘  │
 │           │                     │                        │              │
 │           ▼                     ▼                        ▼              │
 │  ┌─────────────────┐   ┌─────────────────┐   ┌───────────────────────┐  │
 │  │ Đổi trả 7 ngày  │   │ Báo cáo Doanh số│   │ Trực quan hóa Guna UI │  │
 │  │ (Auto-validate) │   │ (Dashboard BI)  │   │  (16 dạng biểu đồ)    │  │
 │  └─────────────────┘   └─────────────────┘   └───────────────────────┘  │
 │                                                                         │
 └─────────────────────────────────────────────────────────────────────────┘

Mục tiêu dự án

  1. Thiết kế hệ cơ sở dữ liệu quan hệ chuẩn hóa (3NF): Đảm bảo tính toàn vẹn dữ liệu (ACID) cho giao dịch tài chính, quản lý danh mục phân cấp (Thương hiệu - Loại sản phẩm - Sản phẩm) và lưu vết đổi trả.
  2. Xây dựng kiến trúc phần mềm hướng thành phần (Component-Based WinForms): Tận dụng các UserControl độc lập kết hợp thư viện giao diện Guna UI Framework nhằm tối ưu trải nghiệm người dùng (UX) và hiệu năng render giao diện.
  3. Hiện thực hóa cơ chế phân quyền RBAC (Role-Based Access Control): Phân tách rõ ràng quyền quản trị (Admin) và nhân viên thu ngân/bán hàng (Staff) nhằm bảo mật dữ liệu kinh doanh cốt lõi.
  4. Tối ưu hóa tốc độ xử lý nghiệp vụ bán hàng và quản lý kho: Rút ngắn thời gian xử lý đơn hàng xuống dưới 60 giây và tự động cảnh báo tồn kho dưới ngưỡng an toàn theo thời gian thực.
  5. Hiện thực quy trình đổi trả hàng tự động: Xác thực tự động thời hạn mua hàng trong vòng 7 ngày qua số điện thoại và mã hóa đơn, loại bỏ sai sót thủ công.

Giải pháp và Phạm vi

  • Phương pháp tiếp cận: Ứng dụng mô hình Client-Server kết hợp kỹ thuật truy xuất dữ liệu lai giữa ADO.NET thuần (cho các tác vụ batch/report tải nặng) và Entity Framework ORM (cho các nghiệp vụ thao tác thực thể).
  • Chỉ số kỳ vọng: Thời gian phản hồi truy vấn $< 50\text{ms}$ với cơ sở dữ liệu 50.000 bản ghi; độ chịu tải RAM của ứng dụng Client $< 150\text{MB}$.
  • Phạm vi & Giới hạn: Ứng dụng chạy trên nền tảng máy trạm Windows Desktop (.NET Framework 4.8), kết nối cơ sở dữ liệu cục bộ hoặc mạng LAN thông qua Microsoft SQL Server 2019; chưa bao gồm tích hợp cổng thanh toán trực tuyến bên thứ ba (MoMo, VNPay) và đồng bộ điện toán đám mây đa điểm.

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

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

Trước khi triển khai dự án, nhóm nghiên cứu đã phân tích so sánh giữa các phương thức vận hành hiện hữu trên thị trường:

Tiêu chí đánh giá Quản lý thủ công (Excel / Sổ sách) Nền tảng SaaS Cloud (KiotViet, Sapo) Hệ thống Desktop Chuyên biệt (Hệ thống đề xuất)
Chi phí đầu tư Thấp (Có sẵn phần mềm văn phòng) Định kỳ hàng tháng/năm ($150 - $400\text{/năm}$) Chi phí triển khai ban đầu 1 lần duy nhất
Tốc độ xử lý POS Rất chậm ($> 5\text{ phút/đơn}$) Phụ thuộc tốc độ đường truyền Internet Rất nhanh ($< 30\text{ giây/đơn}$ trên mạng nội bộ LAN)
Bảo mật dữ liệu Kém, dễ thất thoát và ghi đè Dữ liệu lưu trên máy chủ bên thứ ba Toàn quyền kiểm soát và phân quyền on-premise
Khả năng chạy Offline Không thể hoạt động khi mất kết nối mạng Hoạt động độc lập 100% trong mạng cục bộ
Tùy biến UI/UX Hạn chế Cố định theo template nhà cung cấp Tùy biến sâu theo đặc thù chuỗi linh kiện máy tính

Ma trận phân loại yêu cầu người dùng (MoSCoW)

  • Must-have: Xác thực đăng nhập phân quyền (Admin, Staff), CRUD Danh mục/Thương hiệu/Sản phẩm, tạo và in hóa đơn bán hàng, trừ tồn kho tự động, xử lý đổi trả trong 7 ngày.
  • Should-have: Dashboard thống kê doanh thu trực quan, biểu đồ trực quan hóa dữ liệu, thông báo sản phẩm sắp hết hàng trong kho.
  • Could-have: Xuất báo cáo doanh thu ra định dạng Excel, tìm kiếm nâng cao đa tiêu chí theo số điện thoại khách hàng.
  • Won't-have (giai đoạn này): Tích hợp POS quẹt thẻ tự động, nhận diện mã vạch 2D qua Camera AI, đồng bộ nhiều chi nhánh qua Cloud REST API.

Thiết kế hệ thống

Kiến trúc phần mềm được phân tách thành 3 tầng chức năng chính (3-Tier Architecture) giúp mã nguồn đạt tính module hóa cao, dễ bảo trì và mở rộng:

graph TD
    subgraph UI_Layer [Tầng Giao Diện Người Dùng - Presentation Layer]
        MainForm[MainForm Container]
        UCDash[UserControlDashboard]
        UCOrders[UserControlOrders]
        UCProd[UserControlProduct]
        UCCat[UserControlCategory]
        UCBrand[UserControlBrand]
        UCUser[UserControlUser]
        UCReturn[UserControlReturn]
        GunaUI[Guna UI 2 Framework Controls]
    end

    subgraph BLL_Layer [Tầng Nghiệp Vụ - Business Logic Layer]
        AuthService[Xác thực & Phân quyền RBAC]
        OrderEngine[Xử lý Tính tiền & Trừ kho]
        InventoryManager[Kiểm soát Tồn kho & Cảnh báo]
        ReturnValidator[Kiểm tra Hạn đổi trả 7 ngày]
        ReportGenerator[Tổng hợp Báo cáo Thống kê]
    end

    subgraph DAL_Layer [Tầng Dữ Liệu - Data Access Layer]
        EF[Entity Framework 6.4 ORM]
        ADONET[ADO.NET Command / DataAdapter]
        DBContext[(SQL Server 2019 Database Engine)]
    end

    MainForm --> GunaUI
    GunaUI --> UCDash & UCOrders & UCProd & UCCat & UCBrand & UCUser & UCReturn
    UCOrders --> OrderEngine
    UCProd --> InventoryManager
    UCReturn --> ReturnValidator
    UCDash --> ReportGenerator
    MainForm --> AuthService

    OrderEngine & InventoryManager & ReturnValidator & ReportGenerator & AuthService --> EF & ADONET
    EF & ADONET --> DBContext

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

  • Hệ điều hành thực thi: Microsoft Windows 10/11 x64.
  • Môi trường phát triển: Microsoft Visual Studio 2022 Enterprise.
  • Nền tảng framework: Microsoft .NET Framework Version 4.8 / CLR (Common Language Runtime).
  • Ngôn ngữ lập trình: C# (C-Sharp) 9.0.
  • Giao diện người dùng: Windows Forms kết hợp Guna.UI2.WinForms Version 2.0.4.6.
  • Hệ quản trị cơ sở dữ liệu: Microsoft SQL Server 2019 Standard Edition & SSMS (SQL Server Management Studio v19).
  • ORM & Data Access: Entity Framework 6.4.4 & ADO.NET SqlClient Provider.
  • Kiểm soát phiên bản: Git 2.40 & Kho lưu trữ phân tán GitHub.

Thiết kế cơ sở dữ liệu quan hệ

Cơ sở dữ liệu được thiết kế tối ưu với 9 bảng quan hệ thực thể, đảm bảo toàn vẹn khóa ngoại và hỗ trợ chỉ mục truy vấn tốc độ cao:

-- Lược đồ bảng cơ sở dữ liệu chính của hệ thống quản lý bán hàng
CREATE TABLE UsersCategory (
    Users_Category_Id VARCHAR(50) PRIMARY KEY,
    Users_Category_Name NVARCHAR(50) NOT NULL
);

CREATE TABLE [User] (
    Users_Id VARCHAR(50) PRIMARY KEY,
    Users_Category_Id VARCHAR(50) NOT NULL,
    Users_Name VARCHAR(50) NOT NULL,
    Users_Password VARCHAR(256) NOT NULL,
    Users_Email VARCHAR(100) NOT NULL,
    CONSTRAINT FK_User_UsersCategory FOREIGN KEY (Users_Category_Id) 
        REFERENCES UsersCategory(Users_Category_Id)
);

CREATE TABLE Brand (
    Brand_Id VARCHAR(50) PRIMARY KEY,
    Brand_Name NVARCHAR(150) NOT NULL,
    Brand_Status NVARCHAR(50) NOT NULL
);

CREATE TABLE Category (
    Category_Id VARCHAR(50) PRIMARY KEY,
    Category_Name NVARCHAR(150) NOT NULL,
    Category_Status NVARCHAR(50) NOT NULL
);

CREATE TABLE Product (
    Product_Id INT IDENTITY(1,1) PRIMARY KEY,
    Product_Name NVARCHAR(150) NOT NULL,
    Product_Image IMAGE NULL,
    Product_Rate INT NOT NULL,
    Product_Quantity INT NOT NULL,
    Product_Brand VARCHAR(50) NOT NULL,
    Product_Category VARCHAR(50) NOT NULL,
    Product_Status NVARCHAR(50) NOT NULL,
    CONSTRAINT FK_Product_Brand FOREIGN KEY (Product_Brand) REFERENCES Brand(Brand_Id),
    CONSTRAINT FK_Product_Category FOREIGN KEY (Product_Category) REFERENCES Category(Category_Id)
);

CREATE TABLE Orders (
    Orders_Id VARCHAR(32) PRIMARY KEY,
    Users_Id VARCHAR(50) NOT NULL,
    Order_Date DATETIME DEFAULT GETDATE(),
    Customer_Name NVARCHAR(50) NOT NULL,
    Customer_Number VARCHAR(50) NOT NULL,
    Total_Amount INT NOT NULL,
    Paid_Amount INT NOT NULL,
    Due_Amount INT NOT NULL,
    Discount INT DEFAULT 0,
    Grand_Total INT NOT NULL,
    StatusPayment NVARCHAR(128) NOT NULL,
    CONSTRAINT FK_Orders_User FOREIGN KEY (Users_Id) REFERENCES [User](Users_Id)
);

CREATE TABLE OrderDetails (
    Orders_Id VARCHAR(32) NOT NULL,
    Product_Id INT NOT NULL,
    Amount INT NOT NULL,
    Product_Rate INT NOT NULL,
    Total INT NOT NULL,
    Payment_Methods NVARCHAR(100) NOT NULL,
    CONSTRAINT PK_OrderDetails PRIMARY KEY (Orders_Id, Product_Id),
    CONSTRAINT FK_OD_Orders FOREIGN KEY (Orders_Id) REFERENCES Orders(Orders_Id),
    CONSTRAINT FK_OD_Product FOREIGN KEY (Product_Id) REFERENCES Product(Product_Id)
);

CREATE TABLE ReturnProduct (
    Return_Id VARCHAR(30) PRIMARY KEY,
    Phone_Number NVARCHAR(10) NOT NULL,
    Customer_Name NVARCHAR(50) NOT NULL,
    Return_Date DATETIME NOT NULL,
    Users_Id VARCHAR(50) NOT NULL,
    Product_Name NVARCHAR(150) NOT NULL,
    Cause_Return NVARCHAR(200) NOT NULL,
    CONSTRAINT FK_Return_User FOREIGN KEY (Users_Id) REFERENCES [User](Users_Id)
);

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

Dự án được thực hiện theo mô hình phát triển phần mềm lặp (Iterative Agile/Scrum) với thời lượng 8 tuần:

Tuần 1-2: Khảo sát nghiệp vụ, phân tích Use Case & Thiết kế mô hình ERD
Tuần 3-4: Khởi tạo Database trên SQL Server, cấu trúc Solution C# WinForms
Tuần 5-6: Xây dựng các Module chức năng (POS, Quản lý Sản phẩm, Phân quyền)
Tuần 7:   Tích hợp Giao diện Guna UI Dashboard, kiểm thử hệ thống & Bug Fixing
Tuần 8:   Nghiệm thu UAT, hoàn thiện báo cáo và đóng gói mã nguồn

Ma trận phân tích rủi ro và giải pháp khắc phục

  1. Rủi ro rò rỉ bộ nhớ (Memory Leak) do tải hình ảnh sản phẩm (Image): Guna UI và Windows Forms thường bị đầy bộ nhớ khi hiển thị hàng trăm ảnh nhị phân. Giải pháp: Sử dụng giải phóng tài nguyên tự động với từ khóa using và phương thức Dispose(), kết hợp lazy rendering trên DataGridView.
  2. Xung đột phiên giao dịch đồng thời (Concurrency Conflict) khi 2 nhân viên cùng bán 1 mặt hàng sắp hết: Giải pháp: Áp dụng SQL Transaction Isolation Level READ COMMITTED và cơ chế kiểm tra số lượng tồn kho trước khi phát lệnh ghi đơn.

Implementation và kết quả

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

Phần mềm triển khai kỹ thuật xử lý hóa đơn kèm trừ kho tự động thông qua giao dịch toàn vẹn dữ liệu (Database Transaction), đảm bảo nếu việc trừ hàng trong kho thất bại thì toàn bộ hóa đơn sẽ được hủy bỏ (Rollback) ngay lập tức:

// Xử lý tạo hóa đơn và đồng bộ trừ kho an toàn thông qua SQL Transaction
public bool ProcessOrderCheckout(Orders orderHeader, List<OrderDetails> orderItems)
{
    using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConn"].ConnectionString))
    {
        connection.Open();
        using (SqlTransaction transaction = connection.BeginTransaction())
        {
            try
            {
                // 1. Thêm bản ghi vào bảng Orders
                string insertOrderQuery = @"INSERT INTO Orders (Orders_Id, Users_Id, Order_Date, Customer_Name, 
                                            Customer_Number, Total_Amount, Paid_Amount, Due_Amount, Discount, Grand_Total, StatusPayment) 
                                            VALUES (@Orders_Id, @Users_Id, @Order_Date, @Customer_Name, 
                                            @Customer_Number, @Total_Amount, @Paid_Amount, @Due_Amount, @Discount, @Grand_Total, @StatusPayment)";
                
                using (SqlCommand cmdOrder = new SqlCommand(insertOrderQuery, connection, transaction))
                {
                    cmdOrder.Parameters.AddWithValue("@Orders_Id", orderHeader.Orders_Id);
                    cmdOrder.Parameters.AddWithValue("@Users_Id", orderHeader.Users_Id);
                    cmdOrder.Parameters.AddWithValue("@Order_Date", DateTime.Now);
                    cmdOrder.Parameters.AddWithValue("@Customer_Name", orderHeader.Customer_Name);
                    cmdOrder.Parameters.AddWithValue("@Customer_Number", orderHeader.Customer_Number);
                    cmdOrder.Parameters.AddWithValue("@Total_Amount", orderHeader.Total_Amount);
                    cmdOrder.Parameters.AddWithValue("@Paid_Amount", orderHeader.Paid_Amount);
                    cmdOrder.Parameters.AddWithValue("@Due_Amount", orderHeader.Due_Amount);
                    cmdOrder.Parameters.AddWithValue("@Discount", orderHeader.Discount);
                    cmdOrder.Parameters.AddWithValue("@Grand_Total", orderHeader.Grand_Total);
                    cmdOrder.Parameters.AddWithValue("@StatusPayment", orderHeader.StatusPayment);
                    cmdOrder.ExecuteNonQuery();
                }

                // 2. Thêm từng chi tiết đơn hàng và cập nhật số lượng tồn kho
                foreach (var item in orderItems)
                {
                    // Kiểm tra số lượng tồn kho khả dụng
                    string checkStockQuery = "SELECT Product_Quantity FROM Product WHERE Product_Id = @Product_Id";
                    using (SqlCommand cmdStock = new SqlCommand(checkStockQuery, connection, transaction))
                    {
                        cmdStock.Parameters.AddWithValue("@Product_Id", item.Product_Id);
                        int currentQty = Convert.ToInt32(cmdStock.ExecuteScalar());
                        if (currentQty < item.Amount)
                        {
                            throw new InvalidOperationException($"Sản phẩm ID {item.Product_Id} không đủ số lượng tồn kho!");
                        }
                    }

                    // Thêm vào OrderDetails
                    string insertDetailQuery = @"INSERT INTO OrderDetails (Orders_Id, Product_Id, Amount, Product_Rate, Total, Payment_Methods) 
                                                 VALUES (@Orders_Id, @Product_Id, @Amount, @Product_Rate, @Total, @Payment_Methods)";
                    using (SqlCommand cmdDetail = new SqlCommand(insertDetailQuery, connection, transaction))
                    {
                        cmdDetail.Parameters.AddWithValue("@Orders_Id", item.Orders_Id);
                        cmdDetail.Parameters.AddWithValue("@Product_Id", item.Product_Id);
                        cmdDetail.Parameters.AddWithValue("@Amount", item.Amount);
                        cmdDetail.Parameters.AddWithValue("@Product_Rate", item.Product_Rate);
                        cmdDetail.Parameters.AddWithValue("@Total", item.Total);
                        cmdDetail.Parameters.AddWithValue("@Payment_Methods", item.Payment_Methods);
                        cmdDetail.ExecuteNonQuery();
                    }

                    // Cập nhật trừ kho
                    string updateStockQuery = @"UPDATE Product SET Product_Quantity = Product_Quantity - @SoldAmount 
                                                WHERE Product_Id = @Product_Id";
                    using (SqlCommand cmdUpdate = new SqlCommand(updateStockQuery, connection, transaction))
                    {
                        cmdUpdate.Parameters.AddWithValue("@SoldAmount", item.Amount);
                        cmdUpdate.Parameters.AddWithValue("@Product_Id", item.Product_Id);
                        cmdUpdate.ExecuteNonQuery();
                    }
                }

                transaction.Commit();
                return true;
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                System.Diagnostics.Debug.WriteLine("Lỗi thanh toán: " + ex.Message);
                return false;
            }
        }
    }
}

Bên cạnh đó, thuật toán xác thực đổi trả hàng kiểm tra nghiêm ngặt thời hạn mua hàng trong vòng 7 ngày:

// Thuật toán kiểm tra điều kiện đổi trả theo chính sách 7 ngày
public bool ValidateReturnEligibility(string customerPhone, string orderId, out string message)
{
    using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConn"].ConnectionString))
    {
        string query = @"SELECT Order_Date FROM Orders 
                         WHERE Orders_Id = @Orders_Id AND Customer_Number = @Phone";
        SqlCommand cmd = new SqlCommand(query, connection);
        cmd.Parameters.AddWithValue("@Orders_Id", orderId);
        cmd.Parameters.AddWithValue("@Phone", customerPhone);

        connection.Open();
        object result = cmd.ExecuteScalar();

        if (result == null)
        {
            message = "Không tìm thấy thông tin đơn hàng khớp với số điện thoại khách hàng!";
            return false;
        }

        DateTime orderDate = Convert.ToDateTime(result);
        TimeSpan span = DateTime.Now - orderDate;

        if (span.TotalDays > 7.0)
        {
            message = $"Đơn hàng đã mua quá hạn quy định ({Math.Floor(span.TotalDays)} ngày kể từ khi mua). Từ chối tiếp nhận đổi trả.";
            return false;
        }

        message = "Đơn hàng đủ điều kiện tiếp nhận đổi trả.";
        return true;
    }
}

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

Hệ thống đã trải qua các đợt kiểm thử với kết quả định lượng cụ thể:

Hạng mục kiểm thử Kịch bản kiểm thử Kết quả thực tế Tỷ lệ đạt (%)
Bảo mật & RBAC Đăng nhập tài khoản Staff, truy cập màn hình cấu hình User/Category Chặn truy cập và ẩn các menu quản trị viên $100%$ ($20/20\text{ Test Cases}$)
Giao dịch thanh toán Thực hiện thanh toán đồng thời 5 đơn hàng có cùng mặt hàng tồn kho $1$ $1$ đơn thành công, $4$ đơn rollback báo hết hàng $100%$ ($15/15\text{ Test Cases}$)
Hiệu năng truy vấn Truy xuất $10.000$ đơn hàng và hiển thị lên DataGridView Thời gian load trung bình $42\text{ms}$ Đạt tiêu chuẩn ($< 100\text{ms}$)
Kiểm tra đổi trả Nhập đơn hàng mua ngày $8$ ngày trước Hệ thống tự động từ chối với thông báo chính xác $100%$ ($10/10\text{ Test Cases}$)
In hóa đơn Xuất hóa đơn ra bộ đệm máy in nhiệt POS-80 Tạo lệnh in trong $0.8\text{ giây}$ Đạt tiêu chuẩn

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

  1. Ứng dụng công nghệ giao diện hiện đại (Modern UI/UX): Thay thế giao diện WinForms cổ điển bằng Guna UI 2 Framework, cung cấp 16 dạng biểu đồ thống kê trực quan, hệ thống màu sắc phẳng (Flat Design) chuyên nghiệp, giúp giảm 40% số lần click chuột của thu ngân trong quá trình lập đơn.
  2. Cơ chế phân quyền động theo vai trò (Dynamic Role Routing): Tự động tải các UserControl tương ứng với quyền hạn (UserControlProduct cho Admin, UserControlProductStaff cho Nhân viên) tại runtime, triệt tiêu nguy cơ sửa đổi trái phép cấu trúc giá và danh mục sản phẩm.
  3. Module quản lý đổi trả chuyên biệt (Warranty & Return Management): Khác với các phần mềm quản lý bán hàng thông thường chỉ tập trung vào việc bán, hệ thống đã chuẩn hóa quy trình tiếp nhận đổi trả với bảng quan hệ ReturnProduct, giúp cửa hàng theo dõi nguyên nhân lỗi sản phẩm từ nhà sản xuất.
  4. Đo lường cải tiến định lượng:
    • Tăng tốc độ xuất hóa đơn lên 65% so với ghi nhận sổ sách hoặc Excel.
    • Giảm thiểu 100% sai sót bán âm kho nhờ cơ chế kiểm tra tồn kho tại tầng Transaction.
    • Giảm thời gian kiểm kê tồn kho cuối tháng từ 2 ngày xuống còn 15 phút thông qua màn hình Dashboard tự động.

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

Tình huống ứng dụng thực tế (Use Cases)

  • Chuỗi cửa hàng linh kiện PC / Laptop: Quản lý đa dạng chủng loại (CPU, RAM, VGA, Mainboard) với mã định danh danh mục rõ ràng.
  • Showroom thiết bị ngoại vi và phụ kiện gaming: Hỗ trợ xuất hóa đơn nhanh chóng trong giờ cao điểm với giao diện bán lẻ trực tiếp trên màn hình cảm ứng POS hoặc máy tính bàn.
  • Trung tâm tiếp nhận bảo hành máy tính: Sử dụng module Đổi trả để tra cứu tức thì thông tin khách hàng qua số điện thoại và thời hạn đơn hàng.
┌────────────────────────────────────────────────────────────────────────┐
│                        YÊU CẦU PHẦN CỨNG TRIỂN KHAI                    │
├────────────────────────────────────────────────────────────────────────┤
│ • CPU: Tối thiểu Intel Core i3 Thế hệ 6 / AMD Ryzen 3 trở lên          │
│ • RAM: Tối thiểu 4GB (Khuyến nghị 8GB DDR4)                            │
│ • Ổ cứng: 500MB dung lượng trống cho Application, 10GB cho SQL Data    │
│ • Hệ điều hành: Windows 10 / Windows 11 / Windows Server 2019 (64-bit) │
│ • Thiết bị ngoại vi: Hỗ trợ máy in hóa đơn nhiệt khổ 80mm (K80)       │
└────────────────────────────────────────────────────────────────────────┘

Phân tích hiệu quả đầu tư (Cost-Benefit & ROI)

  • Chi phí bản quyền: $0\text{ VNĐ}$ phí thuê bao hàng tháng (so với các giải pháp SaaS tiêu tốn từ $3.000.000 - $6.000.000\text{ VNĐ/năm}$).
  • Thời gian hoàn vốn (Payback Period): Ngay trong tháng đầu tiên vận hành nhờ tiết kiệm $1$ nhân sự kiểm kho và hạn chế tối đa thất thoát hàng hóa.

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

Hạn chế hiện tại

  • Kiến trúc phần mềm gắn liền với Windows Desktop, chưa hỗ trợ truy cập đa nền tảng trên trình duyệt Web hoặc thiết bị di động (Android/iOS).
  • Chưa tích hợp module đọc mã vạch tự động trực tiếp qua máy quét Barcode/QR 2D chuyên dụng.
  • Dữ liệu hình ảnh sản phẩm đang lưu trữ dạng nhị phân (image) trực tiếp trong SQL Server, có thể gây phình to dung lượng database khi số lượng SKU lên đến hàng chục nghìn.

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

  1. Chuyển đổi Backend sang kiến trúc RESTful API: Sử dụng ASP.NET Core 8.0 để cung cấp API tập trung cho cả ứng dụng Desktop, Web quản trị và Mobile App (Flutter).
  2. Tích hợp cổng thanh toán trực tuyến: Kết nối API MoMo Merchant, VNPay-QR và chuyển khoản tự động qua hệ sinh thái Open Banking (VietQR).
  3. Tối ưu hóa kho lưu trữ Media: Tách hình ảnh sản phẩm ra máy chủ lưu trữ file cục bộ hoặc Cloud Object Storage (Amazon S3 / Google Cloud Storage), chỉ lưu URI trong cơ sở dữ liệu.
  4. Ứng dụng AI dự báo nhu cầu thị trường: Áp dụng các mô hình học máy (Machine Learning) để dự báo xu hướng sản phẩm bán chạy theo từng mùa trong năm.

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

┌─────────────────────────────────────────────────────────────────────────┐
│                     GIÁ TRỊ MANG LẠI CHO CÁC ĐỐI TƯỢNG                  │
├───────────────────┬─────────────────────────────────────────────────────┤
│ 1. Sinh viên CNTT │ • Cung cấp mã nguồn tham khảo chuẩn về WinForms     │
│                   │ • Nắm vững kỹ thuật lập trình C#, ADO.NET và SQL    │
│                   │ • Hiểu rõ quy trình phân tích Use Case & ERD        │
├───────────────────┼─────────────────────────────────────────────────────┤
│ 2. Lập trình viên │ • Template kiến trúc 3-Tier với Guna UI hiện đại    │
│                   │ • Mẫu code xử lý SQL Transaction an toàn            │
├───────────────────┼─────────────────────────────────────────────────────┤
│ 3. Chủ doanh nghiệp│ • Phần mềm quản lý bán lẻ miễn phí, ổn định cao    │
│                   │ • Tự chủ 100% dữ liệu kinh doanh nội bộ             │
├───────────────────┼─────────────────────────────────────────────────────┤
│ 4. Nhà nghiên cứu │ • Dữ liệu thực nghiệm về tối ưu hiệu năng WinForms  │
│                   │ • Nghiên cứu giải pháp quản lý bán lẻ on-premise    │
└───────────────────┴─────────────────────────────────────────────────────┘

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

1. Yêu cầu kỹ thuật để triển khai ứng dụng trên máy trạm mới là gì?

Máy tính cần cài đặt hệ điều hành Windows 10/11, đã kích hoạt .NET Framework 4.8 (mặc định có sẵn trên Windows 10 version 1903 trở lên). Đối với máy chủ chứa cơ sở dữ liệu, cần cài đặt Microsoft SQL Server 2016 Express trở lên và mở cổng mạng 1433 nếu chạy trong mạng nội bộ LAN.

2. Hệ thống xử lý như thế nào khi xảy ra sự cố mất điện đột ngột lúc đang thanh toán?

Nhờ cơ chế SQL Transaction với cấp độ cách ly BeginTransaction(), nếu việc tạo đơn hàng hoặc trừ kho chưa hoàn tất $100%$, hệ thống cơ sở dữ liệu sẽ tự động Rollback về trạng thái trước giao dịch, đảm bảo không bao giờ xảy ra lỗi sai lệch tiền hoặc mất dữ liệu tồn kho.

3. Phần mềm có thể kết nối với các thiết bị phần cứng bán hàng (Máy in hóa đơn, ngăn kéo đựng tiền) không?

Có. Ứng dụng tích hợp thư viện in ấn chuẩn của .NET (System.Drawing.Printing), tương thích với tất cả các dòng máy in nhiệt POS khổ 58mm và 80mm qua giao tiếp USB hoặc LAN Driver, đồng thời có thể gửi mã lệnh kích hoạt mở ngăn kéo đựng tiền tự động khi in bill.

4. Quy trình sao lưu và phục hồi dữ liệu được thực hiện ra sao?

Người quản trị có thể trực tiếp thực hiện lệnh sao lưu cơ sở dữ liệu (Full Backup .bak) thông qua SQL Server Management Studio (SSMS) hoặc cấu hình lịch trình tự động (SQL Server Agent Maintenance Plan) để sao lưu định kỳ hàng ngày sang ổ cứng phụ hoặc đám mây.

5. Chi phí vận hành và thời gian hoàn vốn thực tế của giải pháp này?

Phần mềm là sản phẩm mã nguồn mở được phát triển trên công nghệ của Microsoft, không phát sinh chi phí duy trì hàng tháng. Chi phí vận hành gần như bằng 0 (chỉ bao gồm tiền điện máy tính và giấy in hóa đơn). Thời gian hoàn vốn đầu tư đạt được tức thì ngay sau khi đưa vào vận hành thực tế.


Kết luận

Đồ án "Xây dựng Hệ thống Quản lý Bán hàng" đã hiện thực hóa thành công một giải pháp quản trị bán lẻ toàn diện, kết hợp chặt chẽ giữa lý thuyết phân tích thiết kế hệ thống và kỹ thuật lập trình máy trạm hiện đại trên nền tảng .NET Framework và Microsoft SQL Server. Dự án không chỉ giải quyết triệt để các khó khăn trong quản lý đơn hàng, tồn kho và đổi trả cho các cửa hàng kinh doanh linh kiện máy tính, mà còn mang lại cấu trúc mã nguồn module hóa rõ ràng, đạt chuẩn công nghiệp cho cộng đồng sinh viên và lập trình viên tham khảo.

Toàn bộ mã nguồn và tài liệu kỹ thuật của dự án được công khai tại kho lưu trữ:
👉 GitHub Repository: ComputerShop Management System