Browse Source

初始化提交,清理历史

wangliang 1 week ago
commit
1c32e9bc55
100 changed files with 11185 additions and 0 deletions
  1. 32 0
      .gitignore
  2. 9 0
      HELP.md
  3. 35 0
      README.md
  4. 33 0
      distributed-print-business/.gitignore
  5. 218 0
      distributed-print-business/pom.xml
  6. 225 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/listener/ProcessEventListener.java
  7. 145 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/service/AbstractMultiWorkFlowService.java
  8. 78 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/service/DefaultInstanceConvertToMultiInstance.java
  9. 41 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/service/MultiWorkFlow.java
  10. 28 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/service/impl/MultiWorkFlowService.java
  11. 284 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/backup/MySQLDatabaseBackup.java
  12. 103 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClazzContentDto.java
  13. 71 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientExamStudentDto.java
  14. 161 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientExamTaskDto.java
  15. 62 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintBackupDataDto.java
  16. 80 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintDataDto.java
  17. 134 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintStatisticsDto.java
  18. 99 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintStatisticsTotalDto.java
  19. 446 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintTaskDto.java
  20. 126 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintTaskTotalDto.java
  21. 35 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/CourseDimensionOccupiedDto.java
  22. 88 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/CreatePdfDto.java
  23. 92 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/DeleteBasicExamStudentStatusDto.java
  24. 49 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamDetailCourseDto.java
  25. 44 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamDetailCourseFieldsDto.java
  26. 58 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamDetailPdfDownloadDto.java
  27. 73 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamStudentCourseClassDto.java
  28. 88 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamStudentCourseDto.java
  29. 37 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamStudentDto.java
  30. 232 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskDetailCardDto.java
  31. 338 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskDetailDto.java
  32. 58 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskDetailPdfDownloadDto.java
  33. 401 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskDto.java
  34. 72 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskImportDto.java
  35. 39 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskImportResultDto.java
  36. 59 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskImportTaskUserDto.java
  37. 106 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskPaperExportDto.java
  38. 164 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskPlanStatisticDto.java
  39. 170 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExaminationExportDto.java
  40. 307 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExaminationImportDto.java
  41. 92 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/GradeBatchStudentClazzDto.java
  42. 97 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/GradeBatchStudentDto.java
  43. 180 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/MakeupExamTaskDto.java
  44. 156 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ObjectiveStructDto.java
  45. 134 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ObjectiveStructImportDto.java
  46. 77 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PaperPdfDto.java
  47. 119 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PdfDto.java
  48. 78 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PdfPackageDto.java
  49. 91 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PdfSignDto.java
  50. 301 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PrintTaskDto.java
  51. 89 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PrintTaskTotalDto.java
  52. 79 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/RelatePaperDto.java
  53. 45 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/StudentNumberConfigDto.java
  54. 32 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/StudentNumberLetterRelationShipDto.java
  55. 147 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/SubjectiveStructDto.java
  56. 121 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/SubjectiveStructImportDto.java
  57. 78 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/TCStatisticsDto.java
  58. 30 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/TaskPrintHouseDto.java
  59. 111 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/admin/SetFontDto.java
  60. 89 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ApprovalInfo.java
  61. 135 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/BasicInfo.java
  62. 239 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ExamPackageDetail.java
  63. 77 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ExamRoomInfo.java
  64. 46 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ExamTaskApprovalFormDto.java
  65. 142 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/client/PrintSingleDto.java
  66. 31 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/client/UrlMd5Dto.java
  67. 80 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/examObject/ExamObjectDto.java
  68. 111 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/ExamStudentImportDto.java
  69. 81 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/GradePaperDimensionAbilityDto.java
  70. 94 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/GradePaperDimensionKnowledgeDto.java
  71. 172 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/GradePaperStructDto.java
  72. 39 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/TeachCourseDto.java
  73. 28 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/TeachStudentImportDto.java
  74. 81 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/TeacherImportDto.java
  75. 39 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/excel/TeacherTeamDto.java
  76. 220 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/importFile/BasicExamStudentImport.java
  77. 29 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/importFile/BasicExamStudentParseDto.java
  78. 128 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/initMarkData/ExamDetailCourseInitMarkDto.java
  79. 62 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/initMarkData/InitExamDetailDto.java
  80. 199 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/open/ExamStudentScore.java
  81. 90 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/open/PaperConfig.java
  82. 98 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/open/PaperDimension.java
  83. 157 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/open/PaperEvaluation.java
  84. 111 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/open/PaperStructure.java
  85. 263 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/pdf/ExamStudentInfo.java
  86. 124 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/excel/ExcelField.java
  87. 40 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowApproveRoleDto.java
  88. 40 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowApproveUserDto.java
  89. 108 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowCommonDto.java
  90. 40 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowCopyUserDto.java
  91. 72 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowDto.java
  92. 63 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowEditDto.java
  93. 72 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowGatewayDto.java
  94. 151 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowPropDto.java
  95. 129 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowPropertyDto.java
  96. 63 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowSaveDto.java
  97. 82 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowSequenceDto.java
  98. 234 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowVarDto.java
  99. 73 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/BaseFlowData.java
  100. 76 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/DoneTaskDto.java

+ 32 - 0
.gitignore

@@ -0,0 +1,32 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 9 - 0
HELP.md

@@ -0,0 +1,9 @@
+公司:武汉启明泰和软件服务有限公司
+
+地址:武汉市东湖新技术开发区光谷大道当代梦工场2号楼10楼
+
+邮编:430070
+
+电话:400-876-1700
+
+邮箱:pr@qmth.com.cn

+ 35 - 0
README.md

@@ -0,0 +1,35 @@
+知学知考平台
+
+项目模块:
+1.distributed-print
+分布式印刷项目
+   
+2.distributed-print-business
+分布式印刷业务
+
+3.teachcloud-print-common
+项目公用
+
+4.teachcloud-print-common-api
+项目公用api
+
+5.teachcloud-report
+教研分析报告
+
+6.teachcloud-report-business
+教研分析报告业务
+
+7.teachcloud-task
+分布式job
+
+项目框架:
+java8,spring boot2.3.0
+
+数据库:
+mysql5.7or8.0
+
+部署:
+docker
+
+附件:
+本地或oss存储

+ 33 - 0
distributed-print-business/.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 218 - 0
distributed-print-business/pom.xml

@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.qmth.distributed.print.business</groupId>
+    <artifactId>distributed-print-business</artifactId>
+    <version>3.4.6</version>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>8</source>
+                    <target>8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+    <packaging>jar</packaging>
+
+    <parent>
+        <groupId>com.qmth.distributed.print.service</groupId>
+        <artifactId>distributed-print-service</artifactId>
+        <version>3.4.6</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.teachcloud.common</groupId>
+            <artifactId>teachcloud-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.qmth.teachcloud.mark</groupId>
+            <artifactId>teachcloud-mark</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.jetbrains</groupId>
+            <artifactId>annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itext-asian</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.freemarker</groupId>
+            <artifactId>freemarker</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.activiti</groupId>
+            <artifactId>activiti-engine</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>spring-beans</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>mybatis</artifactId>
+                    <groupId>org.mybatis</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.activiti</groupId>
+            <artifactId>activiti-spring</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.codehaus.jackson</groupId>
+                    <artifactId>jackson-core-asl</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-log4j12</artifactId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-context</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-jdbc</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-tx</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-orm</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-beans</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>mybatis</artifactId>
+                    <groupId>org.mybatis</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>activation</artifactId>
+                    <groupId>javax.activation</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.activiti</groupId>
+            <artifactId>activiti-spring-boot-starter-basic</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>spring-beans</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-boot-starter</artifactId>
+                    <groupId>org.springframework.boot</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-boot-starter-jdbc</artifactId>
+                    <groupId>org.springframework.boot</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- Activiti 流程图 -->
+        <dependency>
+            <groupId>org.activiti</groupId>
+            <artifactId>activiti-common-rest</artifactId>
+        </dependency>
+        <!-- Activiti 在线设计 -->
+        <dependency>
+            <groupId>org.activiti</groupId>
+            <artifactId>activiti-modeler</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>spring-beans</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-context</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-core</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-tx</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-web</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-security-config</artifactId>
+                    <groupId>org.springframework.security</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-security-core</artifactId>
+                    <groupId>org.springframework.security</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-security-crypto</artifactId>
+                    <groupId>org.springframework.security</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-security-web</artifactId>
+                    <groupId>org.springframework.security</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-webmvc</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>activation</artifactId>
+                    <groupId>javax.activation</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>commons-io</artifactId>
+                    <groupId>commons-io</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <version>5.2.12.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.activiti</groupId>
+            <artifactId>activiti-bpmn-layout</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.github.burukeyou</groupId>
+            <artifactId>jdframe</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 225 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/listener/ProcessEventListener.java

@@ -0,0 +1,225 @@
+package com.qmth.distributed.print.business.activiti.custom.listener;
+
+import com.google.gson.Gson;
+import com.qmth.distributed.print.business.bean.flow.CustomFlowVarDto;
+import com.qmth.distributed.print.business.bean.result.FlowTaskResult;
+import com.qmth.distributed.print.business.entity.ExamTask;
+import com.qmth.distributed.print.business.entity.TFFlowApprove;
+import com.qmth.distributed.print.business.entity.TFFlowLog;
+import com.qmth.distributed.print.business.enums.CustomFlowMultipleUserApproveTypeEnum;
+import com.qmth.distributed.print.business.service.ActivitiService;
+import com.qmth.distributed.print.business.service.BasicMessageService;
+import com.qmth.distributed.print.business.service.PrintCommonService;
+import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.FlowApproveOperationEnum;
+import com.qmth.teachcloud.common.enums.MessageEnum;
+import com.qmth.teachcloud.common.enums.TFCustomTypeEnum;
+import com.qmth.teachcloud.common.service.SysUserService;
+import com.qmth.teachcloud.common.util.RedisUtil;
+import org.activiti.engine.HistoryService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.delegate.event.ActivitiEvent;
+import org.activiti.engine.delegate.event.ActivitiEventListener;
+import org.activiti.engine.delegate.event.ActivitiProcessStartedEvent;
+import org.activiti.engine.history.HistoricVariableInstance;
+import org.activiti.engine.task.Task;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: 全局监听
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/2/8
+ */
+@Component
+public class ProcessEventListener implements ActivitiEventListener, Serializable {
+    private final static Logger log = LoggerFactory.getLogger(ProcessEventListener.class);
+
+    @Override
+    public void onEvent(ActivitiEvent event) {
+        TFFlowLog tfFlowLog = null;
+        TFFlowApprove tfFlowApprove = null;
+        switch (event.getType()) {
+            case PROCESS_STARTED:
+                // 流程启动
+                log.info("流程启动_PROCESS_STARTED:ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
+                BasicMessageService basicMessageService = SpringContextHolder.getBean(BasicMessageService.class);
+                ActivitiProcessStartedEvent activitiProcessStartedEvent = (ActivitiProcessStartedEvent) event;
+                Map<String, Object> map = activitiProcessStartedEvent.getVariables();
+
+                Long objectId = (Long) map.get(SystemConstant.OBJECT_ID);
+                TFCustomTypeEnum flowType = (TFCustomTypeEnum) map.get(SystemConstant.FLOW_TYPE);
+                Object o = map.get(SystemConstant.OBJECT_DATA);
+                Boolean flowSubmit = (Boolean) map.get(SystemConstant.FLOW_SUBMIT);
+                //发送命题待审批短信
+                if (Objects.nonNull(objectId) && Objects.nonNull(flowType) && Objects.nonNull(o) && Objects.nonNull(flowSubmit) && flowSubmit) {
+                    if (flowType == TFCustomTypeEnum.ELECTRON_FLOW && o instanceof ExamTask) {
+                        basicMessageService.sendNoticeTaskCreate((ExamTask) o);
+                    }
+                }
+                break;
+            case PROCESS_COMPLETED:
+                // 流程结束
+                log.info("流程结束_PROCESS_COMPLETED:ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
+                HistoryService historyService = SpringContextHolder.getBean(HistoryService.class);
+                SysUserService sysUserService = SpringContextHolder.getBean(SysUserService.class);
+                ActivitiService activitiService = SpringContextHolder.getBean(ActivitiService.class);
+                PrintCommonService printCommonService = SpringContextHolder.getBean(PrintCommonService.class);
+
+                List<HistoricVariableInstance> historicVariableInstanceList = historyService.createHistoricVariableInstanceQuery().processInstanceId(event.getProcessInstanceId()).list();
+                if (Objects.nonNull(historicVariableInstanceList) && historicVariableInstanceList.size() > 0) {
+                    tfFlowLog = null;
+                    tfFlowApprove = null;
+                    Object object = null;
+                    for (HistoricVariableInstance h : historicVariableInstanceList) {
+                        if (Objects.equals(h.getVariableName(), SystemConstant.APPROVE_TF_FLOW_APPROVE)) {
+                            tfFlowApprove = (TFFlowApprove) h.getValue();
+                            Optional.ofNullable(tfFlowApprove).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程流转记录为空"));
+                            log.info("tfFlowApprove.getStatus():{}", tfFlowApprove.getStatus());
+                        }
+                        if (Objects.equals(h.getVariableName(), SystemConstant.APPROVE_TF_FLOW_LOG)) {
+                            tfFlowLog = (TFFlowLog) h.getValue();
+                            Optional.ofNullable(tfFlowLog).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程审批日志为空"));
+                            log.info("tfFlowLog.getApproveOperation():{}", tfFlowLog.getApproveOperation());
+                        } else if (Objects.equals(h.getVariableName(), SystemConstant.OBJECT_DATA)) {
+                            object = h.getValue();
+                            Optional.ofNullable(object).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("实体数据为空"));
+                        }
+                        if (Objects.nonNull(object) && Objects.nonNull(tfFlowLog)) {
+                            break;
+                        }
+                    }
+                    if (Objects.nonNull(tfFlowLog.getObjectTable())) {
+                        if (Objects.equals(tfFlowLog.getObjectTable(), TFCustomTypeEnum.ELECTRON_FLOW.getTable())) {//如果是命题任务交卷
+                            //取命题老师ID
+                            SysUser sysUser = sysUserService.getById(((ExamTask) object).getUserId());
+                            try {
+                                printCommonService.checkExamDataAndCreatePdfTask(((ExamTask) object).getSchoolId(), ((ExamTask) object).getExamId(), ((ExamTask) object).getCourseId(), ((ExamTask) object).getPaperNumber(), sysUser);
+                            } catch (IOException e) {
+                                throw ExceptionResultEnum.ERROR.exception("生成pdf失败");
+                            }
+                        }
+                    }
+                }
+                break;
+            case TASK_COMPLETED:
+                // 任务被完成了。它会在ENTITY_DELETE事件之前触发。当任务是流程一部分时,事件会在流程继续运行之前, 后续事件将是ACTIVITY_COMPLETE,对应着完成任务的节点。
+                log.info("流程任务完成_TASK_COMPLETED:ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
+                TaskService taskService = SpringContextHolder.getBean(TaskService.class);
+                SysUserService sysUserService1 = SpringContextHolder.getBean(SysUserService.class);
+                basicMessageService = SpringContextHolder.getBean(BasicMessageService.class);
+                ActivitiService activitiService1 = SpringContextHolder.getBean(ActivitiService.class);
+                RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);
+
+                Task task = taskService.createTaskQuery().executionId(event.getExecutionId()).singleResult();
+                if (Objects.nonNull(task)) {
+                    tfFlowLog = (TFFlowLog) taskService.getVariable(task.getId(), SystemConstant.APPROVE_TF_FLOW_LOG);
+                    Optional.ofNullable(tfFlowLog).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程审批日志为空"));
+
+                    tfFlowApprove = (TFFlowApprove) taskService.getVariable(task.getId(), SystemConstant.APPROVE_TF_FLOW_APPROVE);
+                    Optional.ofNullable(tfFlowApprove).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程流转记录为空"));
+
+                    log.info("tfFlowLog.getApproveOperation():{}", tfFlowLog.getApproveOperation());
+                    log.info("tfFlowApprove.getStatus():{}", tfFlowApprove.getStatus());
+                    o = taskService.getVariable(task.getId(), SystemConstant.OBJECT_DATA);
+                    Optional.ofNullable(o).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("实体数据为空"));
+                    Map<String, CustomFlowVarDto> agginessMap = (Map<String, CustomFlowVarDto>) taskService.getVariable(task.getId(), SystemConstant.AGGINESS_MAP);
+                    Optional.ofNullable(agginessMap).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程审批数据为空"));
+                    Map<String, FlowTaskResult> setupMap = (Map<String, FlowTaskResult>) taskService.getVariable(task.getId(), SystemConstant.SETUP_MAP);
+                    Optional.ofNullable(setupMap).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程审批步骤数据为空"));
+
+                    if (tfFlowLog.getApproveOperation() != FlowApproveOperationEnum.SUBMIT
+                            && tfFlowLog.getApproveOperation() != FlowApproveOperationEnum.END
+                            && tfFlowLog.getApproveOperation() != FlowApproveOperationEnum.FINISH) {
+                        if (Objects.nonNull(tfFlowLog.getPendApproveId())) {
+                            String[] strs = tfFlowLog.getPendApproveId().split(",");
+                            List<Long> userIds = new ArrayList<>();
+                            for (String s : strs) {
+                                userIds.add(SystemConstant.convertIdToLong(s.trim()));
+                            }
+                            Gson gson = new Gson();
+                            List<ApproveUserResult> nextApproverPeopleList = sysUserService1.findByIdsForResult(userIds);
+                            if (Objects.nonNull(nextApproverPeopleList) && nextApproverPeopleList.size() > 0 && Objects.nonNull(tfFlowLog.getApproveUserApproveType()) && tfFlowLog.getApproveUserApproveType() == CustomFlowMultipleUserApproveTypeEnum.ORDER) {
+                                nextApproverPeopleList.removeAll(nextApproverPeopleList.subList(1, nextApproverPeopleList.size() - 0));
+                            }
+
+                            if (Objects.nonNull(nextApproverPeopleList) && tfFlowLog.getApproveOperation() == FlowApproveOperationEnum.APPROVE) {
+                                List<ApproveUserResult> copyUsersList = null;
+                                FlowTaskResult nextFlowTaskResult = null;
+                                FlowTaskResult currFlowTaskResult = gson.fromJson(gson.toJson(setupMap.get(task.getTaskDefinitionKey())), FlowTaskResult.class);
+                                int currSetup = currFlowTaskResult.getSetup().intValue();
+                                currSetup = currSetup == setupMap.size() - 1 ? 0 : currSetup + 1;
+
+                                nextFlowTaskResult = activitiService1.getNextFlowTaskResult(setupMap, gson, currSetup, nextFlowTaskResult);
+                                CustomFlowVarDto customFlowVarDto = gson.fromJson(gson.toJson(agginessMap.get(nextFlowTaskResult.getTaskKey())), CustomFlowVarDto.class);
+                                if (Objects.nonNull(customFlowVarDto) && Objects.nonNull(customFlowVarDto.getCopyForUserIds()) && customFlowVarDto.getCopyForUserIds().size() > 0) {
+                                    Set<String> copyUserSet = new LinkedHashSet(customFlowVarDto.getCopyForUserIds());
+                                    copyUsersList = sysUserService1.findByIdsForResult(copyUserSet.stream().map(s -> SystemConstant.convertIdToLong(s)).collect(Collectors.toList()));
+                                }
+
+                                //如果不是并行会签,则每个节点都发
+                                if (Objects.nonNull(tfFlowLog.getApproveUserApproveType()) && tfFlowLog.getApproveUserApproveType() == CustomFlowMultipleUserApproveTypeEnum.ORDER) {
+                                    if (Objects.nonNull(o) && o instanceof ExamTask) {
+                                        basicMessageService.sendNoticeTaskAuditFlow((ExamTask) o, nextApproverPeopleList, MessageEnum.NOTICE_OF_AUDIT_CREATED);
+                                        //抄送短信
+                                        if (Objects.nonNull(copyUsersList) && copyUsersList.size() > 0) {
+                                            basicMessageService.sendNoticeAuditCopyUser((ExamTask) o, copyUsersList, nextApproverPeopleList.get(0).getRealName(), MessageEnum.NOTICE_OF_AUDIT_COPY_USER);
+                                        }
+                                    }
+                                } else {
+                                    if (Objects.isNull(tfFlowLog.getApproveMultiSetup())) {
+                                        if (Objects.nonNull(o) && o instanceof ExamTask) {
+                                            basicMessageService.sendNoticeTaskAuditFlow((ExamTask) o, nextApproverPeopleList, MessageEnum.NOTICE_OF_AUDIT_CREATED);
+                                        }
+                                        //抄送短信
+                                        if (Objects.nonNull(copyUsersList) && copyUsersList.size() > 0) {
+                                            basicMessageService.sendNoticeAuditCopyUser((ExamTask) o, copyUsersList, nextApproverPeopleList.stream().map(s -> s.getRealName()).collect(Collectors.toList()).toString().replaceAll("\\[", "").replaceAll("\\]", "").trim(), MessageEnum.NOTICE_OF_AUDIT_COPY_USER);
+                                        }
+                                    }
+                                }
+                            } else if (Objects.nonNull(nextApproverPeopleList) && (tfFlowLog.getApproveOperation() == FlowApproveOperationEnum.REJECT
+                                    || tfFlowLog.getApproveOperation() == FlowApproveOperationEnum.CANCEL)) {
+                                if (Objects.nonNull(o) && o instanceof ExamTask) {
+                                    basicMessageService.sendNoticeTaskAuditFlow((ExamTask) o, nextApproverPeopleList, MessageEnum.NOTICE_OF_AUDIT_REJECT);
+                                }
+                            }
+                        }
+                    }
+                }
+                break;
+//            case TASK_ASSIGNED:
+//                log.info("流程分配人员_TASK_ASSIGNED:ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
+//                taskService = SpringContextHolder.getBean(TaskService.class);
+//                activitiService = SpringContextHolder.getBean(ActivitiService.class);
+//                redisUtil = SpringContextHolder.getBean(RedisUtil.class);
+//
+//                Task taskAssigen = taskService.createTaskQuery().executionId(event.getExecutionId()).singleResult();
+//                if (Objects.nonNull(taskAssigen)) {
+//                    tfFlowLog = (TFFlowLog) taskService.getVariable(taskAssigen.getId(), SystemConstant.APPROVE_TF_FLOW_LOG);
+//                    Optional.ofNullable(tfFlowLog).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程审批日志为空"));
+//                    log.info("tfFlowLog.getApproveOperation():{}", tfFlowLog.getApproveOperation());
+//                }
+//                break;
+            default:
+//                log.info("default->type:{},ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getType(), event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
+                break;
+        }
+    }
+
+    @Override
+    public boolean isFailOnException() {
+        return false;
+    }
+}

+ 145 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/service/AbstractMultiWorkFlowService.java

@@ -0,0 +1,145 @@
+package com.qmth.distributed.print.business.activiti.custom.service;
+
+import com.qmth.distributed.print.business.bean.flow.CustomFlowDto;
+import com.qmth.distributed.print.business.bean.flow.link.FlowTaskLink;
+import com.qmth.distributed.print.business.bean.flow.link.FlowTaskNode;
+import com.qmth.distributed.print.business.enums.CustomFlowTypeEnum;
+import org.activiti.bpmn.model.MultiInstanceLoopCharacteristics;
+import org.activiti.bpmn.model.UserTask;
+import org.activiti.engine.ProcessEngine;
+import org.activiti.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior;
+import org.activiti.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior;
+import org.activiti.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior;
+import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
+import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
+import org.activiti.engine.impl.el.ExpressionManager;
+import org.springframework.beans.BeanUtils;
+
+import javax.annotation.Resource;
+import java.text.MessageFormat;
+import java.util.StringJoiner;
+
+/**
+ * @Description: 并行/串行业务service
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/2/8
+ */
+public abstract class AbstractMultiWorkFlowService implements DefaultInstanceConvertToMultiInstance {
+
+    @Resource
+    protected ProcessEngine processEngine;
+
+    /**
+     * 创建多实例行为解释器
+     *
+     * @param id
+     * @param isSequential 是否 串行
+     * @return
+     */
+    @Override
+    public MultiInstanceLoopCharacteristics createMultiInstanceLoopCharacteristics(String id, boolean isSequential) {
+        return createMultiInstanceLoopCharacteristics(isSequential, new StringJoiner("")
+                .add(MessageFormat.format("{0}{1}{2}", DEFAULT_ASSIGNEE_LIST_EXP, id, EXP_SUFFIX)).toString(), new StringJoiner("")
+                .add(MessageFormat.format("{0}{1}", ASSIGNEE_USER, id)).toString());
+    }
+
+    /**
+     * 创建多实例行为解释器
+     *
+     * @param isSequential    是否串行
+     * @param assigneeListExp 用户组表达
+     * @param assignee        用户标识
+     * @return
+     */
+    @Override
+    public MultiInstanceLoopCharacteristics createMultiInstanceLoopCharacteristics(boolean isSequential, String assigneeListExp, String assignee) {
+        MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics();
+        multiInstanceLoopCharacteristics.setSequential(isSequential);
+        multiInstanceLoopCharacteristics.setInputDataItem(assigneeListExp);
+        multiInstanceLoopCharacteristics.setElementVariable(assignee);
+        return multiInstanceLoopCharacteristics;
+    }
+
+    /**
+     * 创建多实例 循环解释器
+     *
+     * @param userTask
+     * @param sequential
+     * @return
+     */
+    @Override
+    public UserTask createMultiInstanceBehavior(UserTask userTask, boolean sequential) {
+        String id = userTask.getId().substring(userTask.getId().length() - 1, userTask.getId().length());
+        MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = this.createMultiInstanceLoopCharacteristics(id, sequential);
+        multiInstanceLoopCharacteristics.setCompletionCondition(DefaultInstanceConvertToMultiInstance.REJECT_EXP + id + DefaultInstanceConvertToMultiInstance.REJECT_EXP_SUFFIX);
+        userTask.setAssignee(new StringJoiner("").add(MessageFormat.format("{0}{1}{2}", ASSIGNEE_USER_EXP, id, EXP_SUFFIX)).toString());
+        userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics);
+        return createMultiInstanceBehavior(userTask, sequential, new StringJoiner("").add(MessageFormat.format("{0}{1}{2}", DEFAULT_ASSIGNEE_LIST_EXP, id, EXP_SUFFIX)).toString(), new StringJoiner("").add(MessageFormat.format("{0}{1}", ASSIGNEE_USER, id)).toString());
+    }
+
+    /**
+     * 创建多实例 循环解释器
+     *
+     * @param userTask        流程节点
+     * @param sequential      是否串行
+     * @param assigneeListExp 用户组表达
+     * @param assignee
+     * @return
+     */
+    @Override
+    public UserTask createMultiInstanceBehavior(UserTask userTask, boolean sequential, String assigneeListExp, String assignee) {
+        ProcessEngineConfigurationImpl processEngineConfiguration = (ProcessEngineConfigurationImpl) processEngine.getProcessEngineConfiguration();
+        //创建解释器
+        UserTaskActivityBehavior userTaskActivityBehavior = processEngineConfiguration.getActivityBehaviorFactory().createUserTaskActivityBehavior(userTask);
+        MultiInstanceActivityBehavior behavior = sequential ? new SequentialMultiInstanceBehavior(userTask, userTaskActivityBehavior) : new ParallelMultiInstanceBehavior(userTask, userTaskActivityBehavior);
+        //注入表达式 解释器
+        ExpressionManager expressionManager = processEngineConfiguration.getExpressionManager();
+        //设置表达式变量
+        behavior.setCollectionExpression(expressionManager.createExpression(assigneeListExp));
+        behavior.setCollectionElementVariable(assignee);
+        return userTask;
+    }
+
+    /**
+     * 创建默认用户节点
+     *
+     * @param customFlowDto
+     * @param flowTaskLink
+     * @param id
+     * @return
+     */
+    @Override
+    public CustomFlowDto createDefaultUserTask(CustomFlowDto customFlowDto, FlowTaskLink flowTaskLink, String id) {
+        CustomFlowDto customFlowDefaultDto = new CustomFlowDto();
+        BeanUtils.copyProperties(customFlowDto, customFlowDefaultDto);
+        customFlowDefaultDto.setId(id);
+        customFlowDefaultDto.setSetup(1);
+        customFlowDefaultDto.setType(CustomFlowTypeEnum.PROCESS);
+        customFlowDefaultDto.setContent(DEFAULT_USER_TASK_NAME);
+        customFlowDefaultDto.setH(customFlowDefaultDto.getH() + 30D);
+        customFlowDefaultDto.setY(customFlowDefaultDto.getY() + 50D);
+        customFlowDefaultDto.setFlowTaskId(CustomFlowTypeEnum.USER_TASK.getId() + id);
+        FlowTaskNode nodeDefault = new FlowTaskNode(customFlowDefaultDto);
+        flowTaskLink.add(nodeDefault);
+        return customFlowDefaultDto;
+    }
+
+//    /**
+//     * 更新atomicInteger值
+//     *
+//     * @param atomicInteger
+//     * @return
+//     */
+//    @Override
+//    public int getAndIncrement(AtomicInteger atomicInteger) {
+//        int value = 1;
+//        if (atomicInteger.get() >= Integer.MAX_VALUE) {
+//            atomicInteger.compareAndSet(atomicInteger.get(), value);
+//        } else {
+//            value = atomicInteger.getAndIncrement();
+//        }
+//        return value;
+//    }
+}

+ 78 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/service/DefaultInstanceConvertToMultiInstance.java

@@ -0,0 +1,78 @@
+package com.qmth.distributed.print.business.activiti.custom.service;
+
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.enums.FlowApproveOperationEnum;
+import org.activiti.bpmn.model.MultiInstanceLoopCharacteristics;
+import org.activiti.bpmn.model.UserTask;
+
+/**
+ * @Description: 创建并行/串行业务
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/2/8
+ */
+public interface DefaultInstanceConvertToMultiInstance extends MultiWorkFlow {
+
+    public static final String EXP_PREFIX = "${";
+    public static final String EXP_SUFFIX = "}";
+    public static final String EXP_EQUAL = "==";
+    public static final String ASSIGNEE_USER = "assignee";
+    public static final String DEFAULT_ASSIGNEE_LIST = "assigneeList";
+    public static final String DEFAULT_ASSIGNEE_LIST_EXP = EXP_PREFIX + DEFAULT_ASSIGNEE_LIST;
+    public static final String ASSIGNEE_USER_EXP = EXP_PREFIX + ASSIGNEE_USER;
+    public static final String APPROVE_ID_EXP = EXP_PREFIX + "approveId" + EXP_SUFFIX;
+    public static final String DEFAULT_USER_TASK = "_default";
+    public static final String DEFAULT_USER_TASK_NAME = "提交申请";
+    public static final String USER_TASK_APPROVE_NAME = "审核人";
+    public static final String FLOW_BPMN_MODEL_NAME = "-dynamic-model.bpmn";
+    public static final String FLOW_BPMN_PROCESS_NAME = "-multiple-process.bpmn";
+    public static final String FLOW_BPMN_PNG_NAME = "-multiple-process-diagram.png";
+    public static final String FLOW_BPMN_DEPLOYMENT_NAME = "-multiple process deployment";
+    public static final String BPMN_NAME = "bpmn";
+    public static final String GATEWAY_NAME = "gateway";
+    public static final String SEQUENCE_NAME = "sequence";
+    public static final String NR_OF_COMPLETED_INSTANCES = "nrOfCompletedInstances";
+    public static final String NR_OF_INSTANCES = "nrOfInstances";
+    public static final String REJECT_EXP = EXP_PREFIX + NR_OF_COMPLETED_INSTANCES + SystemConstant.ORG_SPLIT + NR_OF_INSTANCES + EXP_EQUAL + 1 + " || " + FlowApproveOperationEnum.REJECT.getId();
+    public static final String REJECT_EXP_SUFFIX = EXP_EQUAL + 1 + EXP_SUFFIX;
+
+    /**
+     * 创建多实例行为解释器
+     *
+     * @param userTask
+     * @param sequential
+     * @return
+     */
+    UserTask createMultiInstanceBehavior(UserTask userTask, boolean sequential);
+
+    /**
+     * 创建多实例行为解释器
+     *
+     * @param userTask        流程节点
+     * @param sequential      是否串行
+     * @param assigneeListExp 用户组表达
+     * @param assigneeExp     用户标识
+     * @return
+     */
+    UserTask createMultiInstanceBehavior(UserTask userTask, boolean sequential, String assigneeListExp, String assigneeExp);
+
+    /**
+     * 创建多实例循环解释器
+     *
+     * @param isSequential    是否串行
+     * @param assigneeListExp 用户组表达
+     * @param assignee        用户标识
+     * @return
+     */
+    MultiInstanceLoopCharacteristics createMultiInstanceLoopCharacteristics(boolean isSequential, String assigneeListExp, String assignee);
+
+    /**
+     * 创建多实例循环解释器
+     *
+     * @param id
+     * @param isSequential 是否 串行
+     * @return
+     */
+    MultiInstanceLoopCharacteristics createMultiInstanceLoopCharacteristics(String id, boolean isSequential);
+}

+ 41 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/service/MultiWorkFlow.java

@@ -0,0 +1,41 @@
+package com.qmth.distributed.print.business.activiti.custom.service;
+
+import com.qmth.distributed.print.business.bean.flow.CustomFlowDto;
+import com.qmth.distributed.print.business.bean.flow.link.FlowTaskLink;
+import org.activiti.bpmn.model.UserTask;
+
+/**
+ * @Description: 并行/串行业务
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/2/8
+ */
+public interface MultiWorkFlow {
+
+    /**
+     * 创建并行/串行会签节点
+     *
+     * @param userTask
+     * @param sequential
+     */
+    UserTask createMultiInstanceLoopCharacteristics(UserTask userTask, boolean sequential);
+
+    /**
+     * 创建默认用户节点
+     *
+     * @param customFlowDto
+     * @param flowTaskLink
+     * @param id
+     * @return
+     */
+    CustomFlowDto createDefaultUserTask(CustomFlowDto customFlowDto, FlowTaskLink flowTaskLink, String id);
+
+//    /**
+//     * 更新atomicInteger值
+//     *
+//     * @param atomicInteger
+//     * @return
+//     */
+//    int getAndIncrement(AtomicInteger atomicInteger);
+}

+ 28 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/service/impl/MultiWorkFlowService.java

@@ -0,0 +1,28 @@
+package com.qmth.distributed.print.business.activiti.custom.service.impl;
+
+import com.qmth.distributed.print.business.activiti.custom.service.AbstractMultiWorkFlowService;
+import org.activiti.bpmn.model.UserTask;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Description: 并行/串行业务impl
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/2/8
+ */
+@Service
+public class MultiWorkFlowService extends AbstractMultiWorkFlowService {
+
+    /**
+     * 创建多实例行为解释器
+     *
+     * @param userTask
+     * @param sequential
+     * @return
+     */
+    @Override
+    public UserTask createMultiInstanceLoopCharacteristics(UserTask userTask, boolean sequential) {
+        return createMultiInstanceBehavior(userTask, sequential);
+    }
+}

+ 284 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/backup/MySQLDatabaseBackup.java

@@ -0,0 +1,284 @@
+package com.qmth.distributed.print.business.backup;
+
+import cn.hutool.core.date.DateUtil;
+import com.aventrix.jnanoid.jnanoid.NanoIdUtils;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qmth.teachcloud.common.config.DictionaryConfig;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysConfig;
+import com.qmth.teachcloud.common.entity.SysOrg;
+import com.qmth.teachcloud.common.entity.SysRole;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.LocalCatalogEnum;
+import com.qmth.teachcloud.common.enums.UploadFileEnum;
+import com.qmth.teachcloud.common.service.*;
+import com.qmth.teachcloud.common.util.FileStoreUtil;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+/**
+ * @Description: MySQL数据库备份
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/11/14
+ */
+@Component
+public class MySQLDatabaseBackup {
+    private final static Logger log = LoggerFactory.getLogger(MySQLDatabaseBackup.class);
+
+    @Value("${db.host}")
+    String host;
+
+    @Value("${db.port}")
+    String port;
+
+    @Value("${db.name}")
+    String databaseName;
+
+    @Value("${db.username}")
+    String username;
+
+    @Value("${db.password}")
+    String password;
+
+    @Resource
+    SysRoleService sysRoleService;
+
+    @Resource
+    SysUserService sysUserService;
+
+    @Resource
+    CommonCacheService commonCacheService;
+
+    @Resource
+    SysOrgService sysOrgService;
+
+    @Resource
+    SysConfigService sysConfigService;
+
+    @Resource
+    FileStoreUtil fileStoreUtil;
+
+    @Resource
+    DictionaryConfig dictionaryConfig;
+
+    @Async
+    public void backupAndDeleteData(Long schoolId) {
+        try {
+            this.exportDatabaseTool();
+            this.deleteDbTool(SystemConstant.PRINT_DELETE_DATA_FILE_NAME, schoolId);
+        } catch (Exception e) {
+            throw ExceptionResultEnum.ERROR.exception("清除数据失败" + e.getMessage());
+        }
+    }
+
+    /**
+     * Java代码实现MySQL数据库导出
+     *
+     * @return
+     * @throws Exception
+     */
+    public boolean exportDatabaseTool() throws Exception {
+        File file = SystemConstant.getFileTempVar(".sql");
+        PrintWriter printWriter = null;
+        BufferedReader bufferedReader = null;
+        try {
+            printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8));
+            String execSql = "mysqldump -h" + this.host + " -P" + this.port + " -u" + this.username + " -p" + this.password + " --set-charset=" + StandardCharsets.UTF_8 + " " + this.databaseName;
+            Process process = Runtime.getRuntime().exec(execSql);
+            InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8);
+            bufferedReader = new BufferedReader(inputStreamReader);
+            IOUtils.copy(bufferedReader, printWriter);
+            if (process.waitFor() == 0) {//0 表示线程正常终止。
+                boolean oss = dictionaryConfig.sysDomain().isOss();
+                StringJoiner stringJoiner = new StringJoiner("");
+                if (!oss && Objects.nonNull(dictionaryConfig.fssPublicDomain()) && !StringUtils.isBlank(dictionaryConfig.fssPublicDomain().getConfig()) && !dictionaryConfig.fssPublicDomain().getConfig().startsWith(SystemConstant.START_PARENT)) {
+                    stringJoiner.add(dictionaryConfig.fssPublicDomain().getConfig()).add(File.separator);
+                }
+                stringJoiner = SystemConstant.getDirName(UploadFileEnum.FILE, true);
+                stringJoiner.add("db").add(File.separator).add("backup").add(File.separator)
+                        .add(DateUtil.format(new Date(), SystemConstant.BACK_UP_DATE_PATTERN)).add("_").add(NanoIdUtils.randomNanoId())
+                        .add("_backup.sql");
+                if (oss || (!oss && dictionaryConfig.fssPublicDomain().getConfig().startsWith(SystemConstant.START_PARENT))) {
+                    fileStoreUtil.ossUpload(stringJoiner.toString(), file, DigestUtils.md5Hex(new FileInputStream(file)), UploadFileEnum.FILE.getFssType());
+                } else {
+                    fileStoreUtil.localUpload(stringJoiner.toString(), new FileInputStream(file), DigestUtils.md5Hex(new FileInputStream(file)), LocalCatalogEnum.LOCAL_FILE);
+                }
+                return true;
+            }
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        } finally {
+            if (Objects.nonNull(bufferedReader)) {
+                bufferedReader.close();
+            }
+            if (Objects.nonNull(printWriter)) {
+                printWriter.close();
+            }
+            if (Objects.nonNull(file)) {
+                file.delete();
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 删除数据库数据
+     *
+     * @param fileName
+     * @param schoolId
+     * @throws Exception
+     */
+    public void deleteDbTool(String fileName, Long schoolId) throws Exception {
+        Optional.ofNullable(fileName).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("文件名不能为空"));
+        Optional.ofNullable(schoolId).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("学校id不能为空"));
+
+        InputStream inputStream = MySQLDatabaseBackup.class.getClassLoader().getResourceAsStream(fileName);
+        Optional.ofNullable(inputStream).orElseThrow(() -> ExceptionResultEnum.ERROR.exception(fileName + "未找到"));
+        File file = SystemConstant.getFileTempVar(".sql");
+        FileUtils.copyInputStreamToFile(inputStream, file);
+
+        ByteArrayOutputStream ou = new ByteArrayOutputStream();
+        IOUtils.copy(new FileInputStream(file), ou);
+        String string = new String(ou.toByteArray(), StandardCharsets.UTF_8);
+        if (Objects.nonNull(string)) {
+            string = string.replaceAll("\\#\\{schoolId\\}", String.valueOf(schoolId));
+        }
+        IOUtils.write(string.getBytes(StandardCharsets.UTF_8), new FileOutputStream(file));
+
+        //删除部分重要缓存
+        //角色
+        QueryWrapper<SysRole> sysRoleQueryWrapper = new QueryWrapper<>();
+        sysRoleQueryWrapper.lambda().eq(SysRole::getSchoolId, schoolId);
+        List<SysRole> sysRoleList = sysRoleService.list(sysRoleQueryWrapper);
+
+        //用户
+        QueryWrapper<SysUser> sysUserQueryWrapper = new QueryWrapper<>();
+        sysUserQueryWrapper.lambda().eq(SysUser::getSchoolId, schoolId);
+        List<SysUser> sysUserList = sysUserService.list(sysUserQueryWrapper);
+
+        //机构
+        QueryWrapper<SysOrg> sysOrgQueryWrapper = new QueryWrapper<>();
+        sysOrgQueryWrapper.lambda().eq(SysOrg::getSchoolId, schoolId);
+        List<SysOrg> sysOrgList = sysOrgService.list(sysOrgQueryWrapper);
+
+        //配置项
+        QueryWrapper<SysConfig> sysConfigQueryWrapper = new QueryWrapper<>();
+        sysConfigQueryWrapper.lambda().eq(SysConfig::getSchoolId, schoolId);
+        List<SysConfig> sysConfigList = sysConfigService.list(sysConfigQueryWrapper);
+
+        String cmdarray[] = {"mysql -h" + this.host + " -P" + this.port + " -u" + this.username + " -p" + this.password + " " + this.databaseName, "source " + file.getAbsolutePath()};
+        Runtime runtime = Runtime.getRuntime();
+        Process process = null;
+        try {
+            process = runtime.exec(cmdarray[0]);//cmd之后执行数组的第一个条件进入数据库
+            //执行了第一条命令以后已经登录到mysql了
+            Process finalProcess = process;
+            new Thread(() -> {
+                OutputStream os = finalProcess.getOutputStream();
+                OutputStreamWriter writer = new OutputStreamWriter(os);
+                try {
+                    IOUtils.write(cmdarray[1], writer);
+                } catch (IOException e) {
+                    e.printStackTrace();
+                } finally {
+                    try {
+                        if (Objects.nonNull(writer)) {
+                            writer.close();
+                        }
+                        if (Objects.nonNull(os)) {
+                            os.close();
+                        }
+                    } catch (Exception e) {
+                        log.error(SystemConstant.LOG_ERROR, e);
+                    }
+                }
+            }).start();
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        } finally {
+            if (process.waitFor() == 0 && Objects.nonNull(file)) {
+                string = DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN) + "删除数据成功!!!";
+                IOUtils.write(string.getBytes(StandardCharsets.UTF_8), new FileOutputStream(file));
+
+                boolean oss = dictionaryConfig.sysDomain().isOss();
+                StringJoiner stringJoiner = new StringJoiner("");
+                if (!oss && Objects.nonNull(dictionaryConfig.fssPublicDomain()) && !StringUtils.isBlank(dictionaryConfig.fssPublicDomain().getConfig()) && !dictionaryConfig.fssPublicDomain().getConfig().startsWith(SystemConstant.START_PARENT)) {
+                    stringJoiner.add(dictionaryConfig.fssPublicDomain().getConfig()).add(File.separator);
+                }
+                stringJoiner = SystemConstant.getDirName(stringJoiner, UploadFileEnum.FILE, true);
+                stringJoiner.add("db").add(File.separator).add("delete").add(File.separator)
+                        .add(DateUtil.format(new Date(), SystemConstant.BACK_UP_DATE_PATTERN)).add("_").add(NanoIdUtils.randomNanoId())
+                        .add("_").add(String.valueOf(schoolId)).add("_delete.sql");
+                if (oss || (!oss && dictionaryConfig.fssPublicDomain().getConfig().startsWith(SystemConstant.START_PARENT))) {
+                    fileStoreUtil.ossUpload(stringJoiner.toString(), file, DigestUtils.md5Hex(new FileInputStream(file)), UploadFileEnum.FILE.getFssType());
+                } else {
+                    fileStoreUtil.localUpload(stringJoiner.toString(), new FileInputStream(file), DigestUtils.md5Hex(new FileInputStream(file)), LocalCatalogEnum.LOCAL_FILE);
+                }
+
+                if (!CollectionUtils.isEmpty(sysRoleList)) {
+                    for (SysRole s : sysRoleList) {
+                        commonCacheService.removeRoleCache(s.getId());
+//                        commonCacheService.removeRolePrivilegeCache(schoolId, s.getId());
+                    }
+                }
+
+                if (!CollectionUtils.isEmpty(sysUserList)) {
+                    for (SysUser s : sysUserList) {
+                        SystemConstant.deleteUserCache(s.getId());
+                    }
+                }
+
+                if (!CollectionUtils.isEmpty(sysOrgList)) {
+                    for (SysOrg s : sysOrgList) {
+                        commonCacheService.removeOrgCache(s.getId());
+                    }
+                }
+
+                if (!CollectionUtils.isEmpty(sysConfigList)) {
+                    for (SysConfig s : sysConfigList) {
+                        commonCacheService.removeSysConfigCache(s.getSchoolId(), s.getConfigKey());
+                    }
+                }
+                commonCacheService.removeSchoolRoleCache(schoolId);
+                commonCacheService.removeSchoolPrivilegeCache(schoolId);
+                if (Objects.nonNull(file)) {
+                    file.delete();
+                }
+            }
+        }
+    }
+
+//    public static void main(String[] args) {
+//        MySQLDatabaseBackup mySQLDatabaseBackup = new MySQLDatabaseBackup();
+//        try {
+//            String host = "127.0.0.1", userName = "root", password = "123456789", databaseName = "distributed-v3.2.0";
+//            Long schoolId = 290869043907264512L;
+//            if (mySQLDatabaseBackup.exportDatabaseTool(this.host, userName, password, DateUtil.format(new Date(), SystemConstant.BACK_UP_DATE_PATTERN) + "_" + NanoIdUtils.randomNanoId() + "_backup.sql", databaseName)) {
+//                System.out.println("数据库成功备份!!!");
+////                deleteDbTool(host, userName, password, databaseName, SystemConstant.PRINT_DELETE_DATA_FILE_NAME, schoolId);
+//                mySQLDatabaseBackup.deleteDbTool(host, userName, password, databaseName, "/Users/king/git/distributed-print-service/distributed-print-business/src/main/resources/db/delete-data.sql", schoolId);
+//                System.out.println("删除数据成功!!!");
+//            } else {
+//                System.out.println("数据库备份失败!!!");
+//            }
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//    }
+}

+ 103 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClazzContentDto.java

@@ -0,0 +1,103 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.enums.ClazzContentEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 命题计划统计表班级内容详细细心
+ * @Author: CaoZixuan
+ * @Date: 2022-04-26
+ */
+public class ClazzContentDto {
+    @ApiModelProperty(value = "班级id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long clazzId;
+
+    @ApiModelProperty(value = "班级名称")
+    private String clazzName;
+
+    @ApiModelProperty(value = "任课老师名称")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examPrintPlanId;
+
+    @ApiModelProperty(value = "任课老师名称")
+    private String examPrintPlanName;
+
+    @ApiModelProperty(value = "任课老师名称")
+    private String paperNumber;
+
+    @ApiModelProperty(value = "任课老师名称")
+    private ClazzContentEnum status;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "学生数量")
+    private String printCount;
+
+    public Long getClazzId() {
+        return clazzId;
+    }
+
+    public void setClazzId(Long clazzId) {
+        this.clazzId = clazzId;
+    }
+
+    public String getClazzName() {
+        return clazzName;
+    }
+
+    public void setClazzName(String clazzName) {
+        this.clazzName = clazzName;
+    }
+
+    public Long getExamPrintPlanId() {
+        return examPrintPlanId;
+    }
+
+    public void setExamPrintPlanId(Long examPrintPlanId) {
+        this.examPrintPlanId = examPrintPlanId;
+    }
+
+    public String getExamPrintPlanName() {
+        return examPrintPlanName;
+    }
+
+    public void setExamPrintPlanName(String examPrintPlanName) {
+        this.examPrintPlanName = examPrintPlanName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public ClazzContentEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(ClazzContentEnum status) {
+        this.status = status;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getPrintCount() {
+        return printCount;
+    }
+
+    public void setPrintCount(String printCount) {
+        this.printCount = printCount;
+    }
+}

+ 71 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientExamStudentDto.java

@@ -0,0 +1,71 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+/**
+ * @Date: 2021/3/31.
+ */
+public class ClientExamStudentDto {
+
+    private String examDetailId;
+    private String courseCode;
+    private String courseName;
+    private String paperNumber;
+    private String studentCode;
+    private String studentName;
+    private String siteNumber;
+
+    public String getExamDetailId() {
+        return examDetailId;
+    }
+
+    public void setExamDetailId(String examDetailId) {
+        this.examDetailId = examDetailId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getSiteNumber() {
+        return siteNumber;
+    }
+
+    public void setSiteNumber(String siteNumber) {
+        this.siteNumber = siteNumber;
+    }
+}

+ 161 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientExamTaskDto.java

@@ -0,0 +1,161 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+/**
+ * @Date: 2021/3/31.
+ */
+public class ClientExamTaskDto {
+
+    private String examTaskId;
+    private String schoolId;
+    private String examId;
+    private String printPlanId;
+    private String printPlanName;
+    private String paperNumber;
+    private String courseId;
+    private String courseCode;
+    private String courseName;
+    private String paperType;
+    private String specialty;
+    private String userId;
+    private String userName;
+    private Boolean isTry;
+    private Boolean isPass;
+    private Long tryTime;
+    private String examDetailIds;
+
+    public String getExamTaskId() {
+        return examTaskId;
+    }
+
+    public void setExamTaskId(String examTaskId) {
+        this.examTaskId = examTaskId;
+    }
+
+    public String getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(String schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getExamId() {
+        return examId;
+    }
+
+    public void setExamId(String examId) {
+        this.examId = examId;
+    }
+
+    public String getPrintPlanId() {
+        return printPlanId;
+    }
+
+    public void setPrintPlanId(String printPlanId) {
+        this.printPlanId = printPlanId;
+    }
+
+    public String getPrintPlanName() {
+        return printPlanName;
+    }
+
+    public void setPrintPlanName(String printPlanName) {
+        this.printPlanName = printPlanName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(String courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getSpecialty() {
+        return specialty;
+    }
+
+    public void setSpecialty(String specialty) {
+        this.specialty = specialty;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public Boolean getTry() {
+        return isTry;
+    }
+
+    public void setTry(Boolean aTry) {
+        isTry = aTry;
+    }
+
+    public Boolean getPass() {
+        return isPass;
+    }
+
+    public void setPass(Boolean pass) {
+        isPass = pass;
+    }
+
+    public Long getTryTime() {
+        return tryTime;
+    }
+
+    public void setTryTime(Long tryTime) {
+        this.tryTime = tryTime;
+    }
+
+    public String getExamDetailIds() {
+        return examDetailIds;
+    }
+
+    public void setExamDetailIds(String examDetailIds) {
+        this.examDetailIds = examDetailIds;
+    }
+}

+ 62 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintBackupDataDto.java

@@ -0,0 +1,62 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+/**
+ * @Date: 2021/3/31.
+ */
+public class ClientPrintBackupDataDto {
+
+    private String courseCode;
+    private String courseName;
+    private String paperNumber;
+    private String paperType;
+    private String md5;
+    private String url;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getMd5() {
+        return md5;
+    }
+
+    public void setMd5(String md5) {
+        this.md5 = md5;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+}

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

@@ -0,0 +1,80 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+/**
+ * @Date: 2021/3/31.
+ */
+public class ClientPrintDataDto {
+
+    private String courseCode;
+    private String courseName;
+    private String paperNumber;
+    private String studentName;
+    private String studentCode;
+    private String paperType;
+    private String md5;
+    private String url;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getMd5() {
+        return md5;
+    }
+
+    public void setMd5(String md5) {
+        this.md5 = md5;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+}

+ 134 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintStatisticsDto.java

@@ -0,0 +1,134 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+/**
+ * @Date: 2021/3/29.
+ */
+public class ClientPrintStatisticsDto {
+
+    private String printPlanId;
+    private String printPlanName;
+    private Long examStartTime;
+    private Long examEndTime;
+    private String courseNameCode;
+    private String paperNumber;
+    private String examPlace;
+    private Integer packageCount;
+    private Integer totalSubjects;
+    private Integer totalSubjectsLeft;
+    private Integer paperPagesLeft;
+    private Integer cardPagesLeft;
+    private Integer pagesA4Left;
+    private Integer progress;
+
+    public String getPrintPlanId() {
+        return printPlanId;
+    }
+
+    public void setPrintPlanId(String printPlanId) {
+        this.printPlanId = printPlanId;
+    }
+
+    public String getPrintPlanName() {
+        return printPlanName;
+    }
+
+    public void setPrintPlanName(String printPlanName) {
+        this.printPlanName = printPlanName;
+    }
+
+    public Long getExamStartTime() {
+        return examStartTime;
+    }
+
+    public void setExamStartTime(Long examStartTime) {
+        this.examStartTime = examStartTime;
+    }
+
+    public Long getExamEndTime() {
+        return examEndTime;
+    }
+
+    public void setExamEndTime(Long examEndTime) {
+        this.examEndTime = examEndTime;
+    }
+
+    public String getCourseNameCode() {
+        return courseNameCode;
+    }
+
+    public void setCourseNameCode(String courseNameCode) {
+        this.courseNameCode = courseNameCode;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getExamPlace() {
+        return examPlace;
+    }
+
+    public void setExamPlace(String examPlace) {
+        this.examPlace = examPlace;
+    }
+
+    public Integer getPackageCount() {
+        return packageCount;
+    }
+
+    public void setPackageCount(Integer packageCount) {
+        this.packageCount = packageCount;
+    }
+
+    public Integer getTotalSubjects() {
+        return totalSubjects;
+    }
+
+    public void setTotalSubjects(Integer totalSubjects) {
+        this.totalSubjects = totalSubjects;
+    }
+
+    public Integer getTotalSubjectsLeft() {
+        return totalSubjectsLeft;
+    }
+
+    public void setTotalSubjectsLeft(Integer totalSubjectsLeft) {
+        this.totalSubjectsLeft = totalSubjectsLeft;
+    }
+
+    public Integer getPaperPagesLeft() {
+        return paperPagesLeft;
+    }
+
+    public void setPaperPagesLeft(Integer paperPagesLeft) {
+        this.paperPagesLeft = paperPagesLeft;
+    }
+
+    public Integer getCardPagesLeft() {
+        return cardPagesLeft;
+    }
+
+    public void setCardPagesLeft(Integer cardPagesLeft) {
+        this.cardPagesLeft = cardPagesLeft;
+    }
+
+    public Integer getPagesA4Left() {
+        return pagesA4Left;
+    }
+
+    public void setPagesA4Left(Integer pagesA4Left) {
+        this.pagesA4Left = pagesA4Left;
+    }
+
+    public Integer getProgress() {
+        return progress;
+    }
+
+    public void setProgress(Integer progress) {
+        this.progress = progress;
+    }
+}

+ 99 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintStatisticsTotalDto.java

@@ -0,0 +1,99 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+/**
+ * @Date: 2021/3/29.
+ */
+public class ClientPrintStatisticsTotalDto {
+
+    private Integer totalSubjects;
+    private Integer packageCount;
+    private Integer paperCount;
+    private String paperNumberAndType;
+    private Integer paperPages;
+    private Integer cardPages;
+    private Integer pagesA4;
+    private Integer paperPagesLeft;
+    private Integer cardPagesLeft;
+    private Integer pagesA4Left;
+
+    public Integer getTotalSubjects() {
+        return totalSubjects;
+    }
+
+    public void setTotalSubjects(Integer totalSubjects) {
+        this.totalSubjects = totalSubjects;
+    }
+
+    public Integer getPackageCount() {
+        return packageCount;
+    }
+
+    public void setPackageCount(Integer packageCount) {
+        this.packageCount = packageCount;
+    }
+
+    public Integer getPaperCount() {
+        return paperCount;
+    }
+
+    public void setPaperCount(Integer paperCount) {
+        this.paperCount = paperCount;
+    }
+
+    public String getPaperNumberAndType() {
+        return paperNumberAndType;
+    }
+
+    public void setPaperNumberAndType(String paperNumberAndType) {
+        this.paperNumberAndType = paperNumberAndType;
+    }
+
+    public Integer getPaperPages() {
+        return paperPages;
+    }
+
+    public void setPaperPages(Integer paperPages) {
+        this.paperPages = paperPages;
+    }
+
+    public Integer getCardPages() {
+        return cardPages;
+    }
+
+    public void setCardPages(Integer cardPages) {
+        this.cardPages = cardPages;
+    }
+
+    public Integer getPagesA4() {
+        return pagesA4;
+    }
+
+    public void setPagesA4(Integer pagesA4) {
+        this.pagesA4 = pagesA4;
+    }
+
+    public Integer getPaperPagesLeft() {
+        return paperPagesLeft;
+    }
+
+    public void setPaperPagesLeft(Integer paperPagesLeft) {
+        this.paperPagesLeft = paperPagesLeft;
+    }
+
+    public Integer getCardPagesLeft() {
+        return cardPagesLeft;
+    }
+
+    public void setCardPagesLeft(Integer cardPagesLeft) {
+        this.cardPagesLeft = cardPagesLeft;
+    }
+
+    public Integer getPagesA4Left() {
+        return pagesA4Left;
+    }
+
+    public void setPagesA4Left(Integer pagesA4Left) {
+        this.pagesA4Left = pagesA4Left;
+    }
+
+}

+ 446 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintTaskDto.java

@@ -0,0 +1,446 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.annotation.ExcelProperty;
+
+/**
+ * @Date: 2021/3/29.
+ */
+public class ClientPrintTaskDto {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examId;
+    private String examDetailId;
+    private String printPlanId;
+    @ExcelProperty(name = "印刷计划", width = 30, index = 2)
+    private String printPlanName;
+    private Long examStartTime;
+    @ExcelProperty(name = "考试开始日期", width = 30, index = 3)
+    private String examStartTimeStr;
+    private Long examEndTime;
+    @ExcelProperty(name = "考试结束日期", width = 30, index = 4)
+    private String examEndTimeStr;
+    @ExcelProperty(name = "课程(代码)", width = 30, index = 5)
+    private String courseNameCode;
+    @ExcelProperty(name = "试卷编号", width = 30, index = 6)
+    private String paperNumber;
+    @ExcelProperty(name = "考点", width = 30, index = 7)
+    private String examPlace;
+    @ExcelProperty(name = "考场", width = 30, index = 8)
+    private String examRoom;
+    private String classId;
+    private String className;
+    @ExcelProperty(name = "单科次A3(页)", width = 30, index = 9)
+    private String singlePagesA3;
+    private String singlePagesA4;
+    private Integer paperPages;
+    private Integer cardPages;
+    private Integer pagesA4;
+    @ExcelProperty(name = "科次", width = 30, index = 10)
+    private Integer totalSubjects;
+    private Integer totalPrint;
+    private String status;
+    @ExcelProperty(name = "印刷状态", width = 30, index = 11)
+    private String statusStr;
+    private Boolean validate;
+    @ExcelProperty(name = "是否校验", width = 30, index = 13)
+    private String validateStr;
+    private Boolean download;
+    @ExcelProperty(name = "是否缓存", width = 30, index = 12)
+    private String downloadStr;
+    private Boolean isTry;
+    private Boolean isPass;
+    @ExcelProperty(name = "印刷员", width = 30, index = 14)
+    private String printUser;
+    private Long printStartTime;
+    @ExcelProperty(name = "印刷开始时间", width = 30, index = 15)
+    private String printStartTimeStr;
+    private Long printEndTime;
+    @ExcelProperty(name = "印刷完成时间", width = 30, index = 16)
+    private String printEndTimeStr;
+    @ExcelProperty(name = "卷袋编号", width = 30, index = 1)
+    private String packageCode;
+    private Long createId;
+    private Long createTime;
+
+    private String printContent;
+    private String variableContent;
+    private String ordinaryContent;
+
+    private Boolean incluedPaper;
+    private Boolean incluedCard;
+    private Boolean incluedSign;
+    private Boolean incluedPackage;
+    private Boolean incluedCheckin;
+    private String questionSetter;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getExamDetailId() {
+        return examDetailId;
+    }
+
+    public void setExamDetailId(String examDetailId) {
+        this.examDetailId = examDetailId;
+    }
+
+    public String getPrintPlanId() {
+        return printPlanId;
+    }
+
+    public void setPrintPlanId(String printPlanId) {
+        this.printPlanId = printPlanId;
+    }
+
+    public String getPrintPlanName() {
+        return printPlanName;
+    }
+
+    public void setPrintPlanName(String printPlanName) {
+        this.printPlanName = printPlanName;
+    }
+
+    public Long getExamStartTime() {
+        return examStartTime;
+    }
+
+    public void setExamStartTime(Long examStartTime) {
+        this.examStartTime = examStartTime;
+    }
+
+    public String getExamStartTimeStr() {
+        return examStartTimeStr;
+    }
+
+    public void setExamStartTimeStr(String examStartTimeStr) {
+        this.examStartTimeStr = examStartTimeStr;
+    }
+
+    public Long getExamEndTime() {
+        return examEndTime;
+    }
+
+    public void setExamEndTime(Long examEndTime) {
+        this.examEndTime = examEndTime;
+    }
+
+    public String getExamEndTimeStr() {
+        return examEndTimeStr;
+    }
+
+    public void setExamEndTimeStr(String examEndTimeStr) {
+        this.examEndTimeStr = examEndTimeStr;
+    }
+
+    public String getCourseNameCode() {
+        return courseNameCode;
+    }
+
+    public void setCourseNameCode(String courseNameCode) {
+        this.courseNameCode = courseNameCode;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getExamPlace() {
+        return examPlace;
+    }
+
+    public void setExamPlace(String examPlace) {
+        this.examPlace = examPlace;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getClassId() {
+        return classId;
+    }
+
+    public void setClassId(String classId) {
+        this.classId = classId;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getSinglePagesA3() {
+        return singlePagesA3;
+    }
+
+    public void setSinglePagesA3(String singlePagesA3) {
+        this.singlePagesA3 = singlePagesA3;
+    }
+
+    public String getSinglePagesA4() {
+        return singlePagesA4;
+    }
+
+    public void setSinglePagesA4(String singlePagesA4) {
+        this.singlePagesA4 = singlePagesA4;
+    }
+
+    public Integer getPaperPages() {
+        return paperPages;
+    }
+
+    public void setPaperPages(Integer paperPages) {
+        this.paperPages = paperPages;
+    }
+
+    public Integer getCardPages() {
+        return cardPages;
+    }
+
+    public void setCardPages(Integer cardPages) {
+        this.cardPages = cardPages;
+    }
+
+    public Integer getPagesA4() {
+        return pagesA4;
+    }
+
+    public void setPagesA4(Integer pagesA4) {
+        this.pagesA4 = pagesA4;
+    }
+
+    public Integer getTotalSubjects() {
+        return totalSubjects;
+    }
+
+    public void setTotalSubjects(Integer totalSubjects) {
+        this.totalSubjects = totalSubjects;
+    }
+
+    public Integer getTotalPrint() {
+        return totalPrint;
+    }
+
+    public void setTotalPrint(Integer totalPrint) {
+        this.totalPrint = totalPrint;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getStatusStr() {
+        return statusStr;
+    }
+
+    public void setStatusStr(String statusStr) {
+        this.statusStr = statusStr;
+    }
+
+    public Boolean getValidate() {
+        return validate;
+    }
+
+    public void setValidate(Boolean validate) {
+        this.validate = validate;
+    }
+
+    public String getValidateStr() {
+        return validateStr;
+    }
+
+    public void setValidateStr(String validateStr) {
+        this.validateStr = validateStr;
+    }
+
+    public Boolean getDownload() {
+        return download;
+    }
+
+    public void setDownload(Boolean download) {
+        this.download = download;
+    }
+
+    public String getDownloadStr() {
+        return downloadStr;
+    }
+
+    public void setDownloadStr(String downloadStr) {
+        this.downloadStr = downloadStr;
+    }
+
+    public Boolean getTry() {
+        return isTry;
+    }
+
+    public void setTry(Boolean aTry) {
+        isTry = aTry;
+    }
+
+    public Boolean getPass() {
+        return isPass;
+    }
+
+    public void setPass(Boolean pass) {
+        isPass = pass;
+    }
+
+    public String getPrintUser() {
+        return printUser;
+    }
+
+    public void setPrintUser(String printUser) {
+        this.printUser = printUser;
+    }
+
+    public Long getPrintStartTime() {
+        return printStartTime;
+    }
+
+    public void setPrintStartTime(Long printStartTime) {
+        this.printStartTime = printStartTime;
+    }
+
+    public String getPrintStartTimeStr() {
+        return printStartTimeStr;
+    }
+
+    public void setPrintStartTimeStr(String printStartTimeStr) {
+        this.printStartTimeStr = printStartTimeStr;
+    }
+
+    public Long getPrintEndTime() {
+        return printEndTime;
+    }
+
+    public void setPrintEndTime(Long printEndTime) {
+        this.printEndTime = printEndTime;
+    }
+
+    public String getPrintEndTimeStr() {
+        return printEndTimeStr;
+    }
+
+    public void setPrintEndTimeStr(String printEndTimeStr) {
+        this.printEndTimeStr = printEndTimeStr;
+    }
+
+    public String getPackageCode() {
+        return packageCode;
+    }
+
+    public void setPackageCode(String packageCode) {
+        this.packageCode = packageCode;
+    }
+
+    public Long getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(Long createId) {
+        this.createId = createId;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getPrintContent() {
+        return printContent;
+    }
+
+    public void setPrintContent(String printContent) {
+        this.printContent = printContent;
+    }
+
+    public String getVariableContent() {
+        return variableContent;
+    }
+
+    public void setVariableContent(String variableContent) {
+        this.variableContent = variableContent;
+    }
+
+    public String getOrdinaryContent() {
+        return ordinaryContent;
+    }
+
+    public void setOrdinaryContent(String ordinaryContent) {
+        this.ordinaryContent = ordinaryContent;
+    }
+
+    public Boolean getIncluedPaper() {
+        return incluedPaper;
+    }
+
+    public void setIncluedPaper(Boolean incluedPaper) {
+        this.incluedPaper = incluedPaper;
+    }
+
+    public Boolean getIncluedCard() {
+        return incluedCard;
+    }
+
+    public void setIncluedCard(Boolean incluedCard) {
+        this.incluedCard = incluedCard;
+    }
+
+    public Boolean getIncluedSign() {
+        return incluedSign;
+    }
+
+    public void setIncluedSign(Boolean incluedSign) {
+        this.incluedSign = incluedSign;
+    }
+
+    public Boolean getIncluedPackage() {
+        return incluedPackage;
+    }
+
+    public void setIncluedPackage(Boolean incluedPackage) {
+        this.incluedPackage = incluedPackage;
+    }
+
+    public Boolean getIncluedCheckin() {
+        return incluedCheckin;
+    }
+
+    public void setIncluedCheckin(Boolean incluedCheckin) {
+        this.incluedCheckin = incluedCheckin;
+    }
+
+    public String getQuestionSetter() {
+        return questionSetter;
+    }
+
+    public void setQuestionSetter(String questionSetter) {
+        this.questionSetter = questionSetter;
+    }
+}

+ 126 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ClientPrintTaskTotalDto.java

@@ -0,0 +1,126 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+/**
+ * @Date: 2021/3/29.
+ */
+public class ClientPrintTaskTotalDto {
+
+    private Integer paperCount;
+    private Integer totalSubjects;
+    private Integer packageCount;
+    private Integer paperPages;
+    private Integer cardPages;
+    private Integer pagesA4;
+    private Integer paperPagesLeft;
+    private Integer cardPagesLeft;
+    private Integer pagesA4Left;
+    private Integer hostPaperPages;
+    private Integer hostCardPages;
+    private Integer hostPagesA4;
+
+    private String paperNumberAndType;
+
+    public Integer getPaperCount() {
+        return paperCount;
+    }
+
+    public void setPaperCount(Integer paperCount) {
+        this.paperCount = paperCount;
+    }
+
+    public Integer getTotalSubjects() {
+        return totalSubjects;
+    }
+
+    public void setTotalSubjects(Integer totalSubjects) {
+        this.totalSubjects = totalSubjects;
+    }
+
+    public Integer getPackageCount() {
+        return packageCount;
+    }
+
+    public void setPackageCount(Integer packageCount) {
+        this.packageCount = packageCount;
+    }
+
+    public Integer getPaperPages() {
+        return paperPages;
+    }
+
+    public void setPaperPages(Integer paperPages) {
+        this.paperPages = paperPages;
+    }
+
+    public Integer getCardPages() {
+        return cardPages;
+    }
+
+    public void setCardPages(Integer cardPages) {
+        this.cardPages = cardPages;
+    }
+
+    public Integer getPagesA4() {
+        return pagesA4;
+    }
+
+    public void setPagesA4(Integer pagesA4) {
+        this.pagesA4 = pagesA4;
+    }
+
+    public Integer getPaperPagesLeft() {
+        return paperPagesLeft;
+    }
+
+    public void setPaperPagesLeft(Integer paperPagesLeft) {
+        this.paperPagesLeft = paperPagesLeft;
+    }
+
+    public Integer getCardPagesLeft() {
+        return cardPagesLeft;
+    }
+
+    public void setCardPagesLeft(Integer cardPagesLeft) {
+        this.cardPagesLeft = cardPagesLeft;
+    }
+
+    public Integer getPagesA4Left() {
+        return pagesA4Left;
+    }
+
+    public void setPagesA4Left(Integer pagesA4Left) {
+        this.pagesA4Left = pagesA4Left;
+    }
+
+    public Integer getHostPaperPages() {
+        return hostPaperPages;
+    }
+
+    public void setHostPaperPages(Integer hostPaperPages) {
+        this.hostPaperPages = hostPaperPages;
+    }
+
+    public Integer getHostCardPages() {
+        return hostCardPages;
+    }
+
+    public void setHostCardPages(Integer hostCardPages) {
+        this.hostCardPages = hostCardPages;
+    }
+
+    public Integer getHostPagesA4() {
+        return hostPagesA4;
+    }
+
+    public void setHostPagesA4(Integer hostPagesA4) {
+        this.hostPagesA4 = hostPagesA4;
+    }
+
+    public String getPaperNumberAndType() {
+        return paperNumberAndType;
+    }
+
+    public void setPaperNumberAndType(String paperNumberAndType) {
+        this.paperNumberAndType = paperNumberAndType;
+    }
+}

+ 35 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/CourseDimensionOccupiedDto.java

@@ -0,0 +1,35 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 课程知识点占用dto
+ * @Author: CaoZixuan
+ * @Date: 2024-02-28
+ */
+public class CourseDimensionOccupiedDto {
+    @ApiModelProperty("课程目标id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long courseTargetId;
+
+    @ApiModelProperty("知识点占用状态 true:被占用 false:未占用")
+    private Boolean status;
+
+    public Long getCourseTargetId() {
+        return courseTargetId;
+    }
+
+    public void setCourseTargetId(Long courseTargetId) {
+        this.courseTargetId = courseTargetId;
+    }
+
+    public Boolean getStatus() {
+        return status;
+    }
+
+    public void setStatus(Boolean status) {
+        this.status = status;
+    }
+}

+ 88 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/CreatePdfDto.java

@@ -0,0 +1,88 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.distributed.print.business.entity.ExamDetail;
+import com.qmth.distributed.print.business.entity.ExamDetailCourse;
+import com.qmth.distributed.print.business.entity.ExamPrintPlan;
+import com.qmth.teachcloud.common.entity.BasicAttachment;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 生成pdf文件对象
+ */
+public class CreatePdfDto {
+
+    @ApiModelProperty(name = "所有试卷(试卷+备用试卷)")
+    private List<PdfDto> paperPdfList = new ArrayList<>();
+    @ApiModelProperty(name = "所有题卡(题卡+备用题卡)")
+    private List<PdfDto> cardPdfList = new ArrayList<>();
+    @ApiModelProperty(name = "考场对象")
+    private ExamDetail examDetail;
+    @ApiModelProperty(name = "计划对象")
+    private ExamPrintPlan examPrintPlan;
+    @ApiModelProperty(name = "考场课程对象")
+    private List<ExamDetailCourse> examDetailCourseList;
+    @ApiModelProperty(name = "需要删除的临时文件")
+    private List<File> fileTempList = new ArrayList<>();
+    @ApiModelProperty(name = "需要删除的附件数据")
+    private List<BasicAttachment> attachmentList = new ArrayList<>();
+
+    public List<PdfDto> getPaperPdfList() {
+        return paperPdfList;
+    }
+
+    public void setPaperPdfList(List<PdfDto> paperPdfList) {
+        this.paperPdfList = paperPdfList;
+    }
+
+    public List<PdfDto> getCardPdfList() {
+        return cardPdfList;
+    }
+
+    public void setCardPdfList(List<PdfDto> cardPdfList) {
+        this.cardPdfList = cardPdfList;
+    }
+
+    public ExamDetail getExamDetail() {
+        return examDetail;
+    }
+
+    public void setExamDetail(ExamDetail examDetail) {
+        this.examDetail = examDetail;
+    }
+
+    public ExamPrintPlan getExamPrintPlan() {
+        return examPrintPlan;
+    }
+
+    public void setExamPrintPlan(ExamPrintPlan examPrintPlan) {
+        this.examPrintPlan = examPrintPlan;
+    }
+
+    public List<ExamDetailCourse> getExamDetailCourseList() {
+        return examDetailCourseList;
+    }
+
+    public void setExamDetailCourseList(List<ExamDetailCourse> examDetailCourseList) {
+        this.examDetailCourseList = examDetailCourseList;
+    }
+
+    public List<File> getFileTempList() {
+        return fileTempList;
+    }
+
+    public void setFileTempList(List<File> fileTempList) {
+        this.fileTempList = fileTempList;
+    }
+
+    public List<BasicAttachment> getAttachmentList() {
+        return attachmentList;
+    }
+
+    public void setAttachmentList(List<BasicAttachment> attachmentList) {
+        this.attachmentList = attachmentList;
+    }
+}

+ 92 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/DeleteBasicExamStudentStatusDto.java

@@ -0,0 +1,92 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * 考生扫描阅卷状态
+ */
+public class DeleteBasicExamStudentStatusDto {
+
+    @ApiModelProperty(value = "姓名")
+    private String studentName;
+
+    @ApiModelProperty(value = "学号")
+    private String studentCode;
+
+    @ApiModelProperty(value = "课程代码")
+    private String courseCode;
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
+    @ApiModelProperty(value = "开课学院")
+    private String openCollege;
+
+    @ApiModelProperty(value = "是否已扫描上传")
+    private Boolean scanStatus = false;
+
+    @ApiModelProperty(value = "是否有阅卷任务")
+    private Boolean markTaskStatus = false;
+
+    public DeleteBasicExamStudentStatusDto() {
+    }
+
+    public DeleteBasicExamStudentStatusDto(String studentName, String studentCode) {
+        this.studentName = studentName;
+        this.studentCode = studentCode;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getOpenCollege() {
+        return openCollege;
+    }
+
+    public void setOpenCollege(String openCollege) {
+        this.openCollege = openCollege;
+    }
+
+    public Boolean getScanStatus() {
+        return scanStatus;
+    }
+
+    public void setScanStatus(Boolean scanStatus) {
+        this.scanStatus = scanStatus;
+    }
+
+    public Boolean getMarkTaskStatus() {
+        return markTaskStatus;
+    }
+
+    public void setMarkTaskStatus(Boolean markTaskStatus) {
+        this.markTaskStatus = markTaskStatus;
+    }
+}

+ 49 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamDetailCourseDto.java

@@ -0,0 +1,49 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.distributed.print.business.entity.ExamDetailCourse;
+
+/**
+ * 考场科目dto
+ */
+public class ExamDetailCourseDto extends ExamDetailCourse {
+
+    private Long examTaskId;
+
+    private String sequence;
+
+    private String loginName;
+
+    private String realName;
+
+    public Long getExamTaskId() {
+        return examTaskId;
+    }
+
+    public void setExamTaskId(Long examTaskId) {
+        this.examTaskId = examTaskId;
+    }
+
+    public String getSequence() {
+        return sequence;
+    }
+
+    public void setSequence(String sequence) {
+        this.sequence = sequence;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+}

+ 44 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamDetailCourseFieldsDto.java

@@ -0,0 +1,44 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.teachcloud.common.bean.examRule.CodeName;
+import com.qmth.distributed.print.business.entity.ExamDetailCourse;
+
+import java.util.List;
+
+public class ExamDetailCourseFieldsDto {
+
+    private ExamDetailCourse examDetailCourse;
+
+    /**
+     * 基础必填字段
+     */
+    private List<CodeName> requiredFields;
+    /**
+     * 扩展字段
+     */
+    private List<CodeName> extendFields;
+
+    public ExamDetailCourse getExamDetailCourse() {
+        return examDetailCourse;
+    }
+
+    public void setExamDetailCourse(ExamDetailCourse examDetailCourse) {
+        this.examDetailCourse = examDetailCourse;
+    }
+
+    public List<CodeName> getRequiredFields() {
+        return requiredFields;
+    }
+
+    public void setRequiredFields(List<CodeName> requiredFields) {
+        this.requiredFields = requiredFields;
+    }
+
+    public List<CodeName> getExtendFields() {
+        return extendFields;
+    }
+
+    public void setExtendFields(List<CodeName> extendFields) {
+        this.extendFields = extendFields;
+    }
+}

+ 58 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamDetailPdfDownloadDto.java

@@ -0,0 +1,58 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.distributed.print.business.entity.ExamDetail;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: examDetail pdf dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/10/13
+ */
+public class ExamDetailPdfDownloadDto extends ExamDetail {
+
+    @ApiModelProperty(value = "学期名称")
+    private String semesterName;
+
+    @ApiModelProperty(value = "考试名称")
+    private String examName;
+
+    @ApiModelProperty(value = "课程名(课程代码)")
+    private String courseNameCode;
+
+    @ApiModelProperty(value = "试卷编号")
+    private String paperNumber;
+
+    public String getSemesterName() {
+        return semesterName;
+    }
+
+    public void setSemesterName(String semesterName) {
+        this.semesterName = semesterName;
+    }
+
+    public String getExamName() {
+        return examName;
+    }
+
+    public void setExamName(String examName) {
+        this.examName = examName;
+    }
+
+    public String getCourseNameCode() {
+        return courseNameCode;
+    }
+
+    public void setCourseNameCode(String courseNameCode) {
+        this.courseNameCode = courseNameCode;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+}

+ 73 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamStudentCourseClassDto.java

@@ -0,0 +1,73 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.distributed.print.business.entity.ExamStudent;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 考生科目 dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/5/14
+ */
+public class ExamStudentCourseClassDto extends ExamStudent {
+
+    @ApiModelProperty(value = "科目编码")
+    private String courseCode;
+
+    @ApiModelProperty(value = "科目名称")
+    private String courseName;
+
+    @ApiModelProperty("试卷编号")
+    private String paperNumber;
+
+    @ApiModelProperty("任课老师")
+    private String teacherName;
+
+    @ApiModelProperty("任课老师工号")
+    private String teacherNumber;
+
+    @Override
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    @Override
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    @Override
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    @Override
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getTeacherNumber() {
+        return teacherNumber;
+    }
+
+    public void setTeacherNumber(String teacherNumber) {
+        this.teacherNumber = teacherNumber;
+    }
+}

+ 88 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamStudentCourseDto.java

@@ -0,0 +1,88 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.entity.ExamStudent;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 考生科目 dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/5/14
+ */
+public class ExamStudentCourseDto extends ExamStudent {
+
+    @ApiModelProperty(value = "科目编码")
+    private String courseCode;
+
+    @ApiModelProperty(value = "科目名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "A3数量")
+    private Integer paperPageA3;
+
+    @ApiModelProperty("试卷编号")
+    private String paperNumber;
+
+    @ApiModelProperty("任课老师")
+    private String teacherName;
+
+    @ApiModelProperty("任课老师工号")
+    private String teacherNumber;
+
+    @Override
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    @Override
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public Integer getPaperPageA3() {
+        return paperPageA3;
+    }
+
+    public void setPaperPageA3(Integer paperPageA3) {
+        this.paperPageA3 = paperPageA3;
+    }
+
+    @Override
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    @Override
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getTeacherNumber() {
+        return teacherNumber;
+    }
+
+    public void setTeacherNumber(String teacherNumber) {
+        this.teacherNumber = teacherNumber;
+    }
+}

+ 37 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamStudentDto.java

@@ -0,0 +1,37 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 考生 dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2024/3/14
+ */
+public class ExamStudentDto implements Serializable {
+
+    @ApiModelProperty(value = "班级名称")
+    private String clazzNames;
+
+    @ApiModelProperty(value = "老师名称")
+    private String teacherNames;
+
+    public String getClazzNames() {
+        return clazzNames;
+    }
+
+    public void setClazzNames(String clazzNames) {
+        this.clazzNames = clazzNames;
+    }
+
+    public String getTeacherNames() {
+        return teacherNames;
+    }
+
+    public void setTeacherNames(String teacherNames) {
+        this.teacherNames = teacherNames;
+    }
+}

+ 232 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskDetailCardDto.java

@@ -0,0 +1,232 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.distributed.print.business.entity.ExamTaskDetail;
+import com.qmth.teachcloud.common.enums.FlowStatusEnum;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Date: 2021/3/31.
+ */
+public class ExamTaskDetailCardDto {
+
+    private String examTaskId;
+    private String paperConfirmAttachmentIds;
+    private String remark;
+    private String taskStatus;
+    private String cancelRemark;
+    private Boolean enable;
+    private Boolean openAb;
+    private String flowId;
+    private Integer setup;
+    // 审核流程taskId
+    private String flowTaskId;
+    private String examId;
+    private String examModel;
+    private String category;
+    private String examName;
+    private String semesterName;
+    private FlowStatusEnum flowStatus;
+    private String flowStatusStr;
+    private String printContent;
+    private String auditContent;
+    private Boolean review;
+    private String examTaskContent;
+    private String classDesc;
+    private List<ExamTaskDetail> examTaskDetailList;
+
+    public FlowStatusEnum getFlowStatus() {
+        return flowStatus;
+    }
+
+    public void setFlowStatus(FlowStatusEnum flowStatus) {
+        this.flowStatus = flowStatus;
+    }
+
+    public String getFlowStatusStr() {
+        if (Objects.nonNull(flowStatus)) {
+            return flowStatus.getTitle();
+        } else {
+            return flowStatusStr;
+        }
+    }
+
+    public void setFlowStatusStr(String flowStatusStr) {
+        this.flowStatusStr = flowStatusStr;
+    }
+
+    public String getExamTaskId() {
+        return examTaskId;
+    }
+
+    public void setExamTaskId(String examTaskId) {
+        this.examTaskId = examTaskId;
+    }
+
+    public String getPaperConfirmAttachmentIds() {
+        return paperConfirmAttachmentIds;
+    }
+
+    public void setPaperConfirmAttachmentIds(String paperConfirmAttachmentIds) {
+        this.paperConfirmAttachmentIds = paperConfirmAttachmentIds;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getTaskStatus() {
+        return taskStatus;
+    }
+
+    public void setTaskStatus(String taskStatus) {
+        this.taskStatus = taskStatus;
+    }
+
+    public String getCancelRemark() {
+        return cancelRemark;
+    }
+
+    public void setCancelRemark(String cancelRemark) {
+        this.cancelRemark = cancelRemark;
+    }
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Boolean getOpenAb() {
+        return openAb;
+    }
+
+    public void setOpenAb(Boolean openAb) {
+        this.openAb = openAb;
+    }
+
+    //    public String getStatus() {
+//        return status;
+//    }
+//
+//    public void setStatus(String status) {
+//        this.status = status;
+//    }
+    public String getFlowId() {
+        return flowId;
+    }
+
+    public void setFlowId(String flowId) {
+        this.flowId = flowId;
+    }
+
+    public Integer getSetup() {
+        return setup;
+    }
+
+    public void setSetup(Integer setup) {
+        this.setup = setup;
+    }
+
+    public String getFlowTaskId() {
+        return flowTaskId;
+    }
+
+    public void setFlowTaskId(String flowTaskId) {
+        this.flowTaskId = flowTaskId;
+    }
+
+    public String getExamId() {
+        return examId;
+    }
+
+    public void setExamId(String examId) {
+        this.examId = examId;
+    }
+
+    public String getExamName() {
+        return examName;
+    }
+
+    public void setExamName(String examName) {
+        this.examName = examName;
+    }
+
+    public String getExamModel() {
+        return examModel;
+    }
+
+    public void setExamModel(String examModel) {
+        this.examModel = examModel;
+    }
+
+    public String getSemesterName() {
+        return semesterName;
+    }
+
+    public void setSemesterName(String semesterName) {
+        this.semesterName = semesterName;
+    }
+
+    public String getPrintContent() {
+        return printContent;
+    }
+
+    public void setPrintContent(String printContent) {
+        this.printContent = printContent;
+    }
+
+    public Boolean getReview() {
+        return review;
+    }
+
+    public void setReview(Boolean review) {
+        this.review = review;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public void setCategory(String category) {
+        this.category = category;
+    }
+
+    public String getAuditContent() {
+        return auditContent;
+    }
+
+    public void setAuditContent(String auditContent) {
+        this.auditContent = auditContent;
+    }
+
+    public String getExamTaskContent() {
+        return examTaskContent;
+    }
+
+    public void setExamTaskContent(String examTaskContent) {
+        this.examTaskContent = examTaskContent;
+    }
+
+    public List<ExamTaskDetail> getExamTaskDetailList() {
+        return examTaskDetailList;
+    }
+
+    public void setExamTaskDetailList(List<ExamTaskDetail> examTaskDetailList) {
+        this.examTaskDetailList = examTaskDetailList;
+    }
+
+    public String getClassDesc() {
+        return classDesc;
+    }
+
+    public void setClassDesc(String classDesc) {
+        this.classDesc = classDesc;
+    }
+}

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

@@ -0,0 +1,338 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.boot.tools.excel.annotation.ExcelColumn;
+import com.qmth.distributed.print.business.enums.MakeMethodEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Date: 2021/3/31.
+ */
+public class ExamTaskDetailDto {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+    private String examDetailId;
+    private String printPlanId;
+    private String printPlanName;
+    @ExcelColumn(name = "试卷编号", index = 2)
+    private String paperNumber;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long courseId;
+    @ExcelColumn(name = "课程代码", index = 0)
+    private String courseCode;
+    @ExcelColumn(name = "课程名称", index = 1)
+    private String courseName;
+    private String openCollege;
+    private String specialty;
+    private String cardRuleId;
+
+    @ApiModelProperty(value = "题卡规则名称")
+    private String cardRuleName;
+    private String userId;
+    @ExcelColumn(name = "命题老师工号", index = 3)
+    private String loginName;
+    @ExcelColumn(name = "命题老师姓名", index = 4)
+    private String userName;
+    private String status;
+    private Boolean enable;
+    private Boolean examTaskDetailEnable;
+    private String createId;
+    private Long createTime;
+    private String paperType;
+    private String relatePaperType;
+    private String exposedPaperType;
+    private String unexposedPaperType;
+    private Integer totalSubjects;
+    private String examDetailCourseIds;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examId;
+    private String examName;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long semesterId;
+    private String semesterName;
+
+    @ApiModelProperty(value = "题卡制作方式:SELECT-选择已有题卡,SELF-自助创建,CUST-客户制卡")
+    private MakeMethodEnum makeMethod;
+
+    private Integer setup;
+    @ApiModelProperty(value = "机构id")
+    private String orgName;
+
+    @ApiModelProperty(value = "命题任务试卷附件")
+    private String paperAttachmentIds;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getExamDetailId() {
+        return examDetailId;
+    }
+
+    public void setExamDetailId(String examDetailId) {
+        this.examDetailId = examDetailId;
+    }
+
+    public String getPrintPlanId() {
+        return printPlanId;
+    }
+
+    public void setPrintPlanId(String printPlanId) {
+        this.printPlanId = printPlanId;
+    }
+
+    public String getPrintPlanName() {
+        return printPlanName;
+    }
+
+    public void setPrintPlanName(String printPlanName) {
+        this.printPlanName = printPlanName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getOpenCollege() {
+        return openCollege;
+    }
+
+    public void setOpenCollege(String openCollege) {
+        this.openCollege = openCollege;
+    }
+
+    public String getSpecialty() {
+        return specialty;
+    }
+
+    public void setSpecialty(String specialty) {
+        this.specialty = specialty;
+    }
+
+    public String getCardRuleId() {
+        return cardRuleId;
+    }
+
+    public void setCardRuleId(String cardRuleId) {
+        this.cardRuleId = cardRuleId;
+    }
+
+    public String getCardRuleName() {
+        return cardRuleName;
+    }
+
+    public void setCardRuleName(String cardRuleName) {
+        this.cardRuleName = cardRuleName;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Boolean getExamTaskDetailEnable() {
+        return examTaskDetailEnable;
+    }
+
+    public void setExamTaskDetailEnable(Boolean examTaskDetailEnable) {
+        this.examTaskDetailEnable = examTaskDetailEnable;
+    }
+
+    public String getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(String createId) {
+        this.createId = createId;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getRelatePaperType() {
+        return relatePaperType;
+    }
+
+    public void setRelatePaperType(String relatePaperType) {
+        this.relatePaperType = relatePaperType;
+    }
+
+    public String getExposedPaperType() {
+        return exposedPaperType;
+    }
+
+    public void setExposedPaperType(String exposedPaperType) {
+        this.exposedPaperType = exposedPaperType;
+    }
+
+    public String getUnexposedPaperType() {
+        return unexposedPaperType;
+    }
+
+    public void setUnexposedPaperType(String unexposedPaperType) {
+        this.unexposedPaperType = unexposedPaperType;
+    }
+
+    public Integer getTotalSubjects() {
+        return totalSubjects;
+    }
+
+    public void setTotalSubjects(Integer totalSubjects) {
+        this.totalSubjects = totalSubjects;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getExamDetailCourseIds() {
+        return examDetailCourseIds;
+    }
+
+    public void setExamDetailCourseIds(String examDetailCourseIds) {
+        this.examDetailCourseIds = examDetailCourseIds;
+    }
+
+    public MakeMethodEnum getMakeMethod() {
+        return makeMethod;
+    }
+
+    public void setMakeMethod(MakeMethodEnum makeMethod) {
+        this.makeMethod = makeMethod;
+    }
+
+    public Integer getSetup() {
+        return setup;
+    }
+
+    public void setSetup(Integer setup) {
+        this.setup = setup;
+    }
+
+    public String getExamName() {
+        return examName;
+    }
+
+    public void setExamName(String examName) {
+        this.examName = examName;
+    }
+
+    public String getSemesterName() {
+        return semesterName;
+    }
+
+    public void setSemesterName(String semesterName) {
+        this.semesterName = semesterName;
+    }
+
+    public String getOrgName() {
+        return orgName;
+    }
+
+    public void setOrgName(String orgName) {
+        this.orgName = orgName;
+    }
+
+    public String getPaperAttachmentIds() {
+        return paperAttachmentIds;
+    }
+
+    public void setPaperAttachmentIds(String paperAttachmentIds) {
+        this.paperAttachmentIds = paperAttachmentIds;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public Long getSemesterId() {
+        return semesterId;
+    }
+
+    public void setSemesterId(Long semesterId) {
+        this.semesterId = semesterId;
+    }
+}

+ 58 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskDetailPdfDownloadDto.java

@@ -0,0 +1,58 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.distributed.print.business.entity.ExamTaskDetail;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: examTaskDetail pdf dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/10/13
+ */
+public class ExamTaskDetailPdfDownloadDto extends ExamTaskDetail {
+
+    @ApiModelProperty(value = "学期名称")
+    private String semesterName;
+
+    @ApiModelProperty(value = "考试名称")
+    private String examName;
+
+    @ApiModelProperty(value = "课程名(课程代码)")
+    private String courseNameCode;
+
+    @ApiModelProperty(value = "试卷编号")
+    private String paperNumber;
+
+    public String getSemesterName() {
+        return semesterName;
+    }
+
+    public void setSemesterName(String semesterName) {
+        this.semesterName = semesterName;
+    }
+
+    public String getExamName() {
+        return examName;
+    }
+
+    public void setExamName(String examName) {
+        this.examName = examName;
+    }
+
+    public String getCourseNameCode() {
+        return courseNameCode;
+    }
+
+    public void setCourseNameCode(String courseNameCode) {
+        this.courseNameCode = courseNameCode;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+}

+ 401 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskDto.java

@@ -0,0 +1,401 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.enums.FlowJoinTypeEnum;
+import com.qmth.teachcloud.common.bean.result.SysUserResult;
+import com.qmth.teachcloud.common.enums.ExamModelEnum;
+import com.qmth.teachcloud.common.enums.FlowStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Date: 2021/3/31.
+ */
+public class ExamTaskDto {
+
+    private String id;
+    private String paperNumber;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long courseId;
+    private String courseCode;
+    private String courseName;
+    private String openCollege;
+    private String sequence;
+    private String specialty;
+    private String cardRuleId;
+    private String cardRuleName;
+    private String userId;
+    private String userName;
+    private Long startTime;
+    private Long endTime;
+    private String status;
+    private Boolean review;
+    private Boolean enable;
+    private String createId;
+    private String createName;
+    private Long createTime;
+    private String auditStatus;
+    private String reviewStatus;
+    private String teacherName;
+    private String lecturerName;
+    private String teachingRoomName;
+    private String flowId;
+    private Integer setup;
+    private FlowStatusEnum flowStatus;
+    private String flowStatusStr;
+    private String statusStr;
+    private List<SysUserResult> users;
+    private boolean myself;
+    @ApiModelProperty(value = "审批表展示状态")
+    private Boolean approveFormStatus;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "考试id")
+    private Long examId;
+
+    @ApiModelProperty(value = "考试名称")
+    private String examName;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "学期id")
+    private Long semesterId;
+
+    @ApiModelProperty(value = "学期名称")
+    private String semesterName;
+
+    @ApiModelProperty(value = "考试模式")
+    private ExamModelEnum examModel;
+
+    @ApiModelProperty(value = "审批次数")
+    private Integer approveCount;
+
+    @ApiModelProperty(value = "流程类型")
+    private FlowJoinTypeEnum flowType;
+
+    public Integer getApproveCount() {
+        return approveCount;
+    }
+
+    public void setApproveCount(Integer approveCount) {
+        this.approveCount = approveCount;
+    }
+
+    public FlowJoinTypeEnum getFlowType() {
+        return flowType;
+    }
+
+    public void setFlowType(FlowJoinTypeEnum flowType) {
+        this.flowType = flowType;
+    }
+
+    public Boolean getApproveFormStatus() {
+        return approveFormStatus;
+    }
+
+    public void setApproveFormStatus(Boolean approveFormStatus) {
+        this.approveFormStatus = approveFormStatus;
+    }
+
+    public boolean isMyself() {
+        return myself;
+    }
+
+    public void setMyself(boolean myself) {
+        this.myself = myself;
+    }
+
+    public FlowStatusEnum getFlowStatus() {
+        return flowStatus;
+    }
+
+    public void setFlowStatus(FlowStatusEnum flowStatus) {
+        this.flowStatus = flowStatus;
+    }
+
+    public String getFlowStatusStr() {
+        if (Objects.nonNull(flowStatus)) {
+            return flowStatus.getTitle();
+        } else {
+            return flowStatusStr;
+        }
+    }
+
+    public void setFlowStatusStr(String flowStatusStr) {
+        this.flowStatusStr = flowStatusStr;
+    }
+
+    public String getStatusStr() {
+        return statusStr;
+    }
+
+    public void setStatusStr(String statusStr) {
+        this.statusStr = statusStr;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getOpenCollege() {
+        return openCollege;
+    }
+
+    public void setOpenCollege(String openCollege) {
+        this.openCollege = openCollege;
+    }
+
+    public String getSequence() {
+        return sequence;
+    }
+
+    public void setSequence(String sequence) {
+        this.sequence = sequence;
+    }
+
+    public String getSpecialty() {
+        return specialty;
+    }
+
+    public void setSpecialty(String specialty) {
+        this.specialty = specialty;
+    }
+
+    public Boolean getReview() {
+        return review;
+    }
+
+    public void setReview(Boolean review) {
+        this.review = review;
+    }
+
+    public String getCardRuleId() {
+        return cardRuleId;
+    }
+
+    public void setCardRuleId(String cardRuleId) {
+        this.cardRuleId = cardRuleId;
+    }
+
+    public String getCardRuleName() {
+        return cardRuleName;
+    }
+
+    public void setCardRuleName(String cardRuleName) {
+        this.cardRuleName = cardRuleName;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public Long getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Long startTime) {
+        this.startTime = startTime;
+    }
+
+    public Long getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Long endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public String getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(String createId) {
+        this.createId = createId;
+    }
+
+    public String getCreateName() {
+        return createName;
+    }
+
+    public void setCreateName(String createName) {
+        this.createName = createName;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    public List<SysUserResult> getUsers() {
+        return users;
+    }
+
+    public void setUsers(List<SysUserResult> users) {
+        this.users = users;
+    }
+
+    public String getAuditStatus() {
+        return auditStatus;
+    }
+
+    public void setAuditStatus(String auditStatus) {
+        this.auditStatus = auditStatus;
+    }
+
+    public String getReviewStatus() {
+        return reviewStatus;
+    }
+
+    public void setReviewStatus(String reviewStatus) {
+        this.reviewStatus = reviewStatus;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getLecturerName() {
+        return lecturerName;
+    }
+
+    public void setLecturerName(String lecturerName) {
+        this.lecturerName = lecturerName;
+    }
+
+    public String getTeachingRoomName() {
+        return teachingRoomName;
+    }
+
+    public void setTeachingRoomName(String teachingRoomName) {
+        this.teachingRoomName = teachingRoomName;
+    }
+
+    public String getFlowId() {
+        return flowId;
+    }
+
+    public void setFlowId(String flowId) {
+        this.flowId = flowId;
+    }
+
+    public Integer getSetup() {
+        return setup;
+    }
+
+    public void setSetup(Integer setup) {
+        this.setup = setup;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getExamName() {
+        return examName;
+    }
+
+    public void setExamName(String examName) {
+        this.examName = examName;
+    }
+
+    public Long getSemesterId() {
+        return semesterId;
+    }
+
+    public void setSemesterId(Long semesterId) {
+        this.semesterId = semesterId;
+    }
+
+    public String getSemesterName() {
+        return semesterName;
+    }
+
+    public void setSemesterName(String semesterName) {
+        this.semesterName = semesterName;
+    }
+
+    public ExamModelEnum getExamModel() {
+        return examModel;
+    }
+
+    public void setExamModel(ExamModelEnum examModel) {
+        this.examModel = examModel;
+    }
+}

+ 72 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskImportDto.java

@@ -0,0 +1,72 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+
+public class ExamTaskImportDto {
+
+    @NotNull
+    @ExcelNote(value = "课程代码")
+    private String courseCode;
+    @NotNull
+    @ExcelNote(value = "课程名称")
+    private String courseName;
+    @NotNull
+    @ExcelNote(value = "开课学院")
+    private String teachingRoomName;
+    @ExcelNote(value = "试卷编号")
+    private String paperNumber;
+    @ExcelNote(value = "命题老师工号")
+    private String userAccount;
+    @ExcelNote(value = "命题老师姓名")
+    private String userName;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getTeachingRoomName() {
+        return teachingRoomName;
+    }
+
+    public void setTeachingRoomName(String teachingRoomName) {
+        this.teachingRoomName = teachingRoomName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getUserAccount() {
+        return userAccount;
+    }
+
+    public void setUserAccount(String userAccount) {
+        this.userAccount = userAccount;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+}

+ 39 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskImportResultDto.java

@@ -0,0 +1,39 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import java.util.List;
+
+/**
+ * @Date: 2021/4/1.
+ */
+public class ExamTaskImportResultDto {
+
+    private String batchNo;
+
+    private String errorMsg;
+
+    private List<ExamTaskDto> tasks;
+
+    public String getBatchNo() {
+        return batchNo;
+    }
+
+    public void setBatchNo(String batchNo) {
+        this.batchNo = batchNo;
+    }
+
+    public String getErrorMsg() {
+        return errorMsg;
+    }
+
+    public void setErrorMsg(String errorMsg) {
+        this.errorMsg = errorMsg;
+    }
+
+    public List<ExamTaskDto> getTasks() {
+        return tasks;
+    }
+
+    public void setTasks(List<ExamTaskDto> tasks) {
+        this.tasks = tasks;
+    }
+}

+ 59 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskImportTaskUserDto.java

@@ -0,0 +1,59 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+public class ExamTaskImportTaskUserDto {
+
+    private Long courseId;
+    private String courseCode;
+    private String courseName;
+    private String paperNumber;
+    private String specialty;
+    private Long userId;
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getSpecialty() {
+        return specialty;
+    }
+
+    public void setSpecialty(String specialty) {
+        this.specialty = specialty;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+}

+ 106 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskPaperExportDto.java

@@ -0,0 +1,106 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.teachcloud.common.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 试卷批量下载导出excelDto
+ * @Author: CaoZixuan
+ * @Date: 2022-04-11
+ */
+public class ExamTaskPaperExportDto implements Serializable {
+    @ApiModelProperty(value = "课程名称")
+    @ExcelProperty(name = "课程名称", width = 30, index = 1)
+    private String courseName;
+
+    @ApiModelProperty(value = "课程代码")
+    @ExcelProperty(name = "课程代码", width = 30, index = 2)
+    private String courseCode;
+
+    @ApiModelProperty(value = "试卷编号")
+    @ExcelProperty(name = "试卷编号", width = 30, index = 3)
+    private String paperNumber;
+
+    @ApiModelProperty(value = "全部卷型")
+    @ExcelProperty(name = "全部卷型", width = 30, index = 4)
+    private String paperType;
+
+    @ApiModelProperty(value = "曝光卷型")
+    @ExcelProperty(name = "曝光卷型", width = 30, index = 5)
+    private String exposedPaperType;
+
+    @ApiModelProperty(value = "未曝光卷型")
+    @ExcelProperty(name = "未曝光卷型", width = 30, index = 6)
+    private String unexposedPaperType;
+
+    @ApiModelProperty(value = "处理结果")
+    @ExcelProperty(name = "处理结果", width = 100, index = 7)
+    private String result;
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public ExamTaskPaperExportDto() {
+    }
+
+    public ExamTaskPaperExportDto(ExamTaskDetailDto examTaskDetailDto) {
+        this.courseName = examTaskDetailDto.getCourseName();
+        this.courseCode = examTaskDetailDto.getCourseCode();
+        this.paperNumber = examTaskDetailDto.getPaperNumber();
+    }
+
+    public String getExposedPaperType() {
+        return exposedPaperType;
+    }
+
+    public void setExposedPaperType(String exposedPaperType) {
+        this.exposedPaperType = exposedPaperType;
+    }
+
+    public String getUnexposedPaperType() {
+        return unexposedPaperType;
+    }
+
+    public void setUnexposedPaperType(String unexposedPaperType) {
+        this.unexposedPaperType = unexposedPaperType;
+    }
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+}

+ 164 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskPlanStatisticDto.java

@@ -0,0 +1,164 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.enums.BackupMethodEnum;
+import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 命题计划统计Dto
+ * @Author: CaoZixuan
+ * @Date: 2022-04-25
+ */
+public class ExamTaskPlanStatisticDto implements Serializable {
+
+    @ApiModelProperty(value = "考试id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examId;
+
+    @ApiModelProperty(value = "印刷计划id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examPrintPlanId;
+
+    @ApiModelProperty(value = "备份方式")
+    private BackupMethodEnum backupMethod;
+
+    @ApiModelProperty(value = "备份数量")
+    private Integer backupCount;
+
+    @ApiModelProperty(value = "印刷计划名称")
+    private String examPrintPlanName;
+
+    @ApiModelProperty(value = "考场表id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examDetailId;
+
+    @ApiModelProperty(value = "考场表印刷状态")
+    private ExamDetailStatusEnum examDetailStatus;
+
+    @ApiModelProperty(value = "考试科目表id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examDetailCourseId;
+
+    @ApiModelProperty(value = "试卷编号")
+    private String paperNumber;
+
+    @ApiModelProperty(value = "课程编号")
+    private String courseCode;
+
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "班级名称逗号隔开")
+    private String clazzIds;
+
+    @ApiModelProperty(value = "学生数量")
+    private Integer studentCount;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public BackupMethodEnum getBackupMethod() {
+        return backupMethod;
+    }
+
+    public void setBackupMethod(BackupMethodEnum backupMethod) {
+        this.backupMethod = backupMethod;
+    }
+
+    public Integer getBackupCount() {
+        return backupCount;
+    }
+
+    public void setBackupCount(Integer backupCount) {
+        this.backupCount = backupCount;
+    }
+
+    public Long getExamPrintPlanId() {
+        return examPrintPlanId;
+    }
+
+    public void setExamPrintPlanId(Long examPrintPlanId) {
+        this.examPrintPlanId = examPrintPlanId;
+    }
+
+    public String getExamPrintPlanName() {
+        return examPrintPlanName;
+    }
+
+    public void setExamPrintPlanName(String examPrintPlanName) {
+        this.examPrintPlanName = examPrintPlanName;
+    }
+
+    public Long getExamDetailId() {
+        return examDetailId;
+    }
+
+    public void setExamDetailId(Long examDetailId) {
+        this.examDetailId = examDetailId;
+    }
+
+    public ExamDetailStatusEnum getExamDetailStatus() {
+        return examDetailStatus;
+    }
+
+    public void setExamDetailStatus(ExamDetailStatusEnum examDetailStatus) {
+        this.examDetailStatus = examDetailStatus;
+    }
+
+    public Long getExamDetailCourseId() {
+        return examDetailCourseId;
+    }
+
+    public void setExamDetailCourseId(Long examDetailCourseId) {
+        this.examDetailCourseId = examDetailCourseId;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getClazzIds() {
+        return clazzIds;
+    }
+
+    public void setClazzIds(String clazzIds) {
+        this.clazzIds = clazzIds;
+    }
+
+    public Integer getStudentCount() {
+        return studentCount;
+    }
+
+    public void setStudentCount(Integer studentCount) {
+        this.studentCount = studentCount;
+    }
+}

+ 170 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExaminationExportDto.java

@@ -0,0 +1,170 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 考务数据导出Dto
+ * @Author: CaoZixuan
+ * @Date: 2021-04-15
+ */
+public class ExaminationExportDto {
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "序号")
+    @ExcelProperty(name = "序号", width = 7, index = 1)
+    private Long index;
+
+    @ApiModelProperty(value = "学期名称")
+    @ExcelProperty(name = "学期名称", width = 30, index = 2)
+    private String semesterName;
+
+    @ApiModelProperty(value = "考试名称")
+    @ExcelProperty(name = "考试名称", width = 30, index = 3)
+    private String examName;
+
+    @ApiModelProperty(value = "印刷计划名称")
+    @ExcelProperty(name = "印刷计划名称", width = 30, index = 4)
+    private String printPlanName;
+
+    @ApiModelProperty(value = "考试日期")
+    @ExcelProperty(name = "考试日期", width = 13, index = 5)
+    private String examDate;
+
+    @ApiModelProperty(value = "考试时间")
+    @ExcelProperty(name = "考试时间", width = 16, index = 6)
+    private String examTime;
+
+    @ApiModelProperty(value = "考点")
+    @ExcelProperty(name = "考点", width = 25, index = 7)
+    private String examPlace;
+
+    @ApiModelProperty(value = "考场")
+    @ExcelProperty(name = "考场", width = 25, index = 8)
+    private String examRoom;
+
+    @ApiModelProperty(value = "卷袋号")
+    @ExcelProperty(name = "卷袋号", width = 10, index = 9)
+    private String packageCode;
+
+    @ApiModelProperty(value = "课程(代码)")
+    @ExcelProperty(name = "课程(代码)", width = 30, index = 10)
+    private String courseNameCode;
+
+    @ApiModelProperty(value = "试卷编号")
+    @ExcelProperty(name = "试卷编号", width = 30, index = 11)
+    private String paperNumber;
+
+    @ApiModelProperty(value = "科次")
+    @ExcelProperty(name = "科次", width = 10, index = 12)
+    private int totalSubjects;
+
+    @ApiModelProperty(value = "题卡类型")
+    @ExcelProperty(name = "题卡类型", width = 17, index = 13)
+    private String cardType;
+
+    public Long getIndex() {
+        return index;
+    }
+
+    public void setIndex(Long index) {
+        this.index = index;
+    }
+
+    public String getSemesterName() {
+        return semesterName;
+    }
+
+    public void setSemesterName(String semesterName) {
+        this.semesterName = semesterName;
+    }
+
+    public String getExamName() {
+        return examName;
+    }
+
+    public void setExamName(String examName) {
+        this.examName = examName;
+    }
+
+    public String getPrintPlanName() {
+        return printPlanName;
+    }
+
+    public void setPrintPlanName(String printPlanName) {
+        this.printPlanName = printPlanName;
+    }
+
+    public String getExamDate() {
+        return examDate;
+    }
+
+    public void setExamDate(String examDate) {
+        this.examDate = examDate;
+    }
+
+    public String getExamTime() {
+        return examTime;
+    }
+
+    public void setExamTime(String examTime) {
+        this.examTime = examTime;
+    }
+
+    public String getExamPlace() {
+        return examPlace;
+    }
+
+    public void setExamPlace(String examPlace) {
+        this.examPlace = examPlace;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getPackageCode() {
+        return packageCode;
+    }
+
+    public void setPackageCode(String packageCode) {
+        this.packageCode = packageCode;
+    }
+
+    public String getCourseNameCode() {
+        return courseNameCode;
+    }
+
+    public void setCourseNameCode(String courseNameCode) {
+        this.courseNameCode = courseNameCode;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public int getTotalSubjects() {
+        return totalSubjects;
+    }
+
+    public void setTotalSubjects(int totalSubjects) {
+        this.totalSubjects = totalSubjects;
+    }
+
+    public String getCardType() {
+        return cardType;
+    }
+
+    public void setCardType(String cardType) {
+        this.cardType = cardType;
+    }
+}

+ 307 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExaminationImportDto.java

@@ -0,0 +1,307 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.teachcloud.common.bean.examRule.CodeNameEnableValue;
+import com.qmth.teachcloud.common.bean.examRule.FieldsDto;
+import com.qmth.teachcloud.common.annotation.ExcelDBFieldDesc;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * @Description: 考务数据导入Dto(对应 通用规则字段名称 同时作为考务数据表所需要的的字段,来接收excel导入的考务数据)
+ * @Author: CaoZixuan
+ * @Date: 2021-04-25
+ */
+public class ExaminationImportDto {
+
+    @ApiModelProperty(value = "学号")
+    @ExcelDBFieldDesc(name = "学号")
+    private String studentCode;
+
+    @ApiModelProperty(value = "考号")
+    @ExcelDBFieldDesc(name = "考号")
+    private String ticketNumber;
+
+    @ApiModelProperty(value = "座位号")
+    @ExcelDBFieldDesc(name = "座位号")
+    private String siteNumber;
+
+    @ApiModelProperty(value = "姓名")
+    @ExcelDBFieldDesc(name = "姓名")
+    private String studentName;
+
+    @ApiModelProperty(value = "课程代码")
+    @ExcelDBFieldDesc(name = "课程代码")
+    private String courseCode;
+
+    @ApiModelProperty(value = "课程名称")
+    @ExcelDBFieldDesc(name = "课程名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "校区(考点)")
+    @ExcelDBFieldDesc(name = "校区(考点)")
+    private String examPlace;
+
+    @ApiModelProperty(value = "考试教室(考场)")
+    @ExcelDBFieldDesc(name = "考试教室(考场)")
+    private String examRoom;
+
+    @ApiModelProperty(value = "考试日期")
+    @ExcelDBFieldDesc(name = "考试日期")
+    private String examDate;
+
+    @ApiModelProperty(value = "考试时间")
+    @ExcelDBFieldDesc(name = "考试时间")
+    private String examTime;
+
+    @ApiModelProperty(value = "试卷编号")
+    @ExcelDBFieldDesc(name = "试卷编号")
+    private String paperNumber;
+
+    @ApiModelProperty(value = "学院")
+    @ExcelDBFieldDesc(name = "学院")
+    private String collegeName;
+
+    @ApiModelProperty(value = "专业")
+    @ExcelDBFieldDesc(name = "专业")
+    private String majorName;
+
+    @ApiModelProperty(value = "教学班")
+    @ExcelDBFieldDesc(name = "教学班")
+    private String teachClazzName;
+
+    @ApiModelProperty(value = "行政班")
+    @ExcelDBFieldDesc(name = "行政班")
+    private String clazzName;
+
+    @ApiModelProperty(value = "任课老师")
+    @ExcelDBFieldDesc(name = "任课老师")
+    private String teacherName;
+
+    @ApiModelProperty(value = "课程创建的任务序号")
+    private String sequence;
+
+    @ApiModelProperty(value = "备选字段集合")
+    private List<CodeNameEnableValue> requiredFieldList;
+    @ApiModelProperty(value = "备选字段集合")
+    private List<FieldsDto> secondaryFieldList;
+
+    @ApiModelProperty(value = "考试开始时间")
+    private String examStartTime;
+
+    @ApiModelProperty(value = "考试结束时间")
+    private String examEndTime;
+
+    @ApiModelProperty(value = "学校id")
+    private Long schoolId;
+
+    @ApiModelProperty(value = "报错信息")
+    private String errorMessage;
+
+    @ApiModelProperty(value = "任课老师ID")
+    private Long teacherId;
+
+    private String coursePaperId;
+    public ExaminationImportDto() {
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getTicketNumber() {
+        return ticketNumber;
+    }
+
+    public void setTicketNumber(String ticketNumber) {
+        this.ticketNumber = ticketNumber;
+    }
+
+    public String getSiteNumber() {
+        return siteNumber;
+    }
+
+    public void setSiteNumber(String siteNumber) {
+        this.siteNumber = siteNumber;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getExamPlace() {
+        return examPlace;
+    }
+
+    public void setExamPlace(String examPlace) {
+        this.examPlace = examPlace;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getExamDate() {
+        return examDate;
+    }
+
+    public void setExamDate(String examDate) {
+        this.examDate = examDate;
+    }
+
+    public String getExamTime() {
+        return examTime;
+    }
+
+    public void setExamTime(String examTime) {
+        this.examTime = examTime;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getSequence() {
+        return sequence;
+    }
+
+    public void setSequence(String sequence) {
+        this.sequence = sequence;
+    }
+
+    public List<CodeNameEnableValue> getRequiredFieldList() {
+        return requiredFieldList;
+    }
+
+    public void setRequiredFieldList(List<CodeNameEnableValue> requiredFieldList) {
+        this.requiredFieldList = requiredFieldList;
+    }
+
+    public List<FieldsDto> getSecondaryFieldList() {
+        return secondaryFieldList;
+    }
+
+    public void setSecondaryFieldList(List<FieldsDto> secondaryFieldList) {
+        this.secondaryFieldList = secondaryFieldList;
+    }
+
+    public String getExamStartTime() {
+        return examStartTime;
+    }
+
+    public void setExamStartTime(String examStartTime) {
+        this.examStartTime = examStartTime;
+    }
+
+    public String getExamEndTime() {
+        return examEndTime;
+    }
+
+    public void setExamEndTime(String examEndTime) {
+        this.examEndTime = examEndTime;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getCollegeName() {
+        return collegeName;
+    }
+
+    public void setCollegeName(String collegeName) {
+        this.collegeName = collegeName;
+    }
+
+    public String getMajorName() {
+        return majorName;
+    }
+
+    public void setMajorName(String majorName) {
+        this.majorName = majorName;
+    }
+
+    public String getClazzName() {
+        return clazzName;
+    }
+
+    public void setClazzName(String clazzName) {
+        this.clazzName = clazzName;
+    }
+
+    public String getTeachClazzName() {
+        return teachClazzName;
+    }
+
+    public void setTeachClazzName(String teachClazzName) {
+        this.teachClazzName = teachClazzName;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+
+    public void setErrorMessage(String errorMessage) {
+        this.errorMessage = errorMessage;
+    }
+
+    public String getCoursePaperId() {
+        return coursePaperId;
+    }
+
+    public void setCoursePaperId(String coursePaperId) {
+        this.coursePaperId = coursePaperId;
+    }
+}

+ 92 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/GradeBatchStudentClazzDto.java

@@ -0,0 +1,92 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.teachcloud.common.annotation.ExcelImportTempleteVaild;
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+/**
+ * <p>
+ * 考务数据班级(包含任课老师)
+ * </p>
+ *
+ * @since 2022-07-14
+ */
+@ExcelImportTempleteVaild(value = true)
+public class GradeBatchStudentClazzDto {
+
+    @ExcelNote("课程代码")
+    private String courseCode;
+
+    @ExcelNote("课程名称")
+    private String courseName;
+
+    @ExcelNote("试卷编号")
+    private String paperNumber;
+
+    @ExcelNote("试卷类型")
+    private String paperType;
+
+    @ExcelNote("班级名称")
+    private String clazzName;
+
+    @ExcelNote("任课老师")
+    private String teacherName;
+
+    @ExcelNote("任课老师工号")
+    private String teacherNumber;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getClazzName() {
+        return clazzName;
+    }
+
+    public void setClazzName(String clazzName) {
+        this.clazzName = clazzName;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getTeacherNumber() {
+        return teacherNumber;
+    }
+
+    public void setTeacherNumber(String teacherNumber) {
+        this.teacherNumber = teacherNumber;
+    }
+}

+ 97 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/GradeBatchStudentDto.java

@@ -0,0 +1,97 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.teachcloud.common.annotation.ExcelImportTempleteVaild;
+
+/**
+ * <p>
+ * 考务数据(包含任课老师)
+ * </p>
+ *
+ * @author wangliang
+ * @since 2022-05-20
+ */
+@ExcelImportTempleteVaild(value = true)
+public class GradeBatchStudentDto {
+
+    private String courseCode;
+    private String courseName;
+    private String paperNumber;
+    private String paperType;
+    private String studentCode;
+    private String studentName;
+    private String ticketNumber;
+    private String teacherName;
+    private String teacherNumber;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getTicketNumber() {
+        return ticketNumber;
+    }
+
+    public void setTicketNumber(String ticketNumber) {
+        this.ticketNumber = ticketNumber;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getTeacherNumber() {
+        return teacherNumber;
+    }
+
+    public void setTeacherNumber(String teacherNumber) {
+        this.teacherNumber = teacherNumber;
+    }
+}

+ 180 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/MakeupExamTaskDto.java

@@ -0,0 +1,180 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
+
+/**
+ * 补考任务
+ */
+public class MakeupExamTaskDto {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long printPlanId;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examId;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examDetailId;
+    private String courseId;
+    private String courseCode;
+    private String courseName;
+    private String paperNumber;
+    // 校区
+    private String campusName;
+    // 班级
+    private String className;
+    private String loginName;
+    private String realName;
+    // 印刷室ID
+    private Long printHouseId;
+    private String unexposedPaperType;
+    private String exposedPaperType;
+    private ExamDetailStatusEnum status;
+    private String statusDisplay;
+    private Integer totalSubjects;
+    private Integer backupCount;
+
+    public Long getPrintPlanId() {
+        return printPlanId;
+    }
+
+    public void setPrintPlanId(Long printPlanId) {
+        this.printPlanId = printPlanId;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public Long getExamDetailId() {
+        return examDetailId;
+    }
+
+    public void setExamDetailId(Long examDetailId) {
+        this.examDetailId = examDetailId;
+    }
+
+    public String getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(String courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getCampusName() {
+        return campusName;
+    }
+
+    public void setCampusName(String campusName) {
+        this.campusName = campusName;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public Long getPrintHouseId() {
+        return printHouseId;
+    }
+
+    public void setPrintHouseId(Long printHouseId) {
+        this.printHouseId = printHouseId;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public String getUnexposedPaperType() {
+        return unexposedPaperType;
+    }
+
+    public void setUnexposedPaperType(String unexposedPaperType) {
+        this.unexposedPaperType = unexposedPaperType;
+    }
+
+    public String getExposedPaperType() {
+        return exposedPaperType;
+    }
+
+    public void setExposedPaperType(String exposedPaperType) {
+        this.exposedPaperType = exposedPaperType;
+    }
+
+    public ExamDetailStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(ExamDetailStatusEnum status) {
+        this.status = status;
+    }
+
+    public String getStatusDisplay() {
+        return this.status != null ? status.getName() : statusDisplay;
+    }
+
+    public void setStatusDisplay(String statusDisplay) {
+        this.statusDisplay = statusDisplay;
+    }
+
+    public Integer getTotalSubjects() {
+        return totalSubjects;
+    }
+
+    public void setTotalSubjects(Integer totalSubjects) {
+        this.totalSubjects = totalSubjects;
+    }
+
+    public Integer getBackupCount() {
+        return backupCount;
+    }
+
+    public void setBackupCount(Integer backupCount) {
+        this.backupCount = backupCount;
+    }
+}

+ 156 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ObjectiveStructDto.java

@@ -0,0 +1,156 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.boot.tools.excel.annotation.ExcelColumn;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 客观题结构Dto
+ * @Author: CaoZixuan
+ * @Date: 2024/04/08
+ */
+public class ObjectiveStructDto implements Serializable {
+
+    @ApiModelProperty(value = "课程代码")
+    @ExcelColumn(name = "课程代码", index = 1, nullable = true)
+    private String courseCode;
+
+    @ApiModelProperty(value = "课程名称")
+    @ExcelColumn(name = "课程名称", index = 2, nullable = true)
+    private String courseName;
+
+    @ApiModelProperty(value = "试卷编号")
+    @ExcelColumn(name = "试卷编号", index = 3, nullable = true)
+    private String paperNumber;
+
+    @ApiModelProperty(value = "大题名称")
+    @ExcelColumn(name = "大题名称", index = 4, nullable = true)
+    private String mainTitle;
+
+    @ApiModelProperty(value = "大题号(只能用小写数字)")
+    @ExcelColumn(name = "大题号(只能用小写数字)", index = 5, nullable = true)
+    private Integer mainNumber;
+
+    @ApiModelProperty(value = "小题号(只能用小写数字)")
+    @ExcelColumn(name = "小题号(只能用小写数字)", index = 6, nullable = true)
+    private Integer subNumber;
+
+    @ApiModelProperty(value = "标准答案")
+    @ExcelColumn(name = "标准答案", index = 7, nullable = true)
+    private String answer;
+
+    @ApiModelProperty(value = "选项个数")
+    @ExcelColumn(name = "选项个数", index = 8, nullable = true)
+    private Integer optionCount;
+
+    @ApiModelProperty(value = "小题满分")
+    @ExcelColumn(name = "小题满分", index = 9, nullable = true)
+    private Double totalScore;
+
+    @ApiModelProperty(value = "题型(1-单选,2-多选,3-判断)")
+    @ExcelColumn(name = "题型(1-单选,2-多选,3-判断)", index = 10, nullable = true)
+    private Integer questionType;
+
+    @ApiModelProperty(value = "错误信息")
+    @ExcelColumn(name = "错误信息", index = 11, nullable = true)
+    private String errorMsg;
+
+    private Long courseId;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getMainTitle() {
+        return mainTitle;
+    }
+
+    public void setMainTitle(String mainTitle) {
+        this.mainTitle = mainTitle;
+    }
+
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public Integer getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+    public Integer getOptionCount() {
+        return optionCount;
+    }
+
+    public void setOptionCount(Integer optionCount) {
+        this.optionCount = optionCount;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public Integer getQuestionType() {
+        return questionType;
+    }
+
+    public void setQuestionType(Integer questionType) {
+        this.questionType = questionType;
+    }
+
+    public String getErrorMsg() {
+        return errorMsg;
+    }
+
+    public void setErrorMsg(String errorMsg) {
+        this.errorMsg = errorMsg;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+}

+ 134 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ObjectiveStructImportDto.java

@@ -0,0 +1,134 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.boot.tools.excel.annotation.ExcelColumn;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 客观题结构Dto
+ * @Author: CaoZixuan
+ * @Date: 2024/04/08
+ */
+public class ObjectiveStructImportDto implements Serializable {
+
+    @ApiModelProperty(value = "课程代码")
+    @ExcelColumn(name = "课程代码", index = 1, nullable = true)
+    private String courseCode;
+
+    @ApiModelProperty(value = "课程名称")
+    @ExcelColumn(name = "课程名称", index = 2, nullable = true)
+    private String courseName;
+
+    @ApiModelProperty(value = "试卷编号")
+    @ExcelColumn(name = "试卷编号", index = 3, nullable = true)
+    private String paperNumber;
+
+    @ApiModelProperty(value = "大题名称")
+    @ExcelColumn(name = "大题名称", index = 4, nullable = true)
+    private String mainTitle;
+
+    @ApiModelProperty(value = "大题号(只能用小写数字)")
+    @ExcelColumn(name = "大题号(只能用小写数字)", index = 5, nullable = true)
+    private Integer mainNumber;
+
+    @ApiModelProperty(value = "小题号(只能用小写数字)")
+    @ExcelColumn(name = "小题号(只能用小写数字)", index = 6, nullable = true)
+    private Integer subNumber;
+
+    @ApiModelProperty(value = "标准答案")
+    @ExcelColumn(name = "标准答案", index = 7, nullable = true)
+    private String answer;
+
+    @ApiModelProperty(value = "选项个数")
+    @ExcelColumn(name = "选项个数", index = 8, nullable = true)
+    private Integer optionCount;
+
+    @ApiModelProperty(value = "小题满分")
+    @ExcelColumn(name = "小题满分", index = 9, nullable = true)
+    private Double totalScore;
+
+    @ApiModelProperty(value = "题型(1-单选,2-多选,3-判断)")
+    @ExcelColumn(name = "题型(1-单选,2-多选,3-判断)", index = 10, nullable = true)
+    private Integer questionType;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getMainTitle() {
+        return mainTitle;
+    }
+
+    public void setMainTitle(String mainTitle) {
+        this.mainTitle = mainTitle;
+    }
+
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public Integer getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+    public Integer getOptionCount() {
+        return optionCount;
+    }
+
+    public void setOptionCount(Integer optionCount) {
+        this.optionCount = optionCount;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public Integer getQuestionType() {
+        return questionType;
+    }
+
+    public void setQuestionType(Integer questionType) {
+        this.questionType = questionType;
+    }
+}

+ 77 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PaperPdfDto.java

@@ -0,0 +1,77 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.teachcloud.common.enums.PageSizeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.File;
+import java.io.Serializable;
+
+/**
+ * @Description: 试卷pdf dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/4/26
+ */
+public class PaperPdfDto implements Serializable {
+
+    @ApiModelProperty(name = "文件")
+    File file;
+
+    @ApiModelProperty(name = "页面大小")
+    int pages;
+
+    @ApiModelProperty(name = "卷型")
+    String type;
+
+    @ApiModelProperty(value = "pdf格式")
+    PageSizeEnum pageSize;
+
+    public PaperPdfDto() {
+
+    }
+
+    public PaperPdfDto(File file, int pages) {
+        this.file = file;
+        this.pages = pages;
+    }
+
+    public PaperPdfDto(String type, File file, int pages, PageSizeEnum pageSize) {
+        this.type = type;
+        this.file = file;
+        this.pages = pages;
+        this.pageSize = pageSize;
+    }
+
+    public PageSizeEnum getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(PageSizeEnum pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public File getFile() {
+        return file;
+    }
+
+    public void setFile(File file) {
+        this.file = file;
+    }
+
+    public int getPages() {
+        return pages;
+    }
+
+    public void setPages(int pages) {
+        this.pages = pages;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+}

+ 119 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PdfDto.java

@@ -0,0 +1,119 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.teachcloud.common.enums.PageSizeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: pdf dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/4/13
+ */
+public class PdfDto {
+
+    @ApiModelProperty(name = "路径")
+    String path;
+
+    @ApiModelProperty(name = "页数")
+    int pageCount = 0;
+
+    @ApiModelProperty(name = "实际页数")
+    int actualPageCount = 0;
+
+    @ApiModelProperty(name = "页面大小")
+    PageSizeEnum pageSize;
+
+    @ApiModelProperty(name = "序号")
+    int sequence = 0;
+
+    @ApiModelProperty(name = "是否大于2页")
+    boolean tag = true;
+
+    public PdfDto() {
+
+    }
+
+    public PdfDto(String path, PageSizeEnum pageSize) {
+        this.path = path;
+        this.pageSize = pageSize;
+    }
+
+    public PdfDto(String path, PageSizeEnum pageSize, int pageCount) {
+        this.path = path;
+        this.pageSize = pageSize;
+        this.pageCount = pageCount;
+    }
+
+    public PdfDto(String path, PageSizeEnum pageSize, int pageCount, int sequence) {
+        this.path = path;
+        this.pageSize = pageSize;
+        this.pageCount = pageCount;
+        this.sequence = sequence;
+    }
+
+    public PdfDto(PageSizeEnum pageSize, int pageCount, boolean tag) {
+        this.pageSize = pageSize;
+        this.pageCount = pageCount;
+        this.tag = tag;
+    }
+
+    public PdfDto(PageSizeEnum pageSize, int pageCount) {
+        this.pageSize = pageSize;
+        this.pageCount = pageCount;
+    }
+
+    public PdfDto(PageSizeEnum pageSize, int pageCount, int actualPageCount) {
+        this.pageSize = pageSize;
+        this.pageCount = pageCount;
+        this.actualPageCount = actualPageCount;
+    }
+
+    public boolean isTag() {
+        return tag;
+    }
+
+    public void setTag(boolean tag) {
+        this.tag = tag;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public int getPageCount() {
+        return pageCount;
+    }
+
+    public void setPageCount(int pageCount) {
+        this.pageCount = pageCount;
+    }
+
+    public int getActualPageCount() {
+        return actualPageCount;
+    }
+
+    public void setActualPageCount(int actualPageCount) {
+        this.actualPageCount = actualPageCount;
+    }
+
+    public int getSequence() {
+        return sequence;
+    }
+
+    public void setSequence(int sequence) {
+        this.sequence = sequence;
+    }
+
+    public PageSizeEnum getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(PageSizeEnum pageSize) {
+        this.pageSize = pageSize;
+    }
+}

+ 78 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PdfPackageDto.java

@@ -0,0 +1,78 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.teachcloud.common.bean.examRule.CodeNameEnableValue;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ */
+public class PdfPackageDto {
+
+    /**
+     * 标题
+     */
+    private String title;
+
+    /**
+     * 是否要“订”
+     */
+    private Boolean isTag;
+
+    /**
+     * 卷袋号
+     */
+    private String packageNumber;
+
+    /**
+     * 标题信息
+     */
+    private List<CodeNameEnableValue> titlePlate;
+
+    /**
+     * 基础板块信息
+     */
+    private List<CodeNameEnableValue> basicPlate;
+
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Boolean getTag() {
+        return isTag;
+    }
+
+    public void setTag(Boolean tag) {
+        isTag = tag;
+    }
+
+    public String getPackageNumber() {
+        return packageNumber;
+    }
+
+    public void setPackageNumber(String packageNumber) {
+        this.packageNumber = packageNumber;
+    }
+
+    public List<CodeNameEnableValue> getTitlePlate() {
+        return titlePlate;
+    }
+
+    public void setTitlePlate(List<CodeNameEnableValue> titlePlate) {
+        this.titlePlate = titlePlate;
+    }
+
+    public List<CodeNameEnableValue> getBasicPlate() {
+        return basicPlate;
+    }
+
+    public void setBasicPlate(List<CodeNameEnableValue> basicPlate) {
+        this.basicPlate = basicPlate;
+    }
+}

+ 91 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PdfSignDto.java

@@ -0,0 +1,91 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.teachcloud.common.bean.examRule.CodeNameEnableValue;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ */
+public class PdfSignDto {
+
+    /**
+     * 标题
+     */
+    private String title;
+
+    /**
+     * 卷袋号
+     */
+    private String packageNumber;
+
+    /**
+     * 基础板块信息
+     */
+    private List<CodeNameEnableValue> basicPlate;
+
+    /**
+     * 考生表头信息
+     */
+    private Map<String, String> studentHeadPlate;
+
+    /**
+     * 考生信息
+     */
+    private List<Map<String, String>> studentPlate;
+
+    /**
+     * 文字描述信息
+     */
+    private String textDesc;
+
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getPackageNumber() {
+        return packageNumber;
+    }
+
+    public void setPackageNumber(String packageNumber) {
+        this.packageNumber = packageNumber;
+    }
+
+    public List<CodeNameEnableValue> getBasicPlate() {
+        return basicPlate;
+    }
+
+    public void setBasicPlate(List<CodeNameEnableValue> basicPlate) {
+        this.basicPlate = basicPlate;
+    }
+
+    public Map<String, String> getStudentHeadPlate() {
+        return studentHeadPlate;
+    }
+
+    public void setStudentHeadPlate(Map<String, String> studentHeadPlate) {
+        this.studentHeadPlate = studentHeadPlate;
+    }
+
+    public List<Map<String, String>> getStudentPlate() {
+        return studentPlate;
+    }
+
+    public void setStudentPlate(List<Map<String, String>> studentPlate) {
+        this.studentPlate = studentPlate;
+    }
+
+    public String getTextDesc() {
+        return textDesc;
+    }
+
+    public void setTextDesc(String textDesc) {
+        this.textDesc = textDesc;
+    }
+}

+ 301 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PrintTaskDto.java

@@ -0,0 +1,301 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Date: 2021/3/29.
+ */
+public class PrintTaskDto {
+
+    private String examDetailId;
+    private String printPlanId;
+    private String printPlanName;
+    private Long examStartTime;
+    private Long examEndTime;
+    private String courseNameCode;
+    private String paperNumber;
+    private String examPlace;
+    private String examRoom;
+    private String classDesc;
+    private String singlePagesA3;
+    private Integer paperPages;
+    private Integer cardPages;
+    private Integer pagesA4;
+    private Integer totalSubjects;
+    private ExamDetailStatusEnum status;
+    private String statusDisplay;
+    private Boolean validate;
+    private Long printStartTime;
+    private Long printEndTime;
+    private String packageCode;
+    private Boolean normal;
+
+    private String taskId;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "印刷室id")
+    private Long printHouseId;
+
+    @ApiModelProperty(value = "印刷室编号")
+    private String printHouseCode;
+
+    @ApiModelProperty(value = "印刷室名称")
+    private String printHouseName;
+
+    @ApiModelProperty(value = "学期id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long semesterId;
+
+    @ApiModelProperty(value = "学期名称")
+    private String semesterName;
+
+    @ApiModelProperty(value = "考试id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examId;
+
+    @ApiModelProperty(value = "考试名称")
+    private String examName;
+
+    public String getExamDetailId() {
+        return examDetailId;
+    }
+
+    public void setExamDetailId(String examDetailId) {
+        this.examDetailId = examDetailId;
+    }
+
+    public String getPrintPlanId() {
+        return printPlanId;
+    }
+
+    public void setPrintPlanId(String printPlanId) {
+        this.printPlanId = printPlanId;
+    }
+
+    public String getPrintPlanName() {
+        return printPlanName;
+    }
+
+    public void setPrintPlanName(String printPlanName) {
+        this.printPlanName = printPlanName;
+    }
+
+    public Long getExamStartTime() {
+        return examStartTime;
+    }
+
+    public void setExamStartTime(Long examStartTime) {
+        this.examStartTime = examStartTime;
+    }
+
+    public Long getExamEndTime() {
+        return examEndTime;
+    }
+
+    public void setExamEndTime(Long examEndTime) {
+        this.examEndTime = examEndTime;
+    }
+
+    public String getCourseNameCode() {
+        return courseNameCode;
+    }
+
+    public void setCourseNameCode(String courseNameCode) {
+        this.courseNameCode = courseNameCode;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getExamPlace() {
+        return examPlace;
+    }
+
+    public void setExamPlace(String examPlace) {
+        this.examPlace = examPlace;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getClassDesc() {
+        return classDesc;
+    }
+
+    public void setClassDesc(String classDesc) {
+        this.classDesc = classDesc;
+    }
+
+    public String getSinglePagesA3() {
+        return singlePagesA3;
+    }
+
+    public void setSinglePagesA3(String singlePagesA3) {
+        this.singlePagesA3 = singlePagesA3;
+    }
+
+    public Integer getPaperPages() {
+        return paperPages;
+    }
+
+    public void setPaperPages(Integer paperPages) {
+        this.paperPages = paperPages;
+    }
+
+    public Integer getCardPages() {
+        return cardPages;
+    }
+
+    public void setCardPages(Integer cardPages) {
+        this.cardPages = cardPages;
+    }
+
+    public Integer getPagesA4() {
+        return pagesA4;
+    }
+
+    public void setPagesA4(Integer pagesA4) {
+        this.pagesA4 = pagesA4;
+    }
+
+    public Integer getTotalSubjects() {
+        return totalSubjects;
+    }
+
+    public void setTotalSubjects(Integer totalSubjects) {
+        this.totalSubjects = totalSubjects;
+    }
+
+    public ExamDetailStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(ExamDetailStatusEnum status) {
+        this.status = status;
+    }
+
+    public String getStatusDisplay() {
+        return status == null ? "-" : status.getName();
+    }
+
+    public void setStatusDisplay(String statusDisplay) {
+        this.statusDisplay = statusDisplay;
+    }
+
+    public Boolean getValidate() {
+        return validate;
+    }
+
+    public void setValidate(Boolean validate) {
+        this.validate = validate;
+    }
+
+    public Long getPrintStartTime() {
+        return printStartTime;
+    }
+
+    public void setPrintStartTime(Long printStartTime) {
+        this.printStartTime = printStartTime;
+    }
+
+    public Long getPrintEndTime() {
+        return printEndTime;
+    }
+
+    public void setPrintEndTime(Long printEndTime) {
+        this.printEndTime = printEndTime;
+    }
+
+    public String getPackageCode() {
+        return packageCode;
+    }
+
+    public void setPackageCode(String packageCode) {
+        this.packageCode = packageCode;
+    }
+
+    public Boolean getNormal() {
+        return normal;
+    }
+
+    public void setNormal(Boolean normal) {
+        this.normal = normal;
+    }
+
+    public Long getPrintHouseId() {
+        return printHouseId;
+    }
+
+    public void setPrintHouseId(Long printHouseId) {
+        this.printHouseId = printHouseId;
+    }
+
+    public String getPrintHouseCode() {
+        return printHouseCode;
+    }
+
+    public void setPrintHouseCode(String printHouseCode) {
+        this.printHouseCode = printHouseCode;
+    }
+
+    public String getPrintHouseName() {
+        return printHouseName;
+    }
+
+    public void setPrintHouseName(String printHouseName) {
+        this.printHouseName = printHouseName;
+    }
+
+    public Long getSemesterId() {
+        return semesterId;
+    }
+
+    public void setSemesterId(Long semesterId) {
+        this.semesterId = semesterId;
+    }
+
+    public String getSemesterName() {
+        return semesterName;
+    }
+
+    public void setSemesterName(String semesterName) {
+        this.semesterName = semesterName;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getExamName() {
+        return examName;
+    }
+
+    public void setExamName(String examName) {
+        this.examName = examName;
+    }
+
+    public String getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+}

+ 89 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PrintTaskTotalDto.java

@@ -0,0 +1,89 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+/**
+ * @Date: 2021/3/29.
+ */
+public class PrintTaskTotalDto {
+
+    private Integer totalSubjects;
+    private Integer packageCount;
+    private Integer paperCount;
+    private Integer paperPages;
+    private Integer cardPages;
+    private Integer pagesA4;
+    private Integer paperPagesLeft;
+    private Integer cardPagesLeft;
+    private Integer pagesA4Left;
+
+    public Integer getTotalSubjects() {
+        return totalSubjects;
+    }
+
+    public void setTotalSubjects(Integer totalSubjects) {
+        this.totalSubjects = totalSubjects;
+    }
+
+    public Integer getPackageCount() {
+        return packageCount;
+    }
+
+    public void setPackageCount(Integer packageCount) {
+        this.packageCount = packageCount;
+    }
+
+    public Integer getPaperCount() {
+        return paperCount;
+    }
+
+    public void setPaperCount(Integer paperCount) {
+        this.paperCount = paperCount;
+    }
+
+    public Integer getPaperPages() {
+        return paperPages;
+    }
+
+    public void setPaperPages(Integer paperPages) {
+        this.paperPages = paperPages;
+    }
+
+    public Integer getCardPages() {
+        return cardPages;
+    }
+
+    public void setCardPages(Integer cardPages) {
+        this.cardPages = cardPages;
+    }
+
+    public Integer getPagesA4() {
+        return pagesA4;
+    }
+
+    public void setPagesA4(Integer pagesA4) {
+        this.pagesA4 = pagesA4;
+    }
+
+    public Integer getPaperPagesLeft() {
+        return paperPagesLeft;
+    }
+
+    public void setPaperPagesLeft(Integer paperPagesLeft) {
+        this.paperPagesLeft = paperPagesLeft;
+    }
+
+    public Integer getCardPagesLeft() {
+        return cardPagesLeft;
+    }
+
+    public void setCardPagesLeft(Integer cardPagesLeft) {
+        this.cardPagesLeft = cardPagesLeft;
+    }
+
+    public Integer getPagesA4Left() {
+        return pagesA4Left;
+    }
+
+    public void setPagesA4Left(Integer pagesA4Left) {
+        this.pagesA4Left = pagesA4Left;
+    }
+}

+ 79 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/RelatePaperDto.java

@@ -0,0 +1,79 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+
+import java.util.List;
+
+/**
+ * @Date: 2021/3/29.
+ */
+public class RelatePaperDto {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long courseId;
+    private String courseCode;
+    private String courseName;
+    private String paperNumber;
+    private List<Integer> paperTypes;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public List<Integer> getPaperTypes() {
+        return paperTypes;
+    }
+
+    public void setPaperTypes(List<Integer> paperTypes) {
+        this.paperTypes = paperTypes;
+    }
+}

+ 45 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/StudentNumberConfigDto.java

@@ -0,0 +1,45 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * @Description: 学号配置dto
+ * @Author: CaoZixuan
+ * @Date: 2024-10-10
+ */
+public class StudentNumberConfigDto {
+    @ApiModelProperty("学号位数")
+    private Integer digit;
+
+    @ApiModelProperty("是否包含字母")
+    private Boolean containsLetter;
+
+    @ApiModelProperty("字母映射关系")
+    private List<StudentNumberLetterRelationShipDto> relationList;
+
+    public Integer getDigit() {
+        return digit;
+    }
+
+    public void setDigit(Integer digit) {
+        this.digit = digit;
+    }
+
+    public Boolean getContainsLetter() {
+        return containsLetter;
+    }
+
+    public void setContainsLetter(Boolean containsLetter) {
+        this.containsLetter = containsLetter;
+    }
+
+    public List<StudentNumberLetterRelationShipDto> getRelationList() {
+        return relationList;
+    }
+
+    public void setRelationList(List<StudentNumberLetterRelationShipDto> relationList) {
+        this.relationList = relationList;
+    }
+}

+ 32 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/StudentNumberLetterRelationShipDto.java

@@ -0,0 +1,32 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 序号配置字母映射关系dto
+ * @Author: CaoZixuan
+ * @Date: 2024-10-10
+ */
+public class StudentNumberLetterRelationShipDto {
+    @ApiModelProperty("字母所在列")
+    private Integer columnIndex;
+
+    @ApiModelProperty("字母数组")
+    private String[] letters;
+
+    public Integer getColumnIndex() {
+        return columnIndex;
+    }
+
+    public void setColumnIndex(Integer columnIndex) {
+        this.columnIndex = columnIndex;
+    }
+
+    public String[] getLetters() {
+        return letters;
+    }
+
+    public void setLetters(String[] letters) {
+        this.letters = letters;
+    }
+}

+ 147 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/SubjectiveStructDto.java

@@ -0,0 +1,147 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.boot.tools.excel.annotation.ExcelColumn;
+import com.qmth.teachcloud.common.annotation.ExcelError;
+import com.qmth.teachcloud.common.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 主观题结构Dto
+ * @Author: CaoZixuan
+ * @Date: 2024-04-09
+ */
+public class SubjectiveStructDto implements Serializable {
+
+    @ApiModelProperty(value = "课程代码")
+    @ExcelColumn(name = "课程代码", index = 1, nullable = true)
+    private String courseCode;
+
+    @ApiModelProperty(value = "课程名称")
+    @ExcelColumn(name = "课程名称", index = 2, nullable = true)
+    private String courseName;
+
+    @ApiModelProperty(value = "试卷编号")
+    @ExcelColumn(name = "试卷编号", index = 3, nullable = true)
+    private String paperNumber;
+
+    @ApiModelProperty(value = "大题名称")
+    @ExcelColumn(name = "大题名称", index = 4, nullable = true)
+    private String mainTitle;
+
+    @ApiModelProperty(value = "大题号(只能用小写数字)")
+    @ExcelColumn(name = "大题号(只能用小写数字)", index = 5, nullable = true)
+    private Integer mainNumber;
+
+    @ApiModelProperty(value = "小题号(只能用小写数字)")
+    @ExcelColumn(name = "小题号(只能用小写数字)", index = 6, nullable = true)
+    private Integer subNumber;
+
+    @ApiModelProperty(value = "小题满分")
+    @ExcelColumn(name = "小题满分", index = 7, nullable = true)
+    private Double totalScore;
+
+    @ApiModelProperty(value = "评卷最小分")
+    @ExcelColumn(name = "最小分", index = 8, nullable = true)
+    private Double intervalScore;
+
+    @ApiModelProperty(value = "绑定工号(英文逗号分隔)")
+    @ExcelColumn(name = "绑定工号(英文逗号分隔)", index = 9, nullable = true)
+    private String markerCodes;
+
+    @ApiModelProperty(value = "错误信息")
+    @ExcelColumn(name = "错误信息", index = 10, nullable = true)
+    private String errorMsg;
+
+    @ApiModelProperty(value = "课程ID")
+    private Long courseId;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getMainTitle() {
+        return mainTitle;
+    }
+
+    public void setMainTitle(String mainTitle) {
+        this.mainTitle = mainTitle;
+    }
+
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public Integer getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public Double getIntervalScore() {
+        return intervalScore;
+    }
+
+    public void setIntervalScore(Double intervalScore) {
+        this.intervalScore = intervalScore;
+    }
+
+    public String getMarkerCodes() {
+        return markerCodes;
+    }
+
+    public void setMarkerCodes(String markerCodes) {
+        this.markerCodes = markerCodes;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getErrorMsg() {
+        return errorMsg;
+    }
+
+    public void setErrorMsg(String errorMsg) {
+        this.errorMsg = errorMsg;
+    }
+}

+ 121 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/SubjectiveStructImportDto.java

@@ -0,0 +1,121 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.boot.tools.excel.annotation.ExcelColumn;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 主观题结构Dto
+ */
+public class SubjectiveStructImportDto implements Serializable {
+
+    @ApiModelProperty(value = "课程代码")
+    @ExcelColumn(name = "课程代码", index = 1, nullable = true)
+    private String courseCode;
+
+    @ApiModelProperty(value = "课程名称")
+    @ExcelColumn(name = "课程名称", index = 2, nullable = true)
+    private String courseName;
+
+    @ApiModelProperty(value = "试卷编号")
+    @ExcelColumn(name = "试卷编号", index = 3, nullable = true)
+    private String paperNumber;
+
+    @ApiModelProperty(value = "大题名称")
+    @ExcelColumn(name = "大题名称", index = 4, nullable = true)
+    private String mainTitle;
+
+    @ApiModelProperty(value = "大题号(只能用小写数字)")
+    @ExcelColumn(name = "大题号(只能用小写数字)", index = 5, nullable = true)
+    private Integer mainNumber;
+
+    @ApiModelProperty(value = "小题号(只能用小写数字)")
+    @ExcelColumn(name = "小题号(只能用小写数字)", index = 6, nullable = true)
+    private Integer subNumber;
+
+    @ApiModelProperty(value = "小题满分")
+    @ExcelColumn(name = "小题满分", index = 7, nullable = true)
+    private Double totalScore;
+
+    @ApiModelProperty(value = "评卷最小分")
+    @ExcelColumn(name = "最小分", index = 8, nullable = true)
+    private Double intervalScore;
+
+    @ApiModelProperty(value = "绑定工号(英文逗号分隔)")
+    @ExcelColumn(name = "绑定工号(英文逗号分隔)", index = 9, nullable = true)
+    private String markerCodes;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getMainTitle() {
+        return mainTitle;
+    }
+
+    public void setMainTitle(String mainTitle) {
+        this.mainTitle = mainTitle;
+    }
+
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public Integer getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public Double getIntervalScore() {
+        return intervalScore;
+    }
+
+    public void setIntervalScore(Double intervalScore) {
+        this.intervalScore = intervalScore;
+    }
+
+    public String getMarkerCodes() {
+        return markerCodes;
+    }
+
+    public void setMarkerCodes(String markerCodes) {
+        this.markerCodes = markerCodes;
+    }
+
+}

+ 78 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/TCStatisticsDto.java

@@ -0,0 +1,78 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.qmth.distributed.print.business.entity.TCStatistics;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @Description: 命题统计导入 dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/9/10
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class TCStatisticsDto extends TCStatistics implements Serializable {
+
+    @ApiModelProperty(value = "完成状态,FINISH:已完成,UN_FINISH:未完成")
+    private String statusStr;
+
+    @ApiModelProperty(value = "印刷计划名称")
+    private String printPlanName;
+
+    @ApiModelProperty(value = "学生数量")
+    int examStudentCount;
+
+    @ApiModelProperty(value = "抽卷数")
+    int drawCount;
+
+    @ApiModelProperty(value = "备份数")
+    int backupCount;
+
+    public int getExamStudentCount() {
+        return examStudentCount;
+    }
+
+    public void setExamStudentCount(int examStudentCount) {
+        this.examStudentCount = examStudentCount;
+    }
+
+    public int getDrawCount() {
+        return drawCount;
+    }
+
+    public void setDrawCount(int drawCount) {
+        this.drawCount = drawCount;
+    }
+
+    public int getBackupCount() {
+        return backupCount;
+    }
+
+    public void setBackupCount(int backupCount) {
+        this.backupCount = backupCount;
+    }
+
+    public String getPrintPlanName() {
+        return printPlanName;
+    }
+
+    public void setPrintPlanName(String printPlanName) {
+        this.printPlanName = printPlanName;
+    }
+
+    public String getStatusStr() {
+        if (Objects.nonNull(this.getStatus())) {
+            return this.getStatus().getTitle();
+        } else {
+            return statusStr;
+        }
+    }
+
+    public void setStatusStr(String statusStr) {
+        this.statusStr = statusStr;
+    }
+}

+ 30 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/TaskPrintHouseDto.java

@@ -0,0 +1,30 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+
+/**
+ * @Date: 2021/3/29.
+ */
+public class TaskPrintHouseDto {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long printHouseId;
+    private String printHouseName;
+
+    public Long getPrintHouseId() {
+        return printHouseId;
+    }
+
+    public void setPrintHouseId(Long printHouseId) {
+        this.printHouseId = printHouseId;
+    }
+
+    public String getPrintHouseName() {
+        return printHouseName;
+    }
+
+    public void setPrintHouseName(String printHouseName) {
+        this.printHouseName = printHouseName;
+    }
+}

+ 111 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/admin/SetFontDto.java

@@ -0,0 +1,111 @@
+package com.qmth.distributed.print.business.bean.dto.admin;
+
+import com.qmth.teachcloud.common.entity.BasicAttachment;
+import io.swagger.annotations.ApiModelProperty;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @Description: 超管设置字体
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2025/3/4
+ */
+public class SetFontDto implements Serializable, Comparable<SetFontDto> {
+
+    @ApiModelProperty(value = "附件id")
+    private String attachmentId;
+
+    @ApiModelProperty(value = "字体名称")
+    private String fontName;
+
+    @ApiModelProperty(value = "字体格式")
+    private String format;
+
+    @ApiModelProperty(value = "是否选择,false:未启用,true:启用")
+    private Boolean choose;
+
+    public SetFontDto() {
+
+    }
+
+    public SetFontDto(String fontName) {
+        this.attachmentId = "-1";
+        this.fontName = fontName;
+        this.format = "null";
+        this.choose = false;
+    }
+
+    public SetFontDto(BasicAttachment basicAttachment, Boolean choose) {
+        this.attachmentId = basicAttachment.getId().toString();
+        this.fontName = basicAttachment.getName();
+        this.format = basicAttachment.getType();
+        this.choose = choose;
+    }
+
+    public String getAttachmentId() {
+        return attachmentId;
+    }
+
+    public void setAttachmentId(String attachmentId) {
+        this.attachmentId = attachmentId;
+    }
+
+    public String getFontName() {
+        return fontName;
+    }
+
+    public void setFontName(String fontName) {
+        this.fontName = fontName;
+    }
+
+    public String getFormat() {
+        return format;
+    }
+
+    public void setFormat(String format) {
+        this.format = format;
+    }
+
+    public Boolean getChoose() {
+        return choose;
+    }
+
+    public void setChoose(Boolean choose) {
+        this.choose = choose;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        SetFontDto that = (SetFontDto) o;
+        return attachmentId.equals(that.attachmentId) && fontName.equals(that.fontName) && format.equals(that.format);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(attachmentId, fontName, format);
+    }
+
+    @Override
+    public int compareTo(@NotNull SetFontDto o) {
+        Long l1 = Long.parseLong(o.getAttachmentId());
+        Long l2 = Long.parseLong(this.getAttachmentId());
+        if (l1.longValue() < l2.longValue()) {
+            return 1;
+        } else if (l1.longValue() > l2.longValue()) {
+            return -1;
+        } else {
+            return 0;
+        }
+    }
+}
+

+ 89 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ApprovalInfo.java

@@ -0,0 +1,89 @@
+package com.qmth.distributed.print.business.bean.dto.approvalForm;
+
+import com.qmth.teachcloud.common.enums.FlowApproveOperationEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 命题任务审批表 - 审批信息
+ * @Author: CaoZixuan
+ * @Date: 2021-09-06
+ */
+public class ApprovalInfo {
+
+    @ApiModelProperty(value = "审批人id")
+    private Long approveId;
+
+    @ApiModelProperty(value = "审批人名称")
+    private String approveName;
+
+    @ApiModelProperty(value = "审批时间")
+    private Long time;
+
+    @ApiModelProperty(value = "审批意见(通过 + 备注信息)")
+    private String remark;
+
+    @ApiModelProperty(value = "审核级别(2:主任审核、3:院长审核)")
+    private int level;
+
+    @ApiModelProperty(value = "审核机构名称")
+    private String approveOrgName;
+
+    @ApiModelProperty(value = "审核类型")
+    private FlowApproveOperationEnum approveType;
+
+    public Long getApproveId() {
+        return approveId;
+    }
+
+    public void setApproveId(Long approveId) {
+        this.approveId = approveId;
+    }
+
+    public String getApproveName() {
+        return approveName;
+    }
+
+    public void setApproveName(String approveName) {
+        this.approveName = approveName;
+    }
+
+    public Long getTime() {
+        return time;
+    }
+
+    public void setTime(Long time) {
+        this.time = time;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public int getLevel() {
+        return level;
+    }
+
+    public void setLevel(int level) {
+        this.level = level;
+    }
+
+    public String getApproveOrgName() {
+        return approveOrgName;
+    }
+
+    public void setApproveOrgName(String approveOrgName) {
+        this.approveOrgName = approveOrgName;
+    }
+
+    public FlowApproveOperationEnum getApproveType() {
+        return approveType;
+    }
+
+    public void setApproveType(FlowApproveOperationEnum approveType) {
+        this.approveType = approveType;
+    }
+}

+ 135 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/BasicInfo.java

@@ -0,0 +1,135 @@
+package com.qmth.distributed.print.business.bean.dto.approvalForm;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 命题任务审批表 - 基础信息
+ * @Author: CaoZixuan
+ * @Date: 2021-09-06
+ */
+public class BasicInfo {
+    @ApiModelProperty(value = "学院id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long collegeId;
+
+    @ApiModelProperty(value = "学院名称")
+    private String collegeName;
+
+    @ApiModelProperty(value = "教研室id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long teachingRoomId;
+
+    @ApiModelProperty(value = "教研室名称")
+    private String teachingRoomName;
+
+    @ApiModelProperty(value = "试卷编号")
+    private String paperNumber;
+
+    @ApiModelProperty(value = "试卷名称")
+    private String paperName;
+
+    @ApiModelProperty(value = "考试开始时间")
+    private Long examStartTime;
+
+    @ApiModelProperty(value = "考试结束时间")
+    private Long examEndTime;
+
+    @ApiModelProperty(value = "拟卷老师")
+    private String teacherName;
+
+    @ApiModelProperty(value = "课程代码")
+    private String courseCode;
+
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
+
+    public Long getCollegeId() {
+        return collegeId;
+    }
+
+    public void setCollegeId(Long collegeId) {
+        this.collegeId = collegeId;
+    }
+
+    public String getCollegeName() {
+        return collegeName;
+    }
+
+    public void setCollegeName(String collegeName) {
+        this.collegeName = collegeName;
+    }
+
+    public Long getTeachingRoomId() {
+        return teachingRoomId;
+    }
+
+    public void setTeachingRoomId(Long teachingRoomId) {
+        this.teachingRoomId = teachingRoomId;
+    }
+
+    public String getTeachingRoomName() {
+        return teachingRoomName;
+    }
+
+    public void setTeachingRoomName(String teachingRoomName) {
+        this.teachingRoomName = teachingRoomName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getPaperName() {
+        return paperName;
+    }
+
+    public void setPaperName(String paperName) {
+        this.paperName = paperName;
+    }
+
+    public Long getExamStartTime() {
+        return examStartTime;
+    }
+
+    public void setExamStartTime(Long examStartTime) {
+        this.examStartTime = examStartTime;
+    }
+
+    public Long getExamEndTime() {
+        return examEndTime;
+    }
+
+    public void setExamEndTime(Long examEndTime) {
+        this.examEndTime = examEndTime;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+}

+ 239 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ExamPackageDetail.java

@@ -0,0 +1,239 @@
+package com.qmth.distributed.print.business.bean.dto.approvalForm;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.enums.BackupMethodEnum;
+import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
+import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 试卷包详情
+ * @Author: CaoZixuan
+ * @Date: 2021-09-07
+ */
+public class ExamPackageDetail {
+
+    @ApiModelProperty(value = "考场表id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examDetailId;
+
+    @ApiModelProperty(value = "考试开始时间")
+    private Long examStartTime;
+
+    @ApiModelProperty(value = "考试结束时间")
+    private Long examEndTime;
+
+    @ApiModelProperty(value = "考点")
+    private String examPlace;
+
+    @ApiModelProperty(value = "考场")
+    private String examRoom;
+
+    @ApiModelProperty(value = "卷袋编号")
+    private String packageCode;
+
+    @ApiModelProperty(value = "考场表状态")
+    private ExamDetailStatusEnum examDetailStatus;
+
+    @ApiModelProperty(value = "考场课程表id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examDetailCourseId;
+
+    @ApiModelProperty(value = "课程编号")
+    private String courseCode;
+
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "试卷编号")
+    private String paperNumber;
+
+    @ApiModelProperty(value = "考场课程表人数统计")
+    private Integer examDetailCourseTotalSubjects;
+
+    @ApiModelProperty(value = "考察课程表班级合计")
+    private String classNames;
+
+    @ApiModelProperty(value = "印刷计划id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examPrintPlanId;
+
+    @ApiModelProperty(value = "印刷计划名称")
+    private String examPrintPlanName;
+
+    @ApiModelProperty(value = "印刷计划印品")
+    private String printContent;
+
+    @ApiModelProperty(value = "备份方式")
+    private BackupMethodEnum backupMethod;
+
+    @ApiModelProperty(value = "备份数量")
+    private Double backupCount;
+
+    @ApiModelProperty(value = "印刷计划状态")
+    private PrintPlanStatusEnum examPrintPlanStatus;
+
+    @ApiModelProperty(value = "印刷室")
+    private String printHouseName;
+
+    public String getPrintHouseName() {
+        return printHouseName;
+    }
+
+    public void setPrintHouseName(String printHouseName) {
+        this.printHouseName = printHouseName;
+    }
+
+    public Long getExamDetailId() {
+        return examDetailId;
+    }
+
+    public void setExamDetailId(Long examDetailId) {
+        this.examDetailId = examDetailId;
+    }
+
+    public Long getExamStartTime() {
+        return examStartTime;
+    }
+
+    public void setExamStartTime(Long examStartTime) {
+        this.examStartTime = examStartTime;
+    }
+
+    public Long getExamEndTime() {
+        return examEndTime;
+    }
+
+    public void setExamEndTime(Long examEndTime) {
+        this.examEndTime = examEndTime;
+    }
+
+    public String getExamPlace() {
+        return examPlace;
+    }
+
+    public void setExamPlace(String examPlace) {
+        this.examPlace = examPlace;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getPackageCode() {
+        return packageCode;
+    }
+
+    public void setPackageCode(String packageCode) {
+        this.packageCode = packageCode;
+    }
+
+    public ExamDetailStatusEnum getExamDetailStatus() {
+        return examDetailStatus;
+    }
+
+    public void setExamDetailStatus(ExamDetailStatusEnum examDetailStatus) {
+        this.examDetailStatus = examDetailStatus;
+    }
+
+    public Long getExamDetailCourseId() {
+        return examDetailCourseId;
+    }
+
+    public void setExamDetailCourseId(Long examDetailCourseId) {
+        this.examDetailCourseId = examDetailCourseId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public Integer getExamDetailCourseTotalSubjects() {
+        return examDetailCourseTotalSubjects;
+    }
+
+    public void setExamDetailCourseTotalSubjects(Integer examDetailCourseTotalSubjects) {
+        this.examDetailCourseTotalSubjects = examDetailCourseTotalSubjects;
+    }
+
+    public String getClassNames() {
+        return classNames;
+    }
+
+    public void setClassNames(String classNames) {
+        this.classNames = classNames;
+    }
+
+    public Long getExamPrintPlanId() {
+        return examPrintPlanId;
+    }
+
+    public void setExamPrintPlanId(Long examPrintPlanId) {
+        this.examPrintPlanId = examPrintPlanId;
+    }
+
+    public String getExamPrintPlanName() {
+        return examPrintPlanName;
+    }
+
+    public void setExamPrintPlanName(String examPrintPlanName) {
+        this.examPrintPlanName = examPrintPlanName;
+    }
+
+    public String getPrintContent() {
+        return printContent;
+    }
+
+    public void setPrintContent(String printContent) {
+        this.printContent = printContent;
+    }
+
+    public BackupMethodEnum getBackupMethod() {
+        return backupMethod;
+    }
+
+    public void setBackupMethod(BackupMethodEnum backupMethod) {
+        this.backupMethod = backupMethod;
+    }
+
+    public Double getBackupCount() {
+        return backupCount;
+    }
+
+    public void setBackupCount(Double backupCount) {
+        this.backupCount = backupCount;
+    }
+
+    public PrintPlanStatusEnum getExamPrintPlanStatus() {
+        return examPrintPlanStatus;
+    }
+
+    public void setExamPrintPlanStatus(PrintPlanStatusEnum examPrintPlanStatus) {
+        this.examPrintPlanStatus = examPrintPlanStatus;
+    }
+}

+ 77 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ExamRoomInfo.java

@@ -0,0 +1,77 @@
+package com.qmth.distributed.print.business.bean.dto.approvalForm;
+
+import com.qmth.distributed.print.business.enums.ExamDataSourceEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 命题任务审批表 - 考场信息
+ * @Author: CaoZixuan
+ * @Date: 2021-09-06
+ */
+public class ExamRoomInfo {
+    @ApiModelProperty(value = "卷袋编号")
+    private String packageCode;
+
+//    @ApiModelProperty(value = "校区名称")
+//    private String campusNames;
+
+    @ApiModelProperty(value = "使用班级(考场)")
+    private String clazzNames;
+
+    @ApiModelProperty(value = "人数")
+    private Integer studentCount;
+
+    @ApiModelProperty(value = "总印份数(人数 + 备用)")
+    private String printCount;
+
+    @ApiModelProperty(value = "印刷室")
+    private String printHouseName;
+
+    public String getPrintHouseName() {
+        return printHouseName;
+    }
+
+    public void setPrintHouseName(String printHouseName) {
+        this.printHouseName = printHouseName;
+    }
+
+    public String getPackageCode() {
+        return packageCode;
+    }
+
+    public void setPackageCode(String packageCode) {
+        this.packageCode = packageCode;
+    }
+
+//    public String getCampusNames() {
+//        return campusNames;
+//    }
+//
+//    public void setCampusNames(String campusNames) {
+//        this.campusNames = campusNames;
+//    }
+
+    public String getClazzNames() {
+        return clazzNames;
+    }
+
+    public void setClazzNames(String clazzNames) {
+        this.clazzNames = clazzNames;
+    }
+
+    public Integer getStudentCount() {
+        return studentCount;
+    }
+
+    public void setStudentCount(Integer studentCount) {
+        this.studentCount = studentCount;
+    }
+
+    public String getPrintCount() {
+        return printCount;
+    }
+
+    public void setPrintCount(String printCount) {
+        this.printCount = printCount;
+    }
+}

+ 46 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/approvalForm/ExamTaskApprovalFormDto.java

@@ -0,0 +1,46 @@
+package com.qmth.distributed.print.business.bean.dto.approvalForm;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * @Description: 命题任务审批表Dto
+ * @Author: CaoZixuan
+ * @Date: 2021-09-06
+ */
+public class ExamTaskApprovalFormDto {
+
+    @ApiModelProperty(value = "基础信息")
+    private BasicInfo basicInfo;
+
+    @ApiModelProperty(value = "考场信息集合")
+    private List<ExamRoomInfo> examRoomInfoList;
+
+    @ApiModelProperty(value = "审批信息集合")
+    private List<ApprovalInfo> approvalInfoList;
+
+    public BasicInfo getBasicInfo() {
+        return basicInfo;
+    }
+
+    public void setBasicInfo(BasicInfo basicInfo) {
+        this.basicInfo = basicInfo;
+    }
+
+    public List<ExamRoomInfo> getExamRoomInfoList() {
+        return examRoomInfoList;
+    }
+
+    public void setExamRoomInfoList(List<ExamRoomInfo> examRoomInfoList) {
+        this.examRoomInfoList = examRoomInfoList;
+    }
+
+    public List<ApprovalInfo> getApprovalInfoList() {
+        return approvalInfoList;
+    }
+
+    public void setApprovalInfoList(List<ApprovalInfo> approvalInfoList) {
+        this.approvalInfoList = approvalInfoList;
+    }
+}

+ 142 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/client/PrintSingleDto.java

@@ -0,0 +1,142 @@
+package com.qmth.distributed.print.business.bean.dto.client;
+
+import java.util.List;
+
+public class PrintSingleDto {
+
+    private Long examId;
+    private String examName;
+    private Long printPlanId;
+    private String printPlanName;
+    private Long courseId;
+    private String courseCode;
+    private String courseName;
+    private String paperNumber;
+    private Integer serialNumber;
+    private String examDetailIds;
+    private List<UrlMd5Dto> paper;
+    private List<UrlMd5Dto> card;
+    private List<UrlMd5Dto> signs;
+    private List<UrlMd5Dto> packages;
+    private List<UrlMd5Dto> checkIn;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getExamName() {
+        return examName;
+    }
+
+    public void setExamName(String examName) {
+        this.examName = examName;
+    }
+
+    public Long getPrintPlanId() {
+        return printPlanId;
+    }
+
+    public void setPrintPlanId(Long printPlanId) {
+        this.printPlanId = printPlanId;
+    }
+
+    public String getPrintPlanName() {
+        return printPlanName;
+    }
+
+    public void setPrintPlanName(String printPlanName) {
+        this.printPlanName = printPlanName;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public Integer getSerialNumber() {
+        return serialNumber;
+    }
+
+    public void setSerialNumber(Integer serialNumber) {
+        this.serialNumber = serialNumber;
+    }
+
+    public String getExamDetailIds() {
+        return examDetailIds;
+    }
+
+    public void setExamDetailIds(String examDetailIds) {
+        this.examDetailIds = examDetailIds;
+    }
+
+    public List<UrlMd5Dto> getPaper() {
+        return paper;
+    }
+
+    public void setPaper(List<UrlMd5Dto> paper) {
+        this.paper = paper;
+    }
+
+    public List<UrlMd5Dto> getCard() {
+        return card;
+    }
+
+    public void setCard(List<UrlMd5Dto> card) {
+        this.card = card;
+    }
+
+    public List<UrlMd5Dto> getSigns() {
+        return signs;
+    }
+
+    public void setSigns(List<UrlMd5Dto> signs) {
+        this.signs = signs;
+    }
+
+    public List<UrlMd5Dto> getPackages() {
+        return packages;
+    }
+
+    public void setPackages(List<UrlMd5Dto> packages) {
+        this.packages = packages;
+    }
+
+    public List<UrlMd5Dto> getCheckIn() {
+        return checkIn;
+    }
+
+    public void setCheckIn(List<UrlMd5Dto> checkIn) {
+        this.checkIn = checkIn;
+    }
+}

+ 31 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/client/UrlMd5Dto.java

@@ -0,0 +1,31 @@
+package com.qmth.distributed.print.business.bean.dto.client;
+
+public class UrlMd5Dto {
+
+    private String url;
+    private String md5;
+
+    public UrlMd5Dto() {
+    }
+
+    public UrlMd5Dto(String url, String md5) {
+        this.url = url;
+        this.md5 = md5;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getMd5() {
+        return md5;
+    }
+
+    public void setMd5(String md5) {
+        this.md5 = md5;
+    }
+}

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

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

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

@@ -0,0 +1,111 @@
+package com.qmth.distributed.print.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelImportTempleteVaild;
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 考生导入dto
+ * @Author: CaoZixuan
+ * @Date: 2022-09-02
+ */
+@ExcelImportTempleteVaild(value = true)
+public class ExamStudentImportDto implements Serializable {
+    @ExcelNote(value = "姓名")
+    @NotNull
+    private String studentName;
+
+    @ExcelNote(value = "学号")
+    @NotNull
+    private String studentCode;
+
+    @ExcelNote(value = "手机号")
+    private String phoneNumber;
+
+    @ExcelNote(value = "学院")
+    @NotNull
+    private String collegeName;
+
+    @ExcelNote(value = "专业")
+    @NotNull
+    private String majorName;
+
+    @ExcelNote(value = "班级")
+    @NotNull
+    private String clazzName;
+
+    @ExcelNote(value = "考点")
+    @NotNull
+    private String examPlace;
+
+    @ExcelNote(value = "考场")
+    @NotNull
+    private String examRoom;
+
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getPhoneNumber() {
+        return phoneNumber;
+    }
+
+    public void setPhoneNumber(String phoneNumber) {
+        this.phoneNumber = phoneNumber;
+    }
+
+    public String getCollegeName() {
+        return collegeName;
+    }
+
+    public void setCollegeName(String collegeName) {
+        this.collegeName = collegeName;
+    }
+
+    public String getMajorName() {
+        return majorName;
+    }
+
+    public void setMajorName(String majorName) {
+        this.majorName = majorName;
+    }
+
+    public String getClazzName() {
+        return clazzName;
+    }
+
+    public void setClazzName(String clazzName) {
+        this.clazzName = clazzName;
+    }
+
+    public String getExamPlace() {
+        return examPlace;
+    }
+
+    public void setExamPlace(String examPlace) {
+        this.examPlace = examPlace;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+}

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

@@ -0,0 +1,81 @@
+package com.qmth.distributed.print.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelImportTempleteVaild;
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+import com.qmth.teachcloud.common.annotation.ExcelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 分析试卷能力维度数据导入类
+ * @Author: CaoZixuan
+ * @Date: 2022-05-27
+ */
+@ExcelImportTempleteVaild(value = true)
+public class GradePaperDimensionAbilityDto {
+
+    @ExcelNote(value = "课程代码")
+    @ExcelProperty(name = "课程代码", width = 30, index = 1)
+    @NotNull
+    private String courseCode;
+
+    @ExcelNote(value = "课程名称")
+    @ExcelProperty(name = "课程名称", width = 30, index = 2)
+    @NotNull
+    private String courseName;
+
+    @ExcelNote(value = "一级能力维度")
+    @ExcelProperty(name = "一级能力维度", width = 30, index = 3)
+    @NotNull
+    private String namePrimary;
+
+    @ExcelNote(value = "一级维度编号")
+    @ExcelProperty(name = "一级维度编号", width = 30, index = 4)
+    @NotNull
+    private String codePrimary;
+
+    @ExcelNote(value = "一级维度术语解释")
+    @ExcelProperty(name = "一级维度术语解释", width = 30, index = 5)
+    @NotNull
+    private String interpret;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getNamePrimary() {
+        return namePrimary;
+    }
+
+    public void setNamePrimary(String namePrimary) {
+        this.namePrimary = namePrimary;
+    }
+
+    public String getCodePrimary() {
+        return codePrimary;
+    }
+
+    public void setCodePrimary(String codePrimary) {
+        this.codePrimary = codePrimary;
+    }
+
+    public String getInterpret() {
+        return interpret;
+    }
+
+    public void setInterpret(String interpret) {
+        this.interpret = interpret;
+    }
+}

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

@@ -0,0 +1,94 @@
+package com.qmth.distributed.print.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelImportTempleteVaild;
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+import com.qmth.teachcloud.common.annotation.ExcelProperty;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 分析试卷知识维度数据导入类
+ * @Author: CaoZixuan
+ * @Date: 2022-05-27
+ */
+@ExcelImportTempleteVaild(value = true)
+public class GradePaperDimensionKnowledgeDto {
+
+    @ExcelNote(value = "课程代码")
+    @ExcelProperty(name = "课程代码", width = 30, index = 1)
+    @NotNull
+    private String courseCode;
+
+    @ExcelNote(value = "课程名称")
+    @ExcelProperty(name = "课程名称", width = 30, index = 2)
+    @NotNull
+    private String courseName;
+
+    @ExcelNote(value = "一级知识维度")
+    @ExcelProperty(name = "一级知识维度", width = 30, index = 3)
+    @NotNull
+    private String namePrimary;
+
+    @ExcelNote(value = "一级维度编号")
+    @ExcelProperty(name = "一级维度编号", width = 30, index = 4)
+    @NotNull
+    private String codePrimary;
+
+    @ExcelNote(value = "二级知识维度")
+    @ExcelProperty(name = "二级知识维度", width = 30, index = 5)
+    @NotNull
+    private String nameSecond;
+
+    @ExcelNote(value = "二级维度编号")
+    @ExcelProperty(name = "二级维度编号", width = 30, index = 6)
+    @NotNull
+    private String codeSecond;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getNamePrimary() {
+        return namePrimary;
+    }
+
+    public void setNamePrimary(String namePrimary) {
+        this.namePrimary = namePrimary;
+    }
+
+    public String getCodePrimary() {
+        return codePrimary;
+    }
+
+    public void setCodePrimary(String codePrimary) {
+        this.codePrimary = codePrimary;
+    }
+
+    public String getNameSecond() {
+        return nameSecond;
+    }
+
+    public void setNameSecond(String nameSecond) {
+        this.nameSecond = nameSecond;
+    }
+
+    public String getCodeSecond() {
+        return codeSecond;
+    }
+
+    public void setCodeSecond(String codeSecond) {
+        this.codeSecond = codeSecond;
+    }
+}

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

@@ -0,0 +1,172 @@
+package com.qmth.distributed.print.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelImportTempleteVaild;
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+import com.qmth.teachcloud.common.annotation.ExcelProperty;
+import com.qmth.teachcloud.common.annotation.excelStyle.ExcelDataStyle;
+import com.qmth.teachcloud.common.annotation.excelStyle.ExcelHeaderStyle;
+import org.apache.poi.ss.usermodel.IndexedColors;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 分析试卷结构excel操作类
+ * @Author: CaoZixuan
+ * @Date: 2022-05-30
+ */
+@ExcelHeaderStyle
+@ExcelImportTempleteVaild(value = true)
+public class GradePaperStructDto {
+    @ExcelNote(value = "课程代码")
+    @ExcelProperty(name = "课程代码", width = 30, index = 1)
+    @ExcelDataStyle(lock = true)
+    @NotNull
+    private String courseCode;
+
+    @ExcelNote(value = "课程名称")
+    @ExcelProperty(name = "课程名称", width = 30, index = 2)
+    @ExcelDataStyle(lock = true)
+    @NotNull
+    private String courseName;
+
+    @ExcelNote(value = "试卷编号")
+    @ExcelProperty(name = "试卷编号", width = 30, index = 3)
+    @ExcelDataStyle(lock = true)
+    @NotNull
+    private String paperNumber;
+
+    @ExcelNote(value = "试卷类型")
+    @ExcelProperty(name = "试卷类型", width = 30, index = 4)
+    @ExcelDataStyle(lock = true)
+    @NotNull
+    private String paperType;
+
+    @ExcelNote(value = "题目类型")
+    @ExcelProperty(name = "题目类型", width = 30, index = 5)
+    @ExcelDataStyle(lock = true)
+    @NotNull
+    private String numberType;
+
+    @ExcelNote(value = "大题名称")
+    @ExcelProperty(name = "大题名称", width = 30, index = 6)
+    @ExcelDataStyle(lock = true)
+    @NotNull
+    private String bigTopicName;
+
+    @ExcelNote(value = "大题号")
+    @ExcelProperty(name = "大题号", width = 30, index = 7)
+    @ExcelDataStyle(lock = true)
+    @NotNull
+    private String bigQuestionNumber;
+
+    @ExcelNote(value = "小题号")
+    @ExcelProperty(name = "小题号", width = 30, index = 8)
+    @ExcelDataStyle(lock = true)
+    @NotNull
+    private String smallQuestionNumber;
+
+    @ExcelNote(value = "题目满分")
+    @ExcelProperty(name = "题目满分", width = 30, index = 9)
+    @ExcelDataStyle(lock = true)
+    @NotNull
+    private String fullScore;
+
+    @ExcelNote(value = "知识维度")
+    @ExcelProperty(name = "知识维度", width = 30, index = 10)
+    @ExcelDataStyle
+    @NotNull
+    private String knowledgeDimension;
+
+    @ExcelNote(value = "能力维度")
+    @ExcelProperty(name = "能力维度", width = 30, index = 11)
+    @ExcelDataStyle
+    private String abilityDimension;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getNumberType() {
+        return numberType;
+    }
+
+    public void setNumberType(String numberType) {
+        this.numberType = numberType;
+    }
+
+    public String getBigTopicName() {
+        return bigTopicName;
+    }
+
+    public void setBigTopicName(String bigTopicName) {
+        this.bigTopicName = bigTopicName;
+    }
+
+    public String getBigQuestionNumber() {
+        return bigQuestionNumber;
+    }
+
+    public void setBigQuestionNumber(String bigQuestionNumber) {
+        this.bigQuestionNumber = bigQuestionNumber;
+    }
+
+    public String getSmallQuestionNumber() {
+        return smallQuestionNumber;
+    }
+
+    public void setSmallQuestionNumber(String smallQuestionNumber) {
+        this.smallQuestionNumber = smallQuestionNumber;
+    }
+
+    public String getFullScore() {
+        return fullScore;
+    }
+
+    public void setFullScore(String fullScore) {
+        this.fullScore = fullScore;
+    }
+
+    public String getKnowledgeDimension() {
+        return knowledgeDimension;
+    }
+
+    public void setKnowledgeDimension(String knowledgeDimension) {
+        this.knowledgeDimension = knowledgeDimension;
+    }
+
+    public String getAbilityDimension() {
+        return abilityDimension;
+    }
+
+    public void setAbilityDimension(String abilityDimension) {
+        this.abilityDimension = abilityDimension;
+    }
+}

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

@@ -0,0 +1,39 @@
+package com.qmth.distributed.print.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelImportTempleteVaild;
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 教学课程导入dto
+ * @Author: CaoZixuan
+ * @Date: 2023-03-15
+ */
+@ExcelImportTempleteVaild(value = true)
+public class TeachCourseDto implements Serializable {
+    @ExcelNote(value = "课程编号")
+    @NotNull
+    private String courseCode;
+
+    @ExcelNote(value = "课程名称")
+    @NotNull
+    private String courseName;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+}

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

@@ -0,0 +1,28 @@
+package com.qmth.distributed.print.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelImportTempleteVaild;
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 教学学生导入Dto
+ * @Author: CaoZixuan
+ * @Date: 2022-02-10
+ */
+@ExcelImportTempleteVaild(value = true)
+public class TeachStudentImportDto implements Serializable {
+
+    @ExcelNote(value = "学号")
+    @NotNull
+    private String studentCode;
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+}

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

@@ -0,0 +1,81 @@
+package com.qmth.distributed.print.business.bean.dto.excel;
+
+import com.qmth.boot.tools.excel.annotation.ExcelColumn;
+import com.qmth.teachcloud.common.annotation.ExcelImportTempleteVaild;
+import com.qmth.teachcloud.common.annotation.excelStyle.ExcelHeaderStyle;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @Description: 任课老师导入
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2025/2/28
+ */
+@ExcelHeaderStyle
+@ExcelImportTempleteVaild(value = true)
+public class TeacherImportDto implements Serializable {
+
+    @ExcelColumn(name = "课程代码", index = 0, nullable = true)
+    private String courseCode;
+
+    @ExcelColumn(name = "课程名称", index = 1, nullable = true)
+    private String courseName;
+
+    @ExcelColumn(name = "开课学院", index = 2, nullable = true)
+    private String teachingRoomName;
+
+    @ExcelColumn(name = "任课老师工号", index = 3, nullable = true)
+    private String teacherCode;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getTeachingRoomName() {
+        return teachingRoomName;
+    }
+
+    public void setTeachingRoomName(String teachingRoomName) {
+        this.teachingRoomName = teachingRoomName;
+    }
+
+    public String getTeacherCode() {
+        return teacherCode;
+    }
+
+    public void setTeacherCode(String teacherCode) {
+        this.teacherCode = teacherCode;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        TeacherImportDto that = (TeacherImportDto) o;
+        return courseCode.equals(that.courseCode) && courseName.equals(that.courseName) && teachingRoomName.equals(that.teachingRoomName) && teacherCode.equals(that.teacherCode);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(courseCode, courseName, teachingRoomName, teacherCode);
+    }
+}

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

@@ -0,0 +1,39 @@
+package com.qmth.distributed.print.business.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelImportTempleteVaild;
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 教师团队导入模板
+ * @Author: CaoZixuan
+ * @Date: 2023-03-16
+ */
+@ExcelImportTempleteVaild(value = true)
+public class TeacherTeamDto implements Serializable {
+    @ExcelNote(value = "姓名")
+    @NotNull
+    private String name;
+
+    @ExcelNote(value = "用户名/工号")
+    @NotNull
+    private String code;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+}

+ 220 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/importFile/BasicExamStudentImport.java

@@ -0,0 +1,220 @@
+package com.qmth.distributed.print.business.bean.dto.importFile;
+
+import com.qmth.teachcloud.common.bean.examRule.CodeNameEnableDisabledValue;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class BasicExamStudentImport {
+
+    @ApiModelProperty(value = "课程代码")
+    private String courseCode;
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
+    @ApiModelProperty(value = "开课学院")
+    private String teachingRoomName;
+    @ApiModelProperty(value = "教学班")
+    private String teachClassName;
+    @ApiModelProperty(value = "行政班")
+    private String className;
+    @ApiModelProperty(value = "试卷编号")
+    private String paperNumber;
+    @ApiModelProperty(value = "姓名")
+    private String studentName;
+    @ApiModelProperty(value = "学号")
+    private String studentCode;
+    @ApiModelProperty(value = "座位号")
+    private String siteNumber;
+    @ApiModelProperty(value = "学院")
+    private String collegeName;
+    @ApiModelProperty(value = "专业")
+    private String majorName;
+    @ApiModelProperty(value = "任课教师")
+    private String teacherName;
+    @ApiModelProperty(value = "任课教师工号")
+    private String teacherCode;
+    @ApiModelProperty(value = "考试日期")
+    private String examDate;
+    @ApiModelProperty(value = "考试时间")
+    private String examTime;
+    @ApiModelProperty("考点(校区)")
+    private String examPlace;
+    @ApiModelProperty("考场(考试教室)")
+    private String examRoom;
+    @ApiModelProperty("必填字段集合")
+    private List<CodeNameEnableDisabledValue> requiredFieldList = new ArrayList<>();
+    @ApiModelProperty("扩展字段集合")
+    private List<CodeNameEnableDisabledValue> extendFieldList = new ArrayList<>();
+    @ApiModelProperty("错误信息")
+    private String errorMsg;
+    private int rowIndex;
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getTeachingRoomName() {
+        return teachingRoomName;
+    }
+
+    public void setTeachingRoomName(String teachingRoomName) {
+        this.teachingRoomName = teachingRoomName;
+    }
+
+    public String getTeachClassName() {
+        return teachClassName;
+    }
+
+    public void setTeachClassName(String teachClassName) {
+        this.teachClassName = teachClassName;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getSiteNumber() {
+        return siteNumber;
+    }
+
+    public void setSiteNumber(String siteNumber) {
+        this.siteNumber = siteNumber;
+    }
+
+    public String getCollegeName() {
+        return collegeName;
+    }
+
+    public void setCollegeName(String collegeName) {
+        this.collegeName = collegeName;
+    }
+
+    public String getMajorName() {
+        return majorName;
+    }
+
+    public void setMajorName(String majorName) {
+        this.majorName = majorName;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getTeacherCode() {
+        return teacherCode;
+    }
+
+    public void setTeacherCode(String teacherCode) {
+        this.teacherCode = teacherCode;
+    }
+
+    public String getExamDate() {
+        return examDate;
+    }
+
+    public void setExamDate(String examDate) {
+        this.examDate = examDate;
+    }
+
+    public String getExamTime() {
+        return examTime;
+    }
+
+    public void setExamTime(String examTime) {
+        this.examTime = examTime;
+    }
+
+    public String getExamPlace() {
+        return examPlace;
+    }
+
+    public void setExamPlace(String examPlace) {
+        this.examPlace = examPlace;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public List<CodeNameEnableDisabledValue> getRequiredFieldList() {
+        return requiredFieldList;
+    }
+
+    public void setRequiredFieldList(List<CodeNameEnableDisabledValue> requiredFieldList) {
+        this.requiredFieldList = requiredFieldList;
+    }
+
+    public List<CodeNameEnableDisabledValue> getExtendFieldList() {
+        return extendFieldList;
+    }
+
+    public void setExtendFieldList(List<CodeNameEnableDisabledValue> extendFieldList) {
+        this.extendFieldList = extendFieldList;
+    }
+
+    public String getErrorMsg() {
+        return errorMsg;
+    }
+
+    public void setErrorMsg(String errorMsg) {
+        this.errorMsg = errorMsg;
+    }
+
+    public int getRowIndex() {
+        return rowIndex;
+    }
+
+    public void setRowIndex(int rowIndex) {
+        this.rowIndex = rowIndex;
+    }
+}

+ 29 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/importFile/BasicExamStudentParseDto.java

@@ -0,0 +1,29 @@
+package com.qmth.distributed.print.business.bean.dto.importFile;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+public class BasicExamStudentParseDto {
+
+    @ApiModelProperty(value = "表头")
+    private String[] columnNames;
+    @ApiModelProperty(value = "解析数据集合")
+    private List<BasicExamStudentImport> basicExamStudentImportList;
+
+    public String[] getColumnNames() {
+        return columnNames;
+    }
+
+    public void setColumnNames(String[] columnNames) {
+        this.columnNames = columnNames;
+    }
+
+    public List<BasicExamStudentImport> getBasicExamStudentImportList() {
+        return basicExamStudentImportList;
+    }
+
+    public void setBasicExamStudentImportList(List<BasicExamStudentImport> basicExamStudentImportList) {
+        this.basicExamStudentImportList = basicExamStudentImportList;
+    }
+}

+ 128 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/initMarkData/ExamDetailCourseInitMarkDto.java

@@ -0,0 +1,128 @@
+package com.qmth.distributed.print.business.bean.dto.initMarkData;
+
+import com.qmth.distributed.print.business.entity.ExamCardModelFour;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.mark.entity.MarkPaper;
+import org.yaml.snakeyaml.error.Mark;
+
+/**
+ * 课程同步阅卷数据dto
+ */
+public class ExamDetailCourseInitMarkDto {
+
+    private Long schoolId;
+    private Long semesterId;
+    private Long examId;
+    private Long courseId;
+    private String paperNumber;
+    private String coursePaperId;
+    private Integer serialNumber;
+    private String paperType;
+    private Boolean openAb;
+    private Long createId;
+    private String packageCode;
+
+    public ExamDetailCourseInitMarkDto() {
+
+    }
+
+    public ExamDetailCourseInitMarkDto(ExamCardModelFour examCardModelFour, MarkPaper markPaper, Long userId) {
+        this.schoolId = examCardModelFour.getSchoolId();
+        this.examId = examCardModelFour.getExamId();
+        this.courseId = examCardModelFour.getCourseId();
+        this.paperNumber = markPaper.getPaperNumber();
+        this.coursePaperId = markPaper.getCoursePaperId();
+        this.serialNumber = 1;
+        this.paperType = SystemConstant.DEFAULT_PAPER_TYPE_A;
+        this.openAb = false;
+        this.createId = userId;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    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 getCoursePaperId() {
+        return coursePaperId;
+    }
+
+    public void setCoursePaperId(String coursePaperId) {
+        this.coursePaperId = coursePaperId;
+    }
+
+    public Integer getSerialNumber() {
+        return serialNumber;
+    }
+
+    public void setSerialNumber(Integer serialNumber) {
+        this.serialNumber = serialNumber;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public Boolean getOpenAb() {
+        return openAb;
+    }
+
+    public void setOpenAb(Boolean openAb) {
+        this.openAb = openAb;
+    }
+
+    public Long getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(Long createId) {
+        this.createId = createId;
+    }
+
+    public String getPackageCode() {
+        return packageCode;
+    }
+
+    public void setPackageCode(String packageCode) {
+        this.packageCode = packageCode;
+    }
+}

+ 62 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/initMarkData/InitExamDetailDto.java

@@ -0,0 +1,62 @@
+package com.qmth.distributed.print.business.bean.dto.initMarkData;
+
+/**
+ * 课程同步阅卷数据dto
+ */
+public class InitExamDetailDto {
+
+    private Long examDetailCourseId;
+    private String examPlace;
+    private String examRoom;
+    private String packageCode;
+    private Long examStartTime;
+    private Long examEndTime;
+
+    public Long getExamDetailCourseId() {
+        return examDetailCourseId;
+    }
+
+    public void setExamDetailCourseId(Long examDetailCourseId) {
+        this.examDetailCourseId = examDetailCourseId;
+    }
+
+    public String getExamPlace() {
+        return examPlace;
+    }
+
+    public void setExamPlace(String examPlace) {
+        this.examPlace = examPlace;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getPackageCode() {
+        return packageCode;
+    }
+
+    public void setPackageCode(String packageCode) {
+        this.packageCode = packageCode;
+    }
+
+    public Long getExamStartTime() {
+        return examStartTime;
+    }
+
+    public void setExamStartTime(Long examStartTime) {
+        this.examStartTime = examStartTime;
+    }
+
+    public Long getExamEndTime() {
+        return examEndTime;
+    }
+
+    public void setExamEndTime(Long examEndTime) {
+        this.examEndTime = examEndTime;
+    }
+}

+ 199 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/open/ExamStudentScore.java

@@ -0,0 +1,199 @@
+package com.qmth.distributed.print.business.bean.dto.open;
+
+import java.util.List;
+
+public class ExamStudentScore {
+
+    private String name;
+    private String examNumber;
+    private String studentCode;
+    private String paperNumber;
+    private String paperName;
+    private String paperType;
+    private String college;
+    private String major;
+    private String className;
+    private String teacherName;
+    private String teacherCode;
+    private Integer status;
+    private Double totalScore;
+    private Double objectiveScore;
+    private Double subjectiveScore;
+    private List<TopicInfo> objectiveScoreDetail;
+    private List<TopicInfo> subjectiveScoreDetail;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getPaperName() {
+        return paperName;
+    }
+
+    public void setPaperName(String paperName) {
+        this.paperName = paperName;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getCollege() {
+        return college;
+    }
+
+    public void setCollege(String college) {
+        this.college = college;
+    }
+
+    public String getMajor() {
+        return major;
+    }
+
+    public void setMajor(String major) {
+        this.major = major;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getTeacherCode() {
+        return teacherCode;
+    }
+
+    public void setTeacherCode(String teacherCode) {
+        this.teacherCode = teacherCode;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public Double getObjectiveScore() {
+        return objectiveScore;
+    }
+
+    public void setObjectiveScore(Double objectiveScore) {
+        this.objectiveScore = objectiveScore;
+    }
+
+    public Double getSubjectiveScore() {
+        return subjectiveScore;
+    }
+
+    public void setSubjectiveScore(Double subjectiveScore) {
+        this.subjectiveScore = subjectiveScore;
+    }
+
+    public List<TopicInfo> getObjectiveScoreDetail() {
+        return objectiveScoreDetail;
+    }
+
+    public void setObjectiveScoreDetail(List<TopicInfo> objectiveScoreDetail) {
+        this.objectiveScoreDetail = objectiveScoreDetail;
+    }
+
+    public List<TopicInfo> getSubjectiveScoreDetail() {
+        return subjectiveScoreDetail;
+    }
+
+    public void setSubjectiveScoreDetail(List<TopicInfo> subjectiveScoreDetail) {
+        this.subjectiveScoreDetail = subjectiveScoreDetail;
+    }
+
+    public static class TopicInfo{
+        private String score;
+        private String answer;
+        private Integer mainNumber;
+        private String subNumber;
+
+        public String getScore() {
+            return score;
+        }
+
+        public void setScore(String score) {
+            this.score = score;
+        }
+
+        public String getAnswer() {
+            return answer;
+        }
+
+        public void setAnswer(String answer) {
+            this.answer = answer;
+        }
+
+        public Integer getMainNumber() {
+            return mainNumber;
+        }
+
+        public void setMainNumber(Integer mainNumber) {
+            this.mainNumber = mainNumber;
+        }
+
+        public String getSubNumber() {
+            return subNumber;
+        }
+
+        public void setSubNumber(String subNumber) {
+            this.subNumber = subNumber;
+        }
+    }
+}

+ 90 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/open/PaperConfig.java

@@ -0,0 +1,90 @@
+package com.qmth.distributed.print.business.bean.dto.open;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+
+import java.math.BigDecimal;
+
+public class PaperConfig {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    private String paperType;
+
+    private Long startTime;
+
+    private Long endTime;
+
+    private BigDecimal coefficient;
+
+    private BigDecimal totalScore;
+
+    private BigDecimal passScore;
+
+    private String scoreType;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public Long getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Long startTime) {
+        this.startTime = startTime;
+    }
+
+    public Long getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Long endTime) {
+        this.endTime = endTime;
+    }
+
+    public BigDecimal getCoefficient() {
+        return coefficient;
+    }
+
+    public void setCoefficient(BigDecimal coefficient) {
+        this.coefficient = coefficient;
+    }
+
+    public BigDecimal getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(BigDecimal totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public BigDecimal getPassScore() {
+        return passScore;
+    }
+
+    public void setPassScore(BigDecimal passScore) {
+        this.passScore = passScore;
+    }
+
+    public String getScoreType() {
+        return scoreType;
+    }
+
+    public void setScoreType(String scoreType) {
+        this.scoreType = scoreType;
+    }
+}

+ 98 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/open/PaperDimension.java

@@ -0,0 +1,98 @@
+package com.qmth.distributed.print.business.bean.dto.open;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+
+public class PaperDimension {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    private String paperNumber;
+
+    private String paperName;
+
+    private String dimensionType;
+
+    private String codePrimary;
+
+    private String namePrimary;
+
+    private String codeSecond;
+
+    private String nameSecond;
+
+    private String interpretation;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getPaperName() {
+        return paperName;
+    }
+
+    public void setPaperName(String paperName) {
+        this.paperName = paperName;
+    }
+
+    public String getDimensionType() {
+        return dimensionType;
+    }
+
+    public void setDimensionType(String dimensionType) {
+        this.dimensionType = dimensionType;
+    }
+
+    public String getCodePrimary() {
+        return codePrimary;
+    }
+
+    public void setCodePrimary(String codePrimary) {
+        this.codePrimary = codePrimary;
+    }
+
+    public String getNamePrimary() {
+        return namePrimary;
+    }
+
+    public void setNamePrimary(String namePrimary) {
+        this.namePrimary = namePrimary;
+    }
+
+    public String getCodeSecond() {
+        return codeSecond;
+    }
+
+    public void setCodeSecond(String codeSecond) {
+        this.codeSecond = codeSecond;
+    }
+
+    public String getNameSecond() {
+        return nameSecond;
+    }
+
+    public void setNameSecond(String nameSecond) {
+        this.nameSecond = nameSecond;
+    }
+
+    public String getInterpretation() {
+        return interpretation;
+    }
+
+    public void setInterpretation(String interpretation) {
+        this.interpretation = interpretation;
+    }
+}

+ 157 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/open/PaperEvaluation.java

@@ -0,0 +1,157 @@
+package com.qmth.distributed.print.business.bean.dto.open;
+
+import java.util.List;
+
+public class PaperEvaluation {
+
+    private String moduleType;
+    private String interpret;
+    private String remark;
+    private List<SecondaryDimensionLevelDefine> secondaryDimensionLevelDefineList;
+    private String formula;
+    private List<ModuleEvaluation> moduleEvaluationList;
+
+    public String getModuleType() {
+        return moduleType;
+    }
+
+    public void setModuleType(String moduleType) {
+        this.moduleType = moduleType;
+    }
+
+    public String getInterpret() {
+        return interpret;
+    }
+
+    public void setInterpret(String interpret) {
+        this.interpret = interpret;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public List<SecondaryDimensionLevelDefine> getSecondaryDimensionLevelDefineList() {
+        return secondaryDimensionLevelDefineList;
+    }
+
+    public void setSecondaryDimensionLevelDefineList(List<SecondaryDimensionLevelDefine> secondaryDimensionLevelDefineList) {
+        this.secondaryDimensionLevelDefineList = secondaryDimensionLevelDefineList;
+    }
+
+    public String getFormula() {
+        return formula;
+    }
+
+    public void setFormula(String formula) {
+        this.formula = formula;
+    }
+
+    public List<ModuleEvaluation> getModuleEvaluationList() {
+        return moduleEvaluationList;
+    }
+
+    public void setModuleEvaluationList(List<ModuleEvaluation> moduleEvaluationList) {
+        this.moduleEvaluationList = moduleEvaluationList;
+    }
+
+    public static class SecondaryDimensionLevelDefine{
+        private String define;
+        private String level;
+        private String max;
+        private String min;
+        private String scope;
+
+        public String getDefine() {
+            return define;
+        }
+
+        public void setDefine(String define) {
+            this.define = define;
+        }
+
+        public String getLevel() {
+            return level;
+        }
+
+        public void setLevel(String level) {
+            this.level = level;
+        }
+
+        public String getMax() {
+            return max;
+        }
+
+        public void setMax(String max) {
+            this.max = max;
+        }
+
+        public String getMin() {
+            return min;
+        }
+
+        public void setMin(String min) {
+            this.min = min;
+        }
+
+        public String getScope() {
+            return scope;
+        }
+
+        public void setScope(String scope) {
+            this.scope = scope;
+        }
+    }
+
+    public static class ModuleEvaluation{
+        private String advice;
+        private String levelCode;
+        private String levelName;
+        private String result;
+        private String scope;
+
+        public String getAdvice() {
+            return advice;
+        }
+
+        public void setAdvice(String advice) {
+            this.advice = advice;
+        }
+
+        public String getLevelCode() {
+            return levelCode;
+        }
+
+        public void setLevelCode(String levelCode) {
+            this.levelCode = levelCode;
+        }
+
+        public String getLevelName() {
+            return levelName;
+        }
+
+        public void setLevelName(String levelName) {
+            this.levelName = levelName;
+        }
+
+        public String getResult() {
+            return result;
+        }
+
+        public void setResult(String result) {
+            this.result = result;
+        }
+
+        public String getScope() {
+            return scope;
+        }
+
+        public void setScope(String scope) {
+            this.scope = scope;
+        }
+    }
+}

+ 111 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/open/PaperStructure.java

@@ -0,0 +1,111 @@
+package com.qmth.distributed.print.business.bean.dto.open;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+public class PaperStructure {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    private String questionName;
+
+    private String numberType;
+
+    private String bigQuestionNumber;
+
+    private String smallQuestionNumber;
+
+    private String bigTopicName;
+
+    private BigDecimal fullScore;
+
+    private String scoreRules;
+
+    private String knowledgeDimension;
+
+    private String abilityDimension;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getQuestionName() {
+        return questionName;
+    }
+
+    public void setQuestionName(String questionName) {
+        this.questionName = questionName;
+    }
+
+    public String getNumberType() {
+        return numberType;
+    }
+
+    public void setNumberType(String numberType) {
+        this.numberType = numberType;
+    }
+
+    public String getBigQuestionNumber() {
+        return bigQuestionNumber;
+    }
+
+    public void setBigQuestionNumber(String bigQuestionNumber) {
+        this.bigQuestionNumber = bigQuestionNumber;
+    }
+
+    public String getSmallQuestionNumber() {
+        return smallQuestionNumber;
+    }
+
+    public void setSmallQuestionNumber(String smallQuestionNumber) {
+        this.smallQuestionNumber = smallQuestionNumber;
+    }
+
+    public String getBigTopicName() {
+        return bigTopicName;
+    }
+
+    public void setBigTopicName(String bigTopicName) {
+        this.bigTopicName = bigTopicName;
+    }
+
+    public BigDecimal getFullScore() {
+        return fullScore;
+    }
+
+    public void setFullScore(BigDecimal fullScore) {
+        this.fullScore = fullScore;
+    }
+
+    public String getScoreRules() {
+        return scoreRules;
+    }
+
+    public void setScoreRules(String scoreRules) {
+        this.scoreRules = scoreRules;
+    }
+
+    public String getKnowledgeDimension() {
+        return knowledgeDimension;
+    }
+
+    public void setKnowledgeDimension(String knowledgeDimension) {
+        this.knowledgeDimension = knowledgeDimension;
+    }
+
+    public String getAbilityDimension() {
+        return abilityDimension;
+    }
+
+    public void setAbilityDimension(String abilityDimension) {
+        this.abilityDimension = abilityDimension;
+    }
+}

+ 263 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/pdf/ExamStudentInfo.java

@@ -0,0 +1,263 @@
+package com.qmth.distributed.print.business.bean.dto.pdf;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.qmth.teachcloud.common.bean.examRule.CodeNameEnableValue;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ExamStudentInfo {
+
+    @ApiModelProperty("考务学生ID")
+    private Long examStudentId;
+    @ApiModelProperty("考生ID")
+    private Long basicStudentId;
+    @ApiModelProperty("试卷类型")
+    private String paperType;
+    @ApiModelProperty("学号")
+    private String studentCode;
+    @ApiModelProperty("姓名")
+    private String studentName;
+    @ApiModelProperty("课程代码")
+    private String courseCode;
+    @ApiModelProperty("课程名称")
+    private String courseName;
+    @ApiModelProperty("座位号")
+    private String siteNumber;
+    @ApiModelProperty("试卷编号")
+    private String paperNumber;
+    @ApiModelProperty("考试日期")
+    private String examDate;
+    @ApiModelProperty("考试时间")
+    private String examTime;
+    @ApiModelProperty("考点")
+    private String examPlace;
+    @ApiModelProperty("考场")
+    private String examRoom;
+    @ApiModelProperty("学院")
+    private String collegeName;
+    @ApiModelProperty("专业")
+    private String majorName;
+    @ApiModelProperty("教学班")
+    private String teachClassName;
+    @ApiModelProperty("行政班")
+    private String className;
+    @ApiModelProperty("任课老师工号")
+    private String teacherCode;
+    @ApiModelProperty("任课老师姓名")
+    private String teacherName;
+    @ApiModelProperty("开课学院")
+    private String teachingRoomName;
+    @ApiModelProperty("考生题卡ID")
+    private Long attachmentId;
+    @ApiModelProperty("基础字段")
+    private String requiredFields;
+    @ApiModelProperty("扩展字段")
+    private String extendFields;
+    @ApiModelProperty("所有字段集合")
+    @TableField(exist = false)
+    private List<CodeNameEnableValue> fieldList;
+
+    public Long getExamStudentId() {
+        return examStudentId;
+    }
+
+    public void setExamStudentId(Long examStudentId) {
+        this.examStudentId = examStudentId;
+    }
+
+    public Long getBasicStudentId() {
+        return basicStudentId;
+    }
+
+    public void setBasicStudentId(Long basicStudentId) {
+        this.basicStudentId = basicStudentId;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getSiteNumber() {
+        return siteNumber;
+    }
+
+    public void setSiteNumber(String siteNumber) {
+        this.siteNumber = siteNumber;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getExamDate() {
+        return examDate;
+    }
+
+    public void setExamDate(String examDate) {
+        this.examDate = examDate;
+    }
+
+    public String getExamTime() {
+        return examTime;
+    }
+
+    public void setExamTime(String examTime) {
+        this.examTime = examTime;
+    }
+
+    public String getExamPlace() {
+        return examPlace;
+    }
+
+    public void setExamPlace(String examPlace) {
+        this.examPlace = examPlace;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getCollegeName() {
+        return collegeName;
+    }
+
+    public void setCollegeName(String collegeName) {
+        this.collegeName = collegeName;
+    }
+
+    public String getMajorName() {
+        return majorName;
+    }
+
+    public void setMajorName(String majorName) {
+        this.majorName = majorName;
+    }
+
+    public String getTeachClassName() {
+        return teachClassName;
+    }
+
+    public void setTeachClassName(String teachClassName) {
+        this.teachClassName = teachClassName;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getTeacherCode() {
+        return teacherCode;
+    }
+
+    public void setTeacherCode(String teacherCode) {
+        this.teacherCode = teacherCode;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public String getTeachingRoomName() {
+        return teachingRoomName;
+    }
+
+    public void setTeachingRoomName(String teachingRoomName) {
+        this.teachingRoomName = teachingRoomName;
+    }
+
+    public Long getAttachmentId() {
+        return attachmentId;
+    }
+
+    public void setAttachmentId(Long attachmentId) {
+        this.attachmentId = attachmentId;
+    }
+
+    public String getRequiredFields() {
+        return requiredFields;
+    }
+
+    public void setRequiredFields(String requiredFields) {
+        this.requiredFields = requiredFields;
+    }
+
+    public String getExtendFields() {
+        return extendFields;
+    }
+
+    public void setExtendFields(String extendFields) {
+        this.extendFields = extendFields;
+    }
+
+    public List<CodeNameEnableValue> getFieldList() {
+        List<CodeNameEnableValue> fieldList = new ArrayList<>();
+        if (StringUtils.isNotBlank(requiredFields)) {
+            CollectionUtils.addAll(fieldList, JSON.parseArray(requiredFields, CodeNameEnableValue.class));
+        }
+        if (StringUtils.isNotBlank(extendFields)) {
+            CollectionUtils.addAll(fieldList, JSON.parseArray(extendFields, CodeNameEnableValue.class));
+        }
+        return fieldList;
+    }
+
+    public void setFieldList(List<CodeNameEnableValue> fieldList) {
+        this.fieldList = fieldList;
+    }
+}

+ 124 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/excel/ExcelField.java

@@ -0,0 +1,124 @@
+package com.qmth.distributed.print.business.bean.excel;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @Description: excel 动态字段
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2024/2/19
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class ExcelField implements Serializable {
+
+    @ApiModelProperty(value = "序号")
+    Integer index = 0;
+
+    @ApiModelProperty(value = "编码")
+    String code;
+
+    @ApiModelProperty(value = "名称")
+    String name;
+
+    @ApiModelProperty(value = "值")
+    String value;
+
+    @ApiModelProperty(value = "批注")
+    Boolean comment;
+
+    public ExcelField() {
+
+    }
+
+    public ExcelField(String code, Boolean comment) {
+        this.index = getIndex() + 1;
+        this.code = code;
+        this.name = code;
+        this.comment = comment;
+    }
+
+    public ExcelField(String code, String name, Boolean comment) {
+        this.index = getIndex() + 1;
+        this.code = code;
+        this.name = name;
+        this.comment = comment;
+        this.value = "测试" + name;
+    }
+
+    public ExcelField(String code, String name, String value, Boolean comment) {
+        this.index = getIndex() + 1;
+        this.code = code;
+        this.name = name;
+        this.comment = comment;
+        this.value = value;
+    }
+
+    public void setNull() {
+        this.index = null;
+        this.code = null;
+        this.value = null;
+        this.comment = null;
+    }
+
+    public Integer getIndex() {
+        return index;
+    }
+
+    public void setIndex(Integer index) {
+        this.index = index;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public Boolean getComment() {
+        return comment;
+    }
+
+    public void setComment(Boolean comment) {
+        this.comment = comment;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        ExcelField that = (ExcelField) o;
+        return Objects.equals(code, that.code) && Objects.equals(name, that.name) && Objects.equals(value, that.value) && Objects.equals(comment, that.comment);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(code, name, value, comment);
+    }
+}

+ 40 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowApproveRoleDto.java

@@ -0,0 +1,40 @@
+package com.qmth.distributed.print.business.bean.flow;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 自定义流程审核角色 dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/1/21
+ */
+public class CustomFlowApproveRoleDto implements Serializable {
+
+    @ApiModelProperty(value = "id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    Long id;
+
+    @ApiModelProperty(value = "角色名称")
+    String name;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 40 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowApproveUserDto.java

@@ -0,0 +1,40 @@
+package com.qmth.distributed.print.business.bean.flow;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 自定义流程审核用户 dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/1/21
+ */
+public class CustomFlowApproveUserDto implements Serializable {
+
+    @ApiModelProperty(value = "id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    Long id;
+
+    @ApiModelProperty(value = "用户名称")
+    String name;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 108 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowCommonDto.java

@@ -0,0 +1,108 @@
+package com.qmth.distributed.print.business.bean.flow;
+
+import com.qmth.distributed.print.business.enums.CustomFlowTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 自定义流程common dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/1/21
+ */
+public class CustomFlowCommonDto implements Serializable {
+
+    @ApiModelProperty(value = "id")
+    @NotBlank(message = "id不能为空")
+    String id;
+
+    @ApiModelProperty(value = "节点类型")
+    @NotNull(message = "节点类型不能为空")
+    CustomFlowTypeEnum type;
+
+    @ApiModelProperty(value = "节点内容")
+    String content;
+
+    @ApiModelProperty(value = "width")
+    Double w;
+
+    @ApiModelProperty(value = "height")
+    Double h;
+
+    @ApiModelProperty(value = "x坐标轴")
+    Double x;
+
+    @ApiModelProperty(value = "y坐标轴")
+    Double y;
+
+    @ApiModelProperty(value = "属性")
+    CustomFlowPropertyDto property;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public CustomFlowTypeEnum getType() {
+        return type;
+    }
+
+    public void setType(CustomFlowTypeEnum type) {
+        this.type = type;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public Double getW() {
+        return w;
+    }
+
+    public void setW(Double w) {
+        this.w = w;
+    }
+
+    public Double getH() {
+        return h;
+    }
+
+    public void setH(Double h) {
+        this.h = h;
+    }
+
+    public Double getX() {
+        return x;
+    }
+
+    public void setX(Double x) {
+        this.x = x;
+    }
+
+    public Double getY() {
+        return y;
+    }
+
+    public void setY(Double y) {
+        this.y = y;
+    }
+
+    public CustomFlowPropertyDto getProperty() {
+        return property;
+    }
+
+    public void setProperty(CustomFlowPropertyDto property) {
+        this.property = property;
+    }
+}

+ 40 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowCopyUserDto.java

@@ -0,0 +1,40 @@
+package com.qmth.distributed.print.business.bean.flow;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 自定义流程抄送用户 dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/1/21
+ */
+public class CustomFlowCopyUserDto implements Serializable {
+
+    @ApiModelProperty(value = "id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    Long id;
+
+    @ApiModelProperty(value = "用户名称")
+    String name;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 72 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowDto.java

@@ -0,0 +1,72 @@
+package com.qmth.distributed.print.business.bean.flow;
+
+import com.qmth.distributed.print.business.enums.CustomFlowTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description: 自定义流程dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/1/21
+ */
+public class CustomFlowDto extends CustomFlowCommonDto implements Serializable {
+
+    @ApiModelProperty(value = "流程属性id")
+    String flowTaskId;
+
+    @ApiModelProperty(value = "前置流程节点id集合")
+    List<CustomFlowSequenceDto> beforeFlowTaskIds;
+
+    @ApiModelProperty(value = "后置流程节点id集合")
+    List<CustomFlowSequenceDto> afterFlowTaskIds;
+
+    @ApiModelProperty(value = "流程步骤")
+    Integer setup;
+
+    public CustomFlowDto() {
+
+    }
+
+    public CustomFlowDto(String id, CustomFlowTypeEnum type, String content, String flowTaskId) {
+        this.id = id;
+        this.type = type;
+        this.content = content;
+        this.flowTaskId = flowTaskId;
+    }
+
+    public Integer getSetup() {
+        return setup;
+    }
+
+    public void setSetup(Integer setup) {
+        this.setup = setup;
+    }
+
+    public List<CustomFlowSequenceDto> getBeforeFlowTaskIds() {
+        return beforeFlowTaskIds;
+    }
+
+    public void setBeforeFlowTaskIds(List<CustomFlowSequenceDto> beforeFlowTaskIds) {
+        this.beforeFlowTaskIds = beforeFlowTaskIds;
+    }
+
+    public List<CustomFlowSequenceDto> getAfterFlowTaskIds() {
+        return afterFlowTaskIds;
+    }
+
+    public void setAfterFlowTaskIds(List<CustomFlowSequenceDto> afterFlowTaskIds) {
+        this.afterFlowTaskIds = afterFlowTaskIds;
+    }
+
+    public String getFlowTaskId() {
+        return flowTaskId;
+    }
+
+    public void setFlowTaskId(String flowTaskId) {
+        this.flowTaskId = flowTaskId;
+    }
+}

+ 63 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowEditDto.java

@@ -0,0 +1,63 @@
+package com.qmth.distributed.print.business.bean.flow;
+
+import com.qmth.distributed.print.business.entity.TFCustomFlow;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Description: 自定义流程edit dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/1/21
+ */
+public class CustomFlowEditDto extends CustomFlowPropDto implements Serializable {
+
+    @ApiModelProperty(value = "流程节点内容")
+    List<CustomFlowCommonDto> customFlowLists;
+
+    public CustomFlowEditDto() {
+
+    }
+
+    public CustomFlowEditDto(TFCustomFlow tfCustomFlow, List<CustomFlowCommonDto> customFlowLists) {
+        super(tfCustomFlow);
+        this.customFlowLists = customFlowLists;
+    }
+
+    public List<CustomFlowCommonDto> getCustomFlowLists() {
+        return customFlowLists;
+    }
+
+    public void setCustomFlowLists(List<CustomFlowCommonDto> customFlowLists) {
+        this.customFlowLists = customFlowLists;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        CustomFlowEditDto that = (CustomFlowEditDto) o;
+        return type == that.type && schoolId.equals(that.schoolId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type, schoolId);
+    }
+
+    @Override
+    public String toString() {
+        return "CustomFlowEditDto{" +
+                "type=" + type +
+                ", schoolId=" + schoolId +
+                '}';
+    }
+}

+ 72 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowGatewayDto.java

@@ -0,0 +1,72 @@
+package com.qmth.distributed.print.business.bean.flow;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @Description: 自定义流程网关 dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/2/10
+ */
+public class CustomFlowGatewayDto implements Serializable {
+
+    @ApiModelProperty(value = "审批通过排他网关节点id")
+    List<String> beforeExclusiveGatewayId;
+
+    @ApiModelProperty(value = "审批驳回排他网关节点id")
+    String afterExclusiveGatewayId;
+
+    @ApiModelProperty(value = "流程节点id集合")
+    Map<String, List<CustomFlowSequenceDto>> flowTaskIds;
+
+    public CustomFlowGatewayDto() {
+
+    }
+
+    public CustomFlowGatewayDto(String exclusiveGatewayId, Map<String, List<CustomFlowSequenceDto>> flowTaskIds, boolean beforeExclusiveGateway) {
+        if (beforeExclusiveGateway) {
+            if (Objects.isNull(this.beforeExclusiveGatewayId)) {
+                this.beforeExclusiveGatewayId = new ArrayList<>();
+            }
+            this.beforeExclusiveGatewayId.add(exclusiveGatewayId);
+        } else {
+            this.afterExclusiveGatewayId = exclusiveGatewayId;
+        }
+        this.flowTaskIds = flowTaskIds;
+    }
+
+    public List<String> getBeforeExclusiveGatewayId() {
+        if (Objects.isNull(beforeExclusiveGatewayId)) {
+            return new ArrayList<>();
+        } else {
+            return beforeExclusiveGatewayId;
+        }
+    }
+
+    public void setBeforeExclusiveGatewayId(List<String> beforeExclusiveGatewayId) {
+        this.beforeExclusiveGatewayId = beforeExclusiveGatewayId;
+    }
+
+    public String getAfterExclusiveGatewayId() {
+        return afterExclusiveGatewayId;
+    }
+
+    public void setAfterExclusiveGatewayId(String afterExclusiveGatewayId) {
+        this.afterExclusiveGatewayId = afterExclusiveGatewayId;
+    }
+
+    public Map<String, List<CustomFlowSequenceDto>> getFlowTaskIds() {
+        return flowTaskIds;
+    }
+
+    public void setFlowTaskIds(Map<String, List<CustomFlowSequenceDto>> flowTaskIds) {
+        this.flowTaskIds = flowTaskIds;
+    }
+}

+ 151 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowPropDto.java

@@ -0,0 +1,151 @@
+package com.qmth.distributed.print.business.bean.flow;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.entity.TFCustomFlow;
+import com.qmth.teachcloud.common.enums.TFCustomModelTypeEnum;
+import com.qmth.teachcloud.common.enums.TFCustomTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @Description: 自定义流程save dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/1/21
+ */
+public class CustomFlowPropDto implements Serializable {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "自定义流程id")
+    Long customFlowId;
+
+    @ApiModelProperty(value = "id")
+    @NotBlank(message = "流程名称")
+    String name;
+
+    @ApiModelProperty(value = "流程模式")
+    @NotNull(message = "流程模式不能为空")
+    TFCustomModelTypeEnum modelType;
+
+    @ApiModelProperty(value = "流程类型")
+    @NotNull(message = "流程类型不能为空")
+    TFCustomTypeEnum type;
+
+    @ApiModelProperty(value = "是否发布,0:否,1:是")
+    Boolean publish;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    Long orgId;
+
+    public CustomFlowPropDto(){
+
+    }
+
+    public CustomFlowPropDto(TFCustomFlow tfCustomFlow){
+        this.customFlowId = tfCustomFlow.getId();
+        this.name = tfCustomFlow.getName();
+        this.modelType = tfCustomFlow.getModelType();
+        this.type = tfCustomFlow.getType();
+        this.publish = tfCustomFlow.getPublish();
+        this.schoolId = tfCustomFlow.getSchoolId();
+        this.orgId = tfCustomFlow.getOrgId();
+    }
+
+    public void setSchoolAndOrgInfo(Long schoolId, Long orgId) {
+        this.schoolId = schoolId;
+        this.orgId = orgId;
+    }
+
+
+    public TFCustomModelTypeEnum getModelType() {
+        return modelType;
+    }
+
+    public void setModelType(TFCustomModelTypeEnum modelType) {
+        this.modelType = modelType;
+    }
+
+    public Long getCustomFlowId() {
+        return customFlowId;
+    }
+
+    public void setCustomFlowId(Long customFlowId) {
+        this.customFlowId = customFlowId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public TFCustomTypeEnum getType() {
+        return type;
+    }
+
+    public void setType(TFCustomTypeEnum type) {
+        this.type = type;
+    }
+
+    public Boolean getPublish() {
+        return publish;
+    }
+
+    public void setPublish(Boolean publish) {
+        this.publish = publish;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        CustomFlowPropDto that = (CustomFlowPropDto) o;
+        return type == that.type && schoolId.equals(that.schoolId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type, schoolId);
+    }
+
+    @Override
+    public String toString() {
+        return "CustomFlowSaveDto{" +
+                "type=" + type +
+                ", schoolId=" + schoolId +
+                '}';
+    }
+}

+ 129 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowPropertyDto.java

@@ -0,0 +1,129 @@
+package com.qmth.distributed.print.business.bean.flow;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.qmth.distributed.print.business.enums.*;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description: 自定义流程property dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/1/21
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class CustomFlowPropertyDto implements Serializable {
+
+    @ApiModelProperty(value = "属性")
+    CustomFlowApproveUserTypeEnum approveUserType;
+
+    @ApiModelProperty(value = "审批用户列表")
+    List<CustomFlowApproveUserDto> approveUsers;
+
+    @ApiModelProperty(value = "审批角色列表")
+    List<CustomFlowApproveRoleDto> approveRoles;
+
+    @ApiModelProperty(value = "抄送用户列表")
+    List<CustomFlowCopyUserDto> copyForUsers;
+
+    @ApiModelProperty(value = "自定义流程审核类型")
+    CustomFlowMultipleUserApproveTypeEnum multipleUserApproveType;
+
+    @ApiModelProperty(value = "自定义流程驳回类型")
+    CustomFlowRejectTypeEnum rejectType;
+
+    @ApiModelProperty(value = "自定义流程驳回重新提交类型")
+    CustomFlowRejectResubmitTypeEnum rejectResubmitType;
+
+    @ApiModelProperty(value = "自定义流程发起人指定选择人数")
+    CustomFlowApproveUserCountTypeEnum approveUserCountType;
+
+    @ApiModelProperty(value = "自定义流程发起人指定选择用户类型")
+    CustomFlowApproveUserSelectRangeEnum approveUserSelectRange;
+
+    @ApiModelProperty(value = "自定义流程发起人指定审批角色列表")
+    List<CustomFlowApproveRoleDto> approveUserSelectRoles;
+
+    public CustomFlowApproveUserCountTypeEnum getApproveUserCountType() {
+        return approveUserCountType;
+    }
+
+    public void setApproveUserCountType(CustomFlowApproveUserCountTypeEnum approveUserCountType) {
+        this.approveUserCountType = approveUserCountType;
+    }
+
+    public CustomFlowApproveUserSelectRangeEnum getApproveUserSelectRange() {
+        return approveUserSelectRange;
+    }
+
+    public void setApproveUserSelectRange(CustomFlowApproveUserSelectRangeEnum approveUserSelectRange) {
+        this.approveUserSelectRange = approveUserSelectRange;
+    }
+
+    public List<CustomFlowApproveRoleDto> getApproveUserSelectRoles() {
+        return approveUserSelectRoles;
+    }
+
+    public void setApproveUserSelectRoles(List<CustomFlowApproveRoleDto> approveUserSelectRoles) {
+        this.approveUserSelectRoles = approveUserSelectRoles;
+    }
+
+    public CustomFlowApproveUserTypeEnum getApproveUserType() {
+        return approveUserType;
+    }
+
+    public void setApproveUserType(CustomFlowApproveUserTypeEnum approveUserType) {
+        this.approveUserType = approveUserType;
+    }
+
+    public List<CustomFlowApproveUserDto> getApproveUsers() {
+        return approveUsers;
+    }
+
+    public void setApproveUsers(List<CustomFlowApproveUserDto> approveUsers) {
+        this.approveUsers = approveUsers;
+    }
+
+    public List<CustomFlowApproveRoleDto> getApproveRoles() {
+        return approveRoles;
+    }
+
+    public void setApproveRoles(List<CustomFlowApproveRoleDto> approveRoles) {
+        this.approveRoles = approveRoles;
+    }
+
+    public List<CustomFlowCopyUserDto> getCopyForUsers() {
+        return copyForUsers;
+    }
+
+    public void setCopyForUsers(List<CustomFlowCopyUserDto> copyForUsers) {
+        this.copyForUsers = copyForUsers;
+    }
+
+    public CustomFlowMultipleUserApproveTypeEnum getMultipleUserApproveType() {
+        return multipleUserApproveType;
+    }
+
+    public void setMultipleUserApproveType(CustomFlowMultipleUserApproveTypeEnum multipleUserApproveType) {
+        this.multipleUserApproveType = multipleUserApproveType;
+    }
+
+    public CustomFlowRejectTypeEnum getRejectType() {
+        return rejectType;
+    }
+
+    public void setRejectType(CustomFlowRejectTypeEnum rejectType) {
+        this.rejectType = rejectType;
+    }
+
+    public CustomFlowRejectResubmitTypeEnum getRejectResubmitType() {
+        return rejectResubmitType;
+    }
+
+    public void setRejectResubmitType(CustomFlowRejectResubmitTypeEnum rejectResubmitType) {
+        this.rejectResubmitType = rejectResubmitType;
+    }
+}

+ 63 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowSaveDto.java

@@ -0,0 +1,63 @@
+package com.qmth.distributed.print.business.bean.flow;
+
+import com.qmth.distributed.print.business.entity.TFCustomFlow;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Description: 自定义流程save dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/1/21
+ */
+public class CustomFlowSaveDto extends CustomFlowPropDto implements Serializable {
+
+    @ApiModelProperty(value = "流程节点内容")
+    List<CustomFlowDto> customFlowLists;
+
+    public CustomFlowSaveDto() {
+
+    }
+
+    public CustomFlowSaveDto(TFCustomFlow tfCustomFlow, List<CustomFlowDto> customFlowLists) {
+        super(tfCustomFlow);
+        this.customFlowLists = customFlowLists;
+    }
+
+    public List<CustomFlowDto> getCustomFlowLists() {
+        return customFlowLists;
+    }
+
+    public void setCustomFlowLists(List<CustomFlowDto> customFlowLists) {
+        this.customFlowLists = customFlowLists;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        CustomFlowSaveDto that = (CustomFlowSaveDto) o;
+        return type == that.type && schoolId.equals(that.schoolId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type, schoolId);
+    }
+
+    @Override
+    public String toString() {
+        return "CustomFlowSaveDto{" +
+                "type=" + type +
+                ", schoolId=" + schoolId +
+                '}';
+    }
+}

+ 82 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowSequenceDto.java

@@ -0,0 +1,82 @@
+package com.qmth.distributed.print.business.bean.flow;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 自定义流程网关 dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/2/10
+ */
+public class CustomFlowSequenceDto implements Serializable {
+
+    @ApiModelProperty(value = "后置流程节点id")
+    String afterFlowTaskId;
+
+    @ApiModelProperty(value = "前置流程节点id")
+    String beforeFlowTaskId;
+
+    @ApiModelProperty(value = "条件表达式")
+    String conditionExp;
+
+    @ApiModelProperty(value = "流程步骤")
+    Integer setup;
+
+    public CustomFlowSequenceDto() {
+
+    }
+
+    public CustomFlowSequenceDto(String flowTaskId, boolean beforeFlowTask, Integer setup) {
+        if (beforeFlowTask) {
+            this.beforeFlowTaskId = flowTaskId;
+        } else {
+            this.afterFlowTaskId = flowTaskId;
+        }
+        this.setup = setup;
+    }
+
+    public CustomFlowSequenceDto(String flowTaskId, String conditionExp, boolean beforeFlowTask, Integer setup) {
+        if (beforeFlowTask) {
+            this.beforeFlowTaskId = flowTaskId;
+        } else {
+            this.afterFlowTaskId = flowTaskId;
+        }
+        this.conditionExp = conditionExp;
+        this.setup = setup;
+    }
+
+    public Integer getSetup() {
+        return setup;
+    }
+
+    public void setSetup(Integer setup) {
+        this.setup = setup;
+    }
+
+    public String getAfterFlowTaskId() {
+        return afterFlowTaskId;
+    }
+
+    public void setAfterFlowTaskId(String afterFlowTaskId) {
+        this.afterFlowTaskId = afterFlowTaskId;
+    }
+
+    public String getBeforeFlowTaskId() {
+        return beforeFlowTaskId;
+    }
+
+    public void setBeforeFlowTaskId(String beforeFlowTaskId) {
+        this.beforeFlowTaskId = beforeFlowTaskId;
+    }
+
+    public String getConditionExp() {
+        return conditionExp;
+    }
+
+    public void setConditionExp(String conditionExp) {
+        this.conditionExp = conditionExp;
+    }
+}

+ 234 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/CustomFlowVarDto.java

@@ -0,0 +1,234 @@
+package com.qmth.distributed.print.business.bean.flow;
+
+import com.qmth.distributed.print.business.enums.*;
+import com.qmth.teachcloud.common.enums.TFCustomModelTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description: 自定义流程节点变量 dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/2/10
+ */
+public class CustomFlowVarDto implements Serializable {
+
+    @ApiModelProperty(value = "流程节点变量")
+    String flowTaskVar;
+
+    @ApiModelProperty(value = "审批人id")
+    List<String> approveIds;
+
+    @ApiModelProperty(value = "流程模式")
+    TFCustomModelTypeEnum modelType;
+
+    @ApiModelProperty(value = "属性")
+    CustomFlowApproveUserTypeEnum approveUserType;
+
+    @ApiModelProperty(value = "自定义流程审核类型")
+    CustomFlowMultipleUserApproveTypeEnum multipleUserApproveType;
+
+    @ApiModelProperty(value = "自定义流程驳回类型")
+    CustomFlowRejectTypeEnum rejectType;
+
+    @ApiModelProperty(value = "自定义流程驳回重新提交类型")
+    CustomFlowRejectResubmitTypeEnum rejectResubmitType;
+
+    @ApiModelProperty(value = "审批人姓名")
+    String approveUserNames;
+
+    @ApiModelProperty(value = "抄送人id")
+    List<String> copyForUserIds;
+
+    @ApiModelProperty(value = "抄送人姓名")
+    String copyForUserNames;
+
+    @ApiModelProperty(value = "审批角色ids")
+    List<String> approveRoleIds;
+
+    @ApiModelProperty(value = "发起人指定审批角色ids")
+    List<String> approveUserSelectRolesIds;
+
+    @ApiModelProperty(value = "自定义流程发起人指定选择人数")
+    CustomFlowApproveUserCountTypeEnum approveUserCountType;
+
+    @ApiModelProperty(value = "自定义流程发起人指定选择用户类型")
+    CustomFlowApproveUserSelectRangeEnum approveUserSelectRange;
+
+    public CustomFlowVarDto() {
+
+    }
+
+    public CustomFlowVarDto(String flowTaskVar) {
+        this.flowTaskVar = flowTaskVar;
+    }
+
+    public CustomFlowVarDto(String flowTaskVar, List<String> approveIds, List<String> copyForUserIds, String copyForUserNames, List<String> approveRoleIds, List<String> approveUserSelectRolesIds, CustomFlowApproveUserCountTypeEnum approveUserCountType, CustomFlowApproveUserSelectRangeEnum approveUserSelectRange, TFCustomModelTypeEnum modelType) {
+        this.flowTaskVar = flowTaskVar;
+        this.approveIds = approveIds;
+        this.copyForUserIds = copyForUserIds;
+        this.copyForUserNames = copyForUserNames;
+        this.approveRoleIds = approveRoleIds;
+        this.approveUserSelectRolesIds = approveUserSelectRolesIds;
+        this.approveUserCountType = approveUserCountType;
+        this.approveUserSelectRange = approveUserSelectRange;
+        this.modelType = modelType;
+    }
+
+    public CustomFlowVarDto(String flowTaskVar, List<String> approveIds, String approveUserNames, List<String> copyForUserIds, String copyForUserNames, List<String> approveRoleIds, List<String> approveUserSelectRolesIds, CustomFlowApproveUserCountTypeEnum approveUserCountType, CustomFlowApproveUserSelectRangeEnum approveUserSelectRange, TFCustomModelTypeEnum modelType) {
+        this.flowTaskVar = flowTaskVar;
+        this.approveIds = approveIds;
+        this.approveUserNames = approveUserNames;
+        this.copyForUserIds = copyForUserIds;
+        this.copyForUserNames = copyForUserNames;
+        this.approveRoleIds = approveRoleIds;
+        this.approveUserSelectRolesIds = approveUserSelectRolesIds;
+        this.approveUserCountType = approveUserCountType;
+        this.approveUserSelectRange = approveUserSelectRange;
+        this.modelType = modelType;
+    }
+
+    public CustomFlowVarDto(String flowTaskVar, List<String> approveIds,
+                            CustomFlowApproveUserTypeEnum approveUserType,
+                            CustomFlowMultipleUserApproveTypeEnum multipleUserApproveType,
+                            CustomFlowRejectTypeEnum rejectType,
+                            CustomFlowRejectResubmitTypeEnum rejectResubmitType,
+                            String approveUserNames,
+                            List<String> copyForUserIds,
+                            String copyForUserNames,
+                            List<String> approveRoleIds,
+                            List<String> approveUserSelectRolesIds,
+                            CustomFlowApproveUserCountTypeEnum approveUserCountType,
+                            CustomFlowApproveUserSelectRangeEnum approveUserSelectRange,
+                            TFCustomModelTypeEnum modelType) {
+        this.flowTaskVar = flowTaskVar;
+        this.approveIds = approveIds;
+        this.approveUserType = approveUserType;
+        this.multipleUserApproveType = multipleUserApproveType;
+        this.rejectType = rejectType;
+        this.rejectResubmitType = rejectResubmitType;
+        this.approveUserNames = approveUserNames;
+        this.copyForUserIds = copyForUserIds;
+        this.copyForUserNames = copyForUserNames;
+        this.approveRoleIds = approveRoleIds;
+        this.approveUserSelectRolesIds = approveUserSelectRolesIds;
+        this.approveUserCountType = approveUserCountType;
+        this.approveUserSelectRange = approveUserSelectRange;
+        this.modelType = modelType;
+    }
+
+    public TFCustomModelTypeEnum getModelType() {
+        return modelType;
+    }
+
+    public void setModelType(TFCustomModelTypeEnum modelType) {
+        this.modelType = modelType;
+    }
+
+    public CustomFlowApproveUserCountTypeEnum getApproveUserCountType() {
+        return approveUserCountType;
+    }
+
+    public void setApproveUserCountType(CustomFlowApproveUserCountTypeEnum approveUserCountType) {
+        this.approveUserCountType = approveUserCountType;
+    }
+
+    public CustomFlowApproveUserSelectRangeEnum getApproveUserSelectRange() {
+        return approveUserSelectRange;
+    }
+
+    public void setApproveUserSelectRange(CustomFlowApproveUserSelectRangeEnum approveUserSelectRange) {
+        this.approveUserSelectRange = approveUserSelectRange;
+    }
+
+    public List<String> getApproveUserSelectRolesIds() {
+        return approveUserSelectRolesIds;
+    }
+
+    public void setApproveUserSelectRolesIds(List<String> approveUserSelectRolesIds) {
+        this.approveUserSelectRolesIds = approveUserSelectRolesIds;
+    }
+
+    public List<String> getApproveRoleIds() {
+        return approveRoleIds;
+    }
+
+    public void setApproveRoleIds(List<String> approveRoleIds) {
+        this.approveRoleIds = approveRoleIds;
+    }
+
+    public List<String> getCopyForUserIds() {
+        return copyForUserIds;
+    }
+
+    public void setCopyForUserIds(List<String> copyForUserIds) {
+        this.copyForUserIds = copyForUserIds;
+    }
+
+    public String getCopyForUserNames() {
+        return copyForUserNames;
+    }
+
+    public void setCopyForUserNames(String copyForUserNames) {
+        this.copyForUserNames = copyForUserNames;
+    }
+
+    public String getApproveUserNames() {
+        return approveUserNames;
+    }
+
+    public void setApproveUserNames(String approveUserNames) {
+        this.approveUserNames = approveUserNames;
+    }
+
+    public CustomFlowApproveUserTypeEnum getApproveUserType() {
+        return approveUserType;
+    }
+
+    public void setApproveUserType(CustomFlowApproveUserTypeEnum approveUserType) {
+        this.approveUserType = approveUserType;
+    }
+
+    public CustomFlowMultipleUserApproveTypeEnum getMultipleUserApproveType() {
+        return multipleUserApproveType;
+    }
+
+    public void setMultipleUserApproveType(CustomFlowMultipleUserApproveTypeEnum multipleUserApproveType) {
+        this.multipleUserApproveType = multipleUserApproveType;
+    }
+
+    public CustomFlowRejectTypeEnum getRejectType() {
+        return rejectType;
+    }
+
+    public void setRejectType(CustomFlowRejectTypeEnum rejectType) {
+        this.rejectType = rejectType;
+    }
+
+    public CustomFlowRejectResubmitTypeEnum getRejectResubmitType() {
+        return rejectResubmitType;
+    }
+
+    public void setRejectResubmitType(CustomFlowRejectResubmitTypeEnum rejectResubmitType) {
+        this.rejectResubmitType = rejectResubmitType;
+    }
+
+    public String getFlowTaskVar() {
+        return flowTaskVar;
+    }
+
+    public void setFlowTaskVar(String flowTaskVar) {
+        this.flowTaskVar = flowTaskVar;
+    }
+
+    public List<String> getApproveIds() {
+        return approveIds;
+    }
+
+    public void setApproveIds(List<String> approveIds) {
+        this.approveIds = approveIds;
+    }
+}

+ 73 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/BaseFlowData.java

@@ -0,0 +1,73 @@
+package com.qmth.distributed.print.business.bean.flow.dto;
+
+import com.qmth.teachcloud.common.enums.FlowApproveOperationEnum;
+import com.qmth.teachcloud.common.enums.FlowMsgTypeEnum;
+import com.qmth.teachcloud.common.enums.TFCustomTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 基础流程信息
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2023/6/14
+ */
+public class BaseFlowData implements Serializable {
+
+    @ApiModelProperty(value = "流程类型")
+    TFCustomTypeEnum flowType;
+
+    @ApiModelProperty(value = "流程操作")
+    FlowApproveOperationEnum flowOperation;
+
+    @ApiModelProperty(value = "消息类型")
+    FlowMsgTypeEnum messageType;
+
+    @ApiModelProperty(value = "待办链接")
+    String url;
+
+    @ApiModelProperty(value = "移动待办链接")
+    String mobileUrl;
+
+    public FlowMsgTypeEnum getMessageType() {
+        return messageType;
+    }
+
+    public void setMessageType(FlowMsgTypeEnum messageType) {
+        this.messageType = messageType;
+    }
+
+    public TFCustomTypeEnum getFlowType() {
+        return flowType;
+    }
+
+    public void setFlowType(TFCustomTypeEnum flowType) {
+        this.flowType = flowType;
+    }
+
+    public FlowApproveOperationEnum getFlowOperation() {
+        return flowOperation;
+    }
+
+    public void setFlowOperation(FlowApproveOperationEnum flowOperation) {
+        this.flowOperation = flowOperation;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getMobileUrl() {
+        return mobileUrl;
+    }
+
+    public void setMobileUrl(String mobileUrl) {
+        this.mobileUrl = mobileUrl;
+    }
+}

+ 76 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/DoneTaskDto.java

@@ -0,0 +1,76 @@
+package com.qmth.distributed.print.business.bean.flow.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.qmth.distributed.print.business.bean.result.TFFlowLogResult;
+import com.qmth.teachcloud.common.enums.FlowApproveOperationEnum;
+import com.qmth.teachcloud.common.enums.FlowMsgTypeEnum;
+import com.qmth.teachcloud.common.enums.TFCustomTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 流程已办消息dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2023/6/14
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class DoneTaskDto extends TFFlowLogResult implements Serializable {
+
+    @ApiModelProperty(value = "流程类型")
+    TFCustomTypeEnum flowType;
+
+    @ApiModelProperty(value = "流程操作")
+    FlowApproveOperationEnum flowOperation;
+
+    @ApiModelProperty(value = "消息类型")
+    FlowMsgTypeEnum messageType;
+
+    @ApiModelProperty(value = "待办链接")
+    String url;
+
+    @ApiModelProperty(value = "移动待办链接")
+    String mobileUrl;
+
+    public TFCustomTypeEnum getFlowType() {
+        return flowType;
+    }
+
+    public void setFlowType(TFCustomTypeEnum flowType) {
+        this.flowType = flowType;
+    }
+
+    public FlowApproveOperationEnum getFlowOperation() {
+        return flowOperation;
+    }
+
+    public void setFlowOperation(FlowApproveOperationEnum flowOperation) {
+        this.flowOperation = flowOperation;
+    }
+
+    public FlowMsgTypeEnum getMessageType() {
+        return messageType;
+    }
+
+    public void setMessageType(FlowMsgTypeEnum messageType) {
+        this.messageType = messageType;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getMobileUrl() {
+        return mobileUrl;
+    }
+
+    public void setMobileUrl(String mobileUrl) {
+        this.mobileUrl = mobileUrl;
+    }
+}

Some files were not shown because too many files changed in this diff