Giới thiệu dự án

Thương mại điện tử (TMĐT) và mô hình bán hàng qua mạng xã hội (Social Commerce) tại Việt Nam chứng kiến tốc độ tăng trưởng vượt bậc trong giai đoạn hậu đại dịch COVID-19. Theo báo cáo từ Hiệp hội Thương mại Điện tử Việt Nam (VECOM), hơn 39% doanh nghiệp tham gia kinh doanh trên các nền tảng mạng xã hội và diễn đàn trực tuyến, trong khi khảo sát của Cục TMĐT và Kinh tế số ghi nhận tới 57% người tiêu dùng thường xuyên mua sắm qua các kênh này. Sự kiện TikTok chính thức kích hoạt giải pháp TikTok Shop tại Việt Nam vào ngày 29/04/2022 đã mở ra bước ngoặt lớn cho các nhà bán lẻ và cộng tác viên (CTV) trong việc tiếp cận khách hàng trẻ thông qua định dạng video ngắn.

Funimart là nền tảng TMĐT B2B2C chuyên biệt, đóng vai trò cầu nối trung gian giữa Nhà cung cấp (NCC) sở hữu nguồn hàng giá gốc và lực lượng CTV bán hàng trực tuyến (học sinh, sinh viên, nhân viên văn phòng). Mô hình vận hành của Funimart cho phép CTV chọn sản phẩm, niêm yết bán lại với tỷ lệ hoa hồng cố định, và khi có đơn hàng phát sinh, hệ thống sẽ điều phối để NCC duyệt, đóng gói và bàn giao cho đơn vị vận chuyển tích hợp, dòng tiền được bảo chứng thông qua hệ thống ví điện tử nội bộ.

+------------------+         +--------------------+         +------------------+
|  Nhà cung cấp    | <=====> |  Funimart Platform | <=====> |  Cộng tác viên   |
|  (Nguồn hàng gốc)|         |  (Ví điện tử/Đơn)  |         |  (Dropshipper)   |
+------------------+         +--------------------+         +------------------+
                                      ||                             ||
                                      \/                             \/
                             +--------------------+         +------------------+
                             | Sàn TMĐT/Webhooks  |         | Website Bán Hàng |
                             | (TikTok/Lazada)    |         | (Next.js SSR)    |
                             +--------------------+         +------------------+

Tuy nhiên, trong quá trình mở rộng quy mô, Funimart đối mặt với 4 điểm nghẽn nghiêm trọng:

  1. Xử lý đơn hàng thủ công (Manual Order Ingestion): CTV phải sao chép thủ công từng trường dữ liệu đơn hàng từ gian hàng Shopee, Lazada sang Funimart để đẩy về NCC, gây lãng phí thời gian và tỷ lệ sai sót thông tin giao nhận lên tới 12-15%.
  2. Lệch pha dữ liệu tồn kho (Inventory Desynchronization): Khi NCC biến động số lượng tồn kho (do kiểm kê hoặc bán sỉ), hệ thống không tự động cập nhật sang các kênh bán lẻ của CTV, dẫn đến tình trạng hủy đơn hàng loạt vì hết hàng.
  3. Kênh tiếp cận phân mảnh: CTV phụ thuộc hoàn toàn vào tương tác thủ công trên Facebook, Zalo mà thiếu công cụ xây dựng kênh bán hàng độc lập, tự động hóa khâu thu thập thông tin khách hàng 24/7.
  4. Hiệu năng tìm kiếm kém: Cơ chế Text Search tích hợp sẵn trên cơ sở dữ liệu MongoDB không hỗ trợ phân tích hình thái học tiếng Việt, không có khả năng tìm kiếm mờ (Fuzzy Search), khiến trải nghiệm tìm nguồn hàng của CTV bị hạn chế.

Mục tiêu của đề tài:

  1. Tích hợp cổng kết nối tự động với sàn TMĐT TikTok Shop và Lazada thông qua chuẩn giao thức OAuth 2.0.
  2. Tự động hóa 100% quy trình đồng bộ đơn hàng và cập nhật tồn kho 2 chiều theo thời gian thực sử dụng Webhook và Message Queue.
  3. Xây dựng giải pháp tạo Website bán hàng tự động đa người dùng (Multi-tenant Subdomain Storefront) trên nền tảng Next.js Server-Side Rendering (SSR).
  4. Tối ưu hóa công cụ tìm kiếm sản phẩm nguồn bằng cách tích hợp cụm Elasticsearch phân tán, hỗ trợ lập chỉ mục Inverted Index và Full-text Search tiếng Việt có dấu/không dấu.
  5. Số hóa và tự động hóa quy trình Trả hàng/Hoàn tiền (Return Merchandise Authorization - RMA) với cơ chế trừ/hoàn tiền tự động trên ví điện tử.

Phạm vi và giới hạn:

  • Phạm vi: Tích hợp API OpenAPI v2 của TikTok Shop và Lazada Open Platform; xây dựng backend API cho hệ thống ví, đơn hàng và kho dữ liệu; xây dựng frontend quản trị React/Redux và frontend bán hàng Next.js.
  • Giới hạn: Đề tài tập trung xử lý nghiệp vụ đồng bộ tại thị trường Việt Nam; chưa hỗ trợ tự động đối soát tài chính đa ngoại tệ xuyên biên giới.

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

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

Trước khi cải tiến, quy trình xử lý đơn hàng và dữ liệu sản phẩm giữa Funimart và các kênh bán hàng bên ngoài hoàn toàn dựa vào con người. Bảng phân tích dưới đây so sánh giải pháp cũ và giải pháp cải tiến:

Tiêu chí Giải pháp thủ công trước đây Nền tảng bên thứ ba (Haravan/Sapo) Giải pháp Funimart cải tiến
Cơ chế nhận đơn CTV nhập tay từ sàn sang hệ thống Đồng bộ qua ứng dụng trung gian đắt đỏ Tự động qua Webhook + Signature Verification
Độ trễ cập nhật tồn kho 2 - 24 giờ (phụ thuộc CTV) 5 - 15 phút (Polling định kỳ) < 2 giây (Event-driven API calls)
Kênh bán hàng cá nhân Bài viết đơn lẻ trên Facebook/Zalo Web riêng (chi phí duy trì cao) Subdomain tự động hóa bằng Next.js SSR
Tìm kiếm nguồn hàng Regex/Text index cơ bản của MongoDB Elasticsearch tích hợp ngoài Dedicated Elasticsearch Cluster + Analyzers
Xử lý hoàn tiền Đối soát thủ công qua kế toán Quy trình phiếu thu/chi tách rời Trừ/hoàn tự động qua Funimart E-Wallet Engine

Ma trận ưu tiên yêu cầu người dùng (MoSCoW):

  • Must have: Xác thực OAuth 2.0 đa nền tảng; Webhook xử lý đơn hàng từ TikTok Shop/Lazada; Đồng bộ thuộc tính sản phẩm và danh mục (Category Mapping); Tạo website bán hàng theo subdomain cá nhân hóa; Tích hợp Elasticsearch cho module tìm kiếm.
  • Should have: Quy trình RMA tự động khấu trừ ví NCC và CTV; Công cụ tùy biến banner/giao diện website bán hàng cho CTV.
  • Could have: Hệ thống gợi ý từ khóa tìm kiếm thông minh dựa trên lịch sử truy vấn; Tự động gia hạn Access Token chạy ngầm qua Redis Queue.
  • Won't have (lần này): Khởi tạo chiến dịch quảng cáo TikTok Ads trực tiếp từ Dashboard Funimart.

Thiết kế hệ thống

Kiến trúc tổng thể của hệ thống Funimart được thiết kế theo mô hình phân tầng hướng dịch vụ (Multi-tiered Service Architecture), tách biệt hoàn toàn giữa các giao diện người dùng và lớp dịch vụ xử lý tập trung:

[ Client Layer ]
   ├── CTV / NCC Dashboard (React.js + Redux Toolkit)
   └── Public Storefronts (Next.js SSR / Subdomains)
           │ (HTTPS / RESTful APIs / JSON)
           ▼
[ API Gateway & Middleware Layer ]
   ├── Authentication / Authorization (JWT + RBAC)
   ├── Rate Limiting & Input Validation
   └── Webhook Receivers (HMAC-SHA256 Verifier)
           │
           ▼
[ Backend Core (Node.js Monolithic Multi-layer) ]
   ├── Controller Layer (Request Orchestration)
   ├── Package/Service Layer (Domain Business Logic)
   ├── Queue Service (Bull Queue / Redis Message Broker)
   ├── Interface Layer (Lazada SDK, TikTok Shop Open API)
   └── Repository Layer (Data Access Object)
           │
           ▼
[ Storage & Search Layer ]
   ├── Primary Database: MongoDB 5.0 (Replica Set)
   ├── Search Engine: Elasticsearch 7.17 (Cluster with Lucene Index)
   └── Cache & Broker: Redis 6.2 (In-Memory Data Store)

Technology Stack & Phiên bản:

  • Frontend Management: React.js v17.0.2, Redux Toolkit, Ant Design v4.x.
  • Frontend Storefront: Next.js v12.2.0 (hỗ trợ SSR, Dynamic Routing, Image Optimization).
  • Backend API: Node.js v16.14.0 LTS, Express.js v4.18.1.
  • Database & Search: MongoDB v5.0.8, Mongoose ODM v6.3.0, Elasticsearch v7.17.3, Redis v6.2.6.
  • Giao thức: RESTful JSON, OAuth 2.0 (RFC 6749), Webhook (HMAC-SHA256 Signature).

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

// Collection: tokens (Lưu trữ ủy quyền OAuth 2.0)
{
  "_id": "ObjectId",
  "userId": "ObjectId (ref: User)",
  "platform": "tiktok_shop | lazada",
  "shopId": "String",
  "accessToken": "String",
  "refreshToken": "String",
  "expiresIn": 604800,
  "refreshTokenExpiresIn": 2592000,
  "createdAt": "ISODate",
  "updatedAt": "ISODate"
}

// Collection: linkedData (Ánh xạ sản phẩm đa sàn)
{
  "_id": "ObjectId",
  "funimartProductId": "ObjectId (ref: products)",
  "platform": "tiktok_shop",
  "platformProductId": "String",
  "platformSkuId": "String",
  "ctvId": "ObjectId (ref: User)",
  "syncStatus": "ACTIVE | OUT_OF_STOCK | ERROR",
  "lastSyncedAt": "ISODate"
}

// Collection: shopLayoutData (Cấu hình website CTV)
{
  "_id": "ObjectId",
  "ctvId": "ObjectId (ref: User)",
  "subdomain": "String (Unique, Index)",
  "shopTitle": "String",
  "metaDescription": "String",
  "bannerUrl": "String",
  "socialLinks": {
    "facebook": "String",
    "zalo": "String",
    "tiktok": "String"
  },
  "isActive": true
}

Methodology

Dự án áp dụng quy trình phát triển phần mềm linh hoạt (Agile/Scrum) với chu kỳ Sprint kéo dài 2 tuần. Toàn bộ tiến trình thực hiện trải qua 4 giai đoạn chính:

[ Phase 1: Phân tích & Đặc tả ] ──> [ Phase 2: R&D & Thiết kế ] ──> [ Phase 3: Hiện thực & Tích hợp ] ──> [ Phase 4: Kiểm thử & Deploy ]
  • Khảo sát nghiệp vụ CTV/NCC         • Thiết kế OAuth2 & Webhooks       • Code Backend APIs (Node.js)       • Unit/Integration Testing
  • Lập ma trận MoSCoW                 • Thiết kế Elasticsearch Index     • Setup Elasticsearch Cluster       • Load Testing (k6/JMeter)
  • Đặc tả 12 Use Cases                • Thiết kế kiến trúc Next.js SSR   • Xây dựng Web Storefront (Next.js) • UAT với 150 CTV thực tế

Đánh giá và kiểm soát rủi ro:

  • Rủi ro vượt ngưỡng giới hạn tần suất (API Rate Limit) của sàn TMĐT: Giải pháp là đưa toàn bộ tác vụ đẩy dữ liệu vào Redis Message Queue với cơ chế Exponential Backoff Retry.
  • Rủi ro bảo mật dữ liệu Webhook giả mạo: Bắt buộc kiểm tra chuỗi băm HMAC-SHA256 trên HTTP Header của mọi Request trước khi chuyển tiếp vào tầng Controller.

Implementation và kết quả

Development process

1. Module tích hợp TikTok Shop qua giao thức OAuth 2.0

Quá trình xác thực bắt đầu khi CTV yêu cầu liên kết tài khoản. Funimart phát sinh một chuỗi state ngẫu nhiên lưu trong Redis để chống tấn công CSRF, sau đó điều hướng người dùng sang TikTok Shop Authorization Server. Khi người dùng cấp quyền, TikTok Shop trả về authorization_code qua Redirect URI. Hệ thống Backend của Funimart sử dụng mã này để lấy cặp access_tokenrefresh_token.

// Implementation: Trao đổi Authorization Code lấy Access Token từ TikTok Shop API
const axios = require('axios');
const crypto = require('crypto');

async function exchangeTikTokShopAuthCode(authCode, stateCode) {
  const appKey = process.env.TIKTOK_APP_KEY;
  const appSecret = process.env.TIKTOK_APP_SECRET;
  const tokenUrl = 'https://auth.tiktok-shops.com/api/v2/token/get';

  const params = {
    app_key: appKey,
    auth_code: authCode,
    grant_type: 'authorized_code'
  };

  // Tính toán chữ ký Signature theo chuẩn TikTok Open Platform
  const sortedParams = Object.keys(params).sort().map(key => `${key}${params[key]}`).join('');
  const signBase = `${appSecret}${sortedParams}${appSecret}`;
  const signature = crypto.createHmac('sha256', appSecret).update(signBase).digest('hex');

  try {
    const response = await axios.get(tokenUrl, {
      params: { ...params, sign: signature }
    });

    if (response.data.code === 0) {
      const { access_token, refresh_token, access_token_expire_in } = response.data.data;
      return {
        success: true,
        tokens: {
          accessToken: access_token,
          refreshToken: refresh_token,
          expiresIn: access_token_expire_in
        }
      };
    }
    throw new Error(`TikTok Auth Error: ${response.data.message}`);
  } catch (error) {
    console.error('Failed to exchange auth token:', error.message);
    throw error;
  }
}

2. Module tiếp nhận và xác thực Webhook đơn hàng tự động

Để bảo mật dữ liệu tiếp nhận từ các sàn TMĐT, tầng Middleware sử dụng thuật toán băm mật mã HMAC-SHA256 để kiểm định chữ ký điện tử được gắn kèm trên Request Header, đảm bảo tính toàn vẹn và ngăn chặn các cuộc tấn công giả mạo nguồn phát (Spoofing attacks).

// Middleware: Xác thực chữ ký Webhook từ sàn TMĐT
function verifyWebhookSignature(req, res, next) {
  const signature = req.headers['x-tiktok-shop-signature'];
  const appSecret = process.env.TIKTOK_APP_SECRET;
  const rawBody = JSON.stringify(req.body);

  if (!signature) {
    return res.status(401).json({ error: 'Missing webhook signature header' });
  }

  const calculatedSignature = crypto
    .createHmac('sha256', appSecret)
    .update(rawBody)
    .digest('hex');

  if (crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(calculatedSignature))) {
    return next(); // Chữ ký hợp lệ, đẩy dữ liệu vào Queue xử lý đơn hàng
  }

  return res.status(403).json({ error: 'Invalid webhook signature' });
}

3. Module tìm kiếm nâng cao với Elasticsearch

Hệ thống chuyển đổi từ tìm kiếm truyền thống của MongoDB sang Elasticsearch với mô hình Inverted Index. Cụm Elasticsearch được cấu hình các bộ phân tích tiếng Việt (Vietnamese Analyzer), loại bỏ dấu phụ, hỗ trợ tìm kiếm mờ (Fuzzy matching) với khoảng cách Levenshtein bằng 1-2 ký tự:

// Query DSL: Tìm kiếm sản phẩm theo tên, danh mục và khoảng giá hoa hồng
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "giày sneaker nam tăng chiều cao",
            "fields": ["productName^3", "description^1", "categoryName^2"],
            "fuzziness": "AUTO",
            "operator": "and"
          }
        }
      ],
      "filter": [
        { "term": { "status": "ACTIVE" } },
        { "range": { "commissionRate": { "gte": 15 } } }
      ]
    }
  },
  "highlight": {
    "fields": {
      "productName": {}
    }
  }
}

4. Khởi tạo Website bán hàng tự động cho CTV (Next.js SSR)

Hệ thống tận dụng Server-Side Rendering của Next.js để dựng trang web cá nhân hóa dựa trên Subdomain của CTV (https://[subdomain].funimart.vn), giúp tối ưu hóa siêu dữ liệu SEO (OpenGraph, JSON-LD) cho từng sản phẩm của từng CTV cụ thể:

// Page: [subdomain]/products/[slug].jsx (Next.js Server-Side Data Fetching)
export async function getServerSideProps(context) {
  const { req, params } = context;
  const host = req.headers.host || '';
  const subdomain = host.split('.')[0]; // Trích xuất mã định danh CTV từ hostname
  const { slug } = params;

  try {
    const [shopRes, productRes] = await Promise.all([
      fetch(`${process.env.INTERNAL_API_URL}/api/v1/public/store/${subdomain}`),
      fetch(`${process.env.INTERNAL_API_URL}/api/v1/public/products/${slug}`)
    ]);

    const shopData = await shopRes.json();
    const productData = await productRes.json();

    if (!shopData.exists || !productData.exists) {
      return { notFound: true };
    }

    return {
      props: {
        shop: shopData.data,
        product: productData.data,
        seo: {
          title: `${productData.data.name} - Cửa hàng ${shopData.data.shopTitle}`,
          description: productData.data.shortDescription,
          ogImage: productData.data.thumbnailUrl
        }
      }
    };
  } catch (error) {
    return { notFound: true };
  }
}

Testing và validation

Quá trình kiểm thử được triển khai toàn diện qua 3 tầng: Unit Test (kiểm thử đơn vị), Integration Test (kiểm thử tích hợp các webhook flow), và Performance/Load Test (kiểm thử hiệu năng bằng k6).

+-------------------------------------------------------------------------------+
|                       KẾT QUẢ BENCHMARK TÌM KIẾM SẢN PHẨM                     |
+--------------------------+---------------------+------------------------------+
| Chỉ số đo lường          | MongoDB Text Search | Elasticsearch Cluster (Mới)  |
+--------------------------+---------------------+------------------------------+
| Response Time (p95)      | 1,240 ms            | 68 ms (Nhanh hơn ~18 lần)    |
| Xử lý tiếng Việt gõ sai  | Không hỗ trợ (0%)   | Khớp chính xác 94.6% kết quả |
| Throughput (Req/sec)     | 120 rps (CPU 88%)   | 2,400 rps (CPU 32%)          |
+--------------------------+---------------------+------------------------------+
  • Độ bao phủ kiểm thử (Test Coverage): Đạt 86.4% trên toàn bộ các Controller và Package nghiệp vụ trọng yếu (tính bằng Jest và Supertest).
  • Tải kiểm thử Webhook: Giả lập 500 yêu cầu Webhook tạo đơn hàng đồng thời từ TikTok Shop; hệ thống Redis Queue phân phối xử lý 100% không mất mát dữ liệu, độ trễ ghi nhận vào MongoDB trung bình là 1.12 giây.

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

Hệ thống đã triển khai thành công lên môi trường Staging và Production, giải quyết trọn vẹn các bài toán nghiệp vụ ban đầu:

[ Kế hoạch ban đầu ]                     [ Kết quả triển khai thực tế ]
├── 1. Tích hợp TikTok Shop & Lazada  ──> Hoàn thành 100% (OAuth 2.0 + Webhook)
├── 2. Đồng bộ sản phẩm 2 chiều       ──> Hoàn thành 100% (API Queue, độ trễ < 2s)
├── 3. Tạo Web bán hàng cho CTV       ──> Hoàn thành 100% (Next.js SSR Subdomains)
├── 4. Nâng cấp Search Engine         ──> Hoàn thành 100% (Elasticsearch 7.17.3)
└── 5. Tự động hóa quy trình RMA      ──> Hoàn thành 100% (Khấu trừ/Hoàn tiền ví)
  • Mức độ hài lòng của CTV: Khảo sát trên 150 CTV tích cực cho thấy 92.8% đánh giá cao tính năng tự động đồng bộ đơn hàng và tạo website cá nhân.
  • Tỷ lệ giảm thiểu thời gian thao tác: Tiết kiệm trung bình 85% thời gian xử lý đơn mỗi ngày cho một CTV có từ 20 đơn hàng/ngày trở lên.

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

  1. Kiến trúc Multi-tenant Subdomain Storefront bằng Next.js SSR: Thay vì yêu cầu CTV phải mua tên miền và lưu trữ tốn kém, Funimart tự động phân bổ Subdomain độc lập với cấu hình Metadata SEO động, giúp sản phẩm của CTV được lập chỉ mục Google nhanh gấp 3 lần so với mô hình Single Page Application (SPA) truyền thống.
  2. Hệ thống chuyển đổi định dạng dữ liệu (Payload Translation Layer): Xây dựng bộ Interface chuẩn hóa cấu trúc dữ liệu đơn hàng và sản phẩm giữa các sàn TMĐT có cấu trúc API khác biệt (TikTok Shop API và Lazada Open API) về một định dạng JSON thống nhất trong cơ sở dữ liệu Funimart.
  3. Cơ chế phân mảnh chỉ mục (Sharding & Replication) tối ưu cho tiếng Việt: Xây dựng cấu hình Cluster Elasticsearch gồm 5 Primary Shards và 1 Replica Shard kết hợp Custom Analyzers, giải quyết triệt để bài toán tìm kiếm mờ không dấu/có dấu trong ngành bán lẻ.
  4. Hiệu quả định lượng:
    • Giảm 98% sai sót nhập liệu thông tin địa chỉ giao hàng và số điện thoại khách hàng.
    • Nâng tỷ lệ chuyển đổi đơn hàng qua mạng xã hội thêm 23.5% nhờ việc điều hướng khách hàng từ bài đăng sang Website bán hàng tự động thay vì nhắn tin thủ công.

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

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

  1. Đồng bộ đơn hàng: Một khách hàng đặt mua áo thun trên kênh TikTok Shop của CTV A. TikTok Shop bắn Webhook chứa mã đơn hàng đến Funimart API. Hệ thống Funimart xác thực chữ ký, lấy chi tiết đơn, kiểm tra tồn kho của NCC, tạo đơn tương ứng trên Funimart và thông báo cho NCC đóng gói.
  2. Quy trình hoàn trả hàng (RMA): Khách hàng nhận sản phẩm lỗi yêu cầu đổi trả. CTV bấm "Tạo đơn hoàn trả" trên Dashboard. NCC duyệt yêu cầu; hệ thống Funimart tự động điều phối đơn vị vận chuyển lấy hàng từ khách trả về kho NCC, đồng thời khóa tiền hàng trong ví điện tử của NCC và thu hồi phần hoa hồng tương ứng của CTV khi hàng về kho an toàn.
[ Khách hàng ] ──(Đặt hàng)──> [ TikTok Shop ] ──(Webhook)──> [ Funimart Backend ]
                                                                      │
                                                            (Tự động tạo đơn)
                                                                      ▼
[ Đơn vị vận chuyển ] <──(Lấy hàng)── [ NCC Kho ] <──(Duyệt đơn)──────┘

Chiến lược triển khai hạ tầng

Hệ thống được đóng gói thông qua Docker Containers và điều phối bằng Docker Compose/NGINX Reverse Proxy trên máy chủ Ubuntu Linux 20.04 LTS:

  • Web Server: NGINX xử lý SSL Termination, Load Balancing và định tuyến Subdomain wildcard (*.funimart.vn).
  • Node.js App: Chạy dưới tiến trình PM2 Cluster Mode tận dụng tối đa số lượng CPU Cores.
  • Elasticsearch: Cấu hình Heap Size 4GB RAM với bộ nhớ ảo vm.max_map_count=262144.
                  +-----------------------------------+
                  |  NGINX Reverse Proxy (Wildcard)   |
                  |  SSL (*.funimart.vn)              |
                  +-----------------------------------+
                       /                    \
                      /                      \
                     ▼                        ▼
        +-----------------------+   +-----------------------+
        | Next.js SSR App       |   | Express API (Node.js) |
        | (Port 3000 - PM2)     |   | (Port 5000 - PM2)     |
        +-----------------------+   +-----------------------+
                                                │
                     ┌──────────────────────────┼──────────────────────────┐
                     ▼                          ▼                          ▼
        +-----------------------+   +-----------------------+   +-----------------------+
        | MongoDB 5.0 (Replica) |   | Elasticsearch 7.17    |   | Redis 6.2 (Queue/Mem) |
        +-----------------------+   +-----------------------+   +-----------------------+

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

Hạn chế kỹ thuật

  1. Kiến trúc Monolith: Mặc dù được phân lớp rõ ràng, backend vẫn nằm trong một khối mã nguồn duy nhất (Monolith), gây khó khăn khi cần mở rộng độc lập các module chịu tải cao như Webhook Receiver.
  2. Phụ thuộc API bên thứ ba: Khi API của TikTok Shop hoặc Lazada thay đổi cấu trúc phiên bản hoặc gặp sự cố gián đoạn (Downtime), quy trình đồng bộ có thể bị nghẽn trong Queue.
  3. Chưa hỗ trợ sàn Shopee: Do rào cản chính sách kiểm duyệt Developer App ngặt nghèo từ Shopee Open Platform tại thời điểm triển khai, hệ thống mới chỉ hoàn thiện tích hợp sâu với Lazada và TikTok Shop.

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

  • Chuyển dịch phân rã module Webhook và Sync Service sang kiến trúc Microservices hướng sự kiện (Event-Driven Microservices với Apache Kafka).
  • Tích hợp thêm sàn Shopee, Tiki và các giải pháp vận chuyển đa kênh (Giao Hàng Nhanh, Viettel Post API).
  • Ứng dụng trí tuệ nhân tạo (AI/LLM) để tự động tạo nội dung mô tả sản phẩm (Product Description Generator) và tối ưu hóa từ khóa SEO cho Website bán hàng của CTV.

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

  • Sinh viên & Người học ngành Hệ thống thông tin / Kỹ thuật phần mềm: Đồ án cung cấp mô hình mẫu hoàn chỉnh về cách áp dụng kiến trúc Redux, Next.js SSR Subdomain, Elasticsearch Cluster và chuẩn xác thực OAuth 2.0 trong các bài toán thương mại điện tử thực tế.
  • Lập trình viên (Developers): Tham khảo kiến trúc mã nguồn sạch (Clean Architecture), kỹ thuật xử lý hàng đợi bất đồng bộ với Redis Queue, và cơ chế xác thực chữ ký bảo mật Webhook HMAC-SHA256.
  • Doanh nghiệp TMĐT & Chủ shop (NCC / CTV): Sở hữu giải pháp vận hành dropshipping tự động hóa, cắt giảm 85% chi phí nhân sự nhập liệu đơn hàng, nâng cao tốc độ xoay vòng vốn thông qua ví điện tử nội bộ.
  • Nhà nghiên cứu: Nguồn dữ liệu thực nghiệm về việc so sánh hiệu năng giữa cơ sở dữ liệu NoSQL truyền thống và Search Engine chuyên dụng khi xử lý tiếng Việt có dấu.

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

1. Yêu cầu cấu hình phần cứng tối thiểu để triển khai toàn bộ hệ thống là gì?

Máy chủ Linux (Ubuntu 20.04 LTS trở lên) cần tối thiểu 4 vCPU, 8GB RAM (trong đó dành tối thiểu 4GB RAM cho JVM của Elasticsearch) và 80GB ổ cứng SSD NVMe để đảm bảo tốc độ đọc ghi dữ liệu chỉ mục và log thời gian thực.

2. Khi token truy cập (Access Token) của TikTok Shop hết hạn, hệ thống xử lý như thế nào?

Hệ thống sử dụng một tác vụ định kỳ (Cron Job) quét các Token sắp hết hạn trong bảng tokens (trước 24 giờ). Hệ thống sẽ tự động gọi API làm mới bằng refresh_token mà không làm gián đoạn bất kỳ thao tác nào của CTV.

3. Làm thế nào để đảm bảo tính duy nhất và bảo mật cho Subdomain của từng CTV?

Trường subdomain trong bảng shopLayoutData được cấu hình ràng buộc Unique Index trong MongoDB. Tầng Middleware của Next.js sẽ kiểm tra tính hợp lệ của Subdomain theo danh sách Regex hợp chuẩn trước khi truy vấn dữ liệu từ API Gateway.

4. Cơ chế giải quyết xung đột khi sản phẩm bị xóa trên Funimart nhưng vẫn còn trên TikTok Shop?

Khi sản phẩm bị xóa hoặc tạm khóa trên Funimart, hệ thống sẽ kích hoạt một sự kiện xóa logic (Soft Delete), đồng thời đẩy một công việc vào Queue để gọi API sang TikTok Shop cập nhật trạng thái sản phẩm đó về dạng UNLISTED hoặc gán số lượng tồn kho (Quantity) bằng 0.

5. Chi phí duy trì hệ thống và thời gian hoàn vốn (ROI) ước tính?

Chi phí vận hành cụm Cloud Server (Backend, DB, Elasticsearch) dao động khoảng 1.500.000 - 2.500.000 VNĐ/tháng. Với mức cắt giảm nhân sự xử lý đơn và mức tăng trưởng doanh số từ mạng lưới CTV, điểm hòa vốn (ROI) dự kiến đạt được sau 3-5 tháng vận hành chính thức.


Kết luận

Khóa luận tốt nghiệp "Bổ sung chức năng và cải tiến quy trình cho sàn thương mại điện tử Funimart" của sinh viên Đồng Hữu Hiếu đã hoàn thành xuất sắc các mục tiêu nghiên cứu và ứng dụng thực tiễn. Đề tài không chỉ dừng lại ở mặt lý thuyết thiết kế hệ thống thông tin mà đã trực tiếp giải quyết các bài toán "nóng" của thị trường Social Commerce thông qua việc:

  • Chuẩn hóa và tự động hóa quy trình kết nối đa kênh với TikTok Shop và Lazada bằng OAuth 2.0 và Webhooks bảo mật.
  • Đưa công nghệ Server-Side Rendering (Next.js) và Search Engine phân tán (Elasticsearch) vào giải quyết triệt để bài toán trải nghiệm người dùng, tiếp thị tự động và tối ưu hóa công cụ tìm kiếm tiếng Việt.
  • Khép kín vòng tròn vận hành Dropshipping từ khâu tìm nguồn hàng, quản lý đơn hàng, theo dõi giao vận đến quy trình trả hàng/hoàn tiền minh bạch trên ví điện tử.

Kết quả của đề tài là minh chứng rõ nét cho năng lực ứng dụng công nghệ phần mềm hiện đại vào việc tối ưu hóa năng suất lao động và mở rộng quy mô kinh doanh số trong kỷ nguyên kinh tế 4.0.