瀏覽代碼

3.4.0 update

xiaofei 1 年之前
父節點
當前提交
842465b7ef
共有 34 個文件被更改,包括 610 次插入127 次删除
  1. 9 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/MakeupExamTaskParam.java
  2. 131 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamTaskWhole.java
  3. 42 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/ExamTaskWholeStatusEnum.java
  4. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamDetailMapper.java
  5. 7 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamTaskWholeMapper.java
  6. 4 11
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailService.java
  7. 1 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskDetailService.java
  8. 19 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskWholeService.java
  9. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/PrintCommonService.java
  10. 13 24
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  11. 8 17
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java
  12. 4 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  13. 156 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskWholeServiceImpl.java
  14. 5 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceImpl.java
  15. 2 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncBasicExamStudentTeacherImportService.java
  16. 3 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCreatePdfTemplateService.java
  17. 56 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCreateWholePdfTemplateService.java
  18. 0 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/importData/SyncImportTaskTemplate.java
  19. 2 17
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/PdfTaskLogicServiceImpl.java
  20. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/CreatePdfUtil.java
  21. 50 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/PdfUtil.java
  22. 2 1
      distributed-print-business/src/main/resources/mapper/BasicExamStudentMapper.xml
  23. 12 9
      distributed-print-business/src/main/resources/mapper/ExamDetailMapper.xml
  24. 4 0
      distributed-print-business/src/main/resources/mapper/ExamTaskWholeMapper.xml
  25. 0 14
      distributed-print/install/mysql/init/teachcloud_db.sql
  26. 22 0
      distributed-print/install/mysql/upgrade/3.4.0.sql
  27. 20 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPrintTaskController.java
  28. 1 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/WorkController.java
  29. 1 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkQuestionController.java
  30. 1 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkSettingController.java
  31. 9 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/MarkSettingDto.java
  32. 3 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/FileUploadService.java
  33. 19 3
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/FileUploadServiceImpl.java
  34. 1 0
      teachcloud-mark/src/main/resources/mapper/MarkPaperMapper.xml

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/MakeupExamTaskParam.java

@@ -7,6 +7,7 @@ public class MakeupExamTaskParam {
 
     private Long examDetailId;
     private Long examId;
+    private Long courseId;
     private String courseCode;
     private String courseName;
     private String paperNumber;
@@ -29,6 +30,14 @@ public class MakeupExamTaskParam {
         this.examId = examId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

+ 131 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamTaskWhole.java

@@ -0,0 +1,131 @@
+package com.qmth.distributed.print.business.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.enums.ExamStatusEnum;
+import com.qmth.distributed.print.business.enums.ExamTaskWholeStatusEnum;
+import com.qmth.distributed.print.business.enums.ReviewStatusEnum;
+import com.qmth.teachcloud.common.base.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 命题任务所有考场pdf文件地址
+ * </p>
+ */
+@TableName("exam_task_whole")
+public class ExamTaskWhole implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("id")
+    private Long id;
+    @ApiModelProperty(value = "学期id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("semester_id")
+    private Long semesterId;
+    @ApiModelProperty(value = "考试id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("exam_id")
+    private Long examId;
+
+    @ApiModelProperty(value = "课程ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "course_id", updateStrategy = FieldStrategy.IGNORED)
+    private Long courseId;
+
+    /**
+     * 试卷编号
+     */
+    @TableField("paper_number")
+    private String paperNumber;
+
+    /**
+     * 文件地址
+     */
+    @TableField(value = "attachment_path", updateStrategy = FieldStrategy.IGNORED)
+    private String attachmentPath;
+    /**
+     * 状态
+     */
+    @TableField("status")
+    private ExamTaskWholeStatusEnum status;
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Long createTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getSemesterId() {
+        return semesterId;
+    }
+
+    public void setSemesterId(Long semesterId) {
+        this.semesterId = semesterId;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getAttachmentPath() {
+        return attachmentPath;
+    }
+
+    public void setAttachmentPath(String attachmentPath) {
+        this.attachmentPath = attachmentPath;
+    }
+
+    public ExamTaskWholeStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(ExamTaskWholeStatusEnum status) {
+        this.status = status;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+}

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

@@ -0,0 +1,42 @@
+package com.qmth.distributed.print.business.enums;
+
+import com.qmth.teachcloud.common.enums.EnumResult;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 命题任务所有考场PDF生成状态
+ */
+public enum ExamTaskWholeStatusEnum {
+
+    INIT("未开始"),
+    RUNNING("进行中"),
+    FINISH("已完成");
+
+    ExamTaskWholeStatusEnum(String name) {
+        this.name = name;
+    }
+
+    private String name;
+
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @return
+     */
+    public static List<EnumResult> listTypes() {
+        List<EnumResult> list = new ArrayList<EnumResult>();
+        for (ExamTaskWholeStatusEnum value : ExamTaskWholeStatusEnum.values()) {
+            EnumResult result = new EnumResult();
+            result.setCode(value.name());
+            result.setName(value.getName());
+            result.setOrdinal(value.ordinal());
+            list.add(result);
+        }
+        return list;
+    }
+
+}

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

@@ -126,7 +126,7 @@ public interface ExamDetailMapper extends BaseMapper<ExamDetail> {
 
     int countMakeupUsedByExamIdAndPaperNumber(@Param("examId") Long examId, @Param("paperNumber") String paperNumber);
 
-    List<ExamDetail> listByExamIdAndCourseIdAndPaperNumber(@Param("schoolId") Long schoolId, @Param("examId") Long examId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber);
+    List<ExamDetail> listExamDetailByExamIdAndCourseIdAndPaperNumber(@Param("examId") Long examId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber);
 
     List<ExamDetailCourseInitMarkDto> listPrintFinishPackageCode(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("paperType") String paperType);
 

+ 7 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamTaskWholeMapper.java

@@ -0,0 +1,7 @@
+package com.qmth.distributed.print.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.distributed.print.business.entity.ExamTaskWhole;
+
+public interface ExamTaskWholeMapper extends BaseMapper<ExamTaskWhole> {
+}

+ 4 - 11
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailService.java

@@ -195,19 +195,8 @@ public interface ExamDetailService extends IService<ExamDetail> {
 
     List<Map> listStudentByExamDetailCourseId(Long schoolId, Long examDetailCourseId, String ticketNumber, String type);
 
-    List<ExamDetail> listByCourseIdAndPaperNumber(Long schoolId, Long examId, Long courseId, String paperNumber);
-
     boolean taskNormal(ExamDetail examDetail);
 
-    /**
-     * 根据班级id组查找班级名称组
-     *
-     * @param clazzIds  班级id组(字符串)
-     * @param separator 分隔符 默认","
-     * @return 班级名称组
-     */
-    String findClazzNamesByClazzIds(String clazzIds, String separator);
-
     /**
      * 根据班级id组查找班级名称组
      *
@@ -250,4 +239,8 @@ public interface ExamDetailService extends IService<ExamDetail> {
     List<ExamDetailCourseInitMarkDto> listPrintFinishPackageCode(Long examId, String paperNumber, String paperType);
 
     List<InitExamDetailDto> listPrintFinishExamDetailCourseIds(Long examId, String paperNumber, String paperType);
+
+    boolean allExamDetailIsFinish(Long examId, Long courseId, String paperNumber);
+
+    List<ExamDetail> listExamDetailByExamIdAndCourseIdAndPaperNumber(Long examId, Long courseId, String paperNumber);
 }

+ 1 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskDetailService.java

@@ -62,11 +62,10 @@ public interface ExamTaskDetailService extends IService<ExamTaskDetail> {
 
     List<String> listRelateCommonTypes(Long semesterId, Long examId, String relateType, List<Long> idList, Long courseId, String paperNumber, String userName);
 
-    ExamTaskDetail findByExamIdAndCourseCodeAndPaperNumber(Long examId, String code, String number);
+    ExamTaskDetail findByExamIdAndCourseIdAndPaperNumber(Long examId, Long courseId, String number);
 
     boolean cancel(Long id, String cancelRemark);
 
-    ExamTaskDetail getByExamIdAndCourseCodeAndPaperNumber(Long examId, String courseCode, String paperNumber);
     ExamTaskDetail getByExamIdAndCourseIdAndPaperNumber(Long examId, Long courseId, String paperNumber);
 
     void updateExposePaperType(Long examId, List<ExamDetailCourse> listByExamDetailId);

+ 19 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskWholeService.java

@@ -0,0 +1,19 @@
+package com.qmth.distributed.print.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.distributed.print.business.bean.upgrade.result.ClientResult;
+import com.qmth.distributed.print.business.entity.ClientUpgrade;
+import com.qmth.distributed.print.business.entity.ExamTaskWhole;
+import com.qmth.teachcloud.common.enums.clientpackage.ClientPackageEnum;
+import org.springframework.web.multipart.MultipartFile;
+
+public interface ExamTaskWholeService extends IService<ExamTaskWhole> {
+
+   void checkAndCreateTask(Long examId, Long courseId, String paperNumber);
+
+   ExamTaskWhole getByExamIdAndCourseIdAndPaperNumber(Long examId, Long courseId, String paperNumber);
+
+   String getWholePdf(Long examId, Long courseId, String paperNumber);
+
+   void mergeWholePdf(ExamTaskWhole examTaskWhole);
+}

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

@@ -147,7 +147,7 @@ public interface PrintCommonService {
      */
     void checkExamDataAndCreatePdfTask(Long schoolId, Long examId, Long courseId, String paperNumber, SysUser user) throws IOException;
 
-    void checkDataMakeup(Long schoolId, ExamDetail examDetail, String courseCode, String paperNumber, SysUser user);
+    void checkDataMakeup(Long schoolId, ExamDetail examDetail, Long courseId, String paperNumber, SysUser user);
 
     /**
      * 保存任务附件(导出)

+ 13 - 24
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java

@@ -116,10 +116,6 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
 
     @Resource
     RedisUtil redisUtil;
-
-    @Resource
-    TeachClazzService teachClazzService;
-
     @Resource
     BasicRoleDataPermissionService basicRoleDataPermissionService;
 
@@ -368,7 +364,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
             for (String id : examinationResult.getExamDetailCourseIds().split(",")) {
                 ExamDetailCourse examDetailCourse = examDetailCourseService.getById(id);
                 if (StringUtils.isNotBlank(examDetailCourse.getPaperType())) {
-                    ExamTask examTask = examTaskService.getByExamIdAndCourseCodeAndPaperNumber(examinationResult.getExamId(), examDetailCourse.getCourseCode(), examDetailCourse.getPaperNumber());
+                    ExamTask examTask = examTaskService.getByExamIdAndCourseIdAndPaperNumber(examinationResult.getExamId(), examDetailCourse.getCourseId(), examDetailCourse.getPaperNumber());
                     ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamTaskId(examTask.getId());
                     String paperType = examDetailCourse.getPaperType();
                     List<PaperInfoVo> paperInfoVoList = ExamTaskUtil.parsePaperAttachmentPath(examTaskDetail.getPaperAttachmentIds(), paperType);
@@ -859,11 +855,6 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
         return this.baseMapper.listStudentByExamDetailCourseId(schoolId, examDetailCourseId, studentCode, type);
     }
 
-    @Override
-    public List<ExamDetail> listByCourseIdAndPaperNumber(Long schoolId, Long examId, Long courseId, String paperNumber) {
-        return this.baseMapper.listByExamIdAndCourseIdAndPaperNumber(schoolId, examId, courseId, paperNumber);
-    }
-
     @Override
     public boolean taskNormal(ExamDetail examDetail) {
         // 已扫描过,不能作废
@@ -885,20 +876,6 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
         return this.update(updateWrapper);
     }
 
-    @Override
-    public String findClazzNamesByClazzIds(String clazzIds, String separator) {
-        if (!SystemConstant.strNotNull(separator)) {
-            separator = ",";
-        }
-        if (StringUtils.isBlank(clazzIds)) {
-            return null;
-        }
-        String[] strArr = clazzIds.split(separator);
-        Set<Long> clazzIdSet = Arrays.stream(strArr).map(SystemConstant::convertIdToLong).collect(Collectors.toSet());
-        List<String> clazzNameList = this.findClazzNamesByClazzIdSet(clazzIdSet);
-        return String.join(separator, clazzNameList);
-    }
-
     @Override
     public String findClazzNamesByClazzIds(List<Long> clazzIdList, String separator) {
         if (!SystemConstant.strNotNull(separator)) {
@@ -1214,4 +1191,16 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
     public List<InitExamDetailDto> listPrintFinishExamDetailCourseIds(Long examId, String paperNumber, String paperType) {
         return this.baseMapper.listPrintFinishExamDetailCourseIds(examId, paperNumber, paperType);
     }
+
+    @Override
+    public boolean allExamDetailIsFinish(Long examId, Long courseId, String paperNumber) {
+        List<ExamDetailStatusEnum> examDetailStatusList = Arrays.asList(ExamDetailStatusEnum.READY, ExamDetailStatusEnum.WAITING, ExamDetailStatusEnum.PRINTING, ExamDetailStatusEnum.FINISH);
+        List<ExamDetail> examDetailList = this.listExamDetailByExamIdAndCourseIdAndPaperNumber(examId, courseId, paperNumber);
+        return examDetailList.stream().filter(m -> !examDetailStatusList.contains(m.getStatus())).count() == 0;
+    }
+
+    @Override
+    public List<ExamDetail> listExamDetailByExamIdAndCourseIdAndPaperNumber(Long examId, Long courseId, String paperNumber) {
+        return this.baseMapper.listExamDetailByExamIdAndCourseIdAndPaperNumber(examId, courseId, paperNumber);
+    }
 }

+ 8 - 17
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java

@@ -88,7 +88,7 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
     @Override
     public boolean enable(ExamTaskDetail examTaskDetail) {
         ExamTask examTask = examTaskService.getById(examTaskDetail.getId());
-        List<ExamDetail> examDetails = examDetailService.listByCourseIdAndPaperNumber(examTask.getSchoolId(), examTask.getExamId(), examTask.getCourseId(), examTask.getPaperNumber());
+        List<ExamDetail> examDetails = examDetailService.listExamDetailByExamIdAndCourseIdAndPaperNumber(examTask.getExamId(), examTask.getCourseId(), examTask.getPaperNumber());
         if (examDetails != null && examDetails.size() > 0) {
             // 有考场提交打印,不能禁用启用
             long count = examDetails.stream().filter(m -> !ExamDetailStatusEnum.NEW.name().equals(m.getStatus().name()) && !ExamDetailStatusEnum.READY.name().equals(m.getStatus().name())).count();
@@ -306,7 +306,7 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
         }
 
         ExamTask examTask = examTaskService.getById(examTaskDetail.getExamTaskId());
-        List<ExamDetail> examDetails = examDetailService.listByCourseIdAndPaperNumber(examTask.getSchoolId(), examTask.getExamId(), examTask.getCourseId(), examTask.getPaperNumber());
+        List<ExamDetail> examDetails = examDetailService.listExamDetailByExamIdAndCourseIdAndPaperNumber(examTask.getExamId(), examTask.getCourseId(), examTask.getPaperNumber());
         if (CollectionUtils.isNotEmpty(examDetails)) {
             StringJoiner stringJoiner = new StringJoiner("_");
             stringJoiner.add(String.valueOf(examDetails.get(0).getSchoolId()))
@@ -377,7 +377,7 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
 
         Map<String, Object> mapVar = new HashMap<>();
         ExamTask examTask = examTaskService.getById(examTaskDetail.getExamTaskId());
-        List<ExamDetail> examDetailList = examDetailService.listByCourseIdAndPaperNumber(examTask.getSchoolId(), examTask.getExamId(), examTask.getCourseId(), examTask.getPaperNumber());
+        List<ExamDetail> examDetailList = examDetailService.listExamDetailByExamIdAndCourseIdAndPaperNumber(examTask.getExamId(), examTask.getCourseId(), examTask.getPaperNumber());
         if (CollectionUtils.isNotEmpty(examDetailList)) {
             ExamTaskDetail taskDetail = this.getByExamTaskId(examTaskDetail.getExamTaskId());
             List<Long> examDetailIds = examDetailList.stream().map(ExamDetail::getId).collect(Collectors.toList());
@@ -571,8 +571,8 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
     }
 
     @Override
-    public ExamTaskDetail findByExamIdAndCourseCodeAndPaperNumber(Long examId, String code, String number) {
-        ExamTask examTask = examTaskService.getByExamIdAndCourseCodeAndPaperNumber(examId, code, number);
+    public ExamTaskDetail findByExamIdAndCourseIdAndPaperNumber(Long examId, Long courseId, String number) {
+        ExamTask examTask = examTaskService.getByExamIdAndCourseIdAndPaperNumber(examId, courseId, number);
         if (examTask == null) {
             return null;
         }
@@ -585,7 +585,7 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
         ExamTask examTask = examTaskService.getById(id);
         String paperNumber = examTask.getPaperNumber();
 
-        List<ExamDetail> examDetailList = examDetailService.listByCourseIdAndPaperNumber(examTask.getSchoolId(), examTask.getExamId(), examTask.getCourseId(), examTask.getPaperNumber());
+        List<ExamDetail> examDetailList = examDetailService.listExamDetailByExamIdAndCourseIdAndPaperNumber(examTask.getExamId(), examTask.getCourseId(), examTask.getPaperNumber());
         if (CollectionUtils.isNotEmpty(examDetailList)) {
             ExamTaskDetail taskDetail = this.getByExamTaskId(id);
             if (StringUtils.isNotBlank(taskDetail.getExposedPaperType())) {
@@ -671,15 +671,6 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
         return true;
     }
 
-    @Override
-    public ExamTaskDetail getByExamIdAndCourseCodeAndPaperNumber(Long examId, String courseCode, String paperNumber) {
-        ExamTask examTask = examTaskService.getByExamIdAndCourseCodeAndPaperNumber(examId, courseCode, paperNumber);
-        if (examTask == null) {
-            throw ExceptionResultEnum.ERROR.exception("未查询到试卷信息");
-        }
-        return this.getByExamTaskId(examTask.getId());
-    }
-
     @Override
     public ExamTaskDetail getByExamIdAndCourseIdAndPaperNumber(Long examId, Long courseId, String paperNumber) {
         ExamTask examTask = examTaskService.getByExamIdAndCourseIdAndPaperNumber(examId, courseId, paperNumber);
@@ -693,7 +684,7 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
     public void updateExposePaperType(Long examId, List<ExamDetailCourse> examDetailCourses) {
         // 更新曝光卷型、未曝光卷型
         for (ExamDetailCourse examDetailCourse : examDetailCourses) {
-            ExamTaskDetail examTaskDetail = this.getByExamIdAndCourseCodeAndPaperNumber(examId, examDetailCourse.getCourseCode(), examDetailCourse.getPaperNumber());
+            ExamTaskDetail examTaskDetail = this.getByExamIdAndCourseIdAndPaperNumber(examId, examDetailCourse.getCourseId(), examDetailCourse.getPaperNumber());
             // 考生使用卷型
             List<String> studentPaperTypes = examStudentService.listPaperTypeByExamDetailCourseId(String.valueOf(examDetailCourse.getId()));
             List<String> paperTypeList = Objects.isNull(examTaskDetail.getPaperType()) ? new ArrayList<>() : Arrays.asList(examTaskDetail.getPaperType().split(","));
@@ -744,7 +735,7 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
         }
 
         // 提交印刷的考场,不允许修改关联试卷
-        List<ExamDetail> examDetails = examDetailService.listByCourseIdAndPaperNumber(examTask.getSchoolId(), examTask.getExamId(), examTask.getCourseId(), examTask.getPaperNumber());
+        List<ExamDetail> examDetails = examDetailService.listExamDetailByExamIdAndCourseIdAndPaperNumber(examTask.getExamId(), examTask.getCourseId(), examTask.getPaperNumber());
         if (CollectionUtils.isNotEmpty(examDetails)) {
             List<ExamDetail> examDetails1 = examDetails.stream().filter(m -> !ExamDetailStatusEnum.NEW.equals(m.getStatus())
                     && !ExamDetailStatusEnum.READY.equals(m.getStatus())

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

@@ -942,7 +942,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 //                    stringSet.add(String.format("课程[%s(%s)],试卷编号[%s]的任务未创建或者未审核通过", courseName, courseCode, paperNumber));
 //                }
                 //查询命题任务绑定的试卷和题卡
-                ExamTask examTask = examTaskService.getByExamIdAndCourseCodeAndPaperNumber(examPrintPlan.getExamId(), examDetailCourse.getCourseCode(), examDetailCourse.getPaperNumber());
+                ExamTask examTask = examTaskService.getByExamIdAndCourseIdAndPaperNumber(examPrintPlan.getExamId(), examDetailCourse.getCourseId(), examDetailCourse.getPaperNumber());
                 if (examTask == null) {
                     stringSet.add(String.format("课程[%s(%s)],试卷编号[%s]的" + ExceptionResultEnum.EXAM_TASK_IS_NOT_EXIST.getMessage(), courseName, courseCode, paperNumber));
                 } else {
@@ -1443,7 +1443,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         if (examTaskId != null) {
             examTask = this.getById(examTaskId);
         } else if (examId != null && StringUtils.isNotBlank(paperNumber)) {
-            examTask = this.getByExamIdAndCourseCodeAndPaperNumber(examId, null, paperNumber);
+            examTask = this.getByExamIdAndCourseIdAndPaperNumber(examId, null, paperNumber);
         } else {
             throw ExceptionResultEnum.ERROR.exception("传入参数有误");
         }
@@ -1727,7 +1727,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         LambdaQueryWrapper<ExamTask> lambdaQueryWrapper = queryWrapper.lambda();
         lambdaQueryWrapper.eq(ExamTask::getExamId, examId);
         if (StringUtils.isNotBlank(courseCode)) {
-            lambdaQueryWrapper.eq(ExamTask::getCourseCode, courseCode);
+            lambdaQueryWrapper.eq(ExamTask::getCourseId, courseCode);
         }
         lambdaQueryWrapper.eq(ExamTask::getPaperNumber, paperNumber);
         return this.getOne(queryWrapper);
@@ -1817,7 +1817,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             }
 
             // 生成pdf
-            printCommonService.checkDataMakeup(schoolId, examDetail, makeupExamTaskParam.getCourseCode(), makeupExamTaskParam.getPaperNumber(), sysUser);
+            printCommonService.checkDataMakeup(schoolId, examDetail, makeupExamTaskParam.getCourseId(), makeupExamTaskParam.getPaperNumber(), sysUser);
         }
     }
 

+ 156 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskWholeServiceImpl.java

@@ -0,0 +1,156 @@
+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.extension.service.impl.ServiceImpl;
+import com.qmth.distributed.print.business.entity.ExamDetail;
+import com.qmth.distributed.print.business.entity.ExamTaskWhole;
+import com.qmth.distributed.print.business.enums.ExamTaskWholeStatusEnum;
+import com.qmth.distributed.print.business.mapper.ExamTaskWholeMapper;
+import com.qmth.distributed.print.business.service.ExamDetailService;
+import com.qmth.distributed.print.business.service.ExamTaskWholeService;
+import com.qmth.distributed.print.business.templete.execute.AsyncCreateWholePdfTemplateService;
+import com.qmth.distributed.print.business.util.PdfUtil;
+import com.qmth.teachcloud.common.bean.vo.FilePathVo;
+import com.qmth.teachcloud.common.bean.vo.PrintPathVo;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.BasicAttachment;
+import com.qmth.teachcloud.common.enums.CreatePdfTypeEnum;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.UploadFileEnum;
+import com.qmth.teachcloud.common.service.BasicAttachmentService;
+import com.qmth.teachcloud.common.service.FileUploadService;
+import com.qmth.teachcloud.common.util.FileUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class ExamTaskWholeServiceImpl extends ServiceImpl<ExamTaskWholeMapper, ExamTaskWhole> implements ExamTaskWholeService {
+
+    @Resource
+    private BasicAttachmentService basicAttachmentService;
+    @Resource
+    private ExamDetailService examDetailService;
+    @Resource
+    private FileUploadService fileUploadService;
+    @Resource
+    private AsyncCreateWholePdfTemplateService asyncCreateWholePdfTemplateService;
+
+    @Override
+    public void checkAndCreateTask(Long examId, Long courseId, String paperNumber) {
+        boolean isAllPrintFinish = examDetailService.allExamDetailIsFinish(examId, courseId, paperNumber);
+        ExamTaskWhole examTaskWhole = this.getByExamIdAndCourseIdAndPaperNumber(examId, courseId, paperNumber);
+        if (examTaskWhole != null) {
+            if (examTaskWhole != null && ExamTaskWholeStatusEnum.INIT.equals(examTaskWhole.getStatus())) {
+                throw ExceptionResultEnum.ERROR.exception("文件生成中,请稍后再试");
+            }
+            if (isAllPrintFinish) {
+                examTaskWhole.setAttachmentPath(null);
+                examTaskWhole.setStatus(ExamTaskWholeStatusEnum.INIT);
+                this.updateById(examTaskWhole);
+
+                // 开始生成
+                asyncCreateWholePdfTemplateService.createWholePdf(examTaskWhole);
+            } else {
+                this.removeById(examTaskWhole.getId());
+            }
+        }
+    }
+
+    @Override
+    public ExamTaskWhole getByExamIdAndCourseIdAndPaperNumber(Long examId, Long courseId, String paperNumber) {
+        QueryWrapper<ExamTaskWhole> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(ExamTaskWhole::getExamId, examId)
+                .eq(ExamTaskWhole::getCourseId, courseId)
+                .eq(ExamTaskWhole::getPaperNumber, paperNumber);
+        return this.getOne(queryWrapper);
+    }
+
+    @Override
+    public String getWholePdf(Long examId, Long courseId, String paperNumber) {
+        ExamTaskWhole examTaskWhole = getByExamIdAndCourseIdAndPaperNumber(examId, courseId, paperNumber);
+        return examTaskWhole != null ? fileUploadService.filePreview(examTaskWhole.getAttachmentPath()) : null;
+    }
+
+    @Override
+    public void mergeWholePdf(ExamTaskWhole examTaskWhole) {
+        List<ExamDetail> examDetailList = examDetailService.listExamDetailByExamIdAndCourseIdAndPaperNumber(examTaskWhole.getExamId(), examTaskWhole.getCourseId(), examTaskWhole.getPaperNumber());
+        if (CollectionUtils.isNotEmpty(examDetailList)) {
+            List<InputStream> inputStreamList = new ArrayList<>();
+            for (ExamDetail examDetail : examDetailList) {
+                String attachmentPath = examDetail.getAttachmentPath();
+                if (StringUtils.isNotBlank(attachmentPath)) {
+                    JSONObject jsonObject = JSONObject.parseObject(attachmentPath);
+                    List<PrintPathVo> pathList = JSONObject.parseArray(jsonObject.getString("path"), PrintPathVo.class);
+                    for (PrintPathVo printPathVo : pathList) {
+                        InputStream inputStream = fileUploadService.downloadFile(printPathVo.getPdfPath(), printPathVo.getUploadType(), printPathVo.getType());
+                        if (inputStream == null) {
+                            throw ExceptionResultEnum.ERROR.exception("读取印品文件失败:" + printPathVo.getPdfPath());
+                        }
+                        inputStreamList.add(inputStream);
+                    }
+                }
+
+                // 试卷(试卷+备用试卷)
+                Long attachmentId = examDetail.getAttachmentId();
+                if (attachmentId != null) {
+                    BasicAttachment basicAttachment = basicAttachmentService.getById(attachmentId);
+                    if (basicAttachment == null) {
+                        throw ExceptionResultEnum.ERROR.exception("未找到试卷,附件ID:" + attachmentId);
+                    }
+                    if (StringUtils.isNotBlank(basicAttachment.getPath())) {
+                        FilePathVo filePathVo = JSON.parseObject(basicAttachment.getPath(), FilePathVo.class);
+                        InputStream inputStream = fileUploadService.downloadFile(filePathVo.getPath(), filePathVo.getUploadType(), filePathVo.getType());
+                        if (inputStream == null) {
+                            throw ExceptionResultEnum.ERROR.exception("读取试卷文件失败:" + filePathVo.getPath());
+                        }
+                        inputStreamList.add(inputStream);
+                    }
+                }
+
+                // 题卡(题卡+备用题卡)
+                Long cardAttachmentId = examDetail.getCardAttachmentId();
+                if (cardAttachmentId != null) {
+                    BasicAttachment basicAttachment = basicAttachmentService.getById(cardAttachmentId);
+                    if (basicAttachment == null) {
+                        throw ExceptionResultEnum.ERROR.exception("未找到题卡,附件ID:" + cardAttachmentId);
+                    }
+                    if (StringUtils.isNotBlank(basicAttachment.getPath())) {
+                        FilePathVo filePathVo = JSON.parseObject(basicAttachment.getPath(), FilePathVo.class);
+                        InputStream inputStream = fileUploadService.downloadFile(filePathVo.getPath(), filePathVo.getUploadType(), filePathVo.getType());
+                        if (inputStream == null) {
+                            throw ExceptionResultEnum.ERROR.exception("读取题卡文件失败:" + filePathVo.getPath());
+                        }
+                        inputStreamList.add(inputStream);
+                    }
+                }
+            }
+            File pdfFileTemp = null;
+            try {
+                pdfFileTemp = SystemConstant.getFileTempVar(SystemConstant.PDF_PREFIX);
+                String mergePdf = PdfUtil.mergePdf(inputStreamList, pdfFileTemp.getAbsolutePath());
+                if (StringUtils.isNotBlank(mergePdf)) {
+                    File localPaperPdfFile = new File(FileUtil.replaceSplit(mergePdf));
+                    String uploadFileName = PdfUtil.md5FileName(CreatePdfTypeEnum.ALL.name() + examTaskWhole.getId()) + SystemConstant.PDF_PREFIX;
+                    FilePathVo filePathVo = fileUploadService.uploadFile(localPaperPdfFile, UploadFileEnum.PDF, uploadFileName);
+                    examTaskWhole.setAttachmentPath(JSON.toJSONString(filePathVo));
+                }
+            } catch (IOException e) {
+                throw ExceptionResultEnum.ERROR.exception("合并pdf失败");
+            } finally {
+                if (pdfFileTemp != null) {
+                    pdfFileTemp.delete();
+                }
+            }
+        }
+    }
+}

+ 5 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceImpl.java

@@ -859,7 +859,7 @@ public class PrintCommonServiceImpl implements PrintCommonService {
         if (printPlanId != null) {
             examDetails = examDetailService.listByPrintPlanIdAndCourseCodeAndPaperNumber(schoolId, printPlanId, courseId, paperNumber);
         } else {
-            examDetails = examDetailService.listByCourseIdAndPaperNumber(schoolId, examId, courseId, paperNumber);
+            examDetails = examDetailService.listExamDetailByExamIdAndCourseIdAndPaperNumber(examId, courseId, paperNumber);
         }
         if (CollectionUtils.isNotEmpty(examDetails)) {
             long count = examDetails.stream().filter(m -> !ExamDetailStatusEnum.NEW.name().equals(m.getStatus().name()) && !ExamDetailStatusEnum.READY.name().equals(m.getStatus().name())).count();
@@ -922,7 +922,7 @@ public class PrintCommonServiceImpl implements PrintCommonService {
 
         if (canCreatePdf) {
             // 2.校验考务数据是否导入
-            List<ExamDetail> examDetailList = examDetailService.listByCourseIdAndPaperNumber(schoolId, examId, courseId, paperNumber);
+            List<ExamDetail> examDetailList = examDetailService.listExamDetailByExamIdAndCourseIdAndPaperNumber(examId, courseId, paperNumber);
             if (CollectionUtils.isNotEmpty(examDetailList)) {
                 // 3.检查examDetailId下有无其它课程
                 for (ExamDetail examDetail : examDetailList) {
@@ -962,14 +962,14 @@ public class PrintCommonServiceImpl implements PrintCommonService {
      * 校验是否可以提交
      *
      * @param schoolId
-     * @param courseCode
+     * @param courseId
      * @param paperNumber
      * @param user
      */
     @Override
-    public void checkDataMakeup(Long schoolId, ExamDetail examDetail, String courseCode, String paperNumber, SysUser user) {
+    public void checkDataMakeup(Long schoolId, ExamDetail examDetail, Long courseId, String paperNumber, SysUser user) {
         // 校验命题任务是否提交
-        ExamTask examTask = examTaskService.getByExamIdAndCourseCodeAndPaperNumber(examDetail.getExamId(), courseCode, paperNumber);
+        ExamTask examTask = examTaskService.getByExamIdAndCourseIdAndPaperNumber(examDetail.getExamId(), courseId, paperNumber);
         BasicExam basicExam = basicExamService.getById(examTask.getExamId());
         if (basicExam != null && ExamModelEnum.MODEL3.equals(basicExam.getExamModel())) {
             log.info("考试模式为模式3,不生成pdf");

+ 2 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncBasicExamStudentTeacherImportService.java

@@ -7,6 +7,7 @@ import com.qmth.boot.tools.excel.enums.ExcelType;
 import com.qmth.distributed.print.business.bean.dto.importFile.BasicExamStudentImport;
 import com.qmth.distributed.print.business.service.BasicExamService;
 import com.qmth.distributed.print.business.service.BasicExamStudentService;
+import com.qmth.distributed.print.business.templete.importData.AsyncImportTaskTemplete;
 import com.qmth.distributed.print.business.templete.importData.SyncImportTaskTemplate;
 import com.qmth.distributed.print.business.templete.service.ImportLogicService;
 import com.qmth.teachcloud.common.bean.examRule.CodeNameEnableValue;
@@ -43,7 +44,7 @@ import java.util.*;
  * @Date: 2024-02-26
  */
 @Service
-public class AsyncBasicExamStudentTeacherImportService extends SyncImportTaskTemplate {
+public class AsyncBasicExamStudentTeacherImportService extends AsyncImportTaskTemplete {
 
     private final static Logger log = LoggerFactory.getLogger(AsyncBasicExamStudentTeacherImportService.class);
 
@@ -55,13 +56,9 @@ public class AsyncBasicExamStudentTeacherImportService extends SyncImportTaskTem
     public static final String FINISH_SUCCESS_SIZE = "条数据,失败";
     public static final String FINISH_ERROR_SIZE = "条数据";
 
-    @Resource
-    private BasicExamService basicExamService;
     @Resource
     private BasicExamStudentService basicExamStudentService;
     @Resource
-    private MarkPaperService markPaperService;
-    @Resource
     private FileUploadService fileUploadService;
 
     @Override

+ 3 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCreatePdfTemplateService.java

@@ -2,7 +2,6 @@ package com.qmth.distributed.print.business.templete.execute;
 
 import cn.hutool.core.date.DateUtil;
 import com.qmth.distributed.print.business.entity.TBTaskPdf;
-import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
 import com.qmth.distributed.print.business.service.TBTaskPdfService;
 import com.qmth.distributed.print.business.templete.callback.CallbackCreatePdf;
 import com.qmth.distributed.print.business.templete.create.AsyncCreateTaskTemplete;
@@ -19,7 +18,9 @@ import org.springframework.stereotype.Service;
 
 import java.io.IOException;
 import java.text.MessageFormat;
-import java.util.*;
+import java.util.Date;
+import java.util.Map;
+import java.util.StringJoiner;
 
 /**
  * @Description: 创建pdf模版

+ 56 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCreateWholePdfTemplateService.java

@@ -0,0 +1,56 @@
+package com.qmth.distributed.print.business.templete.execute;
+
+import cn.hutool.core.date.DateUtil;
+import com.qmth.distributed.print.business.entity.ExamTaskWhole;
+import com.qmth.distributed.print.business.enums.ExamTaskWholeStatusEnum;
+import com.qmth.distributed.print.business.service.ExamTaskWholeService;
+import com.qmth.distributed.print.business.service.TBTaskPdfService;
+import com.qmth.distributed.print.business.templete.service.PdfTaskLogicService;
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+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.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.StringJoiner;
+
+/**
+ * @Description: 创建pdf模版
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/4/9
+ */
+@Service
+public class AsyncCreateWholePdfTemplateService {
+    private final static Logger log = LoggerFactory.getLogger(AsyncCreateWholePdfTemplateService.class);
+
+    /**
+     * 创建pdf
+     */
+    @Async
+    public Result createWholePdf(ExamTaskWhole examTaskWhole) {
+        ExamTaskWholeService examTaskWholeService = SpringContextHolder.getBean(ExamTaskWholeService.class);
+        // 任务状态为进行中,直接结束
+        examTaskWhole.setStatus(ExamTaskWholeStatusEnum.RUNNING);
+        examTaskWholeService.updateById(examTaskWhole);
+        try {
+            examTaskWholeService.mergeWholePdf(examTaskWhole);
+        } catch (Exception e) {
+//            tbTaskPdf.setResult(TaskResultEnum.ERROR);
+        } finally {
+            examTaskWhole.setStatus(ExamTaskWholeStatusEnum.FINISH);
+            examTaskWhole.setCreateTime(System.currentTimeMillis());
+            examTaskWholeService.updateById(examTaskWhole);
+        }
+        return ResultUtil.ok(examTaskWhole);
+    }
+
+}

+ 0 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/importData/SyncImportTaskTemplate.java

@@ -39,12 +39,6 @@ public abstract class SyncImportTaskTemplate {
 
     public static final String FINISH_TITLE = "数据处理结束,共处理了";
 
-    public static final String FINISH_TOTAL_SIZE = "条数据,正常";
-
-    public static final String FINISH_SUCCESS_SIZE = "条数据,异常";
-
-    public static final String FINISH_ERROR_SIZE = "条数据";
-
     public static final String EXCEPTION_DATA = "错误信息:";
 
     public static final String EXCEPTION_CREATE_TXT_TITLE = "->创建导出日志时发生异常!";

+ 2 - 17
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/PdfTaskLogicServiceImpl.java

@@ -1,6 +1,5 @@
 package com.qmth.distributed.print.business.templete.service.impl;
 
-import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -8,7 +7,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.qmth.distributed.print.business.bean.dto.CreatePdfDto;
-import com.qmth.distributed.print.business.bean.dto.ExamStudentCourseDto;
 import com.qmth.distributed.print.business.bean.dto.PaperPdfDto;
 import com.qmth.distributed.print.business.bean.dto.PdfDto;
 import com.qmth.distributed.print.business.bean.dto.pdf.ExamStudentInfo;
@@ -18,9 +16,8 @@ import com.qmth.distributed.print.business.enums.ExamStatusEnum;
 import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.service.PdfTaskLogicService;
-import com.qmth.distributed.print.business.util.PdfUtil;
 import com.qmth.distributed.print.business.util.CreatePdfUtil;
-import com.qmth.teachcloud.common.base.BaseEntity;
+import com.qmth.distributed.print.business.util.PdfUtil;
 import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.bean.vo.PaperInfoVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -43,7 +40,6 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.io.File;
 import java.math.BigDecimal;
-import java.text.MessageFormat;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
@@ -89,7 +85,7 @@ public class PdfTaskLogicServiceImpl implements PdfTaskLogicService {
         CreatePdfDto createPdfDto = new CreatePdfDto();
         try {
             long startTime = System.currentTimeMillis();
-            SystemConstant.addSummary(stringJoinerSummary, "开始处理数据,更新考场状态为["+ExamDetailStatusEnum.CREATING.getName()+"]");
+            SystemConstant.addSummary(stringJoinerSummary, "开始处理数据,更新考场状态为[" + ExamDetailStatusEnum.CREATING.getName() + "]");
             // 更新状态(考场状态、印刷计划状态)
             updatePdfDataStatus(tbTaskPdf);
             SystemConstant.addSummary(stringJoinerSummary, "考场状态更新成功,开始准备PDF文件生成数据");
@@ -421,15 +417,4 @@ public class PdfTaskLogicServiceImpl implements PdfTaskLogicService {
         examDetailService.updateById(examDetail);
     }
 
-    /**
-     * 写入概要信息
-     *
-     * @param stringJoinerSummary
-     * @param message
-     */
-    private void addSummary(StringJoiner stringJoinerSummary, String message) {
-        // 时间:事件
-        stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), "->", message));
-    }
-
 }

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/CreatePdfUtil.java

@@ -683,7 +683,7 @@ public class CreatePdfUtil {
         ExamPrintPlan examPrintPlan = examPrintPlanService.getById(printPlanId);
         //抽取卷型
         DrawRuleEnum drawRule = Objects.nonNull(examPrintPlan.getDrawRule()) ? examPrintPlan.getDrawRule() : DrawRuleEnum.ONE;
-        ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamIdAndCourseCodeAndPaperNumber(examId, null, paperNumber);
+        ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamIdAndCourseIdAndPaperNumber(examId, null, paperNumber);
         // 单次抽取套数
         int drawCount = examTaskDetail.getDrawCount().intValue();
 

+ 50 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/PdfUtil.java

@@ -20,6 +20,7 @@ import com.qmth.teachcloud.common.service.CommonCacheService;
 import com.qmth.teachcloud.common.util.FileUtil;
 import com.qmth.teachcloud.common.util.HtmlToPdfUtil;
 import com.qmth.teachcloud.common.util.ResultUtil;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.io.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -140,6 +141,55 @@ public class PdfUtil {
         return Objects.nonNull(dirName) ? dirName.toString() : null;
     }
 
+    /**
+     * 将多个PDF合并成一个PDF
+     *
+     * @param inputStreamList
+     * @param outputPath
+     */
+    public static String mergePdf(List<InputStream> inputStreamList, String outputPath) {
+        Document document = null;
+        PdfCopy copy = null;
+        StringJoiner dirName = new StringJoiner("");
+        File pdfFileTemp = null;
+        try {
+            if (CollectionUtils.isNotEmpty(inputStreamList)) {
+                document = new Document(new PdfReader(inputStreamList.get(0)).getPageSize(1));
+                if (Objects.isNull(outputPath)) {
+                    pdfFileTemp = SystemConstant.getFileTempVar(SystemConstant.PDF_PREFIX);
+                    dirName.add(pdfFileTemp.getPath());
+                    outputPath = dirName.toString();
+                }
+                copy = new PdfSmartCopy(document, new FileOutputStream(outputPath));
+                document.open();
+                for (int i = 0; i < inputStreamList.size(); i++) {
+                    PdfReader reader = new PdfReader(inputStreamList.get(i));
+                    int numberOfPages = reader.getNumberOfPages();
+                    for (int j = 1; j <= numberOfPages; j++) {
+                        document.newPage();
+                        PdfImportedPage page = copy.getImportedPage(reader, j);
+                        copy.addPage(page);
+                    }
+                    reader.close();
+                }
+            }
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        } finally {
+            if (Objects.nonNull(document)) {
+                document.close();
+            }
+            if (Objects.nonNull(copy)) {
+                copy.flush();
+                copy.close();
+            }
+//            if(Objects.nonNull(pdfFileTemp)){
+//                FileUtil.deleteFile(pdfFileTemp);
+//            }
+        }
+        return Objects.nonNull(dirName) ? dirName.toString() : null;
+    }
+
     /**
      * 新增空白pdf(奇数页补空白面后变成偶数页)
      *

+ 2 - 1
distributed-print-business/src/main/resources/mapper/BasicExamStudentMapper.xml

@@ -27,7 +27,8 @@
             bes.exam_end_time AS examEndTime,
             bes.exam_place AS examPlace,
             bes.exam_room AS examRoom,
-            bes.extend_fields AS extendFields
+            bes.extend_fields AS extendFields,
+            bes.status
         FROM
             basic_exam_student bes
                 LEFT JOIN

+ 12 - 9
distributed-print-business/src/main/resources/mapper/ExamDetailMapper.xml

@@ -814,19 +814,22 @@
                           ed.print_plan_id = epp.id
                         AND epp.category = 'MAKEUP')
     </select>
-    <select id="listByExamIdAndCourseIdAndPaperNumber"
+    <select id="listExamDetailByExamIdAndCourseIdAndPaperNumber"
             resultType="com.qmth.distributed.print.business.entity.ExamDetail">
         SELECT
-            b.*
+            *
         FROM
-            exam_detail_course a
-                JOIN
-            exam_detail b ON a.exam_detail_id = b.id
+            exam_detail ed
         WHERE
-            a.school_id = #{schoolId}
-          AND b.exam_id = #{examId}
-          AND a.course_id = #{courseId}
-          AND a.paper_number = #{paperNumber}
+            ed.exam_id = #{examId}
+          AND EXISTS( SELECT
+                          1
+                      FROM
+                          exam_detail_course edc
+                      WHERE
+                          ed.id = edc.exam_detail_id
+                        AND edc.course_id = #{courseId}
+                        AND edc.paper_number = #{paperNumber})
     </select>
     <select id="listPrintFinishPackageCode"
             resultType="com.qmth.distributed.print.business.bean.dto.initMarkData.ExamDetailCourseInitMarkDto">

+ 4 - 0
distributed-print-business/src/main/resources/mapper/ExamTaskWholeMapper.xml

@@ -0,0 +1,4 @@
+<?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.ExamTaskWholeMapper">
+</mapper>

+ 0 - 14
distributed-print/install/mysql/init/teachcloud_db.sql

@@ -316,7 +316,6 @@ CREATE TABLE IF NOT EXISTS `basic_role_data_permission` (
 -- ----------------------------
 -- Records of basic_role_data_permission
 -- ----------------------------
-BEGIN;
 INSERT INTO `basic_role_data_permission` (`id`, `school_id`, `role_id`, `privilege_id`, `data_permission_type`, `org_scope`, `org_id`, `create_id`, `create_time`, `update_id`, `update_time`) VALUES (507968226794143744, NULL, 3, 576, 'SELF', NULL, NULL, 1, 1712049862866, NULL, 1712049862866);
 INSERT INTO `basic_role_data_permission` (`id`, `school_id`, `role_id`, `privilege_id`, `data_permission_type`, `org_scope`, `org_id`, `create_id`, `create_time`, `update_id`, `update_time`) VALUES (507968226794143745, NULL, 3, 491, 'SELF', NULL, NULL, 1, 1712049862868, NULL, 1712049862868);
 INSERT INTO `basic_role_data_permission` (`id`, `school_id`, `role_id`, `privilege_id`, `data_permission_type`, `org_scope`, `org_id`, `create_id`, `create_time`, `update_id`, `update_time`) VALUES (507968226794143746, NULL, 3, 897, 'SELF', NULL, NULL, 1, 1712049862869, NULL, 1712049862869);
@@ -368,7 +367,6 @@ INSERT INTO `basic_role_data_permission` (`id`, `school_id`, `role_id`, `privile
 INSERT INTO `basic_role_data_permission` (`id`, `school_id`, `role_id`, `privilege_id`, `data_permission_type`, `org_scope`, `org_id`, `create_id`, `create_time`, `update_id`, `update_time`) VALUES (507968755603603460, NULL, 4, 917, 'SELF_ORG_BELOW', NULL, NULL, 1, 1712049988944, NULL, 1712049988944);
 INSERT INTO `basic_role_data_permission` (`id`, `school_id`, `role_id`, `privilege_id`, `data_permission_type`, `org_scope`, `org_id`, `create_id`, `create_time`, `update_id`, `update_time`) VALUES (507968755603603461, NULL, 4, 946, 'SELF_ORG_BELOW', NULL, NULL, 1, 1712049988944, NULL, 1712049988944);
 INSERT INTO `basic_role_data_permission` (`id`, `school_id`, `role_id`, `privilege_id`, `data_permission_type`, `org_scope`, `org_id`, `create_id`, `create_time`, `update_id`, `update_time`) VALUES (507968755603603462, NULL, 4, 970, 'SELF_ORG_BELOW', NULL, NULL, 1, 1712049988945, NULL, 1712049988945);
-COMMIT;
 
 -- ----------------------------
 -- Table structure for basic_school
@@ -2302,7 +2300,6 @@ CREATE TABLE IF NOT EXISTS `sys_config` (
 -- ----------------------------
 -- Records of sys_config
 -- ----------------------------
-BEGIN;
 INSERT INTO `sys_config` (`id`, `school_id`, `org_id`, `config_key`, `config_name`, `config_value`, `remark`, `enable`, `sort`, `create_id`, `create_time`, `update_id`, `update_time`) VALUES (1, NULL, NULL, 'sys.user.initPassword', '初始密码', '123456', NULL, 1, 1, 1, NULL, NULL, NULL);
 INSERT INTO `sys_config` (`id`, `school_id`, `org_id`, `config_key`, `config_name`, `config_value`, `remark`, `enable`, `sort`, `create_id`, `create_time`, `update_id`, `update_time`) VALUES (2, NULL, NULL, 'sys.warning.days', '预警天数', '3', NULL, 1, 1, 1, NULL, NULL, NULL);
 INSERT INTO `sys_config` (`id`, `school_id`, `org_id`, `config_key`, `config_name`, `config_value`, `remark`, `enable`, `sort`, `create_id`, `create_time`, `update_id`, `update_time`) VALUES (3, NULL, NULL, 'sys.code.enable', '是否启用短信验证码', 'true', 'true-启用,false-禁用', 1, 1, 1, NULL, NULL, NULL);
@@ -2340,7 +2337,6 @@ INSERT INTO `sys_config` (`id`, `school_id`, `org_id`, `config_key`, `config_nam
 INSERT INTO `sys_config` (`id`, `school_id`, `org_id`, `config_key`, `config_name`, `config_value`, `remark`, `enable`, `sort`, `create_id`, `create_time`, `update_id`, `update_time`) VALUES (39, NULL, NULL, 'sms.audit.copy.user.code', '用户', 'SMS_237206065', NULL, 1, 16, 1, NULL, NULL, NULL);
 INSERT INTO `sys_config` (`id`, `school_id`, `org_id`, `config_key`, `config_name`, `config_value`, `remark`, `enable`, `sort`, `create_id`, `create_time`, `update_id`, `update_time`) VALUES (40, NULL, NULL, 'sys.txt.charset', 'txt文件编码', 'UTF-8', NULL, 1, 1, 1, NULL, NULL, NULL);
 INSERT INTO `sys_config` (`id`, `school_id`, `org_id`, `config_key`, `config_name`, `config_value`, `remark`, `enable`, `sort`, `create_id`, `create_time`, `update_id`, `update_time`) VALUES (41, NULL, NULL, 'package.barcode.position', '签到表条码坐标', '[0.7,0,0.3,0.1]', NULL, 1, 17, 1, NULL, NULL, NULL);
-COMMIT;
 
 -- ----------------------------
 -- Table structure for sys_org
@@ -2384,7 +2380,6 @@ CREATE TABLE IF NOT EXISTS `sys_privilege` (
 -- ----------------------------
 -- Records of sys_privilege
 -- ----------------------------
-BEGIN;
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES (1, '基础配置', 'base', 'MENU', NULL, 1, NULL, NULL, 1, 0, 1);
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES (2, '用户管理', 'user', 'MENU', 1, 1, NULL, NULL, 1, 0, 1);
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES (3, '配置管理', 'rule', 'MENU', 1, 2, NULL, NULL, 1, 0, 1);
@@ -3349,7 +3344,6 @@ INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('2055', '毕业支撑矩阵-下载', '/api/admin/professional/certification/matrix/download', 'URL', '2036', '14', 'AUTH', '1', '1', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('2056', '是否可编辑(课程)', 'canEditCourse', 'LINK', '2036', '6', 'AUTH', '1', '0', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('2057', '是否可编辑(毕业要求)', 'canEditRequirement', 'LINK', '2036', '7', 'AUTH', '1', '0', '1');
-COMMIT;
 
 -- ----------------------------
 -- Table structure for sys_role
@@ -3375,7 +3369,6 @@ CREATE TABLE IF NOT EXISTS `sys_role` (
 -- ----------------------------
 -- Records of sys_role
 -- ----------------------------
-BEGIN;
 INSERT INTO `sys_role` (`id`, `school_id`, `org_id`, `name`, `enable`, `type`, `create_id`, `create_time`, `update_id`, `update_time`, `default_role`, `source`, `interpret`) VALUES (1, NULL, NULL, '系统管理员', 1, 'ADMIN', NULL, NULL, NULL, NULL, 1, NULL, NULL);
 INSERT INTO `sys_role` (`id`, `school_id`, `org_id`, `name`, `enable`, `type`, `create_id`, `create_time`, `update_id`, `update_time`, `default_role`, `source`, `interpret`) VALUES (2, NULL, NULL, '学校管理员', 1, 'SCHOOL_ADMIN', NULL, NULL, 1, 1712049944739, 1, 'SYS', '系统内置');
 INSERT INTO `sys_role` (`id`, `school_id`, `org_id`, `name`, `enable`, `type`, `create_id`, `create_time`, `update_id`, `update_time`, `default_role`, `source`, `interpret`) VALUES (3, NULL, NULL, '老师', 1, 'SCHOOL_TEACHER', NULL, NULL, 1, 1712049862546, 1, 'SYS', '系统内置');
@@ -3388,7 +3381,6 @@ INSERT INTO `sys_role` (`id`, `school_id`, `org_id`, `name`, `enable`, `type`, `
 INSERT INTO `sys_role` (`id`, `school_id`, `org_id`, `name`, `enable`, `type`, `create_id`, `create_time`, `update_id`, `update_time`, `default_role`, `source`, `interpret`) VALUES (10, NULL, NULL, '教务处老师', 1, 'OFFICE_TEACHER', NULL, NULL, 502780109107761152, 1710841402151, 1, 'ANALYSIS', '系统内置');
 INSERT INTO `sys_role` (`id`, `school_id`, `org_id`, `name`, `enable`, `type`, `create_id`, `create_time`, `update_id`, `update_time`, `default_role`, `source`, `interpret`) VALUES (11, NULL, NULL, '学院院长', 1, 'PRESIDENT', NULL, NULL, 506183624165425152, 1711675400312, 1, 'ANALYSIS', '系统内置');
 INSERT INTO `sys_role` (`id`, `school_id`, `org_id`, `name`, `enable`, `type`, `create_id`, `create_time`, `update_id`, `update_time`, `default_role`, `source`, `interpret`) VALUES (12, NULL, NULL, '任课老师', 1, 'TEACHER', NULL, NULL, 1, 1700551038560, 1, 'ANALYSIS', '系统内置');
-COMMIT;
 
 -- ----------------------------
 -- Table structure for sys_role_group_member
@@ -3419,7 +3411,6 @@ CREATE TABLE IF NOT EXISTS `sys_role_privilege` (
 -- ----------------------------
 -- Records of sys_role_privilege
 -- ----------------------------
-BEGIN;
 INSERT INTO `sys_role_privilege` (`id`, `role_id`, `privilege_id`, `enable`, `school_id`) VALUES (1, 1, 1, 1, NULL);
 INSERT INTO `sys_role_privilege` (`id`, `role_id`, `privilege_id`, `enable`, `school_id`) VALUES (2, 1, 2, 1, NULL);
 INSERT INTO `sys_role_privilege` (`id`, `role_id`, `privilege_id`, `enable`, `school_id`) VALUES (3, 1, 4, 1, NULL);
@@ -4677,7 +4668,6 @@ INSERT INTO `sys_role_privilege` (`id`, `role_id`, `privilege_id`, `enable`, `sc
 INSERT INTO `sys_role_privilege` (`id`, `role_id`, `privilege_id`, `enable`, `school_id`) VALUES (1775092426889818114, 4, 1008, 1, NULL);
 INSERT INTO `sys_role_privilege` (`id`, `role_id`, `privilege_id`, `enable`, `school_id`) VALUES (1775092426889818115, 4, 1009, 1, NULL);
 INSERT INTO `sys_role_privilege` (`id`, `role_id`, `privilege_id`, `enable`, `school_id`) VALUES (1775092426894012418, 4, 1010, 1, NULL);
-COMMIT;
 
 -- ----------------------------
 -- Table structure for sys_user
@@ -4710,9 +4700,7 @@ CREATE TABLE IF NOT EXISTS `sys_user` (
 -- ----------------------------
 -- Records of sys_user
 -- ----------------------------
-BEGIN;
 INSERT INTO `sys_user` (`id`, `school_id`, `login_name`, `real_name`, `code`, `password`, `mobile_number`, `org_id`, `enable`, `pwd_count`, `pwd_update_time`, `remark`, `create_id`, `create_time`, `update_id`, `update_time`, `historic_name`, `ui_setting`, `allow_manual_card`) VALUES (1, NULL, 'sysadmin', 'sysadmin', NULL, 'UW10aDg3ODYzNTc3', NULL, NULL, 1, 2, 1700550554413, NULL, NULL, NULL, NULL, 1700550554425, NULL, NULL, 0);
-COMMIT;
 
 -- ----------------------------
 -- Table structure for sys_user_role
@@ -4729,9 +4717,7 @@ CREATE TABLE IF NOT EXISTS `sys_user_role` (
 -- ----------------------------
 -- Records of sys_user_role
 -- ----------------------------
-BEGIN;
 INSERT INTO `sys_user_role` (`id`, `user_id`, `role_id`, `privilege_id`, `enable`) VALUES (1, 1, 1, NULL, 1);
-COMMIT;
 
 -- ----------------------------
 -- Table structure for t_b_session

+ 22 - 0
distributed-print/install/mysql/upgrade/3.4.0.sql

@@ -111,6 +111,28 @@ ADD COLUMN `required_fields` MEDIUMTEXT NULL COMMENT '基础字段' AFTER `exam_
 
 ALTER TABLE `exam_card` ADD COLUMN `copy_card_id` BIGINT(20) NULL COMMENT '复制源题卡ID' AFTER `paper_id`;
 
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('870', '启用/禁用', 'Enable', 'LINK', '624', '10', 'AUTH', '871', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('871', '启用/禁用', '/api/admin/exam/card/enable', 'URL', '624', '7', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1140', '状态', 'Status', 'LINK', '1100', '10', 'AUTH', '1141', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1141', '状态', '/api/admin/basic/exam_student/status', 'URL', '1100', '6', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1142', '任课老师导入', 'ImportTeacher', 'BUTTON', '1100', '11', 'AUTH', '1143', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1143', '任课老师导入', '/api/admin/basic/exam_student/import_teacher', 'URL', '1100', '7', 'AUTH', '1', '1', '1');
+
+CREATE TABLE `exam_task_whole` (
+      `id` BIGINT(20) NOT NULL,
+      `semester_id` BIGINT(20) NULL COMMENT '学期ID',
+      `exam_id` BIGINT(20) NULL COMMENT '考试ID',
+      `course_id` BIGINT(20) NULL,
+      `paper_number` VARCHAR(100) NULL,
+      `attachment_path` VARCHAR(200) NULL COMMENT '文件地址',
+      `status` VARCHAR(45) NULL COMMENT '状态',
+      `create_time` BIGINT(20) NULL COMMENT '创建时间',
+      PRIMARY KEY (`id`));
+
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1144', '任务PDF查看', 'Preview', 'BUTTON', '47', '4', 'AUTH', '1145', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1145', '任务PDF查看', '/api/admin/exam/print/get_whole_pdf', 'URL', '47', '5', 'AUTH', '1', '1', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1146', '任务PDF生成', 'CreateWholePdf', 'BUTTON', '47', '5', 'AUTH', '1147', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1147', '任务PDF生成', '/api/admin/exam/print/create_whole_pdf', 'URL', '47', '6', 'AUTH', '1', '1', '1');
 
 -- drop table if exists exam_detail_course_paper_type;
 -- drop table if exists basic_template_org;

+ 20 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPrintTaskController.java

@@ -10,6 +10,7 @@ import com.qmth.distributed.print.business.entity.ExamDetail;
 import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
 import com.qmth.distributed.print.business.service.ExamDetailService;
 import com.qmth.distributed.print.business.service.ExamPrintPlanService;
+import com.qmth.distributed.print.business.service.ExamTaskWholeService;
 import com.qmth.distributed.print.business.templete.execute.AsyncDownloadPdfTempleteService;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.bean.params.ArraysParams;
@@ -55,6 +56,8 @@ public class ExamPrintTaskController {
     @Resource
     private TBTaskService tbTaskService;
     @Resource
+    private ExamTaskWholeService examTaskWholeService;
+    @Resource
     private AsyncDownloadPdfTempleteService asyncDownloadPdfTempleteService;
 
     /**
@@ -232,5 +235,22 @@ public class ExamPrintTaskController {
         boolean isSuccess = examDetailService.taskNormal(examDetail);
         return ResultUtil.ok(isSuccess);
     }
+
+    @ApiOperation(value = "印刷任务管理-完整pdf查询")
+    @RequestMapping(value = "/get_whole_pdf", method = RequestMethod.POST)
+    public Result getWholePdf(@ApiParam(value = "考试ID") @RequestParam Long examId,
+                              @ApiParam(value = "课程ID") @RequestParam Long courseId,
+                              @ApiParam(value = "试卷编号") @RequestParam String paperNumber) {
+        return ResultUtil.ok(examTaskWholeService.getWholePdf(examId, courseId, paperNumber));
+    }
+
+    @ApiOperation(value = "印刷任务管理-生成pdf查询")
+    @RequestMapping(value = "/create_whole_pdf", method = RequestMethod.POST)
+    public Result createWholePdf(@ApiParam(value = "考试ID") @RequestParam Long examId,
+                                 @ApiParam(value = "课程ID") @RequestParam Long courseId,
+                                 @ApiParam(value = "试卷编号") @RequestParam String paperNumber) {
+        examTaskWholeService.checkAndCreateTask(examId, courseId, paperNumber);
+        return ResultUtil.ok();
+    }
 }
 

+ 1 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/WorkController.java

@@ -90,10 +90,9 @@ public class WorkController {
     @RequestMapping(value = "/structure/task/ready", method = RequestMethod.POST)
     public Result list(@RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                        @RequestParam @Min(2) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        Long schoolId = Long.parseLong(ServletUtil.getRequestHeaderSchoolId().toString());
         IPage<MarkSettingDto> markSettingDtoIPage = markPaperService.listPaperSetting(null, null, null, false, pageNumber, pageSize);
         for (MarkSettingDto record : markSettingDtoIPage.getRecords()) {
-            ExamTaskDetail examTaskDetail = examTaskDetailService.findByExamIdAndCourseCodeAndPaperNumber(record.getExamId(), record.getCourseCode(), record.getPaperNumber());
+            ExamTaskDetail examTaskDetail = examTaskDetailService.findByExamIdAndCourseIdAndPaperNumber(record.getExamId(), record.getCourseId(), record.getPaperNumber());
             if (examTaskDetail != null) {
                 List<PaperInfoVo> paperInfoVos = ExamTaskUtil.parsePaperAttachmentPath(examTaskDetail.getPaperAttachmentIds(), record.getPaperType());
                 if (CollectionUtils.isNotEmpty(paperInfoVos)) {

+ 1 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkQuestionController.java

@@ -64,7 +64,7 @@ public class MarkQuestionController extends BaseController {
                        @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
                        @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType) {
         boolean canCreate = false;
-        ExamTaskDetail examTaskDetail = examTaskDetailService.findByExamIdAndCourseCodeAndPaperNumber(examId, null, paperNumber);
+        ExamTaskDetail examTaskDetail = examTaskDetailService.findByExamIdAndCourseIdAndPaperNumber(examId, null, paperNumber);
         if (examTaskDetail == null) {
             canCreate = true;
         } else {

+ 1 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkSettingController.java

@@ -82,7 +82,7 @@ public class MarkSettingController {
         IPage<MarkSettingDto> markSettingDtoIPage = markPaperService.listPaperSetting(examId, courseId, paperNumber,
                 groupStatus, pageNumber, pageSize);
         for (MarkSettingDto record : markSettingDtoIPage.getRecords()) {
-            ExamTaskDetail examTaskDetail = examTaskDetailService.findByExamIdAndCourseCodeAndPaperNumber(record.getExamId(), record.getCourseCode(), record.getPaperNumber());
+            ExamTaskDetail examTaskDetail = examTaskDetailService.findByExamIdAndCourseIdAndPaperNumber(record.getExamId(), record.getCourseId(), record.getPaperNumber());
             if (examTaskDetail != null) {
                 List<PaperInfoVo> paperInfoVos = ExamTaskUtil.parsePaperAttachmentPath(examTaskDetail.getPaperAttachmentIds(), record.getPaperType());
                 if (CollectionUtils.isNotEmpty(paperInfoVos)) {

+ 9 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/MarkSettingDto.java

@@ -11,6 +11,7 @@ public class MarkSettingDto {
 
     @JsonSerialize(using = ToStringSerializer.class)
     private Long examId;
+    private Long courseId;
     private String courseCode;
     private String courseName;
     private String paperNumber;
@@ -30,6 +31,14 @@ public class MarkSettingDto {
         this.examId = examId;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

+ 3 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/FileUploadService.java

@@ -13,6 +13,7 @@ public interface FileUploadService {
     FilePathVo uploadFile(File sourceFile, UploadFileEnum uploadFileEnum, String fileName);
 
     FilePathVo uploadFile(MultipartFile file, UploadFileEnum uploadFileEnum, String fileName, String md5);
+
     FilePathVo uploadFile(InputStream inputStream, UploadFileEnum uploadFileEnum, String fileName, String md5);
 
     File downloadFile(String path, String pathName) throws Exception;
@@ -21,6 +22,8 @@ public interface FileUploadService {
 
     File downloadFile(Long attachmentId, String pathName) throws Exception;
 
+    InputStream downloadFile(String path, UploadFileEnum fssType, String ossType);
+
     File downloadFile(BasicAttachment attachment, String pathName) throws Exception;
 
     String filePreview(String path);

+ 19 - 3
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/FileUploadServiceImpl.java

@@ -1,6 +1,7 @@
 package com.qmth.teachcloud.common.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
@@ -28,6 +29,7 @@ import javax.annotation.Resource;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStream;
+import java.nio.file.Files;
 import java.time.LocalDateTime;
 import java.util.Objects;
 import java.util.StringJoiner;
@@ -82,7 +84,6 @@ public class FileUploadServiceImpl implements FileUploadService {
     }
 
     /**
-     *
      * @param file
      * @param fileName
      * @param uploadFileEnum
@@ -115,7 +116,6 @@ public class FileUploadServiceImpl implements FileUploadService {
     }
 
     /**
-     *
      * @param file
      * @param fileName
      * @param uploadFileEnum
@@ -231,6 +231,21 @@ public class FileUploadServiceImpl implements FileUploadService {
         return downloadFile(basicAttachmentService.getById(attachmentId), pathName);
     }
 
+    @Override
+    public InputStream downloadFile(String path, UploadFileEnum fssType, String ossType) {
+        InputStream inputStream;
+        try {
+            if (Objects.equals(ossType, SystemConstant.OSS)) {
+                inputStream = fileStoreUtil.ossDownloadIs(path, fssType.getFssType());
+            } else {
+                inputStream = Files.newInputStream(new File(path).toPath());
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return inputStream;
+    }
+
     /**
      * 获取附件文件
      *
@@ -287,7 +302,7 @@ public class FileUploadServiceImpl implements FileUploadService {
         if (StringUtils.isBlank(path)) {
             return null;
         }
-        String prefix="";
+        String prefix = "";
         FilePathVo filePathVo = JSON.parseObject(path, FilePathVo.class);
         String filePath = filePathVo.getPath();
         if (StringUtils.isBlank(filePath)) {
@@ -387,6 +402,7 @@ public class FileUploadServiceImpl implements FileUploadService {
             fileStoreUtil.localUpload(uploadFileName, new FileInputStream(file), DigestUtils.md5Hex(new FileInputStream(file)), LocalCatalogEnum.LOCAL_PDF);
         }
     }
+
     public void uploadFile(boolean oss, UploadFileEnum uploadFileEnum, String uploadFileName, InputStream in, String md5) throws Exception {
         FileStoreUtil fileStoreUtil = SpringContextHolder.getBean(FileStoreUtil.class);
         if (isOssUpload(oss, uploadFileEnum)) {

+ 1 - 0
teachcloud-mark/src/main/resources/mapper/MarkPaperMapper.xml

@@ -30,6 +30,7 @@
     </resultMap>
     <select id="listPaperSetting" resultType="com.qmth.teachcloud.common.bean.dto.mark.MarkSettingDto">
         SELECT
+        mp.course_id courseId,
         mp.exam_id examId,
         bc.code courseCode,
         bc.name courseName,