瀏覽代碼

3.4.5 update-20250423,bug修改

xiaofei 2 月之前
父節點
當前提交
939fe710d8

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

@@ -128,3 +128,4 @@ INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence
 
 UPDATE `sys_privilege` SET `name` = '成绩下载(广药)' WHERE (`id` = '545');
 UPDATE `sys_privilege` SET `name` = '成绩下载(广药)' WHERE (`id` = '546');
+ALTER TABLE `mark_ocr_student_question` ADD INDEX `idx_1` (`exam_id` ASC, `paper_number` ASC, `student_id` ASC, `question_id` ASC);

+ 9 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkAiQuestionParamController.java

@@ -224,12 +224,20 @@ public class MarkAiQuestionParamController {
 
             boolean existMarkAiQuestionPointOrLevel = markAiQuestionParamService.existMarkAiQuestionPointOrLevel(markAiQuestionParam.getExamId(), markAiQuestionParam.getPaperNumber(), markAiQuestionParam.getQuestionId());
             int aiMarkedCount = markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndTaskNumberAndAiMarkedAndStatusNotIn(markAiQuestionParam.getExamId(), markAiQuestionParam.getPaperNumber(), markAiQuestionParam.getQuestionId(), 1, true, Arrays.asList(MarkTaskStatus.WAITING));
+            // 删除得分点或者得分档次时,如果已有机评任务且已评,不能删除
             if (!existMarkAiQuestionPointOrLevel && aiMarkedCount > 0) {
                 throw ExceptionResultEnum.ERROR.exception("已开始AI评卷,不能删除" + (AiQuestionParamModeStatus.POINT.equals(markAiQuestionParam.getMode()) ? "标答" : AiQuestionParamModeStatus.LEVEL.equals(markAiQuestionParam.getMode()) ? "档次" : ""));
             }
 
+            // 1.删除得分点或者得分档次时,机评任务全未评,删除任务,发人评任务
+            // 2.有得分点或者得分档次,且全为人评任务时,删除任务,重新发机评任务
+            // 3.有得分点或者得分档次,有机评任务且双评改单评时,删除任务,重新发机评任务
+            markQuestion = markQuestionService.getById(markAiQuestionParam.getQuestionId());
             int count = markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndTaskNumberAndAiMarkedAndStatusNotIn(markAiQuestionParam.getExamId(), markAiQuestionParam.getPaperNumber(), markAiQuestionParam.getQuestionId(), 1, false, null);
-            if ((!existMarkAiQuestionPointOrLevel && aiMarkedCount == 0) || (existMarkAiQuestionPointOrLevel && count > 0)) {
+            int countTaskNumber = markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndTaskNumberAndAiMarkedAndStatusNotIn(markAiQuestionParam.getExamId(), markAiQuestionParam.getPaperNumber(), markAiQuestionParam.getQuestionId(), 2, false, null);
+            if ((!existMarkAiQuestionPointOrLevel && aiMarkedCount == 0)
+                    || (existMarkAiQuestionPointOrLevel && count > 0)
+            || (existMarkAiQuestionPointOrLevel && markQuestion.getDoubleRate() == 0 && countTaskNumber > 0)) {
                 markService.deleteMarkTask(markQuestion, true, true);
                 markService.checkStudentSubjectiveScore(markAiQuestionParam.getExamId(), markPaper.getCoursePaperId());
             }

+ 1 - 1
distributed-print/src/main/java/com/qmth/distributed/print/start/StartRunning.java

@@ -158,7 +158,7 @@ public class StartRunning implements CommandLineRunner {
         Map markAIJobMap = new HashMap();
         markAIJobMap.computeIfAbsent("name", v -> MarkAiJob.class.getName());
         quartzService.deleteJob(JobEnum.MARK_AI_JOB.name(), JobEnum.MARK_AI_JOB.getGroupName());
-        quartzService.addJob(MarkAiJob.class, JobEnum.MARK_AI_JOB.name(), JobEnum.MARK_AI_JOB.getGroupName(), "0 0/2 * * * ?", markAIJobMap);
+        quartzService.addJob(MarkAiJob.class, JobEnum.MARK_AI_JOB.name(), JobEnum.MARK_AI_JOB.getGroupName(), "0 1/2 * * * ?", markAIJobMap);
         log.info("服务器启动时执行,AI评卷定时任务 end");
 
         // 数据同步

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

@@ -39,6 +39,7 @@ 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> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId, @Param("className") String className);
 

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

@@ -65,6 +65,7 @@ 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);
 
     int countByIdAndStatus(Long studentId, MarkTaskStatus status);
 

+ 21 - 4
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java

@@ -3,6 +3,7 @@ package com.qmth.teachcloud.mark.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -20,6 +21,7 @@ import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.enums.mark.MarkPaperAiMark;
 import com.qmth.teachcloud.common.mapper.BasicSchoolMapper;
+import com.qmth.teachcloud.common.service.SysConfigService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.ConvertUtil;
 import com.qmth.teachcloud.common.util.ExcelUtil;
@@ -73,6 +75,8 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
     @Resource
     private TeachcloudCommonService teachcloudCommonService;
     @Resource
+    private SysConfigService sysConfigService;
+    @Resource
     private MarkPaperService markPaperService;
     @Resource
     private MarkQuestionAnswerService markQuestionAnswerService;
@@ -915,6 +919,10 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
         if (this.update(updateWrapper)) {
             if (enableAi) {
                 MarkQuestion markQuestion = this.getById(questionId);
+                BasicSchool basicSchool = basicSchoolMapper.selectByExamId(markQuestion.getExamId());
+                if (!sysConfigService.getEnableByType(basicSchool.getId(), SystemConstant.AI_MARK_SET)) {
+                    return true;
+                }
                 if (lockService.trylock(LockType.AI_MARK, markQuestion.getId())) {
                     markSyncService.aiAutoMark(markQuestion);
                     return true;
@@ -938,10 +946,19 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
         boolean isExist = markAiQuestionParamService.existMarkAiQuestionPointOrLevel(examId, paperNumber, questionId);
         MarkQuestion markQuestion = this.getById(questionId);
         UpdateWrapper<MarkQuestion> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().set(MarkQuestion::getAiMark, isExist && !MarkPaperAiMark.NONE.equals(markPaper.getAiMark()) ? markPaper.getAiMark() : MarkPaperAiMark.NONE)
-                .set(markQuestion.getDoubleRate() == 0, MarkQuestion::getDoubleRate, isExist && MarkPaperAiMark.MAN_MACHINE.equals(markPaper.getAiMark()) ? 100 : 0)
-                .set(markQuestion.getScorePolicy() == null, MarkQuestion::getScorePolicy, isExist && MarkPaperAiMark.MAN_MACHINE.equals(markPaper.getAiMark()) ? ScorePolicy.AVG : null)
-                .eq(MarkQuestion::getId, questionId);
+        LambdaUpdateWrapper<MarkQuestion> lambda = updateWrapper.lambda();
+        lambda.set(MarkQuestion::getAiMark, isExist && !MarkPaperAiMark.NONE.equals(markPaper.getAiMark()) ? markPaper.getAiMark() : MarkPaperAiMark.NONE);
+        if (isExist) {
+            if (MarkPaperAiMark.AI_ONLY.equals(markPaper.getAiMark())) {
+                lambda.set(MarkQuestion::getDoubleRate, 0);
+                lambda.set(MarkQuestion::getArbitrateThreshold, null);
+                lambda.set(MarkQuestion::getScorePolicy, null);
+            } else if (MarkPaperAiMark.MAN_MACHINE.equals(markPaper.getAiMark())) {
+                lambda.set(MarkQuestion::getDoubleRate, 100);
+                lambda.set(markQuestion.getScorePolicy() == null, MarkQuestion::getScorePolicy, ScorePolicy.AVG);
+            }
+        }
+        lambda.eq(MarkQuestion::getId, questionId);
         this.update(updateWrapper);
     }
 

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

@@ -1567,10 +1567,12 @@ public class MarkServiceImpl implements MarkService {
         }
 
         BasicSchool basicSchool = basicSchoolMapper.selectByExamId(examId);
-        List<MarkTask> markTasks;
+        List<MarkTask> markTasks = null;
         int pageNumber = 1;
         do {
-            markTasks = markTaskService.findAiUnMarked(new Page<>(pageNumber, 20), examId, paperNumber, questionId);
+            if (CollectionUtils.isEmpty(markTasks)) {
+                markTasks = markTaskService.findAiUnOcr(new Page<>(pageNumber, 20), examId, paperNumber, questionId);
+            }
             if (markTasks.isEmpty() || !markQuestion.getEnableAi()) {
                 break;
             }
@@ -1582,10 +1584,9 @@ public class MarkServiceImpl implements MarkService {
                     log.error("OCR识别错误:", e.getMessage());
                 }
             }
-            pageNumber++;
             // 获取终止评卷标记
             markQuestion = markQuestionService.getById(questionId);
-            markTasks = markTaskService.findAiUnMarked(new Page<>(pageNumber, 20), examId, paperNumber, questionId);
+            markTasks = markTaskService.findAiUnOcr(new Page<>(pageNumber, 20), examId, paperNumber, questionId);
         } while (CollectionUtils.isNotEmpty(markTasks));
     }
 
@@ -1613,15 +1614,13 @@ public class MarkServiceImpl implements MarkService {
             List<MarkTask> markTasks = null;
             int pageNumber = 1;
             do {
-//                Set<Long> questions = new HashSet<>(Arrays.asList(questionId));
-                markTasks = markTaskService.findAiUnMarked(new Page<>(pageNumber, 20), examId, paperNumber, questionId);
+                if (CollectionUtils.isEmpty(markTasks)) {
+                    markTasks = markTaskService.findAiUnMarked(new Page<>(pageNumber, 20), examId, paperNumber, questionId);
+                }
                 if (markTasks.isEmpty() || !markQuestion.getEnableAi()) {
                     break;
                 }
                 for (MarkTask t : markTasks) {
-//                    if (this.applyTask(examId, paperNumber, t.getStudentId(), aiUser.getId(), questions, Arrays.asList(t.getId()))) {
-//                        continue;
-//                    }
                     // 考生作答
                     try {
                         long startTime = System.currentTimeMillis();
@@ -1652,7 +1651,6 @@ public class MarkServiceImpl implements MarkService {
                         markTaskService.updateAiMarkErrorMsg(t);
                     }
                 }
-                pageNumber++;
                 // 获取终止评卷标记
                 markQuestion = markQuestionService.getById(questionId);
                 markTasks = markTaskService.findAiUnMarked(new Page<>(pageNumber, 20), examId, paperNumber, questionId);
@@ -1723,7 +1721,11 @@ public class MarkServiceImpl implements MarkService {
 
         int initXAdd = 100, initYAdd = 100, stepXAdd = 100, stepYAdd = 50;
         int count = 0;
+        boolean breakFlag = false;
         for (int i = 0; i < pictureConfigList.size(); i++) {
+            if (breakFlag) {
+                break;
+            }
             MarkConfigItem markConfigItem = pictureConfigList.get(i);
             int finalI = i + 1;
             MarkOcrStudentQuestion markOcrStudentQuestion = markOcrStudentQuestions.stream().filter(m -> m.getNumber().equals(finalI)).findFirst().get();
@@ -1756,6 +1758,7 @@ public class MarkServiceImpl implements MarkService {
                 list.add(new TrackDTO(markQuestion, j + 1, doubles[count++], markConfigItem.getI(), offsetX, offsetY));
 
                 if (count == doubles.length) {
+                    breakFlag = true;
                     break;
                 }
             }

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

@@ -291,6 +291,11 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
         return this.baseMapper.findAiUnMarked(page, examId, paperNumber, questionId);
     }
 
+    @Override
+    public List<MarkTask> findAiUnOcr(Page<MarkTask> page, Long examId, String paperNumber, Long questionId) {
+        return this.baseMapper.findAiUnOcr(page, examId, paperNumber, questionId);
+    }
+
     @Override
     public int countByIdAndStatus(Long studentId, MarkTaskStatus status) {
         QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();

+ 38 - 10
teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml

@@ -233,17 +233,45 @@
     </select>
     <select id="findAiUnMarked" resultType="com.qmth.teachcloud.mark.entity.MarkTask">
         SELECT
-        mt.*
+            mt.*
         FROM
-        mark_task mt
-        <where>
-            mt.exam_id = #{examId}
-            AND mt.paper_number = #{paperNumber}
-            AND mt.question_id = #{questionId}
-            AND mt.user_id is null
-            AND mt.ai_marked = true
-            AND mt.status='WAITING'
-        </where>
+            mark_task mt
+        WHERE
+            mt.exam_id = #{examId} AND mt.paper_number = #{paperNumber}
+          AND mt.question_id = #{questionId}
+          AND mt.user_id IS NULL
+          AND mt.ai_marked = TRUE
+          AND mt.status = 'WAITING'
+          AND EXISTS( SELECT
+                          1
+                      FROM
+                          mark_ocr_student_question mosq
+                      WHERE
+                          mt.exam_id = mosq.exam_id
+                        AND mt.paper_number = mosq.paper_number
+                        AND mt.student_id = mosq.student_id
+                        AND mt.question_id = mosq.question_id)
+    </select>
+    <select id="findAiUnOcr" resultType="com.qmth.teachcloud.mark.entity.MarkTask">
+        SELECT
+            mt.*
+        FROM
+            mark_task mt
+        WHERE
+            mt.exam_id = #{examId} AND mt.paper_number = #{paperNumber}
+          AND mt.question_id = #{questionId}
+          AND mt.user_id IS NULL
+          AND mt.ai_marked = TRUE
+          AND mt.status = 'WAITING'
+          AND NOT EXISTS( SELECT
+                          1
+                      FROM
+                          mark_ocr_student_question mosq
+                      WHERE
+                          mt.exam_id = mosq.exam_id
+                        AND mt.paper_number = mosq.paper_number
+                        AND mt.student_id = mosq.student_id
+                        AND mt.question_id = mosq.question_id)
     </select>
     <select id="listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName"
             resultType="com.qmth.teachcloud.mark.entity.MarkTask">