Browse Source

3.4.5 update-20250429,bug修改

xiaofei 1 month ago
parent
commit
7388c0a44b

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

@@ -143,3 +143,4 @@ 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`;
 
+ALTER TABLE `mark_task` ADD COLUMN `next_retry_time` BIGINT(20) NULL COMMENT '下一次重试时间' AFTER `retry_count`;

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

@@ -142,3 +142,6 @@ 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`;
+
+ALTER TABLE `mark_task`
+    ADD COLUMN `next_retry_time` BIGINT(20) NULL COMMENT '下一次重试时间' AFTER `retry_count`;

+ 21 - 12
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/DateDisposeUtils.java

@@ -152,18 +152,21 @@ public class DateDisposeUtils extends DateUtils {
     }
 
     public static void main(String[] args) {
-        String d1 = "2020-01-01";
-        String d2 = "2020/01/01";
-        String d3 = "2020-01-01 12:00";
-        String d4 = "2020/01/01 12:00";
-        String d5 = "2020/01/01 12:00:00";
-        String d6 = "2020/01/01 12:00:00";
-        System.out.println(parseDate(d1).getTime());
-        System.out.println(parseDate(d2).getTime());
-        System.out.println(parseDate(d3).getTime());
-        System.out.println(parseDate(d4).getTime());
-        System.out.println(parseDate(d5).getTime());
-        System.out.println(parseDate(d6).getTime());
+//        String d1 = "2020-01-01";
+//        String d2 = "2020/01/01";
+//        String d3 = "2020-01-01 12:00";
+//        String d4 = "2020/01/01 12:00";
+//        String d5 = "2020/01/01 12:00:00";
+//        String d6 = "2020/01/01 12:00:00";
+//        System.out.println(parseDate(d1).getTime());
+//        System.out.println(parseDate(d2).getTime());
+//        System.out.println(parseDate(d3).getTime());
+//        System.out.println(parseDate(d4).getTime());
+//        System.out.println(parseDate(d5).getTime());
+//        System.out.println(parseDate(d6).getTime());
+
+        Long aLong = addMinute(System.currentTimeMillis(), 10);
+        System.out.println(aLong);
     }
 
     /**
@@ -194,4 +197,10 @@ public class DateDisposeUtils extends DateUtils {
         // long sec = diff % nd % nh % nm / ns;
         return day + "天" + hour + "小时" + min + "分钟";
     }
+
+    public static Long addMinute(Long time, int amount) {
+        Date date = new Date(time);
+        Date minutes = addMinutes(date, amount);
+        return minutes.getTime();
+    }
 }

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

@@ -146,6 +146,9 @@ public class MarkTask implements Serializable {
     @ApiModelProperty(value = "重试次数")
     @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Integer retryCount;
+    @ApiModelProperty(value = "下次重试时间")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Long nextRetryTime;
 
     public Long getId() {
         return id;
@@ -395,6 +398,14 @@ public class MarkTask implements Serializable {
         this.retryCount = retryCount;
     }
 
+    public Long getNextRetryTime() {
+        return nextRetryTime;
+    }
+
+    public void setNextRetryTime(Long nextRetryTime) {
+        this.nextRetryTime = nextRetryTime;
+    }
+
     public List<TrackDTO> listMarkerTrack() {
         List<TrackDTO> markTrackList = new ArrayList<>();
         if (StringUtils.isNotBlank(markerTrackList)) {

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

@@ -5,6 +5,7 @@ import java.util.List;
 
 public enum MarkTaskAiErrorTypeStatus {
     NULL("无法评卷", 0),
+    OCR_ERROR("OCR识别错误", 0),
     OTHER("其它错误", 1);
 
     private String name;

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

@@ -38,8 +38,8 @@ public interface MarkTaskMapper extends BaseMapper<MarkTask> {
 
     List<MarkTask> findUnMarkedFilterClass(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId, @Param("questionId") Long questionId, @Param("classNames") List<String> classNames);
 
-    List<MarkTask> findAiUnMarked(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId);
-    List<MarkTask> findAiUnOcr(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId);
+    List<MarkTask> findAiUnMarked(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("currentTime") long currentTime);
+    List<MarkTask> findAiUnOcr(@Param("page") Page<MarkTask> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("currentTime") long currentTime);
 
     List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId, @Param("className") String className);
 

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

@@ -64,8 +64,8 @@ public interface MarkTaskService extends IService<MarkTask> {
 
     List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber, Long userId, Long questionId, List<String> classNames);
 
-    List<MarkTask> findAiUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long questionId);
-    List<MarkTask> findAiUnOcr(Page<MarkTask> page, Long examId, String paperNumber, Long questionId);
+    List<MarkTask> findAiUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long questionId, long currentTime);
+    List<MarkTask> findAiUnOcr(Page<MarkTask> page, Long examId, String paperNumber, Long questionId, long currentTime);
 
     int countByIdAndStatus(Long studentId, MarkTaskStatus status);
 

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

@@ -28,6 +28,7 @@ import com.qmth.teachcloud.common.enums.mark.*;
 import com.qmth.teachcloud.common.mapper.BasicCourseMapper;
 import com.qmth.teachcloud.common.mapper.BasicSchoolMapper;
 import com.qmth.teachcloud.common.service.*;
+import com.qmth.teachcloud.common.util.DateDisposeUtils;
 import com.qmth.teachcloud.common.util.FileUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.dto.ai.SheetImageDto;
@@ -1571,7 +1572,7 @@ public class MarkServiceImpl implements MarkService {
         int pageNumber = 1;
         do {
             if (CollectionUtils.isEmpty(markTasks)) {
-                markTasks = markTaskService.findAiUnOcr(new Page<>(pageNumber, 20), examId, paperNumber, questionId);
+                markTasks = markTaskService.findAiUnOcr(new Page<>(pageNumber, 20), examId, paperNumber, questionId, System.currentTimeMillis());
             }
             if (markTasks.isEmpty() || !markQuestion.getEnableAi()) {
                 break;
@@ -1580,13 +1581,20 @@ public class MarkServiceImpl implements MarkService {
                 // 考生作答
                 try {
                     this.ocrStudentQuestionResult(basicSchool, t.getStudentId(), t.getQuestionId());
+                    t.setRetryCount(5);
                 } catch (Exception e) {
+                    t.setRetryCount(t.getRetryCount() == null ? 5 : t.getRetryCount() == 0 ? 0 : t.getRetryCount() - 1);
+                    t.setAiMarkErrorType(MarkTaskAiErrorTypeStatus.OCR_ERROR);
+                    t.setAiMarkErrorMsg(e.getMessage());
+                    t.setNextRetryTime(DateDisposeUtils.addMinute(System.currentTimeMillis(), 10));
                     log.error("OCR识别错误:{}", e.getMessage());
+                } finally {
+                    markTaskService.updateAiMarkErrorMsg(t);
                 }
             }
             // 获取终止评卷标记
             markQuestion = markQuestionService.getById(questionId);
-            markTasks = markTaskService.findAiUnOcr(new Page<>(pageNumber, 20), examId, paperNumber, questionId);
+            markTasks = markTaskService.findAiUnOcr(new Page<>(pageNumber, 20), examId, paperNumber, questionId, System.currentTimeMillis());
         } while (CollectionUtils.isNotEmpty(markTasks));
     }
 
@@ -1622,7 +1630,7 @@ public class MarkServiceImpl implements MarkService {
             int pageNumber = 1;
             do {
                 if (CollectionUtils.isEmpty(markTasks)) {
-                    markTasks = markTaskService.findAiUnMarked(new Page<>(pageNumber, 20), examId, paperNumber, questionId);
+                    markTasks = markTaskService.findAiUnMarked(new Page<>(pageNumber, 20), examId, paperNumber, questionId, System.currentTimeMillis());
                 }
                 if (markTasks.isEmpty() || !markQuestion.getEnableAi()) {
                     break;
@@ -1671,6 +1679,7 @@ public class MarkServiceImpl implements MarkService {
                         t.setRetryCount(t.getRetryCount() == null ? 5 : t.getRetryCount() == 0 ? 0 : t.getRetryCount() - 1);
                         t.setAiMarkErrorType(MarkTaskAiErrorTypeStatus.OTHER);
                         t.setAiMarkErrorMsg(e.getMessage());
+                        t.setNextRetryTime(DateDisposeUtils.addMinute(System.currentTimeMillis(), 10));
                     } finally {
                         this.releaseStudent(examId, paperNumber, t.getStudentId(), aiUser.getId());
                         this.updateMarkedCount(examId, paperNumber, t.getQuestionId());
@@ -1679,7 +1688,7 @@ public class MarkServiceImpl implements MarkService {
                 }
                 // 获取终止评卷标记
                 markQuestion = markQuestionService.getById(questionId);
-                markTasks = markTaskService.findAiUnMarked(new Page<>(pageNumber, 20), examId, paperNumber, questionId);
+                markTasks = markTaskService.findAiUnMarked(new Page<>(pageNumber, 20), examId, paperNumber, questionId, System.currentTimeMillis());
             } while (CollectionUtils.isNotEmpty(markTasks));
         }
     }

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

@@ -289,13 +289,13 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public List<MarkTask> findAiUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long questionId) {
-        return this.baseMapper.findAiUnMarked(page, examId, paperNumber, questionId);
+    public List<MarkTask> findAiUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long questionId, long currentTime) {
+        return this.baseMapper.findAiUnMarked(page, examId, paperNumber, questionId, currentTime);
     }
 
     @Override
-    public List<MarkTask> findAiUnOcr(Page<MarkTask> page, Long examId, String paperNumber, Long questionId) {
-        return this.baseMapper.findAiUnOcr(page, examId, paperNumber, questionId);
+    public List<MarkTask> findAiUnOcr(Page<MarkTask> page, Long examId, String paperNumber, Long questionId, long currentTime) {
+        return this.baseMapper.findAiUnOcr(page, examId, paperNumber, questionId, currentTime);
     }
 
     @Override
@@ -568,6 +568,7 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
         updateWrapper.lambda().set(MarkTask::getAiMarkErrorMsg, t.getAiMarkErrorMsg())
                 .set(MarkTask::getAiMarkErrorType, t.getAiMarkErrorType())
                 .set(MarkTask::getRetryCount, t.getRetryCount())
+                .set(MarkTask::getNextRetryTime, t.getNextRetryTime())
                 .eq(MarkTask::getId, t.getId());
         this.update(updateWrapper);
     }

+ 3 - 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 <![CDATA[mt.next_retry_time < #{currentTime}]]>
           AND mt.retry_count > 0
           AND EXISTS( SELECT
                           1
@@ -265,6 +266,8 @@
           AND mt.user_id IS NULL
           AND mt.ai_marked = TRUE
           AND mt.status = 'WAITING'
+          AND <![CDATA[mt.next_retry_time < #{currentTime}]]>
+          AND mt.retry_count > 0
           AND NOT EXISTS( SELECT
                           1
                       FROM