File:index.htmllines 159-169,js/app.jslines 525-816
Tab: Đánh giá (📝)
1. Tổng quan
Màn hình chính để chấm điểm từng tiêu chí trong bộ tiêu chí đã chọn. Hiển thị sau khi tạo phiên từ tab Schedule.
┌──────────────────────────────────┐
│ Phiên đánh giá │
│ AS-20260623-001 │
│ Loại: 🔍 Tự đánh giá Đạt từ: 90%│
├──────────────────────────────────┤
│ │
│ [🏘️ S1 - Sàng lọc 12/15(80%)]│
│ ████████████████░░░░░░ │
│ │
│ S1_01 · Phân loại vật dụng │
│ 💡 Gợi ý: 3/5 │
│ ❌0 ⚠️1 ✅2 ⭐3 ⭐4 ⭐5 │
│ [⚠️ Treo thẻ] [📷 Chụp ảnh] │
│ [Ghi chú...___________________] │
│ │
│ S1_02 · Loại bỏ vật không cần │
│ ❌0 ⚠️1 ✅2 ⭐3 ⭐4 ⭐5 │
│ [Ghi chú...___________________] │
│ │
│ [🏘️ S2 - Sắp xếp 8/10(80%)]│
│ ... │
│ │
├──────────────────────────────────┤
│ 📊 Tiến độ: 18/24 tiêu chí 75% │
│ ██████████████░░░░░░░░░░ │
│ │
│ [📤 GỬI KẾT QUẢ (18/24)] │
│ [← Quay lại] │
└──────────────────────────────────┘
2. Header phiên
Phần header xanh lá nhạt hiển thị thông tin phiên:
┌──────────────────────────────────┐
│ Phiên đánh giá │
│ AS-20260623-001 │
│ 🔍 Tự ĐG │
│ Đạt từ:90%│
└──────────────────────────────────┘
| Trường | Nguồn |
|---|---|
| Mã phiên | currentSession.assessment_no |
| Loại ĐG | EVAL_TYPES[currentSession.eval_type].label |
| Ngưỡng | EVAL_THRESHOLDS[currentSession.eval_type] |
3. Các nhóm tiêu chí (Groups)
Group header
Mỗi group (S1, S2... S6) hiển thị dưới dạng card riêng:
[🏘️ S1 - Sàng lọc 12/15 (80%)]
[████████████████░░░░░░░] ← progress bar
| Màu bar | Ý nghĩa |
|---|---|
Xanh excellent | ≥ 90% |
Xanh dương good | 70-89% |
Cam fair | 50-69% |
Đỏ poor | < 50% |
Item (tiêu chí con)
Mỗi item gồm:
S1_01 · Phân loại vật dụng ← item_code + item_name
💡 Gợi ý từ 6S tags: 3/5 ← suggested_scores (nếu có)
❌0 ⚠️1 ✅2 ⭐3 ⭐4 ⭐5 ← radio chấm điểm
[⚠️ Treo thẻ ] ← nếu điểm ≤ 1
[📷 Chụp ảnh] ← chụp ảnh minh chứng
[Ghi chú...___________________] ← textarea ghi chú
Thang điểm:
| Giá trị | Icon | Mô tả |
|---|---|---|
| 0 | ❌ | Không đạt |
| 1 | ⚠️ | Cần cải thiện |
| 2-3 | ✅ | Đạt |
| 4-5 | ⭐ | Xuất sắc |
4. Chức năng "Treo thẻ nhanh"
Khi điểm item ≤ 1, nút ⚠️ Treo thẻ xuất hiện.
Luồng (quickTagFromItem)
1. Click "⚠️ Treo thẻ"
2. Modal hiện với thông tin:
- Loại thẻ: Vàng (S1-S5) / Đỏ (S6)
- Mô tả tự động: "[Từ đánh giá] item_name - comment"
- Location: location của phiên hiện tại
3. User nhập mô tả + chỉnh sửa
4. Submit → POST /tags (cicc-6s/v1)
5. Thành công: toast('✅ Đã tạo thẻ X!')
Hàm: quickTagFromItem(itemId, itemName, groupCode), submitQuickTag(groupCode)
5. Chụp ảnh minh chứng
Nút "📷 Chụp ảnh"
| Element | ID |
|---|---|
| Nút chụp | photoBtn_{itemId} |
| Preview | photoPreview_{itemId} |
| Ảnh | photoImg_{itemId} |
Hàm
| Hàm | Mô tả |
|---|---|
captureItemPhoto(itemId) | Mở camera → chụp → lưu base64 vào currentPhotos[itemId] |
retakeItemPhoto(itemId) | Chụp lại (xóa ảnh cũ) |
removeItemPhoto(itemId) | Xóa ảnh |
uploadItemPhotos() | Upload tất cả ảnh khi submit (POST /upload) |
6. Tiến độ & Submit
Progress bar tổng thể
📊 Tiến độ: 18/24 tiêu chí 75%
[████████████████░░░░░░░░░]
Nút submit
[📤 GỬI KẾT QUẢ (18/24)] ← opacity 0.6 nếu chưa chấm hết
Hàm: submitAssessment()
Luồng:
1. Nếu chưa chấm hết → confirm("Chỉ chấm X/Y...?")
2. Toast("Đang gửi kết quả...")
3. POST /sessions/{id}/submit { scores, comments }
4. Thành công:
- Upload ảnh nếu có
- Hiển thị kết quả modal (ĐẠT/KHÔNG ĐẠT)
- Các nút: Về trang chủ | Xem báo cáo | Tạo Observation
5. Offline: lưu vào IndexedDB → sync sau
7. Modal kết quả
┌──────────────────────────────────┐
│ │
│ ✅ │
│ ĐẠT │
│ 85% │
│ 34/40 điểm │
│ │
│ Phiên: AS-20260623-001 │
│ Loại: Tự đánh giá │
│ Ngưỡng đạt: 90% │
│ │
│ [🏠 Về trang chủ] │
│ [📊 Xem báo cáo] │
│ [⚠️ Tạo Observation] │
└──────────────────────────────────┘
Công thức kết quả
pct = total_score / max_score * 100
if (pct >= threshold) → ĐẠT ✅
else → KHÔNG ĐẠT ❌
| Loại | Threshold |
|---|---|
| self | ≥ 90% |
| cross | ≥ 85% |
| expert | ≥ 80% |
8. Các biến/hàm quan trọng
| Biến | Mô tả |
|---|---|
currentSession | Phiên đánh giá hiện tại |
currentScores | Object { itemId → score } |
currentComments | Object { itemId → comment } |
currentPhotos | Object { itemId → base64 } |
| Hàm | Mô tả |
|---|---|
loadSessionItems(sessionId) | Load items từ API + pre-fill scores |
renderAssessmentForm() | Render toàn bộ form chấm điểm |
setScore(itemId, score) | Lưu điểm + re-render |
setComment(itemId, comment) | Lưu comment |
quickTagFromItem() | Mở modal treo thẻ nhanh |
submitQuickTag() | Gửi tạo thẻ 6S |
submitAssessment() | Submit toàn bộ kết quả |
Audio thuyết minh
audio/ass-03-cham-diem.mp3Click play để nghe hướng dẫn bằng giọng đọc.
Screenshots
images/assessment/ass-assessment-form.pngChú thích: Màn hình chấm điểm với header phiên, groups, progress bar, nút submit
images/assessment/ass-assessment-header.pngChú thích: Header phiên: mã phiên AS-20260623-001, loại Tự ĐG, ngưỡng 90%
images/assessment/ass-assessment-group-s1.pngChú thích: Group S1 - Sàng lọc với progress bar + danh sách items
images/assessment/ass-assessment-item-scored.pngChú thích: Item đã chấm điểm + ghi chú
images/assessment/ass-assessment-quick-tag-btn.pngChú thích: Nút "Treo thẻ" xuất hiện khi điểm item ≤ 1
images/assessment/ass-assessment-quick-tag-modal.pngChú thích: Modal treo thẻ nhanh điền sẵn thông tin từ đánh giá
images/assessment/ass-assessment-item-photo.pngChú thích: Nút chụp ảnh + preview ảnh cho từng item
images/assessment/ass-assessment-progress.pngChú thích: Progress bar + % tiến độ chấm điểm tổng thể
images/assessment/ass-assessment-result-pass.pngChú thích: Modal kết quả ĐẠT: điểm, tỷ lệ, nút Về trang chủ/Xem báo cáo
images/assessment/ass-assessment-result-fail.pngChú thích: Modal kết quả KHÔNG ĐẠT: nút Tạo Observation, tạo 6S Tag