File:index.htmllines 148-157,js/app.jslines 341-523
Tab: Lịch (📅)
1. Tổng quan
Màn hình hiển thị danh sách bộ tiêu chí (templates) và lịch đánh giá được gán. Click vào card → modal chọn loại ĐG + khu vực → bắt đầu phiên.
📅 Bộ tiêu chí đánh giá
Chọn bộ tiêu chí để bắt đầu phiên đánh giá mới
┌──────────────────────────────────┐
│ 📋 6S Sản Xuất │
│ 24 tiêu chí │
│ ┌──────────────────────┐ │
│ │ Sẵn sàng đánh giá │ │
│ └──────────────────────┘ │
└──────────────────────────────────┘
┌──────────────────────────────────┐
│ 📋 TPM PM Checklist │
│ 16 tiêu chí │
│ ┌──────────────────────┐ │
│ │ Sẵn sàng đánh giá │ │
│ └──────────────────────┘ │
└──────────────────────────────────┘
┌──────────────────────────────────┐
│ 📋 Safety Audit │
│ 20 tiêu chí │
│ ┌──────────────────────┐ │
│ │ Sẵn sàng đánh giá │ │
│ └──────────────────────┘ │
└──────────────────────────────────┘
2. Load dữ liệu (loadSchedules)
Khi vào tab Schedule (hoặc click từ Home):
1. Lấy user từ localStorage('6s_user')
2. Gọi API GET /schedules?user_id={userId}
3. Nếu có schedule được gán → renderScheduleList() (dạng assigned)
4. Fallback: GET /templates → render dạng card template
Element: #scheduleList — container chứa danh sách
Trạng thái tải
| Trạng thái | Hiển thị |
|---|---|
| Đang tải | 3 skeleton cards |
| Rỗng | "Không có bộ tiêu chí nào" |
| Lỗi | "Lỗi tải lịch đánh giá" |
3. Card Template
Mỗi template hiển thị dạng card:
<div class="schedule-card" onclick="startNewAssessment('{id}', '{name}')">
<div class="sc-title">📋 {name}</div>
<div class="sc-meta">{item_count} tiêu chí</div>
<div class="sc-badge in_progress">Sẵn sàng đánh giá</div>
</div>
| Trường | Mô tả | Nguồn |
|---|---|---|
| Tên template | Tên bộ tiêu chí | templates.name |
| Số tiêu chí | Tổng item trong template | templates.item_count |
| Badge | "Sẵn sàng đánh giá" | Badge xanh lá |
4. Modal: Chọn loại đánh giá (startNewAssessment)
Khi click vào card → mở modal:
┌──────────────────────────────────┐
│ 🔍 Chọn loại đánh giá │
│ 6S Sản Xuất │
│ │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ 🔍 │ │ 🔄 │ │ 👨🏫 │ │
│ │ Tự │ │ DG │ │ BLD │ │
│ │ ĐG │ │ Chéo │ │ + CG │ │
│ └──────┘ └──────┘ └──────┘ │
│ │
│ 📍 Khu vực đánh giá │
│ ┌────────────────────────────┐ │
│ │ -- Chọn khu vực -- ▼ │ │
│ └────────────────────────────┘ │
│ │
│ ┌────────────────────────────┐ │
│ │ 🚀 BẮT ĐẦU │ │
│ └────────────────────────────┘ │
│ ┌────────────────────────────┐ │
│ │ HỦY │ │
│ └────────────────────────────┘ │
└──────────────────────────────────┘
4.1. 3 loại đánh giá (EVAL_TYPES)
| Giá trị | Icon | Label | Mô tả | Ngưỡng |
|---|---|---|---|---|
self | 🔍 | Tự đánh giá | Đơn vị tự chấm điểm | ≥90% |
cross | 🔄 | Đánh giá chéo | Đơn vị khác đánh giá | ≥85% |
expert | 👨🏫 | BLĐ + Chuyên gia | Ban lãnh đạo & chuyên gia | ≥80% |
Chọn mặc định: self (card đầu tiên)
Hàm: selectEvalType(type, element) — toggle class selected, set window._selectedEvalType
4.2. Chọn khu vực (loadLocationsForModal)
Xử lý theo loại ĐG:
| Loại | Dữ liệu location |
|---|---|
| Self | userLocations — leaf nodes assigned cho user (từ API cicc-6s/v1) |
| Cross/Expert | Gọi GET /my-assignments?user_id=X&eval_type=Y → locations từ assignment. Fallback: full tree từ cicc-6s/v1/locations?tenant_id=X |
Format option:
📍 🔧 C1 - Chuyền 1 (C1)
Icon dựa theo level: 🏢 company → 🏭 plant → 🏘️ area → 🔧 line → 📍 other
Select element: #modalLocationId
4.3. Nút "🚀 BẮT ĐẦU" (confirmStartAssessment)
Luồng xử lý:
1. Validate: locationId đã chọn?
2. Nếu chưa → toast('Chọn khu vực!')
3. Đóng modal
4. Toast('Đang tạo phiên đánh giá...')
5. POST /sessions { template_id, location_id, eval_type, user_id }
6. Thành công → currentSession = response → loadSessionItems(sessionId) → switchTab('assessment')
7. Thất bại → toast lỗi
5. Các biến/hàm quan trọng
| Biến/Hàm | Mô tả |
|---|---|
templates | Array các bộ tiêu chí |
schedules | Array các lịch đánh giá được gán |
locations | Array locations cho modal (thay đổi theo eval_type) |
allLocationsCache | Cache full tree locations cho cross/expert |
userLocations | Locations của user (leaf nodes) |
window._selectedEvalType | Lưu loại ĐG đang chọn trong modal |
loadSchedules() | Load schedules + templates |
renderScheduleList() | Render card templates |
startNewAssessment(templateId, templateName) | Mở modal chọn ĐG |
loadLocationsForModal() | Load locations dropdown theo eval_type |
confirmStartAssessment(templateId, templateName) | Tạo phiên + chuyển tab |
Audio thuyết minh
audio/ass-02-bat-dau-danh-gia.mp3Click play để nghe hướng dẫn bằng giọng đọc.
Screenshots
images/assessment/ass-schedule-templates.pngChú thích: Danh sách bộ tiêu chí dạng card: 6S Sản Xuất, TPM PM, Safety Audit
images/assessment/ass-schedule-template-card.pngChú thích: Card template hiển thị tên, số tiêu chí, nút "Sẵn sàng đánh giá"
images/assessment/ass-schedule-start-modal.pngChú thích: Modal chọn loại ĐG (Tự DG/DG chéo/BLD+CG) + khu vực
images/assessment/ass-schedule-location-dropdown.pngChú thích: Dropdown chọn khu vực đánh giá với icon cấp level
images/assessment/ass-schedule-skeleton.pngChú thích: 3 skeleton cards hiển thị khi đang tải dữ liệu schedule