浏览代码

Merge branch 'dev'
merge

wangliang 4 年之前
父节点
当前提交
37ea570a8d
共有 26 个文件被更改,包括 346 次插入43 次删除
  1. 22 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/TaskListResult.java
  2. 20 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/domain/SysDomain.java
  3. 26 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TBTask.java
  4. 8 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TBTaskService.java
  5. 5 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicAttachmentServiceImpl.java
  6. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java
  7. 47 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBTaskServiceImpl.java
  8. 8 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCreatePdfTempleteService.java
  9. 10 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/TaskLogicService.java
  10. 49 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  11. 5 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/threadPool/MyThreadPool.java
  12. 2 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/PdfUtil.java
  13. 9 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/ServletUtil.java
  14. 2 0
      distributed-print-business/src/main/resources/db/init-table.sql
  15. 1 1
      distributed-print-business/src/main/resources/mapper/ExamDetailMapper.xml
  16. 2 1
      distributed-print-business/src/main/resources/mapper/TBTaskMapper.xml
  17. 2 1
      distributed-print-common/src/main/java/com/qmth/distributed/print/common/contant/SystemConstant.java
  18. 5 1
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/enums/JobEnum.java
  19. 31 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/ResetCreatePdfJob.java
  20. 13 6
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/JobService.java
  21. 14 1
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/impl/JobServiceImpl.java
  22. 2 6
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamDetailController.java
  23. 49 5
      distributed-print/src/main/java/com/qmth/distributed/print/api/TBTaskController.java
  24. 9 0
      distributed-print/src/main/java/com/qmth/distributed/print/start/StartRunning.java
  25. 3 1
      distributed-print/src/main/resources/application.properties
  26. 1 1
      distributed-print/src/test/java/com/qmth/distributed/print/ServiceTest.java

+ 22 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/TaskListResult.java

@@ -55,6 +55,28 @@ public class TaskListResult implements Serializable {
     @ApiModelProperty(value = "是否有报告文件")
     Boolean hasReportFile;
 
+    @ApiModelProperty(value = "是否重新生成pdf")
+    boolean resetCreatePdf;
+
+    @ApiModelProperty(value = "重新生成次数")
+    int resetCount;
+
+    public int getResetCount() {
+        return resetCount;
+    }
+
+    public void setResetCount(int resetCount) {
+        this.resetCount = resetCount;
+    }
+
+    public boolean isResetCreatePdf() {
+        return resetCreatePdf;
+    }
+
+    public void setResetCreatePdf(boolean resetCreatePdf) {
+        this.resetCreatePdf = resetCreatePdf;
+    }
+
     public Long getId() {
         return id;
     }

+ 20 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/domain/SysDomain.java

@@ -34,6 +34,26 @@ public class SysDomain implements Serializable {
 
     String htmlToPdfUrl;
 
+    Integer autoCreatePdfResetMaxCount;
+
+    Integer threadPoolCoreSize;
+
+    public Integer getAutoCreatePdfResetMaxCount() {
+        return autoCreatePdfResetMaxCount;
+    }
+
+    public void setAutoCreatePdfResetMaxCount(Integer autoCreatePdfResetMaxCount) {
+        this.autoCreatePdfResetMaxCount = autoCreatePdfResetMaxCount;
+    }
+
+    public Integer getThreadPoolCoreSize() {
+        return threadPoolCoreSize;
+    }
+
+    public void setThreadPoolCoreSize(Integer threadPoolCoreSize) {
+        this.threadPoolCoreSize = threadPoolCoreSize;
+    }
+
     public String getHtmlToPdfUrl() {
         return htmlToPdfUrl;
     }

+ 26 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TBTask.java

@@ -13,6 +13,8 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.util.Objects;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * <p>
@@ -109,6 +111,30 @@ public class TBTask implements Serializable {
     @TableField(value = "obj_name")
     private String objName;
 
+    @ApiModelProperty(value = "重试次数")
+    @TableField(value = "reset_count")
+    private int resetCount;
+
+    @ApiModelProperty(value = "更新版本号")
+    @TableField(value = "version")
+    private int version;
+
+    public int getVersion() {
+        return version;
+    }
+
+    public void setVersion(int version) {
+        this.version = version;
+    }
+
+    public int getResetCount() {
+        return resetCount;
+    }
+
+    public void setResetCount(int resetCount) {
+        this.resetCount = resetCount;
+    }
+
     public String getObjName() {
         return objName;
     }

+ 8 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TBTaskService.java

@@ -12,6 +12,7 @@ import com.qmth.distributed.print.business.enums.TaskTypeEnum;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
@@ -146,4 +147,11 @@ public interface TBTaskService extends IService<TBTask> {
      */
     @Async("arbitrateThreadPool")
     public void updateStatus();
+
+    /**
+     * 重新生成pdf失败任务
+     *
+     * @throws IOException
+     */
+    public void resetCreatePdfTask() throws IOException;
 }

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

@@ -141,13 +141,14 @@ public class BasicAttachmentServiceImpl extends ServiceImpl<BasicAttachmentMappe
                 String pdfDirName = pdfStringJoiner.toString();
                 String destUrl = SystemConstant.PDF_TEMP_FILES_DIR + File.separator + pdfDirName;
 //                destUrl = destUrl.replaceAll("\\\\","/");
+
                 HtmlToPdfUtil.convert(localHtmlFile.getPath(), destUrl, PageSizeEnum.A3);
+//                File pdfFile = asposePdfUtil.documentToPdf(localHtmlFile.getPath(), destUrl, PaperSize.A3);
                 File pdfFile = new File(destUrl);
                 if (!pdfFile.exists()) {
                     pdfFile.getParentFile().mkdirs();
                     pdfFile.createNewFile();
                 }
-
                 pdfDto = PdfUtil.addPdfPage(pdfFile);
                 localFileList.add(new PdfDto(pdfFile.getPath(), PageSizeEnum.A3, pdfDto.getPageCount()));
                 fileMd5 = DigestUtils.md5Hex(new FileInputStream(pdfFile));
@@ -166,6 +167,7 @@ public class BasicAttachmentServiceImpl extends ServiceImpl<BasicAttachmentMappe
                 jsonObject.put(SystemConstant.PATH, stringJoiner.toString());
                 String destUrl = finalFile.getPath().replaceAll(SystemConstant.HTML_PREFIX, SystemConstant.PDF_PREFIX).replaceAll(UploadFileEnum.HTML.name().toLowerCase(), UploadFileEnum.PDF.name().toLowerCase());
                 HtmlToPdfUtil.convert(finalFile.getPath(), destUrl, PageSizeEnum.A3);
+//                File pdfFile = asposePdfUtil.documentToPdf(finalFile.getPath(), destUrl, PaperSize.A3);
                 jsonObject.put(SystemConstant.PDF_PATH, destUrl);
             }
             jsonObject.put(SystemConstant.UPLOAD_TYPE, new UploadFileEnum[]{
@@ -294,13 +296,14 @@ public class BasicAttachmentServiceImpl extends ServiceImpl<BasicAttachmentMappe
 
             String pdfDirName = pdfStringJoiner.toString();
             String destUrl = SystemConstant.PDF_TEMP_FILES_DIR + File.separator + pdfDirName;
+
             File pdfFile = new File(destUrl);
             if (!pdfFile.exists()) {
                 pdfFile.getParentFile().mkdirs();
                 pdfFile.createNewFile();
             }
-
             HtmlToPdfUtil.convert(htmlFile.getPath(), destUrl, PageSizeEnum.A4);
+//            File pdfFile = asposePdfUtil.documentToPdf(htmlFile.getPath(), destUrl, PaperSize.A4);
             String htmlFileMd5 = DigestUtils.md5Hex(new FileInputStream(htmlFile));
             String pdfFileMd5 = DigestUtils.md5Hex(new FileInputStream(pdfFile));
             PdfDto pdfDto = null;

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

@@ -77,7 +77,7 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
             // 正在生成pdf不能禁用
             ExamTask examTask = examTaskService.getById(examTaskDetail.getId());
             List<ExamDetail> examDetails = examDetailService.listByCourseCodeAndPaperNumber(examTask.getSchoolId(), examTask.getCourseCode(), examTask.getPaperNumber());
-            if (!examDetails.isEmpty()) {
+            if (examDetails != null && examDetails.size() > 0) {
                 Map<Long, List<Long>> map = examDetails.stream().collect(Collectors.groupingBy(ExamDetail::getPrintPlanId, Collectors.mapping(ExamDetail::getId, Collectors.toList())));
                 for (Map.Entry<Long, List<Long>> listEntry : map.entrySet()) {
                     boolean b = tbTaskService.countByPrintPlanIdAndEntityId(examTask.getSchoolId(), listEntry.getKey(), listEntry.getValue());

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

@@ -1,5 +1,6 @@
 package com.qmth.distributed.print.business.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -7,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.params.ArraysParams;
 import com.qmth.distributed.print.business.bean.result.TaskListResult;
+import com.qmth.distributed.print.business.config.DictionaryConfig;
 import com.qmth.distributed.print.business.entity.BasicAttachment;
 import com.qmth.distributed.print.business.entity.SysUser;
 import com.qmth.distributed.print.business.entity.TBTask;
@@ -16,7 +18,9 @@ import com.qmth.distributed.print.business.enums.TaskTypeEnum;
 import com.qmth.distributed.print.business.enums.UploadFileEnum;
 import com.qmth.distributed.print.business.mapper.TBTaskMapper;
 import com.qmth.distributed.print.business.service.BasicAttachmentService;
+import com.qmth.distributed.print.business.service.SysUserService;
 import com.qmth.distributed.print.business.service.TBTaskService;
+import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTempleteService;
 import com.qmth.distributed.print.business.util.ServletUtil;
 import com.qmth.distributed.print.common.contant.SystemConstant;
 import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
@@ -27,10 +31,9 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.io.IOException;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * <p>
@@ -49,6 +52,15 @@ public class TBTaskServiceImpl extends ServiceImpl<TBTaskMapper, TBTask> impleme
     @Resource
     TBTaskMapper tbTaskMapper;
 
+    @Resource
+    AsyncCreatePdfTempleteService asyncCreatePdfTempleteService;
+
+    @Resource
+    SysUserService sysUserService;
+
+    @Resource
+    DictionaryConfig dictionaryConfig;
+
     /**
      * 保存任务
      *
@@ -309,6 +321,37 @@ public class TBTaskServiceImpl extends ServiceImpl<TBTaskMapper, TBTask> impleme
         this.update(tbTaskQueryWrapper);
     }
 
+    /**
+     * 重新生成pdf失败任务
+     *
+     * @throws IOException
+     */
+    @Override
+    @Transactional
+    public void resetCreatePdfTask() throws IOException {
+        QueryWrapper<TBTask> tbTaskQueryWrapper = new QueryWrapper<>();
+        tbTaskQueryWrapper.lambda().eq(TBTask::getType, TaskTypeEnum.CREATE_PDF)
+                .eq(TBTask::getStatus, TaskStatusEnum.FINISH).isNotNull(TBTask::getStatus)
+                .eq(TBTask::getResult, TaskResultEnum.ERROR);
+        List<TBTask> tbTasks = this.list(tbTaskQueryWrapper);
+        if (Objects.nonNull(tbTasks) && tbTasks.size() > 0) {
+            for (TBTask tbTask : tbTasks) {
+                if (tbTask.getResetCount() < dictionaryConfig.sysDomain().getAutoCreatePdfResetMaxCount()) {
+                    Map<String, Object> map = new HashMap<>();
+                    tbTask.setVersion(new AtomicInteger(tbTask.getVersion()).incrementAndGet());
+                    if (Objects.nonNull(tbTask.getRemark())) {
+                        JSONArray jsonArray = JSONArray.parseArray(tbTask.getRemark());
+                        ArraysParams arraysParams = new ArraysParams(jsonArray.toArray(new Long[jsonArray.size()]));
+                        map.computeIfAbsent("examDetailCourseIds", v -> Arrays.asList(arraysParams.getIds()));
+                    }
+                    map.computeIfAbsent(SystemConstant.TASK, v -> tbTask);
+                    map.computeIfAbsent(SystemConstant.USER, v -> sysUserService.getById(tbTask.getCreateId()));
+                    asyncCreatePdfTempleteService.createPdf(map, null);
+                }
+            }
+        }
+    }
+
     /**
      * 保存task
      *

+ 8 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCreatePdfTempleteService.java

@@ -13,16 +13,15 @@ import com.qmth.distributed.print.common.contant.SpringContextHolder;
 import com.qmth.distributed.print.common.contant.SystemConstant;
 import com.qmth.distributed.print.common.util.Result;
 import com.qmth.distributed.print.common.util.ResultUtil;
+import org.apache.poi.ss.formula.functions.T;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
 import java.text.MessageFormat;
-import java.util.Date;
-import java.util.Map;
-import java.util.Objects;
-import java.util.StringJoiner;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * @Description: 创建pdf模版
@@ -54,6 +53,7 @@ public class AsyncCreatePdfTempleteService extends AsyncCreateTaskTemplete {
         tbTaskService.updateById(tbTask);
         try {
             TaskLogicService taskLogicService = SpringContextHolder.getBean(TaskLogicService.class);
+            taskLogicService.createPdfPrepose(map);
             taskLogicService.executeCreatePdfLogic(map);
             stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), FINISH_TITLE, map.get("size"), FINISH_SIZE));
             tbTask.setResult(TaskResultEnum.SUCCESS);
@@ -61,6 +61,10 @@ public class AsyncCreatePdfTempleteService extends AsyncCreateTaskTemplete {
             log.error("请求出错", e);
             stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), EXCEPTION_TITLE, EXCEPTION_DATA, e.getMessage()));
             tbTask.setResult(TaskResultEnum.ERROR);
+            TBTask dbTask = tbTaskService.getById(tbTask.getId());
+            if (tbTask.getVersion() == dbTask.getVersion()) {
+                tbTask.setResetCount(new AtomicInteger(tbTask.getResetCount()).incrementAndGet());
+            }
             if (e instanceof ApiException) {
                 ResultUtil.error((ApiException) e, e.getMessage());
             } else {

+ 10 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/TaskLogicService.java

@@ -12,6 +12,14 @@ import java.util.Map;
  */
 public interface TaskLogicService {
 
+    /**
+     * 创建pdf前置条件
+     *
+     * @param map
+     * @return
+     */
+    public Map<String, Object> createPdfPrepose(Map<String, Object> map);
+
     /**
      * 创建pdf逻辑
      *
@@ -41,8 +49,9 @@ public interface TaskLogicService {
 
     /**
      * 处理导出命题任务审核文件
+     *
      * @param map
      * @return
      */
-    public Map<String,Object> executeExportSampleLogic(Map<String,Object> map) throws IOException;
+    public Map<String, Object> executeExportSampleLogic(Map<String, Object> map) throws IOException;
 }

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

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.aliyun.oss.common.utils.BinaryUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.annotation.ExcelDBFieldDesc;
 import com.qmth.distributed.print.business.bean.dto.*;
@@ -115,6 +116,53 @@ public class TaskLogicServiceImpl implements TaskLogicService {
     @Resource
     TBTaskService tbTaskService;
 
+    /**
+     * 创建pdf前置条件
+     *
+     * @param map
+     * @return
+     */
+    @Override
+    @Transactional
+    public Map<String, Object> createPdfPrepose(Map<String, Object> map) {
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        SysUser sysUser = (SysUser) map.get(SystemConstant.USER);
+        Long examDetailId = tbTask.getEntityId();
+        List<Long> examDetailIds = Objects.nonNull(map.get("examDetailIds")) ? (List<Long>) map.get("examDetailIds") : null;
+        //查询printPlan
+        ExamPrintPlan examPrintPlan = examPrintPlanService.getById(tbTask.getPrintPlanId());
+        if (Objects.isNull(examPrintPlan)) {
+            throw ExceptionResultEnum.ERROR.exception("印刷计划为空");
+        }
+        UpdateWrapper<ExamDetail> examDetailQueryWrapper = new UpdateWrapper<>();
+        examDetailQueryWrapper.lambda().eq(ExamDetail::getSchoolId, sysUser.getSchoolId())
+                .eq(ExamDetail::getPrintPlanId, tbTask.getPrintPlanId());
+        if (Objects.nonNull(examDetailId)) {
+            examDetailQueryWrapper.lambda().eq(ExamDetail::getId, examDetailId);
+        } else if (Objects.nonNull(examDetailIds)) {
+            examDetailQueryWrapper.lambda().in(ExamDetail::getId, examDetailIds);
+        }
+        examDetailQueryWrapper.lambda().set(ExamDetail::getStatus, ExamDetailStatusEnum.NEW);
+        detailService.update(examDetailQueryWrapper);
+
+        //所有考场都撤回,印刷任务状态改为就绪
+        QueryWrapper<ExamDetail> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(ExamDetail::getPrintPlanId, tbTask.getPrintPlanId());
+        if (Objects.nonNull(examDetailId)) {
+            queryWrapper.lambda().eq(ExamDetail::getId, examDetailId);
+        } else if (Objects.nonNull(examDetailIds)) {
+            queryWrapper.lambda().in(ExamDetail::getId, examDetailIds);
+        }
+        queryWrapper.lambda().notIn(ExamDetail::getStatus, ExamDetailStatusEnum.NEW, ExamDetailStatusEnum.READY);
+        List<ExamDetail> examDetails = detailService.list(queryWrapper);
+        if (examDetails.isEmpty()) {
+            UpdateWrapper<ExamPrintPlan> printPlanUpdateWrapper = new UpdateWrapper<>();
+            printPlanUpdateWrapper.lambda().set(ExamPrintPlan::getStatus, PrintPlanStatusEnum.READY).eq(ExamPrintPlan::getId, tbTask.getPrintPlanId());
+            examPrintPlanService.update(printPlanUpdateWrapper);
+        }
+        return map;
+    }
+
     /**
      * 创建pdf逻辑
      *
@@ -384,7 +432,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         InputStream inputStream = (InputStream) map.get("inputStream");
         Long printPlanId = tbTask.getPrintPlanId();
         Long schoolId = tbTask.getSchoolId();
-        if (!tbTaskService.countByPrintPlanIdAndEntityId(schoolId,printPlanId,null)){
+        if (!tbTaskService.countByPrintPlanIdAndEntityId(schoolId, printPlanId, null)) {
             throw ExceptionResultEnum.ERROR.exception("当前印刷计划正在生成pdf,无法导入考务数据");
         }
         Long userId = tbTask.getCreateId();

+ 5 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/threadPool/MyThreadPool.java

@@ -1,6 +1,7 @@
 package com.qmth.distributed.print.business.threadPool;//package com.qmth.themis.business.threadPool;
 
 import com.qmth.distributed.print.common.contant.SystemConstant;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@@ -22,6 +23,9 @@ public class MyThreadPool extends ThreadPoolTaskExecutor {
 
     public MyThreadPool arbitratePoolTaskExecutor = null;
 
+    @Value("${sys.config.threadPoolCoreSize}")
+    Integer threadPoolCoreSize;
+
     @PostConstruct
     public void init() {
         arbitrateThreadPool();
@@ -36,7 +40,7 @@ public class MyThreadPool extends ThreadPoolTaskExecutor {
     public Executor arbitrateThreadPool() {
         if (Objects.isNull(arbitratePoolTaskExecutor)) {
             arbitratePoolTaskExecutor = new MyThreadPool();
-            arbitratePoolTaskExecutor.setCorePoolSize(SystemConstant.THREAD_POOL_CORE_POOL_SIZE);//核心线程数
+            arbitratePoolTaskExecutor.setCorePoolSize(threadPoolCoreSize);//核心线程数
             arbitratePoolTaskExecutor.setMaxPoolSize(SystemConstant.THREAD_POOL_MAX_POOL_SIZE);//最大线程数
             arbitratePoolTaskExecutor.setKeepAliveSeconds(SystemConstant.THREAD_POOL_KEEP_ALIVE_SECONDS);//线程空闲时间
             arbitratePoolTaskExecutor.setQueueCapacity(SystemConstant.THREAD_POOL_QUEUE_CAPACITY);//队列容量

+ 2 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/PdfUtil.java

@@ -1,10 +1,7 @@
 package com.qmth.distributed.print.business.util;
 
 import com.itextpdf.text.Document;
-import com.itextpdf.text.pdf.PdfCopy;
-import com.itextpdf.text.pdf.PdfImportedPage;
-import com.itextpdf.text.pdf.PdfReader;
-import com.itextpdf.text.pdf.PdfStamper;
+import com.itextpdf.text.pdf.*;
 import com.qmth.distributed.print.business.bean.dto.PdfDto;
 import com.qmth.distributed.print.business.enums.PageSizeEnum;
 import com.qmth.distributed.print.business.enums.UploadFileEnum;
@@ -61,7 +58,7 @@ public class PdfUtil {
                         .add(File.separator).add(SystemConstant.getUuid()).add(SystemConstant.PDF_PREFIX);
                 outputPath = stringJoiner.toString() + dirName.toString();
             }
-            copy = new PdfCopy(document, new FileOutputStream(outputPath));
+            copy = new PdfSmartCopy(document, new FileOutputStream(outputPath));
             document.open();
             for (int i = 0; i < files.length; i++) {
                 reader = new PdfReader(files[i]);

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/ServletUtil.java

@@ -179,6 +179,15 @@ public class ServletUtil {
         return object;
     }
 
+    /**
+     * 获取请求的学校
+     *
+     * @return
+     */
+    public static Object getRequestSchoolByNotVaild() {
+        return getRequest().getAttribute(SystemConstant.SCHOOL);
+    }
+
     /**
      * 获取请求的机构
      *

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

@@ -1569,6 +1569,8 @@ CREATE TABLE `t_b_task`  (
   `print_plan_id` bigint(20) NULL DEFAULT NULL COMMENT '印刷计划id',
   `remark` mediumtext COMMENT '备注',
   `obj_name` varchar(500) DEFAULT NULL COMMENT '实体名称',
+  `reset_count` int DEFAULT '0' COMMENT '重试次数',
+  `version` int DEFAULT '0' COMMENT '更新版本号',
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '导入导出任务表' ROW_FORMAT = Dynamic;
 

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

@@ -138,7 +138,7 @@
             <if test="packageCode != null and packageCode.length > 0">
                 AND det.package_code = #{packageCode}
             </if>
-            <if test="orgIds != null">
+            <if test="orgIds != null and orgIds.size() > 0">
                 AND b.org_id IN
                 <foreach collection="orgIds" item="item" index="index" open="(" separator="," close=")">
                     #{item}

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

@@ -20,7 +20,8 @@
             where
             t.id = tbt.create_id) as createName,
             if(ISNULL(tbt.result_file_path),false,true) as hasResultFile,
-            if(ISNULL(tbt.report_file_path),false,true) as hasReportFile
+            if(ISNULL(tbt.report_file_path),false,true) as hasReportFile,
+            tbt.reset_count as resetCount
             from
             t_b_task tbt
             left join exam_print_plan epp on

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

@@ -60,6 +60,7 @@ public class SystemConstant {
     public static final int PAGE_SIZE = 10000000;
     public static final int ALL_CARD = -1;
     public static final String DELIMITER = ":";
+//    public static final int MAX_RETRY_CREATE_PDF_COUNT = 5;
 
     /**
      * oss url过期时间
@@ -125,7 +126,7 @@ public class SystemConstant {
      * 线程池配置
      */
     public static final String THREAD_POOL_NAME = "arbitrateThreadPool";
-    public static final int THREAD_POOL_CORE_POOL_SIZE = 5;
+//    public static final int THREAD_POOL_CORE_POOL_SIZE = 5;
     public static final int THREAD_POOL_MAX_POOL_SIZE = 100;
     public static final int THREAD_POOL_KEEP_ALIVE_SECONDS = 10;
     public static final int THREAD_POOL_QUEUE_CAPACITY = 500;

+ 5 - 1
distributed-print-task/src/main/java/com/qmth/distributed/print/task/enums/JobEnum.java

@@ -13,7 +13,11 @@ public enum JobEnum {
 
     TIMED_SYNC_SCHOOL_JOB("学校信息同步定时任务"),
 
-    TIMED_TASK_JOB_GROUP("定时任务job组");
+    TIMED_TASK_JOB_GROUP("定时任务job组"),
+
+    RESET_CREATE_PDF_JOB("重新生成pdf定时任务"),
+
+    RESET_CREATE_PDF_JOB_GROUP("重新生成pdfjob组");
 
     private String title;
 

+ 31 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/ResetCreatePdfJob.java

@@ -0,0 +1,31 @@
+package com.qmth.distributed.print.task.job;
+
+import com.qmth.distributed.print.task.job.service.JobService;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+
+/**
+ * @Description: 重新生成pdf job
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/5/6
+ */
+public class ResetCreatePdfJob extends QuartzJobBean {
+
+    @Resource
+    JobService jobService;
+
+    @Override
+    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        try {
+            jobService.resetCreatePdfTask();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 13 - 6
distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/JobService.java

@@ -3,12 +3,12 @@ package com.qmth.distributed.print.task.job.service;
 import java.io.IOException;
 
 /**
-* @Description: job service
-* @Param:  
-* @return:  
-* @Author: wangliang
-* @Date: 2021/3/31 
-*/ 
+ * @Description: job service
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/31
+ */
 public interface JobService {
 
     /**
@@ -20,4 +20,11 @@ public interface JobService {
      * 更新印刷计划状态
      */
     void updatePrintPlan();
+
+    /**
+     * 重新生成pdf失败任务
+     *
+     * @throws IOException
+     */
+    void resetCreatePdfTask() throws IOException;
 }

+ 14 - 1
distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/impl/JobServiceImpl.java

@@ -7,6 +7,7 @@ import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.service.ExamDetailService;
 import com.qmth.distributed.print.business.service.ExamPrintPlanService;
 import com.qmth.distributed.print.business.service.OrgCenterDataDisposeService;
+import com.qmth.distributed.print.business.service.TBTaskService;
 import com.qmth.distributed.print.task.job.service.JobService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -15,7 +16,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
 
@@ -39,6 +39,9 @@ public class JobServiceImpl implements JobService {
     @Resource
     ExamDetailService examDetailService;
 
+    @Resource
+    TBTaskService tbTaskService;
+
     @Override
     public void updateSchoolInfo() throws IOException {
         orgCenterDataDisposeService.updateSchoolInfo();
@@ -68,4 +71,14 @@ public class JobServiceImpl implements JobService {
         }
         examPrintPlanService.saveOrUpdateBatch(examPrintPlanList);
     }
+
+    /**
+     * 重新生成pdf失败任务
+     *
+     * @throws IOException
+     */
+    @Override
+    public void resetCreatePdfTask() throws IOException {
+        tbTaskService.resetCreatePdfTask();
+    }
 }

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

@@ -1,8 +1,6 @@
 package com.qmth.distributed.print.api;
 
 
-import com.qmth.boot.api.annotation.Aac;
-import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.bean.result.EditResult;
 import com.qmth.distributed.print.business.entity.TBTask;
@@ -27,7 +25,6 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.io.IOException;
-import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
@@ -54,8 +51,7 @@ public class ExamDetailController {
     private ExamDetailService examDetailService;
     @Resource
     private CommonService commonService;
-
-    @Autowired
+    @Resource
     private ExamStudentService examStudentService;
 
     @ApiOperation(value = "异步考务数据批量导入接口")
@@ -173,7 +169,7 @@ public class ExamDetailController {
                            @ApiParam(value = "考场") @RequestParam(required = false) String examRoom,
                            @ApiParam(value = "卷袋号") @RequestParam(required = false) String packageCode) {
         Set<Long> orgIds = commonService.listSubOrgIds(null);
-        Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.EXAMINATION_EXPORT);
+        Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.EXAMINATION_EXPORT,SystemConstant.convertIdToLong(printPlanId));
         map.put("printPlanId",printPlanId);
         map.put("courseCode",courseCode);
         map.put("paperNumber",paperNumber);

+ 49 - 5
distributed-print/src/main/java/com/qmth/distributed/print/api/TBTaskController.java

@@ -1,17 +1,24 @@
 package com.qmth.distributed.print.api;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.qmth.boot.api.annotation.Aac;
-import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
-import com.qmth.boot.core.enums.Platform;
+import com.qmth.distributed.print.business.bean.params.ArraysParams;
+import com.qmth.distributed.print.business.bean.result.EditResult;
 import com.qmth.distributed.print.business.bean.result.TaskListResult;
+import com.qmth.distributed.print.business.config.DictionaryConfig;
+import com.qmth.distributed.print.business.entity.SysUser;
+import com.qmth.distributed.print.business.entity.TBTask;
 import com.qmth.distributed.print.business.enums.TaskResultEnum;
 import com.qmth.distributed.print.business.enums.TaskStatusEnum;
 import com.qmth.distributed.print.business.enums.TaskTypeEnum;
 import com.qmth.distributed.print.business.service.TBTaskService;
+import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTempleteService;
 import com.qmth.distributed.print.business.util.ServletUtil;
 import com.qmth.distributed.print.common.contant.SystemConstant;
+import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
 import com.qmth.distributed.print.common.util.Result;
 import com.qmth.distributed.print.common.util.ResultUtil;
 import io.swagger.annotations.*;
@@ -21,7 +28,9 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
-import java.util.Objects;
+import java.io.IOException;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * <p>
@@ -39,6 +48,12 @@ public class TBTaskController {
     @Resource
     TBTaskService tbTaskService;
 
+    @Resource
+    DictionaryConfig dictionaryConfig;
+
+    @Resource
+    AsyncCreatePdfTempleteService asyncCreatePdfTempleteService;
+
     @ApiOperation(value = "任务管理查询接口")
     @RequestMapping(value = "/task/query", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "任务管理列表信息", response = TaskListResult.class)})
@@ -48,7 +63,36 @@ public class TBTaskController {
                             @ApiParam(value = "任务数据结果", required = false) @RequestParam(required = false) TaskResultEnum result,
                             @ApiParam(value = "分页页码", required = true) @RequestParam int pageNumber,
                             @ApiParam(value = "分页数", required = true) @RequestParam int pageSize) {
-        return ResultUtil.ok(tbTaskService.query(new Page<>(pageNumber, pageSize), Objects.nonNull(ServletUtil.getRequestHeaderSchoolId()) ? Long.parseLong(ServletUtil.getRequestHeaderSchoolId().toString()) : null, SystemConstant.convertIdToLong(printPlanId), status, type, result));
+        IPage<TaskListResult> taskListResultIPage = tbTaskService.query(new Page<>(pageNumber, pageSize), Objects.nonNull(ServletUtil.getRequestHeaderSchoolId()) ? Long.parseLong(ServletUtil.getRequestHeaderSchoolId().toString()) : null, SystemConstant.convertIdToLong(printPlanId), status, type, result);
+        if (Objects.nonNull(taskListResultIPage) && Objects.nonNull(taskListResultIPage.getRecords()) && taskListResultIPage.getRecords().size() > 0) {
+            List<TaskListResult> taskListResultList = taskListResultIPage.getRecords();
+            for (TaskListResult taskListResult : taskListResultList) {
+                if (Objects.equals(taskListResult.getStatus(), TaskStatusEnum.FINISH.getTitle()) && Objects.equals(taskListResult.getResult(), TaskResultEnum.ERROR.getTitle()) && taskListResult.getResetCount() >= dictionaryConfig.sysDomain().getAutoCreatePdfResetMaxCount()) {
+                    taskListResult.setResetCreatePdf(true);
+                }
+            }
+        }
+        return ResultUtil.ok(taskListResultIPage);
+    }
+
+    @ApiOperation(value = "重新生成pdf")
+    @RequestMapping(value = "/task/reset_create_pdf", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "重新生成pdf", response = EditResult.class)})
+    public Result resetCreatePdf(@ApiParam(value = "任务id", required = true) @RequestParam String id) throws IOException {
+        Long taskId = Long.parseLong(id);
+        TBTask tbTask = tbTaskService.getById(taskId);
+        tbTask.setVersion(new AtomicInteger(tbTask.getVersion()).incrementAndGet());
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        Map<String, Object> map = new HashMap<>();
+        if (Objects.nonNull(tbTask.getRemark())) {
+            JSONArray jsonArray = JSONArray.parseArray(tbTask.getRemark());
+            ArraysParams arraysParams = new ArraysParams(jsonArray.toArray(new Long[jsonArray.size()]));
+            map.computeIfAbsent("examDetailCourseIds", v -> Arrays.asList(arraysParams.getIds()));
+        }
+        map.computeIfAbsent(SystemConstant.TASK, v -> tbTask);
+        map.computeIfAbsent(SystemConstant.USER, v -> sysUser);
+        asyncCreatePdfTempleteService.createPdf(map, null);
+        return ResultUtil.ok(new EditResult());
     }
 
 //    @ApiOperation(value = "任务管理_批量删除&清空接口")

+ 9 - 0
distributed-print/src/main/java/com/qmth/distributed/print/start/StartRunning.java

@@ -4,6 +4,7 @@ import com.qmth.distributed.print.business.service.OrgCenterDataDisposeService;
 import com.qmth.distributed.print.business.service.TBTaskService;
 import com.qmth.distributed.print.common.contant.SystemConstant;
 import com.qmth.distributed.print.task.enums.JobEnum;
+import com.qmth.distributed.print.task.job.ResetCreatePdfJob;
 import com.qmth.distributed.print.task.job.TimedSyncSchoolJob;
 import com.qmth.distributed.print.task.service.QuartzService;
 import org.slf4j.Logger;
@@ -51,6 +52,14 @@ public class StartRunning implements CommandLineRunner {
         quartzService.addJob(TimedSyncSchoolJob.class, JobEnum.TIMED_SYNC_SCHOOL_JOB.name(), JobEnum.TIMED_TASK_JOB_GROUP.name(), "0 0 0 * * ?", schoolJobMap);
         log.info("增加学校信息同步定时任务 end");
 
+        log.info("增加重新生成pdf定时任务 start");
+        Map taskJobMap = new HashMap();
+        schoolJobMap.computeIfAbsent("name", v -> ResetCreatePdfJob.class.getName());
+        quartzService.deleteJob(JobEnum.RESET_CREATE_PDF_JOB.name(), JobEnum.RESET_CREATE_PDF_JOB_GROUP.name());
+        // 每天0点定时任务
+        quartzService.addJob(ResetCreatePdfJob.class, JobEnum.RESET_CREATE_PDF_JOB.name(), JobEnum.RESET_CREATE_PDF_JOB_GROUP.name(), "0 0/1 * * * ?", taskJobMap);
+        log.info("增加重新生成pdf定时任务 end");
+
         log.info("服务器启动时执行 end");
     }
 }

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

@@ -12,7 +12,7 @@ spring.application.name=distributed-print
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.port=3306
-db.name=distributed_print
+db.name=distributed-136
 db.username=root
 db.password=123456789
 
@@ -57,6 +57,8 @@ 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=5
 spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/META-INF/resources/,classpath:/resources/
 
 org.center.url=https://solar.qmth.com.cn

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

@@ -80,7 +80,7 @@ public class ServiceTest {
         String mobileNumber = "18903719928";
         Long businessId = 1L;
         Map<String, String> jsonMap = new HashMap<>();
-        jsonMap.put("name", "张三");
+        jsonMap.put("userName", "张三");
         jsonMap.put("courseName", "数学");
         jsonMap.put("paperNumber", "SX001");
         String variableParams = JSON.toJSONString(jsonMap);