Explorar o código

加入重新生成pdf逻辑

wangliang %!s(int64=4) %!d(string=hai) anos
pai
achega
a691d45c1d
Modificáronse 13 ficheiros con 219 adicións e 14 borrados
  1. 26 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TBTask.java
  2. 8 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TBTaskService.java
  3. 36 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBTaskServiceImpl.java
  4. 8 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCreatePdfTempleteService.java
  5. 10 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/TaskLogicService.java
  6. 49 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  7. 9 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/ServletUtil.java
  8. 1 0
      distributed-print-common/src/main/java/com/qmth/distributed/print/common/contant/SystemConstant.java
  9. 5 1
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/enums/JobEnum.java
  10. 31 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/ResetCreatePdfJob.java
  11. 13 6
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/JobService.java
  12. 14 1
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/impl/JobServiceImpl.java
  13. 9 0
      distributed-print/src/main/java/com/qmth/distributed/print/start/StartRunning.java

+ 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;
 }

+ 36 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBTaskServiceImpl.java

@@ -16,7 +16,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 +29,12 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * <p>
@@ -49,6 +53,12 @@ public class TBTaskServiceImpl extends ServiceImpl<TBTaskMapper, TBTask> impleme
     @Resource
     TBTaskMapper tbTaskMapper;
 
+    @Resource
+    AsyncCreatePdfTempleteService asyncCreatePdfTempleteService;
+
+    @Resource
+    SysUserService sysUserService;
+
     /**
      * 保存任务
      *
@@ -309,6 +319,32 @@ 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() < SystemConstant.MAX_RETRY_CREATE_PDF_COUNT) {
+                    Map<String, Object> map = new HashMap<>();
+                    tbTask.setVersion(new AtomicInteger(tbTask.getVersion()).incrementAndGet());
+                    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();

+ 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);
+    }
+
     /**
      * 获取请求的机构
      *

+ 1 - 0
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 = 6;
 
     /**
      * oss url过期时间

+ 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();
+    }
 }

+ 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");
     }
 }