Procházet zdrojové kódy

Merge branch 'dev_v2.2.0' into release_v2.2.0
merge

wangliang před 3 roky
rodič
revize
1bf4d0da0c
36 změnil soubory, kde provedl 826 přidání a 114 odebrání
  1. 80 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamObject/ExamObjectDto.java
  2. 121 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TCStatistics.java
  3. 42 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/StatisticsStatusEnum.java
  4. 5 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamTaskMapper.java
  5. 16 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TCStatisticsMapper.java
  6. 8 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java
  7. 16 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TCStatisticsService.java
  8. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  9. 116 77
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  10. 20 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TCStatisticsServiceImpl.java
  11. 70 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncStatisticsDataImportService.java
  12. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncSysUserDataImportService.java
  13. 1 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/export/AsyncExportTaskTemplete.java
  14. 1 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/importData/AsyncImportTaskTemplete.java
  15. 17 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/TaskLogicService.java
  16. 62 14
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  17. 6 1
      distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml
  18. 5 0
      distributed-print-business/src/main/resources/mapper/TCStatisticsMapper.xml
  19. 7 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskController.java
  20. 76 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/TCStatisticsController.java
  21. 7 5
      distributed-print/src/main/java/com/qmth/distributed/print/api/TFFlowController.java
  22. 1 0
      distributed-print/src/main/resources/application-36dev.properties
  23. 1 0
      distributed-print/src/main/resources/application-dev.properties
  24. 1 0
      distributed-print/src/main/resources/application-test.properties
  25. 8 0
      distributed-print/src/test/java/com/qmth/distributed/print/ServiceTest.java
  26. 18 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/annotation/ExcelImportTempleteVaild.java
  27. 2 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/BasicClazzImportDto.java
  28. 2 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/BasicCourseImportDto.java
  29. 2 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/BasicStudentImportDto.java
  30. 3 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/DescribeImportDto.java
  31. 88 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/StatisticsImportDto.java
  32. 2 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/SysUserImportDto.java
  33. 1 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/TBTask.java
  34. 3 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/TaskTypeEnum.java
  35. 1 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/OrgCenterDataDisposeService.java
  36. 4 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/ExcelUtil.java

+ 80 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamObject/ExamObjectDto.java

@@ -0,0 +1,80 @@
+package com.qmth.distributed.print.business.bean.dto.ExamObject;
+
+import com.qmth.distributed.print.business.bean.dto.ApprovalForm.ExamRoomInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author: CaoZixuan
+ * @Date:
+ */
+public class ExamObjectDto {
+
+    @ApiModelProperty(value = "考试开始时间")
+    private Long examStartTime;
+
+    @ApiModelProperty(value = "考试结束时间")
+    private Long examEndTime;
+
+    @ApiModelProperty(value = "总印量")
+    private Integer printTotalCount;
+
+    @ApiModelProperty(value = "试卷编号")
+    private String paperNumber;
+
+    @ApiModelProperty(value = "试卷名称")
+    private String paperName;
+
+    @ApiModelProperty(value = "考场信息集合")
+    private List<ExamRoomInfo> examRoomInfoList;
+
+    public Long getExamStartTime() {
+        return examStartTime;
+    }
+
+    public void setExamStartTime(Long examStartTime) {
+        this.examStartTime = examStartTime;
+    }
+
+    public Long getExamEndTime() {
+        return examEndTime;
+    }
+
+    public void setExamEndTime(Long examEndTime) {
+        this.examEndTime = examEndTime;
+    }
+
+    public Integer getPrintTotalCount() {
+        return printTotalCount;
+    }
+
+    public void setPrintTotalCount(Integer printTotalCount) {
+        this.printTotalCount = printTotalCount;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getPaperName() {
+        return paperName;
+    }
+
+    public void setPaperName(String paperName) {
+        this.paperName = paperName;
+    }
+
+    public List<ExamRoomInfo> getExamRoomInfoList() {
+        return examRoomInfoList;
+    }
+
+    public void setExamRoomInfoList(List<ExamRoomInfo> examRoomInfoList) {
+        this.examRoomInfoList = examRoomInfoList;
+    }
+}

+ 121 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TCStatistics.java

@@ -0,0 +1,121 @@
+package com.qmth.distributed.print.business.entity;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.enums.StatisticsStatusEnum;
+import com.qmth.teachcloud.common.base.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 命题统计表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-09-09
+ */
+@ApiModel(value = "TCStatistics对象", description = "命题统计表")
+public class TCStatistics extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    @ApiModelProperty(value = "课程代码")
+    private String courseCode;
+
+    @ApiModelProperty(value = "任课老师名称")
+    private String teacherName;
+
+    @ApiModelProperty(value = "班级id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long clazzId;
+
+    @ApiModelProperty(value = "试卷编号")
+    private String paperNumber;
+
+    @ApiModelProperty(value = "印刷计划id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long printPlanId;
+
+    @ApiModelProperty(value = "总印份数")
+    private Integer printSum;
+
+    @ApiModelProperty(value = "完成状态,FINISH:已完成,UN_FINISH:未完成")
+    private StatisticsStatusEnum status;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    @Override
+    public Long getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public Long getClazzId() {
+        return clazzId;
+    }
+
+    public void setClazzId(Long clazzId) {
+        this.clazzId = clazzId;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public Long getPrintPlanId() {
+        return printPlanId;
+    }
+
+    public void setPrintPlanId(Long printPlanId) {
+        this.printPlanId = printPlanId;
+    }
+
+    public Integer getPrintSum() {
+        return printSum;
+    }
+
+    public void setPrintSum(Integer printSum) {
+        this.printSum = printSum;
+    }
+
+    public StatisticsStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(StatisticsStatusEnum status) {
+        this.status = status;
+    }
+}

+ 42 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/StatisticsStatusEnum.java

@@ -0,0 +1,42 @@
+package com.qmth.distributed.print.business.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: 统计状态 enum
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/9/9
+ */
+public enum StatisticsStatusEnum {
+
+    FINISH("已完成"),
+
+    UN_FINISH("未完成");
+
+    private String title;
+
+    private StatisticsStatusEnum(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param title
+     * @return
+     */
+    public static String convertToName(String title) {
+        for (StatisticsStatusEnum e : StatisticsStatusEnum.values()) {
+            if (Objects.equals(title, e.getTitle())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+}

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

@@ -8,6 +8,7 @@ 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.entity.ExamTask;
 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.enums.FlowStatusEnum;
 import org.apache.ibatis.annotations.Param;
@@ -132,8 +133,10 @@ public interface ExamTaskMapper extends BaseMapper<ExamTask> {
 
     /**
      * 根据试卷编号查询考场详细数据集(印刷计划状态为‘PRINTING’、‘PRINTING_FINISH‘的)
-     * @param paperNumber 试卷编号
+     *
+     * @param paperNumber             试卷编号
+     * @param printPlanStatusEnumList 印刷计划状态集合
      * @return 数据集
      */
-    List<ExamPackageDetail> findExamPackageDetailByPaperNumber(@Param("paperNumber") String paperNumber);
+    List<ExamPackageDetail> findExamPackageDetailByPaperNumber(@Param("paperNumber") String paperNumber, @Param("printPlanStatusEnumList") List<PrintPlanStatusEnum> printPlanStatusEnumList);
 }

+ 16 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TCStatisticsMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.distributed.print.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.distributed.print.business.entity.TCStatistics;
+
+/**
+ * <p>
+ * 命题统计表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-09-09
+ */
+public interface TCStatisticsMapper extends BaseMapper<TCStatistics> {
+
+}

+ 8 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.distributed.print.business.bean.dto.*;
 import com.qmth.distributed.print.business.bean.dto.ApprovalForm.ExamTaskApprovalFormDto;
+import com.qmth.distributed.print.business.bean.dto.ExamObject.ExamObjectDto;
 import com.qmth.distributed.print.business.bean.params.ExamTaskApplyParam;
 import com.qmth.distributed.print.business.bean.result.WorkResult;
 import com.qmth.distributed.print.business.entity.ExamTask;
@@ -20,7 +21,6 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.List;
 import java.util.Map;
 
@@ -223,4 +223,11 @@ public interface ExamTaskService extends IService<ExamTask> {
 
 
     void findExamTaskApprovalPdf(HttpServletResponse response,Long examTaskId, String htmlContext) throws Exception;
+
+    /**
+     * 根据试卷编号查找考试对象
+     * @param paperNumber 试卷编号
+     * @return 考试对象
+     */
+    ExamObjectDto findExamObjectDtoByPaperNumber(String paperNumber);
 }

+ 16 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TCStatisticsService.java

@@ -0,0 +1,16 @@
+package com.qmth.distributed.print.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.distributed.print.business.entity.TCStatistics;
+
+/**
+ * <p>
+ * 命题统计表 服务类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-09-09
+ */
+public interface TCStatisticsService extends IService<TCStatistics> {
+
+}

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

@@ -3,6 +3,7 @@ package com.qmth.distributed.print.business.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.Update;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -96,6 +97,9 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
     @Autowired
     BasicCampusService basicCampusService;
 
+    @Autowired
+    ExamTaskService examTaskService;
+
     @Resource
     RedisUtil redisUtil;
 
@@ -393,6 +397,14 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
         examDetailCourseQueryWrapper.lambda().eq(ExamDetailCourse::getExamDetailId, detail.getId());
         List<ExamDetailCourse> examDetailCourses = examDetailCourseService.list(examDetailCourseQueryWrapper);
         for (ExamDetailCourse examDetailCours : examDetailCourses) {
+            // 清空审核表附件ID
+            UpdateWrapper<ExamTask> examTaskUpdateWrapper = new UpdateWrapper<>();
+            examTaskUpdateWrapper.lambda().set(ExamTask::getApproveFormAttachmentId, null)
+                    .eq(ExamTask::getSchoolId, examDetailCours.getSchoolId())
+                    .eq(ExamTask::getCourseCode, examDetailCours.getCourseCode())
+                    .eq(ExamTask::getPaperNumber, examDetailCours.getPaperNumber());
+            examTaskService.update(examTaskUpdateWrapper);
+
             List<ExamDetail> examDetailList = this.listByPrintPlanIdAndCourseCodeAndPaperNumber(detail.getSchoolId(), detail.getPrintPlanId(), examDetailCours.getCourseCode(), examDetailCours.getPaperNumber());
             long count = examDetailList.stream().filter(m -> !m.getStatus().name().equals(ExamDetailStatusEnum.NEW.name()) && !m.getStatus().name().equals(ExamDetailStatusEnum.READY.name())).count();
             if (count == 0) {

+ 116 - 77
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -10,6 +10,7 @@ import com.google.common.collect.Lists;
 import com.google.gson.Gson;
 import com.qmth.distributed.print.business.bean.dto.ApprovalForm.*;
 import com.qmth.distributed.print.business.bean.dto.*;
+import com.qmth.distributed.print.business.bean.dto.ExamObject.ExamObjectDto;
 import com.qmth.distributed.print.business.bean.params.ExamDetailList;
 import com.qmth.distributed.print.business.bean.params.ExamDetailParams;
 import com.qmth.distributed.print.business.bean.params.ExamTaskApplyParam;
@@ -156,6 +157,9 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     @Resource
     FileStoreUtil fileStoreUtil;
 
+    @Resource
+    ExamTaskService examTaskService;
+
     @Override
     public List<ExamTask> listByCourseCode(Long schoolId, String code) {
         QueryWrapper<ExamTask> queryWrapper = new QueryWrapper<>();
@@ -1330,7 +1334,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                 throw ExceptionResultEnum.ERROR.exception("客服制卡方式,不能切换");
             }
 
-            if (MakeMethodEnum.SELF.equals(examCard.getMakeMethod())) {
+            // 删除自建题卡
+            if (!MakeMethodEnum.SELECT.name().equals(examTaskDetail.getMakeMethod())) {
                 UpdateWrapper<ExamCardDetail> updateWrapper = new UpdateWrapper<>();
                 updateWrapper.lambda().eq(ExamCardDetail::getCardId, examTaskDetail.getCardId());
                 examCardDetailService.remove(updateWrapper);
@@ -1368,7 +1373,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         this.removeById(examTaskId);
         ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamTaskId(examTaskId);
         if (examTaskDetail != null) {
-            if (examTaskDetail.getCardId() != null) {
+            if (examTaskDetail.getCardId() != null && !MakeMethodEnum.SELECT.name().equals(examTaskDetail.getMakeMethod())) {
                 examCardService.removeById(examTaskDetail.getCardId());
                 UpdateWrapper<ExamCardDetail> examCardDetailUpdateWrapper = new UpdateWrapper<>();
                 examCardDetailUpdateWrapper.lambda().eq(ExamCardDetail::getCardId, examTaskDetail.getCardId());
@@ -1675,100 +1680,47 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 //        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         // 1.basicInfo 部分
         ExamTask examTask = this.getById(examTaskId);
-        if (Objects.isNull(examTask)){
+        if (Objects.isNull(examTask)) {
             throw ExceptionResultEnum.ERROR.exception("命题任务不存在");
         }
         String paperNumber = examTask.getPaperNumber();
         String paperName = examTask.getPaperName();
         Long teachingRoomId = examTask.getTeachingRoomId();
-        SysOrg teachingRoom = sysOrgService.getOne(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getId,teachingRoomId).eq(SysOrg::getType,OrgTypeEnum.TEACHING_ROOM));
-        if (Objects.isNull(teachingRoom)){
+        SysOrg teachingRoom = sysOrgService.getOne(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getId, teachingRoomId).eq(SysOrg::getType, OrgTypeEnum.TEACHING_ROOM));
+        if (Objects.isNull(teachingRoom)) {
             throw ExceptionResultEnum.ERROR.exception("找不到教研室");
         }
         String teachingRoomName = teachingRoom.getName();
-        Long examStartTime = null;
-        Long examEndTime = null;
         // 流程id
         Long flowId = examTask.getFlowId();
 
         // 2.ExamRoomInfo 部分
-        List<ExamRoomInfo> examRoomInfoList = new ArrayList<>();
-        List<ExamPackageDetail> examPackageDetailDatasource = this.baseMapper.findExamPackageDetailByPaperNumber(paperNumber);
-        if (examPackageDetailDatasource.size() > 0){
-            Set<Long> examDetailIdSet = examPackageDetailDatasource.stream().map(ExamPackageDetail::getExamDetailId).collect(Collectors.toSet());
-            for (Long examDetailId : examDetailIdSet) {
-                // 一个考场下
-                // 班级
-                String classNames = "";
-                int studentCount = 0;
-                String printCount = "";
-
-                List<ExamPackageDetail> examPackageDetailCell = examPackageDetailDatasource.stream()
-                        .filter(e -> examDetailId.equals(e.getExamDetailId()))
-                        .collect(Collectors.toList());
-
-                List<BackupMethodEnum> backupMethodEnums = examPackageDetailCell.stream().map(ExamPackageDetail::getBackupMethod).distinct().collect(Collectors.toList());
-                if (backupMethodEnums.size() != 1 && backupMethodEnums.get(0) != BackupMethodEnum.ROOM){
-                    throw ExceptionResultEnum.ERROR.exception("印刷计划试卷备份方式必须按考场");
-                }
-                List<Integer> backupCountList = examPackageDetailCell.stream().map(ExamPackageDetail::getBackupCount).distinct().collect(Collectors.toList());
-                if (backupCountList.size() != 1){
-                    throw ExceptionResultEnum.ERROR.exception("印刷计划试卷备份数量异常");
-                }
-                // 试卷该考场备份数量
-                Integer backupCount = backupCountList.get(0);
-                // 班级主键','隔开
-                String clazzIds = "";
-                final String separator = ",";
-                for (ExamPackageDetail examPackageDetail : examPackageDetailCell) {
-                    // 处理考试开始结束时间
-                    Long cellStartTime = examPackageDetail.getExamStartTime();
-                    Long cellEndTime = examPackageDetail.getExamEndTime();
-                    if (examStartTime == null || cellStartTime < examStartTime){
-                        examStartTime = cellStartTime;
-                    }
-                    if (examEndTime == null || cellEndTime > examEndTime){
-                        examEndTime = cellEndTime;
-                    }
-                    // 处理班级和数量
-                    Integer studentCellCount = examPackageDetail.getExamDetailCourseTotalSubjects();
-                    String clazzIdCell = examPackageDetail.getClazzIds();
-                    studentCount = studentCount + studentCellCount;
-                    clazzIds = clazzIds + clazzIdCell + separator;
-                }
-                clazzIds = clazzIds.substring(0,clazzIds.length() - separator.length());
-                classNames = basicClazzService.findClazzNamesByClazzIds(clazzIds,separator);
-                printCount = studentCount + " + " + backupCount;
-
-                // 组装examRoom
-                ExamRoomInfo examRoomInfo = new ExamRoomInfo();
-                examRoomInfo.setClazzNames(classNames);
-                examRoomInfo.setStudentCount(studentCount);
-                examRoomInfo.setPrintCount(printCount);
-                examRoomInfoList.add(examRoomInfo);
-            }
-        }
+        List<PrintPlanStatusEnum> printPlanStatusEnumList = new ArrayList<>();
+        printPlanStatusEnumList.add(PrintPlanStatusEnum.PRINTING);
+        printPlanStatusEnumList.add(PrintPlanStatusEnum.PRINT_FINISH);
+        List<ExamPackageDetail> examPackageDetailDatasource = this.baseMapper.findExamPackageDetailByPaperNumber(paperNumber,printPlanStatusEnumList);
+        ExamObjectDto examObjectDto = this.buildExamObjectDtoByPackageDatasource(examPackageDetailDatasource);
 
         // 3.ApprovalInfo部分
         List<ApprovalInfo> approvalInfoList = new ArrayList<>();
-        ApprovalInfo second = examTaskReviewLogService.findOnePassBySetUp(flowId,2);
-        if (Objects.isNull(second)){
+        ApprovalInfo second = examTaskReviewLogService.findOnePassBySetUp(flowId, 2);
+        if (Objects.isNull(second)) {
             throw ExceptionResultEnum.ERROR.exception("未找到主任级审核记录");
         }
-        ApprovalInfo third = examTaskReviewLogService.findOnePassBySetUp(flowId,3);
-        if (Objects.isNull(third)){
+        ApprovalInfo third = examTaskReviewLogService.findOnePassBySetUp(flowId, 3);
+        if (Objects.isNull(third)) {
             throw ExceptionResultEnum.ERROR.exception("未找到院长级审核记录");
         }
         String secondRemark = second.getRemark();
-        if (SystemConstant.strNotNull(secondRemark)){
+        if (SystemConstant.strNotNull(secondRemark)) {
             secondRemark = "通过," + secondRemark;
-        }else {
+        } else {
             secondRemark = "通过";
         }
         String thirdRemark = third.getRemark();
-        if (SystemConstant.strNotNull(thirdRemark)){
+        if (SystemConstant.strNotNull(thirdRemark)) {
             thirdRemark = "通过," + thirdRemark;
-        }else {
+        } else {
             thirdRemark = "通过";
         }
         second.setRemark(secondRemark);
@@ -1785,12 +1737,12 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         basicInfo.setPaperName(paperName);
         basicInfo.setPaperNumber(paperNumber);
         basicInfo.setTeacherName(examTask.getTeacherName());
-        basicInfo.setExamStartTime(examStartTime);
-        basicInfo.setExamEndTime(examEndTime);
+        basicInfo.setExamStartTime(examObjectDto.getExamStartTime());
+        basicInfo.setExamEndTime(examObjectDto.getExamEndTime());
 
 
         examTaskApprovalFormDto.setBasicInfo(basicInfo);
-        examTaskApprovalFormDto.setExamRoomInfoList(examRoomInfoList);
+        examTaskApprovalFormDto.setExamRoomInfoList(examObjectDto.getExamRoomInfoList());
         examTaskApprovalFormDto.setApprovalInfoList(approvalInfoList);
 
         return examTaskApprovalFormDto;
@@ -1798,9 +1750,9 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 
     @Transactional
     @Override
-    public void findExamTaskApprovalPdf(HttpServletResponse response,Long examTaskId, String htmlContext) throws Exception {
+    public void findExamTaskApprovalPdf(HttpServletResponse response, Long examTaskId, String htmlContext) throws Exception {
         ExamTask examTask = this.getById(examTaskId);
-        if (Objects.isNull(examTask)){
+        if (Objects.isNull(examTask)) {
             throw ExceptionResultEnum.ERROR.exception("未找到命题任务");
         }
         String fileName = examTask.getPaperNumber() + "审批表";
@@ -1823,7 +1775,26 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         } else {
             inputStream = new FileInputStream(new File(pdfPath));
         }
-        ConvertUtil.outputFile(response,inputStream,fileName + SystemConstant.PDF_PREFIX);
+        ConvertUtil.outputFile(response, inputStream, fileName + SystemConstant.PDF_PREFIX);
+    }
+
+    @Transactional
+    @Override
+    public ExamObjectDto findExamObjectDtoByPaperNumber(String paperNumber) {
+        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+        List<PrintPlanStatusEnum> printPlanStatusEnumList = new ArrayList<>();
+        printPlanStatusEnumList.add(PrintPlanStatusEnum.NEW);
+        printPlanStatusEnumList.add(PrintPlanStatusEnum.READY);
+        List<ExamPackageDetail> examPackageDetailDatasource = this.baseMapper.findExamPackageDetailByPaperNumber(paperNumber,printPlanStatusEnumList);
+        ExamObjectDto examObjectDto = this.buildExamObjectDtoByPackageDatasource(examPackageDetailDatasource);
+
+        ExamTask examTask = examTaskService.getOne(new QueryWrapper<ExamTask>().lambda().eq(ExamTask::getPaperNumber,paperNumber).eq(ExamTask::getSchoolId,schoolId));
+        if (Objects.isNull(examTask)){
+            throw ExceptionResultEnum.ERROR.exception("未找到命题任务");
+        }
+        examObjectDto.setPaperName(examTask.getPaperName());
+        examObjectDto.setPaperNumber(examTask.getPaperNumber());
+        return examObjectDto;
     }
 
     /**
@@ -1869,4 +1840,72 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             }
         }
     }
+
+    private ExamObjectDto buildExamObjectDtoByPackageDatasource(List<ExamPackageDetail> examPackageDetailDatasource){
+        Long examStartTime = null;
+        Long examEndTime = null;
+        int printTotalCount = 0;
+        List<ExamRoomInfo> examRoomInfoList = new ArrayList<>();
+        if (examPackageDetailDatasource.size() > 0){
+            Set<Long> examDetailIdSet = examPackageDetailDatasource.stream().map(ExamPackageDetail::getExamDetailId).collect(Collectors.toSet());
+            for (Long examDetailId : examDetailIdSet) {
+                // 一个考场下
+                // 班级
+                String classNames = "";
+                int studentCount = 0;
+                String printCount = "";
+
+                List<ExamPackageDetail> examPackageDetailCell = examPackageDetailDatasource.stream()
+                        .filter(e -> examDetailId.equals(e.getExamDetailId()))
+                        .collect(Collectors.toList());
+
+                List<BackupMethodEnum> backupMethodEnums = examPackageDetailCell.stream().map(ExamPackageDetail::getBackupMethod).distinct().collect(Collectors.toList());
+                if (backupMethodEnums.size() != 1 && backupMethodEnums.get(0) != BackupMethodEnum.ROOM){
+                    throw ExceptionResultEnum.ERROR.exception("印刷计划试卷备份方式必须按考场");
+                }
+                List<Integer> backupCountList = examPackageDetailCell.stream().map(ExamPackageDetail::getBackupCount).distinct().collect(Collectors.toList());
+                if (backupCountList.size() != 1){
+                    throw ExceptionResultEnum.ERROR.exception("印刷计划试卷备份数量异常");
+                }
+                // 试卷该考场备份数量
+                Integer backupCount = backupCountList.get(0);
+                // 班级主键','隔开
+                String clazzIds = "";
+                final String separator = ",";
+                for (ExamPackageDetail examPackageDetail : examPackageDetailCell) {
+                    // 处理考试开始结束时间
+                    Long cellStartTime = examPackageDetail.getExamStartTime();
+                    Long cellEndTime = examPackageDetail.getExamEndTime();
+                    if (examStartTime == null || cellStartTime < examStartTime){
+                        examStartTime = cellStartTime;
+                    }
+                    if (examEndTime == null || cellEndTime > examEndTime){
+                        examEndTime = cellEndTime;
+                    }
+                    // 处理班级和数量
+                    Integer studentCellCount = examPackageDetail.getExamDetailCourseTotalSubjects();
+                    String clazzIdCell = examPackageDetail.getClazzIds();
+                    studentCount = studentCount + studentCellCount;
+                    clazzIds = clazzIds + clazzIdCell + separator;
+                }
+                clazzIds = clazzIds.substring(0,clazzIds.length() - separator.length());
+                classNames = basicClazzService.findClazzNamesByClazzIds(clazzIds,separator);
+                printCount = studentCount + " + " + backupCount;
+                printTotalCount = printTotalCount + studentCount + backupCount;
+
+                // 组装examRoom
+                ExamRoomInfo examRoomInfo = new ExamRoomInfo();
+                examRoomInfo.setClazzNames(classNames);
+                examRoomInfo.setStudentCount(studentCount);
+                examRoomInfo.setPrintCount(printCount);
+                examRoomInfoList.add(examRoomInfo);
+            }
+        }
+        ExamObjectDto examObjectDto = new ExamObjectDto();
+        examObjectDto.setExamEndTime(examEndTime);
+        examObjectDto.setExamStartTime(examStartTime);
+        examObjectDto.setExamRoomInfoList(examRoomInfoList);
+        examObjectDto.setPrintTotalCount(printTotalCount);
+        return examObjectDto;
+    }
 }

+ 20 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TCStatisticsServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qmth.distributed.print.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.distributed.print.business.entity.TCStatistics;
+import com.qmth.distributed.print.business.mapper.TCStatisticsMapper;
+import com.qmth.distributed.print.business.service.TCStatisticsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 命题统计表 服务实现类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-09-09
+ */
+@Service
+public class TCStatisticsServiceImpl extends ServiceImpl<TCStatisticsMapper, TCStatistics> implements TCStatisticsService {
+
+}

+ 70 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncStatisticsDataImportService.java

@@ -0,0 +1,70 @@
+package com.qmth.distributed.print.business.templete.execute;
+
+import cn.hutool.core.date.DateUtil;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.distributed.print.business.templete.importData.AsyncImportTaskTemplete;
+import com.qmth.distributed.print.business.templete.service.TaskLogicService;
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.TBTask;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.service.TBTaskService;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.Map;
+import java.util.StringJoiner;
+
+/**
+ * @Description: 命题统计导入
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/9/9
+ */
+@Service
+public class AsyncStatisticsDataImportService extends AsyncImportTaskTemplete {
+    private final static Logger log = LoggerFactory.getLogger(AsyncStatisticsDataImportService.class);
+
+    public static final String OBJ_TITLE = "命题统计导入";
+
+    @Override
+    public Result importTask(Map<String, Object> map) throws IOException, Exception {
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        InputStream inputStream = super.getUploadFileInputStream(tbTask);
+        map.put("inputStream", inputStream);
+        StringJoiner stringJoinerSummary = new StringJoiner("\n")
+                .add(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), BEGIN_TITLE, OBJ_TITLE));
+        tbTask.setStatus(TaskStatusEnum.RUNNING);
+        TBTaskService tbTaskService = SpringContextHolder.getBean(TBTaskService.class);
+        tbTaskService.updateById(tbTask);
+        try {
+            TaskLogicService taskLogicService = SpringContextHolder.getBean(TaskLogicService.class);
+            // 执行导入
+            Map<String, Object> result = taskLogicService.executeImportStatisticsLogic(map);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), FINISH_TITLE, Long.valueOf(String.valueOf(result.get("dataCount"))), FINISH_SIZE));
+            tbTask.setResult(TaskResultEnum.SUCCESS);
+        } catch (Exception e) {
+            log.error("请求出错", e);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), EXCEPTION_TITLE, EXCEPTION_DATA, e.getMessage()));
+            tbTask.setResult(TaskResultEnum.ERROR);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {//生成txt文件
+            tbTask.setSummary(stringJoinerSummary.toString());
+            super.createTxt(tbTask);
+        }
+        return ResultUtil.ok(map);
+    }
+}

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncSysUserDataImportService.java

@@ -30,7 +30,7 @@ import java.util.StringJoiner;
  */
 @Service
 public class AsyncSysUserDataImportService extends AsyncImportTaskTemplete {
-    private final static Logger log = LoggerFactory.getLogger(AsyncCourseDataImportService.class);
+    private final static Logger log = LoggerFactory.getLogger(AsyncSysUserDataImportService.class);
 
     public static final String OBJ_TITLE = "用户基本信息";
 

+ 1 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/export/AsyncExportTaskTemplete.java

@@ -82,6 +82,7 @@ public abstract class AsyncExportTaskTemplete {
                 jsonObject.put(SystemConstant.PATH, stringJoiner.toString());
             }
             String path = (String) jsonObject.get(SystemConstant.PATH);
+            path = path.replaceAll("\\\\","/");
             String type = (String) jsonObject.get(SystemConstant.TYPE);
 
             out = new ByteArrayOutputStream();

+ 1 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/importData/AsyncImportTaskTemplete.java

@@ -105,6 +105,7 @@ public abstract class AsyncImportTaskTemplete {
                 jsonObject.put(SystemConstant.PATH, stringJoiner.toString());
             }
             String path = (String) jsonObject.get(SystemConstant.PATH);
+            path = path.replaceAll("\\\\","/");
             String type = (String) jsonObject.get(SystemConstant.TYPE);
 
             out = new ByteArrayOutputStream();

+ 17 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/TaskLogicService.java

@@ -65,33 +65,46 @@ public interface TaskLogicService {
 
     /**
      * 处理导入考生数据
+     *
      * @param map 数据源
      * @return 结果
      * @throws Exception 异常
      */
-    Map<String,Object> executeImportBasicStudentLogic(Map<String,Object> map) throws Exception;
+    Map<String, Object> executeImportBasicStudentLogic(Map<String, Object> map) throws Exception;
 
     /**
      * 处理导入课程数据
+     *
      * @param map 数据源
      * @return 结果
      * @throws Exception 异常
      */
-    Map<String,Object> executeImportBasicCourseLogic(Map<String,Object> map) throws Exception;
+    Map<String, Object> executeImportBasicCourseLogic(Map<String, Object> map) throws Exception;
 
     /**
      * 处理导入用户数据
+     *
      * @param map 数据源
      * @return 结果
      * @throws Exception 异常
      */
-    Map<String,Object> executeImportSysUserLogic(Map<String,Object> map) throws Exception;
+    Map<String, Object> executeImportSysUserLogic(Map<String, Object> map) throws Exception;
 
     /**
      * 处理导入基础班级数据
+     *
+     * @param map 数据源
+     * @return 结果
+     * @throws Exception 异常
+     */
+    Map<String, Object> executeImportBasicClazzLogic(Map<String, Object> map) throws Exception;
+
+    /**
+     * 处理命题统计导入数据
+     *
      * @param map 数据源
      * @return 结果
      * @throws Exception 异常
      */
-    Map<String,Object> executeImportBasicClazzLogic(Map<String,Object> map) throws Exception;
+    Map<String, Object> executeImportStatisticsLogic(Map<String, Object> map) throws Exception;
 }

+ 62 - 14
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -12,9 +12,6 @@ import com.google.common.collect.Lists;
 import com.itextpdf.text.DocumentException;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.dto.*;
-import com.qmth.teachcloud.common.bean.dto.excel.BasicClazzImportDto;
-import com.qmth.teachcloud.common.bean.dto.excel.BasicCourseImportDto;
-import com.qmth.teachcloud.common.bean.dto.excel.BasicStudentImportDto;
 import com.qmth.distributed.print.business.bean.params.SerialNumberParams;
 import com.qmth.distributed.print.business.cache.CreatePdfCacheUtil;
 import com.qmth.distributed.print.business.entity.*;
@@ -24,14 +21,10 @@ import com.qmth.distributed.print.business.templete.service.TaskLogicService;
 import com.qmth.distributed.print.business.util.CreatePdfUtil;
 import com.qmth.distributed.print.business.util.HtmlToPdfUtil;
 import com.qmth.teachcloud.common.annotation.ExcelDBFieldDesc;
-import com.qmth.teachcloud.common.bean.dto.excel.DescribeImportDto;
-import com.qmth.teachcloud.common.bean.dto.excel.SysUserImportDto;
+import com.qmth.teachcloud.common.bean.dto.excel.*;
 import com.qmth.teachcloud.common.bean.params.ArraysParams;
 import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.entity.BasicAttachment;
-import com.qmth.teachcloud.common.entity.BasicSchool;
-import com.qmth.teachcloud.common.entity.SysUser;
-import com.qmth.teachcloud.common.entity.TBTask;
+import com.qmth.teachcloud.common.entity.*;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.FlowStatusEnum;
 import com.qmth.teachcloud.common.enums.PageSizeEnum;
@@ -1105,7 +1098,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
     public Map<String, Object> executeImportBasicStudentLogic(Map<String, Object> map) throws Exception {
         InputStream inputStream = (InputStream) map.get("inputStream");
         System.out.println(inputStream);
-        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(inputStream, Lists.newArrayList(BasicStudentImportDto.class,DescribeImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(inputStream, Lists.newArrayList(BasicStudentImportDto.class, DescribeImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
             List<ExcelError> excelErrorTemp = new ArrayList<>();
             Map<String, String> checkCodeMap = new HashMap<>();
             Map<String, String> checkPhoneMap = new HashMap<>();
@@ -1113,7 +1106,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                 LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
                 List<Object> basicStudentImportDtoList = excelMap.get(i);
                 assert basicStudentImportDtoList != null;
-                if (basicStudentImportDtoList.get(0) instanceof DescribeImportDto){
+                if (basicStudentImportDtoList.get(0) instanceof DescribeImportDto) {
                     continue;
                 }
                 for (int y = 0; y < Objects.requireNonNull(basicStudentImportDtoList).size(); y++) {
@@ -1131,7 +1124,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                         checkCodeMap.put(studentCode, studentName);
                     }
                     // 如果电话有值则检验电话excel中唯一性
-                    if (SystemConstant.strNotNull(phoneNumber)){
+                    if (SystemConstant.strNotNull(phoneNumber)) {
                         if (checkPhoneMap.containsKey(phoneNumber)) {
                             throw ExceptionResultEnum.ERROR.exception("导入的excel中包含在重复的【电话号码】:" + phoneNumber);
                         } else {
@@ -1274,14 +1267,14 @@ public class TaskLogicServiceImpl implements TaskLogicService {
     public Map<String, Object> executeImportBasicClazzLogic(Map<String, Object> map) throws Exception {
         InputStream inputStream = (InputStream) map.get("inputStream");
         System.out.println(inputStream);
-        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(inputStream, Lists.newArrayList(BasicClazzImportDto.class,DescribeImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(inputStream, Lists.newArrayList(BasicClazzImportDto.class, DescribeImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
             List<ExcelError> excelErrorTemp = new ArrayList<>();
             Map<String, String> checkNameMap = new HashMap<>();
             for (int i = 0; i < finalExcelList.size(); i++) {
                 LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
                 List<Object> basicClazzImportDtoList = excelMap.get(i);
                 assert basicClazzImportDtoList != null;
-                if (basicClazzImportDtoList.get(0) instanceof DescribeImportDto){
+                if (basicClazzImportDtoList.get(0) instanceof DescribeImportDto) {
                     continue;
                 }
                 for (int y = 0; y < Objects.requireNonNull(basicClazzImportDtoList).size(); y++) {
@@ -1311,6 +1304,61 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         return basicClazzService.executeBasicClazzImportLogic(finalList, map);
     }
 
+    /**
+     * 处理命题统计导入数据
+     *
+     * @param map 数据源
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Map<String, Object> executeImportStatisticsLogic(Map<String, Object> map) throws Exception {
+        InputStream inputStream = (InputStream) map.get("inputStream");
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(inputStream, Lists.newArrayList(StatisticsImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+            // 只允许导入一个sheet
+            if (finalExcelList.size() > 1) {
+                throw ExceptionResultEnum.ERROR.exception("excel中只允许有一个sheet");
+            }
+            if (finalExcelErrorList.size() > 0) {
+                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
+            }
+            List<ExcelError> excelErrorTemp = new ArrayList<>();
+            for (int i = 0; i < finalExcelList.size(); i++) {
+                LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
+                List<Object> statisticsTempList = excelMap.get(i);
+                for (int y = 0; y < statisticsTempList.size(); y++) {
+                    StatisticsImportDto statisticsImportDto = (StatisticsImportDto) statisticsTempList.get(y);
+
+//                    if (StringUtils.isBlank(userImportDto.getTicketNumber())) {
+//                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[准考证号]必填"));
+//                    }
+//                    if (StringUtils.isBlank(userImportDto.getCourseCode())) {
+//                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[课程代码]必填"));
+//                    }
+//                    if (StringUtils.isBlank(userImportDto.getCourseName())) {
+//                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[课程名称]必填"));
+//                    }
+//
+//                    // 课程是否存在并且与名称对应
+//                    QueryWrapper<BasicCourse> queryWrapper = new QueryWrapper<>();
+//                    queryWrapper.lambda().eq(BasicCourse::getSchoolId, schoolId).eq(BasicCourse::getCode, userImportDto.getCourseCode());
+//                    BasicCourse course = basicCourseService.getOne(queryWrapper);
+//                    if (course == null) {
+//                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[课程代码]在系统中不存在"));
+//                    } else if (!course.getName().equals(userImportDto.getCourseName())) {
+//                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[课程名称]与系统中不匹配"));
+//                    }
+                }
+            }
+            if (excelErrorTemp.size() > 0) {
+                List<String> errors = excelErrorTemp.stream().map(m -> m.getExcelErrorType()).collect(Collectors.toList());
+                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(errors));
+            }
+            return finalExcelList;
+        });
+        return map;
+    }
+
 
     public String createTempNumber(SerialNumberParams serialNumberParams) {
         return convertUtil.getIncre(serialNumberParams.getPrefix(), serialNumberParams.getModel(), serialNumberParams.getDigit());

+ 6 - 1
distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml

@@ -1066,7 +1066,12 @@
             <if test="paperNumber != null and paperNumber != ''">
                 AND edc.paper_number = #{paperNumber}
             </if>
-            AND (epp.status = 'PRINTING' OR epp.status = 'PRINT_FINISH')
+            <if test="printPlanStatusEnumList != null and printPlanStatusEnumList != ''">
+                and epp.status in
+                <foreach item="item" collection="printPlanStatusEnumList" separator="," open="(" close=")" index="">
+                    #{item}
+                </foreach>
+            </if>
         </where>
     </select>
 </mapper>

+ 5 - 0
distributed-print-business/src/main/resources/mapper/TCStatisticsMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.distributed.print.business.mapper.TCStatisticsMapper">
+
+</mapper>

+ 7 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskController.java

@@ -816,7 +816,6 @@ public class ExamTaskController {
     @ApiOperation(value = "命题任务-审批-获取试卷审批表pdf")
     @RequestMapping(value = "/find_approve_form_pdf", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
-//    @Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
     public void findApproveFormPdf(@Valid @RequestBody ApproveFormParams approveFormParams, BindingResult bindingResult) throws Exception {
         if (bindingResult.hasErrors()) {
             throw ExceptionResultEnum.ERROR.exception(bindingResult.getAllErrors().get(0).getDefaultMessage());
@@ -825,5 +824,12 @@ public class ExamTaskController {
         examTaskService.findExamTaskApprovalPdf(response,approveFormParams.getExamTaskId(), approveFormParams.getHtmlContent());
     }
 
+    @ApiOperation(value = "命题任务-考试对象查询")
+    @RequestMapping(value = "/find_exam_object", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result findExamObject(@ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
+        return ResultUtil.ok((Object) examTaskService.findExamObjectDtoByPaperNumber(paperNumber));
+    }
+
 }
 

+ 76 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/TCStatisticsController.java

@@ -0,0 +1,76 @@
+package com.qmth.distributed.print.api;
+
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.distributed.print.business.entity.TCStatistics;
+import com.qmth.distributed.print.business.enums.StatisticsStatusEnum;
+import com.qmth.distributed.print.business.service.PrintCommonService;
+import com.qmth.distributed.print.business.service.TCStatisticsService;
+import com.qmth.distributed.print.business.templete.execute.AsyncStatisticsDataImportService;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.TBTask;
+import com.qmth.teachcloud.common.enums.TaskTypeEnum;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import io.swagger.annotations.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 命题统计表 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2021-09-09
+ */
+@Api(tags = "命题统计Controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.statistics}")
+@Aac(auth = BOOL.FALSE, strict = BOOL.FALSE)
+public class TCStatisticsController {
+    private final static Logger log = LoggerFactory.getLogger(TCStatisticsController.class);
+
+    @Resource
+    TCStatisticsService tcStatisticsService;
+
+    @Resource
+    PrintCommonService printCommonService;
+
+    @Resource
+    AsyncStatisticsDataImportService asyncStatisticsDataImportService;
+
+    @ApiOperation(value = "命题计划统计-导入")
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    @RequestMapping(value = "/import", method = RequestMethod.POST)
+    public Result dataImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws Exception {
+        Map<String, Object> map = printCommonService.saveTask(file, TaskTypeEnum.STATISTICS_IMPORT);
+        asyncStatisticsDataImportService.importTask(map);
+        TBTask tbTask = Objects.nonNull(map.get(SystemConstant.TASK)) ? (TBTask) map.get(SystemConstant.TASK) : null;
+        return Objects.nonNull(tbTask) ? ResultUtil.ok(tbTask.getId()) : ResultUtil.error("创建任务失败");
+    }
+
+    @ApiOperation(value = "命题计划统计-列表")
+    @ApiResponses({@ApiResponse(code = 200, message = "命题统计信息", response = TCStatistics.class)})
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    public Result list(@ApiParam(value = "学院名称", required = false) @RequestParam(required = false) String collegeName,
+                       @ApiParam(value = "部门名称", required = false) @RequestParam(required = false) String teachingRoomName,
+                       @ApiParam(value = "完成状态", required = false) @RequestParam(required = false) StatisticsStatusEnum status,
+                       @ApiParam(value = "课程名称", required = false) @RequestParam(required = false) String courseName,
+                       @ApiParam(value = "任课老师名称", required = false) @RequestParam(required = false) String teacherName,
+                       @ApiParam(value = "页码", required = true) @RequestParam Integer pageNumber,
+                       @ApiParam(value = "数量", required = true) @RequestParam Integer pageSize) {
+        return ResultUtil.ok();
+    }
+}

+ 7 - 5
distributed-print/src/main/java/com/qmth/distributed/print/api/TFFlowController.java

@@ -2,8 +2,6 @@ package com.qmth.distributed.print.api;
 
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.qmth.boot.api.annotation.Aac;
-import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.params.FlowApproveParam;
@@ -25,14 +23,14 @@ import com.qmth.teachcloud.common.entity.BasicAttachment;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.service.BasicAttachmentService;
-import com.qmth.teachcloud.common.util.AesUtil;
+import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
-import com.sun.org.apache.xpath.internal.operations.Bool;
 import io.swagger.annotations.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.BindingResult;
@@ -76,6 +74,9 @@ public class TFFlowController {
     @Resource
     TFFlowApproveLogService tfFlowApproveLogService;
 
+    @Autowired
+    SysUserService sysUserService;
+
     @ApiOperation(value = "注册流程")
     @Transactional
     @ApiResponses({@ApiResponse(code = 200, message = "常规信息", response = ResultUtil.class)})
@@ -168,7 +169,8 @@ public class TFFlowController {
             //审核通过,生成pdf
             if (Objects.nonNull(tfFlowApprove) && FlowGdykdxApproveSetupEnum.FINISH.getSetup() == tfFlowApprove.getSetup()) {
                 ExamTask examTask = (ExamTask) objectMap.get("examTask");
-                SysUser sysUser = (SysUser) objectMap.get("sysUser");
+                // 取命题老师ID
+                SysUser sysUser = sysUserService.getById(examTask.getUserId());
                 try {
                     printCommonService.checkData(examTask.getSchoolId(), examTask.getCourseCode(), examTask.getPaperNumber(), sysUser);
                 } catch (IOException e) {

+ 1 - 0
distributed-print/src/main/resources/application-36dev.properties

@@ -108,6 +108,7 @@ prefix.url.data=admin/data
 prefix.url.work=admin/work
 prefix.url.client=admin/client
 prefix.url.flow=admin/flow
+prefix.url.statistics=admin/statistics
 
 #\u65E5\u671F\u683C\u5F0F\u5316
 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

+ 1 - 0
distributed-print/src/main/resources/application-dev.properties

@@ -108,6 +108,7 @@ prefix.url.data=admin/data
 prefix.url.work=admin/work
 prefix.url.client=admin/client
 prefix.url.flow=admin/flow
+prefix.url.statistics=admin/statistics
 
 #\u65E5\u671F\u683C\u5F0F\u5316
 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

+ 1 - 0
distributed-print/src/main/resources/application-test.properties

@@ -107,6 +107,7 @@ prefix.url.data=admin/data
 prefix.url.work=admin/work
 prefix.url.client=admin/client
 prefix.url.flow=admin/flow
+prefix.url.statistics=admin/statistics
 
 #\u65E5\u671F\u683C\u5F0F\u5316
 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

+ 8 - 0
distributed-print/src/test/java/com/qmth/distributed/print/ServiceTest.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qmth.distributed.print.business.bean.dto.ExamObject.ExamObjectDto;
 import com.qmth.distributed.print.business.bean.result.TemplatePrintInfoResult;
 import com.qmth.distributed.print.business.entity.ExamCardDetail;
 import com.qmth.distributed.print.business.entity.ExamPrintPlan;
@@ -141,4 +142,11 @@ public class ServiceTest {
         System.out.println(JSON.toJSONString(basicAttachment));
     }
 
+    @Test
+    public void findExamObject(){
+        String paperNumber = "cn004-0906-001";
+        ExamObjectDto examObjectDto = examTaskService.findExamObjectDtoByPaperNumber(paperNumber);
+        System.out.println(JSON.toJSONString(examObjectDto));
+    }
+
 }

+ 18 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/annotation/ExcelImportTempleteVaild.java

@@ -0,0 +1,18 @@
+package com.qmth.teachcloud.common.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @Description: excel模版校验注释
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/20
+ */
+@Documented
+@Target({ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExcelImportTempleteVaild {
+
+    boolean value() default false;
+}

+ 2 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/BasicClazzImportDto.java

@@ -3,13 +3,14 @@ package com.qmth.teachcloud.common.bean.dto.excel;
 import com.qmth.teachcloud.common.annotation.ExcelNote;
 
 import javax.validation.constraints.NotNull;
+import java.io.Serializable;
 
 /**
  * @Description: 基础课程导入
  * @Author: CaoZixuan
  * @Date: 2021-08-28
  */
-public class BasicClazzImportDto {
+public class BasicClazzImportDto implements Serializable {
     @ExcelNote(value = "班级名称")
     @NotNull
     private String clazzName;

+ 2 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/BasicCourseImportDto.java

@@ -3,13 +3,14 @@ package com.qmth.teachcloud.common.bean.dto.excel;
 import com.qmth.teachcloud.common.annotation.ExcelNote;
 
 import javax.validation.constraints.NotNull;
+import java.io.Serializable;
 
 /**
  * @Description: 基础课程数据导入类
  * @Author: CaoZixuan
  * @Date: 2021-08-06
  */
-public class BasicCourseImportDto {
+public class BasicCourseImportDto implements Serializable {
     @ExcelNote(value = "课程名称")
     @NotNull
     private String courseName;

+ 2 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/BasicStudentImportDto.java

@@ -3,13 +3,14 @@ package com.qmth.teachcloud.common.bean.dto.excel;
 import com.qmth.teachcloud.common.annotation.ExcelNote;
 
 import javax.validation.constraints.NotNull;
+import java.io.Serializable;
 
 /**
  * @Description: 基础学生数据导入类
  * @Author: CaoZixuan
  * @Date: 2021-08-05
  */
-public class BasicStudentImportDto {
+public class BasicStudentImportDto implements Serializable {
     @ExcelNote(value = "姓名")
     @NotNull
     private String studentName;

+ 3 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/DescribeImportDto.java

@@ -2,12 +2,14 @@ package com.qmth.teachcloud.common.bean.dto.excel;
 
 import com.qmth.teachcloud.common.annotation.ExcelNote;
 
+import java.io.Serializable;
+
 /**
  * @Description: excel导入说明sheet
  * @Author: CaoZixuan
  * @Date: 2021-08-23
  */
-public class DescribeImportDto {
+public class DescribeImportDto implements Serializable {
 
     @ExcelNote(value = "说明")
     private String describe;

+ 88 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/StatisticsImportDto.java

@@ -0,0 +1,88 @@
+package com.qmth.teachcloud.common.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 命题统计导入
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/9/9
+ */
+public class StatisticsImportDto implements Serializable {
+
+    @ExcelNote(value = "开课学院")
+    @NotNull
+    private String collegeName;
+
+    @ExcelNote(value = "开课部门")
+    @NotNull
+    private String teachingRoomName;
+
+    @ExcelNote(value = "课程名称")
+    @NotNull
+    private String courseName;
+
+    @ExcelNote(value = "课程代码")
+    @NotNull
+    private String courseCode;
+
+    @ExcelNote(value = "任课老师")
+    @NotNull
+    private String teacherName;
+
+    @ExcelNote(value = "任课老师")
+    @NotNull
+    private String clazzName;
+
+    public String getCollegeName() {
+        return collegeName;
+    }
+
+    public void setCollegeName(String collegeName) {
+        this.collegeName = collegeName;
+    }
+
+    public String getTeachingRoomName() {
+        return teachingRoomName;
+    }
+
+    public void setTeachingRoomName(String teachingRoomName) {
+        this.teachingRoomName = teachingRoomName;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getClazzName() {
+        return clazzName;
+    }
+
+    public void setClazzName(String clazzName) {
+        this.clazzName = clazzName;
+    }
+}

+ 2 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/SysUserImportDto.java

@@ -3,13 +3,14 @@ package com.qmth.teachcloud.common.bean.dto.excel;
 import com.qmth.teachcloud.common.annotation.ExcelNote;
 
 import javax.validation.constraints.NotNull;
+import java.io.Serializable;
 
 /**
  * @Description: 系统用户导入Dto
  * @Author: CaoZixuan
  * @Date: 2021-08-12
  */
-public class SysUserImportDto {
+public class SysUserImportDto implements Serializable {
 
     @ExcelNote(value = "姓名")
     @NotNull

+ 1 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/TBTask.java

@@ -29,7 +29,7 @@ public class TBTask extends BaseEntity implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    @ApiModelProperty(value = "任务类型,USER_IMPORT:用户导入, QUESTION_MISSION_BATCH_CREATE:批量新建命题任务, SAMPLE_EXPORT:导出审核样本, PAPER_DOWNLOAD:卷库下载, EXAMINATION_IMPORT:考务数据导入, EXAMINATION_EXPORT:考务数据导出, PRINT_PDF_DOWNLOAD:批量下载pdf, CREATE_PDF:生成pdf, COURSE_IMPORT:课程导入")
+    @ApiModelProperty(value = "任务类型,USER_IMPORT:用户导入, QUESTION_MISSION_BATCH_CREATE:批量新建命题任务, SAMPLE_EXPORT:导出审核样本, PAPER_DOWNLOAD:卷库下载, EXAMINATION_IMPORT:考务数据导入, EXAMINATION_EXPORT:考务数据导出, PRINT_PDF_DOWNLOAD:批量下载pdf, CREATE_PDF:生成pdf, COURSE_IMPORT:课程导入,STATISTICS_IMPORT:命题统计导入")
     @TableField(value = "type")
     private TaskTypeEnum type;
 

+ 3 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/TaskTypeEnum.java

@@ -35,7 +35,9 @@ public enum TaskTypeEnum {
 
     DATA_CALCULATE("数据计算"),
 
-    CREATE_TASK_PRINT("发布印刷任务");
+    CREATE_TASK_PRINT("发布印刷任务"),
+
+    STATISTICS_IMPORT("命题统计导入");
 
     private String title;
 

+ 1 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/OrgCenterDataDisposeService.java

@@ -23,6 +23,7 @@ public interface OrgCenterDataDisposeService {
      *     将新增或更新的学校设置为启用状态
      *     4.根据新增的或更新的学校id查询机构表中对应的学校级别机构。
      *     5.如果没有学校级别机构则新增学校级机构,并且将该学校下的所有学院级、印刷室级、没有parentId的机构的父机构指向该学校机构;如果有则更新
+     *     6.权限表未匹配到的学校权限新增
      * </p>
      * @throws IOException 异常
      */

+ 4 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/ExcelUtil.java

@@ -1,5 +1,7 @@
 package com.qmth.teachcloud.common.util;
 
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.teachcloud.common.annotation.ExcelImportTempleteVaild;
 import com.qmth.teachcloud.common.annotation.ExcelNote;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
@@ -150,7 +152,8 @@ public class ExcelUtil {
                         int lastcell = row.getLastCellNum();
                         o = clazz.get(y).newInstance();
                         Field[] fields = o.getClass().getDeclaredFields();
-                        if (lastcell > fields.length) {
+                        ExcelImportTempleteVaild excelImportTempleteVaild = o.getClass().getDeclaredAnnotation(ExcelImportTempleteVaild.class);
+                        if (Objects.nonNull(excelImportTempleteVaild) && excelImportTempleteVaild.value() && lastcell > fields.length) {
                             throw ExceptionResultEnum.ERROR.exception("导入文件和模版不一致");
                         }
                         boolean extend = fields[fields.length - 1].getName().contains(SystemConstant.EXTEND_COLUMN);