Przeglądaj źródła

3.4.4 update-20250310,sql优化

xiaofei 3 miesięcy temu
rodzic
commit
ac9ea563ce

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

@@ -277,4 +277,7 @@ WHERE id=1199;
 
 INSERT INTO sys_config
 (id, school_id, org_id, config_key, config_name, config_value, remark, enable, sort, create_id, create_time, update_id, update_time)
-VALUES(52, NULL, NULL, 'sms.mark.task.create.code', '阅卷待办短信通知', 'SMS_480165252', NULL, 1, 21, 1, 1733878447209, NULL, 1733878447249);
+VALUES(52, NULL, NULL, 'sms.mark.task.create.code', '阅卷待办短信通知', 'SMS_480165252', NULL, 1, 21, 1, 1733878447209, NULL, 1733878447249);
+
+
+ALTER TABLE `basic_print_config` ADD COLUMN `two_paper_enable` TINYINT(1) NULL DEFAULT 0 COMMENT '是否提交两套卷子(0-否,1-是)' AFTER `output_file_type`;

+ 14 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicPrintConfig.java

@@ -110,6 +110,12 @@ public class BasicPrintConfig extends BaseEntity implements Serializable {
     @TableField("default_serial_number")
     private Integer defaultSerialNumber;
 
+    /**
+     * 是否提交两套卷子(0-否,1-是)
+     */
+    @TableField("two_paper_enable")
+    private Boolean twoPaperEnable;
+
     /**
      * 变量印品参数json
      */
@@ -243,6 +249,14 @@ public class BasicPrintConfig extends BaseEntity implements Serializable {
         this.defaultSerialNumber = defaultSerialNumber;
     }
 
+    public Boolean getTwoPaperEnable() {
+        return twoPaperEnable;
+    }
+
+    public void setTwoPaperEnable(Boolean twoPaperEnable) {
+        this.twoPaperEnable = twoPaperEnable;
+    }
+
     public String getVariableContent() {
         return variableContent;
     }

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

@@ -40,9 +40,8 @@ public interface MarkTaskMapper extends BaseMapper<MarkTask> {
 
     List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId, @Param("className") String className);
 
-    int countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("userId") Long userId, @Param("classNames") List<String> classNames, @Param("statusList") MarkTaskStatus[] statusList);
-    int countTotalCountByExamIdAndPaperNumberAndAndClassNameAndQuestionIdIn(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("classNames") List<String> classNames, @Param("questionIds") Long[] questionIds);
-    int countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId, @Param("classNames") List<String> classNames, @Param("questionIds") Long[] questionIds, @Param("statusList") MarkTaskStatus[] statusList);
+    int countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("classNames") List<String> classNames, @Param("statusList") MarkTaskStatus[] statusList);
+    int countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId, @Param("classNames") List<String> classNames, @Param("questionIds") List<Long> questionIds, @Param("statusList") MarkTaskStatus[] statusList);
 
     IPage<MarkTaskDto> pageMarkTask(@Param("page") Page<Object> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("questionId") Long questionId, @Param("loginName") String loginName, @Param("status") MarkTaskStatus status, @Param("studentCode") String studentCode, @Param("secretNumber") String secretNumber, @Param("teachClassName") String teachClassName, @Param("subScore") Double subScore);
 

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

@@ -55,11 +55,9 @@ public interface MarkTaskService extends IService<MarkTask> {
 
     void deleteByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId);
 
-    int countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(Long examId, String paperNumber, Long questionId, Long userId, List<String> className, MarkTaskStatus... status);
+    int countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(Long examId, String paperNumber, Long questionId, List<String> className, MarkTaskStatus... status);
 
-    int countTotalCountByExamIdAndPaperNumberAndAndClassNameAndQuestionIdIn(Long examId, String paperNumber, List<String> className, Long... questionIds);
-
-    int countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(Long examId, String paperNumber, Long userId, List<String> className, Long[] questionIds, MarkTaskStatus... status);
+    int countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(Long examId, String paperNumber,Long userId, List<String> className, List<Long> questionIds, MarkTaskStatus... status);
 
     IPage<Long> listPageHistory(Page<Long> page, Long userId, Long examId, String paperNumber, String secretNumber, Double markerScore);
 

+ 23 - 20
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -703,40 +703,43 @@ public class MarkServiceImpl implements MarkService {
             MarkStatusDto dto;
             for (MarkUserQuestion question : markUserQuestionList) {
                 dto = new MarkStatusDto(markQuestionService.getById(question.getQuestionId()));
-                Long[] questionIds = new Long[]{question.getQuestionId()};
+                List<Long> questionIds = Arrays.asList(question.getQuestionId());
                 //总数量(考生数)
-                dto.setTotalCount(markTaskService.countTotalCountByExamIdAndPaperNumberAndAndClassNameAndQuestionIdIn(examId, paperNumber, classNames, questionIds));
+                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(markTaskService.countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, userId, classNames, questionIds, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED));
+                dto.setMarkedCount(dto.getTotalCount() == 0 ? 0 : dto.getTotalCount() - unmarkCount);
                 //个人评卷数量(考生数)
-                dto.setPersonCount(markTaskService.countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, userId, classNames, questionIds, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED,
-                        MarkTaskStatus.WAIT_ARBITRATE));
+                dto.setPersonCount(markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, userId, classNames, questionIds, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED,
+                        MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.PROBLEM));
                 //问题卷数量(任务数)
-                dto.setProblemCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(examId,
-                        paperNumber, question.getQuestionId(), null, classNames, MarkTaskStatus.PROBLEM));
+                dto.setProblemCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(examId,
+                        paperNumber, question.getQuestionId(), classNames, MarkTaskStatus.PROBLEM));
                 //待仲裁卷数量(任务数)
-                dto.setArbitrateCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(examId,
-                        paperNumber, question.getQuestionId(), null, classNames, MarkTaskStatus.WAIT_ARBITRATE));
+                dto.setArbitrateCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(examId,
+                        paperNumber, question.getQuestionId(), classNames, MarkTaskStatus.WAIT_ARBITRATE));
                 dto.setLeftCount(dto.getTotalCount() - dto.getPersonCount());
                 dtoList.add(dto);
             }
         } else if (QuestionModel.MULTI.equals(questionModel)) {
             MarkStatusDto dto = new MarkStatusDto();
-            List<Long> questionIdList = markUserQuestionList.stream().filter(m -> m.getUserId().equals(userId)).map(MarkUserQuestion::getQuestionId).collect(Collectors.toList());
-            Long[] questionIds = questionIdList.toArray(new Long[0]);
+            List<Long> questionIds = markUserQuestionList.stream().filter(m -> m.getUserId().equals(userId)).map(MarkUserQuestion::getQuestionId).collect(Collectors.toList());
             //待仲裁卷数量
-            dto.setArbitrateCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(examId,
-                    paperNumber, null, null, classNames, MarkTaskStatus.WAIT_ARBITRATE));
+            dto.setArbitrateCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(examId,
+                    paperNumber, null, classNames, MarkTaskStatus.WAIT_ARBITRATE));
             //总数量
-            dto.setTotalCount(markTaskService.countTotalCountByExamIdAndPaperNumberAndAndClassNameAndQuestionIdIn(examId, paperNumber, classNames, questionIds));
-            //总评卷数量(已评)
-            dto.setMarkedCount(markTaskService.countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, userId, classNames, questionIds, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED));
+            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.countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, userId, classNames, questionIds, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED,
-                    MarkTaskStatus.WAIT_ARBITRATE));
+            dto.setPersonCount(markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, userId, classNames, questionIds, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED,
+                    MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.PROBLEM));
             //问题卷数量
-            dto.setProblemCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(examId,
-                    paperNumber, null, null, classNames, MarkTaskStatus.PROBLEM));
+            dto.setProblemCount(markTaskService.countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(examId,
+                    paperNumber, null, classNames, MarkTaskStatus.PROBLEM));
             dtoList.add(dto);
         } else {
             throw ExceptionResultEnum.ERROR.exception("参数有误");

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

@@ -232,18 +232,13 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
     }
 
     @Override
-    public int countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(Long examId, String paperNumber, Long questionId, Long userId, List<String> className, MarkTaskStatus... status) {
-        return this.baseMapper.countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn(examId, paperNumber, questionId, userId, className, status);
+    public int countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(Long examId, String paperNumber, Long questionId, List<String> className, MarkTaskStatus... status) {
+        return this.baseMapper.countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(examId, paperNumber, questionId, className, status);
     }
 
     @Override
-    public int countTotalCountByExamIdAndPaperNumberAndAndClassNameAndQuestionIdIn(Long examId, String paperNumber, List<String> className, Long... questionIds) {
-        return this.baseMapper.countTotalCountByExamIdAndPaperNumberAndAndClassNameAndQuestionIdIn(examId, paperNumber, className, questionIds);
-    }
-
-    @Override
-    public int countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(Long examId, String paperNumber, Long userId, List<String> className, Long[] questionIds, MarkTaskStatus... status) {
-        return this.baseMapper.countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, userId, className, questionIds, status);
+    public int countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(Long examId, String paperNumber, Long userId, List<String> className, List<Long> questionIds, MarkTaskStatus... status) {
+        return this.baseMapper.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, userId, className, questionIds, status);
     }
 
     @Override

+ 5 - 6
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkUserQuestionServiceImpl.java

@@ -85,17 +85,16 @@ public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMap
             List<MarkQuestion> markQuestionList = this.listSubjectiveQuestionByUserId(record.getExamId(), record.getPaperNumber(), sysUser.getId());
             List<Long> questionIds = markQuestionList.stream().map(MarkQuestion::getId).collect(Collectors.toList());
 
-            int taskCount = markTaskService.countTotalCountByExamIdAndPaperNumberAndAndClassNameAndQuestionIdIn(record.getExamId(), record.getPaperNumber(), classNames, questionIds.toArray(new Long[0]));
+            int taskCount = markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(record.getExamId(), record.getPaperNumber(), null, classNames, questionIds);
             record.setTaskCount(taskCount);
-            int markedCount = markTaskService.countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(record.getExamId(), record.getPaperNumber(), sysUser.getId(), classNames, null, MarkTaskStatus.MARKED, MarkTaskStatus.ARBITRATED);
-            record.setMarkedCount(markedCount);
-
-            record.setLeftCount(taskCount == 0 ? 0 : taskCount - markedCount);
+            int unMarkedCount = markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(record.getExamId(), record.getPaperNumber(), null, classNames, questionIds, MarkTaskStatus.WAITING, MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.REJECTED, MarkTaskStatus.PROBLEM);
+            record.setLeftCount(unMarkedCount);
+            record.setMarkedCount(taskCount == 0 ? 0 : taskCount - unMarkedCount);
             // 评卷进度
             if (taskCount == 0) {
                 record.setPercent(0D);
             } else {
-                BigDecimal bigDecimal = new BigDecimal(markedCount * 100).divide(new BigDecimal(taskCount), 2, RoundingMode.HALF_UP);
+                BigDecimal bigDecimal = new BigDecimal(record.getMarkedCount() * 100).divide(new BigDecimal(taskCount), 2, RoundingMode.HALF_UP);
                 record.setPercent(bigDecimal.doubleValue());
             }
             // 分组题目

+ 61 - 87
teachcloud-mark/src/main/resources/mapper/MarkTaskMapper.xml

@@ -252,7 +252,7 @@
               where mt.student_id = ms.id)
           </if>
     </select>
-    <select id="countByExamIdAndPaperNumberAndQuestionIdAndUserIdAndAndClassNameStatusIn" resultType="java.lang.Integer">
+    <select id="countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn" resultType="java.lang.Integer">
         SELECT
             count(1)
         FROM
@@ -263,9 +263,6 @@
         <if test="questionId != null">
             AND mt.question_id = #{questionId}
         </if>
-        <if test="userId != null">
-            AND mt.user_id = #{userId}
-        </if>
         <if test="statusList != null and statusList.length > 0">
             and mt.status in
           <foreach collection="statusList" item="status" separator="," open="(" close=")">
@@ -282,92 +279,69 @@
             </foreach>))) t  WHERE mt.student_id = t.id)
         </if>
     </select>
-    <select id="countTotalCountByExamIdAndPaperNumberAndAndClassNameAndQuestionIdIn" resultType="java.lang.Integer">
-        select count(1) from mark_student ms
-        WHERE
-        ms.exam_id = #{examId}
-        AND ms.paper_number = #{paperNumber}
-        and exists (
+    <select id="countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn" resultType="java.lang.Integer">
         SELECT
-        1
+            COUNT(1)
         FROM
-        mark_task mt
+            mark_student ms
         WHERE
-        mt.exam_id = #{examId}
-        AND mt.paper_number = #{paperNumber}
-        AND ms.id = mt.student_id
-        <if test="questionIds != null and questionIds.length > 0 ">
-            AND mt.question_id in
-            <foreach collection="questionIds" item="id" open="(" close=")" separator=",">
-                #{id}
-            </foreach>
-        </if>
-        <if test="classNames != null and classNames.size() > 0">
-            AND EXISTS( SELECT
-            ms.id, ms.exam_id, ms.paper_number, bes.teach_class_name
-            FROM
-            (SELECT
-            *
-            FROM
-            mark_student
-            WHERE
-            exam_id = #{examId} AND paper_number = #{paperNumber}) ms
-            JOIN (SELECT
-            *
-            FROM
-            basic_exam_student
-            WHERE
-            exam_id = #{examId} AND teach_class_name in
-            <foreach collection="classNames" item="className" separator="," open="(" close=")">
-                #{className}
-            </foreach>) bes ON ms.basic_student_id = bes.id
-            WHERE
-            mt.student_id = ms.id)
-        </if>
-        )
-    </select>
-    <select id="countMarkedCountByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn" resultType="java.lang.Integer">
-        select count(distinct t.student_id) from (SELECT
-        mt.student_id,
-        sum(case when mt.marker_score is not null and mt.status in
-        <foreach collection="statusList" item="status" separator="," open="(" close=")">
-            #{status}
-        </foreach>
-            then 1 else 0 end) markCount
-        FROM
-        mark_task mt
-        WHERE
-        mt.exam_id = #{examId}
-        AND mt.paper_number = #{paperNumber}
-        AND mt.user_id = #{userId}
-        <if test="questionIds != null and questionIds.length > 0">
-            AND mt.question_id in
-            <foreach collection="questionIds" item="id" open="(" close=")" separator=",">
-                #{id}
-            </foreach>
-        </if>
-        <if test="classNames != null and classNames.size() > 0">
-            AND EXISTS( SELECT
-            ms.id, ms.exam_id, ms.paper_number, bes.teach_class_name
-            FROM
-            (SELECT
-            *
-            FROM
-            mark_student
-            WHERE
-            exam_id = #{examId} AND paper_number = #{paperNumber}) ms
-            JOIN (SELECT
-            *
-            FROM
-            basic_exam_student
-            WHERE
-            exam_id = #{examId} AND teach_class_name in
-            <foreach collection="classNames" item="className" separator="," open="(" close=")">
-                #{className}
-            </foreach>) bes ON ms.basic_student_id = bes.id
-            WHERE
-            mt.student_id = ms.id)
-        </if> group by mt.student_id) t
+            ms.exam_id = #{examId}
+          AND ms.paper_number = #{paperNumber}
+          AND EXISTS( SELECT
+                          1
+                      FROM
+                          (SELECT
+                               mt.student_id
+                           FROM
+                               mark_task mt
+                           WHERE
+                               mt.exam_id = #{examId}
+                             AND mt.paper_number = #{paperNumber}
+                             <if test="userId !=null">
+                                 AND mt.user_id = #{userId}
+                             </if>
+                            <if test="questionIds != null and questionIds.size() > 0">
+                                AND mt.question_id in
+                                <foreach collection="questionIds" item="id" open="(" close=")" separator=",">
+                                    #{id}
+                                </foreach>
+                            </if>
+                            <if test="statusList != null and statusList.length > 0">
+                                AND mt.status IN
+                                <foreach collection="statusList" item="status" open="(" close=")" separator=",">
+                                    #{status}
+                                </foreach>
+                            </if>
+                            <if test="classNames != null and classNames.size() > 0">
+                             AND EXISTS( SELECT
+                                             1
+                                         FROM
+                                             (SELECT
+                                                  ms.id
+                                              FROM
+                                                  mark_student ms
+                                              WHERE
+                                                  ms.exam_id = #{examId}
+                                                AND ms.paper_number = #{paperNumber}
+                                                AND EXISTS( SELECT
+                                                                1
+                                                            FROM
+                                                                basic_exam_student bes
+                                                            WHERE
+                                                                bes.exam_id = #{examId}
+                                                              AND ms.basic_student_id = bes.id
+                                                              AND bes.teach_class_name IN
+                                                            <foreach collection="classNames" item="className" separator="," open="(" close=")">
+                                                                #{className}
+                                                            </foreach>
+                                                              )) ms
+                                         WHERE
+                                             mt.student_id = ms.id)
+                            </if>
+                           ) t
+                      WHERE
+                          ms.id = t.student_id)
+
     </select>
     <select id="pageMarkTask" resultType="com.qmth.teachcloud.mark.dto.mark.manage.MarkTaskDto">
         SELECT