diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/AiTrainingEvaluationServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/AiTrainingEvaluationServiceImpl.java index 004dd86..1d5b440 100644 --- a/src/main/java/com/sztzjy/linkCommerce/service/impl/AiTrainingEvaluationServiceImpl.java +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/AiTrainingEvaluationServiceImpl.java @@ -20,6 +20,7 @@ import com.sztzjy.linkCommerce.mapper.TeachingClassStudentMapper; import com.sztzjy.linkCommerce.mapper.TrainingTaskMapper; import com.sztzjy.linkCommerce.mapper.TrainingTaskClassConfigMapper; import com.sztzjy.linkCommerce.service.AiTrainingEvaluationService; +import com.sztzjy.linkCommerce.service.ScoreRankService; import com.sztzjy.linkCommerce.service.TrainingKnowledgeService; import com.sztzjy.linkCommerce.training.knowledge.EffectiveTrainingTaskContent; import lombok.extern.slf4j.Slf4j; @@ -35,6 +36,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Slf4j @Service @@ -63,6 +65,8 @@ public class AiTrainingEvaluationServiceImpl implements AiTrainingEvaluationServ public StudentTrainingAnswerMapper studentTrainingAnswerMapper; @Autowired public TeachingClassStudentMapper teachingClassStudentMapper; + @Autowired + public ScoreRankService scoreRankService; @Autowired(required = false) public TrainingTaskClassConfigMapper trainingTaskClassConfigMapper; @Autowired(required = false) @@ -129,6 +133,7 @@ public class AiTrainingEvaluationServiceImpl implements AiTrainingEvaluationServ EvaluationContext context = resolveContext(taskKey, user, true); AiTrainingEvaluation evaluation = getOrCreate(context, user); if (PROCESSING.equals(evaluation.getAssessmentStatus()) && !isProcessingTimedOut(evaluation)) { + log.info("AI assessment still processing, evaluationId={}", evaluation.getId()); return toView(evaluation); } String answerSnapshot = answerSnapshot(context.answer); @@ -145,6 +150,8 @@ public class AiTrainingEvaluationServiceImpl implements AiTrainingEvaluationServ ? aiTrainingEvaluationMapper.claimReassessment(evaluation.getId(), evaluation.getAssessmentAnswerSnapshot(), new Date()) : aiTrainingEvaluationMapper.claimAssessment(evaluation.getId(), new Date()); if (claimed != 1) { + log.info("AI assessment claim skipped, evaluationId={}, reassessment={}, claimed={}", + evaluation.getId(), reassessment, claimed); return currentView(context, user); } @@ -171,6 +178,9 @@ public class AiTrainingEvaluationServiceImpl implements AiTrainingEvaluationServ completed.setAssessmentCompletedAt(completedAt); completed.setUpdateTime(completedAt); completeAssessmentAndWriteScore(completed, context.answer.getId(), score, completedAt); + // 教师端成绩列表读的是 stu_rank 每日快照(凌晨1点定时重建), + // 不在这里立即刷新本班快照,新 AI 分数要等次日才会出现在教师端。 + refreshScoreRankAfterAssessment(user, context.teachingClassId); completed.setHelpStatus(evaluation.getHelpStatus()); completed.setAssessmentStatus(SUCCEEDED); return toView(completed); @@ -215,6 +225,26 @@ public class AiTrainingEvaluationServiceImpl implements AiTrainingEvaluationServ }); } + /** + * AI 分数落库后立即重建本教学班的 stu_rank 当日快照(与每日凌晨定时重建同一套逻辑), + * 教师端成绩列表马上能看到新分数。异步执行且失败只记日志:排名刷新失败不能影响评分结果。 + */ + private void refreshScoreRankAfterAssessment(JwtUser user, String teachingClassId) { + String schoolId = user == null ? null : user.getSchoolId(); + if (scoreRankService == null || StringUtils.isAnyBlank(schoolId, teachingClassId)) { + return; + } + CompletableFuture.runAsync(() -> { + try { + if (!scoreRankService.doRankTeachingClass(schoolId, teachingClassId)) { + scoreRankService.doRankOne(schoolId); + } + } catch (RuntimeException e) { + log.warn("AI assessment score rank refresh failed, teachingClassId={}", teachingClassId, e); + } + }); + } + private AiTrainingEvaluation getOrCreate(EvaluationContext context, JwtUser user) { AiTrainingEvaluation evaluation = aiTrainingEvaluationMapper.findByStudentClassAndTask( user.getUserId(), context.teachingClassId, context.task.getId()); diff --git a/src/main/resources/mappers/AiTrainingEvaluationMapper.xml b/src/main/resources/mappers/AiTrainingEvaluationMapper.xml index 82fff32..14b188f 100644 --- a/src/main/resources/mappers/AiTrainingEvaluationMapper.xml +++ b/src/main/resources/mappers/AiTrainingEvaluationMapper.xml @@ -78,7 +78,6 @@ SET assessment_status = 'PROCESSING', assessment_error_message = NULL, update_time = #{updateTime,jdbcType=TIMESTAMP} WHERE id = #{id,jdbcType=VARCHAR} AND assessment_status = 'SUCCEEDED' - AND (BINARY assessment_answer_snapshot <=> BINARY #{expectedAnswerSnapshot,jdbcType=LONGVARCHAR})