Quản lý Phân phối
Module nghiệp vụ cốt lõi của FieldFlow — quản lý đội ngũ đi thị trường, điểm bán, tồn kho tại điểm bán, đơn hàng và GPS tracking. Giải quyết 4 vấn đề: không biết NV có đi làm không, không biết tồn kho điểm bán, đơn hàng chậm sai sót, không có báo cáo tức thời.
Module DMS giải quyết 4 vấn đề cốt lõi
Không biết nhân viên có đi làm không
NV đi thị trường nhưng không ai kiểm soát. Gọi điện thì "đang đi", nhưng thực tế có thể ở nhà.
GPS Check-in tại điểm bán
NV phải check-in tại điểm bán với GPS. Bán kính 200m → tự động xác minh. Vượt quá → force check-in + lý do.
Không biết tồn kho tại điểm bán
Điểm bán còn bao nhiêu hàng? Không biết. Chốt đơn xong mới phát hiện hết hàng.
Nhập tồn kho tại điểm bán
Mỗi lần ghé thăm, NV nhập tồn kho từng sản phẩm. Hệ thống snapshot → cảnh báo hết hàng.
Đơn hàng chậm, sai sót
Ghi giấy, gọi điện về công ty → chậm, sai sót, mất thông tin.
Tạo đơn hàng trên app
Chọn SP + SL → tự tính tiền → gửi ngay. Supervisor duyệt real-time → kho chuẩn bị.
Không có báo cáo tức thời
Hôm nay bao nhiêu đơn? Doanh số thế nào? Chờ cuối tuần tổng hợp Excel.
Dashboard real-time
Tổng quan hôm nay: NV active, điểm đã ghé, đơn hàng, doanh số → cập nhật real-time.
Vị trí trong hệ thống FieldFlow
flowchart LR
Core[Core Module
Tài khoản & Phân quyền] --> DMS[DMS Module
Quản lý Phân phối]
DMS --> Inventory[Inventory Module
Quản lý Kho]
DMS --> Debt[Debt-Tracking Module
Công nợ]
DMS --> Reports[Reports Module
Báo cáo tổng hợp]
style DMS fill:#d4a73a,stroke:#b8860b,stroke-width:3px,color:#1a1814
style Core fill:#e8e4d8,stroke:#7a7468,stroke-width:2px,color:#1a1814
style Inventory fill:#e8e4d8,stroke:#7a7468,stroke-width:2px,color:#1a1814
style Debt fill:#e8e4d8,stroke:#7a7468,stroke-width:2px,color:#1a1814
style Reports fill:#e8e4d8,stroke:#7a7468,stroke-width:2px,color:#1a1814
- Core: Cung cấp tài khoản, phân quyền cho toàn bộ hệ thống
- DMS: Module nghiệp vụ chính — đi tuyến, check-in, tồn kho, đơn hàng
- Inventory: Đơn hàng từ DMS → xuất kho
- Debt-Tracking: Đơn hàng giao xong → theo dõi công nợ
- Reports: Tổng hợp dữ liệu từ DMS, Inventory, Attendance, Debt-Tracking
6 Vai trò & Mức độ sử dụng DMS
| Vai trò | Mức độ sử dụng | Công việc chính trong DMS |
|---|---|---|
| 🔴 Admin | Toàn quyền | Quản lý hệ thống, cấu hình, phân quyền |
| 🟡 Manager | Toàn quyền | Dashboard, báo cáo, duyệt đơn, quản lý tuyến/địa bàn |
| 🔵 Supervisor | Quản lý | Giám sát đội ngũ, duyệt đơn, quản lý tuyến trong địa bàn mình |
| ⚪ Staff | Không dùng | — |
| 🟢 Sales Rep | Tạo/Nhập liệu | Đi tuyến, check-in, nhập tồn kho, chụp hình, tạo đơn, trả hàng |
| 🟠 Warehouse | Xem đơn | Xem đơn hàng cần xuất kho |
Ví dụ thực tế: Công ty ABC (8 NV Sales)
- Nhấn "Check-in" → GPS xác nhận trong 200m → ✅ OK
- Nhập tồn kho: Bía Tiger 15 thùng, Bía Lager 8 thùng, Nước tương 24 chai → Highlight SP hết hàng
- Chụp hình: Kệ hàng, Trưng bày, Mặt tiền (3 hình)
- Tạo đơn: 3 thùng Bía Tiger → Tự tính 3 × 450,000 = 1,350,000 → Gửi đơn
- Ghi chú: "Chủ nói hết bia, sẽ đặt thêm"
- Nhấn "Check-out" → Thời gian: 12 phút
- Visits: 8/8 điểm (100%)
- Đơn hàng: 5 đơn bán, 1 đơn trả
- Doanh số: 2,500,000 VNĐ
- GPS logs: 96 lần (cứ 5-10 phút/log)
- Lộ trình: Manager xem bản đồ → thấy toàn bộ route
NV ghé trung bình 8-10 điểm/ngày. Mỗi điểm 5-15 phút → tổng 40-150 phút (trừ thời gian di chuyển).
10 Entity — ER Diagram
erDiagram
Territory ||--o{ Outlet : "contains"
Territory ||--o{ Route : "contains"
Territory }o--|| User : "supervised by"
Route ||--o{ RouteOutlet : "has"
Outlet ||--o{ RouteOutlet : "in"
Route }o--|| User : "assigned to"
Outlet ||--o{ Visit : "visited in"
Visit ||--o{ VisitInventory : "records"
Visit ||--o{ VisitPhoto : "captures"
Visit ||--o{ SalesOrder : "creates"
SalesOrder ||--o{ OrderItem : "contains"
User ||--o{ GPSLog : "tracked"
User ||--o{ Visit : "performs"
Product ||--o{ VisitInventory : "tracked in"
Product ||--o{ OrderItem : "sold in"
Territory {
uuid id "PK ✱"
text name "Tên địa bàn ✱"
uuid supervisor_id "FK User ✱"
text status "active/inactive ✱"
text description "Mô tả"
json district_codes "Mã quận/huyện"
json boundary_geojson "Ranh giới bản đồ (Phase 2)"
}
Outlet {
uuid id "PK ✱"
text name "Tên cửa hàng ✱"
text address "Địa chỉ ✱"
decimal lat "Vĩ độ GPS ✱"
decimal lng "Kinh độ GPS ✱"
uuid territory_id "FK Territory ✱"
text outlet_type "Loại hình ✱"
text status "active/paused/closed ✱"
text contact_name "Tên người liên hệ"
text contact_phone "SĐT"
boolean approved "Đã duyệt"
uuid created_by "FK User"
json photos "Ảnh (Phase 2)"
timestamp last_visit_at "Lần ghé cuối (Phase 2)"
decimal avg_monthly_revenue "Doanh số TB (Phase 2)"
}
Route {
uuid id "PK ✱"
text name "Tên tuyến ✱"
uuid territory_id "FK Territory ✱"
uuid user_id "FK User (Sales Rep) ✱"
json day_of_week "Ngày chạy [1,3,5] ✱"
boolean is_active "Đang chạy ✱"
text description "Mô tả"
json optimized_order "Tự động tối ưu (Phase 2)"
integer estimated_duration "Thời gian ước tính (Phase 2)"
}
RouteOutlet {
uuid route_id "FK Route ✱"
uuid outlet_id "FK Outlet ✱"
integer sort_order "Thứ tự ✱"
}
Visit {
uuid id "PK ✱"
uuid user_id "FK User ✱"
uuid outlet_id "FK Outlet ✱"
uuid route_id "FK Route ✱"
timestamp checkin_time "Thời gian check-in ✱"
decimal checkin_lat "Vĩ độ check-in ✱"
decimal checkin_lng "Kinh độ check-in ✱"
timestamp checkout_time "Thời gian check-out"
decimal checkout_lat "Vĩ độ check-out"
decimal checkout_lng "Kinh độ check-out"
boolean is_forced "Force check-in"
text force_reason "Lý do force"
text notes "Ghi chú"
integer duration_minutes "Thời lượng"
decimal visit_score "Đánh giá (Phase 2)"
text customer_feedback "Phản hồi (Phase 2)"
}
VisitInventory {
uuid visit_id "FK Visit ✱"
uuid product_id "FK Product ✱"
decimal quantity "Số lượng ✱"
text unit "Đơn vị: thùng"
}
VisitPhoto {
uuid visit_id "FK Visit ✱"
text photo_url "Đường dẫn hình ✱"
text photo_type "Loại ảnh ✱"
text caption "Chú thích"
}
SalesOrder {
uuid id "PK ✱"
text order_number "Mã đơn ✱"
text order_type "sale/return ✱"
uuid user_id "FK User ✱"
uuid outlet_id "FK Outlet ✱"
uuid visit_id "FK Visit ✱"
text status "Trạng thái ✱"
decimal total_amount "Tổng tiền ✱"
text notes "Ghi chú"
uuid approved_by "FK User"
timestamp approved_at "Thời gian duyệt"
text delivery_notes "Ghi chú giao"
text delivery_proof_url "Bằng chứng giao (Phase 2)"
text payment_status "Trạng thái TT (Phase 2)"
text return_reason "Lý do trả (Phase 2)"
}
OrderItem {
uuid order_id "FK SalesOrder ✱"
uuid product_id "FK Product ✱"
decimal quantity "Số lượng ✱"
decimal unit_price "Giá tại thời điểm ✱"
decimal total_price "Thành tiền ✱"
}
GPSLog {
uuid user_id "FK User ✱"
decimal lat "Vĩ độ ✱"
decimal lng "Kinh độ ✱"
decimal accuracy "Độ chính xác (m) ✱"
timestamp recorded_at "Thời gian ghi ✱"
}
Chi tiết từng Entity
1. Territory (Địa bàn)
| Trường | Kiểu dữ liệu | Ví dụ | Bắt buộc |
|---|---|---|---|
| name | text | "Khu vực Quận 1,3" | ✅ Bắt buộc |
| supervisor_id | FK User | UUID Supervisor | ✅ Bắt buộc |
| status | enum | active, inactive | ✅ Bắt buộc |
| description | text | "Khu vực trung tâm TP.HCM" | — Tùy chọn |
| district_codes | json | ["001", "003"] (Quận 1, 3) | — Tùy chọn |
| boundary_geojson | json | GEOJSON polygon | Phase 2 |
2. Outlet (Điểm bán)
| Trường | Kiểu dữ liệu | Ví dụ | Bắt buộc |
|---|---|---|---|
| name | text | "Tạp hóa Minh An" | ✅ Bắt buộc |
| address | text | "123 Nguyễn Huệ, Q.1" | ✅ Bắt buộc |
| lat | decimal | 10.7769 | ✅ Bắt buộc |
| lng | decimal | 106.7009 | ✅ Bắt buộc |
| territory_id | FK Territory | UUID | ✅ Bắt buộc |
| outlet_type | enum | grocery, mini_market, pharmacy, restaurant, other | ✅ Bắt buộc |
| status | enum | active, paused, closed, pending_approval | ✅ Bắt buộc |
| contact_name | text | "Anh Minh" | — Tùy chọn |
| contact_phone | text | "0901234567" | — Tùy chọn |
| approved | boolean | true/false | — Tùy chọn |
| created_by | FK User | UUID Sales Rep | — Tùy chọn |
| photos | json | ["url1", "url2"] | Phase 2 |
| last_visit_at | timestamp | 2026-06-05 08:15:00 | Phase 2 |
| avg_monthly_revenue | decimal | 15,000,000 | Phase 2 |
3. Route (Tuyến bán)
| Trường | Kiểu dữ liệu | Ví dụ | Bắt buộc |
|---|---|---|---|
| name | text | "Tuyến Quận 1 - Sáng" | ✅ Bắt buộc |
| territory_id | FK Territory | UUID | ✅ Bắt buộc |
| user_id | FK User | UUID Sales Rep | ✅ Bắt buộc |
| day_of_week | json | [1,3,5] (T2,T4,T6) | ✅ Bắt buộc |
| is_active | boolean | true/false | ✅ Bắt buộc |
| description | text | "Tuyến điểm bán trung tâm" | — Tùy chọn |
| optimized_order | json | [outlet_id1, outlet_id2,...] | Phase 2 |
| estimated_duration | integer | 120 (phút) | Phase 2 |
4. RouteOutlet (Bảng junction)
| Trường | Kiểu dữ liệu | Ví dụ | Bắt buộc |
|---|---|---|---|
| route_id | FK Route | UUID | ✅ Bắt buộc |
| outlet_id | FK Outlet | UUID | ✅ Bắt buộc |
| sort_order | integer | 1,2,3... | ✅ Bắt buộc |
5. Visit (Lần ghé thăm)
| Trường | Kiểu dữ liệu | Ví dụ | Bắt buộc |
|---|---|---|---|
| user_id | FK User | UUID Sales Rep | ✅ Bắt buộc |
| outlet_id | FK Outlet | UUID | ✅ Bắt buộc |
| route_id | FK Route | UUID | ✅ Bắt buộc |
| checkin_time | timestamp | 2026-06-05 08:15:00 | ✅ Bắt buộc |
| checkin_lat | decimal | 10.7769 | ✅ Bắt buộc |
| checkin_lng | decimal | 106.7009 | ✅ Bắt buộc |
| checkout_time | timestamp | 2026-06-05 08:27:00 | — Tùy chọn |
| checkout_lat | decimal | 10.7769 | — Tùy chọn |
| checkout_lng | decimal | 106.7009 | — Tùy chọn |
| is_forced | boolean | true/false | — Tùy chọn |
| force_reason | text | "Chợ đông, không ra đường" | — Tùy chọn |
| notes | text | "Chủ nói hết bia" | — Tùy chọn |
| duration_minutes | integer | 12 | — Tùy chọn (tự tính) |
| visit_score | decimal | 8.5/10 | Phase 2 |
| customer_feedback | text | "Dịch vụ tốt" | Phase 2 |
6. VisitInventory (Tồn kho snapshot)
| Trường | Kiểu dữ liệu | Ví dụ | Bắt buộc |
|---|---|---|---|
| visit_id | FK Visit | UUID | ✅ Bắt buộc |
| product_id | FK Product | UUID | ✅ Bắt buộc |
| quantity | decimal | 15 (thùng) | ✅ Bắt buộc |
| unit | text | "thùng" | ✅ Bắt buộc |
7. VisitPhoto (Hình ảnh)
| Trường | Kiểu dữ liệu | Ví dụ | Bắt buộc |
|---|---|---|---|
| visit_id | FK Visit | UUID | ✅ Bắt buộc |
| photo_url | text | "s3://bucket/visit_001.jpg" | ✅ Bắt buộc |
| photo_type | enum | display, invoice, receipt, other | ✅ Bắt buộc |
| caption | text | "Kệ hàng chính" | — Tùy chọn |
Mỗi visit tối đa 5 hình để tiết kiệm băng thông và storage. NV có thể xóa và chụp lại nếu cần.
8. SalesOrder (Đơn hàng)
| Trường | Kiểu dữ liệu | Ví dụ | Bắt buộc |
|---|---|---|---|
| order_number | text | "DH-20260605-001" (tự sinh) | ✅ Bắt buộc |
| order_type | enum | sale, return | ✅ Bắt buộc |
| user_id | FK User | UUID Sales Rep | ✅ Bắt buộc |
| outlet_id | FK Outlet | UUID | ✅ Bắt buộc |
| visit_id | FK Visit | UUID | ✅ Bắt buộc |
| status | enum | pending, approved, delivering, completed, cancelled | ✅ Bắt buộc |
| total_amount | decimal | 1,350,000 VNĐ | ✅ Bắt buộc |
| notes | text | "Giao trước 12h" | — Tùy chọn |
| approved_by | FK User | UUID Supervisor | — Tùy chọn |
| approved_at | timestamp | 2026-06-05 08:20:00 | — Tùy chọn |
| delivery_notes | text | "Đã giao, chủ ký nhận" | — Tùy chọn |
| delivery_proof_url | text | "s3://bucket/delivery_001.jpg" | — Tùy chọn (ảnh bằng chứng giao) |
| payment_status | enum | unpaid, paid | Phase 2 |
| return_reason | text | "Hết hạn sử dụng" | Phase 2 |
9. OrderItem (Chi tiết đơn)
| Trường | Kiểu dữ liệu | Ví dụ | Bắt buộc |
|---|---|---|---|
| order_id | FK SalesOrder | UUID | ✅ Bắt buộc |
| product_id | FK Product | UUID | ✅ Bắt buộc |
| quantity | decimal | 3 (thùng) | ✅ Bắt buộc |
| unit_price | decimal | 450,000 VNĐ | ✅ Bắt buộc |
| total_price | decimal | 1,350,000 VNĐ | ✅ Bắt buộc |
10. GPSLog (Vị trí GPS)
| Trường | Kiểu dữ liệu | Ví dụ | Bắt buộc |
|---|---|---|---|
| user_id | FK User | UUID | ✅ Bắt buộc |
| lat | decimal | 10.7769 | ✅ Bắt buộc |
| lng | decimal | 106.7009 | ✅ Bắt buộc |
| accuracy | decimal | 5 (mét) | ✅ Bắt buộc |
| recorded_at | timestamp | 2026-06-05 08:15:00 | ✅ Bắt buộc |
Enums (Danh sách giá trị)
| Enum | Giá trị |
|---|---|
| TerritoryStatus | active, inactive |
| OutletType | grocery, mini_market, pharmacy, restaurant, bar, other |
| OutletStatus | active, paused, closed, pending_approval |
| OrderType | sale, return |
| OrderStatus | pending, approved, preparing, delivering, completed, cancelled |
| VisitPhotoType | display, invoice, receipt, other |
| DayOfWeek | 1-7 (1=T2, 7=CN) |
Dữ liệu mẫu: 1 công ty, 8-20 NV
| Dữ liệu | 1 ngày | 1 tháng | Ghi chú |
|---|---|---|---|
| Visits | ~60-80 | ~1,500-2,000 | Mỗi NV ghé 8-10 điểm |
| Inventory records | ~800-1,200 | ~20,000-30,000 | 10-15 SP/visit |
| Photos | ~200-400 | ~5,000-10,000 | 3-5 hình/visit |
| Orders (bán) | ~15-30 | ~400-600 | Không phải visit nào cũng có đơn |
| Orders (trả) | ~2-5 | ~50-100 | ~10-15% tổng đơn |
| GPS logs | ~800-1,600 | ~20,000-40,000 | Mỗi NV log mỗi 5-10 phút |
| Order items | ~80-150 | ~2,000-4,000 | 4-6 SP/đơn |
Ai được làm gì trong Module DMS?
✅ = Toàn quyền | 👁️ = Chỉ xem | ✏️ = Tạo/Sửa | — = Không truy cập
| Chức năng | 🔴 Admin | 🟡 Manager | 🔵 Supervisor | ⚪ Staff | 🟢 Sales Rep | 🟠 Warehouse |
|---|---|---|---|---|---|---|
| 📍 ĐỊA BÀN & TUYẾN | ||||||
| Quản lý địa bàn (CRUD) | ✅ | ✅ | — | — | — | — |
| Xem địa bàn | ✅ | ✅ | 👁️ | — | 👁️ | — |
| Tạo/sửa tuyến | ✅ | ✅ | ✏️ | — | — | — |
| Gán NV vào tuyến | ✅ | ✅ | ✏️ | — | — | — |
| 🏪 ĐIỂM BÁN | ||||||
| Danh sách điểm bán | ✅ | ✅ | ✅ | — | 👁️ | — |
| Thêm điểm bán mới | ✅ | ✅ | ✏️ | — | ✏️ | — |
| Duyệt điểm bán mới | ✅ | ✅ | ✅ | — | — | — |
| Import Excel điểm bán | ✅ | ✅ | ✏️ | — | — | — |
| 📍 GHÉ THĂM | ||||||
| Check-in/out GPS | — | — | — | — | ✅ | — |
| Force check-in | — | — | — | — | ✅ | — |
| Xem lịch sử ghé thăm | ✅ | ✅ | ✅ | — | 👁️ | — |
| 📦 TỒN KHO ĐIỂM BÁN | ||||||
| Nhập tồn kho | — | — | — | — | ✅ | — |
| Xem snapshot tồn kho | ✅ | ✅ | ✅ | — | 👁️ | 👁️ |
| Cảnh báo hết hàng | ✅ | ✅ | ✅ | — | 👁️ | 👁️ |
| 📋 ĐƠN HÀNG | ||||||
| Tạo đơn bán | — | — | — | — | ✅ | — |
| Tạo đơn trả hàng | — | — | — | — | ✅ | — |
| Duyệt/từ chối đơn | ✅ | ✅ | ✅ | — | — | — |
| Cập nhật trạng thái đơn | ✅ | ✅ | ✅ | — | — | ✏️ |
| Xem đơn hàng | ✅ | ✅ | ✅ | — | 👁️ | 👁️ |
| Chụp bằng chứng giao | ✅ | ✅ | ✅ | — | ✏️ | ✏️ |
| 🛰️ GPS TRACKING | ||||||
| Xem vị trí NV real-time | ✅ | ✅ | ✅ | — | — | — |
| Xem lộ trình đã đi | ✅ | ✅ | ✅ | — | 👁️ | — |
| Log vị trí định kỳ | — | — | — | — | ✅ | — |
| 📊 DASHBOARD | ||||||
| Dashboard tổng quan | ✅ | ✅ | ✅ | — | — | — |
| Cảnh báo | ✅ | ✅ | ✅ | — | 👁️ | — |
| Báo cáo doanh số | ✅ | ✅ | ✅ | — | — | — |
| Báo cáo hiệu suất NV | ✅ | ✅ | ✅ | — | — | — |
| Xuất file (Excel/PDF) | ✅ | ✅ | ✅ | — | — | — |
7 Quy trình nghiệp vụ chính
Flow 1: Setup Địa bàn & Tuyến
"Khu vực Quận 1,3"
Chọn NV phụ trách
"Tuyến Q1 - Sáng"
Sắp xếp thứ tự
Chọn Sales Rep
Ngày nào chạy tuyến nào
Ai: Manager/Supervisor | Tần suất: 1 lần (và khi mở rộng kinh doanh) | Kết quả: NV mở app thấy tuyến hôm nay
Flow 2: NV Đi Tuyến Hàng Ngày (CORE FLOW)
flowchart TD
Start[NV mở app] --> ViewRoute[Xem tuyến hôm nay
Danh sách 8 điểm bán theo thứ tự]
ViewRoute --> SelectOutlet[Chọn điểm bán đầu tiên
Tạp hóa Minh An]
SelectOutlet --> CheckIn{Check-in GPS}
CheckIn -->|Trong 200m| CheckInOK[✅ Check-in OK
Tiếp tục nghiệp vụ]
CheckIn -->|Ngoài 200m| ForceCheckIn[⚠️ Cảnh báo
Cho phép force check-in]
ForceCheckIn --> EnterReason[Nhập lý do
"Chợ đông, không ra đường"]
EnterReason --> CheckInOK
CheckInOK --> Tasks{Tại điểm bán
4 nghiệp vụ (thứ tự bất kỳ)}
Tasks --> Inventory[📦 NHẬP TỒN KHO
Danh sách SP → Nhập SL
Highlight SP hết hàng]
Tasks --> Photos[📸 CHỤP HÌNH
Trưng bày, kệ hàng
Tối đa 5 hình]
Tasks --> CreateOrder[🛒 TẠO ĐƠN HÀNG
Chọn SP + SL
Tự tính tiền → Gửi]
Tasks --> Notes[📝 GHI CHÚ
Text tự do
"Chủ nói hết bia"]
Inventory --> CheckOut
Photos --> CheckOut
CreateOrder --> CheckOut
Notes --> CheckOut
CheckOut[Nhấn Check-out] --> CalcDuration[Tính thời gian
12 phút]
CalcDuration --> NextOutlet[Chuyển điểm tiếp
Lặp lại từ Check-in]
NextOutlet --> MorePoints{Còn điểm nào?}
MorePoints -->|Có| SelectOutlet
MorePoints -->|Không| DaySummary[Tổng kết ngày
8 điểm, 5 đơn, 2.5 triệu]
style CheckInOK fill:#6ee7b7,stroke:#059669
style ForceCheckIn fill:#fbbf24,stroke:#b45309
style DaySummary fill:#d4a73a,stroke:#b8860b,color:#1a1814
Ai: Sales Rep | Tần suất: Hàng ngày | Mục tiêu: 8-10 điểm/ngày, 5-15 phút/điểm
Flow 3: Thêm Điểm Bán Mới Từ Field
NV mở app
Tên, địa chỉ, loại hình, GPS
1-2 hình
Trạng thái "Chờ duyệt"
Xem → Duyệt hoặc Từ chối
Thêm vào tuyến, gán tọa độ
Flow 4: Xử Lý Đơn Hàng (Bán)
Hiện trên Dashboard
NV nào, điểm bán, SP, SL
✅ Duyệt / ❌ Từ chối / ✏️ Sửa
"Đã duyệt" → "Đang giao"
Chụp bằng chứng → "Hoàn thành"
Ai: Supervisor/Manager duyệt | Tần suất: Hàng ngày | Nếu từ chối: NV nhận thông báo + lý do
Flow 5: Trả Hàng / Đổi Hàng
"Tạo đơn trả hàng"
+ Lý do trả
Hàng lỗi, bao bì hỏng
Supervisor/Manager xem
Tạo phiếu nhập kho
Ai: Sales Rep tạo, Supervisor/Manager duyệt | Trạng thái giống đơn bán: PENDING → APPROVED → RETURNING → COMPLETED
Flow 6: Giám Sát Real-time
NV active, điểm đã ghé, đơn hàng, doanh số
Vị trí tất cả NV real-time
Lộ trình, timeline, đơn hàng, hình ảnh
Điểm chưa ghé, NV chưa check-out, force check-in, đơn hàng chờ duyệt
Flow 7: Báo Cáo Cuối Ngày (Tự động)
8/10
68/70
25 bán, 3 trả
18.5 triệu
2 điểm chưa ghé
342 hình
Ai: Hệ thống → Manager/Supervisor | Tần suất: Hàng ngày (18:00) | Gửi: Dashboard + Email
3 Phase: MVP → Nâng cao → Đầy đủ
gantt
title Lộ trình Module DMS
dateFormat WW
axisFormat Tuần %U
section MVP (Phase 1)
Quản lý địa bàn :m1, 01, 2w
Quản lý điểm bán :m2, 01, 2w
Duyệt điểm bán mới :m3, 01, 1w
Quản lý tuyến :m4, 02, 2w
Check-in/out GPS :m5, 02, 2w
Force check-in :m6, 02, 1w
Nhập tồn kho :m7, 03, 2w
Cảnh báo hết hàng :m8, 03, 1w
Chụp hình :m9, 03, 1w
Tạo đơn hàng :m10, 04, 2w
Tạo đơn trả hàng :m11, 04, 1w
Duyệt đơn :m12, 04, 2w
Dashboard tổng quan :m13, 05, 2w
GPS tracking :m14, 05, 2w
Báo cáo doanh số :m15, 06, 2w
section Nâng cao (Phase 2)
Offline mode :p1, 15, 3w
Tối ưu tuyến tự động :p2, 16, 2w
So sánh tồn kho :p3, 17, 1w
Quét mã vạch :p4, 17, 1w
Gợi ý đặt hàng :p5, 18, 2w
Xem tuyến trên bản đồ :p6, 19, 1w
Phân hạng khách hàng :p7, 20, 2w
section Đầy đủ (Phase 3)
Tích hợp khuyến mãi :f1, 28, 2w
AI gợi ý tối ưu tuyến :f2, 29, 2w
Phân tích hình ảnh :f3, 30, 3w
Tích hợp công nợ :f4, 33, 2w
Geo-analytics :f5, 34, 2w
Chi tiết từng Phase
| # | Chức năng | Mô tả |
|---|---|---|
| 1 | Quản lý địa bàn | CRUD địa bàn, gán Supervisor |
| 2 | Quản lý điểm bán | CRUD + Import Excel |
| 3 | Duyệt điểm bán mới | Xem, duyệt, từ chối từ NV |
| 4 | Quản lý tuyến | Tạo, gán NV, lịch trình tuần |
| 5 | Check-in/out GPS | 200m bán kính, tự động xác minh |
| 6 | Force check-in | Vượt bán kính + nhập lý do |
| 7 | Nhập tồn kho | Tại điểm bán, snapshot SP |
| 8 | Cảnh báo hết hàng | Highlight SP = 0 |
| 9 | Chụp hình | Tối đa 5 hình/lần ghé |
| 10 | Tạo đơn hàng bán | Chọn SP + SL, tự tính tiền |
| 11 | Tạo đơn trả hàng | Chọn SP + SL + lý do |
| 12 | Ghi chú tại điểm bán | Text tự do |
| 13 | Duyệt/từ chối đơn | Supervisor duyệt real-time |
| 14 | Cập nhật trạng thái đơn | Pending → Approved → Completed |
| 15 | Chụp bằng chứng giao | Đính kèm đơn hàng |
| 16 | Dashboard tổng quan | Manager/Supervisor xem tổng quan |
| 17 | Bản đồ theo dõi NV | Vị trí real-time |
| 18 | Dòng thời gian NV | Lộ trình đã đi |
| 19 | Cảnh báo | Chưa ghé, chưa check-out, force |
| 20 | Báo cáo doanh số | Tổng hợp theo ngày/tuần/tháng |
| 21 | Báo cáo hiệu suất NV | Số điểm ghé, đơn, doanh số |
| 22 | Báo cáo tồn kho | Tồn kho tại điểm bán |
| 23 | Xuất báo cáo | Excel/PDF |
| 24 | Tổng kết ngày cho NV | 8 điểm, 5 đơn, 2.5 triệu |
| 25 | Chi tiết giao hàng | Notes, by chứng |
| 26 | GPS tracking | Vị trí + lộ trình |
- Offline mode — Làm việc không mạng, sync khi có mạng
- Tối ưu tuyến tự động — Theo khoảng cách GPS
- So sánh tồn kho — So với lần trước (+/-)
- Quét mã vạch — Barcode/QR code
- Gợi ý đặt hàng — Dựa trên lịch sử
- Xem tuyến trên bản đồ — Tất cả điểm
- Lịch sử check-in — Chi tiết từng lần
- Thư viện hình ảnh — Lịch sử tất cả hình
- Báo cáo tần suất — Số lần ghé/tháng
- Phân hạng khách hàng — A/B/C theo doanh số
- Xem điểm bán trên bản đồ — Cluster view
- Tính visit score — Đánh giá tự động
- Phản hồi khách hàng — Nhận xét từ chủ điểm bán
- Ranh giới địa bàn — Bản đồ GEOJSON
- Lịch sử đơn hàng — Chi tiết từng đơn
- Tích hợp khuyến mãi — Trade marketing, CTKM
- AI gợi ý tối ưu tuyến — Machine learning
- Phân tích hình ảnh — AI nhận diện trưng bày
- Route planning tự động — Tự động gán tuyến
- Tích hợp công nợ — Module Debt-Tracking
- Báo cáo chi phí — Chi phí bán hàng
- Dashboard BI — Phân tích nâng cao
- Tích hợp ERP — Kế toán, SAP, Oracle
- Multi-warehouse routing — Đa kho
- Geo-analytics — Phân tích theo vùng
Không bao gồm trong Module DMS
- Quản lý công nợ / thu tiền → Module Debt-Tracking
- Quản lý kho tổng → Module Inventory
- Tích hợp ERP / kế toán → Phase 3 hoặc module riêng
- Quản lý nhân sự / lương → Module HR (chưa có trong lộ trình)
- Chấm công → Module Attendance
5 Bước để bắt đầu sử dụng
| Bước | Hành động | Ai làm | Kết quả |
|---|---|---|---|
| 1 | Tạo địa bàn | Manager | "Khu vực Quận 1,3" + Supervisor phụ trách |
| 2 | Import/Tạo điểm bán | Manager/Supervisor | Excel hoặc form, gán vào địa bàn |
| 3 | Tạo tuyến | Manager/Supervisor | Chọn điểm bán, sắp xếp thứ tự, gán NV |
| 4 | Cấu hình lịch trình tuần | Manager/Supervisor | Tuyến nào chạy ngày nào (T2,T4,T6...) |
| 5 | Test đi tuyến | 1 NV test | NV test toàn bộ flow từ check-in đến đơn hàng |
Nếu đã có dữ liệu điểm bán (Excel) → Import → 1-2 giờ setup xong. Nếu phải nhập thủ công → 1-2 ngày tùy số lượng điểm bán.
Cần xác nhận trước khi triển khai
- 4 loại hình điểm bán có đủ không? (tạp hóa, siêu thị mini, nhà thuốc, nhà hàng, khác) — Cần thêm quán bar, cafe?
- Bán kính check-in 200m có phù hợp? Cho cả khu vực chợ đông đúc?
- Tối đa 5 hình/lần ghé có đủ? Hay cần tăng lên 10?
- NV có cần xem lại tồn kho lần ghé trước không? MVP (không) hay Phase 2 (có)?
- Đơn trả hàng có cần phân biệt? Trả nhập kho / trả hủy / đổi hàng?
- Bằng chứng giao hàng? Chụp hóa đơn hay ký nhận điện tử?
- Lịch trình tuần: 1 tuyến có chạy nhiều ngày/tuần không? (VD: cùng tuyến T2+T4+T6)
- Offline mode ưu tiên cao không? (VN hay mất mạng thường xuyên)
- GPS log mỗi mấy phút? 5 phút vs 10 phút — ảnh hưởng pin + data
- Đơn giá: Cố định theo công ty hay theo khu vực/điểm bán?
- Tự động duyệt đơn dưới ngưỡng? (VD: đơn < 1 triệu tự động duyệt)
- Cần SMS/Email thông báo không? Khi có đơn mới, đơn duyệt...
- Limit GPS logs: Giữ bao lâu? 30 ngày / 90 ngày / vĩnh viễn?
- Multi-language: Cần tiếng Anh không? (cho NV nước ngoài)
Phụ lục A: Trước/Sau khi có DMS
| Công việc | Trước (Thủ công) | Sau (FieldFlow) |
|---|---|---|
| Kiểm soát NV đi tuyến | Gọi điện hỏi, tin tưởng | GPS real-time, check-in verify |
| Tồn kho tại điểm bán | NV gọi/nhắn tin, ghi giấy | Nhập trực tiếp trên app, snapshot |
| Tạo đơn hàng | Ghi giấy, gọi điện về công ty | Tạo trên app, tự tính tiền, gửi ngay |
| Duyệt đơn | Chờ cuối ngày/giờ chót | Duyệt real-time trên dashboard |
| Báo cáo doanh số | Tổng hợp Excel cuối tuần | Real-time + tự động cuối ngày |
| Phát hiện điểm bán mới | Ghi nhớ, báo cáo sau | Tạo ngay trên app, chờ duyệt |
| Trả hàng | Không quản lý / ghi giấy | Tạo đơn trả, chụp bằng chứng, duyệt |
| Theo dõi lộ trình | Không biết NV đi đâu | Bản đồ real-time + lịch sử |
Phụ lục B: Thuật ngữ
| Thuật ngữ | Giải thích |
|---|---|
| Territory (Địa bàn) | Khu vực địa lý gom nhóm điểm bán, 1 Supervisor quản lý |
| Outlet (Điểm bán) | Cửa hàng/đại lý bán lẻ mà NV ghé thăm |
| Route (Tuyến bán) | Danh sách điểm bán theo thứ tự, chạy vào ngày cố định trong tuần |
| Visit (Lần ghé thăm) | Sự kiện NV check-in đến check-out tại 1 điểm bán |
| Force check-in | Check-in ngoài bán kính GPS cho phép + nhập lý do |
| Sales Order (Đơn hàng) | Yêu cầu bán/trao hàng từ NV tại điểm bán |
| Return Order (Đơn trả hàng) | Yêu cầu trả hàng từ điểm bán về kho |
| Snapshot tồn kho | Ghi nhận tồn kho tại thời điểm ghé thăm, không tự động trừ |
| GPS Log | Vị trí GPS được ghi nhận định kỳ từ thiết bị NV |
| GPS Geofencing | Kiểm tra NV có trong bán kính điểm bán khi check-in |
FieldFlow — DMS Module: Quản lý Phân phối — Tháng 6/2026
← Quay lại Tổng quan Dự án