Browse Source

新增统计管理-印刷任务统计

wangliang 11 months ago
parent
commit
135e03448d

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

@@ -0,0 +1,164 @@
+package com.qmth.distributed.print.business.bean.result.statistics;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.enums.CardTypeEnum;
+import com.qmth.teachcloud.common.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @Description: 印刷任务统计 result
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2024/7/10
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class PrintTaskResult implements Serializable {
+
+    @ApiModelProperty(value = "主键")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    @ApiModelProperty(value = "课程名称(代码)")
+    @ExcelProperty(name = "课程(代码)", width = 20, index = 2)
+    private String courseNameCode;
+
+    @ApiModelProperty(value = "试卷编号")
+    @ExcelProperty(name = "试卷编号", width = 20, index = 3)
+    private String paperNumber;
+
+    @ApiModelProperty(value = "题卡id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long cardId;
+
+    @ApiModelProperty(value = "开课学院")
+    @ExcelProperty(name = "开课学院", width = 20, index = 1)
+    private String college;
+
+    @ApiModelProperty(value = "考生数")
+    @ExcelProperty(name = "考生数", width = 20, index = 5)
+    private int studentCount;
+
+    @ApiModelProperty(value = "已扫张数")
+    @ExcelProperty(name = "已扫张数", width = 20, index = 6)
+    private int sheetCount;
+
+    @ApiModelProperty(value = "缺考数")
+    @ExcelProperty(name = "缺考数", width = 20, index = 7)
+    private int absentCount;
+
+    @ApiModelProperty(value = "扫描进度")
+    private int scanUploadRate;
+
+    @ApiModelProperty(value = "题卡类型")
+    private CardTypeEnum cardType;
+
+    @ApiModelProperty(value = "题卡类型str")
+    @ExcelProperty(name = "题卡类型", width = 20, index = 4)
+    private String cardTypeStr;
+
+    @ApiModelProperty(value = "扫描进度str")
+    @ExcelProperty(name = "扫描进度", width = 40, index = 8)
+    private String scanUploadRateStr;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCourseNameCode() {
+        return courseNameCode;
+    }
+
+    public void setCourseNameCode(String courseNameCode) {
+        this.courseNameCode = courseNameCode;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public Long getCardId() {
+        return cardId;
+    }
+
+    public void setCardId(Long cardId) {
+        this.cardId = cardId;
+    }
+
+    public String getCollege() {
+        return college;
+    }
+
+    public void setCollege(String college) {
+        this.college = college;
+    }
+
+    public int getStudentCount() {
+        return studentCount;
+    }
+
+    public void setStudentCount(int studentCount) {
+        this.studentCount = studentCount;
+    }
+
+    public int getSheetCount() {
+        return sheetCount;
+    }
+
+    public void setSheetCount(int sheetCount) {
+        this.sheetCount = sheetCount;
+    }
+
+    public int getAbsentCount() {
+        return absentCount;
+    }
+
+    public void setAbsentCount(int absentCount) {
+        this.absentCount = absentCount;
+    }
+
+    public int getScanUploadRate() {
+        return scanUploadRate;
+    }
+
+    public void setScanUploadRate(int scanUploadRate) {
+        this.scanUploadRate = scanUploadRate;
+    }
+
+    public CardTypeEnum getCardType() {
+        return cardType;
+    }
+
+    public void setCardType(CardTypeEnum cardType) {
+        this.cardType = cardType;
+    }
+
+    public String getCardTypeStr() {
+        return Objects.nonNull(cardType) ? cardType.getName() : cardTypeStr;
+    }
+
+    public void setCardTypeStr(String cardTypeStr) {
+        this.cardTypeStr = cardTypeStr;
+    }
+
+    public String getScanUploadRateStr() {
+        return scanUploadRate + "%";
+    }
+
+    public void setScanUploadRateStr(String scanUploadRateStr) {
+        this.scanUploadRateStr = scanUploadRateStr;
+    }
+}

+ 32 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamTaskMapper.java

@@ -6,6 +6,7 @@ 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.PrintTaskResult;
 import com.qmth.distributed.print.business.bean.result.statistics.StatementResult;
 import com.qmth.distributed.print.business.entity.ExamTask;
 import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
@@ -133,4 +134,35 @@ public interface ExamTaskMapper extends BaseMapper<ExamTask> {
      * @return
      */
     List<StatementResult> statementCountListExport(@Param("schoolId") Long schoolId, @Param("semesterId") Long semesterId, @Param("examId") Long examId, @Param("printPlanId") Long printPlanId, @Param("collegeId") Long collegeId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber, @Param("cardType") String cardType, @Param("finishStatus") String finishStatus, @Param("dpr") DataPermissionRule dpr);
+
+    /**
+     * 印刷任务统计查询
+     *
+     * @param iPage
+     * @param schoolId
+     * @param semesterId
+     * @param examId
+     * @param collegeId
+     * @param courseId
+     * @param paperNumber
+     * @param cardType
+     * @param dpr
+     * @return
+     */
+    IPage<PrintTaskResult> printTaskList(IPage<Map> iPage, @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 schoolId
+     * @param semesterId
+     * @param examId
+     * @param collegeId
+     * @param courseId
+     * @param paperNumber
+     * @param cardType
+     * @param dpr
+     * @return
+     */
+    List<PrintTaskResult> printTaskListExport(@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);
 }

+ 29 - 1
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.PrintTaskResult;
 import com.qmth.distributed.print.business.bean.result.statistics.StatementResult;
 import com.qmth.distributed.print.business.entity.ExamDetail;
 import com.qmth.distributed.print.business.entity.ExamTask;
@@ -226,5 +227,32 @@ public interface ExamTaskService extends IService<ExamTask> {
      * @param finishStatus
      * @return
      */
-    public List<StatementResult> statementCountList(Long semesterId, Long examId, Long printPlanId, Long collegeId, Long courseId, String paperNumber, CardTypeEnum cardType, StatisticsStatusEnum finishStatus);
+    public List<StatementResult> statementCountListExport(Long semesterId, Long examId, Long printPlanId, Long collegeId, Long courseId, String paperNumber, CardTypeEnum cardType, StatisticsStatusEnum finishStatus);
+
+    /**
+     * 印刷任务统计查询
+     *
+     * @param iPage
+     * @param semesterId
+     * @param examId
+     * @param collegeId
+     * @param courseId
+     * @param paperNumber
+     * @param cardType
+     * @return
+     */
+    public IPage<PrintTaskResult> printTaskList(IPage<Map> iPage, Long semesterId, Long examId, Long collegeId, Long courseId, String paperNumber, CardTypeEnum cardType);
+
+    /**
+     * 印刷任务统计导出
+     *
+     * @param semesterId
+     * @param examId
+     * @param collegeId
+     * @param courseId
+     * @param paperNumber
+     * @param cardType
+     * @return
+     */
+    public List<PrintTaskResult> printTaskListExport(Long semesterId, Long examId, Long collegeId, Long courseId, String paperNumber, CardTypeEnum cardType);
 }

+ 41 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -18,6 +18,7 @@ import com.qmth.distributed.print.business.bean.params.*;
 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.PrintTaskResult;
 import com.qmth.distributed.print.business.bean.result.statistics.StatementResult;
 import com.qmth.distributed.print.business.entity.*;
 import com.qmth.distributed.print.business.enums.*;
@@ -2002,13 +2003,52 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
      * @return
      */
     @Override
-    public List<StatementResult> statementCountList(Long semesterId, Long examId, Long printPlanId, Long collegeId, Long courseId, String paperNumber, CardTypeEnum cardType, StatisticsStatusEnum finishStatus) {
+    public List<StatementResult> statementCountListExport(Long semesterId, Long examId, Long printPlanId, Long collegeId, Long courseId, String paperNumber, CardTypeEnum cardType, StatisticsStatusEnum finishStatus) {
         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.statementCountListExport(schoolId, semesterId, examId, printPlanId, collegeId, courseId, paperNumber, Objects.nonNull(cardType) ? cardType.name() : null, Objects.nonNull(finishStatus) ? finishStatus.name() : null, dpr);
     }
 
+    /**
+     * 印刷任务统计查询
+     *
+     * @param iPage
+     * @param semesterId
+     * @param examId
+     * @param collegeId
+     * @param courseId
+     * @param paperNumber
+     * @param cardType
+     * @return
+     */
+    @Override
+    public IPage<PrintTaskResult> printTaskList(IPage<Map> iPage, Long semesterId, Long examId, Long collegeId, Long courseId, String paperNumber, CardTypeEnum cardType) {
+        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.printTaskList(iPage, schoolId, semesterId, examId, collegeId, courseId, paperNumber, Objects.nonNull(cardType) ? cardType.name() : null, dpr);
+    }
+
+    /**
+     * 印刷任务统计导出
+     *
+     * @param semesterId
+     * @param examId
+     * @param collegeId
+     * @param courseId
+     * @param paperNumber
+     * @param cardType
+     * @return
+     */
+    @Override
+    public List<PrintTaskResult> printTaskListExport(Long semesterId, Long examId, Long collegeId, Long courseId, String paperNumber, CardTypeEnum cardType) {
+        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.printTaskListExport(schoolId, semesterId, examId, collegeId, courseId, paperNumber, Objects.nonNull(cardType) ? cardType.name() : null, dpr);
+    }
+
     private ExamTaskPaperData saveTikuPaperData(Long examId, Long paperId, String uuid, File zipFile) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         String zipDestPath = null;

+ 88 - 2
distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml

@@ -1353,7 +1353,7 @@
                 AND et.school_id = #{schoolId}
             </if>
             <if test="semesterId != null and semesterId != ''">
-                AND be.semester_id = #{semesterId}
+                AND bs.id = #{semesterId}
             </if>
             <if test="examId != null and examId != ''">
                 AND be.id = #{examId}
@@ -1385,7 +1385,7 @@
                 </if>
             </if>
         </where>
-        group by et.id,bc.code,bc.name,et.paper_number) t
+        group by et.id,bc.name,bc.code,et.paper_number) t
         left join exam_card ec on ec.id = t.cardId
         <where>
             <if test="cardType != null and cardType != ''">
@@ -1412,4 +1412,90 @@
     <select id="statementCountListExport" resultType="com.qmth.distributed.print.business.bean.result.statistics.StatementResult">
         <include refid="statementCountCommon" />
     </select>
+
+    <sql id="printTaskCommon">
+        select
+        t.*,
+        ec.type as cardType,
+        IF(t.studentCount <![CDATA[ > ]]> 0 ,ROUND(t.scanUploadCount / t.studentCount * 100, 2) ,0) as scanUploadRate
+        from
+        (
+        select
+        distinct
+        mp.id,
+        so.name as college,
+        GROUP_CONCAT(distinct bc.name, '(', bc.code, ')') as courseNameCode,
+        mp.paper_number as paperNumber,
+        replace(substring_index(substring_index(convert((etd.paper_attachment_ids ->>'$[*].cardId') using utf8), ']', 1), '[',-1), '"', '') as cardId,
+        IFNULL(mp.student_count, 0) as studentCount,
+        if(ROUND(sum(ms.sheet_count) / 2, 2) <![CDATA[ < ]]> 0,0,ROUND(sum(ms.sheet_count) / 2, 2)) as sheetCount,
+        IFNULL(mp.absent_count, 0) as absentCount,
+        sum(case when ms.is_upload = 1 then 1 else 0 end) as scanUploadCount
+        from mark_paper mp
+        left join basic_exam be on be.id = mp.exam_id and be.enable = true
+        left join basic_semester bs on bs.id = be.semester_id and bs.enable = true
+        left join basic_course bc on bc.id = mp.course_id
+        left join sys_org so on so.id = bc.teaching_room_id
+        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> 1 = 1
+            <if test="schoolId != null and schoolId != ''">
+                AND bs.school_id = #{schoolId}
+            </if>
+            <if test="semesterId != null and semesterId != ''">
+                AND bs.id = #{semesterId}
+            </if>
+            <if test="examId != null and examId != ''">
+                AND be.id = #{examId}
+            </if>
+            <if test="collegeId != null and collegeId != ''">
+                AND so.id = #{collegeId}
+            </if>
+            <if test="courseId != null and courseId != ''">
+                AND bc.id = #{courseId}
+            </if>
+            <if test="paperNumber != null and paperNumber != ''">
+                AND mp.paper_number = #{paperNumber}
+            </if>
+            <if test="dpr != null">
+                <if test="dpr.requestUserId != null">
+                    AND EXISTS( SELECT 1 FROM  (select exam_id, paper_number,basic_student_id from mark_student where exam_id = #{examId}
+                    <if test="paperNumber != null and paperNumber != ''">
+                        AND paper_number = #{paperNumber}
+                    </if>
+                    ) ms join (select id from basic_exam_student where exam_id = #{examId} and teacher_id = #{dpr.requestUserId}) bes on ms.basic_student_id = bes.id WHERE mp.exam_id = ms.exam_id and mp.paper_number = ms.paper_number)
+                </if>
+                <if test="dpr.courseUserId != null">
+                    AND EXISTS( SELECT 1 FROM (select course_id from teach_course where exam_id = #{examId} and user_id = #{dpr.courseUserId}) tc WHERE tc.course_id = mp.course_id)
+                </if>
+                <if test="dpr.orgIdSet != null and dpr.orgIdSet != '' and dpr.orgIdSet.size > 0">
+                    AND bc.teaching_room_id IN
+                    <foreach collection="dpr.orgIdSet" item="item" index="index" open="(" separator="," close=")">
+                        #{item}
+                    </foreach>
+                </if>
+            </if>
+        </where>
+        group by
+        mp.id,
+        bc.name,
+        bc.code,
+        mp.paper_number) t
+        left join exam_card ec on ec.id = t.cardId
+        <where>
+            <if test="cardType != null and cardType != ''">
+                AND ec.type = #{cardType}
+            </if>
+        </where>
+        order by t.paperNumber desc
+    </sql>
+
+    <select id="printTaskList" resultType="com.qmth.distributed.print.business.bean.result.statistics.PrintTaskResult">
+        <include refid="printTaskCommon" />
+    </select>
+
+    <select id="printTaskListExport" resultType="com.qmth.distributed.print.business.bean.result.statistics.PrintTaskResult">
+        <include refid="printTaskCommon" />
+    </select>
 </mapper>

+ 21 - 2
distributed-print/install/mysql/upgrade/3.4.0.sql

@@ -280,7 +280,6 @@ INSERT INTO sys_privilege
 (id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
 VALUES(2095, '命题任务统计导出', '/api/admin/statistics/statement/count/export', 'URL', 2088, 2, 'AUTH', NULL, 1, 1, 1);
 
--- 2024-07-10
 ALTER TABLE `exam_task` ADD COLUMN `source` VARCHAR(45) NULL COMMENT '命题任务创建方式(ASSIGN:命题任务指派,SELF:老师自主发起)' AFTER `approve_form_attachment_id`;
 UPDATE exam_task et
 SET
@@ -293,4 +292,24 @@ SET
                      exam_task_detail etd
                  WHERE
                          et.id = etd.exam_task_id);
-update exam_task set source = 'ASSIGN' where paper_name is null and source is null;
+update exam_task set source = 'ASSIGN' where paper_name is null and source is null;
+
+-- 2024-07-11
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(2096, '查询', 'Select', 'BUTTON', 2089, 1, 'AUTH', '2099', 1, 0, 1);
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(2097, '查询条件', 'Condition', 'CONDITION', 2089, 1, 'AUTH', '2099', 1, 0, 1);
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(2098, '列表', 'List', 'LIST', 2089, 1, 'AUTH', '2099', 1, 0, 1);
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(2099, '印刷任务统计查询', '/api/admin/statistics/print/task/count', 'URL', 2089, 1, 'AUTH', NULL, 1, 1, 1);
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(2106, '导出扫描进度', 'Export', 'BUTTON', 2089, 2, 'AUTH', '2107', 1, 0, 1);
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(2107, '印刷任务统计导出', '/api/admin/statistics/print/task/count/export', 'URL', 2089, 2, 'AUTH', NULL, 1, 1, 1);

+ 29 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/StatisticalManagementController.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.api;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.result.statistics.PrintTaskResult;
 import com.qmth.distributed.print.business.bean.result.statistics.StatementResult;
 import com.qmth.distributed.print.business.enums.CardTypeEnum;
 import com.qmth.distributed.print.business.enums.StatisticsStatusEnum;
@@ -64,8 +65,35 @@ public class StatisticalManagementController {
                                      @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
                                      @ApiParam(value = "题卡类型,GENERIC:通卡,CUSTOM:自定义") @RequestParam(required = false) CardTypeEnum cardType,
                                      @ApiParam(value = "状态,FINISH:已完成,UN_FINISH:未完成") @RequestParam(required = false) StatisticsStatusEnum finishStatus) throws Exception {
-        List<StatementResult> statementResultList = examTaskService.statementCountList(semesterId, examId, printPlanId, collegeId, courseId, paperNumber, cardType, finishStatus);
+        List<StatementResult> statementResultList = examTaskService.statementCountListExport(semesterId, examId, printPlanId, collegeId, courseId, paperNumber, cardType, finishStatus);
         ExcelUtil.excelExport("印刷进度", StatementResult.class, statementResultList, ServletUtil.getResponse());
     }
+
+    @ApiOperation(value = "印刷任务统计查询")
+    @RequestMapping(value = "/print/task/count", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "分页查询", response = PrintTaskResult.class)})
+    public Result printTaskCount(@ApiParam(value = "学期ID", required = true) @RequestParam Long semesterId,
+                                 @ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                                 @ApiParam(value = "开课学院id") @RequestParam(required = false) Long collegeId,
+                                 @ApiParam(value = "课程ID") @RequestParam(required = false) Long courseId,
+                                 @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
+                                 @ApiParam(value = "题卡类型,GENERIC:通卡,CUSTOM:自定义") @RequestParam(required = false) CardTypeEnum cardType,
+                                 @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                                 @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(examTaskService.printTaskList(new Page<>(pageNumber, pageSize), semesterId, examId, collegeId, courseId, paperNumber, cardType));
+    }
+
+    @ApiOperation(value = "印刷任务统计导出")
+    @RequestMapping(value = "/print/task/count/export", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "导出成功", response = PrintTaskResult.class)})
+    public void printTaskCountExport(@ApiParam(value = "学期ID", required = true) @RequestParam Long semesterId,
+                                     @ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                                     @ApiParam(value = "开课学院id") @RequestParam(required = false) Long collegeId,
+                                     @ApiParam(value = "课程ID") @RequestParam(required = false) Long courseId,
+                                     @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
+                                     @ApiParam(value = "题卡类型,GENERIC:通卡,CUSTOM:自定义") @RequestParam(required = false) CardTypeEnum cardType) throws Exception {
+        List<PrintTaskResult> printTaskResultList = examTaskService.printTaskListExport(semesterId, examId, collegeId, courseId, paperNumber, cardType);
+        ExcelUtil.excelExport("扫描进度", PrintTaskResult.class, printTaskResultList, ServletUtil.getResponse());
+    }
 }