Переглянути джерело

Merge branch 'dev_v3.2.0' into release_v3.2.0
merge

wangliang 2 роки тому
батько
коміт
66796e4516
41 змінених файлів з 584 додано та 274 видалено
  1. 14 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintStatisticsDto.java
  2. 28 10
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintStatisticsTotalDto.java
  3. 14 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintTaskDto.java
  4. 42 15
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintTaskTotalDto.java
  5. 0 11
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskDetailDto.java
  6. 14 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PrintTaskDto.java
  7. 28 10
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PrintTaskTotalDto.java
  8. 2 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/ExamStudentImportDto.java
  9. 11 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/DictionaryResult.java
  10. 20 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ClientPrintData.java
  11. 17 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamDetail.java
  12. 8 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamCardService.java
  13. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java
  14. 23 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java
  15. 31 29
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DownloadServiceImpl.java
  16. 31 17
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java
  17. 5 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  18. 5 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPrintPlanServiceImpl.java
  19. 3 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java
  20. 95 26
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  21. 3 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceImpl.java
  22. 86 55
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  23. 10 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/CreatePdfUtil.java
  24. 19 17
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/CreatePrintPdfUtil.java
  25. 7 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/PdfFillUtils.java
  26. 1 2
      distributed-print-business/src/main/resources/db/1、init-table.sql
  27. 5 0
      distributed-print-business/src/main/resources/mapper/BasicPrintConfigMapper.xml
  28. 5 3
      distributed-print-business/src/main/resources/mapper/ExamCardMapper.xml
  29. 6 3
      distributed-print-business/src/main/resources/mapper/ExamDetailMapper.xml
  30. 21 9
      distributed-print-business/src/main/resources/mapper/ExamPrintPlanMapper.xml
  31. 2 2
      distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml
  32. 5 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/ClientController.java
  33. 3 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamCardController.java
  34. 2 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskController.java
  35. 7 5
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java
  36. 2 1
      distributed-print/src/main/java/com/qmth/distributed/print/auth/DistributedPrintSession.java
  37. 0 0
      distributed-print/src/main/resources/application-main-temp.properties
  38. 2 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/BasicCourseImportDto.java
  39. 5 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/ImageTrajectoryUtil.java
  40. 0 0
      teachcloud-report/src/main/resources/application-main-temp.properties
  41. 0 0
      teachcloud-task/src/main/resources/application-main-temp.properties

+ 14 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintStatisticsDto.java

@@ -15,7 +15,8 @@ public class ClientPrintStatisticsDto {
     private Integer packageCount;
     private Integer totalSubjects;
     private Integer totalSubjectsLeft;
-    private Integer pagesA3Left;
+    private Integer paperPagesLeft;
+    private Integer cardPagesLeft;
     private Integer pagesA4Left;
     private Integer progress;
 
@@ -99,12 +100,20 @@ public class ClientPrintStatisticsDto {
         this.totalSubjectsLeft = totalSubjectsLeft;
     }
 
-    public Integer getPagesA3Left() {
-        return pagesA3Left;
+    public Integer getPaperPagesLeft() {
+        return paperPagesLeft;
     }
 
-    public void setPagesA3Left(Integer pagesA3Left) {
-        this.pagesA3Left = pagesA3Left;
+    public void setPaperPagesLeft(Integer paperPagesLeft) {
+        this.paperPagesLeft = paperPagesLeft;
+    }
+
+    public Integer getCardPagesLeft() {
+        return cardPagesLeft;
+    }
+
+    public void setCardPagesLeft(Integer cardPagesLeft) {
+        this.cardPagesLeft = cardPagesLeft;
     }
 
     public Integer getPagesA4Left() {

+ 28 - 10
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintStatisticsTotalDto.java

@@ -9,9 +9,11 @@ public class ClientPrintStatisticsTotalDto {
     private Integer packageCount;
     private Integer paperCount;
     private String paperNumberAndType;
-    private Integer pagesA3;
+    private Integer paperPages;
+    private Integer cardPages;
     private Integer pagesA4;
-    private Integer pagesA3Left;
+    private Integer paperPagesLeft;
+    private Integer cardPagesLeft;
     private Integer pagesA4Left;
 
     public Integer getTotalSubjects() {
@@ -46,12 +48,20 @@ public class ClientPrintStatisticsTotalDto {
         this.paperNumberAndType = paperNumberAndType;
     }
 
-    public Integer getPagesA3() {
-        return pagesA3;
+    public Integer getPaperPages() {
+        return paperPages;
     }
 
-    public void setPagesA3(Integer pagesA3) {
-        this.pagesA3 = pagesA3;
+    public void setPaperPages(Integer paperPages) {
+        this.paperPages = paperPages;
+    }
+
+    public Integer getCardPages() {
+        return cardPages;
+    }
+
+    public void setCardPages(Integer cardPages) {
+        this.cardPages = cardPages;
     }
 
     public Integer getPagesA4() {
@@ -62,12 +72,20 @@ public class ClientPrintStatisticsTotalDto {
         this.pagesA4 = pagesA4;
     }
 
-    public Integer getPagesA3Left() {
-        return pagesA3Left;
+    public Integer getPaperPagesLeft() {
+        return paperPagesLeft;
+    }
+
+    public void setPaperPagesLeft(Integer paperPagesLeft) {
+        this.paperPagesLeft = paperPagesLeft;
+    }
+
+    public Integer getCardPagesLeft() {
+        return cardPagesLeft;
     }
 
-    public void setPagesA3Left(Integer pagesA3Left) {
-        this.pagesA3Left = pagesA3Left;
+    public void setCardPagesLeft(Integer cardPagesLeft) {
+        this.cardPagesLeft = cardPagesLeft;
     }
 
     public Integer getPagesA4Left() {

+ 14 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintTaskDto.java

@@ -31,7 +31,8 @@ public class ClientPrintTaskDto {
     @ExcelProperty(name = "单科次A3(页)", width = 30, index = 9)
     private String singlePagesA3;
     private String singlePagesA4;
-    private Integer pagesA3;
+    private Integer paperPages;
+    private Integer cardPages;
     private Integer pagesA4;
     @ExcelProperty(name = "科次", width = 30, index = 10)
     private Integer totalSubjects;
@@ -190,12 +191,20 @@ public class ClientPrintTaskDto {
         this.singlePagesA4 = singlePagesA4;
     }
 
-    public Integer getPagesA3() {
-        return pagesA3;
+    public Integer getPaperPages() {
+        return paperPages;
     }
 
-    public void setPagesA3(Integer pagesA3) {
-        this.pagesA3 = pagesA3;
+    public void setPaperPages(Integer paperPages) {
+        this.paperPages = paperPages;
+    }
+
+    public Integer getCardPages() {
+        return cardPages;
+    }
+
+    public void setCardPages(Integer cardPages) {
+        this.cardPages = cardPages;
     }
 
     public Integer getPagesA4() {

+ 42 - 15
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintTaskTotalDto.java

@@ -7,11 +7,14 @@ public class ClientPrintTaskTotalDto {
 
     private Integer totalSubjects;
     private Integer packageCount;
-    private Integer pagesA3;
+    private Integer paperPages;
+    private Integer cardPages;
     private Integer pagesA4;
-    private Integer pagesA3Left;
+    private Integer paperPagesLeft;
+    private Integer cardPagesLeft;
     private Integer pagesA4Left;
-    private Integer hostPagesA3;
+    private Integer hostPaperPages;
+    private Integer hostCardPages;
     private Integer hostPagesA4;
 
     public Integer getTotalSubjects() {
@@ -30,12 +33,20 @@ public class ClientPrintTaskTotalDto {
         this.packageCount = packageCount;
     }
 
-    public Integer getPagesA3() {
-        return pagesA3;
+    public Integer getPaperPages() {
+        return paperPages;
     }
 
-    public void setPagesA3(Integer pagesA3) {
-        this.pagesA3 = pagesA3;
+    public void setPaperPages(Integer paperPages) {
+        this.paperPages = paperPages;
+    }
+
+    public Integer getCardPages() {
+        return cardPages;
+    }
+
+    public void setCardPages(Integer cardPages) {
+        this.cardPages = cardPages;
     }
 
     public Integer getPagesA4() {
@@ -46,12 +57,20 @@ public class ClientPrintTaskTotalDto {
         this.pagesA4 = pagesA4;
     }
 
-    public Integer getPagesA3Left() {
-        return pagesA3Left;
+    public Integer getPaperPagesLeft() {
+        return paperPagesLeft;
+    }
+
+    public void setPaperPagesLeft(Integer paperPagesLeft) {
+        this.paperPagesLeft = paperPagesLeft;
     }
 
-    public void setPagesA3Left(Integer pagesA3Left) {
-        this.pagesA3Left = pagesA3Left;
+    public Integer getCardPagesLeft() {
+        return cardPagesLeft;
+    }
+
+    public void setCardPagesLeft(Integer cardPagesLeft) {
+        this.cardPagesLeft = cardPagesLeft;
     }
 
     public Integer getPagesA4Left() {
@@ -62,12 +81,20 @@ public class ClientPrintTaskTotalDto {
         this.pagesA4Left = pagesA4Left;
     }
 
-    public Integer getHostPagesA3() {
-        return hostPagesA3;
+    public Integer getHostPaperPages() {
+        return hostPaperPages;
+    }
+
+    public void setHostPaperPages(Integer hostPaperPages) {
+        this.hostPaperPages = hostPaperPages;
+    }
+
+    public Integer getHostCardPages() {
+        return hostCardPages;
     }
 
-    public void setHostPagesA3(Integer hostPagesA3) {
-        this.hostPagesA3 = hostPagesA3;
+    public void setHostCardPages(Integer hostCardPages) {
+        this.hostCardPages = hostCardPages;
     }
 
     public Integer getHostPagesA4() {

+ 0 - 11
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskDetailDto.java

@@ -45,9 +45,6 @@ public class ExamTaskDetailDto {
     @ApiModelProperty(value = "机构id")
     private String orgName;
 
-    @ApiModelProperty(value = "题卡id")
-    private Long examCardId;
-
     @ApiModelProperty(value = "命题任务试卷附件")
     private String paperAttachmentIds;
 
@@ -267,14 +264,6 @@ public class ExamTaskDetailDto {
         this.orgName = orgName;
     }
 
-    public Long getExamCardId() {
-        return examCardId;
-    }
-
-    public void setExamCardId(Long examCardId) {
-        this.examCardId = examCardId;
-    }
-
     public String getPaperAttachmentIds() {
         return paperAttachmentIds;
     }

+ 14 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PrintTaskDto.java

@@ -19,7 +19,8 @@ public class PrintTaskDto {
     private String examPlace;
     private String examRoom;
     private String singlePagesA3;
-    private Integer pagesA3;
+    private Integer paperPages;
+    private Integer cardPages;
     private Integer pagesA4;
     private Integer totalSubjects;
     private String status;
@@ -133,12 +134,20 @@ public class PrintTaskDto {
         this.singlePagesA3 = singlePagesA3;
     }
 
-    public Integer getPagesA3() {
-        return pagesA3;
+    public Integer getPaperPages() {
+        return paperPages;
     }
 
-    public void setPagesA3(Integer pagesA3) {
-        this.pagesA3 = pagesA3;
+    public void setPaperPages(Integer paperPages) {
+        this.paperPages = paperPages;
+    }
+
+    public Integer getCardPages() {
+        return cardPages;
+    }
+
+    public void setCardPages(Integer cardPages) {
+        this.cardPages = cardPages;
     }
 
     public Integer getPagesA4() {

+ 28 - 10
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PrintTaskTotalDto.java

@@ -8,9 +8,11 @@ public class PrintTaskTotalDto {
     private Integer totalSubjects;
     private Integer packageCount;
     private Integer paperCount;
-    private Integer pagesA3;
+    private Integer paperPages;
+    private Integer cardPages;
     private Integer pagesA4;
-    private Integer pagesA3Left;
+    private Integer paperPagesLeft;
+    private Integer cardPagesLeft;
     private Integer pagesA4Left;
 
     public Integer getTotalSubjects() {
@@ -37,12 +39,20 @@ public class PrintTaskTotalDto {
         this.paperCount = paperCount;
     }
 
-    public Integer getPagesA3() {
-        return pagesA3;
+    public Integer getPaperPages() {
+        return paperPages;
     }
 
-    public void setPagesA3(Integer pagesA3) {
-        this.pagesA3 = pagesA3;
+    public void setPaperPages(Integer paperPages) {
+        this.paperPages = paperPages;
+    }
+
+    public Integer getCardPages() {
+        return cardPages;
+    }
+
+    public void setCardPages(Integer cardPages) {
+        this.cardPages = cardPages;
     }
 
     public Integer getPagesA4() {
@@ -53,12 +63,20 @@ public class PrintTaskTotalDto {
         this.pagesA4 = pagesA4;
     }
 
-    public Integer getPagesA3Left() {
-        return pagesA3Left;
+    public Integer getPaperPagesLeft() {
+        return paperPagesLeft;
+    }
+
+    public void setPaperPagesLeft(Integer paperPagesLeft) {
+        this.paperPagesLeft = paperPagesLeft;
+    }
+
+    public Integer getCardPagesLeft() {
+        return cardPagesLeft;
     }
 
-    public void setPagesA3Left(Integer pagesA3Left) {
-        this.pagesA3Left = pagesA3Left;
+    public void setCardPagesLeft(Integer cardPagesLeft) {
+        this.cardPagesLeft = cardPagesLeft;
     }
 
     public Integer getPagesA4Left() {

+ 2 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/ExamStudentImportDto.java

@@ -37,12 +37,14 @@ public class ExamStudentImportDto implements Serializable {
     private String clazzName;
 
     @ExcelNote(value = "考点")
+    @NotNull
     private String examPlace;
 
     @ExcelNote(value = "考场")
     @NotNull
     private String examRoom;
 
+
     public String getStudentName() {
         return studentName;
     }

+ 11 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/DictionaryResult.java

@@ -23,6 +23,9 @@ public class DictionaryResult implements Serializable {
     @ApiModelProperty(value = "编号")
     private String code;
 
+    @ApiModelProperty(value = "当前使用的(学期...)")
+    private Boolean inUsed;
+
     public Long getId() {
         return id;
     }
@@ -46,4 +49,12 @@ public class DictionaryResult implements Serializable {
     public void setCode(String code) {
         this.code = code;
     }
+
+    public Boolean getInUsed() {
+        return inUsed;
+    }
+
+    public void setInUsed(Boolean inUsed) {
+        this.inUsed = inUsed;
+    }
 }

+ 20 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ClientPrintData.java

@@ -54,8 +54,14 @@ public class ClientPrintData extends BaseEntity implements Serializable {
     /**
      * A3页数
      */
-    @TableField("pages_a3")
-    private Integer pagesA3;
+    @TableField("paper_pages")
+    private Integer paperPages;
+
+    /**
+     * A3页数
+     */
+    @TableField("card_pages")
+    private Integer cardPages;
 
     public static long getSerialVersionUID() {
         return serialVersionUID;
@@ -101,11 +107,19 @@ public class ClientPrintData extends BaseEntity implements Serializable {
         this.pagesA4 = pagesA4;
     }
 
-    public Integer getPagesA3() {
-        return pagesA3;
+    public Integer getPaperPages() {
+        return paperPages;
+    }
+
+    public void setPaperPages(Integer paperPages) {
+        this.paperPages = paperPages;
+    }
+
+    public Integer getCardPages() {
+        return cardPages;
     }
 
-    public void setPagesA3(Integer pagesA3) {
-        this.pagesA3 = pagesA3;
+    public void setCardPages(Integer cardPages) {
+        this.cardPages = cardPages;
     }
 }

+ 17 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamDetail.java

@@ -77,8 +77,11 @@ public class ExamDetail extends BaseEntity implements Serializable {
     @TableField("package_code")
     private String packageCode;
 
-    @TableField("pages_a3")
-    private Integer pagesA3;
+    @TableField("paper_pages")
+    private Integer paperPages;
+
+    @TableField("card_pages")
+    private Integer cardPages;
 
     @TableField("pages_a4")
     private Integer pagesA4;
@@ -240,12 +243,20 @@ public class ExamDetail extends BaseEntity implements Serializable {
         this.packageCode = packageCode;
     }
 
-    public Integer getPagesA3() {
-        return pagesA3;
+    public Integer getPaperPages() {
+        return paperPages;
+    }
+
+    public void setPaperPages(Integer paperPages) {
+        this.paperPages = paperPages;
+    }
+
+    public Integer getCardPages() {
+        return cardPages;
     }
 
-    public void setPagesA3(Integer pagesA3) {
-        this.pagesA3 = pagesA3;
+    public void setCardPages(Integer cardPages) {
+        this.cardPages = cardPages;
     }
 
     public Integer getPagesA4() {

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

@@ -45,5 +45,12 @@ public interface ExamCardService extends IService<ExamCard> {
 
     Boolean deleteGeneric(Long id);
 
-    Long copyCard(Long id);
+    /**
+     * 题卡复制
+     *
+     * @param id         被复制的题卡id
+     * @param courseCode 复制后的题卡所绑定的课程编号
+     * @return 复制后的题卡id
+     */
+    Long copyCard(Long id, String courseCode);
 }

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

@@ -217,11 +217,11 @@ public interface ExamTaskService extends IService<ExamTask> {
      * </P>
      *
      * @param examObjectType 考试对象类型
-     * @param basicCourseId  基础课程id
+     * @param courseCode     基础课程编号
      * @param requestUser    请求的用户
      * @return 命题任务考试对象查询结果
      */
-    List<ExamTaskStudentObjectResult> findExamTaskStudentObject(ExamObjectType examObjectType, Long basicCourseId, SysUser requestUser) throws Exception;
+    List<ExamTaskStudentObjectResult> findExamTaskStudentObject(ExamObjectType examObjectType, String courseCode, SysUser requestUser) throws Exception;
 
     /**
      * 命题任务考生导入

+ 23 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java

@@ -1,5 +1,7 @@
 package com.qmth.distributed.print.business.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 import com.qmth.boot.api.exception.ApiException;
@@ -41,6 +43,7 @@ import org.activiti.engine.repository.Deployment;
 import org.activiti.engine.runtime.ProcessInstance;
 import org.activiti.engine.task.Task;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -86,6 +89,9 @@ public class ActivitiServiceImpl implements ActivitiService {
     @Resource
     ExamTaskService examTaskService;
 
+    @Resource
+    ExamTaskDetailService examTaskDetailService;
+
     @Resource
     RedisUtil redisUtil;
 
@@ -773,6 +779,23 @@ public class ActivitiServiceImpl implements ActivitiService {
             rejectLinkMap.put(nextFlowTaskResult.getTaskKey(), currFlowTaskResult);
             tfFlowApprove.setRejectLink(JacksonUtil.parseJson(rejectLinkMap));
         }
+
+        // 驳回给命题任务发起人,需要清除绑定的题卡id
+        if (approvePass == FlowApprovePassEnum.REJECT && nextFlowTaskResult.getSetup() == 1) {
+            ExamTask examTask = examTaskService.findByFlowId(tfFlowLog.getFlowId());
+            ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamTaskId(examTask.getId());
+            String paperAttachmentIds = examTaskDetail.getPaperAttachmentIds();
+            if (StringUtils.isNotBlank(paperAttachmentIds)) {
+                List<JSONObject> objects = JSON.parseArray(paperAttachmentIds, JSONObject.class);
+                for (JSONObject object : objects) {
+                    object.put("cardId", "");
+                    object.put("cardType", "");
+                    object.put("cardTitle", "");
+                }
+                examTaskDetail.setPaperAttachmentIds(JSON.toJSONString(objects));
+                examTaskDetailService.updateById(examTaskDetail);
+            }
+        }
     }
 
     /**

+ 31 - 29
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DownloadServiceImpl.java

@@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.qmth.distributed.print.business.bean.dto.ExamTaskDetailDto;
-import com.qmth.distributed.print.business.bean.dto.ExamTaskPaperDto;
-import com.qmth.distributed.print.business.bean.dto.ExamTaskPaperExportDto;
-import com.qmth.distributed.print.business.bean.dto.ExamTaskPaperFileDto;
+import com.qmth.distributed.print.business.bean.dto.*;
 import com.qmth.distributed.print.business.entity.*;
 import com.qmth.distributed.print.business.enums.MakeMethodEnum;
 import com.qmth.distributed.print.business.mapper.ExamCardMapper;
@@ -110,41 +107,46 @@ public class DownloadServiceImpl implements DownloadService {
         }
         String paperAttachmentIds = examTaskDetail.getPaperAttachmentIds();
         List<JSONObject> jsonObjectList = JSONObject.parseArray(paperAttachmentIds, JSONObject.class);
+
+
+
+        // 收集处理试卷和题卡
         // 本地存储目录
         String rootPath = dictionaryConfig.fssLocalFileDomain().getConfig() + File.separator + System.currentTimeMillis();
         List<File> fileList = new ArrayList<>();
-        // 试卷
+
         List<String> unexposedPaperTypes = Arrays.asList(unexposedPaperType.split(","));
-        for (JSONObject jsonObject : jsonObjectList) {
-            String attachmentId = jsonObject.get("attachmentId").toString();
-            String name = jsonObject.get("name").toString();
-            if (!unexposedPaperTypes.contains(name)) {
+        List<ExamPaperInfoDto> paperInfoDtoList = JSONObject.parseArray(paperAttachmentIds, ExamPaperInfoDto.class);
+        if (Objects.isNull(paperInfoDtoList)) {
+            throw ExceptionResultEnum.ERROR.exception("试卷信息不存在");
+        }
+        for (ExamPaperInfoDto paperInfo : paperInfoDtoList) {
+            String paperType = paperInfo.getName();
+            if (!unexposedPaperTypes.contains(paperType)) {
                 continue;
             }
+
+            // 试卷附件id
+            Long attachmentId = paperInfo.getAttachmentId();
+            // 题卡id
+            Long cardId = paperInfo.getCardId();
+
+            // 试卷
             BasicAttachment attachment = basicAttachmentMapper.selectById(attachmentId);
             if (attachment == null) {
                 throw ExceptionResultEnum.ERROR.exception("附件数据异常");
             }
             String paperPath = rootPath + File.separator + examTask.getCourseName() + "-" + examTask.getCourseCode() + File.separator + examTask.getPaperNumber();
-            String fileName = "试卷" + "_" + attachment.getName() + "_" + name + attachment.getType();
+            String fileName = "试卷" + "_" + attachment.getName() + "_" + paperType + attachment.getType();
             fileList.add(attachmentCommonService.downloadFile(paperPath, fileName, attachment));
-        }
 
-        // 题卡
-//        Long cardId = examTaskDetail.getCardId();
-        if (Objects.nonNull(examTaskDetail.getPaperAttachmentIds())) {
-            JSONArray jsonArrayPaper = JSONArray.parseArray(examTaskDetail.getPaperAttachmentIds());
-            String cardId = null;
-            for (int i = 0; i < jsonArrayPaper.size(); i++) {
-                JSONObject object = jsonArrayPaper.getJSONObject(i);
-                cardId = (String) object.get("cardId");
-            }
-            if (cardId != null) {
+            // 题卡
+            if (cardId != null){
                 ExamCard examCard = examCardMapper.selectById(cardId);
 
                 String cardPath = rootPath + File.separator + examTask.getCourseName() + "-" + examTask.getCourseCode() + File.separator + examTask.getPaperNumber();
-                String cardHtmlPath = cardPath + File.separator + "题卡" + "_" + examTask.getCourseName() + SystemConstant.HTML_PREFIX;
-                String cardPdfPath = cardPath + File.separator + "题卡" + "_" + examTask.getCourseName() + SystemConstant.PDF_PREFIX;
+                String cardHtmlPath = cardPath + File.separator + "题卡" + "_" + examTask.getCourseName() + "_" + paperType + SystemConstant.HTML_PREFIX;
+                String cardPdfPath = cardPath + File.separator + "题卡" + "_" + examTask.getCourseName() + "_" + paperType + SystemConstant.PDF_PREFIX;
 
                 ExamCardDetail examCardDetail = examCardDetailService.getByCardId(examCard.getId());
                 String htmlContent;
@@ -210,7 +212,6 @@ public class DownloadServiceImpl implements DownloadService {
                 String courseCode = examTaskDetailDto.getCourseCode();
                 String courseName = examTaskDetailDto.getCourseName();
                 String paperNumber = examTaskDetailDto.getPaperNumber();
-                Long examCardId = examTaskDetailDto.getExamCardId();
                 Long cardRuleId = SystemConstant.convertIdToLong(examTaskDetailDto.getCardRuleId());
 
                 // 生成导出对象
@@ -231,15 +232,16 @@ public class DownloadServiceImpl implements DownloadService {
                 List<String> exposedPaperTypeList = Arrays.asList(examTaskDetailDto.getExposedPaperType().split(","));
                 List<String> unexposedPaperTypeList = Arrays.asList(examTaskDetailDto.getUnexposedPaperType().split(","));
 
-                List<Map> paperInfo = JSONObject.parseArray(examTaskDetailDto.getPaperAttachmentIds(), Map.class);
+                List<ExamPaperInfoDto> paperInfo = JSONObject.parseArray(examTaskDetailDto.getPaperAttachmentIds(), ExamPaperInfoDto.class);
                 if (Objects.isNull(paperInfo)) {
                     throw ExceptionResultEnum.ERROR.exception("试卷信息不存在");
                 }
                 // 试卷信息
-                for (Map paper : paperInfo) {
-                    Long attachmentId = SystemConstant.convertIdToLong(String.valueOf(paper.get("attachmentId")));
+                for (ExamPaperInfoDto paper : paperInfo) {
+                    Long cardId = paper.getCardId();
+                    Long attachmentId = paper.getAttachmentId();
                     BasicAttachment basicAttachment = basicAttachmentService.getById(attachmentId);
-                    String paperType = String.valueOf(paper.get("name"));
+                    String paperType = paper.getName();
                     String paperName = basicAttachment.getName();
                     String paperSuffix = basicAttachment.getType();
                     JSONObject jsonObject = JSONObject.parseObject(basicAttachment.getPath());
@@ -267,7 +269,7 @@ public class DownloadServiceImpl implements DownloadService {
                     cell.setCourseName(courseName);
                     cell.setPaperNumber(paperNumber);
                     // 题卡
-                    cell.setExamCardId(examCardId);
+                    cell.setExamCardId(cardId);
                     cell.setCardRuleId(cardRuleId);
                     // 试卷
                     cell.setPaperType(paperType);

+ 31 - 17
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java

@@ -22,6 +22,7 @@ import com.qmth.teachcloud.common.bean.params.ArraysParams;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
+import com.qmth.teachcloud.common.entity.BasicCourse;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.CardCreateMethodEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
@@ -100,7 +101,7 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
                     .eq(ExamCard::getCourseCode, examCardParams.getCourseCode())
                     .eq(ExamCard::getTitle, examCardParams.getTitle());
             List<ExamCard> examCardList = this.list(queryWrapper);
-            if(!examCardList.isEmpty()){
+            if (!examCardList.isEmpty()) {
                 throw ExceptionResultEnum.ERROR.exception("题卡名称已存在");
             }
 
@@ -144,18 +145,18 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
                     .eq(ExamCard::getTitle, examCardParams.getTitle())
                     .ne(ExamCard::getId, examCardParams.getId());
             List<ExamCard> examCardList = this.list(queryWrapper);
-            if(!examCardList.isEmpty()){
+            if (!examCardList.isEmpty()) {
                 throw ExceptionResultEnum.ERROR.exception("题卡名称已存在");
             }
 
             examCard = this.getById(examCardParams.getId());
             examCard.setTitle(examCardParams.getTitle());
-            if (!examCardParams.getCourseCode().equals(examCard.getCourseCode())) {
+            if (CardTypeEnum.CUSTOM.equals(examCard.getType()) && !examCardParams.getCourseCode().equals(examCard.getCourseCode())) {
                 throw ExceptionResultEnum.ERROR.exception("课程不能更改");
             }
-            if (!examCardParams.getMakeMethod().name().equals(examCard.getMakeMethod().name())) {
-                throw ExceptionResultEnum.ERROR.exception("题卡制作方式不能更改");
-            }
+//            if (!examCardParams.getMakeMethod().name().equals(examCard.getMakeMethod().name())) {
+//                throw ExceptionResultEnum.ERROR.exception("题卡制作方式不能更改");
+//            }
             examCard.setStatus(examCardParams.getStatus());
             examCard.setUpdateId(user.getId());
             examCard.setUpdateTime(System.currentTimeMillis());
@@ -178,7 +179,7 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
         }
 
         // 绑定命题任务
-        examTaskDetailService.bindCardId(examCardParams.getExamTaskId(), examCard);
+//        examTaskDetailService.bindCardId(examCardParams.getExamTaskId(), examCard);
 
         return String.valueOf(examCard.getId());
     }
@@ -457,7 +458,14 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
 
     @Transactional
     @Override
-    public Long copyCard(Long id) {
+    public Long copyCard(Long id, String courseCode) {
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        List<BasicCourse> basicCourseList = basicCourseService.list(new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getSchoolId, requestUser.getSchoolId()).eq(BasicCourse::getCode, courseCode));
+        if (basicCourseList.size() != 1) {
+            throw ExceptionResultEnum.ERROR.exception("复制后题卡要绑定的课程异常");
+        }
+        BasicCourse basicCourse = basicCourseList.get(0);
+
         ExamCard examCard = this.getById(id);
         if (examCard == null) {
             throw ExceptionResultEnum.ERROR.exception("题卡不存在");
@@ -465,17 +473,23 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
         // 复制题卡
         ExamCard copyExamCard = new ExamCard();
         BeanUtils.copyProperties(examCard, copyExamCard);
-        Long copyExamCardId = SystemConstant.getDbUuid();
-        copyExamCard.setId(copyExamCardId);
-        String title = checkTitle(examCard);
+        String title = checkTitle(examCard, courseCode);
         copyExamCard.setTitle(title);
+        copyExamCard.setCourseCode(basicCourse.getCode());
+        copyExamCard.setCourseName(basicCourse.getName());
+        copyExamCard.setMakeMethod(MakeMethodEnum.SELF);
+        copyExamCard.setCreateMethod(null);
+        copyExamCard.setType(CardTypeEnum.CUSTOM);
+        copyExamCard.setCardRuleId(null);
+        copyExamCard.insertInfo(requestUser.getId());
         this.save(copyExamCard);
+        Long copyExamCardId = copyExamCard.getId();
 
         ExamCardDetail examCardDetail = examCardDetailService.getByCardId(id);
         if (examCardDetail == null) {
             throw ExceptionResultEnum.ERROR.exception("题卡内容不存在");
         }
-// 复制题卡内容
+        // 复制题卡内容
         ExamCardDetail copyExamCardDetail = new ExamCardDetail();
         BeanUtils.copyProperties(examCardDetail, copyExamCardDetail);
         copyExamCardDetail.setId(SystemConstant.getDbUuid());
@@ -490,16 +504,16 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
      *
      * @param examCard 题卡对象
      */
-    private String checkTitle(ExamCard examCard) {
-        QueryWrapper<ExamCard> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(ExamCard::getSchoolId, examCard.getSchoolId())
-                .eq(ExamCard::getCourseCode, examCard.getCourseCode());
+    private String checkTitle(ExamCard examCard, String courseCode) {
         String title;
         int i = 1;
         ExamCard newExamCard;
         do {
             title = examCard.getTitle() + "副本" + i;
-            queryWrapper.lambda().eq(ExamCard::getTitle, title);
+            QueryWrapper<ExamCard> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(ExamCard::getSchoolId, examCard.getSchoolId())
+                    .eq(ExamCard::getCourseCode, courseCode)
+                    .eq(ExamCard::getTitle, title);
             newExamCard = this.getOne(queryWrapper);
             i++;
         } while (newExamCard != null);

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

@@ -345,7 +345,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
             queryWrapper.lambda().in(ExamDetail::getPrintPlanId, printPlanIdList);
         }
         List<ExamDetail> examDetail = this.list(queryWrapper);
-        return examDetail.stream().map(ExamDetail::getExamPlace).distinct().collect(Collectors.toList());
+        return examDetail.stream().filter(m -> StringUtils.isNotBlank(m.getExamPlace())).map(ExamDetail::getExamPlace).distinct().collect(Collectors.toList());
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -362,7 +362,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
             queryWrapper.lambda().in(ExamDetail::getPrintPlanId, printPlanIdList);
         }
         List<ExamDetail> examDetail = this.list(queryWrapper);
-        return examDetail.stream().map(ExamDetail::getExamRoom).distinct().collect(Collectors.toList());
+        return examDetail.stream().filter(m -> StringUtils.isNotBlank(m.getExamRoom())).map(ExamDetail::getExamRoom).distinct().collect(Collectors.toList());
     }
 
     @Transactional
@@ -673,7 +673,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
         // 更新基础学生表和附加数据
         basicStudentService.saveBasicStudentWithExtrasList(basicStudentExtrasParamList, sysUser);
         for (ExamStudent examStudent : examStudentList) {
-            examStudent.setClazzId(String.valueOf(basicClazzService.getOne(new QueryWrapper<BasicClazz>().lambda().eq(BasicClazz::getClazzName,examStudent.getClazzName())).getId()));
+            examStudent.setClazzId(String.valueOf(basicClazzService.getOne(new QueryWrapper<BasicClazz>().lambda().eq(BasicClazz::getClazzName, examStudent.getClazzName())).getId()));
         }
         examStudentService.saveBatch(examStudentList);
 
@@ -800,7 +800,8 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
             clientPrintData.setSchoolId(schoolId);
             clientPrintData.setExamDetailId(examDetailId);
             clientPrintData.setMachineCode(machineCode);
-            clientPrintData.setPagesA3(examDetail.getPagesA3());
+            clientPrintData.setPaperPages(examDetail.getPaperPages());
+            clientPrintData.setCardPages(examDetail.getCardPages());
             clientPrintData.setPagesA4(examDetail.getPagesA4());
             clientPrintData.setCreateId(sysUser.getId());
             clientPrintData.setCreateTime(System.currentTimeMillis());

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

@@ -420,9 +420,11 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
             // 累计a3,a4
             List<ClientPrintData> list = clientPrintDataService.listBySchoolIdAndMachineCode(schoolId, machineCode);
             if (!list.isEmpty()) {
-                int pagesA3 = list.stream().mapToInt(m -> m.getPagesA3()).sum();
-                clientPrintTaskTotalDto.setHostPagesA3(pagesA3 / 2);
-                int pagesA4 = list.stream().mapToInt(m -> m.getPagesA4()).sum();
+                int paperPages = list.stream().mapToInt(ClientPrintData::getPaperPages).sum();
+                clientPrintTaskTotalDto.setHostPaperPages(paperPages / 2);
+                int cardPages = list.stream().mapToInt(ClientPrintData::getCardPages).sum();
+                clientPrintTaskTotalDto.setHostCardPages(cardPages / 2);
+                int pagesA4 = list.stream().mapToInt(ClientPrintData::getPagesA4).sum();
                 clientPrintTaskTotalDto.setHostPagesA4(pagesA4 / 2);
             }
         }

+ 3 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java

@@ -134,7 +134,8 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
                             .set(ExamDetail::getStatus, ExamDetailStatusEnum.NEW)
                             .set(ExamDetail::getAttachmentId, null)
                             .set(ExamDetail::getAttachmentPath, null)
-                            .set(ExamDetail::getPagesA3, null)
+                            .set(ExamDetail::getPaperPages, null)
+                            .set(ExamDetail::getCardPages, null)
                             .set(ExamDetail::getPagesA4, null)
                             .in(ExamDetail::getId, examDetailIds);
                     examDetailService.update(examDetailUpdateWrapper);
@@ -293,7 +294,7 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
                     JSONArray jsonArrayPaper = JSONArray.parseArray(e.getPaperAttachmentIds());
                     for (int i = 0; i < jsonArrayPaper.size(); i++) {
                         JSONObject object = jsonArrayPaper.getJSONObject(i);
-                        object.put("cardId", examCard.getId());
+                        object.put("cardId", String.valueOf(examCard.getId()));
                     }
                     e.setPaperAttachmentIds(jsonArrayPaper.toJSONString());
                 }

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

@@ -1,5 +1,6 @@
 package com.qmth.distributed.print.business.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -939,6 +940,20 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         map.computeIfAbsent(SystemConstant.APPROVE_REMARK, v -> sysUser.getRealName() + "(" + remark + ")" + FlowApprovePassEnum.CANCEL.getTitle());
         map.computeIfAbsent(SystemConstant.APPROVE_SETUP, v -> FlowApproveSetupEnum.SUBMIT.getSetup());
         activitiService.taskApprove(map);
+
+        // 清除cardId
+        ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamTaskId(examTask.getId());
+        String paperAttachmentIds = examTaskDetail.getPaperAttachmentIds();
+        if (StringUtils.isNotBlank(paperAttachmentIds)) {
+            List<JSONObject> objects = JSON.parseArray(paperAttachmentIds, JSONObject.class);
+            for (JSONObject object : objects) {
+                object.put("cardId", "");
+                object.put("cardType", "");
+                object.put("cardTitle", "");
+            }
+            examTaskDetail.setPaperAttachmentIds(JSON.toJSONString(objects));
+            examTaskDetailService.updateById(examTaskDetail);
+        }
         return true;
     }
 
@@ -1546,7 +1561,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                 throw ExceptionResultEnum.ERROR.exception("未查到考试信息");
             }
 
-            BasicCourse basicCourse = basicCourseService.findByCourseCode(examTask.getCourseCode(),schoolId);
+            BasicCourse basicCourse = basicCourseService.findByCourseCode(examTask.getCourseCode(), schoolId);
 
             if (ExamModelEnum.MODEL1.equals(basicExam.getExamModel()) || ExamModelEnum.MODEL2.equals(basicExam.getExamModel())) {
                 // 创建印刷计划
@@ -1591,8 +1606,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                         examDetail.setOrgId(sysUser.getOrgId());
                         examDetail.setPrintPlanId(examPrintPlan.getId());
                         examDetail.setPrintPlanName(examPrintPlan.getName());
-                        examDetail.setExamPlace(StringUtils.isBlank(examDetailList.getExamPlace()) ? "考点" + i : examDetailList.getExamPlace()); // 默认填充班级所在校区
-                        examDetail.setExamRoom(StringUtils.isBlank(examDetailList.getExamRoom()) ? clazzName : examDetailList.getExamRoom()); // 默认填充班级
+                        examDetail.setExamPlace(examDetailList.getExamPlace()); // 无默认值
+                        examDetail.setExamRoom(examDetailList.getExamRoom()); // 无默认值
                         examDetail.setStatus(ExamDetailStatusEnum.NEW);
                         examDetail.setExamStartTime(examDetailParams.getExamStartTime());
                         examDetail.setExamEndTime(examDetailParams.getExamEndTime());
@@ -1728,7 +1743,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         SysOrg schoolOrg = schoolOrgList.get(0);
         List<SysOrg> collegeList = orgList.stream().filter(e -> Objects.equals(schoolOrg.getId(), e.getParentId())).collect(Collectors.toList());
         SysOrg college = new SysOrg();
-        if (collegeList.size() == 1){
+        if (collegeList.size() == 1) {
             college = collegeList.get(0);
         }
 
@@ -1754,7 +1769,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         // ---- 组装Dto
         ExamTaskApprovalFormDto examTaskApprovalFormDto = new ExamTaskApprovalFormDto();
         BasicInfo basicInfo = new BasicInfo();
-        if (Objects.nonNull(college)){
+        if (Objects.nonNull(college)) {
             basicInfo.setCollegeId(college.getId());
             basicInfo.setCollegeName(college.getName());
         }
@@ -1856,15 +1871,20 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public List<ExamTaskStudentObjectResult> findExamTaskStudentObject(ExamObjectType examObjectType, Long basicCourseId, SysUser requestUser) throws Exception {
+    public List<ExamTaskStudentObjectResult> findExamTaskStudentObject(ExamObjectType examObjectType, String courseCode, SysUser requestUser) throws Exception {
         Long schoolId = requestUser.getSchoolId();
         Long userId = requestUser.getId();
         List<ExamTaskStudentObjectResult> result = new ArrayList<>();
         switch (examObjectType) {
             case TEACH_CLAZZ_STUDENT:
-                if (!SystemConstant.longNotNull(basicCourseId)) {
-                    throw ExceptionResultEnum.ERROR.exception("缺少考试课程id");
+                if (!SystemConstant.strNotNull(courseCode)) {
+                    throw ExceptionResultEnum.ERROR.exception("缺少考试课程编号");
                 }
+                BasicCourse basicCourse = basicCourseService.getOne(new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getSchoolId,schoolId).eq(BasicCourse::getCode,courseCode));
+                if (Objects.isNull(basicCourse)){
+                    throw ExceptionResultEnum.ERROR.exception("找不到课程编号对应的课程");
+                }
+                Long basicCourseId = basicCourse.getId();
                 TeachCourse teachCourse = teachCourseService.getOne(new QueryWrapper<TeachCourse>().lambda().eq(TeachCourse::getSchoolId, schoolId).eq(TeachCourse::getBasicCourseId, basicCourseId));
                 if (Objects.nonNull(teachCourse)) {
                     // 教学班对象
@@ -2012,8 +2032,56 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             }
             return finalExcelList;
         });
+        // 校验已经有的考生所在部门的信息是否正确
+        // 导入的excel创建或查询的学生集合
+        List<BasicStudentResult> studentDatasource = basicStudentService.basicStudentList(requestUser.getSchoolId(), null, null, null, null);
+
+        List<ExamStudentImportDto> existStudentList =  examStudentImportDtoList
+                .stream()
+                .filter(e -> studentDatasource.stream().map(BasicStudentResult::getStudentCode).collect(Collectors.toList()).contains(e.getStudentCode()))
+                .collect(Collectors.toList());
+        for (ExamStudentImportDto examStudentImportDto : existStudentList) {
+            String studentName = examStudentImportDto.getStudentName();
+            String studentCode = examStudentImportDto.getStudentCode();
+            String impCollegeName = examStudentImportDto.getCollegeName();
+            String impMajorName = examStudentImportDto.getMajorName();
+            String impClazzName = examStudentImportDto.getClazzName();
+
+
+            List<BasicStudentResult> basicStudentList =  studentDatasource.stream().filter(e -> e.getStudentCode().equals(studentCode)).collect(Collectors.toList());
+            if (basicStudentList.size() != 1){
+                throw ExceptionResultEnum.ERROR.exception("学号为:" + studentCode + "的考生数据异常");
+            }
+            BasicStudentResult basicStudent = basicStudentList.get(0);
+
+            String realityCollegeName = basicStudent.getCollegeName();
+            String realityMajorName = basicStudent.getMajorName();
+            String realityClazzName = basicStudent.getClazz();
+
+            // 学院核对
+            if (!impCollegeName.equals(realityCollegeName)){
+                throw ExceptionResultEnum.ERROR.exception("导入的考生【" + studentName + "(" + studentCode + ")】所在学院【" + impCollegeName +
+                        "】与该考生实际所在学院【" + realityCollegeName + "】不符,请检验excel数据是否异常或联系管理员核对");
+            }
+
+            // 专业核对
+            if (!impMajorName.equals(realityMajorName)){
+                throw ExceptionResultEnum.ERROR.exception("导入的考生【" + studentName + "(" + studentCode + ")】所在专业【" + impMajorName +
+                        "】与该考生实际所在专业【" + realityMajorName + "】不符,请检验excel数据是否异常或联系管理员核对");
+            }
+
+            // 班级核对
+            if (!impClazzName.equals(realityClazzName)){
+                throw ExceptionResultEnum.ERROR.exception("导入的考生【" + studentName + "(" + studentCode + ")】所在班级【" + impClazzName +
+                        "】与该考生实际所在班级【" + realityClazzName + "】不符,请检验excel数据是否异常或联系管理员核对");
+            }
+        }
+        // 去掉已存在的学生集合
+        List<ExamStudentImportDto> willAddStudentList = new ArrayList<>(examStudentImportDtoList);
+        willAddStudentList.removeAll(existStudentList);
+
         // 创建基础学生信息
-        List<BasicStudentExtrasParam> basicStudentExtrasParamList = examStudentImportDtoList.stream().flatMap(e -> {
+        List<BasicStudentExtrasParam> basicStudentExtrasParamList = willAddStudentList.stream().flatMap(e -> {
             BasicStudentExtrasParam basicStudentExtrasParam = new BasicStudentExtrasParam();
             basicStudentExtrasParam.setStudentName(e.getStudentName());
             basicStudentExtrasParam.setStudentCode(e.getStudentCode());
@@ -2030,30 +2098,30 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         List<ExamTaskExamStudentImportResult> result = new ArrayList<>();
 
         List<String> studentCodeDatasource = examStudentImportDtoList.stream().map(ExamStudentImportDto::getStudentCode).distinct().collect(Collectors.toList());
-        List<String> examRoomDatasource = examStudentImportDtoList.stream().map(ExamStudentImportDto::getExamRoom).distinct().collect(Collectors.toList());
         // 导入的excel创建或查询的学生集合
         List<BasicStudentResult> basicStudentResultDatasource = basicStudentService.basicStudentList(requestUser.getSchoolId(), null, null, null, studentCodeDatasource);
 
-        for (String examRoom : examRoomDatasource) {
-            // 考点
-            List<String> examPlaceList = examStudentImportDtoList
-                    .stream()
-                    .filter(e -> examRoom.equals(e.getExamRoom()))
-                    .map(ExamStudentImportDto::getExamPlace)
-                    .distinct()
-                    .collect(Collectors.toList());
-            if (examPlaceList.size() > 1) {
-                throw ExceptionResultEnum.ERROR.exception("异常:考场对应多个考点");
-            }
-            String examPlace = examPlaceList.get(0);
+        // 考试对象键(考点、考场)
+        List<Map<String,String>> examObjectKeyList = examStudentImportDtoList.stream().flatMap(e -> {
+            Map<String,String> key = new HashMap<>();
+            key.put("examPlace",e.getExamPlace());
+            key.put("examRoom",e.getExamRoom());
+            return Stream.of(key);
+        }).distinct().collect(Collectors.toList());
 
+        for (Map<String,String> key : examObjectKeyList) {
+            // 考点
+            String examPlace = key.get("examPlace");
+            // 考场
+            String examRoom = key.get("examRoom");
 
-            // 该考场学号集合
+            // 该考试对象考生考号集合
             List<String> studentCodeList = examStudentImportDtoList.stream()
-                    .filter(e -> examRoom.equals(e.getExamRoom()))
+                    .filter(e -> examPlace.equals(e.getExamPlace()) && examRoom.equals(e.getExamRoom()))
                     .map(ExamStudentImportDto::getStudentCode)
                     .distinct()
                     .collect(Collectors.toList());
+
             List<ExamTaskStudentObjectResult> examTaskStudentObjectResultList = new ArrayList<>();
             List<BasicStudentResult> basicStudentResultList = basicStudentResultDatasource.stream().filter(e -> studentCodeList.contains(e.getStudentCode())).collect(Collectors.toList());
             List<Long> basicClazzIdList = basicStudentResultList.stream().map(BasicStudentResult::getClazzId).distinct().collect(Collectors.toList());
@@ -2077,13 +2145,14 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                 examTaskStudentObjectResult.setStudentInfoList(studentInfoList);
                 examTaskStudentObjectResult.setStudentClazzType(ExamObjectType.IMPORT_STUDENT.getStudentClazzType());
                 examTaskStudentObjectResultList.add(examTaskStudentObjectResult);
-
             }
 
 
             ExamTaskExamStudentImportResult examTaskExamStudentImportResult = new ExamTaskExamStudentImportResult();
             examTaskExamStudentImportResult.setExamRoom(examRoom);
-            examTaskExamStudentImportResult.setExamPlace(examPlace);
+            if (SystemConstant.strNotNull(examPlace)) {
+                examTaskExamStudentImportResult.setExamPlace(examPlace);
+            }
             examTaskExamStudentImportResult.setExamTaskStudentObjectResultList(examTaskStudentObjectResultList);
             result.add(examTaskExamStudentImportResult);
         }

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

@@ -752,12 +752,12 @@ public class PrintCommonServiceImpl implements PrintCommonService {
     @Override
     public List<BasicCourse> list(String param, List<Long> printPlanIdList, Long teachingRoomId) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
-        Set<Long> orgIds = null;
-        if (Objects.nonNull(teachingRoomId)) {
+        Set<Long> orgIds = teachcloudCommonService.listSubOrgIds(teachingRoomId);
+        /*if (Objects.nonNull(teachingRoomId)) {
             orgIds = new HashSet<>(Arrays.asList(teachingRoomId));
         } else {
             orgIds = teachcloudCommonService.listSubOrgIds(teachingRoomId);
-        }
+        }*/
         if (printPlanIdList.size() == 0) {
             QueryWrapper<BasicCourse> queryWrapper = new QueryWrapper<>();
             queryWrapper.lambda().eq(BasicCourse::getSchoolId, schoolId)

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

@@ -653,9 +653,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
 //        UploadFileEnum.FILE/
         LocalDateTime nowTime = LocalDateTime.now();
         StringJoiner stringJoiner = new StringJoiner("");
-        stringJoiner.add(dictionaryConfig.fssLocalFileDomain().getConfig()).add(File.separator);
         stringJoiner.add(UploadFileEnum.FILE.getTitle()).add(File.separator);
-
         stringJoiner.add(String.valueOf(nowTime.getYear())).add(File.separator)
                 .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
                 .add(String.format("%02d", nowTime.getDayOfMonth()));
@@ -671,6 +669,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
             jsonObject.put(SystemConstant.TYPE, SystemConstant.OSS);
             jsonObject.put(SystemConstant.PATH, dirName);
         } else {
+            dirName = (dictionaryConfig.fssLocalFileDomain().getConfig() + File.separator + dirName).replaceAll("\\\\", "/");
             fileStoreUtil.copyInputStreamToFile(in, new File(stringJoiner.toString()), DigestUtils.md5Hex(new ByteArrayInputStream(outputStream.toByteArray())), LocalCatalogEnum.LOCAL_FILE);
             jsonObject.put(SystemConstant.TYPE, SystemConstant.LOCAL);
             jsonObject.put(SystemConstant.PATH, dirName);
@@ -925,10 +924,11 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                             .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
                             .add(String.format("%02d", nowTime.getDayOfMonth()))
                             .add(File.separator).add(SystemConstant.getUuid()).add(SystemConstant.ZIP_PREFIX);
+
                     File zipFile = new File(stringJoiner.toString() + dirName.toString());
                     if (!zipFile.getParentFile().exists()) {
                         zipFile.getParentFile().mkdirs();
-                        zipFile.createNewFile();
+//                        zipFile.createNewFile();
                     }
 
                     boolean oss = dictionaryConfig.sysDomain().isOss();
@@ -949,7 +949,9 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                         }
                         sourceFiles.add(htmlFile);
                     }
-                    FileUtil.doZip(zipFile, sourceFiles);
+//                    FileUtil.doZip(zipFile, sourceFiles);
+
+                    Zip4jUtil.zipEncryptFile(zipFile.getPath(), sourceFiles, SystemConstant.ZIP_ENCRYPT_PWD);
                     String ossDirName = dirName.toString().replaceAll("\\\\", "/");
                     JSONObject jsonObject = new JSONObject();
                     if (oss) {//上传至oss
@@ -1842,33 +1844,6 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                 // 文件路径
                 String filePath = zipLocalRootPath + File.separator + course + File.separator + paperNumber + File.separator;
 
-                Long examCardId = paperCellList.get(0).getExamCardId();
-                Long cardRuleId = paperCellList.get(0).getCardRuleId();
-                ExamCard examCard = examCardService.getById(examCardId);
-                ExamCardDetail examCardDetail = examCardDetailService.getByCardId(examCardId);
-                String htmlContent;
-                if (MakeMethodEnum.SELECT.equals(examCard.getMakeMethod()) && CardCreateMethodEnum.UPLOAD.equals(examCard.getCreateMethod())) {
-                    htmlContent = createPdfUtil.resetHtmlTemplateBar(examCardDetail.getHtmlContent());
-                } else {
-                    BasicCardRule basicCardRule = basicCardRuleService.getById(cardRuleId);
-                    htmlContent = createPdfUtil.replaceHtmlCard(examCardDetail, basicCardRule);
-                }
-
-
-                byte[] bytes = htmlContent.getBytes();
-                String cardName = "题卡-";
-                if (namedByCourseInfo) {
-                    cardName = cardName + course;
-                }
-                if (namedByPaperNumber) {
-                    cardName = cardName + paperNumber;
-                }
-                if (namedByOriginalFile) {
-                    cardName = cardName + examCardService.getById(examCardId).getTitle();
-                }
-                String cardLocalHtmlPath = filePath + cardName + SystemConstant.HTML_PREFIX;
-                String cardLocalPdfPath = filePath + cardName + SystemConstant.PDF_PREFIX;
-
                 // 试卷文件曝光度筛选
                 if (Objects.nonNull(paperFileDownloadExposureStatus)) {
                     switch (paperFileDownloadExposureStatus) {
@@ -1898,19 +1873,48 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                 }
                 switch (paperFileDownloadContent) {
                     case ONLY_CARD: // 只下载题卡
-                        File localFile = new File(cardLocalHtmlPath);
-                        if (!localFile.getParentFile().exists()) {
-                            boolean mkr = localFile.getParentFile().mkdirs();
-                        }
-                        FileCopyUtils.copy(bytes, localFile);
+                        for (ExamTaskPaperFileDto examTaskPaperFileDto : paperCellList) {
+                            Long examCardId = examTaskPaperFileDto.getExamCardId();
+                            Long cardRuleId = examTaskPaperFileDto.getCardRuleId();
+                            ExamCard examCard = examCardService.getById(examCardId);
+                            ExamCardDetail examCardDetail = examCardDetailService.getByCardId(examCardId);
+                            String htmlContent;
+                            if (MakeMethodEnum.SELECT.equals(examCard.getMakeMethod()) && CardCreateMethodEnum.UPLOAD.equals(examCard.getCreateMethod())) {
+                                htmlContent = createPdfUtil.resetHtmlTemplateBar(examCardDetail.getHtmlContent());
+                            } else {
+                                BasicCardRule basicCardRule = basicCardRuleService.getById(cardRuleId);
+                                htmlContent = createPdfUtil.replaceHtmlCard(examCardDetail, basicCardRule);
+                            }
+
+                            byte[] bytes = htmlContent.getBytes();
+                            String cardName = "题卡-";
+                            if (namedByCourseInfo) {
+                                cardName = cardName + course;
+                            }
+                            if (namedByPaperNumber) {
+                                cardName = cardName + paperNumber;
+                            }
+                            if (namedByOriginalFile) {
+                                cardName = cardName + examCardService.getById(examCardId).getTitle();
+                            }
+                            cardName = cardName + "-" + examTaskPaperFileDto.getPaperType();
+                            String cardLocalHtmlPath = filePath + cardName + SystemConstant.HTML_PREFIX;
+                            String cardLocalPdfPath = filePath + cardName + SystemConstant.PDF_PREFIX;
+
+                            File localFile = new File(cardLocalHtmlPath);
+                            if (!localFile.getParentFile().exists()) {
+                                boolean mkr = localFile.getParentFile().mkdirs();
+                            }
+                            FileCopyUtils.copy(bytes, localFile);
 
-                        File pdfFile = new File(cardLocalPdfPath);
-                        if (!pdfFile.exists()) {
-                            boolean cf = pdfFile.createNewFile();
+                            File pdfFile = new File(cardLocalPdfPath);
+                            if (!pdfFile.exists()) {
+                                boolean cf = pdfFile.createNewFile();
+                            }
+                            HtmlToPdfUtil.convert(cardLocalHtmlPath, cardLocalPdfPath, PageSizeEnum.A3);
+                            specialSuccessMessage = "";
+                            courseCount = 1;
                         }
-                        HtmlToPdfUtil.convert(cardLocalHtmlPath, cardLocalPdfPath, PageSizeEnum.A3);
-                        specialSuccessMessage = "";
-                        courseCount = 1;
                         break;
                     case ONLY_PAPER: // 只下载试卷
                         for (ExamTaskPaperFileDto examTaskPaperFileDto : paperCellList) {
@@ -1936,20 +1940,47 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                         }
                         break;
                     case PAPER_AND_CARD: // 全部下载
-                        // 题卡
-                        File localCardFile = new File(cardLocalHtmlPath);
-                        if (!localCardFile.getParentFile().exists()) {
-                            boolean mkr = localCardFile.getParentFile().mkdirs();
-                        }
-                        FileCopyUtils.copy(bytes, localCardFile);
-
-                        File cardPdfFile = new File(cardLocalPdfPath);
-                        if (!cardPdfFile.exists()) {
-                            boolean cf = cardPdfFile.createNewFile();
-                        }
-                        HtmlToPdfUtil.convert(cardLocalHtmlPath, cardLocalPdfPath, PageSizeEnum.A3);
-                        // 试卷
                         for (ExamTaskPaperFileDto examTaskPaperFileDto : paperCellList) {
+                            // 题卡
+                            Long examCardId = examTaskPaperFileDto.getExamCardId();
+                            Long cardRuleId = examTaskPaperFileDto.getCardRuleId();
+                            ExamCard examCard = examCardService.getById(examCardId);
+                            ExamCardDetail examCardDetail = examCardDetailService.getByCardId(examCardId);
+                            String htmlContent;
+                            if (MakeMethodEnum.SELECT.equals(examCard.getMakeMethod()) && CardCreateMethodEnum.UPLOAD.equals(examCard.getCreateMethod())) {
+                                htmlContent = createPdfUtil.resetHtmlTemplateBar(examCardDetail.getHtmlContent());
+                            } else {
+                                BasicCardRule basicCardRule = basicCardRuleService.getById(cardRuleId);
+                                htmlContent = createPdfUtil.replaceHtmlCard(examCardDetail, basicCardRule);
+                            }
+
+                            byte[] bytes = htmlContent.getBytes();
+                            String cardName = "题卡-";
+                            if (namedByCourseInfo) {
+                                cardName = cardName + course;
+                            }
+                            if (namedByPaperNumber) {
+                                cardName = cardName + paperNumber;
+                            }
+                            if (namedByOriginalFile) {
+                                cardName = cardName + examCardService.getById(examCardId).getTitle();
+                            }
+                            cardName = cardName + "-" + examTaskPaperFileDto.getPaperType();
+                            String cardLocalHtmlPath = filePath + cardName + SystemConstant.HTML_PREFIX;
+                            String cardLocalPdfPath = filePath + cardName + SystemConstant.PDF_PREFIX;
+                            File localCardFile = new File(cardLocalHtmlPath);
+                            if (!localCardFile.getParentFile().exists()) {
+                                boolean mkr = localCardFile.getParentFile().mkdirs();
+                            }
+                            FileCopyUtils.copy(bytes, localCardFile);
+
+                            File cardPdfFile = new File(cardLocalPdfPath);
+                            if (!cardPdfFile.exists()) {
+                                boolean cf = cardPdfFile.createNewFile();
+                            }
+                            HtmlToPdfUtil.convert(cardLocalHtmlPath, cardLocalPdfPath, PageSizeEnum.A3);
+
+                            // 试卷
                             String paperName = "试卷-";
                             if (namedByCourseInfo) {
                                 paperName = paperName + course;

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

@@ -651,7 +651,14 @@ public class CreatePdfUtil {
                 Map<String, String> basicMap = new HashMap<>();
                 basicMap.put("code", code);
                 basicMap.put("name", name);
-                basicMap.put("value", examDetail.getExamRoom());
+                StringJoiner stringJoiner = new StringJoiner("");
+                if(StringUtils.isNotBlank(examDetail.getExamPlace())){
+                    stringJoiner.add(examDetail.getExamPlace());
+                }
+                if(StringUtils.isNotBlank(examDetail.getExamRoom())){
+                    stringJoiner.add(examDetail.getExamRoom());
+                }
+                basicMap.put("value", stringJoiner.toString());
                 basicPlate.add(basicMap);
             } else if ("examCount".equals(code)) {
                 Map<String, String> basicMap = new HashMap<>();
@@ -1067,7 +1074,8 @@ public class CreatePdfUtil {
             }
             examDetail.setCardAttachmentId(basicAttachment.getId());
         }
-        examDetail.setPagesA3(PdfUtil.getPdfPages(localPaperPdfFile));
+        examDetail.setPaperPages(PdfUtil.getPdfPages(localPaperPdfFile));
+        examDetail.setCardPages(PdfUtil.getPdfPages(localA3PdfCardFile));
         examDetail.setPagesA4(PdfUtil.getPdfPages(localA4PdfFile));
         if (PrintMethodEnum.AUTO == basicExamRule.getPrintMethod()) {
             examDetail.setStatus(ExamDetailStatusEnum.WAITING);

+ 19 - 17
distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/CreatePrintPdfUtil.java

@@ -1,13 +1,9 @@
 package com.qmth.distributed.print.business.util;
 
-import com.alibaba.fastjson.JSONObject;
 import com.itextpdf.text.*;
 import com.itextpdf.text.pdf.*;
 import com.qmth.distributed.print.business.bean.dto.PdfPackageDto;
 import com.qmth.distributed.print.business.bean.dto.PdfSignDto;
-import com.qmth.distributed.print.business.service.PrintCommonService;
-import com.qmth.teachcloud.common.contant.SpringContextHolder;
-import com.qmth.teachcloud.common.enums.ClassifyEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -126,7 +122,7 @@ public class CreatePrintPdfUtil {
         // 条码
         Image code128Image = PdfFillUtils.createBarcode(pdfWriter, pdfFillDto.getPackageNumber(), false, null, null);
         code128Image.scalePercent(100);
-        titleTable.addCell(PdfFillUtils.createCell(code128Image, 50f, 15, 3));
+        titleTable.addCell(PdfFillUtils.createCell(code128Image, 50f, Element.ALIGN_RIGHT, 15, 3, 1));
         document.add(titleTable);
 
 
@@ -134,7 +130,7 @@ public class CreatePrintPdfUtil {
         PdfPTable basicTable = PdfFillUtils.createTable(6);
         List<Map<String, String>> basicPlate = pdfFillDto.getBasicPlate();
         for (Map<String, String> stringMap : basicPlate) {
-            basicTable.addCell(PdfFillUtils.createCell(stringMap.get("name") + ":" + stringMap.get("value"), PdfFillUtils.textFont12, null, 16f, Element.ALIGN_LEFT, 0, 1, 3));
+            basicTable.addCell(PdfFillUtils.createCell(stringMap.get("name") + ":" + stringMap.get("value"), PdfFillUtils.textFont12, null, 0f, Element.ALIGN_LEFT, 0, 1, 3));
         }
         if (basicPlate.size() % 2 > 0) {
             basicTable.addCell(PdfFillUtils.createCell(" ", PdfFillUtils.textFont12, null, 16f, Element.ALIGN_LEFT, 0, 1, 3));
@@ -230,23 +226,29 @@ public class CreatePrintPdfUtil {
             // 空格
             Paragraph blank = new Paragraph(" ");
             // 标题table
-            PdfPTable titleTable = PdfFillUtils.createTable(new float[]{33, 34, 33});
-            titleTable.addCell(PdfFillUtils.createCell("", null, null, 50f, Element.ALIGN_CENTER, 15, 3, 1));
-            titleTable.addCell(PdfFillUtils.createCell(pdfPackageDto.getTitle(), PdfFillUtils.textFont28, null, 50f, Element.ALIGN_CENTER, 15, 3, 1));
+            PdfPTable titleTable = PdfFillUtils.createTable(new float[]{80, 20});
+
             // 条码
             Image code128Image = PdfFillUtils.createBarcode(pdfWriter, pdfPackageDto.getPackageNumber(), false, null, null);
             code128Image.scalePercent(100);
-            titleTable.addCell(PdfFillUtils.createCell(code128Image, 50f, 15, 3));
-            document.add(titleTable);
+            titleTable.setPaddingTop(1);
+            titleTable.addCell(PdfFillUtils.createCell("", null, null, 40f, Element.ALIGN_CENTER, 15, 1, 1));
+            titleTable.addCell(PdfFillUtils.createCell(code128Image, 30f, Element.ALIGN_CENTER, 15, 1, 1));
 
+            titleTable.addCell(PdfFillUtils.createCell(pdfPackageDto.getTitle(), PdfFillUtils.textFont28, null, 50f, Element.ALIGN_CENTER, 15, 1, 2));
+            // 条码
+            document.add(titleTable);
+            document.add(blank);
+            document.add(blank);
             document.add(blank);
 
             // 基础信息表格
-            PdfPTable basicTable = PdfFillUtils.createTable(1);
+            PdfPTable basicTable = PdfFillUtils.createTable(new float[]{20, 3, 77});
             List<Map<String, String>> basicPlate = pdfPackageDto.getBasicPlate();
             for (Map<String, String> stringMap : basicPlate) {
-                basicTable.addCell(PdfFillUtils.createCell(stringMap.get("name") + ":" + stringMap.get("value"), PdfFillUtils.textFont24, 50f, Element.ALIGN_LEFT, 20f));
-                document.add(blank);
+                basicTable.addCell(PdfFillUtils.createCell(stringMap.get("name"), PdfFillUtils.textFont24, 50f, Element.ALIGN_JUSTIFIED_ALL, 0f));
+                basicTable.addCell(PdfFillUtils.createCell(": ", PdfFillUtils.textFont24, 50f, Element.ALIGN_JUSTIFIED_ALL, 0f));
+                basicTable.addCell(PdfFillUtils.createCell(stringMap.get("value"), PdfFillUtils.textFont24, 50f, Element.ALIGN_LEFT, 0f));
             }
             document.add(basicTable);
             document.add(blank);
@@ -281,11 +283,11 @@ public class CreatePrintPdfUtil {
         } else if (size == 2) {
             columnWidth = new float[]{20, 30, 20, 30};
         } else if (size == 3) {
-            columnWidth = new float[]{10, 25, 25, 10, 25, 25};
+            columnWidth = new float[]{15, 20, 15, 15, 20, 15};
         } else if (size == 4) {
-            columnWidth = new float[]{6, 12, 16, 16, 6, 12, 16, 16};
+            columnWidth = new float[]{12, 13, 13, 12, 12, 13, 13, 12};
         } else if (size == 5) {
-            columnWidth = new float[]{6, 10, 11, 12, 11, 6, 10, 11, 12, 11};
+            columnWidth = new float[]{10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
         } else if (size == 6) {
             columnWidth = new float[]{6, 9, 9, 9, 9, 8, 6, 9, 9, 9, 9, 8};
         } else {

+ 7 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/PdfFillUtils.java

@@ -214,14 +214,13 @@ public class PdfFillUtils {
         cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
         cell.setHorizontalAlignment(horizontalAlignment);
         cell.setUseAscender(true);
+        cell.setPaddingTop(10f);
+        cell.setPaddingBottom(10f);
         if (font != null) {
             cell.setPhrase(new Phrase(value, font));
         } else {
             cell.setPhrase(new Phrase(value));
         }
-        if (fixedHeight > 0) {
-            cell.setFixedHeight(fixedHeight);
-        }
         cell.disableBorderSide(15);
         if (paddingLeft > 0) {
             cell.setPaddingLeft(paddingLeft);
@@ -235,12 +234,12 @@ public class PdfFillUtils {
      * @param image       cell内容
      * @param fixedHeight 垂直对齐方式
      */
-    public static PdfPCell createCell(Image image, float fixedHeight, int disableBorderSide, int rowspan) {
+    public static PdfPCell createCell(Image image, float fixedHeight, int horizontalAlignment, int disableBorderSide, int rowspan, int colspan) {
         PdfPCell cell = new PdfPCell(image);
         cell.setBorderWidth(0.1F);
         cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
         cell.setUseAscender(true);
-        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
+        cell.setHorizontalAlignment(horizontalAlignment);
 //        cell.setExtraParagraphSpace(10);
         if (fixedHeight > 0) {
             cell.setFixedHeight(fixedHeight);
@@ -251,6 +250,9 @@ public class PdfFillUtils {
         if (rowspan > 0) {
             cell.setRowspan(rowspan);
         }
+        if (colspan > 0) {
+            cell.setColspan(colspan);
+        }
         return cell;
     }
 

+ 1 - 2
distributed-print-business/src/main/resources/db/1、init-table.sql

@@ -1361,8 +1361,7 @@ CREATE TABLE `sys_privilege` (
                                  `enable` tinyint NOT NULL DEFAULT '1' COMMENT '是否启用,0:停用,1:启用',
                                  `default_auth` tinyint DEFAULT '1' COMMENT '默认权限,0:否,1:是',
                                  `front_display` tinyint(1) DEFAULT '1' COMMENT '是否前端展示',
-                                 PRIMARY KEY (`id`) USING BTREE,
-                                 UNIQUE KEY `privilege_index` (`name`,`url`,`type`) USING BTREE
+                                 PRIMARY KEY (`id`) USING BTREE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='菜单权限表';
 
 -- ----------------------------

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

@@ -52,8 +52,13 @@
             *
         FROM
             basic_print_config a
+                JOIN
+            basic_template_org b ON a.school_id = b.school_id
+                AND a.id = b.rule_id
         WHERE
             a.school_id = #{schoolId}
           AND a.exam_id = #{examId}
+          AND b.org_id = #{orgId}
+          AND b.type = #{type}
     </select>
 </mapper>

+ 5 - 3
distributed-print-business/src/main/resources/mapper/ExamCardMapper.xml

@@ -111,7 +111,7 @@
     </select>
     <select id="listGenericCard" resultType="com.qmth.distributed.print.business.entity.ExamCard">
         SELECT
-            distinct a.id, a.title, a.type
+            distinct a.id, a.title, a.type, a.make_method makeMethod, a.create_method createMethod
         FROM
             exam_card a
         WHERE
@@ -125,7 +125,7 @@
     </select>
     <select id="listCustom" resultType="com.qmth.distributed.print.business.entity.ExamCard">
         SELECT
-            a.id, a.title, a.type, a.create_id createId
+            a.id, a.title, a.type, a.create_id createId, a.make_method makeMethod, a.create_method createMethod
         FROM
             exam_card a
         WHERE
@@ -136,8 +136,10 @@
                 1
             FROM
                 exam_task_detail b
+                    LEFT JOIN exam_task et on b.exam_task_id = et.id
+                    LEFT JOIN t_f_flow_approve e ON et.flow_id = e.flow_id
             WHERE
-                FIND_IN_SET(a.id, REPLACE(substring_index(substring_index(CONVERT((b.paper_attachment_ids ->>'$[*].cardId') USING utf8), ']', 1), '[',-1),'"','')))
+                e.status != 'CANCEL' and FIND_IN_SET(a.id, REPLACE(substring_index(substring_index(CONVERT((b.paper_attachment_ids ->>'$[*].cardId') USING utf8), ']', 1), '[',-1),'"','')))
         order by a.create_time desc
     </select>
     <select id="getCardDetailBySelect" resultType="com.qmth.distributed.print.business.bean.dto.CardDetailDto">

+ 6 - 3
distributed-print-business/src/main/resources/mapper/ExamDetailMapper.xml

@@ -38,7 +38,8 @@
             b.exam_place examPlace,
             b.exam_room examRoom,
             b.total_subjects totalSubjects,
-            ifnull(b.pages_a3, 0) pagesA3,
+            ifnull(b.paper_pages, 0) paperPages,
+            ifnull(b.card_pages, 0) cardPages,
             ifnull(b.pages_a4, 0) pagesA4,
             c.singlePagesA3,
             b.status,
@@ -349,9 +350,11 @@
         SELECT
             ifnull(count(b.package_code), 0) packageCount,
             ifnull(sum(b.total_subjects), 0) totalSubjects,
-            ifnull(sum(ifnull(b.pages_a3, 0)), 0)/2 pagesA3,
+            ifnull(sum(ifnull(b.paper_pages, 0)), 0)/2 paperPages,
+            ifnull(sum(ifnull(b.card_pages, 0)), 0)/2 cardPages,
             ifnull(sum(ifnull(b.pages_a4, 0)), 0) /2 pagesA4,
-            ifnull(sum(case b.status when 'FINISH' then 0 else ifnull(b.pages_a3, 0) end),0)/2 pagesA3Left,
+            ifnull(sum(case b.status when 'FINISH' then 0 else ifnull(b.paper_pages, 0) end),0)/2 paperPagesLeft,
+            ifnull(sum(case b.status when 'FINISH' then 0 else ifnull(b.card_pages, 0) end),0)/2 cardPagesLeft,
             ifnull(sum(case b.status when 'FINISH' then 0 else ifnull(b.pages_a4, 0) end),0)/2 pagesA4Left
         FROM
             exam_print_plan a

+ 21 - 9
distributed-print-business/src/main/resources/mapper/ExamPrintPlanMapper.xml

@@ -211,9 +211,10 @@
             b.exam_place examPlace,
             b.exam_room examRoom,
             b.total_subjects totalSubjects,
-            IFNULL(b.pages_a3, 0) pagesA3,
+            IFNULL(b.paper_pages, 0) paperPages,
+            IFNULL(b.card_pages, 0) cardPages,
             IFNULL(b.pages_a4, 0) pagesA4,
-            case b.status when 'FINISH' then IFNULL(b.pages_a3, 0)+IFNULL(b.pages_a4, 0) else 0 end totalPrint,
+            case b.status when 'FINISH' then IFNULL(b.paper_pages, 0)+IFNULL(b.card_pages, 0)+IFNULL(b.pages_a4, 0) else 0 end totalPrint,
             c.singlePagesA3,
             b.status,
             ifnull(b.validate, false) validate,
@@ -312,9 +313,11 @@
         SELECT
             ifnull(count(b.package_code), 0) packageCount,
             ifnull(sum(b.total_subjects), 0) totalSubjects,
-            ifnull(sum(ifnull(b.pages_a3, 0)), 0)/2 pagesA3,
+            ifnull(sum(ifnull(b.paper_pages, 0)), 0)/2 paperPages,
+            ifnull(sum(ifnull(b.card_pages, 0)), 0)/2 cardPages,
             ifnull(sum(ifnull(b.pages_a4, 0)), 0) /2 pagesA4,
-            ifnull(sum(case b.status when 'FINISH' then 0 else ifnull(b.pages_a3, 0) end),0)/2 pagesA3Left,
+            ifnull(sum(case b.status when 'FINISH' then 0 else ifnull(b.paper_pages, 0) end),0)/2 paperPagesLeft,
+            ifnull(sum(case b.status when 'FINISH' then 0 else ifnull(b.card_pages, 0) end),0)/2 cardPagesLeft,
             ifnull(sum(case b.status when 'FINISH' then 0 else ifnull(b.pages_a4, 0) end),0)/2 pagesA4Left
         FROM
             exam_print_plan a
@@ -417,8 +420,12 @@
             END) totalSubjectsLeft,
             SUM(CASE b.status
                 WHEN 'FINISH' THEN 0
-                ELSE b.pages_a3
-            END) pagesA3Left,
+                ELSE b.paper_pages
+            END) paperPagesLeft,
+            SUM(CASE b.status
+                WHEN 'FINISH' THEN 0
+                ELSE b.card_pages
+            END) cardPagesLeft,
             SUM(CASE b.status
                 WHEN 'FINISH' THEN 0
                 ELSE b.pages_a4
@@ -477,12 +484,17 @@
             COUNT(b.package_code) packageCount,
             GROUP_CONCAT(c.paper_type) paperNumberAndType,
             SUM(b.total_subjects) totalSubjects,
-            SUM(ifnull(b.pages_a3,0))/2 pagesA3,
+            SUM(ifnull(b.paper_pages,0))/2 paperPages,
+            SUM(ifnull(b.card_pages,0))/2 cardPages,
             SUM(ifnull(b.pages_a4,0))/2 pagesA4,
             SUM(CASE b.status
                 WHEN 'FINISH' THEN 0
-                ELSE ifnull(b.pages_a3, 0)
-            END)/2 pagesA3Left,
+                ELSE ifnull(b.paper_pages, 0)
+            END)/2 paperPagesLeft,
+            SUM(CASE b.status
+                WHEN 'FINISH' THEN 0
+                ELSE ifnull(b.card_pages, 0)
+            END)/2 cardPagesLeft,
             SUM(CASE b.status
                 WHEN 'FINISH' THEN 0
                 ELSE ifnull(b.pages_a4,0)

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

@@ -1112,8 +1112,8 @@
             IFNULL(b.exposed_paper_type,'') exposedPaperType,
             IFNULL(b.unexposed_paper_type,'') unexposedPaperType,
             so.name orgName,
-            REPLACE(substring_index(substring_index(CONVERT((b.paper_attachment_ids ->>'$[*].cardId')
-            USING utf8), ']', 1), '[',-1) examCardId,
+#             REPLACE(substring_index(substring_index(CONVERT((b.paper_attachment_ids ->>'$[*].cardId')
+#             USING utf8), ']', 1), '[',-1) examCardId,
             b.paper_attachment_ids paperAttachmentIds
         FROM
             exam_task a

+ 5 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/ClientController.java

@@ -1,6 +1,5 @@
 package com.qmth.distributed.print.api;
 
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.boot.api.annotation.Aac;
@@ -74,10 +73,14 @@ public class ClientController {
         QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
         wrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId()).eq(SysUser::getLoginName, login.getLoginName());
         SysUser sysUser = sysUserService.getOne(wrapper);
-        //用户不存在
+        // 用户不存在
         if (Objects.isNull(sysUser)) {
             throw ExceptionResultEnum.USER_NO_DATA.exception();
         }
+        // 校验密码
+        if (!Objects.equals(sysUser.getPassword(), login.getPassword())) {
+            throw ExceptionResultEnum.PASSWORD_ERROR.exception();
+        }
         // 是否有客户端权限
         clientService.checkPrivilege(sysUser.getId());
 

+ 3 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamCardController.java

@@ -203,8 +203,9 @@ public class ExamCardController {
      */
     @ApiOperation(value = "复制题卡")
     @RequestMapping(value = "/copy", method = RequestMethod.POST)
-    public Result copyCard(Long id) {
-        Long copyCardId = examCardService.copyCard(id);
+    public Result copyCard(@RequestParam(value = "id") String id,
+                           @RequestParam(value = "courseCode") String courseCode) {
+        Long copyCardId = examCardService.copyCard(SystemConstant.convertIdToLong(id),courseCode);
         return ResultUtil.ok(String.valueOf(copyCardId), "");
     }
 }

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

@@ -854,9 +854,9 @@ public class ExamTaskController {
     @Transactional(rollbackFor = Exception.class)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     public Result findExamTaskStudentObject(@RequestParam ExamObjectType examObjectType,
-                                            @RequestParam(required = false) String basicCourseId) throws Exception {
+                                            @RequestParam(required = false) String courseCode) throws Exception {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(examTaskService.findExamTaskStudentObject(examObjectType, SystemConstant.convertIdToLong(basicCourseId), requestUser));
+        return ResultUtil.ok(examTaskService.findExamTaskStudentObject(examObjectType, courseCode, requestUser));
     }
 
     @ApiOperation(value = "入库申请-导入考生对象")

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

@@ -82,9 +82,6 @@ public class SysController {
     @Resource
     TeachcloudCommonService teachcloudCommonService;
 
-    @Resource
-    SysOrgService sysOrgService;
-
     @Resource
     BasicMajorService basicMajorService;
 
@@ -577,17 +574,22 @@ public class SysController {
         List<DictionaryResult> dictionaryResultList = new ArrayList<>();
         switch (dictionaryEnum) {
             case SEMESTER:
-                List<BasicSemester> basicSemesterList = basicSemesterService.list(new QueryWrapper<BasicSemester>().lambda().eq(BasicSemester::getSchoolId, schoolId).eq(BasicSemester::getEnable, true));
+                List<BasicSemester> basicSemesterList = basicSemesterService.list(new QueryWrapper<BasicSemester>()
+                        .lambda()
+                        .eq(BasicSemester::getSchoolId, schoolId)
+                        .eq(BasicSemester::getEnable, true)
+                        .orderByDesc(BasicSemester::getInUsed));
                 dictionaryResultList = basicSemesterList.stream().map(e -> {
                     DictionaryResult dictionaryResult = new DictionaryResult();
                     dictionaryResult.setId(e.getId());
                     dictionaryResult.setCode(e.getCode());
                     dictionaryResult.setName(e.getName());
+                    dictionaryResult.setInUsed(e.getInUsed());
                     return dictionaryResult;
                 }).collect(Collectors.toList());
                 break;
             case COLLEGE:
-                List<BasicCollege> basicCollegeList = basicCollegeService.list();
+                List<BasicCollege> basicCollegeList = basicCollegeService.list(new QueryWrapper<BasicCollege>().lambda().eq(BasicCollege::getSchoolId,schoolId));
                 dictionaryResultList = basicCollegeList.stream().map(e -> {
                     DictionaryResult dictionaryResult = new DictionaryResult();
                     dictionaryResult.setId(e.getId());

+ 2 - 1
distributed-print/src/main/java/com/qmth/distributed/print/auth/DistributedPrintSession.java

@@ -7,6 +7,7 @@ import com.qmth.teachcloud.common.entity.TBSession;
 import com.qmth.teachcloud.common.util.RedisUtil;
 
 import java.util.Collection;
+import java.util.Objects;
 
 public class DistributedPrintSession implements AccessEntity {
 
@@ -32,7 +33,7 @@ public class DistributedPrintSession implements AccessEntity {
     public String getSecret() {
         RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);
         TBSession tbSession = (TBSession) redisUtil.getUserSession(identity);
-        return tbSession.getAccessToken();
+        return Objects.nonNull(tbSession) ? tbSession.getAccessToken() : null;
     }
 
     @Override

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


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

@@ -24,8 +24,8 @@ public class BasicCourseImportDto implements Serializable {
     @NotNull
     private String courseCode;
 
-    @ExcelNote(value = "所属部门")
-    @ExcelProperty(name = "所属部门", width = 30, index = 3)
+    @ExcelNote(value = "开课部门")
+    @ExcelProperty(name = "开课部门", width = 30, index = 3)
     @NotNull
     private String teachingRoomName;
 

+ 5 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/ImageTrajectoryUtil.java

@@ -15,6 +15,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.util.Objects;
 import java.util.StringJoiner;
 
@@ -48,7 +49,7 @@ public class ImageTrajectoryUtil {
             // 设置字体
             g.setFont(new Font(FONT_FORMAT, Font.LAYOUT_LEFT_TO_RIGHT, FONT_SIZE));
             // 写入签名
-            if(jsonArray != null && !jsonArray.isEmpty()) {
+            if (jsonArray != null && !jsonArray.isEmpty()) {
                 for (int i = 0; i < jsonArray.size(); i++) {
                     JSONObject jsonObject = jsonArray.getJSONObject(i);
                     JSONArray contentJsonArray = (JSONArray) jsonObject.get("content");
@@ -56,7 +57,9 @@ public class ImageTrajectoryUtil {
                     for (int k = 0; k < contentJsonArray.size(); k++) {
                         stringJoiner.add(contentJsonArray.get(k).toString());
                     }
-                    g.drawString(stringJoiner.toString(), (Integer) jsonObject.get("left"), (Integer) jsonObject.get("top"));
+                    BigDecimal left = new BigDecimal(jsonObject.get("left").toString());
+                    BigDecimal top = new BigDecimal(jsonObject.get("top").toString());
+                    g.drawString(stringJoiner.toString(), left.intValue(), top.intValue());
                 }
             }
             g.dispose();

+ 0 - 0
teachcloud-report/src/main/resources/application-main-temp.properties


+ 0 - 0
teachcloud-task/src/main/resources/application-main-temp.properties