فهرست منبع

新增统计管理-命题任务统计-导出印刷进度

wangliang 11 ماه پیش
والد
کامیت
e6b175dce2

+ 63 - 19
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/statistics/StatementResult.java

@@ -1,9 +1,11 @@
 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.distributed.print.business.enums.StatisticsStatusEnum;
+import com.qmth.teachcloud.common.annotation.ExcelProperty;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
@@ -16,6 +18,7 @@ import java.util.Objects;
  * @Author: wangliang
  * @Date: 2024/7/10
  */
+@JsonInclude(JsonInclude.Include.NON_NULL)
 public class StatementResult implements Serializable {
 
     @ApiModelProperty(value = "主键")
@@ -23,9 +26,11 @@ public class StatementResult implements Serializable {
     private Long id;
 
     @ApiModelProperty(value = "课程名称(代码)")
+    @ExcelProperty(name = "课程(代码)", width = 20, index = 1)
     private String courseNameCode;
 
     @ApiModelProperty(value = "试卷编号")
+    @ExcelProperty(name = "试卷编号", width = 20, index = 2)
     private String paperNumber;
 
     @ApiModelProperty(value = "题卡id")
@@ -33,41 +38,64 @@ public class StatementResult implements Serializable {
     private Long cardId;
 
     @ApiModelProperty(value = "开课学院")
+    @ExcelProperty(name = "开课学院", width = 20, index = 4)
     private String college;
 
     @ApiModelProperty(value = "总考场数")
     private Integer totalExamination;
 
     @ApiModelProperty(value = "已生成")
-    private Integer generate;
+    private int generate;
 
     @ApiModelProperty(value = "未生成")
-    private Integer unGenerated;
+    private int unGenerated;
 
     @ApiModelProperty(value = "已印刷")
-    private Integer printed;
+    private int printed;
 
     @ApiModelProperty(value = "未印刷")
-    private Integer unPrinted;
+    private int unPrinted;
 
     @ApiModelProperty(value = "已作废")
-    private Integer invalid;
+    private int invalid;
 
     @ApiModelProperty(value = "已打回")
-    private Integer reject;
+    private int reject;
 
     @ApiModelProperty(value = "题卡类型")
     private CardTypeEnum cardType;
 
     @ApiModelProperty(value = "题卡类型str")
+    @ExcelProperty(name = "题卡类型", width = 20, index = 3)
     private String cardTypeStr;
 
     @ApiModelProperty(value = "状态,FINISH:已完成,UN_FINISH:未完成")
     private StatisticsStatusEnum finishStatus;
 
-    @ApiModelProperty(value = "题卡类型str")
+    @ApiModelProperty(value = "状态str")
+    @ExcelProperty(name = "状态", width = 20, index = 8)
     private String finishStatusStr;
 
+    @ApiModelProperty(value = "已生成/未生成")
+    @ExcelProperty(name = "已生成/未生成", width = 40, index = 5)
+    private String generateStr;
+
+    @ApiModelProperty(value = "已印刷/未印刷")
+    @ExcelProperty(name = "已印刷/未印刷", width = 40, index = 6)
+    private String printedStr;
+
+    @ApiModelProperty(value = "已打回/已作废")
+    @ExcelProperty(name = "已印刷/未印刷", width = 40, index = 7)
+    private String rejectStr;
+
+    public String getGenerateStr() {
+        return generate + "/" + unGenerated;
+    }
+
+    public void setGenerateStr(String generateStr) {
+        this.generateStr = generateStr;
+    }
+
     public Long getId() {
         return id;
     }
@@ -116,54 +144,70 @@ public class StatementResult implements Serializable {
         this.totalExamination = totalExamination;
     }
 
-    public Integer getGenerate() {
+    public int getGenerate() {
         return generate;
     }
 
-    public void setGenerate(Integer generate) {
+    public void setGenerate(int generate) {
         this.generate = generate;
     }
 
-    public Integer getUnGenerated() {
+    public int getUnGenerated() {
         return unGenerated;
     }
 
-    public void setUnGenerated(Integer unGenerated) {
+    public void setUnGenerated(int unGenerated) {
         this.unGenerated = unGenerated;
     }
 
-    public Integer getPrinted() {
+    public int getPrinted() {
         return printed;
     }
 
-    public void setPrinted(Integer printed) {
+    public void setPrinted(int printed) {
         this.printed = printed;
     }
 
-    public Integer getUnPrinted() {
+    public int getUnPrinted() {
         return unPrinted;
     }
 
-    public void setUnPrinted(Integer unPrinted) {
+    public void setUnPrinted(int unPrinted) {
         this.unPrinted = unPrinted;
     }
 
-    public Integer getInvalid() {
+    public int getInvalid() {
         return invalid;
     }
 
-    public void setInvalid(Integer invalid) {
+    public void setInvalid(int invalid) {
         this.invalid = invalid;
     }
 
-    public Integer getReject() {
+    public int getReject() {
         return reject;
     }
 
-    public void setReject(Integer reject) {
+    public void setReject(int reject) {
         this.reject = reject;
     }
 
+    public String getPrintedStr() {
+        return printed + "/" + unPrinted;
+    }
+
+    public void setPrintedStr(String printedStr) {
+        this.printedStr = printedStr;
+    }
+
+    public String getRejectStr() {
+        return invalid + "/" + reject;
+    }
+
+    public void setRejectStr(String rejectStr) {
+        this.rejectStr = rejectStr;
+    }
+
     public CardTypeEnum getCardType() {
         return cardType;
     }

+ 17 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamTaskMapper.java

@@ -8,8 +8,6 @@ import com.qmth.distributed.print.business.bean.dto.approvalForm.ExamPackageDeta
 import com.qmth.distributed.print.business.bean.result.WorkResult;
 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.CardTypeEnum;
-import com.qmth.distributed.print.business.enums.MakeMethodEnum;
 import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.teachcloud.common.bean.dto.BlurryUserDto;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
@@ -118,4 +116,21 @@ public interface ExamTaskMapper extends BaseMapper<ExamTask> {
      * @return
      */
     IPage<StatementResult> statementCountList(IPage<Map> iPage, @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 schoolId
+     * @param semesterId
+     * @param examId
+     * @param printPlanId
+     * @param collegeId
+     * @param courseId
+     * @param paperNumber
+     * @param cardType
+     * @param finishStatus
+     * @param dpr
+     * @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);
 }

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

@@ -212,4 +212,19 @@ public interface ExamTaskService extends IService<ExamTask> {
      * @return
      */
     public IPage<StatementResult> statementCountList(IPage<Map> iPage, Long semesterId, Long examId, Long printPlanId, Long collegeId, Long courseId, String paperNumber, CardTypeEnum cardType, StatisticsStatusEnum finishStatus);
+
+    /**
+     * 命题任务统计导出
+     *
+     * @param semesterId
+     * @param examId
+     * @param printPlanId
+     * @param collegeId
+     * @param courseId
+     * @param paperNumber
+     * @param cardType
+     * @param finishStatus
+     * @return
+     */
+    public List<StatementResult> statementCountList(Long semesterId, Long examId, Long printPlanId, Long collegeId, Long courseId, String paperNumber, CardTypeEnum cardType, StatisticsStatusEnum finishStatus);
 }

+ 21 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -1986,6 +1986,27 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         return this.baseMapper.statementCountList(iPage, schoolId, semesterId, examId, printPlanId, collegeId, courseId, paperNumber, Objects.nonNull(cardType) ? cardType.name() : null, Objects.nonNull(finishStatus) ? finishStatus.name() : null, dpr);
     }
 
+    /**
+     * 命题任务统计导出
+     *
+     * @param semesterId
+     * @param examId
+     * @param printPlanId
+     * @param collegeId
+     * @param courseId
+     * @param paperNumber
+     * @param cardType
+     * @param finishStatus
+     * @return
+     */
+    @Override
+    public List<StatementResult> statementCountList(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);
+    }
+
     private ExamTaskPaperData saveTikuPaperData(Long examId, Long paperId, String uuid, File zipFile) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         String zipDestPath = null;

+ 91 - 83
distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml

@@ -1318,90 +1318,98 @@
                   and edc.exam_detail_id = ed.id
     </sql>
 
-    <select id="statementCountList" resultType="com.qmth.distributed.print.business.bean.result.statistics.StatementResult">
+    <sql id="statementCountCommon">
         select
-            t.*,
-            ec.type as cardType,
-            if(t.unGenerated = 0 and t.unPrinted = 0,'FINISH','UN_FINISH') as finishStatus
+        t.*,
+        ec.type as cardType,
+        if(t.unGenerated = 0 and t.unPrinted = 0,'FINISH','UN_FINISH') as finishStatus
         from
-            (
-                select distinct
-                    et.id,
-                    GROUP_CONCAT(distinct bc.name, '(', bc.code, ')') as courseNameCode,
-                    et.paper_number as paperNumber,
-                    replace(substring_index(substring_index(convert((etd.paper_attachment_ids ->>'$[*].cardId') using utf8), ']', 1), '[',-1), '"', '') as cardId,
-                    so.name as college,
-                    (<include refid="statementStatusCount" />)) as totalExamination,
-                    (<include refid="statementStatusCount" /> and ed.status in ('READY', 'WAITING', 'PRINTING', 'FINISH'))) as generate,
-                    (<include refid="statementStatusCount" /> and ed.status in ('NEW', 'CREATING'))) as unGenerated,
-                    (<include refid="statementStatusCount" /> and ed.status = 'FINISH')) as printed,
-                    (<include refid="statementStatusCount" /> and ed.status in ('READY', 'WAITING', 'PRINTING'))) as unPrinted,
-                    (<include refid="statementStatusCount" /> and ed.status = 'CANCEL')) as invalid,
-                    (<include refid="statementStatusCount" /> and ed.status = 'REJECT')) as reject
-                from exam_task et
-                        left join basic_course bc on bc.id = et.course_id
-                        left join exam_task_detail etd on etd.exam_task_id = et.id
-                        left join exam_detail_course edc on edc.course_id = et.course_id
-                        left join exam_detail ed on ed.id = edc.exam_detail_id
-                        left join sys_org so on so.id = bc.teaching_room_id
-                        left join t_f_flow_approve tffa on tffa.flow_id = et.flow_id
-                        left join basic_exam be on be.id = et.exam_id and be.enable = true
-                        left join basic_semester bs on bs.id = be.semester_id and bs.enable = true
-                <where> 1 = 1
-                    and (et.status = 'SUBMIT' and (et.flow_id is null or (et.flow_id is not null and tffa.status = 'FINISH')))
-                    <if test="schoolId != null and schoolId != ''">
-                        AND et.school_id = #{schoolId}
-                    </if>
-                    <if test="semesterId != null and semesterId != ''">
-                        AND be.semester_id = #{semesterId}
-                    </if>
-                    <if test="examId != null and examId != ''">
-                        AND be.id = #{examId}
-                    </if>
-                    <if test="printPlanId != null and printPlanId != ''">
-                        AND ed.print_plan_id = #{printPlanId}
-                    </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 et.paper_number = #{paperNumber}
-                    </if>
-                    <if test="dpr != null">
-                        <if test="dpr.requestUserId != null">
-                            AND et.user_id = #{dpr.requestUserId}
-                        </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 = et.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 et.id,bc.code,bc.name,et.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>
-                    <if test="finishStatus != null and finishStatus != ''">
-                        <choose>
-                            <when test="finishStatus == 'FINISH'">
-                                and (t.unGenerated = and or t.unPrinted = 0)
-                            </when>
-                            <otherwise>
-                                and (t.unGenerated <![CDATA[ > ]]> 0 or t.unPrinted <![CDATA[ > ]]> 0)
-                            </otherwise>
-                        </choose>
-                    </if>
-                </where>
-                order by t.paperNumber desc
+        (
+        select distinct
+        et.id,
+        GROUP_CONCAT(distinct bc.name, '(', bc.code, ')') as courseNameCode,
+        et.paper_number as paperNumber,
+        replace(substring_index(substring_index(convert((etd.paper_attachment_ids ->>'$[*].cardId') using utf8), ']', 1), '[',-1), '"', '') as cardId,
+        so.name as college,
+        (<include refid="statementStatusCount" />)) as totalExamination,
+        (<include refid="statementStatusCount" /> and ed.status in ('READY', 'WAITING', 'PRINTING', 'FINISH'))) as generate,
+        (<include refid="statementStatusCount" /> and ed.status in ('NEW', 'CREATING'))) as unGenerated,
+        (<include refid="statementStatusCount" /> and ed.status = 'FINISH')) as printed,
+        (<include refid="statementStatusCount" /> and ed.status in ('READY', 'WAITING', 'PRINTING'))) as unPrinted,
+        (<include refid="statementStatusCount" /> and ed.status = 'CANCEL')) as invalid,
+        (<include refid="statementStatusCount" /> and ed.status = 'REJECT')) as reject
+        from exam_task et
+        left join basic_course bc on bc.id = et.course_id
+        left join exam_task_detail etd on etd.exam_task_id = et.id
+        left join exam_detail_course edc on edc.course_id = et.course_id
+        left join exam_detail ed on ed.id = edc.exam_detail_id
+        left join sys_org so on so.id = bc.teaching_room_id
+        left join t_f_flow_approve tffa on tffa.flow_id = et.flow_id
+        left join basic_exam be on be.id = et.exam_id and be.enable = true
+        left join basic_semester bs on bs.id = be.semester_id and bs.enable = true
+        <where> 1 = 1
+            and (et.status = 'SUBMIT' and (et.flow_id is null or (et.flow_id is not null and tffa.status = 'FINISH')))
+            <if test="schoolId != null and schoolId != ''">
+                AND et.school_id = #{schoolId}
+            </if>
+            <if test="semesterId != null and semesterId != ''">
+                AND be.semester_id = #{semesterId}
+            </if>
+            <if test="examId != null and examId != ''">
+                AND be.id = #{examId}
+            </if>
+            <if test="printPlanId != null and printPlanId != ''">
+                AND ed.print_plan_id = #{printPlanId}
+            </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 et.paper_number = #{paperNumber}
+            </if>
+            <if test="dpr != null">
+                <if test="dpr.requestUserId != null">
+                    AND et.user_id = #{dpr.requestUserId}
+                </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 = et.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 et.id,bc.code,bc.name,et.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>
+            <if test="finishStatus != null and finishStatus != ''">
+                <choose>
+                    <when test="finishStatus == 'FINISH'">
+                        and (t.unGenerated = and or t.unPrinted = 0)
+                    </when>
+                    <otherwise>
+                        and (t.unGenerated <![CDATA[ > ]]> 0 or t.unPrinted <![CDATA[ > ]]> 0)
+                    </otherwise>
+                </choose>
+            </if>
+        </where>
+        order by t.paperNumber desc
+    </sql>
+
+    <select id="statementCountList" resultType="com.qmth.distributed.print.business.bean.result.statistics.StatementResult">
+        <include refid="statementCountCommon" />
+    </select>
+
+    <select id="statementCountListExport" resultType="com.qmth.distributed.print.business.bean.result.statistics.StatementResult">
+        <include refid="statementCountCommon" />
     </select>
 </mapper>

+ 7 - 1
distributed-print/install/mysql/upgrade/3.4.0.sql

@@ -272,4 +272,10 @@ INSERT INTO sys_privilege
 VALUES(2092, '列表', 'List', 'LIST', 2088, 1, 'AUTH', '2093', 1, 0, 1);
 INSERT INTO sys_privilege
 (id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
-VALUES(2093, '命题任务统计查询', '/api/admin/statistics/statement/count', 'URL', 2088, 1, 'AUTH', NULL, 1, 1, 1);
+VALUES(2093, '命题任务统计查询', '/api/admin/statistics/statement/count', 'URL', 2088, 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(2094, '导出印刷进度', 'Export', 'BUTTON', 2088, 2, 'AUTH', '2095', 1, 0, 1);
+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);

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

@@ -7,8 +7,10 @@ import com.qmth.distributed.print.business.enums.CardTypeEnum;
 import com.qmth.distributed.print.business.enums.StatisticsStatusEnum;
 import com.qmth.distributed.print.business.service.ExamTaskService;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.util.ExcelUtil;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.common.util.ServletUtil;
 import io.swagger.annotations.*;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -19,6 +21,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
+import java.util.List;
 
 /**
  * <p>
@@ -34,20 +37,35 @@ public class StatisticalManagementController {
     @Resource
     ExamTaskService examTaskService;
 
-    @ApiOperation(value = "命题任务统计")
+    @ApiOperation(value = "命题任务统计查询")
     @RequestMapping(value = "/statement/count", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "分页查询", response = StatementResult.class)})
-    public Result taskList(@ApiParam(value = "学期ID", required = true) @RequestParam Long semesterId,
-                           @ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
-                           @ApiParam(value = "印刷计划ID") @RequestParam(required = false) Long printPlanId,
-                           @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,
-                           @ApiParam(value = "状态,FINISH:已完成,UN_FINISH:未完成") @RequestParam(required = false) StatisticsStatusEnum finishStatus,
-                           @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                           @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+    public Result statementCount(@ApiParam(value = "学期ID", required = true) @RequestParam Long semesterId,
+                                 @ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                                 @ApiParam(value = "印刷计划ID") @RequestParam(required = false) Long printPlanId,
+                                 @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,
+                                 @ApiParam(value = "状态,FINISH:已完成,UN_FINISH:未完成") @RequestParam(required = false) StatisticsStatusEnum finishStatus,
+                                 @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.statementCountList(new Page<>(pageNumber, pageSize), semesterId, examId, printPlanId, collegeId, courseId, paperNumber, cardType, finishStatus));
     }
+
+    @ApiOperation(value = "命题任务统计导出")
+    @RequestMapping(value = "/statement/count/export", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "导出成功", response = StatementResult.class)})
+    public void statementCountExport(@ApiParam(value = "学期ID", required = true) @RequestParam Long semesterId,
+                                     @ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                                     @ApiParam(value = "印刷计划ID") @RequestParam(required = false) Long printPlanId,
+                                     @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,
+                                     @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);
+        ExcelUtil.excelExport("印刷进度", StatementResult.class, statementResultList, ServletUtil.getResponse());
+    }
 }