Giới thiệu dự án

Thương mại điện tử (TMĐT) và dịch vụ giao đồ ăn trực tuyến (Food Delivery) đang 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ại thị trường Đông Nam Á đạt trên 25% (giai đoạn 2020–2025). Tuy nhiên, các nhà hàng và chuỗi dịch vụ ăn uống quy mô vừa và nhỏ (SMEs) thường gặp rào cản lớn khi tham gia vào các nền tảng trung gian do chi phí hoa hồng cao (dao động từ 20% đến 30% trên mỗi đơn hàng), cùng sự thiếu đồng bộ trong việc quản lý tập trung ba bên: Khách hàng (User), Cửa hàng (Admin) và Tài xế (Shipper).

Đồ án tốt nghiệp chuyên ngành Công nghệ Phần mềm tại Trường Đại học Sư phạm Kỹ thuật TP.HCM thực hiện bởi sinh viên Phạm Văn Nhất và Phạm Hoàng Phúc, dưới sự hướng dẫn của ThS. Nguyễn Trần Thi Văn, tập trung giải quyết bài toán: Xây dựng hệ sinh thái ứng dụng đặt hàng online toàn diện dựa trên nền tảng Android và hạ tầng đám mây Firebase Realtime Database.

graph TD
    A[Khách hàng / User App] <-->|Đồng bộ giỏ hàng & Đơn hàng| D[(Firebase Realtime Database)]
    B[Cửa hàng / Admin App] <-->|Quản lý Menu & Điều phối Shipper| D
    C[Tài xế / Shipper App] <-->|Cập nhật vị trí GPS & Trạng thái| D
    A <-->|Xác thực SMS OTP| E[Firebase Authentication]
    B <-->|Xác thực tài khoản| E
    C <-->|Xác thực tài khoản| E
    A & B & C <-->|Tải & hiển thị hình ảnh món ăn| F[Firebase Cloud Storage]
    A & C <-->|Định tuyến & Hiển thị bản đồ| G[Google Maps API]

Mục tiêu dự án

  1. Phát triển bộ 3 ứng dụng di động độc lập (Android Native) chuyên biệt hóa theo từng vai trò nghiệp vụ: Khách hàng, Quản trị viên cửa hàng và Tài xế giao hàng.
  2. Xây dựng hệ thống cơ sở dữ liệu thời gian thực (Realtime Synchronization) đảm bảo độ trễ cập nhật trạng thái đơn hàng và định vị tài xế dưới 500ms.
  3. Tối ưu hóa quy trình đặt hàng và điều phối: Giảm thời gian xử lý đơn hàng từ lúc tiếp nhận đến khi phân công tài xế xuống dưới 30 giây.
  4. Tích hợp các dịch vụ đám mây (BaaS - Backend as a Service): Sử dụng Firebase Authentication, Firebase Realtime Database và Firebase Storage nhằm loại bỏ sự phụ thuộc vào máy chủ vật lý truyền thống.
  5. Đảm bảo tính mở và khả năng mở rộng: Cấu trúc ứng dụng module hóa, hỗ trợ nâng cấp thêm các cổng thanh toán điện tử và hệ thống gợi ý món ăn.

Phạm vi và giới hạn hệ thống

  • Nền tảng mục tiêu: Hệ điều hành Android (tương thích từ Android 5.0 Lollipop - API level 21 đến Android 10 - API level 29).
  • Hạ tầng máy chủ: Sử dụng toàn bộ hệ sinh thái Google Firebase Serverless, không tự triển khai custom backend (NodeJS/Java Spring) độc lập.
  • Giới hạn thanh toán: Hỗ trợ phương thức thanh toán tiền mặt khi nhận hàng (COD - Cash on Delivery), tạo nền tảng cho việc tích hợp cổng thanh toán trực tuyến.

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

Phân tích hiện trạng và khảo sát đối thủ

Khảo sát thực tế các nền tảng giao đồ ăn phổ biến tại thị trường Việt Nam năm 2020 mang lại các cơ sở định hình giải pháp kỹ thuật:

Tiêu chí Baemin GrabFood Now (ShopeeFood) Loship Hệ thống Đề xuất
Giao diện & Trải nghiệm Tối giản, tập trung visual Trực quan, tích hợp đa dịch vụ Dữ liệu dày đặc, phong phú Phức tạp, nhiều phân hệ Chuyên biệt 3 ứng dụng riêng, tinh gọn
Độ trễ cập nhật đơn hàng 1 - 3 giây 1 - 2 giây 2 - 4 giây 2 - 5 giây < 500ms (Firebase Websocket)
Phân quyền người dùng Gộp chung User/Merchant Hệ sinh thái app riêng Phân tách app rõ ràng Phân tách app Phân tách tuyệt đối 3 Client
Cơ chế xác thực Phone OTP / Social Phone OTP / Google Phone OTP / Shopee Phone OTP Firebase Phone/Account Auth
Chi phí vận hành Backend Rất cao (Distributed Server) Rất cao (Microservices) Rất cao (Cloud Infrastructure) Trung bình Tối ưu (Google Cloud Free/Pay-as-you-go)

Phân tích yêu cầu người dùng theo mô hình MoSCoW

  • Must-have (Bắt buộc phải có):
    • Khách hàng: Xem danh mục, tìm kiếm món ăn, quản lý giỏ hàng, đặt hàng, xem lịch sử đơn hàng, định vị đơn hàng theo thời gian thực.
    • Cửa hàng (Admin): CRUD danh mục món ăn (Category), CRUD món ăn (Foods), quản lý banner, tiếp nhận và điều phối đơn hàng sang Shipper.
    • Tài xế (Shipper): Nhận đơn được phân công, cập nhật tọa độ vị trí (GPS), cập nhật trạng thái đơn (Đang giao, Đã giao, Đã hủy), chỉ đường qua Google Maps.
  • Should-have (Nên có): Hệ thống đánh giá/bình luận món ăn (Rating system), quản lý danh sách món ăn yêu thích lưu trữ offline/online, chia sẻ món ăn lên mạng xã hội Facebook.
  • Could-have (Có thể có): Lọc món ăn nâng cao theo giá và danh mục lồng nhau, ghi chú chi tiết cho từng món.
  • Won't-have (Chưa thực hiện trong phiên bản này): Tích hợp ví điện tử bên thứ ba (Momo, ZaloPay), hệ thống AI gợi ý món ăn theo hành vi.

Thiết kế kiến trúc và Cơ sở dữ liệu

Dự án áp dụng mô hình NoSQL dạng JSON Tree Document của Firebase Realtime Database. Cấu trúc dữ liệu lược bỏ hoàn toàn các bảng quan hệ phức tạp, thay vào đó sử dụng khóa định danh trực tiếp (Keys/IDs) để tăng tốc độ truy xuất:

{
  "Category": {
    "01": {
      "name": "Món khai vị",
      "image": "https://firebasestorage.googleapis.com/.../appetizer.png"
    }
  },
  "Foods": {
    "101": {
      "name": "Gà rán giòn cay",
      "image": "https://firebasestorage.googleapis.com/.../chicken.png",
      "description": "Gà rán ướp sốt cay đặc biệt",
      "price": "45000",
      "discount": "10",
      "menuId": "01"
    }
  },
  "Requests": {
    "1594892011040": {
      "phone": "0987654321",
      "name": "Nguyễn Văn A",
      "address": "Số 1 Võ Văn Ngân, Thủ Đức",
      "total": "90000",
      "status": "0", // 0: Placed, 1: Shipping, 2: Shipped, 3: Cancelled
      "foods": [
        {
          "foodId": "101",
          "foodName": "Gà rán giòn cay",
          "quantity": "2",
          "price": "45000",
          "discount": "10"
        }
      ]
    }
  },
  "ShippingOrder": {
    "1594892011040": {
      "shipperPhone": "0912345678",
      "orderId": "1594892011040",
      "lat": 10.850632,
      "lng": 106.772098
    }
  }
}
erDiagram
    CATEGORY ||--o{ FOODS : contains
    USERS ||--o{ REQUESTS : places
    REQUESTS ||--|{ ORDER_DETAIL : includes
    SHIPPERS ||--o{ SHIPPING_ORDER : executes
    REQUESTS ||--o| SHIPPING_ORDER : tracks
    FOODS ||--o{ RATING : receives
    USERS ||--o{ RATING : writes

    CATEGORY {
        string categoryId PK
        string name
        string image
    }
    FOODS {
        string foodId PK
        string name
        string image
        string price
        string menuId FK
    }
    REQUESTS {
        string orderId PK
        string phone FK
        string address
        string total
        string status
    }
    SHIPPING_ORDER {
        string orderId PK,FK
        string shipperPhone FK
        float currentLat
        float currentLng
    }

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

  • Ngôn ngữ phát triển: Java (JDK 8 / OpenJDK 11) - tận dụng triệt để tính hướng đối tượng OOP, đa luồng (Multi-threading), và tính an toàn bộ nhớ.
  • Hệ thống phát triển ứng dụng di động: Android SDK (API Level 21 - 29), Android Studio IDE.
  • Dịch vụ đám mây & Cơ sở dữ liệu:
    • Firebase Realtime Database SDK (com.google.firebase:firebase-database:19.3.0): Giao tiếp qua giao thức WebSocket hai chiều.
    • Firebase Authentication (com.google.firebase:firebase-auth:19.3.1): Quản lý phiên đăng nhập và định danh.
    • Firebase Storage (com.google.firebase:firebase-storage:19.1.1): Quản lý tập tin hình ảnh.
  • Bản đồ & Định vị: Google Play Services Location & Maps (com.google.android.gms:play-services-maps:17.0.0, play-services-location:17.0.0).
  • Thư viện UI/UX và tiện ích:
    • Glide 4.11.0: Quản lý bộ nhớ đệm và tối ưu hiển thị hình ảnh trực tuyến.
    • PaperDB 2.7.1: Quản lý lưu trữ NoSQL siêu nhẹ cho dữ liệu Offline/Session.
    • Material Design Components (com.google.android.material:material:1.1.0).

Implementation và kết quả

Kỹ thuật cốt lõi và Mã nguồn triển khai

1. Lắng nghe và đồng bộ vị trí thời gian thực giữa Shipper và Khách hàng

Ứng dụng Shipper liên tục cập nhật tọa độ lên ShippingOrder sử dụng FusedLocationProviderClient. Ở phía Khách hàng, giao diện bản đồ đăng ký ValueEventListener để tự động dời vị trí Marker trên Google Maps mà không cần thao tác Reload giao diện.

// Đăng ký theo dõi vị trí Shipper phía Client (TrackingOrderActivity.java)
DatabaseReference shippingRef = FirebaseDatabase.getInstance()
    .getReference("ShippingOrder")
    .child(currentOrderId);

ValueEventListener shippingListener = new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            Double lat = dataSnapshot.child("lat").getValue(Double.class);
            Double lng = dataSnapshot.child("lng").getValue(Double.class);
            
            if (lat != null && lng != null) {
                LatLng shipperLocation = new LatLng(lat, lng);
                if (mShipperMarker != null) {
                    mShipperMarker.setPosition(shipperLocation);
                } else {
                    mShipperMarker = mMap.addMarker(new MarkerOptions()
                        .position(shipperLocation)
                        .title("Vị trí Shipper")
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_shipper_bike)));
                }
                mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(shipperLocation, 16.0f));
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.e("FirebaseTrack", "Lỗi lắng nghe dữ liệu: " + databaseError.getMessage());
    }
};
shippingRef.addValueEventListener(shippingListener);

2. Xử lý đặt hàng đồng thời và cập nhật trạng thái đơn

Đảm bảo tính toàn vẹn dữ liệu khi tạo một đơn hàng mới vào cây thư mục Requests:

// Tạo yêu cầu đặt hàng mới (Cart.java)
private void submitOrder(String address, String comment) {
    Request request = new Request(
        Common.currentUser.getPhone(),
        Common.currentUser.getName(),
        address,
        txtTotalPrice.getText().toString(),
        "0", // 0: Chờ xác nhận
        comment,
        cartList // Danh sách món ăn từ SQLite/PaperDB
    );

    String orderKey = String.valueOf(System.currentTimeMillis());
    DatabaseReference requestsRef = FirebaseDatabase.getInstance().getReference("Requests");
    
    requestsRef.child(orderKey).setValue(request)
        .addOnSuccessListener(aVoid -> {
            // Xóa sạch giỏ hàng cục bộ sau khi đồng bộ lên Firebase thành công
            new Database(getBaseContext()).cleanCart();
            Toast.makeText(Cart.this, "Đặt hàng thành công! Đơn hàng: #" + orderKey, Toast.LENGTH_SHORT).show();
            finish();
        })
        .addOnFailureListener(e -> {
            Toast.makeText(Cart.this, "Lỗi kết nối máy chủ: " + e.getMessage(), Toast.LENGTH_SHORT).show();
        });
}

Ma trận kiểm thử và Chỉ số hiệu năng (Testing & Benchmarks)

Hệ thống đã trải qua quá trình kiểm thử hộp đen (Black-box Testing), kiểm thử luồng nghiệp vụ (Integration Testing) và đo lường tải trên các dòng máy thực tế (Samsung Galaxy S8, Vsmart Live, Xiaomi Redmi Note 8):

Kịch bản kiểm thử Dữ liệu đầu vào / Thao tác Kết quả mong đợi Tỉ lệ thành công Thời gian phản hồi trung bình
Xác thực người dùng Số điện thoại & Mật khẩu / OTP Cấp Token phiên, chuyển hướng Activity 100% (50/50 lần) 320ms
Tải danh mục & Món ăn Fetch 50 records có hình ảnh Glide cache nạp ảnh, hiển thị RecyclerView 98% (49/50 lần) 850ms
Realtime Sync vị trí Shipper di chuyển 2.5 km Khách hàng cập nhật Marker chuyển động mượt 96% (48/50 lần) 410ms
Xử lý đơn đồng thời Gửi 10 đơn hàng/giây Database lưu không mất mát dữ liệu 100% (10/10 đơn) 210ms
Hoạt động Offline Ngắt kết nối 4G/Wifi khi xem Ứng dụng đọc dữ liệu cache từ PaperDB 100% (20/20 lần) < 50ms

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

  1. Kiến trúc Serverless BaaS hoàn chỉnh: Thay vì tiêu tốn chi phí và thời gian thiết kế, duy trì API Server với Spring Boot hay ExpressJS, việc khai thác triệt để Firebase Realtime Database giúp giảm 80% thời gian phát triển phần phụ trợ (Backend) và tối ưu hóa chi phí vận hành cho các nhà hàng nhỏ xuống mức 0 VNĐ trong giai đoạn thử nghiệm.
  2. Cơ chế liên lạc 3 bên không qua trung gian: Tích hợp luồng phản hồi trực tiếp giữa Khách hàng ⇄ Cửa hàng ⇄ Shipper qua chung một Realtime NoSQL Tree. Mọi thay đổi trạng thái ở ứng dụng Admin ngay lập tức kích hoạt thông báo và luồng định tuyến ở ứng dụng Shipper và Khách hàng.
  3. Chiến lược tối ưu hóa bộ nhớ đệm (Dual-tier Caching): Kết hợp thư viện bộ nhớ nhẹ PaperDB với Firebase Offline Persistence giúp dữ liệu thực đơn, hình ảnh và giỏ hàng sẵn sàng hoạt động ngay cả khi kết nối mạng chập chờn.
graph LR
    subgraph Kiến trúc truyền thống
        A1[Client Apps] -->|HTTP REST Request| B1[API Server - Node/Java]
        B1 -->|SQL Queries| C1[(Relational DB)]
        B1 -->|Push Notification| A1
    end
    subgraph Giải pháp đề tài (BaaS)
        A2[Client Apps] <==>|WebSocket Bi-directional Sync| C2[(Firebase Realtime DB)]
    end

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

Khả năng áp dụng vào thực tế

  • Mô hình chuỗi F&B nội bộ: Các quán cà phê, nhà hàng thức ăn nhanh có đội ngũ giao hàng riêng có thể triển khai hệ thống mà không cần chịu chiết khấu phần trăm trên doanh thu từ các siêu ứng dụng.
  • Dịch vụ giao nhận nội bộ khu đô thị / Làng đại học: Cung cấp giải pháp đặt món tập trung cho các khu ký túc xá, trường đại học với chi phí vận hành siêu thấp.

Yêu cầu cấu hình triển khai

  • Phía Thiết bị di động (Client):
    • Hệ điều hành Android version 5.0 (API level 21) trở lên.
    • Bộ nhớ RAM tối thiểu 2GB, dung lượng trống khả dụng từ 100MB.
    • Hỗ trợ kết nối GPS, 3G/4G/Wi-Fi ổn định.
  • Phía Hạ tầng Đám mây (Cloud Console):
    • Tài khoản Google Cloud / Firebase Console kích hoạt gói dịch vụ Spark (Miễn phí) hoặc Blaze (Pay-as-you-go).
    • Khóa API Google Maps Platform hợp lệ đã kích hoạt Maps SDK for AndroidDirections API.

Bảng phân tích chi phí và hiệu quả đầu tư (ROI)

Hạng mục chi phí Sử dụng Nền tảng bên thứ 3 (Grab/Shopee) Tự triển khai Giải pháp Hệ thống này Mức độ tiết kiệm
Phí hoa hồng đơn hàng 20% - 25% doanh thu 0% Tiết kiệm 100%
Chi phí máy chủ (Hosting/Cloud) 0 VNĐ 0 VNĐ - 300.000 VNĐ/tháng (Firebase) Kiểm soát linh hoạt
Chi phí triển khai hệ thống 0 VNĐ ~ 5.000.000 VNĐ (Setup ban đầu) Điểm hòa vốn sau 2 tháng

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

Hạn chế kỹ thuật

  1. Truy vấn NoSQL phức tạp: Cấu trúc JSON Tree của Firebase Realtime Database gây khó khăn khi thực hiện các truy vấn lọc nhiều điều kiện kết hợp (ví dụ: tìm món ăn vừa theo tên, vừa theo khoảng giá, vừa có khuyến mãi).
  2. Tiêu hao năng lượng GPS: Việc duy trì dịch vụ chạy ngầm để phát tọa độ GPS liên tục trên ứng dụng Shipper có thể làm giảm thời lượng pin của thiết bị khoảng 12-15% mỗi giờ làm việc.
  3. Phương thức thanh toán: Chưa tích hợp trực tiếp cổng thanh toán tự động (Momo, VNPay, ZaloPay, thẻ ATM/Visa).

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

  • Chuyển dịch cấu trúc dữ liệu sang Cloud Firestore để tối ưu hóa khả năng truy vấn phức tạp và phân trang dữ liệu (Pagination).
  • Tích hợp Google Cloud Functions để xây dựng các logic nghiệp vụ quan trọng (Server-side validation) nhằm nâng cao tính bảo mật.
  • Ứng dụng thuật toán tối ưu hóa tuyến đường giao hàng nhiều điểm (Vehicle Routing Problem - VRP) để hỗ trợ tài xế gom nhiều đơn hàng trên một lộ trình di chuyển.
  • Tích hợp cổng thanh toán trực tuyến đa kênh và cổng thông báo Firebase Cloud Messaging (FCM) chuyên sâu.

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

  • Sinh viên ngành CNTT/Phần mềm: Nguồn tài liệu tham khảo hoàn chỉnh từ thiết kế Usecase, sơ đồ thực thể ERD, thiết kế tuần tự đến mã nguồn triển khai thực tế trên Android và Firebase.
  • Lập trình viên di động (Mobile Developers): Nắm bắt cách tổ chức kiến trúc đồng bộ thời gian thực 3 Client, kỹ thuật quản lý Map Marker và tối ưu hiệu năng bộ nhớ đệm (Cache).
  • Chủ cửa hàng / Doanh nghiệp F&B: Sở hữu giải pháp công nghệ độc lập, giảm thiểu phụ thuộc vào bên thứ ba, tiết kiệm chi phí hoa hồng và nâng cao năng lực quản lý đội ngũ shipper.
  • Nhà nghiên cứu: Mô hình tham chiếu để đánh giá hiệu năng giữa kiến trúc Serverless BaaS và kiến trúc Microservices truyền thống trong các ứng dụng điều hướng thời gian thực.

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

1. Yêu cầu kỹ thuật tối thiểu để triển khai toàn bộ hệ thống là gì?

Cần cài đặt Android Studio phiên bản 4.0 trở lên, JDK 8 hoặc 11. Trên Google Cloud Console, cần tạo một Firebase Project, tải tệp cấu hình google-services.json đặt vào thư mục /app của từng project (User, Admin, Shipper), đồng thời cấu hình Firebase Security Rules và cấp quyền Google Maps API Key.

2. Firebase Realtime Database có bị giới hạn dung lượng khi số lượng đơn hàng tăng cao không?

Gói miễn phí (Spark Plan) hỗ trợ 100 kết nối đồng thời (Simultaneous connections) và 1GB lưu trữ dữ liệu. Khi mở rộng quy mô kinh doanh, việc nâng cấp lên gói Blaze (Pay-as-you-go) cho phép mở rộng không giới hạn dung lượng, hỗ trợ hàng triệu kết nối đồng thời với chi phí cực kỳ tối ưu theo lưu lượng thực tế.

3. Làm thế nào để giải quyết vấn đề mất mạng đột ngột của Shipper khi đang giao hàng?

Hệ thống sử dụng cơ chế setPersistenceEnabled(true) của Firebase kết hợp lưu trữ PaperDB. Khi mất mạng, tọa độ và trạng thái vẫn được ghi vào cơ sở dữ liệu cục bộ trên thiết bị. Ngay khi có kết nối Internet trở lại, SDK sẽ tự động đẩy toàn bộ dữ liệu này lên Cloud.

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

Dữ liệu truyền tải qua giao thức SSL 2048-bit. Phía Firebase cấu hình hệ thống Security Rules chặt chẽ: chỉ tài khoản có role Admin mới được phép ghi vào node CategoryFoods, chỉ Shipper được cập nhật tọa độ vào ShippingOrder, và User chỉ được phép đọc/ghi dữ liệu đơn hàng thuộc về số điện thoại của chính mình.

5. Chi phí bảo trì và thời gian hoàn vốn (ROI) khi tự triển khai hệ thống này ra sao?

Do sử dụng kiến trúc Serverless, doanh nghiệp không mất phí bảo trì server vật lý hàng tháng. Chi phí vận hành chỉ phát sinh theo lưu lượng dùng thực tế. Với một cửa hàng có 30-50 đơn/ngày, hệ thống giúp tiết kiệm hàng triệu đồng phí hoa hồng mỗi tháng, đạt điểm hoàn vốn đầu tư công nghệ chỉ trong vòng 2 đến 3 tháng đầu tiên.


Kết luận

Đồ án tốt nghiệp "Xây dựng ứng dụng đặt hàng Online" của hai sinh viên Phạm Văn Nhất và Phạm Hoàng Phúc dưới sự hướng dẫn của ThS. Nguyễn Trần Thi Văn đã giải quyết xuất sắc bài toán số hóa quy trình giao đồ ăn cho các mô hình kinh doanh hiện đại. Với việc làm chủ công nghệ lập trình di động Android kết hợp cùng sức mạnh đồng bộ thời gian thực của Google Firebase, đề tài đã mang lại một hệ sinh thái ba ứng dụng hoàn chỉnh, vận hành mượt mà, độ trễ thấp và có tính ứng dụng thực tiễn cao. Đây là nền tảng vững chắc để tiếp tục mở rộng, nâng cấp và thương mại hóa trong thời đại chuyển đổi số toàn diện.