Giới thiệu dự án

Thị trường giao đồ ăn trực tuyến (Online Food Delivery) tại Việt Nam và khu vực Đông Nam Á chứng kiến sự tăng trưởng vượt bậc với tốc độ tăng trưởng kép hàng năm (CAGR) đạt xấp xỉ 17.5% giai đoạn 2020–2025. Nhu cầu tiêu dùng số hóa tăng mạnh thúc đẩy sự chuyển dịch mô hình vận hành của các cửa hàng F&B truyền thống sang nền tảng bán hàng đa kênh. Tuy nhiên, các giải pháp thương mại hiện tại đòi hỏi chi phí chiết khấu cao (lên đến 20–30% trên mỗi đơn hàng) và chi phí duy trì hạ tầng phức tạp, gây rào cản lớn cho các doanh nghiệp vừa và nhỏ (SMBs) cũng như các hộ kinh doanh cá thể.

Đồ án tốt nghiệp "Xây dựng ứng dụng Mobile Food Delivery" của tác giả Bùi Trung Hiếu (Ngành Kỹ thuật Phần mềm, Trường Đại học Công nghệ Thông tin và Truyền thông – Đại học Thái Nguyên, dưới sự hướng dẫn của ThS. Nguyễn Lan Oanh) tập trung giải quyết triệt để bài toán đồng bộ luồng dữ liệu phân tán giữa ba thực thể độc lập: Khách hàng (Buyer), Cửa hàng (Seller)Tài xế (Shipper), cùng hệ thống điều hành Quản trị viên (Admin).

Mục tiêu dự án

  1. Xây dựng hệ sinh thái di động hoàn chỉnh: Phát triển 03 ứng dụng mobile native-like độc lập chạy trên nền tảng Android/iOS và 01 cổng Web Admin quản trị tập trung từ một cơ sở mã nguồn (Single Codebase).
  2. Đồng bộ hóa dữ liệu thời gian thực (Real-time Synchronization): Tối ưu hóa độ trễ cập nhật trạng thái đơn hàng (Order State Machine) dưới 500ms giữa Khách hàng, Cửa hàng và Tài xế.
  3. Tích hợp dịch vụ bản đồ và định tuyến (GIS Navigation): Nhúng Google Maps SDK và Location API để tính toán tọa độ, hỗ trợ tài xế tìm đường và tối ưu hóa thời gian giao nhận thực tế.
  4. Chuẩn hóa quy trình kỹ thuật phần mềm: Áp dụng mô hình phân tích thiết kế hệ thống hướng đối tượng qua hệ thống biểu đồ UML (Use Case, Sequence Diagram) và đặc tả chi tiết 12 Use Case cốt lõi.

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

  • Phạm vi triển khai: Ứng dụng Client tập trung nền tảng Android (hỗ trợ từ Android 8.0 Oreo - API Level 26 trở lên); nền tảng quản trị Web Portal phục vụ giám sát tập trung.
  • Giới hạn kỹ thuật: Chưa tích hợp cổng thanh toán trực tuyến bên thứ ba (VNPay, MoMo, ZaloPay); quy trình thanh toán chính dựa trên phương thức thu tiền hộ (COD - Cash on Delivery).

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

Phân tích hiện trạng và yêu cầu người dùng

Các nền tảng giao đồ ăn thương mại hiện nay sở hữu hệ sinh thái đồ sộ nhưng gặp rào cản về độ phức tạp khi tùy biến và chi phí tài nguyên:

Tiêu chí so sánh Ứng dụng Food Delivery Đề xuất Nền tảng Thương mại Lớn (Grab/Shopee) Giải pháp POS Truyền thống
Chi phí triển khai Rất thấp (Serverless Firebase BaaS) Rất cao (Chiết khấu 20 - 30%/đơn) Trung bình (Chi phí thiết bị phần cứng)
Kiến trúc mã nguồn Single Codebase (Flutter 3.x) Native Codebase riêng lẻ cho từng OS Client-Server On-Premise
Độ trễ đồng bộ < 300ms qua WebSocket/Realtime NoSQL < 200ms qua hạ tầng Microservices Không hỗ trợ thời gian thực
Độ phức tạp tích hợp Tinh gọn, dễ bảo trì cho SMBs Phức tạp, phụ thuộc quy chuẩn riêng Đòi hỏi quản trị mạng nội bộ

Hệ thống phân rã yêu cầu chức năng theo ma trận ưu tiên MoSCoW:

  • Must-have (Bắt buộc): Xác thực đa vai trò (Firebase Auth), Quản lý thực đơn & danh mục món ăn, Quy trình đặt hàng - xác nhận - đóng gói - giao hàng, Định vị Google Maps.
  • Should-have (Cần có): Thống kê doanh thu theo thời gian thực cho Cửa hàng và Tài xế, Quản lý lịch sử đơn hàng chi tiết, Tìm kiếm món ăn theo từ khóa.
  • Could-have (Có thể thêm): Đánh giá món ăn, Lọc nâng cao theo bán kính vị trí.
  • Won't-have (Chưa thực hiện): Thuật toán phân bổ cuốc tự động bằng AI, Tích hợp cổng thanh toán quốc tế đa tiền tệ.

Thiết kế kiến trúc và mô hình dữ liệu

Hệ thống áp dụng kiến trúc Serverless Client-BaaS Architecture dựa trên nền tảng Google Cloud và Firebase:

[Flutter UI Layer: View / Widgets / Material 3]
[State Management Layer: Provider / Streams]
[Data Layer: Repositories & Services]
[Firebase Auth]      [Firebase Realtime DB]     [Google Maps SDK API]
- Token Verification  - Reactive JSON Nodes      - Direction Matrix
- Role Claim (RBAC)   - WebSocket Connection     - Geolocation Tracking
  • Ngôn ngữ và Framework: Flutter SDK version 3.19.x, Dart SDK version 3.3.x.
  • Môi trường phát triển: Android Studio Hedgehog (2023.1.1) / Iguana, Android SDK Tools (API 34).
  • Cơ sở dữ liệu: Firebase Realtime Database (NoSQL JSON tree) kết hợp Firebase Cloud Storage lưu trữ tài nguyên hình ảnh đồ ăn.
{
  "users": {
    "buyer_uid_01": {
      "name": "Nguyen Van A",
      "email": "vana@gmail.com",
      "role": "buyer",
      "addresses": {
        "addr_01": {
          "addressLine": "123 Luong Ngoc Quyen, TP. Thai Nguyen",
          "latitude": 21.5927,
          "longitude": 105.8442
        }
      }
    }
  },
  "sellers": {
    "seller_uid_01": {
      "storeName": "Quan An Ngon Thai Nguyen",
      "address": "45 Hoang Van Thu",
      "totalEarnings": 1250000,
      "menus": {
        "menu_cat_01": {
          "categoryName": "Com Van Phong",
          "items": {
            "item_01": {
              "title": "Com Suon Nuong",
              "price": 45000,
              "imageUrl": "https://firebasestorage.googleapis.com/.../item_01.jpg",
              "status": "available"
            }
          }
        }
      }
    }
  },
  "orders": {
    "order_id_1001": {
      "buyerId": "buyer_uid_01",
      "sellerId": "seller_uid_01",
      "shipperId": "shipper_uid_01",
      "orderStatus": "packed", 
      "totalAmount": 90000,
      "items": [
        {"itemId": "item_01", "quantity": 2, "unitPrice": 45000}
      ],
      "deliveryAddress": "123 Luong Ngoc Quyen, TP. Thai Nguyen",
      "createdAt": 1716508800000
    }
  }
}

Phương pháp luận phát triển và đảm bảo chất lượng

Dự án áp dụng mô hình Agile/Scrum rút gọn, chia làm 4 giai đoạn (Sprints):

  1. Sprint 1 (Khảo sát & Thiết kế): Xây dựng biểu đồ Use Case, Sequence Diagram cho 3 vai trò người dùng; thiết kế kiến trúc NoSQL schema.
  2. Sprint 2 (Core Modules & Authentication): Triển khai Base UI Widget tree, tích hợp Firebase Authentication và phân quyền truy cập (RBAC).
  3. Sprint 3 (Business Logic & Map Integration): Lập trình State Machine quản lý vòng đời đơn hàng, tích hợp Google Maps API và Firebase Realtime Streams.
  4. Sprint 4 (Testing & Hardening): Kiểm thử tải, tối ưu bộ nhớ heap của Flutter, đóng gói và xuất bản file cài đặt Android Package (.apk).

Implementation và kết quả

Chi tiết giải thuật và mã nguồn tiêu biểu

Hạt nhân của hệ sinh thái là Cơ chế chuyển đổi trạng thái đơn hàng thời gian thực (Order Lifecycle State Machine). Mô hình này đảm bảo tính nhất quán dữ liệu giữa 3 client mobile mà không phát sinh xung đột race-condition:

Dưới đây là module xử lý chuyển trạng thái đơn hàng và phát luồng dữ liệu (Stream) viết bằng Dart trên Flutter:

import 'package:firebase_database/firebase_database.dart';

enum OrderStatus { placed, accepted, packed, delivering, completed, cancelled }

class OrderRepository {
  final DatabaseReference _dbRef = FirebaseDatabase.instance.ref();

  // Stream lắng nghe thay đổi đơn hàng thời gian thực cho Shipper/Buyer
  Stream<DatabaseEvent> getOrderStream(String orderId) {
    return _dbRef.child('orders').child(orderId).onValue;
  }

  // Cập nhật trạng thái đơn hàng: Seller xác nhận đóng gói xong
  Future<bool> updateOrderToPacked({
    required String orderId,
    required String sellerId,
  }) async {
    try {
      final orderRef = _dbRef.child('orders').child(orderId);
      final snapshot = await orderRef.get();

      if (snapshot.exists) {
        final data = Map<String, dynamic>.from(snapshot.value as Map);
        if (data['sellerId'] == sellerId && data['orderStatus'] == 'placed') {
          await orderRef.update({
            'orderStatus': 'packed',
            'updatedAt': ServerValue.timestamp,
          });
          return true;
        }
      }
      return false;
    } catch (e) {
      print('Lỗi cập nhật trạng thái đơn hàng: $e');
      return false;
    }
  }

  // Shipper tiếp nhận đơn hàng cần giao
  Future<bool> claimOrderForDelivery({
    required String orderId,
    required String shipperId,
  }) async {
    final orderRef = _dbRef.child('orders').child(orderId);
    final transactionResult = await orderRef.runTransaction((mutableData) {
      if (mutableData == null) {
        return Transaction.abort();
      }
      final orderMap = Map<String, dynamic>.from(mutableData as Map);
      if (orderMap['orderStatus'] == 'packed' && orderMap['shipperId'] == null) {
        orderMap['orderStatus'] = 'delivering';
        orderMap['shipperId'] = shipperId;
        return Transaction.success(orderMap);
      }
      return Transaction.abort();
    });

    return transactionResult.committed;
  }
}

Mã nguồn quản lý giỏ hàng và tính toán tổng tiền phía Client:

class CartItem {
  final String foodId;
  final String foodTitle;
  final double price;
  int quantity;

  CartItem({
    required this.foodId,
    required this.foodTitle,
    required this.price,
    this.quantity = 1,
  });
}

class CartManager {
  final Map<String, CartItem> _items = {};

  Map<String, CartItem> get items => {..._items};

  double get totalAmount {
    return _items.values.fold(0.0, (sum, item) => sum + (item.price * item.quantity));
  }

  void addItem(String foodId, String title, double price) {
    if (_items.containsKey(foodId)) {
      _items[foodId]!.quantity += 1;
    } else {
      _items[foodId] = CartItem(foodId: foodId, foodTitle: title, price: price);
    }
  }

  void removeItem(String foodId) {
    _items.remove(foodId);
  }
}

Kiểm thử và kết quả đo lường thực nghiệm

Hệ thống được kiểm thử tự động (Unit Test / Widget Test) và kiểm thử thực tế trên 5 thiết bị vật lý chạy các phiên bản Android khác nhau (Xiaomi Redmi Note 11 - Android 12, Samsung Galaxy S21 - Android 13, Google Pixel 4a - Android 11):

Tiêu chí Kiểm thử / Metric Giá trị Mục tiêu ban đầu Kết quả Đo kiểm Thực tế Đánh giá
Thời gian khởi động ứng dụng (Cold Start) < 2.5s 1.42s Vượt 43.2%
Tốc độ khung hình giao diện (UI FPS) 60 fps ổn định 58.6 - 60.0 fps (Skia Engine) Đạt chuẩn mượt mà
Độ trễ cập nhật trạng thái đơn (Sync Latency) < 500ms 185ms (mạng 4G/WiFi) Vượt 63.0%
Tỷ lệ tiêu thụ RAM trung bình < 180MB 118MB - 145MB Tối ưu tốt
Độ phủ kiểm thử logic (Code Coverage) > 75% 82.4% cho Core Services Đạt tiêu chuẩn
Mức độ hài lòng người dùng (UAT - CSAT) > 85% 91.5% (Khảo sát 30 người dùng) Xuất sắc
Tốc độ phản hồi và Đồng bộ trạng thái đơn hàng (Mili-giây)

Đổi mới và đóng góp kỹ thuật

  1. Kiến trúc Multi-App đồng nhất trên nền tảng Flutter Single Codebase: Thay vì phát triển 3 dự án riêng biệt gây trùng lặp mã nguồn, tác giả đã tổ chức cấu trúc mã nguồn theo hướng Modular Package. Các module dùng chung (Shared Core Data Models, Network Utilities, Auth Handler) được tái sử dụng đến 68% trên cả 3 ứng dụng dành cho Người mua, Người bán và Tài xế.
  2. Cơ chế Transaction NoSQL giải quyết bài toán tranh chấp nhận đơn: Sử dụng cơ chế runTransaction của Firebase Database thay cho cơ chế ghi tuần tự thông thường, ngăn chặn triệt để tình trạng hai tài xế nhận cùng một cuốc giao hàng tại cùng một thời điểm khi kết nối mạng không ổn định.
  3. Mô hình hóa hệ thống chuẩn UML cho đồ án phần mềm ứng dụng: Cung cấp hệ thống 12 bảng đặc tả Use Case chi tiết và 17 biểu đồ trình tự (Sequence Diagrams) mô tả tường minh tương tác giữa các lớp phân tầng, tạo tài liệu quy chuẩn kỹ thuật cho sinh viên và lập trình viên tham khảo.

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

Kịch bản vận hành thực tế (End-to-End Workflow)

  • Giai đoạn 1: Khách hàng mở ứng dụng, tìm kiếm "Cơm sườn", chọn địa chỉ giao hàng tại Thái Nguyên và nhấn "Đặt hàng".
  • Giai đoạn 2: Đơn hàng xuất hiện ngay lập tức trên màn hình ứng dụng Người bán qua kênh Stream NoSQL. Người bán kiểm tra món, bấm "Xác nhận" và bắt đầu chế biến, sau đó bấm "Đã đóng gói đơn hàng xong".
  • Giai đoạn 3: Ứng dụng Người giao hàng hiển thị thông báo đơn hàng mới khả dụng trong bán kính gần. Tài xế bấm "Nhận đơn", kích hoạt chỉ đường Google Maps tới quán lấy đồ ăn và di chuyển tới địa chỉ khách hàng.
  • Giai đoạn 4: Tài xế bàn giao hàng và bấm "Giao hàng thành công". Hệ thống tự động cộng doanh thu vào ví của Cửa hàng và Tài xế.

Yêu cầu cấu hình triển khai hệ thống

  • Môi trường Client (Thiết bị người dùng):
    • Hệ điều hành Android 8.0 (Oreo) trở lên.
    • RAM tối thiểu 2GB (Khuyến nghị 3GB+).
    • Tích hợp GPS/Location Services và kết nối Internet (3G/4G/5G/Wi-Fi).
  • Môi trường Server (Google Cloud / Firebase):
    • Kích hoạt dịch vụ Firebase Authentication với Email/Password Provider.
    • Thiết lập Firebase Realtime Database quy tắc bảo mật (Security Rules) theo auth.uid.
    • Đăng ký Google Cloud Console API Key hỗ trợ Maps SDK for Android và Places API.

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

Hạn chế kỹ thuật hiện tại

  • Cơ chế định tuyến: Phụ thuộc hoàn toàn vào Google Maps API ngoài, chưa tích hợp thuật toán phân cụm địa lý (Geohashing / Spatial Clustering) để gom nhiều đơn hàng cho một tài xế.
  • Phương thức thanh toán: Chưa tích hợp SDK thanh toán ví điện tử trực tuyến hoặc cổng ngân hàng qua mã QR động.
  • Hệ thống đề xuất: Chưa có thuật toán Machine Learning gợi ý món ăn thông minh dựa trên lịch sử hành vi người dùng.

Hướng phát triển nâng cao

  • Giai đoạn 1: Bổ sung cổng thanh toán VNPAY / MoMo API thông qua Firebase Cloud Functions.
  • Giai đoạn 2: Phát triển thuật toán gợi ý món ăn cá nhân hóa ứng dụng mô hình Collaborative Filtering.
  • Giai đoạn 3: Tích hợp giao thức WebRTC cho phép liên lạc thoại và chat trực tiếp miễn phí giữa Khách hàng - Tài xế - Cửa hàng mà không làm lộ số điện thoại cá nhân.

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

  • Sinh viên ngành Kỹ thuật Phần mềm / CNTT: Nắm vững quy trình làm chủ framework Flutter và hệ sinh thái Firebase BaaS; hiểu cách thiết kế biểu đồ UML chuẩn công nghiệp từ Use Case đến Sequence Diagram.
  • Lập trình viên Mobile (Junior Developers): Tiếp cận mô hình kiến trúc State Management phản ứng (Reactive Stream), xử lý xung đột dữ liệu mạng phân tán với NoSQL Transaction.
  • Cửa hàng và Chuỗi F&B vừa/nhỏ: Sở hữu mô hình giải pháp công nghệ tự vận hành giao đồ ăn với chi phí hạ tầng gần như bằng 0, không bị phụ thuộc vào mức chiết khấu cao của các siêu ứng dụng.
  • Nhà nghiên cứu hệ thống phân tán: Tài liệu thực nghiệm về độ trễ, lưu lượng băng thông tiêu thụ và tính ổn định của cơ sở dữ liệu thời gian thực trên mạng di động.

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

1. Ứng dụng có thể triển khai trên iOS mà không cần sửa đổi mã nguồn không?

Có. Nhờ vào kiến trúc đa nền tảng của Flutter, toàn bộ mã nguồn giao diện (Widgets) và tầng nghiệp vụ (Business Logic) có thể biên dịch trực tiếp sang mã máy của iOS thông qua Xcode trên môi trường macOS mà không cần viết lại mã nguồn.

2. Làm thế nào để giải quyết xung đột khi nhiều tài xế cùng bấm nhận một đơn hàng?

Hệ thống sử dụng Firebase Realtime Database Transactions (runTransaction). Cơ chế này khóa dữ liệu ở cấp độ nút (Node-level atomic lock) trong micro-giây, chỉ cấp quyền nhận đơn cho yêu cầu đầu tiên đến máy chủ; các yêu cầu gửi sau sẽ tự động bị từ chối (Abort Transaction) và trả về thông báo đơn đã có người nhận.

3. Chi phí vận hành Firebase cho ứng dụng này khi có nhiều người dùng là bao nhiêu?

Trong giai đoạn thử nghiệm (dưới 100 người dùng đồng thời và 1GB lưu trữ dữ liệu), hệ thống hoạt động hoàn toàn miễn phí trên gói Spark Plan của Firebase. Khi mở rộng quy mô, chi phí chuyển sang gói Blaze Plan (Pay-as-you-go) chỉ tính theo dung lượng đọc/ghi thực tế phát sinh, tiết kiệm hơn 80% so với việc thuê máy chủ Dedicated VPS truyền thống.

4. Hệ thống đảm bảo tính bảo mật của dữ liệu người dùng như thế nào?

Dữ liệu được bảo vệ hai lớp: Xác thực định danh qua Firebase Authentication cấp phát JWT Token và phân quyền truy cập nghiêm ngặt tại cơ sở dữ liệu qua Firebase Database Security Rules. Người dùng chỉ có quyền đọc/ghi dữ liệu thuộc quyền sở hữu của chính họ (auth.uid != null).

5. Yêu cầu phần cứng máy tính để xây dựng và biên dịch dự án là gì?

Máy tính phát triển cần tối thiểu CPU Intel Core i5 / AMD Ryzen 5, RAM 8GB (khuyến nghị 16GB để chạy mượt mà Android Emulator), ổ cứng SSD còn trống tối thiểu 20GB, cài đặt sẵn Flutter SDK và Android Studio.


Kết luận

Đồ án tốt nghiệp "Xây dựng ứng dụng Mobile Food Delivery" của sinh viên Bùi Trung Hiếu dưới sự hướng dẫn khoa học của ThS. Nguyễn Lan Oanh tại Trường Đại học Công nghệ Thông tin và Truyền thông – Đại học Thái Nguyên đã xây dựng thành công một giải pháp công nghệ toàn diện, hiện đại và khả thi cao.

Dự án chứng minh tính hiệu quả vượt trội của việc kết hợp Flutter FrameworkGoogle Firebase Ecosystem trong việc xây dựng hệ sinh thái ứng dụng di động đa vai trò với khả năng đồng bộ thời gian thực xuất sắc (độ trễ dưới 200ms). Đây không chỉ là một công trình học thuật chuẩn mực về phân tích thiết kế phần mềm mà còn là một sản phẩm thực tế có tiềm năng thương mại hóa mạnh mẽ cho các doanh nghiệp dịch vụ ăn uống trong kỷ nguyên chuyển đổi số.