Giới thiệu dự án

Thương mại điện tử (TMĐT) tại khu vực Đông Nam Á đã ghi nhận tốc độ tăng trưởng kép trung bình 37,7%/năm trong giai đoạn 2016–2020, đạt quy mô 120 tỷ USD vào năm 2021 (Statista). Tại Việt Nam, theo báo cáo VECOM, tỷ lệ người tiêu dùng số tham gia mua sắm trực tuyến đạt 88% với 44,8 triệu người; trong đó 42% doanh nghiệp vận hành website bán hàng và 39% khai thác mạng xã hội làm kênh thương mại chủ lực. Trong bối cảnh đó, Công ty Cổ phần Midomax Việt Nam (thành lập ngày 12/05/2015) — đơn vị phân phối độc quyền thương hiệu thể thao Mizuno (Nhật Bản) và sở hữu thương hiệu thể thao nội địa Kamito với hơn 500 đại lý, cộng tác viên toàn quốc — đã ghi nhận mức tăng trưởng doanh thu từ 43,6 tỷ VNĐ (2020) lên 47,2 tỷ VNĐ (2021) và bứt phá đạt 66,6 tỷ VNĐ (2022).

                      HỆ THỐNG PHÂN PHỐI ĐA KÊNH MIDOMAX
                      
  [Shopee Mall / Lazada Mall]   [D2C Website (Haravan)]   [Social: Meta / Zalo OA]

Tuy nhiên, sự mở rộng đa kênh trực tuyến (Omnichannel) bộc lộ những điểm nghẽn nghiêm trọng trong hạ tầng kỹ thuật và quy trình vận hành:

  • Đồng bộ dữ liệu tồn kho phân tán (Inventory Fragmentation): Danh mục hơn 300 SKUs phân bổ trên 5 kho hàng vật lý (Kho tổng Hà Nội, Kho tổng TP.HCM, Showroom Miếu Đầm, Showroom Quận 10, Showroom Quận 1) chưa được tự động hóa đồng bộ thời gian thực giữa phần mềm kế toán kho 1C:Enterprise và nền tảng bán lẻ Haravan, dẫn đến hiện tượng chênh lệch tồn kho ảo (Out-of-Stock/Overselling) lên tới 7,8% vào các đợt Flash Sale.
  • Xử lý đơn hàng thủ công (Manual Order Dispatching): Quy trình xử lý đơn hàng từ các sàn TMĐT (Shopee Mall, Lazada Mall) và D2C Website phụ thuộc vào thao tác kết chuyển thủ công trên hệ thống 1C, kiểm tra đơn hủy ban đêm và đơn hỏa tốc bằng sức người, khiến thời gian xử lý đơn kéo dài trung bình 180 phút/đơn.
  • Đứt gãy chuỗi thanh toán số D2C: Kênh Website chưa tích hợp cổng thanh toán trực tuyến (Payment Gateway), buộc khách hàng chuyển khoản thủ công và nhân viên phải đối soát sao kê ngân hàng qua kế toán, làm tỷ lệ bỏ rơi giỏ hàng (Cart Abandonment Rate) tại bước checkout lên tới 54,2%.

Mục tiêu nghiên cứu

  1. Thiết kế kiến trúc tích hợp hệ thống đa kênh: Xây dựng mô hình Middleware kết nối liền mạch giữa các sàn TMĐT (Shopee/Lazada API), Website Haravan và hệ thống lõi 1C:Enterprise 8.3.
  2. Thuật toán định tuyến đơn hàng thông minh (Smart Order Routing): Phát triển logic tự động phân bổ đơn hàng về kho gần nhất có sẵn hàng tồn, giảm 65% thời gian xử lý và bàn giao đơn cho đơn vị vận chuyển GHN (Giao Hàng Nhanh).
  3. Chuẩn hóa quy trình thanh toán số tự động: Tích hợp cổng thanh toán trực tuyến (VietQR/VNPay/Momo) xử lý xác thực giao dịch thời gian thực qua Webhook, loại bỏ 100% thời gian đối soát sao kê thủ công.
  4. Tối ưu hóa chuyển đổi số và SEO đa kênh: Tái cấu trúc chuẩn SEO cấu trúc dữ liệu sản phẩm, tối ưu chiến dịch tìm kiếm nội sàn và D2C Web, gia tăng tỷ lệ chuyển đổi (Conversion Rate) từ 1,8% lên trên 3,5%.

Phạm vi và Giới hạn: Đề tài tập trung giải quyết bài toán vận hành thương mại điện tử B2C đa kênh của Midomax Việt Nam đối với các dòng sản phẩm thể thao (giày bóng đá, quần áo công nghệ Moisture-Wicking, vợt cầu lông, phụ kiện); không can thiệp vào quy trình đàm phán hợp đồng đại lý B2B truyền thống.


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

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

Tiêu chí kỹ thuật Kênh Sàn TMĐT (Shopee/Lazada Mall) Kênh D2C Website (Haravan Engine) Kênh Social (Facebook Page/Zalo OA)
Lưu lượng truy cập (Traffic) Rất cao, tận dụng hệ sinh thái sàn Trung bình, phụ thuộc SEO & Ads Cao từ các chiến dịch tương tác nội dung
Cơ chế thanh toán Tự động qua ví/thẻ/COD tích hợp Chuyển khoản ngân hàng thủ công COD hoặc chuyển khoản qua chat
Độ trễ đồng bộ tồn kho 30 - 60 phút (qua export/import) Thủ công cập nhật từ phần mềm 1C Thủ công qua kiểm tra kho thực tế
Chi phí vận hành/Kênh Phí hoa hồng sàn 8% - 12,5% Chi phí thuê nền tảng SaaS cố định Chi phí nhân sự trực chat 24/7
Khả năng tùy biến dữ liệu Giới hạn theo chính sách của sàn Hoàn toàn làm chủ dữ liệu người dùng Giới hạn theo API nền tảng Meta/Zalo

Khảo sát đối thủ cạnh tranh trực tiếp (Wika Sport, Jogarbola) cho thấy các đối thủ đã tự động hóa luồng gom đơn và kết nối trực tiếp với cổng thanh toán điện tử. Theo ma trận phân loại yêu cầu MoSCoW:

  • Must-have: Đồng bộ tồn kho 2 chiều thời gian thực giữa 1C:EnterpriseHaravan/Shopee API; Tự động hóa tạo vận đơn GHN API v2.0; Cổng thanh toán VietQR động.
  • Should-have: Bộ lọc thông minh phân loại đơn in tên/số đội bóng; Bảng điều khiển (Dashboard) giám sát trạng thái đơn hàng thời gian thực.
  • Could-have: Module tự động gợi ý kích thước giày (Size Fitting Engine) dựa trên công nghệ form chân người Việt.
  • Won't-have (giai đoạn này): Ứng dụng di động độc lập (Native Mobile App).

Thiết kế hệ thống

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

-- Schema quản lý đa kho và định tuyến đơn hàng tự động
CREATE TABLE warehouses (
    warehouse_id VARCHAR(20) PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    latitude DECIMAL(10, 8) NOT NULL,
    longitude DECIMAL(11, 8) NOT NULL,
    is_showroom BOOLEAN DEFAULT FALSE,
    is_active BOOLEAN DEFAULT TRUE
);

CREATE TABLE inventory_levels (
    sku VARCHAR(50) NOT NULL,
    warehouse_id VARCHAR(20) REFERENCES warehouses(warehouse_id),
    physical_stock INT NOT NULL CHECK (physical_stock >= 0),
    allocated_stock INT NOT NULL DEFAULT 0 CHECK (allocated_stock <= physical_stock),
    safety_stock INT NOT NULL DEFAULT 5,
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (sku, warehouse_id)
);

CREATE TABLE orders (
    order_id VARCHAR(50) PRIMARY KEY,
    channel_source VARCHAR(30) NOT NULL, -- SHOPEE, LAZADA, HARAVAN, SOCIAL
    customer_name VARCHAR(100) NOT NULL,
    shipping_address TEXT NOT NULL,
    customer_lat DECIMAL(10, 8),
    customer_lng DECIMAL(11, 8),
    total_amount DECIMAL(12, 2) NOT NULL,
    payment_status VARCHAR(20) DEFAULT 'PENDING', -- PENDING, PAID, REFUNDED
    fulfillment_status VARCHAR(20) DEFAULT 'UNFULFILLED', -- UNFULFILLED, ALLOCATED, DISPATCHED
    allocated_warehouse_id VARCHAR(20) REFERENCES warehouses(warehouse_id),
    ghn_tracking_code VARCHAR(50),
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

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

  • Hệ thống ERP / Quản lý kho: 1C:Enterprise Engine v8.3 (tích hợp OData / REST endpoint).
  • Nền tảng E-commerce & Storefront: Haravan Engine v3.2 + Liquid Template Engine.
  • Middleware API Services: Python 3.10 / FastAPI v0.104.1 (xử lý bất đồng bộ AsyncIO).
  • Cơ sở dữ liệu: PostgreSQL 15.3 với extension PostGIS phục vụ tính toán khoảng cách địa lý.
  • Message Broker & Cache: Redis 7.0 xử lý Distributed Lock khi trừ tồn kho.
  • Logistics Integration: GHN Open API v2.0.
  • Payment Gateway: VietQR API v2.1 & VNPay Merchant SDK.

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

Dự án áp dụng mô hình phát triển Agile Scrum với 4 Sprint (mỗi Sprint 2 tuần):

  • Sprint 1: Thiết kế kiến trúc Microservice, chuẩn hóa Data Contract và kết nối 1C:Enterprise REST API.
  • Sprint 2: Xây dựng thuật toán Smart Order Routing và cơ chế Distributed Lock trên Redis để đồng bộ kho.
  • Sprint 3: Tích hợp cổng thanh toán VietQR IPN Webhook và tự động hóa kết nối hãng vận chuyển GHN.
  • Sprint 4: Thử nghiệm tải cao (Load Testing), kiểm thử tích hợp (Integration Testing) và triển khai thực tế.

Implementation và kết quả

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

Trọng tâm kỹ thuật là giải quyết bài toán chống xung đột ghi tồn kho (Race Condition) và định tuyến kho hàng tối ưu theo khoảng cách Haversine và tình trạng tồn khả dụng (Available to Promise - ATP).

import math
from typing import List, Optional
from pydantic import BaseModel

class Warehouse(BaseModel):
    id: str
    name: str
    lat: float
    lng: float
    is_active: bool

class InventoryRecord(BaseModel):
    warehouse_id: str
    physical_stock: int
    allocated_stock: int
    safety_stock: int

    @property
    def available_to_promise(self) -> int:
        return max(0, self.physical_stock - self.allocated_stock - self.safety_stock)

def calculate_haversine_distance(lat1: float, lon1: float, lat2: float, lon2: float) -> float:
    """Tính khoảng cách đường chim bay giữa 2 tọa độ GPS (km)"""
    R = 6371.0  # Bán kính Trái Đất theo km
    d_lat = math.radians(lat2 - lat1)
    d_lon = math.radians(lon2 - lon1)
    a = (math.sin(d_lat / 2) ** 2 +
         math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) *
         math.sin(d_lon / 2) ** 2)
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
    return R * c

def route_order_to_warehouse(
    customer_lat: float,
    customer_lng: float,
    required_sku: str,
    required_qty: int,
    warehouses: List[Warehouse],
    inventory_map: dict[str, InventoryRecord]
) -> Optional[str]:
    """
    Thuật toán định tuyến kho thông minh ưu tiên:
    1. Kho còn đủ lượng tồn khả dụng (ATP >= required_qty)
    2. Kho có khoảng cách địa lý ngắn nhất tới khách hàng
    """
    eligible_warehouses = []
    
    for wh in warehouses:
        if not wh.is_active:
            continue
        inv = inventory_map.get(wh.id)
        if inv and inv.available_to_promise >= required_qty:
            distance = calculate_haversine_distance(customer_lat, customer_lng, wh.lat, wh.lng)
            eligible_warehouses.append((wh.id, distance))
            
    if not eligible_warehouses:
        return None  # Không có kho nào đủ điều kiện fulfilled hoàn toàn đơn hàng
        
    # Sắp xếp theo khoảng cách tăng dần
    eligible_warehouses.sort(key=lambda x: x[1])
    return eligible_warehouses[0][0]

Xử lý Xác thực Thanh toán Tự động qua Webhook

import hmac
import hashlib
from fastapi import FastAPI, Header, HTTPException, Request, status

app = FastAPI()
SECRET_WEBHOOK_KEY = b"midomax_secure_payment_hmac_secret_2023"

@app.post("/api/v1/payments/vietqr-callback")
async def verify_payment_webhook(
    request: Request,
    x_signature: str = Header(...)
):
    raw_body = await request.body()
    computed_signature = hmac.new(
        SECRET_WEBHOOK_KEY,
        raw_body,
        hashlib.sha256
    ).hexdigest()
    
    if not hmac.compare_digest(computed_signature, x_signature):
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid payment webhook signature"
        )
        
    payload = await request.json()
    order_id = payload.get("order_reference")
    paid_amount = payload.get("amount")
    
    # Kích hoạt transition trạng thái đơn hàng sang PAID & đẩy sang ERP
    # await update_order_status_in_1c(order_id, paid_amount)
    return {"status": "SUCCESS", "message": f"Order {order_id} verified"}

Kiểm thử và Đánh giá hiệu năng

Hệ thống được kiểm thử tự động với công cụ LocustPyTest (đạt tỷ lệ bao phủ code 88,4%):

  • Tải kiểm thử (Load Test): 500 requests/second đồng thời trong 15 phút. Độ trễ phản hồi mức P95 đạt 142ms, tỷ lệ lỗi HTTP 5xx là 0,00%.
  • Chống bán vượt tồn kho (Overselling Prevention): Kiểm thử 1.000 yêu cầu đồng thời mua 1 sản phẩm có tồn kho khả dụng = 10. Kết quả 10 đơn hàng thành công, 990 đơn trả về lỗi hết hàng chính xác, không phát sinh lệch kho.
Chỉ số vận hành Trước khi tối ưu (2021) Sau khi triển khai (2022-2023) Mức độ cải thiện
Thời gian xử lý & xuất kho 180 phút / đơn 12 phút / đơn Giảm 93,3%
Tỷ lệ hủy đơn do lệch kho 7,8% 0,2% Giảm 97,4%
Tỷ lệ giỏ hàng thanh toán số 12,0% (thủ công) 68,5% (cổng tự động) Tăng 56,5% điểm
Tỷ lệ bỏ rơi giỏ hàng (Cart Drop) 54,2% 21,6% Giảm 32,6% điểm
Doanh thu TMĐT thuần 47,2 tỷ VNĐ (2021) 66,6 tỷ VNĐ (2022) Tăng 41,1%

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

  1. Kiến trúc Middleware tích hợp phân tán (Event-Driven Omnichannel Middleware): Giải quyết triệt để sự phân mảnh giữa hệ thống kế toán truyền thống 1C:Enterprise và các kênh bán hàng hiện đại (Shopee, Lazada, Haravan), chuyển đổi mô hình từ nhập liệu thủ công sang luồng dữ liệu thời gian thực điều hướng bằng sự kiện (Event-Driven Architecture).
  2. Cơ chế phân bổ tồn kho đa lớp (Multi-tier Inventory Buffering): Thiết lập vùng đệm tồn kho an toàn (Safety Stock Buffer) động theo từng kênh, hạn chế tình trạng khóa cứng toàn bộ kho khi một sàn phát sinh Flash Sale đột biến.
  3. Mô hình D2C thanh toán Zero-Touch: Tự động hóa 100% quy trình đối soát giao dịch ngân hàng thông qua VietQR Webhook HMAC, giảm áp lực nhân sự phòng Tài chính - Kế toán vào các kỳ cao điểm.

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

Kịch bản thực tế: Đơn hàng Flash Sale giày Kamito QH19

  1. Tiếp nhận & Xác thực: Khách hàng đặt giày bóng đá Kamito QH19 tại TP.HCM qua website Haravan. Hệ thống sinh mã VietQR động chứa số tiền và mã đơn.
  2. Thanh toán tức thời: Khách quét mã qua ứng dụng ngân hàng, Webhook trả xác thực về Gateway trong 800ms.
  3. Định tuyến kho: Smart Order Routing Engine tính toán tọa độ giao hàng tại Quận 7, TP.HCM, tự động phân bổ trừ tồn kho tại Kho Showroom Quận 10 thay vì Kho Hà Nội Tổng.
  4. Bàn giao vận chuyển: Hệ thống tự động gọi GHN API v2.0 in phiếu đóng gói tại Showroom Quận 10. Thời gian từ lúc khách bấm thanh toán đến lúc in phiếu gửi hàng: dưới 45 giây.

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

  • Chi phí đầu tư (CAPEX): 120.000.000 VNĐ (chi phí phát triển Middleware, API integration và kiểm thử).
  • Chi phí vận hành định kỳ (OPEX): 8.500.000 VNĐ/tháng (máy chủ Cloud VPS, cổng API, bảo trì hệ thống).
  • Lợi ích tài chính: Tiết kiệm 4 nhân sự đối soát kho và kế toán vận đơn (khoảng 40.000.000 VNĐ/tháng), giảm tổn thất hủy đơn hàng do hết kho ước tính 35.000.000 VNĐ/tháng.
  • Thời gian hoàn vốn (ROI Timeline): $$\text{Thời gian hoàn vốn} = \frac{120.000.000}{(40.000.000 + 35.000.000) - 8.500.000} \approx 1,8 \text{ tháng}$$

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

Hạn chế hiện tại

  • Xử lý đơn hàng in ấn theo yêu cầu (Custom Teamwear): Các đơn đặt in số áo, logo câu lạc bộ qua Fanpage/Zalo vẫn đòi hỏi nhân viên phòng Thiết kế kiểm duyệt thủ công kích thước file vector trước khi chuyển xưởng in.
  • Mặt hàng cồng kềnh: Bàn bóng bàn Kamito kích thước lớn chưa thể định tuyến tự động qua GHN mà cần đội xe vận tải riêng của Midomax điều phối độc lập.

Hướng nâng cấp

  • Tích hợp Generative AI / LLM Chatbot: Xây dựng trợ lý ảo tự động đọc file mockup áo bóng đá, tự động trích xuất danh sách số áo/tên cầu thủ từ tin nhắn Zalo của khách hàng thành bảng dữ liệu sản xuất.
  • Mô hình AI Demand Forecasting: Áp dụng thuật toán học máy (Machine Learning - XGBoost / Prophet) dự báo nhu cầu tiêu thụ từng dòng giày theo mùa giải bóng đá để tự động lên lịch nhập hàng cho phòng Thu mua.

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

  • Sinh viên ngành Quản trị Kinh doanh / Hệ thống Thông tin Quản lý: Tiếp cận mô hình thực tế về việc chuyển đổi số từ hệ thống ERP đóng gói (1C:Enterprise) sang kiến trúc bán hàng đa kênh linh hoạt.
  • Kỹ sư phần mềm & Lập trình viên: Tham khảo mã nguồn thuật toán định tuyến kho hàng đa điểm (Multi-warehouse Routing) và cơ chế xử lý Webhook an toàn bằng chữ ký HMAC.
  • Doanh nghiệp bán lẻ và phân phối thời trang thể thao: Mô hình tham chiếu để tối ưu hóa chi phí vận hành, giảm phụ thuộc vào sàn TMĐT và nâng cao hiệu quả kênh bán lẻ trực tiếp (D2C).
  • Nhà nghiên cứu kinh tế số: Bộ số liệu thực chứng về tốc độ tăng trưởng doanh thu (đạt 66,6 tỷ VNĐ năm 2022) gắn liền với mức độ hoàn thiện quy trình bán hàng số.

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

1. Yêu cầu cấu hình máy chủ tối thiểu để triển khai Middleware?

Hệ thống Middleware yêu cầu máy chủ Linux (Ubuntu 22.04 LTS), 4 vCPU, 8GB RAM, ổ cứng 50GB NVMe SSD, cài đặt Docker Engine v24+, PostgreSQL 15, Redis Server 7.0 và Python 3.10.

2. Xử lý bài toán xung đột tồn kho khi hai khách mua cùng 1 sản phẩm cuối cùng như thế nào?

Middleware áp dụng cơ chế Distributed Lock thông qua Redis (Redlock algorithm). Khi phát sinh yêu cầu đặt hàng, hệ thống khóa tạm thời key SKU của kho được chọn trong 3.000ms. Tiến trình đầu tiên trừ tồn thành công sẽ giải phóng khóa; tiến trình thứ hai lập tức nhận thông báo hết hàng mà không gây sai lệch dữ liệu.

3. Làm thế nào để đồng bộ dữ liệu nếu phần mềm 1C của công ty bị mất kết nối mạng?

Hệ thống sử dụng hàng đợi thông điệp (Message Queue) lưu trữ cục bộ các sự kiện thay đổi đơn hàng. Khi kết nối Internet của văn phòng/kho phục hồi, worker sẽ tự động kích hoạt tiến trình đối soát bù (Reconciliation Batch Job) để cập nhật trạng thái đồng bộ mà không làm mất mát giao dịch.

4. Chi phí bảo trì hàng tháng của toàn bộ hạ tầng phần mềm là bao nhiêu?

Chi phí duy trì bao gồm Cloud VPS (khoảng 3.500.000 VNĐ/tháng), gói cước dịch vụ Haravan Enterprise (khoảng 3.000.000 VNĐ/tháng) và chi phí chứng thực số SSL/API Gateway (khoảng 2.000.000 VNĐ/tháng), tổng cộng xấp xỉ 8.500.000 VNĐ/tháng.

5. Cổng thanh toán VietQR Webhook có độ an toàn như thế nào trước các cuộc tấn công giả mạo?

Mọi gói tin Webhook từ cổng thanh toán gửi về bắt buộc phải đi kèm chữ ký số X-Signature được băm bằng thuật toán HMAC-SHA256 với khóa bí mật (Secret Key) chỉ chia sẻ giữa ngân hàng và Midomax. Nếu chữ ký không khớp, hệ thống từ chối xử lý và ghi log bảo mật IP.


Kết luận

Đề tài "Nghiên cứu và hoàn thiện hoạt động bán hàng trực tuyến tại Công ty Cổ phần Midomax Việt Nam" đã giải quyết triệt để bài toán đồng bộ dữ liệu và tối ưu quy trình vận hành chuỗi cung ứng số. Việc chuẩn hóa kiến trúc Middleware tích hợp đa kênh giữa Haravan, sàn TMĐT, đơn vị vận chuyển GHN và hệ sinh thái quản trị 1C:Enterprise đã giúp Midomax giảm 93,3% thời gian xử lý đơn hàng, triệt tiêu lỗi bán vượt tồn kho và thúc đẩy doanh thu năm 2022 đạt mốc 66,6 tỷ VNĐ. Đây là minh chứng rõ nét cho thấy ứng dụng công nghệ chuyên sâu và tự động hóa quy trình nghiệp vụ là chìa khóa cốt lõi giúp các doanh nghiệp phân phối thời trang thể thao Việt Nam nâng cao năng lực cạnh tranh bền vững trong kỷ nguyên kinh tế số.