diff --git a/src/api/admin.js b/src/api/admin.js index b857bab..5014b00 100644 --- a/src/api/admin.js +++ b/src/api/admin.js @@ -435,4 +435,39 @@ export function setBigAnswerScores(group, uid, scores) { return request.put(`/admin/big-answers/${group}/${uid}/scores`, scores) } +// ==================== 成绩复核 ==================== +// 场景:考生对成绩有异议 → 按「姓名 / 身份证号 / 电话」任一检索 → 核对全卷题目与作答。 + +/** + * 检索考生(姓名 / 身份证号 / 电话 任一,模糊匹配) + * + * 不传 group 则全组别检索 —— 复核时通常只拿到一个身份证号,不应强迫先猜组别。 + * @param {string} keyword - 检索词 + * @param {string} [group] - 可选:限定组别 + * @returns {Promise} { list: [{ contestantId, name, idNumber, phone, group, objectiveApplicable }], total, truncated } + */ +export function reviewSearch(keyword, group) { + const params = { keyword } + if (group) params.group = group + return request.get('/admin/review/search', { params }) +} + +/** + * 考生全卷明细(复核) + * + * 返回客观题逐题(题干 / 选项 / 考生答案 / **正确答案** / 对错 / 得分 / 满分) + * + 综合大题(题干快照 + 三小问作答与得分)+ 本科/教师组作品文件清单。 + * ⚠️ 含正确答案,仅管理员可用。 + * @param {string} group - 组别标识(须与考生实际组别一致) + * @param {number|string} contestantId - 考生 ID(contestants.id) + * @returns {Promise} { name, idNumber, phone, group, objectiveApplicable, scorePublished, + * objective: [{ seq, questionType, questionUid, question, options, correctAnswer, maxScore, + * answer, answered, isCorrect, score, answerMatches, questionMissing }], + * summary: { answered, total, correctCount, autoScore, wordScore, totalScore }, + * bigQuestion, works, warnings, matchedKeys, questionOrderFixed } + */ +export function getContestantScore(group, contestantId) { + return request.get(`/admin/review/score/${group}/${contestantId}`) +} + diff --git a/src/views/Admin.vue b/src/views/Admin.vue index 0c2b7f2..83a455b 100644 --- a/src/views/Admin.vue +++ b/src/views/Admin.vue @@ -48,6 +48,10 @@ 成绩管理 + + + 成绩复核 + 新闻管理 @@ -990,6 +994,255 @@ + + +