Pārlūkot izejas kodu

3.4.5 update-20250506,bug修改

xiaofei 1 mēnesi atpakaļ
vecāks
revīzija
d0fafd1bbe

+ 1 - 0
distributed-print/install/mysql/init/teachcloud_db.sql

@@ -2068,6 +2068,7 @@ CREATE TABLE IF NOT EXISTS `mark_student`
     `invalid`                 bit(1)               DEFAULT b'0' COMMENT '强制绑定',
     `miss_scan`               tinyint(1) DEFAULT '0' COMMENT '是否漏扫',
     `version`                 int         NOT NULL DEFAULT '1' COMMENT '版本号',
+    `ai_mark_abnormal` TINYINT(1) NULL DEFAULT 0 COMMENT 'ai评卷异常',
     PRIMARY KEY (`id`) USING BTREE,
     UNIQUE KEY `index2` (`exam_id`,`secret_number`) USING BTREE,
     UNIQUE KEY `index1` (`exam_id`,`course_paper_id`,`student_code`) USING BTREE,

+ 1 - 3
distributed-print/install/mysql/upgrade/3.4.2.sql

@@ -25,15 +25,13 @@ INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, e
 
 INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('3072', '查询学号字母映射关系', '/api/scan/config/student_number_letter_relation', 'URL', '970', '40', 'AUTH', '1', '1', '1');
 
-ALTER TABLE scan_paper_page ADD COLUMN paper_type VARCHAR(10) NULL COMMENT '卷型' AFTER recog_data;
+ALTER TABLE scan_paper_page ADD COLUMN paper_type TEXT NULL COMMENT '卷型' AFTER recog_data;
 
 INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('3073', '卷型检查任务-状态数量', '/api/scan/student/paper_type_check/status/count', 'URL', '970', '41', 'AUTH', '1', '1', '1');
 INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('3074', '卷型检查任务-任务确认', '/api/scan/student/paper_type_check/confirm', 'URL', '970', '42', 'AUTH', '1', '1', '1');
 UPDATE sys_privilege SET related = '971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1007,1009,1010,1148,3072,3073,3074' WHERE (id = '970');
 UPDATE sys_privilege SET related = '971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1007,1009,1010,1148,3072,3073,3074' WHERE (id = '1006');
 
-ALTER TABLE scan_paper_page CHANGE COLUMN paper_type paper_type TEXT NULL COMMENT '卷型';
-
 UPDATE sys_privilege SET property = 'SYS', default_auth = '1' WHERE (id = '3071');
 
 INSERT INTO sys_privilege (id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(2111, '平时成绩-获取作业集合', '/api/admin/course/degree/usual_score/template_download/list', 'URL', 2006, 1, 'AUTH', NULL, 1, 1, 1);

+ 1 - 0
distributed-print/install/mysql/upgrade/3.4.5.sql

@@ -144,3 +144,4 @@ ALTER TABLE `mark_task`
 ADD COLUMN `retry_count` INT NULL DEFAULT 0 COMMENT '重试次数' AFTER `ai_mark_error_type`;
 
 ALTER TABLE `mark_task` ADD COLUMN `next_retry_time` BIGINT(20) NULL COMMENT '下一次重试时间' AFTER `retry_count`;
+ALTER TABLE `mark_student` ADD COLUMN `ai_mark_abnormal` TINYINT(1) NULL DEFAULT 0 COMMENT 'ai评卷异常' AFTER `version`;

+ 20 - 2
distributed-print/src/main/java/com/qmth/distributed/print/upgrade/DataUpgrade_3_4_4.java

@@ -15,7 +15,9 @@ import com.qmth.teachcloud.common.enums.ExamModelEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.mark.dto.mark.MarkPaperFileDto;
 import com.qmth.teachcloud.mark.dto.mark.MarkQuestionAnswerVo;
+import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkerScoreDTO;
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkerSpecialTagDTO;
 import com.qmth.teachcloud.mark.dto.mark.manage.TaskQuestion;
 import com.qmth.teachcloud.mark.dto.mark.manage.TrackDTO;
 import com.qmth.teachcloud.mark.dto.mark.score.SheetUrlDto;
@@ -84,12 +86,14 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
         log.info("1.1开始查询待归档课程数据;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
         List<MarkPaper> markPaperList = this.listMarkPaper(jdbcTemplate);
         log.info("1.1结束查询待归档课程数据,共" + markPaperList.size() + "条数据;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
+        int i = 1;
+        int total = markPaperList.size();
         for (MarkPaper markPaper : markPaperList) {
             Long examId = markPaper.getExamId();
             BasicExam basicExam = getBasicExam(jdbcTemplate, examId);
             String paperNumber = markPaper.getPaperNumber();
             List<MarkStudent> markStudentList = this.listMarkStudent(jdbcTemplate, examId, paperNumber);
-            log.info("1.1.1开始归档考试:[" + basicExam.getName() + "],试卷编号:[" + paperNumber + "],共" + markStudentList.size() + "条考生数据;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
+            log.info("1.1.1开始归档考试:[" + basicExam.getName() + "],试卷编号:[" + paperNumber + "],共" + markStudentList.size() + "条考生数据,试卷数量:{" + i + "}/{" + total + "};时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
             List<MarkArchiveStudent> markArchiveStudents = null;
             long count = 0;
             try {
@@ -121,7 +125,7 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
                 log.info("1.1.1归档失败,删除数据结束。考试:[" + basicExam.getName() + "],试卷编号:[" + paperNumber + "],共" + markStudentList.size() + "条考生数据;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
                 throw new RuntimeException(e.getMessage());
             }
-            log.info("1.1.1结束归档考试:[" + basicExam.getName() + "],试卷编号:[" + paperNumber + "],共" + markStudentList.size() + "条考生数据;时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
+            log.info("1.1.1结束归档考试:[" + basicExam.getName() + "],试卷编号:[" + paperNumber + "],共" + markStudentList.size() + "条考生数据,试卷数量:{" + i + "}/{" + total + "};时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
             log.info("1.1.2开始更新课程归档状态:[" + basicExam.getName() + "],试卷编号:[" + paperNumber + "];时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
             if (count == markArchiveStudents.size()) {
                 // 更新归档状态
@@ -132,6 +136,7 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
             log.info("1.1.3开始更新试卷、答案文件存储json结构状态:[" + basicExam.getName() + "],试卷编号:[" + paperNumber + "];时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
             this.parseMarkPaperAndAnswerFilePath(jdbcTemplate, markPaper);
             log.info("1.1.3结束更试卷、答案文件存储json结构状态:[" + basicExam.getName() + "],试卷编号:[" + paperNumber + "];时间:" + DateFormatUtils.format(new Date(), DATE_PATTERN));
+            i++;
         }
     }
 
@@ -296,6 +301,14 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
                     step.addMarkTrack(track);
                 }
 
+                for (MarkSpecialTag specialTag : this.listMarkTag(jdbcTemplate, markTask.getId())) {
+                    MarkerSpecialTagDTO tagDTO = new MarkerSpecialTagDTO(markTask.getUserId(), markTask.getQuestionId(), specialTag);
+                    SysUser user = sysUserMap.get(markTask.getUserId());
+                    tagDTO.setUserId(markTask.getUserId());
+                    tagDTO.setUserName(user.getRealName() + "(" + user.getLoginName() + ")");
+                    step.addMarkTag(tagDTO);
+                }
+
                 List<MarkHeaderTrack> markHeaderTracks = this.listMarkHeaderTrack(jdbcTemplate, studentId, questionNumber);
                 if (CollectionUtils.isNotEmpty(markHeaderTracks) && markTask.getTaskNumber() == 1) {
                     for (MarkHeaderTrack markHeaderTrack : markHeaderTracks) {
@@ -578,6 +591,11 @@ public class DataUpgrade_3_4_4 implements DataUpgradeService {
         return this.listData(jdbcTemplate, sql, MarkTrack.class);
     }
 
+    private List<MarkSpecialTag> listMarkTag(JdbcTemplate jdbcTemplate, Long taskId) {
+        String sql = "select * from mark_special_tag where task_id = " + taskId;
+        return this.listData(jdbcTemplate, sql, MarkSpecialTag.class);
+    }
+
     private List<MarkHeaderTrack> listMarkHeaderTrack(JdbcTemplate jdbcTemplate, Long studentId, String questionNumber) {
         String sql = "select * from mark_header_track where student_id = " + studentId + " and question_number = '" + questionNumber + "' order by number";
         return this.listData(jdbcTemplate, sql, MarkHeaderTrack.class);

+ 2 - 0
distributed-print/src/main/resources/upgrade/3.4.5-upgrade.sql

@@ -145,3 +145,5 @@ ADD COLUMN `retry_count` INT NULL DEFAULT 0 COMMENT '重试次数' AFTER `ai_mar
 
 ALTER TABLE `mark_task`
     ADD COLUMN `next_retry_time` BIGINT(20) NULL COMMENT '下一次重试时间' AFTER `retry_count`;
+
+ALTER TABLE `mark_student` ADD COLUMN `ai_mark_abnormal` TINYINT(1) NULL DEFAULT 0 COMMENT 'ai评卷异常' AFTER `version`;

+ 7 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -45,6 +45,13 @@ public class SystemConstant {
     public static final long MARK_JPG_EXPIRE_MINUTE = 12 * 60;
     public static final String AI_USER = "ai";
     public static final String AI_USER_NAME = "AI智能评卷";
+    // AI阅卷重试次数
+    public static final int AI_MARK_RETRY_COUNT = 3;
+    // AI阅卷重试间隔(分钟)
+    public static final int AI_MARK_RETRY_MINUTES = 10;
+    // AI阅卷失败,默认给分
+    public static final double AI_MARK_ERROR_SCORE = -1d;
+
     private final static Logger log = LoggerFactory.getLogger(SystemConstant.class);
 
     public static final String DEFAULT_PAPER_TYPE_A = "A";

+ 2 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/enums/MarkTaskAiErrorTypeStatus.java

@@ -4,9 +4,8 @@ import java.util.LinkedList;
 import java.util.List;
 
 public enum MarkTaskAiErrorTypeStatus {
-    NULL("无法评卷", 0),
-    OCR_ERROR("OCR识别错误", 0),
-    OTHER("其它错误", 1);
+    MARK_ERROR("AI自动评卷错误", 0),
+    OCR_ERROR("OCR识别错误", 1);
 
     private String name;
 

+ 2 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkStudentMapper.java

@@ -156,10 +156,11 @@ public interface MarkStudentMapper extends BaseMapper<MarkStudent> {
      * @param scoreList
      * @param version
      * @param autoCalc
+     * @param aiMarkAbnormal
      * @return
      */
     int updateSubjectiveScoreByVersion(@Param("studentId") Long studentId, @Param("status") String status, @Param("score") Double score,
-                                       @Param("scoreList") String scoreList, @Param("version") Integer version, @Param("autoCalc") boolean autoCalc);
+                                       @Param("scoreList") String scoreList, @Param("version") Integer version, @Param("autoCalc") boolean autoCalc, @Param("aiMarkAbnormal") boolean aiMarkAbnormal);
 
     /**
      * 查找需要统分考生

+ 2 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java

@@ -281,10 +281,11 @@ public interface MarkStudentService extends IService<MarkStudent> {
      * @param scoreList
      * @param version
      * @param autoCalc
+     * @param aiMarkAbnormal
      * @return
      */
     int updateSubjectiveScoreByVersion(Long studentId, SubjectiveStatus status, Double score,
-                                       String scoreList, Integer version, boolean autoCalc);
+                                       String scoreList, Integer version, boolean autoCalc, boolean aiMarkAbnormal);
 
     /**
      * 查找需要统分考生

+ 34 - 18
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -559,7 +559,8 @@ public class MarkServiceImpl implements MarkService {
                     markTask.setSecretNumber(student.getSecretNumber());
                     markTask.setTaskNumber(1);
                     markTask.setAiMarked(getAiMarked(markQuestion, markTask.getTaskNumber()));
-                    markTask.setRetryCount(markTask.getAiMarked() ? 5 : null);
+                    markTask.setRetryCount(markTask.getAiMarked() ? SystemConstant.AI_MARK_RETRY_COUNT : 0);
+                    markTask.setNextRetryTime(markTask.getAiMarked() ? System.currentTimeMillis() : null);
                     markTask.setStatus(MarkTaskStatus.WAITING);
                     taskList.add(markTask);
                     // 开启双评时需要判断是否生成第二份评卷任务
@@ -592,7 +593,8 @@ public class MarkServiceImpl implements MarkService {
                             markTask.setSecretNumber(student.getSecretNumber());
                             markTask.setTaskNumber(2);
                             markTask.setAiMarked(getAiMarked(markQuestion, markTask.getTaskNumber()));
-                            markTask.setRetryCount(markTask.getAiMarked() ? 5 : null);
+                            markTask.setRetryCount(markTask.getAiMarked() ? SystemConstant.AI_MARK_RETRY_COUNT : 0);
+                            markTask.setNextRetryTime(markTask.getAiMarked() ? System.currentTimeMillis() : null);
                             markTask.setStatus(MarkTaskStatus.WAITING);
                             taskList.add(markTask);
                             doubleCount++;
@@ -693,7 +695,8 @@ public class MarkServiceImpl implements MarkService {
                             markTask.setSecretNumber(student.getSecretNumber());
                             markTask.setTaskNumber(2);
                             markTask.setAiMarked(getAiMarked(markQuestion, markTask.getTaskNumber()));
-                            markTask.setRetryCount(markTask.getAiMarked() ? 5 : null);
+                            markTask.setRetryCount(markTask.getAiMarked() ? SystemConstant.AI_MARK_RETRY_COUNT : 0);
+                            markTask.setNextRetryTime(markTask.getAiMarked() ? System.currentTimeMillis() : null);
                             markTask.setStatus(MarkTaskStatus.WAITING);
                             taskList.add(markTask);
                             doubleCount++;
@@ -845,6 +848,7 @@ public class MarkServiceImpl implements MarkService {
         Map<Integer, List<MarkSubjectiveScore>> mainScoreMap = new HashMap<>();
         Map<Integer, Double> scoreMap = new HashMap<>();
 
+        boolean aiMarkAbnormal = false;
         // 循环所有主观得分明细
         List<MarkSubjectiveScore> list = markSubjectiveScoreService.listByStudentId(studentId);
         // list.sort(null);
@@ -855,13 +859,21 @@ public class MarkServiceImpl implements MarkService {
             }
             mainScoreList.add(ss);
             mainScoreMap.put(ss.getMainNumber(), mainScoreList);
-            scoreList.add(new ScoreItem(ss));
+            if (ss.getScore() != SystemConstant.AI_MARK_ERROR_SCORE) {
+                scoreList.add(new ScoreItem(ss));
+            } else {
+                aiMarkAbnormal = true;
+            }
         }
         // 计算大题分
         for (Integer mainNumber : mainScoreMap.keySet()) {
             List<MarkSubjectiveScore> mainScoreList = mainScoreMap.get(mainNumber);
             BigDecimal mainScore = BigDecimal.ZERO;
             for (MarkSubjectiveScore subjectiveScore : mainScoreList) {
+                // -1分不参与计算
+                if (subjectiveScore.getScore() == SystemConstant.AI_MARK_ERROR_SCORE) {
+                    continue;
+                }
                 mainScore = mainScore.add(BigDecimal.valueOf(subjectiveScore.getScore()));
             }
             for (MarkSubjectiveScore subjectiveScore : mainScoreList) {
@@ -879,7 +891,7 @@ public class MarkServiceImpl implements MarkService {
         // 全部评完,更新考生主观题得分
 //        markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.MARKED, totalScore.doubleValue(),
 //                MarkStudent.buildScoreList(scoreList));
-        markStudentService.updateSubjectiveScoreByVersion(studentId, SubjectiveStatus.MARKED, totalScore.doubleValue(), MarkStudent.buildScoreList(scoreList), version, autoCalc);
+        markStudentService.updateSubjectiveScoreByVersion(studentId, SubjectiveStatus.MARKED, totalScore.doubleValue(), MarkStudent.buildScoreList(scoreList), version, autoCalc, aiMarkAbnormal);
     }
 
     @Override
@@ -1428,7 +1440,7 @@ public class MarkServiceImpl implements MarkService {
                     continue;
                 }
                 // 分差超过阀值
-                if (Math.abs(other.getMarkerScore() - result.getMarkerScore()) > markQuestion.getArbitrateThreshold()) {
+                if (Math.abs(other.getMarkerScore() - result.getMarkerScore()) > markQuestion.getArbitrateThreshold() || (other.getMarkerScore() == SystemConstant.AI_MARK_ERROR_SCORE)) {
                     history = buildArbitrateHistory(task, now);
                     break;
                 }
@@ -1581,12 +1593,12 @@ public class MarkServiceImpl implements MarkService {
                 // 考生作答
                 try {
                     this.ocrStudentQuestionResult(basicSchool, t.getStudentId(), t.getQuestionId());
-                    t.setRetryCount(5);
+                    t.setRetryCount(SystemConstant.AI_MARK_RETRY_COUNT);
                 } catch (Exception e) {
-                    t.setRetryCount(t.getRetryCount() == null ? 5 : t.getRetryCount() == 0 ? 0 : t.getRetryCount() - 1);
+                    t.setRetryCount(t.getRetryCount() == null ? SystemConstant.AI_MARK_RETRY_COUNT : t.getRetryCount() == 0 ? 0 : t.getRetryCount() - 1);
                     t.setAiMarkErrorType(MarkTaskAiErrorTypeStatus.OCR_ERROR);
                     t.setAiMarkErrorMsg(e.getMessage());
-                    t.setNextRetryTime(DateDisposeUtils.addMinute(System.currentTimeMillis(), 10));
+                    t.setNextRetryTime(DateDisposeUtils.addMinute(System.currentTimeMillis(), SystemConstant.AI_MARK_RETRY_MINUTES));
                     log.error("OCR识别错误:{}", e.getMessage());
                 } finally {
                     markTaskService.updateAiMarkErrorMsg(t);
@@ -1635,6 +1647,7 @@ public class MarkServiceImpl implements MarkService {
                 if (markTasks.isEmpty() || !markQuestion.getEnableAi()) {
                     break;
                 }
+                AutoScoreResult autoScoreResult = null;
                 for (MarkTask t : markTasks) {
                     // 考生作答
                     try {
@@ -1662,13 +1675,10 @@ public class MarkServiceImpl implements MarkService {
                             }
                         }
                         // AI评卷
-                        AutoScoreResult autoScoreResult = aiService.autoScore(aiUrl, AiUtil.signature(basicSchool), request);
+                        autoScoreResult = aiService.autoScore(aiUrl, AiUtil.signature(basicSchool), request);
                         long endTime = System.currentTimeMillis();
                         if (autoScoreResult == null) {
-                            // 此错误不重试
-                            t.setRetryCount(0);
-                            t.setAiMarkErrorType(MarkTaskAiErrorTypeStatus.NULL);
-                            t.setAiMarkErrorMsg(MarkTaskAiErrorTypeStatus.NULL.getName());
+                            throw ExceptionResultEnum.ERROR.exception("无法评卷");
                         } else {
                             submitAiTask(t, aiUser.getId(), markQuestion, autoScoreResult, buildTrack(markAiQuestionParam.getMode(), autoScoreResult, markQuestion, markOcrStudentQuestions), endTime - startTime);
                             t.setRetryCount(0);
@@ -1676,10 +1686,16 @@ public class MarkServiceImpl implements MarkService {
                             t.setAiMarkErrorMsg(null);
                         }
                     } catch (Exception e) {
-                        t.setRetryCount(t.getRetryCount() == null ? 5 : t.getRetryCount() == 0 ? 0 : t.getRetryCount() - 1);
-                        t.setAiMarkErrorType(MarkTaskAiErrorTypeStatus.OTHER);
+                        t.setRetryCount(t.getRetryCount() == null ? SystemConstant.AI_MARK_RETRY_COUNT : t.getRetryCount() == 0 ? 0 : t.getRetryCount() - 1);
+                        // 重试结束后,直接给-1
+                        if (t.getRetryCount() == 0) {
+                            autoScoreResult = new AutoScoreResult();
+                            autoScoreResult.setTotalScore(SystemConstant.AI_MARK_ERROR_SCORE);
+                            submitAiTask(t, aiUser.getId(), markQuestion, autoScoreResult, null, 0);
+                        }
+                        t.setAiMarkErrorType(MarkTaskAiErrorTypeStatus.MARK_ERROR);
                         t.setAiMarkErrorMsg(e.getMessage());
-                        t.setNextRetryTime(DateDisposeUtils.addMinute(System.currentTimeMillis(), 10));
+                        t.setNextRetryTime(DateDisposeUtils.addMinute(System.currentTimeMillis(), SystemConstant.AI_MARK_RETRY_MINUTES));
                     } finally {
                         this.releaseStudent(examId, paperNumber, t.getStudentId(), aiUser.getId());
                         this.updateMarkedCount(examId, paperNumber, t.getQuestionId());
@@ -1958,7 +1974,7 @@ public class MarkServiceImpl implements MarkService {
                     continue;
                 }
                 // 分差超过阀值
-                if (Math.abs(other.getMarkerScore() - result.getTotalScore()) > markQuestion.getArbitrateThreshold()) {
+                if (Math.abs(other.getMarkerScore() - result.getTotalScore()) > markQuestion.getArbitrateThreshold() || (other.getMarkerScore() == SystemConstant.AI_MARK_ERROR_SCORE)) {
                     history = buildArbitrateHistory(task, now);
                     break;
                 }

+ 3 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -2653,13 +2653,14 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
      * @param scoreList
      * @param version
      * @param autoCalc
+     * @param aiMarkAbnormal
      * @return
      */
     @Override
     @Transactional
-    public int updateSubjectiveScoreByVersion(Long studentId, SubjectiveStatus status, Double score, String scoreList, Integer version, boolean autoCalc) {
+    public int updateSubjectiveScoreByVersion(Long studentId, SubjectiveStatus status, Double score, String scoreList, Integer version, boolean autoCalc, boolean aiMarkAbnormal) {
         Objects.requireNonNull(status, "主观题状态不能为空");
-        int update = this.baseMapper.updateSubjectiveScoreByVersion(studentId, status.name(), score, scoreList, version, autoCalc);
+        int update = this.baseMapper.updateSubjectiveScoreByVersion(studentId, status.name(), score, scoreList, version, autoCalc, aiMarkAbnormal);
         if (Objects.nonNull(version) && update == 0) {
             throw ExceptionResultEnum.ERROR.exception("版本号发生改变,更新失败");
         }

+ 5 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTaskServiceImpl.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
+import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
@@ -183,7 +184,7 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
                 .set(MarkTask::getHeaderTagList, null)
                 .set(MarkTask::getRejectReason, rejectReason)
                 .set(MarkTask::getAiMarkErrorType, null)
-                .set(MarkTask::getRetryCount, 5)
+                .set(MarkTask::getRetryCount, SystemConstant.AI_MARK_RETRY_COUNT)
                 .set(MarkTask::getAiMarkErrorMsg, null)
                 .eq(MarkTask::getId, markTaskId);
         return this.update(updateWrapper);
@@ -240,6 +241,8 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
                 .set(MarkTask::getHeaderTagList, JSON.toJSONString(specialTags))
                 .set(MarkTask::getHeaderTime, updateTime)
                 .set(MarkTask::getStatus, arbitrated)
+                .set(MarkTask::getAiMarkErrorType, null)
+                .set(MarkTask::getAiMarkErrorMsg, null)
                 .eq(MarkTask::getExamId, examId)
                 .eq(MarkTask::getPaperNumber, paperNumber)
                 .eq(MarkTask::getQuestionId, questionId)
@@ -582,7 +585,7 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     @Override
     public void resetRetryCount(Long examId, String paperNumber, Long questionId) {
         UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkTask::getRetryCount, 5)
+        updateWrapper.lambda().set(MarkTask::getRetryCount, SystemConstant.AI_MARK_RETRY_COUNT)
                 .eq(MarkTask::getExamId, examId)
                 .eq(MarkTask::getPaperNumber, paperNumber)
                 .eq(MarkTask::getQuestionId, questionId)

+ 5 - 1
teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

@@ -1054,7 +1054,11 @@
     </select>
 
     <update id="updateSubjectiveScoreByVersion">
-        update mark_student t set t.subjective_status = #{status},t.subjective_score = #{score},t.subjective_score_list = #{scoreList},t.version = t.version + 1
+        update mark_student t set t.subjective_status = #{status},
+                                  t.subjective_score = #{score},
+                                  t.subjective_score_list = #{scoreList},
+                                  t.version = t.version + 1,
+                                  t.ai_mark_abnormal = #{aiMarkAbnormal}
         <where>
             <if test="studentId != null and studentId != ''">
                 AND t.id = #{studentId}