Explorar el Código

生成pdf模块化

wangliang hace 3 años
padre
commit
5b161c10bb
Se han modificado 14 ficheros con 621 adiciones y 41 borrados
  1. 9 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  2. 9 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java
  3. 9 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskPrintServiceImpl.java
  4. 15 14
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  5. 21 11
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceServiceImpl.java
  6. 2 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  7. 3 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TBTaskServiceImpl.java
  8. 12 1
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/TeachcloudTaskApplication.java
  9. 22 0
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/config/RedisMessageListener.java
  10. 31 9
      teachcloud-task/src/main/resources/application-task.properties
  11. 123 0
      teachcloud-task/src/main/resources/application-task_36dev.properties
  12. 123 0
      teachcloud-task/src/main/resources/application-task_release.properties
  13. 123 0
      teachcloud-task/src/main/resources/application-task_test.properties
  14. 119 0
      teachcloud-task/src/main/resources/processes/GdykdxPaperApprove.bpmn

+ 9 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java

@@ -19,15 +19,18 @@ import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.mapper.ExamDetailMapper;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTempleteService;
+import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
 import com.qmth.teachcloud.common.entity.BasicCampus;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.entity.TBTask;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.MqTagEnum;
 import com.qmth.teachcloud.common.enums.TaskTypeEnum;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.util.ConvertUtil;
+import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.HorizontalAlignment;
@@ -93,6 +96,9 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
     @Autowired
     BasicCampusService basicCampusService;
 
+    @Resource
+    RedisUtil redisUtil;
+
     private final static Logger log = LoggerFactory.getLogger(ExamDetailServiceImpl.class);
 
     @Transactional(rollbackFor = Exception.class)
@@ -410,7 +416,9 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
 
         // 调用生成pdf方法
         Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.CREATE_PDF, detail.getPrintPlanId(), (SysUser) ServletUtil.getRequestUser(), detail.getId());
-        asyncCreatePdfTempleteService.createPdf(map, null);
+//        asyncCreatePdfTempleteService.createPdf(map, null);
+        MqDto mqDto = new MqDto(MqTagEnum.PDF.getCode(), map, String.valueOf(map.get(SystemConstant.TB_TASK_ID)));
+        redisUtil.sendMessage(mqDto.getTopic(), mqDto);
         return true;
     }
 

+ 9 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java

@@ -14,12 +14,15 @@ import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.mapper.ExamTaskDetailMapper;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTempleteService;
+import com.qmth.teachcloud.common.bean.dto.MqDto;
 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.MqTagEnum;
 import com.qmth.teachcloud.common.enums.TaskTypeEnum;
 import com.qmth.teachcloud.common.service.TBTaskService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
+import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -78,6 +81,9 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
     @Resource
     TeachcloudCommonService teachcloudCommonService;
 
+    @Resource
+    RedisUtil redisUtil;
+
     @Transactional
     @Override
     public boolean enable(ExamTaskDetail examTaskDetail) {
@@ -219,7 +225,9 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
                 Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.CREATE_PDF, paperParam.getPrintPlanId(), sysUser, listEntry.getKey());
                 map.computeIfAbsent("examDetailCourseIds", v -> listEntry.getValue());
                 map.computeIfAbsent("paperType", v -> paperParam.getRelatePaperType());
-                asyncCreatePdfTempleteService.createPdf(map, null);
+//                asyncCreatePdfTempleteService.createPdf(map, null);
+                MqDto mqDto = new MqDto(MqTagEnum.PDF.getCode(), map, String.valueOf(map.get(SystemConstant.TB_TASK_ID)));
+                redisUtil.sendMessage(mqDto.getTopic(), mqDto);
             }
         }
         return true;

+ 9 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskPrintServiceImpl.java

@@ -17,16 +17,19 @@ import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.mapper.ExamTaskPrintMapper;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTempleteService;
+import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicUserCourse;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.entity.TBTask;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.MqTagEnum;
 import com.qmth.teachcloud.common.enums.OrgTypeEnum;
 import com.qmth.teachcloud.common.enums.TaskTypeEnum;
 import com.qmth.teachcloud.common.service.BasicUserCourseService;
 import com.qmth.teachcloud.common.service.TBTaskService;
 import com.qmth.teachcloud.common.util.ConvertUtil;
+import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -76,6 +79,9 @@ public class ExamTaskPrintServiceImpl extends ServiceImpl<ExamTaskPrintMapper, E
     @Resource
     ConvertUtil convertUtil;
 
+    @Resource
+    RedisUtil redisUtil;
+
     @Override
     public IPage<BasicStudent> listStudentByClass(String classId, Integer pageNumber, Integer pageSize) {
         Page<BasicStudent> page = new Page<>(pageNumber, pageSize);
@@ -344,7 +350,9 @@ public class ExamTaskPrintServiceImpl extends ServiceImpl<ExamTaskPrintMapper, E
         // 调用生成pdf方法
         for (Long examDetailId : list) {
             Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.CREATE_PDF, examTaskPrintParams.getPrintPlanId(), (SysUser) ServletUtil.getRequestUser(), examDetailId);
-            asyncCreatePdfTempleteService.createPdf(map, null);
+//            asyncCreatePdfTempleteService.createPdf(map, null);
+            MqDto mqDto = new MqDto(MqTagEnum.PDF.getCode(), map, String.valueOf(map.get(SystemConstant.TB_TASK_ID)));
+            redisUtil.sendMessage(mqDto.getTopic(), mqDto);
         }
     }
 

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

@@ -19,14 +19,13 @@ import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTemple
 import com.qmth.distributed.print.business.templete.execute.AsyncPaperReviewPdfExportService;
 import com.qmth.teachcloud.common.bean.dto.BlurryUserDto;
 import com.qmth.teachcloud.common.bean.dto.CourseInfoDto;
+import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.*;
-import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.enums.FlowStatusEnum;
-import com.qmth.teachcloud.common.enums.RoleTypeEnum;
-import com.qmth.teachcloud.common.enums.TaskTypeEnum;
+import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.util.ExcelUtil;
+import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.common.util.excel.ExcelError;
@@ -135,15 +134,15 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     @Resource
     TFFlowApproveService tfFlowApproveService;
 
-    @Resource
-    TFFlowService tfFlowService;
-
     @Resource
     TaskService taskService;
 
     @Resource
     BasicCardRuleService basicCardRuleService;
 
+    @Resource
+    RedisUtil redisUtil;
+
     @Override
     public List<ExamTask> listByCourseCode(Long schoolId, String code) {
         QueryWrapper<ExamTask> queryWrapper = new QueryWrapper<>();
@@ -170,8 +169,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             // 查询命题任务中的试卷编号
             QueryWrapper<ExamTask> queryWrapperExamTask = new QueryWrapper<>();
             queryWrapperExamTask.lambda().eq(ExamTask::getSchoolId, schoolId);
-            if (orgIds.size() > 0){
-                queryWrapperExamTask.lambda().in(ExamTask::getOrgId,orgIds);
+            if (orgIds.size() > 0) {
+                queryWrapperExamTask.lambda().in(ExamTask::getOrgId, orgIds);
             }
             List<String> list = new ArrayList<>();
             if (StringUtils.isNotBlank(param)) {
@@ -185,8 +184,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             // 查询考务-科目中的试卷编号
             QueryWrapper<ExamDetailCourse> queryWrapperExamDetailCourse = new QueryWrapper<>();
             queryWrapperExamDetailCourse.lambda().eq(ExamDetailCourse::getSchoolId, schoolId);
-            if (orgIds.size() > 0){
-                queryWrapperExamDetailCourse.lambda().in(ExamDetailCourse::getOrgId,orgIds);
+            if (orgIds.size() > 0) {
+                queryWrapperExamDetailCourse.lambda().in(ExamDetailCourse::getOrgId, orgIds);
             }
             List<String> list2 = new ArrayList<>();
             if (StringUtils.isNotBlank(param)) {
@@ -200,7 +199,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             list.addAll(list2);
             return list.stream().distinct().collect(Collectors.toList());
         } else {
-            return examDetailCourseService.listPaperNumberByPrintPlanId(param, printPlanIdList,orgIds);
+            return examDetailCourseService.listPaperNumberByPrintPlanId(param, printPlanIdList, orgIds);
         }
     }
 
@@ -448,7 +447,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                                 if (StringUtils.isBlank(userMap.get(excelTeacherAccount))) {
                                     excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[命题老师账号]不存在"));
                                 } else {
-                                    if(!excelTeacherName.equals(userMap.get(excelTeacherAccount))){
+                                    if (!excelTeacherName.equals(userMap.get(excelTeacherAccount))) {
                                         excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[命题老师姓名]与系统不匹配"));
                                     }
                                 }
@@ -1169,7 +1168,9 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         }
         if (judge) {
             Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.CREATE_PDF, examDetail.getPrintPlanId(), user, examDetail.getId());
-            asyncCreatePdfTempleteService.createPdf(map, null);
+            //            asyncCreatePdfTempleteService.createPdf(map, null);
+            MqDto mqDto = new MqDto(MqTagEnum.PDF.getCode(), map, String.valueOf(map.get(SystemConstant.TB_TASK_ID)));
+            redisUtil.sendMessage(mqDto.getTopic(), mqDto);
         }
     }
 

+ 21 - 11
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceServiceImpl.java

@@ -19,6 +19,7 @@ import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTempleteService;
 import com.qmth.distributed.print.business.util.HtmlToPdfUtil;
 import com.qmth.distributed.print.business.util.PdfUtil;
+import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.bean.params.ArraysParams;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
@@ -118,6 +119,8 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
     @Resource
     TeachcloudCommonService teachcloudCommonService;
 
+    @Resource
+    RedisUtil redisUtil;
 
     /**
      * 保存附件
@@ -148,9 +151,9 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
             } else if (Objects.nonNull(type) && Objects.equals(type, SystemConstant.HTML_PREFIX)) {
                 filePath = (String) jsonObject.get(SystemConstant.PATH);
                 url = SystemConstant.TEMP_FILES_DIR + File.separator + filePath;
-                UploadFileEnum uploadType = Enum.valueOf(UploadFileEnum.class,(String) jsonObject.get(SystemConstant.UPLOAD_TYPE));
+                UploadFileEnum uploadType = Enum.valueOf(UploadFileEnum.class, (String) jsonObject.get(SystemConstant.UPLOAD_TYPE));
 //                htmlFile = ossUtil.ossDownload(filePath, url);
-                htmlFile = fileStoreUtil.ossDownload(filePath, url,uploadType.getFssType());
+                htmlFile = fileStoreUtil.ossDownload(filePath, url, uploadType.getFssType());
             }
             LocalDateTime nowTime = LocalDateTime.now();
             StringJoiner pdfStringJoiner = new StringJoiner("");
@@ -180,7 +183,7 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
             if (oss) {//上传至oss
                 pdfDto = PdfUtil.addPdfPage(pdfFile);
 //                ossUtil.ossUpload(pdfDirNameStr, pdfFile, BinaryUtil.toBase64String(HexUtils.decodeHex(pdfFileMd5)));
-                fileStoreUtil.ossUpload(pdfDirNameStr, pdfFile, BinaryUtil.toBase64String(HexUtils.decodeHex(pdfFileMd5)),fileStoreUtil.getUploadEnumByPath(pdfDirNameStr).getFssType());
+                fileStoreUtil.ossUpload(pdfDirNameStr, pdfFile, BinaryUtil.toBase64String(HexUtils.decodeHex(pdfFileMd5)), fileStoreUtil.getUploadEnumByPath(pdfDirNameStr).getFssType());
 //                htmlFile.delete();
             }
             JSONObject attachmentPath = JSONObject.parseObject(examDetail.getAttachmentPath());
@@ -251,12 +254,12 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
             if (oss) {//上传至oss
                 String dirName = stringJoiner.toString().replaceAll("\\\\", "/");
 //                ossUtil.ossUpload(dirName, htmlContent);
-                fileStoreUtil.ossUpload(dirName,htmlContent,fileStoreUtil.getUploadEnumByPath(dirName).getFssType());
+                fileStoreUtil.ossUpload(dirName, htmlContent, fileStoreUtil.getUploadEnumByPath(dirName).getFssType());
                 jsonObject.put(SystemConstant.TYPE, SystemConstant.OSS);
                 jsonObject.put(SystemConstant.PATH, dirName);
                 String url = SystemConstant.TEMP_FILES_DIR + File.separator + dirName;
 //                File localHtmlFile = ossUtil.ossDownload(dirName, url);
-                File localHtmlFile = fileStoreUtil.ossDownload(dirName, url,fileStoreUtil.getUploadEnumByPath(dirName).getFssType());
+                File localHtmlFile = fileStoreUtil.ossDownload(dirName, url, fileStoreUtil.getUploadEnumByPath(dirName).getFssType());
                 StringJoiner pdfStringJoiner = new StringJoiner("");
                 pdfStringJoiner.add(UploadFileEnum.PDF.getTitle()).add(File.separator);
                 pdfStringJoiner.add(String.valueOf(nowTime.getYear())).add(File.separator)
@@ -279,8 +282,8 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
                 localFileList.add(new PdfDto(pdfFile.getPath(), PageSizeEnum.A3, pdfDto.getPageCount()));
                 fileMd5 = DigestUtils.md5Hex(new FileInputStream(pdfFile));
 //                ossUtil.ossUpload(pdfDirName, pdfFile, BinaryUtil.toBase64String(HexUtils.decodeHex(fileMd5)));
-                pdfDirName = pdfDirName.replaceAll("\\\\","/");
-                fileStoreUtil.ossUpload(pdfDirName, pdfFile, BinaryUtil.toBase64String(HexUtils.decodeHex(fileMd5)),fileStoreUtil.getUploadEnumByPath(pdfDirName).getFssType());
+                pdfDirName = pdfDirName.replaceAll("\\\\", "/");
+                fileStoreUtil.ossUpload(pdfDirName, pdfFile, BinaryUtil.toBase64String(HexUtils.decodeHex(fileMd5)), fileStoreUtil.getUploadEnumByPath(pdfDirName).getFssType());
 //                localHtmlFile.delete();
                 jsonObject.put(SystemConstant.PDF_PATH, pdfDirName);
                 // htmlMd5
@@ -391,7 +394,7 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
             stringJoiner.add(File.separator).add(SystemConstant.getUuid()).add(format);
             if (oss) {//上传至oss\
                 String dirName = stringJoiner.toString().replaceAll("\\\\", "/");
-                fileStoreUtil.ossUpload(dirName,file.getInputStream(),md5,type.getFssType());
+                fileStoreUtil.ossUpload(dirName, file.getInputStream(), md5, type.getFssType());
 
                 jsonObject.put(SystemConstant.TYPE, SystemConstant.OSS);
                 jsonObject.put(SystemConstant.PATH, dirName);
@@ -474,6 +477,7 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
         }
         return basicCourseService.removeById(id);
     }
+
     /**
      * 保存科目
      *
@@ -644,7 +648,9 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
                 }
                 map.computeIfAbsent(SystemConstant.TASK, v -> tbTask);
                 map.computeIfAbsent(SystemConstant.USER, v -> sysUserService.getById(tbTask.getCreateId()));
-                asyncCreatePdfTempleteService.createPdf(map, null);
+//                asyncCreatePdfTempleteService.createPdf(map, null);
+                MqDto mqDto = new MqDto(MqTagEnum.PDF.getCode(), map, String.valueOf(tbTask.getId()));
+                redisUtil.sendMessage(mqDto.getTopic(), mqDto);
             }
         }
     }
@@ -674,7 +680,9 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
                     }
                     map.computeIfAbsent(SystemConstant.TASK, v -> tbTask);
                     map.computeIfAbsent(SystemConstant.USER, v -> sysUserService.getById(tbTask.getCreateId()));
-                    asyncCreatePdfTempleteService.createPdf(map, null);
+//                    asyncCreatePdfTempleteService.createPdf(map, null);
+                    MqDto mqDto = new MqDto(MqTagEnum.PDF.getCode(), map, String.valueOf(tbTask.getId()));
+                    redisUtil.sendMessage(mqDto.getTopic(), mqDto);
                 }
             }
         }
@@ -882,7 +890,9 @@ public class PrintCommonServiceServiceImpl implements PrintCommonService {
                         }
 
                         Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.CREATE_PDF, examDetail.getPrintPlanId(), user, examDetail.getId());
-                        asyncCreatePdfTempleteService.createPdf(map, null);
+//                        asyncCreatePdfTempleteService.createPdf(map, null);
+                        MqDto mqDto = new MqDto(MqTagEnum.PDF.getCode(), map, String.valueOf(map.get(SystemConstant.TB_TASK_ID)));
+                        redisUtil.sendMessage(mqDto.getTopic(), mqDto);
                     }
                 }
             }

+ 2 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -34,6 +34,7 @@ public class SystemConstant {
     public static final String DOWNLOAD_TEMP = "download-temp";
     public static final String SESSION = "session:";
     public static final String TASK = "task";
+    public static final String TB_TASK_ID = "tbTaskId";
     public static final String USER = "account";
     public static final String SCHOOL_ID = "schoolId";
     public static final String SCHOOL = "school";
@@ -131,7 +132,7 @@ public class SystemConstant {
      * redis mq
      */
     public static final String REDIS_LOCK_MQ_PREFIX = "redis:lock:mq:";
-    public static final int REDIS_MQ_MAX_RECONSUME = 3;
+    public static final int REDIS_MQ_MAX_RECONSUME = 5;
     public static final String MQ_TOPIC_BUFFER_LIST = "mq:topic:buffer:list";
 
     /**

+ 3 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TBTaskServiceImpl.java

@@ -154,7 +154,7 @@ public class TBTaskServiceImpl extends ServiceImpl<TBTaskMapper, TBTask> impleme
         Map<String, Object> map = new HashMap<>();
         try {
             TBTask tbTask = saveTaskCommon(null, taskTypeEnum, map, sysUser);
-            if(Objects.nonNull(arraysParams)) {
+            if (Objects.nonNull(arraysParams)) {
                 tbTask.setRemark(JacksonUtil.parseJson(arraysParams.getIds()));
             }
             this.save(tbTask);
@@ -200,7 +200,7 @@ public class TBTaskServiceImpl extends ServiceImpl<TBTaskMapper, TBTask> impleme
     @Override
     public IPage<TaskListResult> query(IPage<Map> iPage, Long schoolId, Long printPlanId, TaskStatusEnum status, TaskTypeEnum type, TaskResultEnum result) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        return tbTaskMapper.query(iPage, schoolId, printPlanId, Objects.nonNull(status) ? status.name() : null, Objects.nonNull(type) ? type.name() : null, Objects.nonNull(result) ? result.name() : null,sysUser.getId());
+        return tbTaskMapper.query(iPage, schoolId, printPlanId, Objects.nonNull(status) ? status.name() : null, Objects.nonNull(type) ? type.name() : null, Objects.nonNull(result) ? result.name() : null, sysUser.getId());
     }
 
     /**
@@ -252,6 +252,7 @@ public class TBTaskServiceImpl extends ServiceImpl<TBTaskMapper, TBTask> impleme
         }
         map.computeIfAbsent(SystemConstant.TASK, v -> tbTask);
         map.computeIfAbsent(SystemConstant.USER, v -> requestUser);
+        map.computeIfAbsent(SystemConstant.TB_TASK_ID, v -> tbTask.getId());
         return tbTask;
     }
 }

+ 12 - 1
teachcloud-task/src/main/java/com/qmth/teachcloud/task/TeachcloudTaskApplication.java

@@ -1,14 +1,19 @@
 package com.qmth.teachcloud.task;
 
+import com.qmth.teachcloud.common.threadPool.MyThreadPool;
+import org.activiti.spring.boot.SecurityAutoConfiguration;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.domain.EntityScan;
 import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.task.TaskExecutor;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
-@SpringBootApplication(scanBasePackages = "com.qmth.*")
+@SpringBootApplication(scanBasePackages = "com.qmth.*", exclude = {SecurityAutoConfiguration.class})
 @MapperScan({"com.qmth.distributed.print.business.mapper","com.qmth.teachcloud.report.business.mapper","com.qmth.teachcloud.common.mapper"})
 //主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中,做过web开发的同学一定都有用过@Controller,@Service,@Repository注解,查看其源码你会发现,他们中有一个共同的注解@Component,没错@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中
 @EntityScan(basePackages = {"com.qmth.distributed.print.business.entity","com.qmth.teachcloud.report.business.entity","com.qmth.teachcloud.common.entity"}) // 用来扫描和发现指定包及其子包中的Entity定义
@@ -20,4 +25,10 @@ public class TeachcloudTaskApplication {
     public static void main(String[] args) {
         SpringApplication.run(TeachcloudTaskApplication.class, args);
     }
+
+    @Primary
+    @Bean
+    public TaskExecutor primaryTaskExecutor() {
+        return new MyThreadPool();
+    }
 }

+ 22 - 0
teachcloud-task/src/main/java/com/qmth/teachcloud/task/config/RedisMessageListener.java

@@ -1,8 +1,13 @@
 package com.qmth.teachcloud.task.config;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.google.gson.Gson;
+import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTempleteService;
 import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.entity.TBTask;
 import com.qmth.teachcloud.common.entity.TMMqMessage;
 import com.qmth.teachcloud.common.service.TMMqMessageService;
 import com.qmth.teachcloud.common.util.JacksonUtil;
@@ -16,6 +21,8 @@ import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
 import java.time.Duration;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -36,6 +43,9 @@ public class RedisMessageListener implements MessageListener {
     @Resource
     TMMqMessageService tmMqMessageService;
 
+    @Resource
+    AsyncCreatePdfTempleteService asyncCreatePdfTempleteService;
+
     @Override
     public void onMessage(Message message, byte[] bytes) {
         MqDto mqDto = null;
@@ -55,6 +65,18 @@ public class RedisMessageListener implements MessageListener {
                         String topic = new String(message.getChannel(), SystemConstant.CHARSET_NAME);
                         mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
                         log.info("mqDto:{},topic:{}", JacksonUtil.parseJson(mqDto), JacksonUtil.parseJson(topic));
+                        Map<String, Object> map = (Map<String, Object>) mqDto.getBody();
+                        Map<String, Object> finalMap = new HashMap<>();
+                        map.forEach((k, v) -> {
+                            if (Objects.equals(k, SystemConstant.TASK)) {
+                                v = JSONObject.parseObject(JSON.toJSONString(v), TBTask.class);
+                            } else if (Objects.equals(k, SystemConstant.USER)) {
+                                v = JSONObject.parseObject(JSON.toJSONString(v), SysUser.class);
+                            }
+                            Object finalV = v;
+                            finalMap.computeIfAbsent(k, v1 -> finalV);
+                        });
+                        asyncCreatePdfTempleteService.createPdf(finalMap, null);
                         redisUtil.delete(SystemConstant.MQ_TOPIC_BUFFER_LIST, mqDto.getId());
                         break;
                     } else {

+ 31 - 9
teachcloud-task/src/main/resources/application-task.properties

@@ -13,23 +13,40 @@ spring.application.name=teachcloud-task
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.port=3306
-db.name=distributed-v2.2.0
+db.name=distributed-v2.2.0-test
 db.username=root
 db.password=123456789
 
 #redis\u6570\u636E\u6E90\u914D\u7F6E
 com.qmth.redis.host=${db.host}
 com.qmth.redis.port=6379
-com.qmth.redis.db=0
+com.qmth.redis.db=15
 #com.qmth.redis.password
 
 #mysql\u914D\u7F6E
-com.qmth.mysql.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
-com.qmth.mysql.username=${db.username}
-com.qmth.mysql.password=${db.password}
-com.qmth.mysql.min-idle=40
-com.qmth.mysql.max-pool-size=200
-com.qmth.mysql.log-level=debug
+com.qmth.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
+com.qmth.datasource.username=${db.username}
+com.qmth.datasource.password=${db.password}
+com.qmth.mybatis.log-level=debug
+
+#activiti\u914D\u7F6E
+#activiti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u8868\u8FDB\u884C\u66F4\u65B0\u64CD\u4F5C\u3002\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219\u81EA\u52A8\u521B\u5EFA
+#false\uFF1Afalse\u4E3A\u9ED8\u8BA4\u503C\uFF0C\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u5728\u542F\u52A8\u65F6\uFF0C\u4F1A\u5BF9\u6BD4\u6570\u636E\u5E93\u8868\u4E2D\u4FDD\u5B58\u7684\u7248\u672C\uFF0C\u5982\u679C\u6CA1\u6709\u8868\u6216\u8005\u7248\u672C\u4E0D\u5339\u914D\u65F6\uFF0C\u5C06\u5728\u542F\u52A8\u65F6\u629B\u51FA\u5F02\u5E38\u3002
+#true\uFF1A\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u7684\u8868\u8FDB\u884C\u66F4\u65B0\uFF0C\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219Activiti\u4F1A\u81EA\u52A8\u521B\u5EFA\u3002
+#create-drop\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\uFF0C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u3002
+#drop-create\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\u3002
+spring.activiti.database-schema-update=true
+#\u68C0\u6D4B\u5386\u53F2\u8868\u662F\u5426\u5B58\u5728
+spring.activiti.db-history-used=true
+#\u81EA\u52A8\u90E8\u7F72\u9A8C\u8BC1\u8BBE\u7F6E:true-\u5F00\u542F\uFF08\u9ED8\u8BA4\uFF09\u3001false-\u5173\u95ED
+spring.activiti.check-process-definitions=false
+#spring.activiti.process-definition-location-prefix=classpath:/processes/
+#\u5BF9\u4E8E\u5386\u53F2\u6570\u636E\uFF0C\u4FDD\u5B58\u5230\u4F55\u79CD\u7C92\u5EA6\uFF0CActiviti\u63D0\u4F9B\u4E86history-level\u5C5E\u6027\u5BF9\u5176\u8FDB\u884C\u914D\u7F6E\u3002history-level\u5C5E\u6027\u6709\u70B9\u50CFlog4j\u7684\u65E5\u5FD7\u8F93\u51FA\u7EA7\u522B\uFF0C\u8BE5\u5C5E\u6027\u6709\u4EE5\u4E0B\u56DB\u4E2A\u503C\uFF1A
+#none\uFF1A\u4E0D\u4FDD\u5B58\u4EFB\u4F55\u7684\u5386\u53F2\u6570\u636E\uFF0C\u56E0\u6B64\uFF0C\u5728\u6D41\u7A0B\u6267\u884C\u8FC7\u7A0B\u4E2D\uFF0C\u8FD9\u662F\u6700\u9AD8\u6548\u7684\u3002
+#activity\uFF1A\u7EA7\u522B\u9AD8\u4E8Enone\uFF0C\u4FDD\u5B58\u6D41\u7A0B\u5B9E\u4F8B\u4E0E\u6D41\u7A0B\u884C\u4E3A\uFF0C\u5176\u4ED6\u6570\u636E\u4E0D\u4FDD\u5B58\u3002
+#audit\uFF1A\u9664activity\u7EA7\u522B\u4F1A\u4FDD\u5B58\u7684\u6570\u636E\u5916\uFF0C\u8FD8\u4F1A\u4FDD\u5B58\u5168\u90E8\u7684\u6D41\u7A0B\u4EFB\u52A1\u53CA\u5176\u5C5E\u6027\u3002audit\u4E3Ahistory\u7684\u9ED8\u8BA4\u503C\u3002
+#full\uFF1A\u4FDD\u5B58\u5386\u53F2\u6570\u636E\u7684\u6700\u9AD8\u7EA7\u522B\uFF0C\u9664\u4E86\u4F1A\u4FDD\u5B58audit\u7EA7\u522B\u7684\u6570\u636E\u5916\uFF0C\u8FD8\u4F1A\u4FDD\u5B58\u5176\u4ED6\u5168\u90E8\u6D41\u7A0B\u76F8\u5173\u7684\u7EC6\u8282\u6570\u636E\uFF0C\u5305\u62EC\u4E00\u4E9B\u6D41\u7A0B\u53C2\u6570\u7B49\u3002
+spring.activiti.history-level=audit
 
 #\u963F\u91CC\u4E91OSS\u914D\u7F6E
 aliyun.oss.name=oss-cn-shenzhen.aliyuncs.com
@@ -39,9 +56,14 @@ aliyun.oss.accessKeySecret=97aBLBfkQR5mzCiQa82yWLAH57eUd8
 aliyun.oss.bucket=teachcloud-test
 aliyun.oss.url=http://${aliyun.oss.bucket}.${aliyun.oss.name}
 
+com.qmth.fss.public.config=oss://key:secret@teachcloud-print-dev-public.oss-api.qmth.com.cn
+com.qmth.fss.public.server=http://oss-file.qmth.com.cn/teachcloud-print-dev-public
+com.qmth.fss.private.config=oss://key:secret@teachcloud-print-dev-private.oss-api.qmth.com.cn
+com.qmth.fss.private.server=http://oss-file.qmth.com.cn/teachcloud-print-dev-private
+
 #\u7CFB\u7EDF\u914D\u7F6E
 sys.config.oss=true
-sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl
+sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl,.bpmn,.xml
 sys.config.attachmentLength=100
 sys.config.attachmentSize=200
 sys.config.serverUpload=

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

@@ -0,0 +1,123 @@
+#\u7AEF\u53E3\u914D\u7F6E
+server.port=7011
+#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
+server.tomcat.threads.max=2500
+#tomcat\u6700\u5927\u8FDE\u63A5\u6570
+server.tomcat.max-connections=2500
+#tomcat\u7684URI\u7F16\u7801
+server.tomcat.uri-encoding=UTF-8
+
+#\u9879\u76EE\u540D\u79F0
+spring.application.name=teachcloud-task
+
+#\u6570\u636E\u6E90\u914D\u7F6E
+db.host=localhost
+db.port=3306
+db.name=distributed-v2.2.0-test
+db.username=root
+db.password=123456789
+
+#redis\u6570\u636E\u6E90\u914D\u7F6E
+com.qmth.redis.host=${db.host}
+com.qmth.redis.port=6379
+com.qmth.redis.db=15
+#com.qmth.redis.password
+
+#mysql\u914D\u7F6E
+com.qmth.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
+com.qmth.datasource.username=${db.username}
+com.qmth.datasource.password=${db.password}
+com.qmth.mybatis.log-level=debug
+
+#activiti\u914D\u7F6E
+#activiti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u8868\u8FDB\u884C\u66F4\u65B0\u64CD\u4F5C\u3002\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219\u81EA\u52A8\u521B\u5EFA
+#false\uFF1Afalse\u4E3A\u9ED8\u8BA4\u503C\uFF0C\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u5728\u542F\u52A8\u65F6\uFF0C\u4F1A\u5BF9\u6BD4\u6570\u636E\u5E93\u8868\u4E2D\u4FDD\u5B58\u7684\u7248\u672C\uFF0C\u5982\u679C\u6CA1\u6709\u8868\u6216\u8005\u7248\u672C\u4E0D\u5339\u914D\u65F6\uFF0C\u5C06\u5728\u542F\u52A8\u65F6\u629B\u51FA\u5F02\u5E38\u3002
+#true\uFF1A\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u7684\u8868\u8FDB\u884C\u66F4\u65B0\uFF0C\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219Activiti\u4F1A\u81EA\u52A8\u521B\u5EFA\u3002
+#create-drop\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\uFF0C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u3002
+#drop-create\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\u3002
+spring.activiti.database-schema-update=true
+#\u68C0\u6D4B\u5386\u53F2\u8868\u662F\u5426\u5B58\u5728
+spring.activiti.db-history-used=true
+#\u81EA\u52A8\u90E8\u7F72\u9A8C\u8BC1\u8BBE\u7F6E:true-\u5F00\u542F\uFF08\u9ED8\u8BA4\uFF09\u3001false-\u5173\u95ED
+spring.activiti.check-process-definitions=false
+#spring.activiti.process-definition-location-prefix=classpath:/processes/
+#\u5BF9\u4E8E\u5386\u53F2\u6570\u636E\uFF0C\u4FDD\u5B58\u5230\u4F55\u79CD\u7C92\u5EA6\uFF0CActiviti\u63D0\u4F9B\u4E86history-level\u5C5E\u6027\u5BF9\u5176\u8FDB\u884C\u914D\u7F6E\u3002history-level\u5C5E\u6027\u6709\u70B9\u50CFlog4j\u7684\u65E5\u5FD7\u8F93\u51FA\u7EA7\u522B\uFF0C\u8BE5\u5C5E\u6027\u6709\u4EE5\u4E0B\u56DB\u4E2A\u503C\uFF1A
+#none\uFF1A\u4E0D\u4FDD\u5B58\u4EFB\u4F55\u7684\u5386\u53F2\u6570\u636E\uFF0C\u56E0\u6B64\uFF0C\u5728\u6D41\u7A0B\u6267\u884C\u8FC7\u7A0B\u4E2D\uFF0C\u8FD9\u662F\u6700\u9AD8\u6548\u7684\u3002
+#activity\uFF1A\u7EA7\u522B\u9AD8\u4E8Enone\uFF0C\u4FDD\u5B58\u6D41\u7A0B\u5B9E\u4F8B\u4E0E\u6D41\u7A0B\u884C\u4E3A\uFF0C\u5176\u4ED6\u6570\u636E\u4E0D\u4FDD\u5B58\u3002
+#audit\uFF1A\u9664activity\u7EA7\u522B\u4F1A\u4FDD\u5B58\u7684\u6570\u636E\u5916\uFF0C\u8FD8\u4F1A\u4FDD\u5B58\u5168\u90E8\u7684\u6D41\u7A0B\u4EFB\u52A1\u53CA\u5176\u5C5E\u6027\u3002audit\u4E3Ahistory\u7684\u9ED8\u8BA4\u503C\u3002
+#full\uFF1A\u4FDD\u5B58\u5386\u53F2\u6570\u636E\u7684\u6700\u9AD8\u7EA7\u522B\uFF0C\u9664\u4E86\u4F1A\u4FDD\u5B58audit\u7EA7\u522B\u7684\u6570\u636E\u5916\uFF0C\u8FD8\u4F1A\u4FDD\u5B58\u5176\u4ED6\u5168\u90E8\u6D41\u7A0B\u76F8\u5173\u7684\u7EC6\u8282\u6570\u636E\uFF0C\u5305\u62EC\u4E00\u4E9B\u6D41\u7A0B\u53C2\u6570\u7B49\u3002
+spring.activiti.history-level=audit
+
+#\u963F\u91CC\u4E91OSS\u914D\u7F6E
+aliyun.oss.name=oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.endpoint=http://${aliyun.oss.name}
+aliyun.oss.accessKeyId=LTAI4Fi8jVRYT49QBXU9x5QX
+aliyun.oss.accessKeySecret=97aBLBfkQR5mzCiQa82yWLAH57eUd8
+aliyun.oss.bucket=teachcloud-test
+aliyun.oss.url=http://${aliyun.oss.bucket}.${aliyun.oss.name}
+
+com.qmth.fss.public.config=oss://key:secret@teachcloud-print-dev-public.oss-api.qmth.com.cn
+com.qmth.fss.public.server=http://oss-file.qmth.com.cn/teachcloud-print-dev-public
+com.qmth.fss.private.config=oss://key:secret@teachcloud-print-dev-private.oss-api.qmth.com.cn
+com.qmth.fss.private.server=http://oss-file.qmth.com.cn/teachcloud-print-dev-private
+
+#\u7CFB\u7EDF\u914D\u7F6E
+sys.config.oss=true
+sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl,.bpmn,.xml
+sys.config.attachmentLength=100
+sys.config.attachmentSize=200
+sys.config.serverUpload=
+sys.config.fileHost=localhost:7011
+sys.config.serverHost=localhost:7011
+#sys.config.accessKey=0bce69d94a7b4aef8bc0badf150351a9
+#sys.config.accessSecret=LdUwb5X4etmjW7fDn0KAdoXG0Yt7AkDu
+sys.config.accessKey=274f823e5f59410f8b3bb6edcd8e2b6e
+sys.config.accessSecret=y7AO6W0TOdTF8HpWBwGHbp3wfIHsmUKr
+sys.config.adminLogoUrl=http://qmth-test.oss-cn-shenzhen.aliyuncs.com/frontend/wx_logo.png
+#sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+sys.config.autoCreatePdfResetMaxCount=5
+sys.config.threadPoolCoreSize=1
+sys.config.customThreadPoolCoreSize=true
+sys.config.sessionActive=4h
+spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
+
+#============================================================================
+# \u914D\u7F6EJobStore
+#============================================================================
+spring.quartz.job-store-type=jdbc
+spring.quartz.jdbc.initialize-schema=never
+# JobDataMaps\u662F\u5426\u90FD\u4E3AString\u7C7B\u578B\uFF0C\u9ED8\u8BA4false
+spring.quartz.properties.org.quartz.jobStore.useProperties=false
+# \u8868\u7684\u524D\u7F00\uFF0C\u9ED8\u8BA4QRTZ_
+spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
+# \u662F\u5426\u52A0\u5165\u96C6\u7FA4
+spring.quartz.properties.org.quartz.jobStore.isClustered=true
+# \u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 ms
+spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=5000
+# \u5F53\u8BBE\u7F6E\u4E3A\u201Ctrue\u201D\u65F6\uFF0C\u6B64\u5C5E\u6027\u544A\u8BC9Quartz \u5728\u975E\u6258\u7BA1JDBC\u8FDE\u63A5\u4E0A\u8C03\u7528setTransactionIsolation\uFF08Connection.TRANSACTION_READ_COMMITTED\uFF09\u3002
+spring.quartz.properties.org.quartz.jobStore.txIsolationLevelReadCommitted=true
+# \u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6570\u636E\u5E93\u6301\u4E45\u5316
+spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
+# \u6570\u636E\u5E93\u4EE3\u7406\u7C7B\uFF0C\u4E00\u822Corg.quartz.impl.jdbcjobstore.StdJDBCDelegate\u53EF\u4EE5\u6EE1\u8DB3\u5927\u90E8\u5206\u6570\u636E\u5E93
+spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+#============================================================================
+# Scheduler \u8C03\u5EA6\u5668\u5C5E\u6027\u914D\u7F6E
+#============================================================================
+# \u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0
+spring.quartz.properties.org.quartz.scheduler.instanceName=ClusterQuartz
+# ID\u8BBE\u7F6E\u4E3A\u81EA\u52A8\u83B7\u53D6 \u6BCF\u4E00\u4E2A\u5FC5\u987B\u4E0D\u540C
+spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
+
+#============================================================================
+# \u914D\u7F6EThreadPool
+#============================================================================
+# \u7EBF\u7A0B\u6C60\u7684\u5B9E\u73B0\u7C7B\uFF08\u4E00\u822C\u4F7F\u7528SimpleThreadPool\u5373\u53EF\u6EE1\u8DB3\u51E0\u4E4E\u6240\u6709\u7528\u6237\u7684\u9700\u6C42\uFF09
+spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
+# \u6307\u5B9A\u7EBF\u7A0B\u6570\uFF0C\u4E00\u822C\u8BBE\u7F6E\u4E3A1-100\u76F4\u63A5\u7684\u6574\u6570\uFF0C\u6839\u636E\u7CFB\u7EDF\u8D44\u6E90\u914D\u7F6E
+spring.quartz.properties.org.quartz.threadPool.threadCount=10
+# \u8BBE\u7F6E\u7EBF\u7A0B\u7684\u4F18\u5148\u7EA7(\u53EF\u4EE5\u662FThread.MIN_PRIORITY\uFF08\u53731\uFF09\u548CThread.MAX_PRIORITY\uFF08\u8FD9\u662F10\uFF09\u4E4B\u95F4\u7684\u4EFB\u4F55int \u3002\u9ED8\u8BA4\u503C\u4E3AThread.NORM_PRIORITY\uFF085\uFF09\u3002)
+spring.quartz.properties.org.quartz.threadPool.threadPriority=5
+
+#\u914D\u7F6E\u6587\u4EF6
+#spring.profiles=task

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

@@ -0,0 +1,123 @@
+#\u7AEF\u53E3\u914D\u7F6E
+server.port=7011
+#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
+server.tomcat.threads.max=2500
+#tomcat\u6700\u5927\u8FDE\u63A5\u6570
+server.tomcat.max-connections=2500
+#tomcat\u7684URI\u7F16\u7801
+server.tomcat.uri-encoding=UTF-8
+
+#\u9879\u76EE\u540D\u79F0
+spring.application.name=teachcloud-task
+
+#\u6570\u636E\u6E90\u914D\u7F6E
+db.host=localhost
+db.port=3306
+db.name=distributed-v2.2.0-test
+db.username=root
+db.password=123456789
+
+#redis\u6570\u636E\u6E90\u914D\u7F6E
+com.qmth.redis.host=${db.host}
+com.qmth.redis.port=6379
+com.qmth.redis.db=15
+#com.qmth.redis.password
+
+#mysql\u914D\u7F6E
+com.qmth.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
+com.qmth.datasource.username=${db.username}
+com.qmth.datasource.password=${db.password}
+com.qmth.mybatis.log-level=debug
+
+#activiti\u914D\u7F6E
+#activiti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u8868\u8FDB\u884C\u66F4\u65B0\u64CD\u4F5C\u3002\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219\u81EA\u52A8\u521B\u5EFA
+#false\uFF1Afalse\u4E3A\u9ED8\u8BA4\u503C\uFF0C\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u5728\u542F\u52A8\u65F6\uFF0C\u4F1A\u5BF9\u6BD4\u6570\u636E\u5E93\u8868\u4E2D\u4FDD\u5B58\u7684\u7248\u672C\uFF0C\u5982\u679C\u6CA1\u6709\u8868\u6216\u8005\u7248\u672C\u4E0D\u5339\u914D\u65F6\uFF0C\u5C06\u5728\u542F\u52A8\u65F6\u629B\u51FA\u5F02\u5E38\u3002
+#true\uFF1A\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u7684\u8868\u8FDB\u884C\u66F4\u65B0\uFF0C\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219Activiti\u4F1A\u81EA\u52A8\u521B\u5EFA\u3002
+#create-drop\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\uFF0C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u3002
+#drop-create\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\u3002
+spring.activiti.database-schema-update=true
+#\u68C0\u6D4B\u5386\u53F2\u8868\u662F\u5426\u5B58\u5728
+spring.activiti.db-history-used=true
+#\u81EA\u52A8\u90E8\u7F72\u9A8C\u8BC1\u8BBE\u7F6E:true-\u5F00\u542F\uFF08\u9ED8\u8BA4\uFF09\u3001false-\u5173\u95ED
+spring.activiti.check-process-definitions=false
+#spring.activiti.process-definition-location-prefix=classpath:/processes/
+#\u5BF9\u4E8E\u5386\u53F2\u6570\u636E\uFF0C\u4FDD\u5B58\u5230\u4F55\u79CD\u7C92\u5EA6\uFF0CActiviti\u63D0\u4F9B\u4E86history-level\u5C5E\u6027\u5BF9\u5176\u8FDB\u884C\u914D\u7F6E\u3002history-level\u5C5E\u6027\u6709\u70B9\u50CFlog4j\u7684\u65E5\u5FD7\u8F93\u51FA\u7EA7\u522B\uFF0C\u8BE5\u5C5E\u6027\u6709\u4EE5\u4E0B\u56DB\u4E2A\u503C\uFF1A
+#none\uFF1A\u4E0D\u4FDD\u5B58\u4EFB\u4F55\u7684\u5386\u53F2\u6570\u636E\uFF0C\u56E0\u6B64\uFF0C\u5728\u6D41\u7A0B\u6267\u884C\u8FC7\u7A0B\u4E2D\uFF0C\u8FD9\u662F\u6700\u9AD8\u6548\u7684\u3002
+#activity\uFF1A\u7EA7\u522B\u9AD8\u4E8Enone\uFF0C\u4FDD\u5B58\u6D41\u7A0B\u5B9E\u4F8B\u4E0E\u6D41\u7A0B\u884C\u4E3A\uFF0C\u5176\u4ED6\u6570\u636E\u4E0D\u4FDD\u5B58\u3002
+#audit\uFF1A\u9664activity\u7EA7\u522B\u4F1A\u4FDD\u5B58\u7684\u6570\u636E\u5916\uFF0C\u8FD8\u4F1A\u4FDD\u5B58\u5168\u90E8\u7684\u6D41\u7A0B\u4EFB\u52A1\u53CA\u5176\u5C5E\u6027\u3002audit\u4E3Ahistory\u7684\u9ED8\u8BA4\u503C\u3002
+#full\uFF1A\u4FDD\u5B58\u5386\u53F2\u6570\u636E\u7684\u6700\u9AD8\u7EA7\u522B\uFF0C\u9664\u4E86\u4F1A\u4FDD\u5B58audit\u7EA7\u522B\u7684\u6570\u636E\u5916\uFF0C\u8FD8\u4F1A\u4FDD\u5B58\u5176\u4ED6\u5168\u90E8\u6D41\u7A0B\u76F8\u5173\u7684\u7EC6\u8282\u6570\u636E\uFF0C\u5305\u62EC\u4E00\u4E9B\u6D41\u7A0B\u53C2\u6570\u7B49\u3002
+spring.activiti.history-level=audit
+
+#\u963F\u91CC\u4E91OSS\u914D\u7F6E
+aliyun.oss.name=oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.endpoint=http://${aliyun.oss.name}
+aliyun.oss.accessKeyId=LTAI4Fi8jVRYT49QBXU9x5QX
+aliyun.oss.accessKeySecret=97aBLBfkQR5mzCiQa82yWLAH57eUd8
+aliyun.oss.bucket=teachcloud-test
+aliyun.oss.url=http://${aliyun.oss.bucket}.${aliyun.oss.name}
+
+com.qmth.fss.public.config=oss://key:secret@teachcloud-print-dev-public.oss-api.qmth.com.cn
+com.qmth.fss.public.server=http://oss-file.qmth.com.cn/teachcloud-print-dev-public
+com.qmth.fss.private.config=oss://key:secret@teachcloud-print-dev-private.oss-api.qmth.com.cn
+com.qmth.fss.private.server=http://oss-file.qmth.com.cn/teachcloud-print-dev-private
+
+#\u7CFB\u7EDF\u914D\u7F6E
+sys.config.oss=true
+sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl,.bpmn,.xml
+sys.config.attachmentLength=100
+sys.config.attachmentSize=200
+sys.config.serverUpload=
+sys.config.fileHost=localhost:7011
+sys.config.serverHost=localhost:7011
+#sys.config.accessKey=0bce69d94a7b4aef8bc0badf150351a9
+#sys.config.accessSecret=LdUwb5X4etmjW7fDn0KAdoXG0Yt7AkDu
+sys.config.accessKey=274f823e5f59410f8b3bb6edcd8e2b6e
+sys.config.accessSecret=y7AO6W0TOdTF8HpWBwGHbp3wfIHsmUKr
+sys.config.adminLogoUrl=http://qmth-test.oss-cn-shenzhen.aliyuncs.com/frontend/wx_logo.png
+#sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+sys.config.autoCreatePdfResetMaxCount=5
+sys.config.threadPoolCoreSize=1
+sys.config.customThreadPoolCoreSize=true
+sys.config.sessionActive=4h
+spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
+
+#============================================================================
+# \u914D\u7F6EJobStore
+#============================================================================
+spring.quartz.job-store-type=jdbc
+spring.quartz.jdbc.initialize-schema=never
+# JobDataMaps\u662F\u5426\u90FD\u4E3AString\u7C7B\u578B\uFF0C\u9ED8\u8BA4false
+spring.quartz.properties.org.quartz.jobStore.useProperties=false
+# \u8868\u7684\u524D\u7F00\uFF0C\u9ED8\u8BA4QRTZ_
+spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
+# \u662F\u5426\u52A0\u5165\u96C6\u7FA4
+spring.quartz.properties.org.quartz.jobStore.isClustered=true
+# \u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 ms
+spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=5000
+# \u5F53\u8BBE\u7F6E\u4E3A\u201Ctrue\u201D\u65F6\uFF0C\u6B64\u5C5E\u6027\u544A\u8BC9Quartz \u5728\u975E\u6258\u7BA1JDBC\u8FDE\u63A5\u4E0A\u8C03\u7528setTransactionIsolation\uFF08Connection.TRANSACTION_READ_COMMITTED\uFF09\u3002
+spring.quartz.properties.org.quartz.jobStore.txIsolationLevelReadCommitted=true
+# \u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6570\u636E\u5E93\u6301\u4E45\u5316
+spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
+# \u6570\u636E\u5E93\u4EE3\u7406\u7C7B\uFF0C\u4E00\u822Corg.quartz.impl.jdbcjobstore.StdJDBCDelegate\u53EF\u4EE5\u6EE1\u8DB3\u5927\u90E8\u5206\u6570\u636E\u5E93
+spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+#============================================================================
+# Scheduler \u8C03\u5EA6\u5668\u5C5E\u6027\u914D\u7F6E
+#============================================================================
+# \u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0
+spring.quartz.properties.org.quartz.scheduler.instanceName=ClusterQuartz
+# ID\u8BBE\u7F6E\u4E3A\u81EA\u52A8\u83B7\u53D6 \u6BCF\u4E00\u4E2A\u5FC5\u987B\u4E0D\u540C
+spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
+
+#============================================================================
+# \u914D\u7F6EThreadPool
+#============================================================================
+# \u7EBF\u7A0B\u6C60\u7684\u5B9E\u73B0\u7C7B\uFF08\u4E00\u822C\u4F7F\u7528SimpleThreadPool\u5373\u53EF\u6EE1\u8DB3\u51E0\u4E4E\u6240\u6709\u7528\u6237\u7684\u9700\u6C42\uFF09
+spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
+# \u6307\u5B9A\u7EBF\u7A0B\u6570\uFF0C\u4E00\u822C\u8BBE\u7F6E\u4E3A1-100\u76F4\u63A5\u7684\u6574\u6570\uFF0C\u6839\u636E\u7CFB\u7EDF\u8D44\u6E90\u914D\u7F6E
+spring.quartz.properties.org.quartz.threadPool.threadCount=10
+# \u8BBE\u7F6E\u7EBF\u7A0B\u7684\u4F18\u5148\u7EA7(\u53EF\u4EE5\u662FThread.MIN_PRIORITY\uFF08\u53731\uFF09\u548CThread.MAX_PRIORITY\uFF08\u8FD9\u662F10\uFF09\u4E4B\u95F4\u7684\u4EFB\u4F55int \u3002\u9ED8\u8BA4\u503C\u4E3AThread.NORM_PRIORITY\uFF085\uFF09\u3002)
+spring.quartz.properties.org.quartz.threadPool.threadPriority=5
+
+#\u914D\u7F6E\u6587\u4EF6
+#spring.profiles=task

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

@@ -0,0 +1,123 @@
+#\u7AEF\u53E3\u914D\u7F6E
+server.port=7011
+#tomcat\u6700\u5927\u7EBF\u7A0B\u6570\uFF0C\u9ED8\u8BA4\u4E3A200
+server.tomcat.threads.max=2500
+#tomcat\u6700\u5927\u8FDE\u63A5\u6570
+server.tomcat.max-connections=2500
+#tomcat\u7684URI\u7F16\u7801
+server.tomcat.uri-encoding=UTF-8
+
+#\u9879\u76EE\u540D\u79F0
+spring.application.name=teachcloud-task
+
+#\u6570\u636E\u6E90\u914D\u7F6E
+db.host=localhost
+db.port=3306
+db.name=distributed-v2.2.0-test
+db.username=root
+db.password=123456789
+
+#redis\u6570\u636E\u6E90\u914D\u7F6E
+com.qmth.redis.host=${db.host}
+com.qmth.redis.port=6379
+com.qmth.redis.db=15
+#com.qmth.redis.password
+
+#mysql\u914D\u7F6E
+com.qmth.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.name}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
+com.qmth.datasource.username=${db.username}
+com.qmth.datasource.password=${db.password}
+com.qmth.mybatis.log-level=debug
+
+#activiti\u914D\u7F6E
+#activiti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u8868\u8FDB\u884C\u66F4\u65B0\u64CD\u4F5C\u3002\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219\u81EA\u52A8\u521B\u5EFA
+#false\uFF1Afalse\u4E3A\u9ED8\u8BA4\u503C\uFF0C\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u5728\u542F\u52A8\u65F6\uFF0C\u4F1A\u5BF9\u6BD4\u6570\u636E\u5E93\u8868\u4E2D\u4FDD\u5B58\u7684\u7248\u672C\uFF0C\u5982\u679C\u6CA1\u6709\u8868\u6216\u8005\u7248\u672C\u4E0D\u5339\u914D\u65F6\uFF0C\u5C06\u5728\u542F\u52A8\u65F6\u629B\u51FA\u5F02\u5E38\u3002
+#true\uFF1A\u8BBE\u7F6E\u4E3A\u8BE5\u503C\u540E\uFF0CActiviti\u4F1A\u5BF9\u6570\u636E\u5E93\u4E2D\u6240\u6709\u7684\u8868\u8FDB\u884C\u66F4\u65B0\uFF0C\u5982\u679C\u8868\u4E0D\u5B58\u5728\uFF0C\u5219Activiti\u4F1A\u81EA\u52A8\u521B\u5EFA\u3002
+#create-drop\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\uFF0C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u3002
+#drop-create\uFF1AActiviti\u542F\u52A8\u65F6\uFF0C\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u5220\u9664\u64CD\u4F5C\u5728Activiti\u5173\u95ED\u65F6\uFF0C\u4F1A\u6267\u884C\u6570\u636E\u5E93\u8868\u7684\u521B\u5EFA\u64CD\u4F5C\u3002
+spring.activiti.database-schema-update=true
+#\u68C0\u6D4B\u5386\u53F2\u8868\u662F\u5426\u5B58\u5728
+spring.activiti.db-history-used=true
+#\u81EA\u52A8\u90E8\u7F72\u9A8C\u8BC1\u8BBE\u7F6E:true-\u5F00\u542F\uFF08\u9ED8\u8BA4\uFF09\u3001false-\u5173\u95ED
+spring.activiti.check-process-definitions=false
+#spring.activiti.process-definition-location-prefix=classpath:/processes/
+#\u5BF9\u4E8E\u5386\u53F2\u6570\u636E\uFF0C\u4FDD\u5B58\u5230\u4F55\u79CD\u7C92\u5EA6\uFF0CActiviti\u63D0\u4F9B\u4E86history-level\u5C5E\u6027\u5BF9\u5176\u8FDB\u884C\u914D\u7F6E\u3002history-level\u5C5E\u6027\u6709\u70B9\u50CFlog4j\u7684\u65E5\u5FD7\u8F93\u51FA\u7EA7\u522B\uFF0C\u8BE5\u5C5E\u6027\u6709\u4EE5\u4E0B\u56DB\u4E2A\u503C\uFF1A
+#none\uFF1A\u4E0D\u4FDD\u5B58\u4EFB\u4F55\u7684\u5386\u53F2\u6570\u636E\uFF0C\u56E0\u6B64\uFF0C\u5728\u6D41\u7A0B\u6267\u884C\u8FC7\u7A0B\u4E2D\uFF0C\u8FD9\u662F\u6700\u9AD8\u6548\u7684\u3002
+#activity\uFF1A\u7EA7\u522B\u9AD8\u4E8Enone\uFF0C\u4FDD\u5B58\u6D41\u7A0B\u5B9E\u4F8B\u4E0E\u6D41\u7A0B\u884C\u4E3A\uFF0C\u5176\u4ED6\u6570\u636E\u4E0D\u4FDD\u5B58\u3002
+#audit\uFF1A\u9664activity\u7EA7\u522B\u4F1A\u4FDD\u5B58\u7684\u6570\u636E\u5916\uFF0C\u8FD8\u4F1A\u4FDD\u5B58\u5168\u90E8\u7684\u6D41\u7A0B\u4EFB\u52A1\u53CA\u5176\u5C5E\u6027\u3002audit\u4E3Ahistory\u7684\u9ED8\u8BA4\u503C\u3002
+#full\uFF1A\u4FDD\u5B58\u5386\u53F2\u6570\u636E\u7684\u6700\u9AD8\u7EA7\u522B\uFF0C\u9664\u4E86\u4F1A\u4FDD\u5B58audit\u7EA7\u522B\u7684\u6570\u636E\u5916\uFF0C\u8FD8\u4F1A\u4FDD\u5B58\u5176\u4ED6\u5168\u90E8\u6D41\u7A0B\u76F8\u5173\u7684\u7EC6\u8282\u6570\u636E\uFF0C\u5305\u62EC\u4E00\u4E9B\u6D41\u7A0B\u53C2\u6570\u7B49\u3002
+spring.activiti.history-level=audit
+
+#\u963F\u91CC\u4E91OSS\u914D\u7F6E
+aliyun.oss.name=oss-cn-shenzhen.aliyuncs.com
+aliyun.oss.endpoint=http://${aliyun.oss.name}
+aliyun.oss.accessKeyId=LTAI4Fi8jVRYT49QBXU9x5QX
+aliyun.oss.accessKeySecret=97aBLBfkQR5mzCiQa82yWLAH57eUd8
+aliyun.oss.bucket=teachcloud-test
+aliyun.oss.url=http://${aliyun.oss.bucket}.${aliyun.oss.name}
+
+com.qmth.fss.public.config=oss://key:secret@teachcloud-print-dev-public.oss-api.qmth.com.cn
+com.qmth.fss.public.server=http://oss-file.qmth.com.cn/teachcloud-print-dev-public
+com.qmth.fss.private.config=oss://key:secret@teachcloud-print-dev-private.oss-api.qmth.com.cn
+com.qmth.fss.private.server=http://oss-file.qmth.com.cn/teachcloud-print-dev-private
+
+#\u7CFB\u7EDF\u914D\u7F6E
+sys.config.oss=true
+sys.config.attachmentType=.xlsx,.xls,.doc,.docx,.pdf,.jpg,.jpeg,.png,.html,.zip,.mp3,.wav,.dll,.exe,.ftl,.bpmn,.xml
+sys.config.attachmentLength=100
+sys.config.attachmentSize=200
+sys.config.serverUpload=
+sys.config.fileHost=localhost:7011
+sys.config.serverHost=localhost:7011
+#sys.config.accessKey=0bce69d94a7b4aef8bc0badf150351a9
+#sys.config.accessSecret=LdUwb5X4etmjW7fDn0KAdoXG0Yt7AkDu
+sys.config.accessKey=274f823e5f59410f8b3bb6edcd8e2b6e
+sys.config.accessSecret=y7AO6W0TOdTF8HpWBwGHbp3wfIHsmUKr
+sys.config.adminLogoUrl=http://qmth-test.oss-cn-shenzhen.aliyuncs.com/frontend/wx_logo.png
+#sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+sys.config.htmlToPdfUrl=/usr/local/bin/wkhtmltopdf
+sys.config.autoCreatePdfResetMaxCount=5
+sys.config.threadPoolCoreSize=1
+sys.config.customThreadPoolCoreSize=true
+sys.config.sessionActive=4h
+spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
+
+#============================================================================
+# \u914D\u7F6EJobStore
+#============================================================================
+spring.quartz.job-store-type=jdbc
+spring.quartz.jdbc.initialize-schema=never
+# JobDataMaps\u662F\u5426\u90FD\u4E3AString\u7C7B\u578B\uFF0C\u9ED8\u8BA4false
+spring.quartz.properties.org.quartz.jobStore.useProperties=false
+# \u8868\u7684\u524D\u7F00\uFF0C\u9ED8\u8BA4QRTZ_
+spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
+# \u662F\u5426\u52A0\u5165\u96C6\u7FA4
+spring.quartz.properties.org.quartz.jobStore.isClustered=true
+# \u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 ms
+spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=5000
+# \u5F53\u8BBE\u7F6E\u4E3A\u201Ctrue\u201D\u65F6\uFF0C\u6B64\u5C5E\u6027\u544A\u8BC9Quartz \u5728\u975E\u6258\u7BA1JDBC\u8FDE\u63A5\u4E0A\u8C03\u7528setTransactionIsolation\uFF08Connection.TRANSACTION_READ_COMMITTED\uFF09\u3002
+spring.quartz.properties.org.quartz.jobStore.txIsolationLevelReadCommitted=true
+# \u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6570\u636E\u5E93\u6301\u4E45\u5316
+spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
+# \u6570\u636E\u5E93\u4EE3\u7406\u7C7B\uFF0C\u4E00\u822Corg.quartz.impl.jdbcjobstore.StdJDBCDelegate\u53EF\u4EE5\u6EE1\u8DB3\u5927\u90E8\u5206\u6570\u636E\u5E93
+spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+#============================================================================
+# Scheduler \u8C03\u5EA6\u5668\u5C5E\u6027\u914D\u7F6E
+#============================================================================
+# \u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0
+spring.quartz.properties.org.quartz.scheduler.instanceName=ClusterQuartz
+# ID\u8BBE\u7F6E\u4E3A\u81EA\u52A8\u83B7\u53D6 \u6BCF\u4E00\u4E2A\u5FC5\u987B\u4E0D\u540C
+spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
+
+#============================================================================
+# \u914D\u7F6EThreadPool
+#============================================================================
+# \u7EBF\u7A0B\u6C60\u7684\u5B9E\u73B0\u7C7B\uFF08\u4E00\u822C\u4F7F\u7528SimpleThreadPool\u5373\u53EF\u6EE1\u8DB3\u51E0\u4E4E\u6240\u6709\u7528\u6237\u7684\u9700\u6C42\uFF09
+spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
+# \u6307\u5B9A\u7EBF\u7A0B\u6570\uFF0C\u4E00\u822C\u8BBE\u7F6E\u4E3A1-100\u76F4\u63A5\u7684\u6574\u6570\uFF0C\u6839\u636E\u7CFB\u7EDF\u8D44\u6E90\u914D\u7F6E
+spring.quartz.properties.org.quartz.threadPool.threadCount=10
+# \u8BBE\u7F6E\u7EBF\u7A0B\u7684\u4F18\u5148\u7EA7(\u53EF\u4EE5\u662FThread.MIN_PRIORITY\uFF08\u53731\uFF09\u548CThread.MAX_PRIORITY\uFF08\u8FD9\u662F10\uFF09\u4E4B\u95F4\u7684\u4EFB\u4F55int \u3002\u9ED8\u8BA4\u503C\u4E3AThread.NORM_PRIORITY\uFF085\uFF09\u3002)
+spring.quartz.properties.org.quartz.threadPool.threadPriority=5
+
+#\u914D\u7F6E\u6587\u4EF6
+#spring.profiles=task

+ 119 - 0
teachcloud-task/src/main/resources/processes/GdykdxPaperApprove.bpmn

@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
+  <process id="GdykdxPaperApprove" name="GdykdxPaperApprove" isExecutable="true">
+    <startEvent id="startevent1" name="Start"></startEvent>
+    <userTask id="usertask1" name="提交试卷(命题老师)" activiti:assignee="${approveId}"></userTask>
+    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
+    <userTask id="usertask2" name="审核试卷(教研室主任)">
+      <extensionElements>
+        <activiti:taskListener event="create" class="com.qmth.distributed.print.business.activiti.DirectorApproveListener"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
+    <endEvent id="endevent1" name="End"></endEvent>
+    <exclusiveGateway id="exclusivegateway1" name="审批"></exclusiveGateway>
+    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="exclusivegateway1"></sequenceFlow>
+    <userTask id="usertask3" name="审核试卷(教学院长)">
+      <extensionElements>
+        <activiti:taskListener event="create" class="com.qmth.distributed.print.business.activiti.PresidentApproveListener"></activiti:taskListener>
+      </extensionElements>
+    </userTask>
+    <sequenceFlow id="flow4" name="通过" sourceRef="exclusivegateway1" targetRef="usertask3">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve == 1}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow5" name="驳回" sourceRef="exclusivegateway1" targetRef="usertask1">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve == 0}]]></conditionExpression>
+    </sequenceFlow>
+    <exclusiveGateway id="exclusivegateway2" name="审批"></exclusiveGateway>
+    <sequenceFlow id="flow6" sourceRef="usertask3" targetRef="exclusivegateway2"></sequenceFlow>
+    <sequenceFlow id="flow7" name="通过" sourceRef="exclusivegateway2" targetRef="endevent1">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve == 2}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow8" name="驳回" sourceRef="exclusivegateway2" targetRef="usertask2">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve == 1}]]></conditionExpression>
+    </sequenceFlow>
+    <sequenceFlow id="flow9" name="驳回" sourceRef="exclusivegateway2" targetRef="usertask1">
+      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${approve == 0}]]></conditionExpression>
+    </sequenceFlow>
+  </process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_GdykdxPaperApprove">
+    <bpmndi:BPMNPlane bpmnElement="GdykdxPaperApprove" id="BPMNPlane_GdykdxPaperApprove">
+      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="43.0" y="46.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
+        <omgdc:Bounds height="55.0" width="105.0" x="151.0" y="36.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
+        <omgdc:Bounds height="55.0" width="105.0" x="350.0" y="36.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
+        <omgdc:Bounds height="35.0" width="35.0" x="385.0" y="400.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
+        <omgdc:Bounds height="40.0" width="40.0" x="382.0" y="110.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
+        <omgdc:Bounds height="55.0" width="105.0" x="350.0" y="190.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape bpmnElement="exclusivegateway2" id="BPMNShape_exclusivegateway2">
+        <omgdc:Bounds height="40.0" width="40.0" x="382.0" y="300.0"></omgdc:Bounds>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
+        <omgdi:waypoint x="78.0" y="63.0"></omgdi:waypoint>
+        <omgdi:waypoint x="151.0" y="63.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
+        <omgdi:waypoint x="256.0" y="63.0"></omgdi:waypoint>
+        <omgdi:waypoint x="350.0" y="63.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
+        <omgdi:waypoint x="402.0" y="91.0"></omgdi:waypoint>
+        <omgdi:waypoint x="402.0" y="110.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
+        <omgdi:waypoint x="402.0" y="150.0"></omgdi:waypoint>
+        <omgdi:waypoint x="402.0" y="190.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="22.0" x="402.0" y="150.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
+        <omgdi:waypoint x="382.0" y="130.0"></omgdi:waypoint>
+        <omgdi:waypoint x="203.0" y="130.0"></omgdi:waypoint>
+        <omgdi:waypoint x="203.0" y="91.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="22.0" x="382.0" y="130.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow6" id="BPMNEdge_flow6">
+        <omgdi:waypoint x="402.0" y="245.0"></omgdi:waypoint>
+        <omgdi:waypoint x="402.0" y="300.0"></omgdi:waypoint>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7">
+        <omgdi:waypoint x="402.0" y="340.0"></omgdi:waypoint>
+        <omgdi:waypoint x="402.0" y="400.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="22.0" x="402.0" y="340.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8">
+        <omgdi:waypoint x="422.0" y="320.0"></omgdi:waypoint>
+        <omgdi:waypoint x="546.0" y="319.0"></omgdi:waypoint>
+        <omgdi:waypoint x="546.0" y="63.0"></omgdi:waypoint>
+        <omgdi:waypoint x="455.0" y="63.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="22.0" x="422.0" y="320.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge bpmnElement="flow9" id="BPMNEdge_flow9">
+        <omgdi:waypoint x="382.0" y="320.0"></omgdi:waypoint>
+        <omgdi:waypoint x="203.0" y="321.0"></omgdi:waypoint>
+        <omgdi:waypoint x="203.0" y="91.0"></omgdi:waypoint>
+        <bpmndi:BPMNLabel>
+          <omgdc:Bounds height="16.0" width="22.0" x="382.0" y="320.0"></omgdc:Bounds>
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</definitions>