1. Sơ đồ trạng thái
CODE
🆕 NEW ──────────────────────────────────────────────────┐
│ │
▼ │
📌 ASSIGNED (R08 gán người rút) │
│ │
▼ │
🔧 IN_PROGRESS (Xử lý khắc phục + ảnh After) │
│ │
▼ │
📤 WAITING_APPROVE (Gửi xem xét) │
│ │
▼ │
✅ WAITING_EVALUATION (Trưởng nhóm phê duyệt) │
│ │
▼ │
┌──────────────────────────────┐ │
│ R07 Đánh giá viên │ │
│ ├─ PASS → ✅ COMPLETED │ ←── Đóng thẻ ────────────┘
│ └─ FAIL → ❌ REJECTED │
│ ↓ │
│ 🔧 IN_PROGRESS (làm lại)│
└──────────────────────────────┘
2. Vai trò trong Workflow
| Bước | Người thực hiện | Quyền |
|---|---|---|
| Tạo thẻ | Bất kỳ user active | R07/R08/R09 |
| Gán người rút | Trưởng nhóm | R08 |
| Xử lý khắc phục | Người được gán / Bất kỳ | Bất kỳ active |
| Gửi xem xét | Người rút thẻ | — |
| Phê duyệt | Trưởng nhóm | R08 |
| Đánh giá cuối | Đánh giá viên | R07 |
3. API Workflow
| Hành động | API Endpoint | Role |
|---|---|---|
| Tạo thẻ | POST /tags | All |
| Gán xử lý | POST /tags/{no}/assign | All |
| Cập nhật khắc phục | POST /tags/{no}/update-action | All (cùng location) |
| Gán rút thẻ | POST /tags/{no}/assign-withdraw | R08 |
| Gửi xem xét | POST /tags/{no}/request-review | Withdraw owner |
| Phê duyệt | POST /tags/{no}/approve-review | R08 |
| Đánh giá | POST /tags/{no}/evaluate | R07 |
4. Chi tiết từng bước
Bước 1: Tạo thẻ 🆕
- User chọn loại (Vàng/Đỏ), S-category, vị trí
- Nhập mô tả + ảnh before
- POST /tags → status='new'
Bước 2: Gán rút thẻ 📌
- Trưởng nhóm (R08) click "Gán tôi rút thẻ"
- POST /assign-withdraw → status='assigned'
Bước 3: Xử lý 🔧
- Người rút thẻ (hoặc bất kỳ) cập nhật khắc phục + ảnh after
- POST /update-action → status='in_progress'
Bước 4: Gửi xem xét 📤
- Người rút thẻ click "Gửi xem xét"
- POST /request-review → status='waiting_approve'
Bước 5: Phê duyệt ✅
- Trưởng nhóm (R08) click phê duyệt
- POST /approve-review → status='waiting_evaluation'
Bước 6a: Đánh giá Đạt ✅
- Đánh giá viên (R07) click "Đánh giá đạt"
- POST /evaluate?result=pass → status='completed'
Bước 6b: Đánh giá Không đạt ❌
- Đánh giá viên (R07) click "Không đạt"
- POST /evaluate?result=fail → status='rejected' → quay về 'in_progress'
- Xóa assignee, yêu cầu xử lý lại
5. Xử lý Offline
- Frontend lưu localStorage trước
- Sync server khi online
- Nếu online: gọi API trực tiếp
- Nếu offline: lưu local, tag.synced = false
Hàm đồng bộ
JAVASCRIPT
syncOfflineData() {
// Đọc từ IndexedDB
// Upload ảnh chưa sync
// Gọi API upload-tag-photo
// Xóa khỏi queue khi thành công
}
Audio thuyết minh
Nghe hướng dẫnĐường dẫn minh họa:
audio/25-workflow-the.mp3Click play để nghe hướng dẫn bằng giọng đọc.