Explorar o código

3.4.4 update-20250310,sql优化

xiaofei hai 3 meses
pai
achega
8b1dc1a28b

+ 5 - 1
distributed-print/install/mysql/upgrade/3.4.4.sql

@@ -283,4 +283,8 @@ ALTER TABLE `basic_print_config` ADD COLUMN `two_paper_enable` TINYINT(1) NULL D
 
 UPDATE sys_privilege
 SET name='课程任课老师导入', url='/api/admin/teach/course/import', `type`='URL', parent_id=13, `sequence`=1, property='AUTH', related=NULL, enable=1, default_auth=1, front_display=1
-WHERE id=1193;
+WHERE id=1193;
+
+ALTER TABLE `mark_paper` ADD INDEX `index3` (`status` ASC, `upload_count` ASC);
+
+ALTER TABLE `mark_student` ADD INDEX `index7` (`subjective_status` ASC);

+ 22 - 33
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -704,49 +704,38 @@ public class MarkServiceImpl implements MarkService {
             for (MarkUserQuestion question : markUserQuestionList) {
                 dto = new MarkStatusDto(markQuestionService.getById(question.getQuestionId()));
                 List<Long> questionIds = Arrays.asList(question.getQuestionId());
-                //总数量(考生数)
-                dto.setTotalCount(markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, null, classNames, questionIds));
-                // 未评
-                int unmarkCount = markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, null, classNames, questionIds, MarkTaskStatus.WAITING, MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.REJECTED);
-                //总评卷数量(考生数)
-                dto.setMarkedCount(dto.getTotalCount() == 0 ? 0 : dto.getTotalCount() - unmarkCount);
-                //个人评卷数量(考生数)
-                dto.setPersonCount(markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, userId, classNames, questionIds, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED,
-                        MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.PROBLEM));
-                //问题卷数量(任务数)
-                dto.setProblemCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(examId,
-                        paperNumber, question.getQuestionId(), classNames, MarkTaskStatus.PROBLEM));
-                //待仲裁卷数量(任务数)
-                dto.setArbitrateCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(examId,
-                        paperNumber, question.getQuestionId(), classNames, MarkTaskStatus.WAIT_ARBITRATE));
-                dto.setLeftCount(dto.getTotalCount() - dto.getPersonCount());
-                dtoList.add(dto);
+                dtoList.add(getDto(dto, examId, paperNumber, userId, classNames, questionIds));
             }
         } else if (QuestionModel.MULTI.equals(questionModel)) {
             MarkStatusDto dto = new MarkStatusDto();
             List<Long> questionIds = markUserQuestionList.stream().filter(m -> m.getUserId().equals(userId)).map(MarkUserQuestion::getQuestionId).collect(Collectors.toList());
-            //待仲裁卷数量
-            dto.setArbitrateCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(examId,
-                    paperNumber, null, classNames, MarkTaskStatus.WAIT_ARBITRATE));
-            //总数量
-            dto.setTotalCount(markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber,null, classNames, questionIds));
-            // 未评
-            int unmarkCount = markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, null, classNames, questionIds, MarkTaskStatus.WAITING, MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.REJECTED);
-            //总评卷数量(考生数)
-            dto.setMarkedCount(dto.getTotalCount() == 0 ? 0 : dto.getTotalCount() - unmarkCount);
-            //个人评卷数量
-            dto.setPersonCount(markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, userId, classNames, questionIds, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED,
-                    MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.PROBLEM));
-            //问题卷数量
-            dto.setProblemCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(examId,
-                    paperNumber, null, classNames, MarkTaskStatus.PROBLEM));
-            dtoList.add(dto);
+            dtoList.add(getDto(dto, examId, paperNumber, userId, classNames, questionIds));
         } else {
             throw ExceptionResultEnum.ERROR.exception("参数有误");
         }
         return dtoList;
     }
 
+    private MarkStatusDto getDto(MarkStatusDto dto, Long examId, String paperNumber, Long userId, List<String> classNames, List<Long> questionIds) {
+        //待仲裁卷数量
+        dto.setArbitrateCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(examId,
+                paperNumber, null, classNames, MarkTaskStatus.WAIT_ARBITRATE));
+        //总数量
+        dto.setTotalCount(markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, null, classNames, questionIds));
+        // 未评
+        int unmarkCount = markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, null, classNames, questionIds, MarkTaskStatus.WAITING, MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.REJECTED);
+        dto.setLeftCount(unmarkCount);
+        //总评卷数量(考生数)
+        dto.setMarkedCount(dto.getTotalCount() == 0 ? 0 : dto.getTotalCount() - unmarkCount);
+        //个人评卷数量
+        dto.setPersonCount(markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, userId, classNames, questionIds, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED,
+                MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.PROBLEM));
+        //问题卷数量
+        dto.setProblemCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(examId,
+                paperNumber, null, classNames, MarkTaskStatus.PROBLEM));
+        return dto;
+    }
+
     @Override
     public void clear(Long userId, Long examId, String paperNumber) {
         TaskLock taskLock = TaskLockUtil.getFormalTask(getKey(examId, paperNumber));

+ 24 - 8
teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

@@ -1087,15 +1087,31 @@
     </update>
 
     <select id="findNeedScoreCalculateStudent" resultType="com.qmth.teachcloud.mark.entity.MarkStudent">
-        select ms.* from mark_student ms
+        SELECT
+            ms.id, ms.exam_id, ms.paper_number, ms.version
+        FROM
+            (SELECT
+                 id, exam_id, paper_number, version
+             FROM
+                 mark_student
+             WHERE
+                 subjective_status = 'UNMARK') ms
         <where>
-            exists(select 1 from mark_paper mp
-        where mp.status = 'FORMAL' and mp.upload_count > 0 and exists(select 1 from basic_exam be
-        where exists(select 1 from basic_school bs where bs.enable = true and bs.id = be.school_id)
-        and be.enable = true and be.id = mp.exam_id) and ms.exam_id = mp.exam_id and ms.paper_number = mp.paper_number)
-        and ms.subjective_status = 'UNMARK'
-        and ms.is_upload = true and (ms.is_absent = false and ms.is_manual_absent = false and omr_absent = false)
-        <!--and exists(select 1 from mark_task mt where ms.id = mt.student_id)*-->
+            EXISTS( SELECT
+                        1
+                    FROM
+                        mark_paper mp
+                    WHERE
+                        mp.status = 'FORMAL'
+                      AND mp.upload_count > 0
+                      AND ms.exam_id = mp.exam_id
+                      AND ms.paper_number = mp.paper_number)
+          AND EXISTS( SELECT
+                          1
+                      FROM
+                          mark_task mt
+                      WHERE
+                          ms.id = mt.student_id)
         <if test="limit != null and limit != ''">
             ${limit}
         </if>