Эх сурвалжийг харах

3.4.5 update-20250426,bug修改

xiaofei 1 сар өмнө
parent
commit
b34fa92461

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

@@ -134,3 +134,12 @@ INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('245', '关联考生', '/api/admin/exam/task/relate_students', 'URL', '42', '10', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('246', '下载试卷清单', 'ExportPaperList', 'BUTTON', '42', '8', 'AUTH', '247', '1', '0', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('247', '下载试卷清单', '/api/admin/exam/task/export_paper_list', 'URL', '42', '11', 'AUTH', '1', '1', '1');
+
+ALTER TABLE `mark_task`
+DROP INDEX `index1` ,
+ADD INDEX `index1` USING BTREE (`exam_id`, `paper_number`, `question_id`);
+
+ALTER TABLE `mark_task`
+    ADD COLUMN `ai_mark_error_type` VARCHAR(10) NULL COMMENT 'AI评卷错误类型' AFTER `ai_mark_error_msg`,
+ADD COLUMN `retry_count` INT NULL DEFAULT 0 COMMENT '重试次数' AFTER `ai_mark_error_type`;
+

+ 3 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkAiQuestionParamController.java

@@ -241,6 +241,9 @@ public class MarkAiQuestionParamController {
                 markService.deleteMarkTask(markQuestion, true, true);
                 markService.checkStudentSubjectiveScore(markAiQuestionParam.getExamId(), markPaper.getCoursePaperId());
             }
+
+            // 修改参数后,重置重试次数
+            markTaskService.resetRetryCount(markQuestion.getExamId(), markQuestion.getPaperNumber(), markQuestion.getId());
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof DuplicateKeyException) {

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

@@ -134,3 +134,11 @@ INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('245', '关联考生', '/api/admin/exam/task/relate_students', 'URL', '42', '10', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('246', '下载试卷清单', 'ExportPaperList', 'BUTTON', '42', '8', 'AUTH', '247', '1', '0', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('247', '下载试卷清单', '/api/admin/exam/task/export_paper_list', 'URL', '42', '11', 'AUTH', '1', '1', '1');
+
+ALTER TABLE `mark_task`
+DROP INDEX `index1` ,
+ADD INDEX `index1` USING BTREE (`exam_id`, `paper_number`, `question_id`);
+
+ALTER TABLE `mark_task`
+    ADD COLUMN `ai_mark_error_type` VARCHAR(10) NULL COMMENT 'AI评卷错误类型' AFTER `ai_mark_error_msg`,
+ADD COLUMN `retry_count` INT NULL DEFAULT 0 COMMENT '重试次数' AFTER `ai_mark_error_type`;

+ 25 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkTask.java

@@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
 import com.qmth.teachcloud.mark.dto.mark.manage.TrackDTO;
+import com.qmth.teachcloud.mark.enums.MarkTaskAiErrorTypeStatus;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -134,10 +135,18 @@ public class MarkTask implements Serializable {
     @ApiModelProperty(value = "是否AI评卷")
     private Boolean aiMarked;
 
+    @ApiModelProperty(value = "AI评卷错误类型")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private MarkTaskAiErrorTypeStatus aiMarkErrorType;
+
     @ApiModelProperty(value = "AI评卷错误信息")
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private String aiMarkErrorMsg;
 
+    @ApiModelProperty(value = "重试次数")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Integer retryCount;
+
     public Long getId() {
         return id;
     }
@@ -362,6 +371,14 @@ public class MarkTask implements Serializable {
         this.aiMarked = aiMarked;
     }
 
+    public MarkTaskAiErrorTypeStatus getAiMarkErrorType() {
+        return aiMarkErrorType;
+    }
+
+    public void setAiMarkErrorType(MarkTaskAiErrorTypeStatus aiMarkErrorType) {
+        this.aiMarkErrorType = aiMarkErrorType;
+    }
+
     public String getAiMarkErrorMsg() {
         return aiMarkErrorMsg;
     }
@@ -370,6 +387,14 @@ public class MarkTask implements Serializable {
         this.aiMarkErrorMsg = aiMarkErrorMsg;
     }
 
+    public Integer getRetryCount() {
+        return retryCount;
+    }
+
+    public void setRetryCount(Integer retryCount) {
+        this.retryCount = retryCount;
+    }
+
     public List<TrackDTO> listMarkerTrack() {
         List<TrackDTO> markTrackList = new ArrayList<>();
         if (StringUtils.isNotBlank(markerTrackList)) {

+ 48 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/enums/MarkTaskAiErrorTypeStatus.java

@@ -0,0 +1,48 @@
+package com.qmth.teachcloud.mark.enums;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public enum MarkTaskAiErrorTypeStatus {
+    NULL("无法评卷", 0),
+    OTHER("其它错误", 1);
+
+    private String name;
+
+    private int value;
+
+    private static List<MarkTaskAiErrorTypeStatus> options;
+
+    private MarkTaskAiErrorTypeStatus(String name, int value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public static MarkTaskAiErrorTypeStatus findByValue(int value) {
+        for (MarkTaskAiErrorTypeStatus c : MarkTaskAiErrorTypeStatus.values()) {
+            if (c.getValue() == value) {
+                return c;
+            }
+        }
+        return null;
+    }
+
+    public static List<MarkTaskAiErrorTypeStatus> getOptionList() {
+        if (options == null) {
+            options = new LinkedList<>();
+            for (MarkTaskAiErrorTypeStatus status : MarkTaskAiErrorTypeStatus.values()) {
+                options.add(status);
+            }
+        }
+        return options;
+    }
+
+}

+ 2 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkTaskService.java

@@ -124,4 +124,6 @@ public interface MarkTaskService extends IService<MarkTask> {
     void updateAiMarkErrorMsg(MarkTask t);
 
     MarkTaskTrackDto getTrack(Long id);
+
+    void resetRetryCount(Long examId, String paperNumber, Long questionId);
 }

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

@@ -558,6 +558,7 @@ 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.setStatus(MarkTaskStatus.WAITING);
                     taskList.add(markTask);
                     // 开启双评时需要判断是否生成第二份评卷任务
@@ -590,6 +591,7 @@ 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.setStatus(MarkTaskStatus.WAITING);
                             taskList.add(markTask);
                             doubleCount++;
@@ -690,6 +692,7 @@ 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.setStatus(MarkTaskStatus.WAITING);
                             taskList.add(markTask);
                             doubleCount++;
@@ -1578,7 +1581,7 @@ public class MarkServiceImpl implements MarkService {
                 try {
                     this.ocrStudentQuestionResult(basicSchool, t.getStudentId(), t.getQuestionId());
                 } catch (Exception e) {
-                    log.error("OCR识别错误:", e.getMessage());
+                    log.error("OCR识别错误:{}", e.getMessage());
                 }
             }
             // 获取终止评卷标记
@@ -1653,9 +1656,20 @@ public class MarkServiceImpl implements MarkService {
                         // AI评卷
                         AutoScoreResult autoScoreResult = aiService.autoScore(aiUrl, AiUtil.signature(basicSchool), request);
                         long endTime = System.currentTimeMillis();
-                        submitAiTask(t, aiUser.getId(), markQuestion, autoScoreResult, buildTrack(markAiQuestionParam.getMode(), autoScoreResult, markQuestion, markOcrStudentQuestions), endTime - startTime);
-                        t.setAiMarkErrorMsg(null);
+                        if (autoScoreResult == null) {
+                            // 此错误不重试
+                            t.setRetryCount(0);
+                            t.setAiMarkErrorType(MarkTaskAiErrorTypeStatus.NULL);
+                            t.setAiMarkErrorMsg(MarkTaskAiErrorTypeStatus.NULL.getName());
+                        } else {
+                            submitAiTask(t, aiUser.getId(), markQuestion, autoScoreResult, buildTrack(markAiQuestionParam.getMode(), autoScoreResult, markQuestion, markOcrStudentQuestions), endTime - startTime);
+                            t.setRetryCount(0);
+                            t.setAiMarkErrorType(null);
+                            t.setAiMarkErrorMsg(null);
+                        }
                     } catch (Exception e) {
+                        t.setRetryCount(t.getRetryCount() == null ? 5 : t.getRetryCount() == 0 ? 0 : t.getRetryCount() - 1);
+                        t.setAiMarkErrorType(MarkTaskAiErrorTypeStatus.OTHER);
                         t.setAiMarkErrorMsg(e.getMessage());
                     } finally {
                         this.releaseStudent(examId, paperNumber, t.getStudentId(), aiUser.getId());
@@ -1855,7 +1869,7 @@ public class MarkServiceImpl implements MarkService {
             }
 
             String ocrUrl = null;
-            SysConfig sysConfig = commonCacheService.addSysConfigCache(SystemConstant.AI_MARK_SET);
+            SysConfig sysConfig = commonCacheService.addSysConfigCache(basicSchool.getId(), SystemConstant.AI_MARK_SET);
             if (sysConfig != null && StringUtils.isNotBlank(sysConfig.getConfigValue())) {
                 JSONObject object = JSON.parseObject(sysConfig.getConfigValue(), JSONObject.class);
                 if (object.containsKey("ocrUrl")) {

+ 13 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTaskServiceImpl.java

@@ -182,6 +182,8 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
                 .set(MarkTask::getHeaderTrackList, null)
                 .set(MarkTask::getHeaderTagList, null)
                 .set(MarkTask::getRejectReason, rejectReason)
+                .set(MarkTask::getAiMarkErrorType, null)
+                .set(MarkTask::getRetryCount, 5)
                 .set(MarkTask::getAiMarkErrorMsg, null)
                 .eq(MarkTask::getId, markTaskId);
         return this.update(updateWrapper);
@@ -573,4 +575,15 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
         MarkTask markTask = this.getById(id);
         return taskService.buildMarkTask(markTask);
     }
+
+    @Override
+    public void resetRetryCount(Long examId, String paperNumber, Long questionId) {
+        UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(MarkTask::getRetryCount, 5)
+                .eq(MarkTask::getExamId, examId)
+                .eq(MarkTask::getPaperNumber, paperNumber)
+                .eq(MarkTask::getQuestionId, questionId)
+                .gt(MarkTask::getRetryCount, 0);
+        this.update(updateWrapper);
+    }
 }

+ 2 - 0
teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml

@@ -242,6 +242,7 @@
           AND mt.user_id IS NULL
           AND mt.ai_marked = TRUE
           AND mt.status = 'WAITING'
+          AND mt.retry_count > 0
           AND EXISTS( SELECT
                           1
                       FROM
@@ -251,6 +252,7 @@
                         AND mt.paper_number = mosq.paper_number
                         AND mt.student_id = mosq.student_id
                         AND mt.question_id = mosq.question_id)
+            order by mt.retry_count desc
     </select>
     <select id="findAiUnOcr" resultType="com.qmth.teachcloud.mark.entity.MarkTask">
         SELECT

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

@@ -134,7 +134,7 @@
                 AND muq.finish_count > 0
             </if>
         </where>
-        order by muq.enable desc, mq.main_number, mq.sub_number
+        order by muq.enable desc, mq.main_number, mq.sub_number, muq.user_id
     </select>
     <select id="pageQuality" resultType="com.qmth.teachcloud.mark.dto.mark.manage.MarkQualityDto">
         SELECT