V
VPath Academy Khu Vực Worker
{{ currentUser.name }}

Không Có Quyền Truy Cập

Trang này chỉ dành cho tài khoản Worker hoặc Admin. Vui lòng đăng nhập bằng tài khoản được cấp quyền.

Tài khoản {{ currentUser.name }} không có quyền vào khu Worker. Bạn vẫn đang đăng nhập bình thường, không cần đăng nhập lại.

Đăng Nhập

{{ loadError }}

Danh Mục

Cấp học, môn học, component (paper) và chủ đề — sửa ở đây là trang Ôn Luyện, Worker và Admin đổi theo. Khoá (key) sinh một lần lúc tạo rồi cố định; mục còn dữ liệu thì không xoá được, bấm Ẩn thay vì xoá.

Cấp học ({{ danhMuc.levels.length }})

Chưa có cấp học nào.

Thêm cấp học

Khoá chỉ gồm chữ, số, gạch nối (VD A-Level) — sửa được trước khi bấm Thêm, sau đó cố định. Chương trình là hội đồng khảo thí (CIE, AQA, Edexcel...), gõ giống hệt nhau giữa các cấp cùng hội đồng; để trống thì cấp vào nhóm "Khác".

Môn học · {{ dmCapChon ? danhMuc.nhanCap(dmCapChon) : 'chọn cấp ở cột trái' }}

Chọn một cấp học để xem môn.

Component & Chủ đề · {{ dmMonDangChon ? dmMonDangChon.label : 'chọn môn ở cột giữa' }}

Chọn một môn để xem component và chủ đề.

Lịch sử thay đổi (30 dòng mới nhất)

{{ dinhDangThoiGian(c.createdAt) }} {{ c.userEmail || '?' }} {{ c.summary }}

Chưa có thay đổi nào được ghi lại.

Chọn Đề Thi Để Cắt Câu Hỏi

Tải Lên Đề Mới (PDF)

Web tự nhận diện đề thi/mark scheme/tờ insert + paper number/variant từ 5 ký tự cuối tên file (VD: qp_11 = đề thi paper 1 variant 1, ms_12 = mark scheme paper 1 variant 2, in_21 = tờ insert của paper 2 variant 1), và tự nhận diện luôn Year + Series từ chữ w/s/m + năm 2 số ngay trước đó (VD w25 = Oct-Nov 2025, s24 = May-June 2024, m23 = Feb-Mar 2023) — mỗi file dùng đúng năm/kỳ thi của chính nó, tải chung 1 lượt vẫn được. File nào tên không theo đúng quy ước thì dùng tạm Year/Series đang chọn ở trên. Ngoài quy ước Cambridge ..._qp_11.pdf / ..._ms_11.pdf, web còn đọc được tên tiếng Anh đầy đủ dạng 9701 Chemistry March 2026 Question Paper 12.pdf / ... Mark Scheme 12.pdf (2 chữ số cuối = paper + variant), không cần đổi tên file trước khi chọn. Bấm "Choose Files" nhiều lần để chọn thêm dần dần — file cũ vẫn giữ nguyên, không bị mất.

{{ file.name }}

Đang chọn file thuộc {{ uploadPreview.sessionCount }} kỳ thi khác nhau — mỗi đề bên dưới sẽ tự lưu đúng năm/kỳ thi riêng của nó.

{{ g.sessionPeriod }} {{ g.year }} · Paper {{ g.paperNumber }}/{{ g.variant }}
Đề thi Mark scheme Insert

Sẽ BỎ QUA {{ uploadPreview.unparsed.length }} file không đọc được tên (các đề đọc được ở trên vẫn tải lên bình thường): {{ uploadPreview.unparsed.join(', ') }} — muốn tải cả các file này thì đổi tên về dạng "9701_m26_qp_12.pdf" hoặc "9701 Chemistry March 2026 Question Paper 12.pdf".

File trùng paper/variant: {{ uploadPreview.duplicates.join('; ') }}

Lô đang trộn NHIỀU MÔN — bỏ các file này ra (nút x), hoặc tải chúng ở một lượt riêng sau khi đổi môn trên form: {{ uploadPreview.monTronLan.join('; ') }}

{{ uploadFailures.length }} đề không lên được — đã chọn sẵn lại file của chúng, bấm Tải Lên lần nữa là xong

{{ fl.label }} — {{ fl.reason }}
Đã xong {{ uploadProgress.done }}/{{ uploadProgress.total }} đề · đang tải {{ uploadProgress.label }} {{ uploadProgress.percent }}%

{{ Math.round(uploadProgress.sentBytes / 1048576) }}/{{ Math.round(uploadProgress.totalBytes / 1048576) }} MB · {{ uploadProgress.etaText }} · đừng đóng tab hay bấm refresh cho tới khi xong

Chạy Tự Động Hàng Loạt (Qua Đêm)

Tự động cắt + lưu MỌI đề chưa "Đã Cắt Xong", chạy nối tiếp nhau NGAY TRÊN SERVER — bấm 1 lần rồi cứ để server chạy (đừng tắt "npm start"), không cần giữ trình duyệt mở, quay lại xem kết quả sau cũng được.

{{ batchStatus.running ? 'Đang chạy' : 'Lần chạy gần nhất' }} — {{ batchStatus.jobLabel }}: {{ batchStatus.processedCount }}/{{ batchStatus.total }} đề (đã dừng theo yêu cầu) Đang xử lý: {{ batchStatus.currentPaper.label }}
{{ res.label }} Tạo {{ res.created }} câu · {{ res.skippedExisting }} đã có sẵn · {{ res.skippedNoMapping }} nháp (thiếu chủ đề) · Đã Cắt Xong ✓ Lỗi: {{ res.error }}
Tiến độ: {{ croppingProgress.done }}/{{ croppingProgress.total }} đề đã cắt xong
{{ p.level }} {{ subjectLabel(p.subject, p.level) }} · Mã {{ p.paperCode }} · Paper {{ p.paperNumber }}/{{ p.variant }} · {{ p.sessionPeriod }} {{ p.year }} Đã Cắt Xong Đang Làm Dở Có Insert

Để trống thì trang Past Paper dùng link tự ghép công thức ở trên (placeholder) — chỉ dán khi link đó sai hoặc báo "Paper not found".

Đã đính kèm Chưa có tờ insert

File PDF, tối đa 25MB. Có tờ này thì mọi câu cắt từ đề được thêm nút "Insert Paper" ở trang luyện tập, mở ra xem hai bên cạnh nhau. Đề không dùng tư liệu chung thì cứ để trống.

Chưa có đề thi nào — tải đề mới ở trên.

Đề nào cũng đã cắt xong rồi — bỏ tick "Chỉ hiện đề chưa cắt xong" để xem lại.

{{ subjectLabel(selectedPaper.subject, selectedPaper.level) }} · Mã {{ selectedPaper.paperCode }} · Paper {{ selectedPaper.paperNumber }}/{{ selectedPaper.variant }} · {{ selectedPaper.sessionPeriod }} {{ selectedPaper.year }} Đã Cắt Xong

Đang Làm Dở
Trang {{ pdfPage }}/{{ pdfNumPages || '?' }}

Kéo chuột trên trang để chọn khung câu hỏi/đáp án, sau đó bấm "Cắt Vùng Này" — hoặc bật "Cắt Tự Động" để web tự gợi ý khung cắt mỗi khi bạn sang trang, rồi bấm vào khung màu cam muốn dùng để cắt luôn. Tắt đi bất cứ lúc nào để quay lại cắt tay hoàn toàn.

{{ editingQuestionId ? 'Đang Sửa Câu ' + (draft.questionNumber || '?') : 'Câu Hỏi Đang Soạn' }}

Đang tải ảnh đã lưu...

Ảnh câu hỏi ({{ draft.questionImages.length }})

Ảnh đáp án ({{ draft.markSchemeImages.length }})

Đang tải chủ đề...

Chưa có chủ đề cho môn/cấp này — bấm "Thêm chủ đề" ở trên.

Thêm chủ đề cho Paper {{ selectedPaper.paperNumber }} · {{ subjectLabel(selectedPaper.subject, selectedPaper.level) }}

"{{ chuDeCanGop.name }}" còn {{ chuDeCanGop.topicalQuestionCount }} câu Topical và {{ chuDeCanGop.mcqQuestionCount }} câu trắc nghiệm — không xoá thẳng được.

Ba lựa chọn: Gộp — chuyển hết câu sang chủ đề khác rồi xoá chủ đề này; Ẩn — giấu khỏi học sinh, giữ nguyên mọi thứ; Xoá kèm nội dung — xoá luôn, có bảng kê rõ mất gì trước khi xác nhận (cần khi muốn xoá cả môn).

Có thể lưu ngay, chưa cần đáp án — quay lại thêm ảnh đáp án sau cũng được.

Đã cắt cho đề này ({{ savedQuestionsForPaper.length }}) — bấm để sửa · {{ pendingMarkSchemeCount }} câu thiếu đáp án

Chưa cắt câu nào.