浏览代码

扫描统计速度优化

wangliang 11 月之前
父节点
当前提交
6e03485520

+ 41 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/statistics/ScanCalculateResult.java

@@ -0,0 +1,41 @@
+package com.qmth.distributed.print.business.bean.result.statistics;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.qmth.teachcloud.common.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @Description: 扫描计算统计 result
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2024/7/11
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class ScanCalculateResult implements Serializable {
+
+    @ApiModelProperty(value = "已扫张数")
+    private int sheetCount;
+
+    @ApiModelProperty(value = "扫描进度")
+    private BigDecimal scanUploadRate;
+
+    public int getSheetCount() {
+        return sheetCount;
+    }
+
+    public void setSheetCount(int sheetCount) {
+        this.sheetCount = sheetCount;
+    }
+
+    public BigDecimal getScanUploadRate() {
+        return scanUploadRate;
+    }
+
+    public void setScanUploadRate(BigDecimal scanUploadRate) {
+        this.scanUploadRate = scanUploadRate;
+    }
+}

+ 33 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/statistics/ScanCountResult.java

@@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.StringUtils;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Objects;
 import java.util.StringJoiner;
 
@@ -26,6 +27,14 @@ public class ScanCountResult implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long id;
 
+    @ApiModelProperty(value = "考试id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examId;
+
+    @ApiModelProperty(value = "课程id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long courseId;
+
     @ApiModelProperty(value = "课程名称(代码)")
     @ExcelProperty(name = "课程(代码)", width = 20, index = 2)
     private String courseNameCode;
@@ -61,7 +70,7 @@ public class ScanCountResult implements Serializable {
     private int absentCount;
 
     @ApiModelProperty(value = "扫描进度")
-    private int scanUploadRate;
+    private BigDecimal scanUploadRate;
 
     @ApiModelProperty(value = "题卡类型")
     private String cardType;
@@ -74,6 +83,27 @@ public class ScanCountResult implements Serializable {
     @ExcelProperty(name = "扫描进度", width = 40, index = 8)
     private String scanUploadRateStr;
 
+    public void updateRateAndSheetCount(ScanCalculateResult scanCalculateResult){
+        this.setScanUploadRate(scanCalculateResult.getScanUploadRate());
+        this.setSheetCount(scanCalculateResult.getSheetCount());
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public Long getId() {
         return id;
     }
@@ -130,11 +160,11 @@ public class ScanCountResult implements Serializable {
         this.absentCount = absentCount;
     }
 
-    public int getScanUploadRate() {
+    public BigDecimal getScanUploadRate() {
         return scanUploadRate;
     }
 
-    public void setScanUploadRate(int scanUploadRate) {
+    public void setScanUploadRate(BigDecimal scanUploadRate) {
         this.scanUploadRate = scanUploadRate;
     }
 

+ 13 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamTaskMapper.java

@@ -6,8 +6,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.distributed.print.business.bean.dto.*;
 import com.qmth.distributed.print.business.bean.dto.approvalForm.ExamPackageDetail;
 import com.qmth.distributed.print.business.bean.result.WorkResult;
-import com.qmth.distributed.print.business.bean.result.statistics.ScanCountResult;
 import com.qmth.distributed.print.business.bean.result.statistics.PrintCountResult;
+import com.qmth.distributed.print.business.bean.result.statistics.ScanCalculateResult;
+import com.qmth.distributed.print.business.bean.result.statistics.ScanCountResult;
 import com.qmth.distributed.print.business.entity.ExamTask;
 import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.teachcloud.common.bean.dto.BlurryUserDto;
@@ -165,4 +166,15 @@ public interface ExamTaskMapper extends BaseMapper<ExamTask> {
      * @return
      */
     List<ScanCountResult> scanCountListExport(@Param("schoolId") Long schoolId, @Param("semesterId") Long semesterId, @Param("examId") Long examId, @Param("collegeId") Long collegeId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber, @Param("cardType") String cardType, @Param("dpr") DataPermissionRule dpr);
+
+    /**
+     * 统计计算
+     *
+     * @param examId
+     * @param courseId
+     * @param paperNumber
+     * @param studentCount
+     * @return
+     */
+    public ScanCalculateResult scanCalculate(@Param("examId") Long examId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber, @Param("studentCount") int studentCount);
 }

+ 12 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java

@@ -10,6 +10,7 @@ import com.qmth.distributed.print.business.bean.params.ExamTaskSubmitPram;
 import com.qmth.distributed.print.business.bean.params.MakeupExamTaskTotalParam;
 import com.qmth.distributed.print.business.bean.result.WorkResult;
 import com.qmth.distributed.print.business.bean.result.examTaskStudent.ExamTaskStudentObjectResult;
+import com.qmth.distributed.print.business.bean.result.statistics.ScanCalculateResult;
 import com.qmth.distributed.print.business.bean.result.statistics.ScanCountResult;
 import com.qmth.distributed.print.business.bean.result.statistics.PrintCountResult;
 import com.qmth.distributed.print.business.entity.ExamDetail;
@@ -255,4 +256,15 @@ public interface ExamTaskService extends IService<ExamTask> {
      * @return
      */
     public List<ScanCountResult> scanCountListExport(Long semesterId, Long examId, Long collegeId, Long courseId, String paperNumber, CardTypeEnum cardType);
+
+    /**
+     * 统计计算
+     *
+     * @param examId
+     * @param courseId
+     * @param paperNumber
+     * @param studentCount
+     * @return
+     */
+    public ScanCalculateResult scanCalculate(Long examId, Long courseId, String paperNumber, int studentCount);
 }

+ 36 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -10,15 +10,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.google.gson.Gson;
-import com.qmth.distributed.print.business.bean.query.BasicExamStudentQuery;
 import com.qmth.distributed.print.business.bean.dto.*;
 import com.qmth.distributed.print.business.bean.dto.approvalForm.*;
 import com.qmth.distributed.print.business.bean.dto.examObject.ExamObjectDto;
 import com.qmth.distributed.print.business.bean.params.*;
+import com.qmth.distributed.print.business.bean.query.BasicExamStudentQuery;
 import com.qmth.distributed.print.business.bean.result.BasicExamStudentResult;
 import com.qmth.distributed.print.business.bean.result.WorkResult;
 import com.qmth.distributed.print.business.bean.result.examTaskStudent.ExamTaskStudentObjectResult;
 import com.qmth.distributed.print.business.bean.result.statistics.PrintCountResult;
+import com.qmth.distributed.print.business.bean.result.statistics.ScanCalculateResult;
 import com.qmth.distributed.print.business.bean.result.statistics.ScanCountResult;
 import com.qmth.distributed.print.business.entity.*;
 import com.qmth.distributed.print.business.enums.*;
@@ -2016,7 +2017,16 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(schoolId, requestUser.getId(), ServletUtil.getRequest().getServletPath());
-        return this.baseMapper.scanCountList(iPage, schoolId, semesterId, examId, collegeId, courseId, paperNumber, Objects.nonNull(cardType) ? cardType.name() : null, dpr);
+        IPage<ScanCountResult> scanCountResultIPage = this.baseMapper.scanCountList(iPage, schoolId, semesterId, examId, collegeId, courseId, paperNumber, Objects.nonNull(cardType) ? cardType.name() : null, dpr);
+        if (Objects.nonNull(scanCountResultIPage) && !CollectionUtils.isEmpty(scanCountResultIPage.getRecords())) {
+            for (ScanCountResult s : scanCountResultIPage.getRecords()) {
+                ScanCalculateResult scanCalculateResult = this.baseMapper.scanCalculate(s.getExamId(), s.getCourseId(), s.getPaperNumber(), s.getStudentCount());
+                if (Objects.nonNull(scanCalculateResult)) {
+                    s.updateRateAndSheetCount(scanCalculateResult);
+                }
+            }
+        }
+        return scanCountResultIPage;
     }
 
     /**
@@ -2035,7 +2045,30 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(schoolId, requestUser.getId(), ServletUtil.getRequest().getServletPath());
-        return this.baseMapper.scanCountListExport(schoolId, semesterId, examId, collegeId, courseId, paperNumber, Objects.nonNull(cardType) ? cardType.name() : null, dpr);
+        List<ScanCountResult> scanCountResultList = this.baseMapper.scanCountListExport(schoolId, semesterId, examId, collegeId, courseId, paperNumber, Objects.nonNull(cardType) ? cardType.name() : null, dpr);
+        if (!CollectionUtils.isEmpty(scanCountResultList)) {
+            for (ScanCountResult s : scanCountResultList) {
+                ScanCalculateResult scanCalculateResult = this.baseMapper.scanCalculate(s.getExamId(), s.getCourseId(), s.getPaperNumber(), s.getStudentCount());
+                if (Objects.nonNull(scanCalculateResult)) {
+                    s.updateRateAndSheetCount(scanCalculateResult);
+                }
+            }
+        }
+        return scanCountResultList;
+    }
+
+    /**
+     * 统计计算
+     *
+     * @param examId
+     * @param courseId
+     * @param paperNumber
+     * @param studentCount
+     * @return
+     */
+    @Override
+    public ScanCalculateResult scanCalculate(Long examId, Long courseId, String paperNumber, int studentCount) {
+        return null;
     }
 
     private ExamTaskPaperData saveTikuPaperData(Long examId, Long paperId, String uuid, File zipFile) {

+ 32 - 26
distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml

@@ -1430,30 +1430,20 @@
     </select>
 
     <sql id="scanCountCommon">
-        select t.* from(select
-        t.id,
-        t.college,
-        t.courseName,
-        t.courseCode,
-        t.paperNumber,
-        t.studentCount,
-        t.absentCount,
-        IF(t.studentCount > 0 ,ROUND(t.isUpload / t.studentCount * 100, 2) ,0) as scanUploadRate,
-        GROUP_CONCAT(distinct ec.type) as cardType,
-        ROUND(t.sheetCount / 2, 2) as sheetCount
-        from
-        (
+        select t.*,
+        GROUP_CONCAT(distinct ec.type) as cardType
+        from (
         select
         distinct
         mp.id,
+        mp.exam_id as examId,
+        mp.course_id as courseId,
         so.name as college,
         bc.name as courseName,
         bc.code as courseCode,
         mp.paper_number as paperNumber,
         IFNULL(mp.student_count, 0) as studentCount,
-        sum(ms.sheet_count) as sheetCount,
         IFNULL(mp.absent_count, 0) as absentCount,
-        sum(case when ms.is_upload = 1 then 1 else 0 end) as isUpload,
         concat(replace(substring_index(substring_index(convert((etd.paper_attachment_ids ->>'$[*].cardId') using utf8),
         ']', 1), '[',-1), '"', ''),', ') as cardId
         from mark_paper mp
@@ -1464,8 +1454,7 @@
         left join exam_task et on et.exam_id = mp.exam_id and et.course_id = mp.course_id and et.paper_number =
         mp.paper_number
         left join exam_task_detail etd on etd.exam_task_id = et.id
-        left join mark_student ms on ms.exam_id = mp.exam_id and ms.course_id = mp.course_id and ms.paper_Number =
-        mp.paper_Number<where>
+        <where>
         1 = 1
         <if test="schoolId != null and schoolId != ''">
                 AND bs.school_id = #{schoolId}
@@ -1509,13 +1498,7 @@
                     </foreach>
                 </if>
             </if>
-        </where>
-        group by
-        mp.id,
-        so.name,
-        bc.name,
-        bc.code,
-        mp.paper_number) t
+        </where>) t
         left join tmp_help_topic b on b.help_topic_id <![CDATA[ < ]]> (LENGTH(t.cardId) - LENGTH( REPLACE (t.cardId,
         ', ', '' ) ) + 1 )
         left join exam_card ec on ec.id in (SUBSTRING_INDEX(SUBSTRING_INDEX(t.cardId, ', ', b.help_topic_id), ', ',-1))
@@ -1529,8 +1512,7 @@
         t.college,
         t.courseName,
         t.courseCode,
-        t.paperNumber) t
-        where t.paperNumber is not null
+        t.paperNumber
         order by t.paperNumber desc
     </sql>
 
@@ -1541,4 +1523,28 @@
     <select id="scanCountListExport" resultType="com.qmth.distributed.print.business.bean.result.statistics.ScanCountResult">
         <include refid="scanCountCommon" />
     </select>
+
+    <select id="scanCalculate" resultType="com.qmth.distributed.print.business.bean.result.statistics.ScanCalculateResult">
+        select
+            if(#{studentCount} > 0 ,ROUND(t.isUpload / #{studentCount} * 100, 2) ,0) as scanUploadRate,
+            ROUND(t.sheetCount / 2, 2) as sheetCount
+        from
+            (
+                select
+                    sum(ms.sheet_count) as sheetCount,
+                    sum(case when ms.is_upload = 1 then 1 else 0 end) as isUpload
+                from
+                    mark_student ms
+                <where>
+                    <if test="examId != null and examId != ''">
+                        AND ms.exam_id = #{examId}
+                    </if>
+                    <if test="courseId != null and courseId != ''">
+                        AND ms.course_id = #{courseId}
+                    </if>
+                    <if test="paperNumber != null and paperNumber != ''">
+                        AND ms.paper_number = #{paperNumber}
+                    </if>
+                </where>) t
+    </select>
 </mapper>