You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dianshang-houduan/docs/superpowers/specs/2026-09-03-teacher-grade-pr...

3.3 KiB

教师成绩列表进度与评分同步设计

目标

教师端成绩列表展示学生已完成实训任务数与总实训任务数,并实时汇总教师在任务评阅中保存的逐任务评分;成绩列表不再允许直接录入或保存教师总分。

问题与根因

当前进度统计从旧的 stu_grade 查询已完成模块,而当前实训完成状态保存在 student_training_answer,导致完成实训的学生仍显示为 0%。当前教师评分写入单独的 teaching_class_teacher_score 汇总表,和逐任务评阅没有数据关联。

数据模型

在 student_training_answer 增加以下字段:

  • teacher_score:教师对该任务的 0–100 分评分,可为空。
  • teacher_scored_by:评分教师用户 ID,可为空。
  • teacher_scored_at:评分时间,可为空。

每条答卷已经唯一对应学生、教学班与实训任务,因此不新增独立评分表,也不再使用人工汇总评分作为成绩列表的数据源。

评阅与权限

成绩详情弹窗扩展为任务评阅界面,展示当前教学班已启用的全部任务及对应任务状态、AI 评测成绩和教师评分。班级创建教师可对已提交或状态为 COMPLETED 的任务录入 0–100 分并保存;其他教师仅可查看。未完成任务不可评分。

成绩列表的“老师评分”列只读:尚无任何教师任务评分时显示“待评阅”,存在评分后显示实时计算结果。移除列表中的数字输入框、保存按钮和人工汇总评分接口调用。

实训进度

总任务数取当前教学班启用的已分配任务(使用学校默认任务回退规则,排除发布标记与未参与的综合实训)。完成任务数取同一学生、同一教学班中 submitted = true 或 progress_status = COMPLETED 的答卷,并按任务去重。

列表显示 已完成数/总数,并保留百分比提示;没有可用任务时显示 --。

教师评分计算

教师总分复用当前参考成绩的六模块算法:按 TrainingTask.projectName 把任务归入六个模块;每个模块先计算该模块所有已分配任务教师评分的平均值,未评分任务按 0 分参与平均;再乘以当前教学班的六项权重。综合实训是否参与、参与权重归一化与 ScoreRankServiceImpl.calculateSixModuleScore 保持一致。

若班级尚未保存权重配置,教师评分计算使用并持久化与参考成绩相同的默认六项权重,不能使用另一套默认值。

该值在成绩列表和导出查询时即时计算,不依赖“成绩更新”按钮。任务评分保存后,重新请求列表即可得到新总分。

接口与兼容性

  • 成绩详情接口改为返回全部有效任务及答卷、AI 分数和教师评分。
  • 新增受班级创建教师权限保护的逐任务评分保存接口。
  • 现有 /api/weight/saveTeacherScore 不再由前端调用;旧汇总数据保留,不迁移、不删除。

测试

  • 后端:验证答卷完成状态统计、无任务显示空进度、逐任务评分权限、未完成任务不能评分、按六模块权重汇总及未评分任务按零分计算。
  • 前端:验证列表展示完成数/总数、教师评分只读、详情中存在任务评分控件、没有列表人工评分控件或人工评分 API 调用。