Forráskód Böngészése

3.4.5 update-20250416,新功能开发

xiaofei 2 hónapja
szülő
commit
546fab667b

+ 2 - 2
distributed-print/install/config.ini

@@ -1,5 +1,5 @@
 [app]
-version=3.4.4
+version=3.4.5
 name=֪ѧ֪¿¼
 portal=http://localhost:7400/
 module=print
@@ -11,7 +11,7 @@ before=init.sql
 after=
 
 [upgrade]
-minmum_version=3.4.4
+minmum_version=3.4.5
 
 [print]
 port=7410

+ 16 - 7
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkAiQuestionParamController.java

@@ -5,20 +5,18 @@ import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.result.EditResult;
 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;
 import com.qmth.teachcloud.common.enums.FieldUniqueEnum;
+import com.qmth.teachcloud.common.enums.mark.MarkPaperAiMark;
 import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
-import com.qmth.teachcloud.mark.entity.MarkAiQuestionLevel;
-import com.qmth.teachcloud.mark.entity.MarkAiQuestionParam;
-import com.qmth.teachcloud.mark.entity.MarkAiQuestionPoint;
-import com.qmth.teachcloud.mark.service.MarkAiQuestionLevelService;
-import com.qmth.teachcloud.mark.service.MarkAiQuestionParamService;
-import com.qmth.teachcloud.mark.service.MarkAiQuestionPointService;
-import com.qmth.teachcloud.mark.service.MarkQuestionService;
+import com.qmth.teachcloud.mark.entity.*;
+import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
+import com.qmth.teachcloud.mark.service.*;
 import io.swagger.annotations.*;
 import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
@@ -30,6 +28,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -58,6 +57,10 @@ public class MarkAiQuestionParamController {
     MarkAiQuestionLevelService markAiQuestionLevelService;
     @Resource
     private MarkQuestionService markQuestionService;
+    @Resource
+    private MarkPaperService markPaperService;
+    @Resource
+    private MarkTaskService markTaskService;
 
     @Resource
     RedisUtil redisUtil;
@@ -76,6 +79,12 @@ public class MarkAiQuestionParamController {
         if (!lock) {
             throw ExceptionResultEnum.ERROR.exception("正在设置AI评卷参数,请稍候再试!");
         }
+
+        // 有人评任务
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(markAiQuestionParam.getQuestionId(), markAiQuestionParam.getPaperNumber());
+        if (!MarkPaperAiMark.NONE.equals(markPaper.getAiMark()) && markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndAiMarkedAndStatusNotIn(markAiQuestionParam.getExamId(), markAiQuestionParam.getPaperNumber(), markAiQuestionParam.getQuestionId(), false, Arrays.asList(MarkTaskStatus.WAITING)) > 0) {
+            throw ExceptionResultEnum.ERROR.exception("评卷员已开始评卷,请先重置评卷任务后再设置");
+        }
         boolean update = false;
         try {
             switch (markAiQuestionParam.getMode()) {

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

@@ -37,6 +37,7 @@ public interface MarkTaskService extends IService<MarkTask> {
 
     List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndStatusNotIn(Long examId, String paperNumber, Long questionId, Long userId, List<MarkTaskStatus> statusList);
     List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndAiMarkedAndStatusNotIn(Long examId, String paperNumber, Long questionId, Boolean aiMarked, List<MarkTaskStatus> statusList);
+    int countByExamIdAndPaperNumberAndQuestionIdAndAiMarkedAndStatusNotIn(Long examId, String paperNumber, Long questionId, Boolean aiMarked, List<MarkTaskStatus> statusList);
 
     boolean resetById(Long markTaskId, Long userId, String rejectReason, Long rejectId, Long date, MarkTaskStatus newStatus);
 

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

@@ -781,12 +781,16 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
                 .eq(MarkQuestion::getId, doubleMarkParam.getQuestionId());
         this.update(updateWrapper);
 
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
+        if (MarkPaperAiMark.MAN_MACHINE.equals(markPaper.getAiMark()) && oldDoubleRate - doubleRate != 0) {
+            throw ExceptionResultEnum.ERROR.exception("人机双评模式,不允许进行单、双评切换");
+        }
+
         // 单、双评切换修改,不删除任务,补发二评任务
         if (oldDoubleRate == 0 && doubleRate == 100) {
             this.updateMarkedCount(questionId, 0);
             this.updateTaskCount(questionId, 0);
             if (lockService.trylock(LockType.QUESTION_UPDATE, questionId)) {
-                MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
                 // 考生主观题重新统分
                 markService.checkStudentSubjectiveScore(examId, markPaper.getCoursePaperId());
                 markSyncService.deleteMarkedByQuestion(markQuestion, false);
@@ -795,7 +799,6 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
             this.updateMarkedCount(questionId, 0);
             this.updateTaskCount(questionId, 0);
             if (lockService.trylock(LockType.QUESTION_UPDATE, questionId)) {
-                MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
                 // 考生主观题重新统分
                 markService.checkStudentSubjectiveScore(examId, markPaper.getCoursePaperId());
                 markSyncService.deleteMarkedByQuestion(markQuestion, true);

+ 26 - 12
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -626,6 +626,10 @@ public class MarkServiceImpl implements MarkService {
     }
 
     private Boolean getAiMarked(MarkQuestion markQuestion, Integer taskNumber) {
+        // 未设置AI智能评卷参数,全部为人评任务
+        if (!markAiQuestionParamService.existMarkAiQuestionPointOrLevel(markQuestion.getExamId(), markQuestion.getPaperNumber(), markQuestion.getId())) {
+            return false;
+        }
         if (MarkPaperAiMark.NONE.equals(markQuestion.getAiMark())) {
             return false;
         } else if (MarkPaperAiMark.AI_ONLY.equals(markQuestion.getAiMark()) || MarkPaperAiMark.MAN_MACHINE.equals(markQuestion.getAiMark())) {
@@ -1589,19 +1593,29 @@ public class MarkServiceImpl implements MarkService {
             return;
         }
         if (markPaper.getStatus() == MarkPaperStatus.FORMAL) {
-            // 遍历相关评卷任务的模式
-            List<MarkTaskStatus> statusList = Arrays.asList(MarkTaskStatus.WAITING);
-            List<MarkTask> markTaskList = markTaskService.listByExamIdAndPaperNumberAndQuestionIdAndAiMarkedAndStatusNotIn(examId, paperNumber, questionId, true, statusList);
-            for (MarkTask markTask : markTaskList) {
-                Long studentId = markTask.getStudentId();
-                markTaskService.resetById(markTask.getId(), null, null, null, null, MarkTaskStatus.WAITING);
-                markSubjectiveScoreService.deleteByStudentIdAndQuestionId(studentId, questionId);
-                markRejectHistoryService.deleteByTaskId(markTask.getId());
-                markArbitrateHistoryService.deleteByExamIdAndPaperNumberAndStudentIdAndQuestionId(examId, paperNumber, studentId, questionId);
-                lockService.waitlock(LockType.STUDENT, markTask.getStudentId());
-                markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK);
-                lockService.unlock(LockType.STUDENT, markTask.getStudentId());
+            // 未设置AI智能评卷参数,删除所有任务
+            if (!markAiQuestionParamService.existMarkAiQuestionPointOrLevel(examId, paperNumber, questionId)) {
+                markTaskService.deleteByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);
+                markSubjectiveScoreService.deleteByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);
+                markRejectHistoryService.deleteByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);
+                markArbitrateHistoryService.deleteByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);
+                this.checkStudentSubjectiveScore(examId, markPaper.getCoursePaperId());
+            } else {
+                // 遍历相关评卷任务的模式
+                List<MarkTaskStatus> statusList = Arrays.asList(MarkTaskStatus.WAITING);
+                List<MarkTask> markTaskList = markTaskService.listByExamIdAndPaperNumberAndQuestionIdAndAiMarkedAndStatusNotIn(examId, paperNumber, questionId, true, statusList);
+                for (MarkTask markTask : markTaskList) {
+                    Long studentId = markTask.getStudentId();
+                    markTaskService.resetById(markTask.getId(), null, null, null, null, MarkTaskStatus.WAITING);
+                    markSubjectiveScoreService.deleteByStudentIdAndQuestionId(studentId, questionId);
+                    markRejectHistoryService.deleteByTaskId(markTask.getId());
+                    markArbitrateHistoryService.deleteByExamIdAndPaperNumberAndStudentIdAndQuestionId(examId, paperNumber, studentId, questionId);
+                    lockService.waitlock(LockType.STUDENT, markTask.getStudentId());
+                    markStudentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK);
+                    lockService.unlock(LockType.STUDENT, markTask.getStudentId());
+                }
             }
+
             //清空ocr识别结果
             if (markQuestion.getClearOcrResult()) {
                 markOcrStudentQuestionService.deleteByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);

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

@@ -154,6 +154,17 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
         return this.list(queryWrapper);
     }
 
+    @Override
+    public int countByExamIdAndPaperNumberAndQuestionIdAndAiMarkedAndStatusNotIn(Long examId, String paperNumber, Long questionId, Boolean aiMarked, List<MarkTaskStatus> statusList) {
+        QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkTask::getExamId, examId)
+                .eq(MarkTask::getPaperNumber, paperNumber)
+                .eq(MarkTask::getQuestionId, questionId)
+                .eq(MarkTask::getAiMarked, aiMarked)
+                .notIn(MarkTask::getStatus, statusList);
+        return this.count(queryWrapper);
+    }
+
     @Override
     public boolean resetById(Long markTaskId, Long userId, String rejectReason, Long rejectId, Long date, MarkTaskStatus newStatus) {
         UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();