File:app.jslines 1388-1671
Truy cập: Click vào card Kanban → modal chi tiết
1. Modal Chi tiết thẻ (openCardDetail)
Khi click vào một thẻ trong Kanban, modal hiện ra với đầy đủ thông tin:
┌─────────────────────────────────────┐
│ Y-2026-00002 │
│ 🟡 Thẻ Vàng │
│ │
│ [QR Code] │
│ CICC-6S-Y-2026-00002 │
│ │
│ ┌──────────────────────┐ │
│ │ 🚨 Quá hạn │ │
│ └──────────────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ ⬅️ Before │ │ ➡️ After │ │
│ │ [📸 ảnh] │ │ [⏳ Chưa có] │ │
│ └──────────────┘ └──────────────┘ │
│ │
│ 📍 Khu vực: Xưởng May 2 / C1 │
│ 📝 Mô tả lỗi: Vật tư để không... │
│ 🔧 Cách khắc phục: Sắp xếp lại... │
│ 🏷️ Phân loại S: S2 │
│ │
│ 👤 Phát hiện: Trần Văn B │
│ 🔧 Xử lý: Nguyễn Văn A │
│ │
│ Ngày tạo: 23/06/2026, 08:30 │
│ Kết quả: ⏳ Chưa đánh giá │
│ │
│ [🔧 Cập nhật khắc phục] │ ← nếu chưa đóng
│ [📤 Gửi xem xét] │ ← nếu đã xử lý
│ [✅ Trưởng nhóm phê duyệt] │ ← nếu R08
│ [✅ Đánh giá đạt] [❌ Không đạt] │ ← nếu R07
│ │
│ [Đóng] │
└─────────────────────────────────────┘
Các trường hiển thị
| Thông tin | Nguồn dữ liệu |
|---|---|
| Mã thẻ | tag.ma hoặc tag.tag_no |
| Loại thẻ | tag.type / tag.tag_type → 🔴 Đỏ hoặc 🟡 Vàng |
| QR Code | Tự gen từ mã thẻ CICC-6S-{tagNo} |
| Badge trạng thái | getStatusBadge(tag) |
| Ảnh Before/After | tag.beforeImage, tag.afterImage |
| Khu vực | tag.area hoặc tag.location |
| Mô tả lỗi | tag.description |
| Cách khắc phục | tag.solution |
| Phân loại S | tag.s_category |
| Người phát hiện | tag.discoverer hoặc tag.reporter |
| Người xử lý | tag.withdraw_owner hoặc tag.assignee |
| Ngày tạo | tag.createdAt |
| Kết quả | eval_result → Đạt / Ko đạt / Chưa ĐG |
| QR Code rendered | Dùng thư viện QRCode.js |
2. Workflow xử lý thẻ
2.1 Sơ đồ trạng thái
🆕 NEW (Mới treo)
│
▼
📌 ASSIGNED (Đã gán rút) ──→ 🔧 IN_PROGRESS (Đang xử lý)
│ │
│ ▼
│ 📤 WAITING_APPROVE (Chờ phê duyệt)
│ │
│ ▼
│ ✅ WAITING_EVALUATION (Chờ đánh giá)
│ │
│ ├─ PASS → ✅ COMPLETED
│ └─ FAIL → ❌ REJECTED → 🔧 IN_PROGRESS
2.2 Nút "🔧 Xử lý" từ Kanban Card
Click → tự động phát hiện bước tiếp theo:
moKhacPhuc(tagNo):
if (!tag.assigned && !tag.assignee_id) → hienThiNhanTask(t) // Bước 1
else if (!tag.solution && !tag.action_desc) → hienThiGuiXemXet(t) // Bước 2
else if (!tag.reviewResult && !tag.eval_result) → hienThiDanhGia(t)// Bước 3
else → openCardDetail(t) // Đã xong
2.3 Bước 1: Nhận task (hienThiNhanTask)
Modal xác nhận:
📥 Nhận task
Thẻ: Y-2026-00002
Mô tả: Vật tư để không đúng nơi quy định
Vị trí: Xưởng May 2 / C1 - Chuyền 1
[📸 ảnh before]
Bạn có xác nhận nhận xử lý thẻ này?
[📥 Nhận task] [Huỷ]
Xử lý: nhanTask(tagNo)
- Set
tag.assigned = true - Set
tag.assignee_id= user id hiện tại - Lưu localStorage → render lại Kanban
2.4 Bước 2: Gửi xem xét (hienThiGuiXemXet)
Modal form:
🔧 Xử lý thẻ Y-2026-00002
Mô tả: Vật tư để không đúng nơi quy định
Vị trí: Xưởng May 2 / C1 - Chuyền 1
[📸 ảnh before]
Biện pháp khắc phục:
[________________________________]
[________________________________]
Ảnh sau cải tiến (After):
[📷 Chụp ảnh After]
[Preview ảnh]
[📤 Gửi xem xét] [Huỷ]
Xử lý: guiXemXet(tagNo)
- Lưu
tag.solution= biện pháp khắc phục - Lưu
tag.afterImage= ảnh after (nén, compress) - Lưu localStorage → render lại Kanban
2.5 Bước 3: Đánh giá (hienThiDanhGia)
Modal so sánh Before/After:
📋 Đánh giá thẻ Y-2026-00002
Mô tả: Vật tư để không đúng nơi quy định
Vị trí: Xưởng May 2 / C1 - Chuyền 1
Biện pháp: Đã sắp xếp lại giá kệ
┌──────────────┐ ┌──────────────┐
│ ⬅️ Before │ │ ➡️ After │
│ [📸 ảnh] │ │ [📸 ảnh] │
└──────────────┘ └──────────────┘
Kết quả đánh giá:
○ ✅ Đạt - Rút thẻ
○ ❌ Không đạt - Làm lại
Người đánh giá: [________________]
[✅ Xác nhận] [Huỷ]
Xử lý: xacNhanDanhGia(tagNo)
- Nếu OK:
tag.status = 'closed',tag.eval_result = 'pass' - Nếu NG:
tag.status = 'rejected',tag.eval_result = 'fail' - Lưu localStorage → render lại Kanban
3. Workflow API (Server-side)
Khi online, các action gọi API tương ứng:
| Hành động | Endpoint | Dữ liệu gửi |
|---|---|---|
| Cập nhật khắc phục | POST /tags/{tag_no}/update-action | { user_id, action_desc } |
| Gán tôi rút thẻ | POST /tags/{tag_no}/assign-withdraw | { user_id, owner_id, owner_name } |
| Gửi xem xét | POST /tags/{tag_no}/request-review | { user_id } |
| Trưởng nhóm phê duyệt | POST /tags/{tag_no}/approve-review | { user_id } |
| Đánh giá cuối | POST /tags/{tag_no}/evaluate | { user_id, result: 'pass'/'fail', note } |
Phân quyền cứng:
| Endpoint | Role yêu cầu |
|---|---|
assign-withdraw | R08 |
approve-review | R08 |
evaluate | R07 (chỉ đánh giá viên) |
4. Modal Cập nhật khắc phục (openSubmitModal)
Nút "🔧 Cập nhật khắc phục" trong chi tiết thẻ:
🔧 Cập nhật khắc phục: Y-2026-00002
Hành động khắc phục
[___________________________]
[💾 LƯU CẬP NHẬT] [Hủy]
Hàm: doUpdateAction(tagNo)
- Gọi API
/update-actionnếu online - Fallback offline
5. Gán rút thẻ (doAssignWithdraw)
Nếu user là R08 (Trưởng nhóm) và thẻ chưa có withdraw_owner_id:
→ Nút "📌 Gán tôi rút thẻ"
→ Gán user hiện tại làm người rút thẻ
6. Gửi xem xét / Phê duyệt / Đánh giá
Trưởng nhóm R08:
- Thấy nút "📤 Gửi xem xét" khi đã xử lý → gọi API
/request-review - Thấy nút "✅ Trưởng nhóm phê duyệt" khi chờ approve → gọi API
/approve-review
Đánh giá viên R07:
- Thấy nút "✅ Đánh giá đạt" + "❌ Không đạt" khi chờ evaluation
- Click → prompt nhập ghi chú → gọi API
/evaluate
Audio thuyết minh
audio/07-chi-tiet-the.mp3Click play để nghe hướng dẫn bằng giọng đọc.
Screenshots
images/chitiet/chitiet-modal-overview.pngChú thích: Modal chi tiết thẻ hiển thị đầy đủ thông tin, QR Code, badge trạng thái
images/chitiet/chitiet-before-after.pngChú thích: Khu vực hiển thị ảnh Before và After của thẻ
images/chitiet/chitiet-nhan-task.pngChú thích: Modal xác nhận nhận task xử lý thẻ
images/chitiet/chitiet-gui-xem-xet.pngChú thích: Form nhập biện pháp khắc phục + ảnh After khi gửi xem xét
images/chitiet/chitiet-danh-gia.pngChú thích: Modal đánh giá so sánh ảnh Before/After, chọn Đạt/Không đạt
images/chitiet/chitiet-approve-r08.pngChú thích: Nút phê duyệt dành cho Trưởng nhóm (R08)
images/chitiet/chitiet-evaluate-r07.pngChú thích: Nút Đạt/Không đạt dành cho Đánh giá viên (R07)
images/chitiet/chitiet-workflow-diagram.pngChú thích: Sơ đồ trạng thái từ NEW → ASSIGNED → IN_PROGRESS → WAITING_APPROVE → COMPLETED/REJECTED