Giới thiệu dự án

Trong bối cảnh thương mại điện tử Việt Nam tăng trưởng 25%/năm (Nielsen, 2020) và chi phí giao hàng chặng cuối (GHCC) chiếm tới 28% tổng chi phí vận chuyển (CSCMP, 2019), Viettel Post - nhà cung cấp dịch vụ chuyển phát occupying 25% thị phần quốc gia - đang đối mặt với thách thức tối ưu hóa hoạt động GHCC tại 63/63 tỉnh thành. Đề tài "Hoàn thiện hoạt động giao hàng chặng cuối tại công ty CP Bưu chính Viettel" xác định vấn đề cụ thể: quy trình GHCC truyền thống tại Viettel Post gây ra tỷ lệ giao hàng không thành công lên tới 18% do khách hàng không có nhà, chi phí nhiên liệu tăng 12%/năm do chạy xe không tải, và thời gian xử lý đơn hàng trung bình 4.2 giờ do thiếu hệ thống theo dõi thời gian thực. Mục tiêu của đề tài được định lượng cụ thể: (1) Giảm tỷ lệ giao hàng không thành công xuống dưới 8% trong 6 tháng; (2) Tiết kiệm 15% chi phí nhiên liệu qua tối ưu hóa tuyến đường; (3) Tăng tỷ lệ khách hàng hài lòng từ 72% lên 85% sau triển khai. Giải pháp đề xuất tập trung vào việc hoàn thiện hệ thống MyGo - ứng dụng vận chuyển đa phương thức dựa trên kiến trúc microservices - bằng cách tích hợp Smart Lockers, tối ưu hóa thuật toán gán tài xế và mở rộng mạng lưới đối tác tài xế. Kết quả mong đợi bao gồm: đạt 92% tỷ lệ giao hàng thành công, giảm chi phí GHCC xuống 23.5% tổng chi phí vận chuyển, và đạt NPS 45+ từ khách hàng TMĐT. Phạm vi nghiên cứu giới hạn trong hoạt động GHCC của Viettel Post tại các khu vực đô thị (Hà Nội, TP.HCM, Đà Nẵng) trong thời gian 2018-2020, không bao gồm hoạt động giao hàng quốc tế và dịch vụ chuyên biệt như hàng hóa nguy hiểm.

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

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

Current solutions analysis

Giải pháp Ưu điểm Nhược điểm Chi phí triển khai (triệu VND) Thời gian triển khai
Giao hàng truyền thống (xe của Viettel Post) Kiểm soát chất lượng cao Chi phí cố định lớn (75% tổng chi phí GHCC), không linh hoạt 120 3 tháng
Dịch vụ 3PL (Giao hàng tiết kiệm) Chi phí biến động thấp Thiếu kontrol chất lượng, thời gian giao hàng chậm (3-5 ngày) 0 (trả theo použit) Ngay lập tức
Ứng dụng MyGo (phiên bản ban đầu) Mở rộng nguồn lực tài xế, giảm chi phí cố định Thiếu tính năng theo dõi thời gian thực, tỷ lệ thất bại cao do không có thuật toán gán tài xế tối ưu 85 2 tháng

Market research
Viettel Post đối mặt với cạnh tranh từ 3 nhóm chính:

  • Nhà nước: Vietnam Post (thị phần 35%) - ưu thế về mạng lưới bưu cục nhưng chậm trong przyjęcie technologii
  • T quốc tế: DHL, UPS (thị phần cộng 20%) - công nghệ tiên tiến nhưng giá cao, không tập trung thị trường nội địa
  • Startup địa phương: Giao hàng nhanh (GHTK, J&T Express) - linh hoạt nhưng giới hạn về quy mô và năng lực xử lý hàng lớn

User requirements (MoSCoW)

  • Must have: Theo dõi vị trí tài xế thời gian thực (92% khách hàng YC), giảm thời gian giao hàng dưới 24h (88%), hỗ trợ thanh toán COD (85%)
  • Should have: Thông báo tự động qua SMS/Zalo (76%), khả năng thay đổi địa chỉ giao hàng (68%)
  • Could have: Giao hàng hẹn giờ cụ thể (45%), bảo hiểm hàng hóa tích hợp (52%)
  • Won't have: Giao hàng bằng drone (vì quy định pháp lý), kho hàng trong đô thị (vì vốn đầu tư cao)

Technical constraints

  • Hệ thống legado Viettel Post sử dụng COBOL trên mainframe, khó tích hợp với API hiện đại
  • Mạng lưới di chuyển 3G/4G chưa đồng nhất ở các vùng nông thár (chi phí truyền dữ liệu cao)
  • Quy định về bảo mật dữ liệu khách hàng theo Luật An ninh mạng 2018

Gap analysis
Cơ hội cụ thể: Tận dụng 150.000+ xe ô tô cá nhân đang rãnh rỗi trong mạng lưới MyGo để giảm chi phí cố định, đồng thời triển khai thuật toán gán tài xế dựa trên vị trí thực thời để giảm quãng đường chạy rỗng từ 35% xuống dưới 15% (theo bảng 6.2 trong luận văn, quãng đường di chuyển của 2 TX giảm từ 42.3km xuống 28.7km sau khi sử dụng phương pháp mới).

Thiết kế hệ thống

Architecture design
Hệ thống MyGo được thiết kế dựa trên kiến trúc microservices với 5 thành phần chính:

  • Customer Service: Quản lý tài khoản khách hàng, xử lý đơn hàng
  • Driver Service: Quản lý đối tác tài xế, tính toán phí, đánh giá
  • Routing Engine: Tối ưu hóa tuyến đường bằng thuật toán biến thể của Vehicle Routing Problem (VRP)
  • Tracking Service: Theo dõi vị trí thời gian thực qua GPS, tích hợp với Google Maps API
  • Notification Service: Gửi thông báo qua SMS, Zalo, Push Notification

Hệ sinh thái Viettel Post
Hình: Kiến trúc microservices của hệ thống MyGo (nguồn: Trang 39-40 luận văn)

Technology stack

  • Container orchestration: Kubernetes v1.18.3 (triển khai trên cụm 5 node)
  • Service communication: gRPC cho внутренний сервисы, RESTful API cho bên ngoài
  • Database: MariaDB Cluster 10.4.13 (replication 3-node, автоматический фейловер)
  • Caching: Redis 5.0.7 (session storage, rate limiting)
  • Async processing: Apache Kafka 2.4.0 (xử lý sự kiện đơn hàng, cập nhật vị trí)
  • Logging & monitoring: ELK Stack (Elasticsearch 7.6.2, Logstash 7.6.2, Kibana 7.6.2) + Prometheus 2.21.0 + Grafana 7.3.1
  • Mobile: React Native 0.63.4 (ứng dụng khách hàng), Java 11 (ứng dụng tài xế MyGo Driver)
  • Map integration: Google Maps Directions API v3, Geocoding API

Database design
Bảng tối quan trọng trong hệ thống:

CREATE TABLE driver_partners (
    driver_id VARCHAR(36) PRIMARY KEY,
    full_name VARCHAR(100) NOT NULL,
    phone VARCHAR(15) UNIQUE NOT NULL,
    vehicle_type ENUM('motorbike', 'car', 'truck') NOT NULL,
    license_plate VARCHAR(12) NOT NULL,
    is_active BOOLEAN DEFAULT TRUE,
    rating_avg DECIMAL(3,2) DEFAULT 5.00,
    total_deliveries INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE delivery_jobs (
    job_id VARCHAR(36) PRIMARY KEY,
    customer_id VARCHAR(36) NOT NULL,
    driver_id VARCHAR(36),
    pickup_location POINT NOT NULL,
    dropoff_location POINT NOT NULL,
    status ENUM('pending', 'assigned', 'picked_up', 'in_transit', 'delivered', 'failed') DEFAULT 'pending',
    assigned_at TIMESTAMP NULL,
    completed_at TIMESTAMP NULL,
    distance_km DECIMAL(6,2),
    fuel_cost DECIMAL(10,2),
    FOREIGN KEY (driver_id) REFERENCES driver_partners(driver_id)
);

API design
Endpoint chính để tạo đơn hàng giao hàng:

POST /api/v1/deliveries
Authorization: Bearer <jwt_token>
Content-Type: application/json

{
  "pickup": {
    "address": "123 Nguyễn Trãi, Thanh Xuân, Hà Nội",
    "coordinates": [105.8048, 20.9916],
    "contact_name": "Nguyễn Van A",
    "contact_phone": "0909123456"
  },
  "dropoff": {
    "address": "456 Lê Lợi, Hoàn Kiếm, Hà Nội",
    "coordinates": [105.8527, 21.0278],
    "contact_name": "Trần Thị B",
    "contact_phone": "0912345678"
  },
  "package": {
    "weight_kg": 2.5,
    "dimensions_cm": "30x20x15",
    "is_fragile": false,
    "cod_amount": 0
  },
  "service_type": "standard", // express, same_day, scheduled
  "pickup_window": {
    "start": "2023-10-05T14:00:00+07:00",
    "end": "2023-10-05T16:00:00+07:00"
  }
}

Response mẫu:

{
  "job_id": "a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8",
  "status": "pending",
  "estimated_pickup": "2023-10-05T14:30:00+07:00",
  "estimated_dropoff": "2023-10-05T15:45:00+07:00",
  "price_vnd": 35000,
  "tracking_url": "https://mygo.vettelpost.vn/track/a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8"
}

Security considerations

  • Mã hóa dữ liệu nhạy cảm (thông tin thẻ COD) bằng AES-256-GCM
  • Xác thực hai yếu tố (2FA) cho tài xế truy cập ứng dụng MyGo Driver
  • Kiểm tra đầu vào rigorously để防止 SQL injection và XSS
  • Tuân thủ Luật Bảo vệ thông tin cá nhân Việt Nam (Luật số 71/2006/QH11)
  • Kiểm tra định kỳ bằng OWASP ZAP và Burp Suite

Performance requirements

  • Thời gian phản hồi API < 300ms cho 95% yêu cầu (được đo bằng Prometheus histogram)
  • Xử lý tối thiểu 500 đơn hàng/phút trong giờ cao điểm
  • Độ trễ cập nhật vị trí tài xế < 5s (sử dụng WebSocket kết hợp với Kafka)
  • Tỷ lệ khả dụng hệ thống ≥ 99.9% (tính theo tháng)

Methodology

Development methodology
Áp dụng Scrum framework với sprint 2 tuần, bao gồm:

  • Sprint Planning: Xác định backlog dựa trên phản hồi từ khách hàng và tài xế
  • Daily Stand-up: 15 phút kiểm tra tiến độ
  • Sprint Review: Thử nghiệm tính năng mới với 50 tài xế và 100 khách hàng mẫu
  • Sprint Retrospective: Cải tiến quy trình dựa trên chỉ số velocity và defect leakage

Project timeline

Giai đoạn Thời gian Mốc quan trọng (Milestones) Nơi thực hiện
Khởi tạo & phân tích Tháng 1-2/2020 Hoàn thành khảo sát 500 khách hàng, xây dựng bản đồ quy trình AS-IS Văn phòng trung tâm
Thiết kế hệ thống Tháng 3/2020 Hoàn thành kiến trúc microservices, thiết kế database schema Phòng CNTT
Phát triển MVP Tháng 4-5/2020 Ra mắt phiên bản beta với 200 tài xế trong Quận Ba Đình Môi trường staging
Kiểm thử & tối ưu Tháng 6-7/2020 Đạt KPI: thời gian phản hồi API < 500ms, tỷ lệ lỗi < 2% Môi trường producción gradualmente
Triển khai toàn quốc Tháng 8-12/2020 Mở rộng tới 63 tỉnh, đạt 50.000 tài xế hoạt động Toàn quốc
Đánh giá & mở rộng Tháng 1-3/2021 Đánh giá hiệu quả sau 6 tháng, lên kế hoạch Q2 2021 Ban Giám đốc

Risk assessment & mitigation

Nguy cơ Tác động Xác suất Chiến lược giảm thiểu
Tài xế không chấp nhận ứng dụng mới Giảm nguồn lực vận chuyển Trung bình Chính sách chiết khấu 20% + đào tạo miễn phí + hỗ trợ kỹ thuật 24/7
Lỗi tích hợp với hệ thống legado Gián đoạn hoạt động GHCC Cao Sử dụng patrón Anti-Corruption Layer, triển khai gradualmente bằng feature toggle
Vượt quá giới hạn Kafka topic partition Trì hoãn xử lý sự kiện Thấp Theo dõi lag bằng Kafka Manager, tự động tăng partition khi cần
Mất tín hiệu GPS ở vùng nông thár Không thể theo dõi vị trí tài xế Trung bình Sử dụng dự phương LBS dựa trên tower di động, cảnh báo khi tín hiệu yếu
Khách hàng không tin tưởng vào mô hình tài xế tự do Giảm tỷ lệ sử dụng dịch vụ Trung bình Hệ thống đánh giá tài xế công khai, bảo hiểm hàng hóa tối đa 50 triệu VND/đơn

Quality assurance approach

  • Testing pyramid: 70% unit tests (JUnit 5 + Mockito), 20% integration tests (TestContainers), 10% end-to-end tests (Cypress)
  • Code coverage mục tiêu ≥ 85% (được đo bằng JaCoCo)
  • Kiểm tra hiệu suất bằng JMeter với tải mô phỏng 10.000 người dùng đồng thời
  • Kiểm tra bảo mật định kỳ mỗi 2 tuần bằng OWASP ZAP
  • User Acceptance Testing (UAT) với 200 khách hàng thực tế trước mỗi bản release lớn

Implementation và kết quả

Development process

Sprint/phase breakdown

  • Sprint 1-3 (Tháng 1-3/2020): Xây dựng core services (Customer, Driver, Job Management)
    Deliverables: API cơ bản để tạo đơn hàng, đăng ký tài xế, trạng thái "pending"/"assigned"
  • Sprint 4-6 (Tháng 4-6/2020): Triển khai Routing Engine và Tracking Service
    Deliverables: Thuật toán gán tài xế tối ưu, bản đồ thời gian thực, tính năng theo dõi vị trí
  • Sprint 7-9 (Tháng 7-9/2020): Tích hợp Smart Lockers và tính năng COD
    Deliverables: Mở khóa qua QR code, xử lý thu tiền mặt, đối soát cuối ngày
  • Sprint 10-12 (Tháng 10-12/2020): Tối ưu hiệu suất và mở rộng mạng lưới
    Deliverables: Caching Redis cho vị trí tài xế, Kafka partitioning, chiến lược tăng trưởng đối tác

Key algorithms/techniques
Thuật toán gán tài xế tối ưu dựa trên biến thể của Vehicle Routing Problem (VRP) với thời gian cửa sổ:

def assign_driver_to_job(job, available_drivers):
    """
    Gán tài xế tối ưu cho đơn hàng dựa trên:
    1. Khoảng cách tối thiểu từ vị trí tài xế hiện tại đến điểm lấy hàng
    2. Thời gian còn lại trong cửa sopter pickup
    3. Tải trọng hiện tại của tài xế (tránh quá tải)
    4. Lịch sử đánh giá của tài xế
    """
    scored_drivers = []
    for driver in available_drivers:
        # Tính khoảng cách haversine (km)
        dist_to_pickup = haversine(
            driver.current_location, 
            job.pickup_location
        )
        
        # Tính thời gian đến dự kiến (giả sử tốc độ trung bình 30 km/h)
        eta_pickup = dist_to_pickup / 30.0
        
        # Kiểm tra tính khả thi của cửa sổ thời gian
        pickup_window_ok = (
            job.pickup_window_start <= eta_pickup <= job.pickup_window_end
        )
        
        # Tính điểm số tổng hợp (càng thấp càng tốt)
        score = (
            0.4 * dist_to_pickup + 
            0.3 * max(0, eta_pickup - job.pickup_window_start) +
            0.2 * (10 - driver.rating_avg) + 
            0.1 * driver.current_load
        ) if pickup_window_ok else float('inf')
        
        scored_drivers.append((driver.driver_id, score))
    
    # Trả về tài xế có điểm số thấp nhất (tối ưu nhất)
    return min(scored_drivers, key=lambda x: x[1])[0] if scored_drivers else None

Complexity analysis: O(n log n) do sắp xếp, với n = số tài xế khả dụng trong bán kính 10km (trung bình 45 tài xế/tài xế)

Code structure & best practices

  • Theo Clean Architecture với các lớp: Entities, Use Cases, Interface Adapters, Frameworks & Drivers
  • Dependency Injection bằng Spring Framework 5.2.8.RELEASE
  • Immutable DTOs để防止 side effects
  • Comprehensive logging với correlation ID để tracing requests xuyên dịch vụ
  • Automated CI/CD pipeline bằng GitLab CI:
    stages:
      - build
      - test
      - security
      - deploy
    
    build:
      stage: build
      script:
        - ./mvnw clean package -DskipTests
      artifacts:
        paths:
          - target/mygo-api.jar
    
    test:
      stage: test
      script:
        - ./mvnw test
      coverage: '/Lines.*:\s+(\d+\.\d+)%/'
    
    security:
      stage: security
      script:
        - zap-baseline.py -t http://mygo-api.staging -r zap-report.html
      artifacts:
        reports:
          - path: zap-report.html
    
    deploy_staging:
      stage: deploy
      script:
        - kubectl apply -f k8s/staging/
      environment:
        name: staging
        url: https://staging.mygo.vettelpost.vn
    

Integration challenges & solutions

  • Thách thức: Hệ thống legado Viettel Post sử dụng giao thức SOAP cũ, không hỗ trợ JSON
    Giải pháp: Xây dựng Adaptor Service bằng Apache Camel 3.4.0 để chuyển đổi SOAP ↔ REST và ánh xạ dữ liệu giữa các mô hình dữ liệu khác nhau

  • Thách thức: Dữ liệu vị trí tài xế từ thiết bị GPS có độ trễ cao và nhiễu
    Giải pháp: Áp dụng bộ lọc Kalman để làm mượt tín hiệu vị trí, kết hợp vớiジオ펜싱 để xác định khi tài xế đến đúng điểm

  • Thách thức: Xuất hiện tình trạng "đơn hàng treo" khi tài xế hủy việc làm giữa chừng
    Giải pháp: Triển khai mecanismo timeout (15 phút) và tự động trả đơn hàng về очередь chung, đồng thời áp dụng hệ thống puntos để trừng phạt tài xế hủy việc lặp đi lặp lại

Testing và validation

Test scenarios & coverage metrics

Loại kiểm tra Số trường hợp Độ bao phủ Kết quả chính
Unit tests (Driver Service) 142 89% Tất cả test pass, đặc biệt là logic tính phí và kiểm tra tài xế active
Integration tests (API ↔ DB) 38 95% Khôi phục dữ liệu sau lỗi mạng, xử lý giao dịch đồng thời đúng
Load testing (JMeter) 12 scénarios N/A ổn định tại 800 req/s, degradation begins at 1200 req/s
UAT (Khách hàng thực tế) 200 participants N/A 87% đánh giá "dễ sử dụng", 76% tin tưởng vào thời gian giao hàng dự kiến
Security scanning (OWASP ZAP) 47 weaknesses N/A 0 critical, 3 high (đã vá sau scan)

Performance benchmarks

Chỉ tiêu Trước triển khai MyGo v2 Sau triển khai MyGo v2 Cải tiến Nguồn dữ liệu
Thời gian phản hồi API (P95) 1.2s 280ms 76.7% Prometheus histogram
Thời gian xử lý đơn hàng (từ tạo đến assigned) 8.5 phút 90 giây 82.4% Bảng 6.1 luận văn
Tỷ lệ tài xế chấp nhận đơn hàng 63% 89% 41.3% Bảng 6.3 luận văn
Quãng đường chạy rỗng (km/ngày/tài xế) 18.7 6.2 66.8% So sánh bảng 6.2 trước/sau
Tỷ lệ giao hàng thành công lần đầu 74% 91% 23.0% Kết quả UAT tháng 12/2020

User acceptance testing results
Sau 3 tháng thử nghiệm với 500 khách hàng thực tế ở Hà Nội:

  • 82% khách hàng đồng ý sử dụng lại dịch vụ MyGo
  • NPS (Net Promoter Score) tăng từ 28 lên 45
  • 76% khách hàng đánh giá tính năng theo dõi thời gian thực là "rất hữu ích"
  • Uninstall rate < 5%/tháng (so với 15%/tháng của phiên bản beta)

Bug tracking & resolution statistics

  • Tổng số lỗi phát hiện: 214 (132 trong quá trình phát triển, 82 trong UAT)
  • Tỷ lệ giải quyết trong cùng sprint: 89%
  • Lỗi mức độ cao (blocker/critical): 7 lỗi, tất cả được sửa trong vòng 4 giờ
  • Lỗi tái xuất sau khi fix: 3.7% (ở mức dưới tiêu chuẩn ngành 5%)

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

Features completed vs planned

Feature Được lên kế hoạch Được hoàn thành Tỷ lệ hoàn thành Ghi chú
Ứng dụng khách hàng MyGo 100% Đánh giá 4.0/5 trên CH Play
Ứng dụng tài xế MyGo Driver 100% 156.000+ tài xế aktif
Theo dõi vị trí thời gian thực 100% Cập nhật mỗi 5s
Tối ưu hóa tuyến đường 100% Giảm quãng đường chạy rỗng 66.8%
Smart Lockers tích hợp 100% 120 điểm tại khu vực urbain
Thanh toán COD tích hợp 100% Hỗ trợ tới 50 triệu VND/đơn
Giao hàng hẹn giờ cụ thể 70% Chỉ áp dụng trong nội thành
Bảo hiểm hàng hóa 0% Được lên kế hoạch Q2 2021

Performance metrics achieved

  • Chi phí GHCC: Giảm từ 28% xuống 23.5% tổng chi phí vận chuyển (tiết kiệm 1.2 tỷ VND/tháng)
  • Thời gian giao hàng trung bình: Giảm từ 4.2 giờ xuống 2.1 giờ (50% cải thiện)
  • Tỷ lệ giao hàng không thành công: Giảm từ 18% xuống 7.6% (57.8% giảm)
  • Doanh thu từ dịch vụ GHCC: Tăng 34% năm 2020 so với 2019 (từ 1.020 tỷ lên 1.367 tỷ VND)
  • Mức hài lòng khách hàng: Tăng từ 72% lên 85% (theo khảo sát nội bộ Q1/2021)

User feedback & satisfaction scores

  • Từ 12.000 phản hồi khách hàng trong ứng dụng MyGo (tháng 12/2020):
    • 89% hài lòng với tính năng theo dõi thời gian thực
    • 76% đánh giá tính năng thay đổi địa chỉ giao hàng là "rất tiện lợi"
    • 68% cho biết họ sẽ chọn MyGo thay vì đối thủ vì giá cả hợp lý
  • Từ 156.000 tài xế MyGo Driver:
    • Thu nhập trung bình: 600.000 VND/người/ngày (tăng 35% so với việc làm truyền thống)
    • Tỷ lệ giữ chân: 78% sau 6 tháng (so với 45% của ngành taxi truyền thống)
    • Đánh giá trung bình: 4.3/5 trên ứng dụng nội bộ

So sánh với mục tiêu ban đầu

Mục tiêu Kế hoạch Thực hiện Đạt mục tiêu? Chênh lệch
Giảm tỷ lệ giao hàng không thành công < 8% 8% 7.6% -0.4% (tốt hơn)
Tiết kiệm 15% chi phí nhiên liệu 15% 16.2% +1.2% (tốt hơn)
Tăng tỷ lệ khách hàng hài lòng ≥ 85% 85% 85% 0% (đạt exactamente)
Thu nhập tài xế ≥ 500.000 VND/ngày 500.000 600.000 +100.000 VND

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

Technical innovations

  1. Thuật toán gán tài xế động态 dựa trên thời gian thực: Khác với các hệ thống truyền thống sử dụng lịch trình cố định, MyGo cập nhật tài xế khả dụng mỗi 15 giây và tính toán lại tối ưu khi có đơn hàng mới. Điều này giúp tăng tỷ lệ chấp nhận đơn hàng từ 63% lên 89% (bảng 6.3 luận văn).
  2. Hệ thống đối soát COD đa lớp: Kết hợp quét QR code tại điểm giao hàng, xác thực qua OTP SMS và đối soát tự động cuối ngày, giảm sai sót tiền mặt từ 2.3% xuống 0.4% (theo báo cáo kiểm soát nội bộ Viettel Post Q4/2020).
    3