Quellcode durchsuchen

Merge branch 'dev' into release
commit by wangliang

wangliang vor 4 Jahren
Ursprung
Commit
057c2cf9fb
23 geänderte Dateien mit 440 neuen und 97 gelöschten Zeilen
  1. 8 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/ArraysParams.java
  2. 53 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/SerialNumberParams.java
  3. 13 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TBTask.java
  4. 0 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/TaskTypeEnum.java
  5. 3 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailService.java
  6. 11 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TBTaskService.java
  7. 3 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  8. 28 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBTaskServiceImpl.java
  9. 66 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncDownloadPdfTempleteService.java
  10. 0 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/export/AsyncExportTaskTemplete.java
  11. 12 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/TaskLogicService.java
  12. 124 24
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  13. 13 9
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/ConvertUtil.java
  14. 1 1
      distributed-print-common/src/main/java/com/qmth/distributed/print/common/contant/SystemConstant.java
  15. 2 2
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/enums/JobEnum.java
  16. 0 26
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/TestJob.java
  17. 28 0
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/TimedSyncSchoolJob.java
  18. 7 2
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/JobService.java
  19. 5 5
      distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/impl/JobServiceImpl.java
  20. 18 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/ClientController.java
  21. 30 4
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPrintPlanController.java
  22. 14 8
      distributed-print/src/main/java/com/qmth/distributed/print/start/StartRunning.java
  23. 1 0
      distributed-print/src/main/resources/application.properties

+ 8 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/ArraysParams.java

@@ -21,6 +21,14 @@ public class ArraysParams implements Serializable {
     @NotEmpty(message = "id不能为空")
     Long[] ids;
 
+    public ArraysParams() {
+
+    }
+
+    public ArraysParams(Long[] ids) {
+        this.ids = ids;
+    }
+
     public Long[] getIds() {
         return ids;
     }

+ 53 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/SerialNumberParams.java

@@ -0,0 +1,53 @@
+package com.qmth.distributed.print.business.bean.params;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: redis生成序列号参数类
+ * @Author: CaoZixuan
+ * @Date: 2021-04-19
+ */
+public class SerialNumberParams {
+
+    @ApiModelProperty(value = "序列号所属模块")
+    private String model;
+
+    @ApiModelProperty(value = "序列号前缀(序列号模块加前缀作为key)")
+    private String prefix;
+
+    @ApiModelProperty(value = "补齐位数")
+    private int digit;
+
+    public SerialNumberParams(String model, String prefix, int digit) {
+        this.model = model;
+        this.prefix = prefix;
+        this.digit = digit;
+    }
+
+    public SerialNumberParams() {
+    }
+
+    public String getModel() {
+        return model;
+    }
+
+    public void setModel(String model) {
+        this.model = model;
+    }
+
+    public String getPrefix() {
+        return prefix;
+    }
+
+    public void setPrefix(String prefix) {
+        this.prefix = prefix;
+    }
+
+    public int getDigit() {
+        return digit;
+    }
+
+    public void setDigit(int digit) {
+        this.digit = digit;
+    }
+}

+ 13 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TBTask.java

@@ -32,7 +32,7 @@ public class TBTask implements Serializable {
     @TableId(value = "id")
     private Long id;
 
-    @ApiModelProperty(value = "任务类型,USER_IMPORT:用户导入,QUESTION_MISSION_BATCH_CREATE:批量新建命题任务,SAMPLE_EXPORT:导出审核样本,PAPER_DOWNLOAD:卷库下载,EXAMINATION_IMPORT:考务数据导入,EXAMINATION_EXPORT:考务数据导出,PRINT_PDF_DOWNLOAD:批量下载pdf,CREATE_PDF:生成pdf")
+    @ApiModelProperty(value = "任务类型,QUESTION_MISSION_BATCH_CREATE:批量新建命题任务,SAMPLE_EXPORT:导出审核样本,EXAMINATION_IMPORT:考务数据导入,EXAMINATION_EXPORT:考务数据导出,PRINT_PDF_DOWNLOAD:批量下载pdf,CREATE_PDF:生成pdf")
     @TableField(value = "type")
     private TaskTypeEnum type;
 
@@ -101,6 +101,18 @@ public class TBTask implements Serializable {
     @TableField("create_id")
     private Long createId;
 
+    @ApiModelProperty(value = "备注")
+    @TableField(value = "remark")
+    private String remark;
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
     public Long getPrintPlanId() {
         return printPlanId;
     }

+ 0 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/TaskTypeEnum.java

@@ -11,14 +11,10 @@ import java.util.Objects;
  */
 public enum TaskTypeEnum {
 
-    USER_IMPORT("用户导入"),
-
     QUESTION_MISSION_BATCH_CREATE("批量新建命题任务"),
 
     SAMPLE_EXPORT("导出审核样本"),
 
-    PAPER_DOWNLOAD("卷库下载"),
-
     EXAMINATION_IMPORT("考务数据导入"),
 
     EXAMINATION_EXPORT("考务数据导出"),

+ 3 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailService.java

@@ -6,6 +6,7 @@ import com.qmth.distributed.print.business.bean.dto.ExaminationExportDto;
 import com.qmth.distributed.print.business.bean.dto.FieldsDto;
 import com.qmth.distributed.print.business.bean.dto.PrintTaskDto;
 import com.qmth.distributed.print.business.bean.dto.PrintTaskTotalDto;
+import com.qmth.distributed.print.business.bean.params.SerialNumberParams;
 import com.qmth.distributed.print.business.bean.result.ExaminationDetailResult;
 import com.qmth.distributed.print.business.bean.result.ExaminationResult;
 import com.qmth.distributed.print.business.bean.result.SummarizedDataResult;
@@ -131,8 +132,9 @@ public interface ExamDetailService extends IService<ExamDetail> {
      * 根据考务数据Excel数据处理考务-场次表
      * @param dataList Excel处理后的数据
      * @param userId 当前用户id
+     * @param serialNumberParams 序列号生成参数
      */
-    void disposeExamDetailByExaminationExcel(List<Map<String, Object>> dataList, Long userId);
+    void disposeExamDetailByExaminationExcel(List<Map<String, Object>> dataList, Long userId, SerialNumberParams serialNumberParams);
 
     /**
      * 根据考务数据Excel数据处理考务-科目表

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

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.business.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.distributed.print.business.bean.params.ArraysParams;
 import com.qmth.distributed.print.business.bean.result.TaskListResult;
 import com.qmth.distributed.print.business.entity.SysUser;
 import com.qmth.distributed.print.business.entity.TBTask;
@@ -99,6 +100,16 @@ public interface TBTaskService extends IService<TBTask> {
      */
     public Map<String, Object> saveTask(TaskTypeEnum taskTypeEnum, Long printPlanId, SysUser sysUser);
 
+    /**
+     * 保存任务
+     *
+     * @param taskTypeEnum
+     * @param arraysParams
+     * @param sysUser
+     * @return
+     */
+    public Map<String, Object> saveTask(TaskTypeEnum taskTypeEnum, ArraysParams arraysParams, SysUser sysUser);
+
     /**
      * 查询任务列表
      *

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

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.distributed.print.business.bean.dto.*;
+import com.qmth.distributed.print.business.bean.params.SerialNumberParams;
 import com.qmth.distributed.print.business.bean.result.ExaminationDetailResult;
 import com.qmth.distributed.print.business.bean.result.ExaminationResult;
 import com.qmth.distributed.print.business.bean.result.SummarizedDataResult;
@@ -342,7 +343,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void disposeExamDetailByExaminationExcel(List<Map<String, Object>> dataList, Long userId) {
+    public void disposeExamDetailByExaminationExcel(List<Map<String, Object>> dataList, Long userId, SerialNumberParams serialNumberParams) {
         List<Map<String, Object>> examDetailKeyList = dataList.stream().flatMap(e -> {
             Map<String, Object> map = new HashMap<>();
             map.put("schoolId", e.get("schoolId"));
@@ -374,7 +375,7 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
             System.out.println("totalSubjects" + totalSubjects);
             ExamDetail examDetail = new ExamDetail();
             examDetail.setId(SystemConstant.getDbUuid());
-            examDetail.setPackageCode(convertUtil.getIncre("x", "packageCode"));
+            examDetail.setPackageCode(convertUtil.getIncre(serialNumberParams.getPrefix(),serialNumberParams.getModel(),serialNumberParams.getDigit()));
             examDetail.setSchoolId(Long.valueOf(String.valueOf(map.get("schoolId"))));
             examDetail.setPrintPlanId(Long.valueOf(String.valueOf(map.get("printPlanId"))));
             examDetail.setPrintPlanName(String.valueOf(map.get("printPlanName")));

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

@@ -3,6 +3,7 @@ package com.qmth.distributed.print.business.service.impl;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 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.entity.BasicAttachment;
 import com.qmth.distributed.print.business.entity.SysUser;
@@ -17,6 +18,7 @@ import com.qmth.distributed.print.business.service.TBTaskService;
 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.JacksonUtil;
 import com.qmth.distributed.print.common.util.ResultUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -219,6 +221,32 @@ public class TBTaskServiceImpl extends ServiceImpl<TBTaskMapper, TBTask> impleme
         return map;
     }
 
+    /**
+     * 保存任务
+     *
+     * @param taskTypeEnum
+     * @param arraysParams
+     * @param sysUser
+     * @return
+     */
+    @Override
+    public Map<String, Object> saveTask(TaskTypeEnum taskTypeEnum, ArraysParams arraysParams, SysUser sysUser) {
+        Map<String, Object> map = new HashMap<>();
+        try {
+            TBTask tbTask = saveTaskCommon(null, taskTypeEnum, map, sysUser);
+            tbTask.setRemark(JacksonUtil.parseJson(arraysParams.getIds()));
+            this.save(tbTask);
+        } catch (Exception e) {
+            log.error("请求出错", e);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        }
+        return map;
+    }
+
     /**
      * 查询任务列表
      *

+ 66 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncDownloadPdfTempleteService.java

@@ -0,0 +1,66 @@
+package com.qmth.distributed.print.business.templete.execute;
+
+import com.qmth.boot.api.exception.ApiException;
+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.templete.export.AsyncExportTaskTemplete;
+import com.qmth.distributed.print.business.templete.service.TaskLogicService;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.text.MessageFormat;
+import java.util.Map;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * @Description: 异步下载pdf模版
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/4/19
+ */
+@Service
+public class AsyncDownloadPdfTempleteService extends AsyncExportTaskTemplete {
+    private final static Logger log = LoggerFactory.getLogger(AsyncCreatePdfTempleteService.class);
+
+    static final String OBJ_TITLE = "zip数据";
+    /**
+     * 下载pdf
+     *
+     * @param map
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public Result exportTask(Map<String, Object> map) throws Exception {
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        StringJoiner stringJoinerSummary = new StringJoiner("\n").add(MessageFormat.format("{0}{1}{2}", FORMAT_TIME, BEGIN_TITLE, OBJ_TITLE));
+        tbTask.setStatus(TaskStatusEnum.RUNNING);
+        try {
+            TaskLogicService taskLogicService = SpringContextHolder.getBean(TaskLogicService.class);
+            taskLogicService.executeDownloadPdfLogic(map);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", FORMAT_TIME, FINISH_TITLE, map.get("size"), FINISH_SIZE));
+            tbTask.setResult(TaskResultEnum.SUCCESS);
+        } catch (Exception e) {
+            log.error("请求出错", e);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", FORMAT_TIME, EXCEPTION_TITLE, EXCEPTION_DATA, e.getMessage()));
+            tbTask.setResult(TaskResultEnum.ERROR);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {//生成txt文件
+            tbTask.setSummary(stringJoinerSummary.toString());
+            super.createTxt(tbTask);
+        }
+        return ResultUtil.ok(map);
+    }
+}

+ 0 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/export/AsyncExportTaskTemplete.java

@@ -97,8 +97,6 @@ public abstract class AsyncExportTaskTemplete {
             json.put(SystemConstant.TYPE, type);
             json.put(SystemConstant.UPLOAD_TYPE, UploadFileEnum.FILE);
             String result = json.toJSONString();
-            System.out.println(result);
-
             tbTask.setReportFilePath(json.toJSONString());
         } catch (Exception e) {
             log.error("请求出错", e);
@@ -124,7 +122,6 @@ public abstract class AsyncExportTaskTemplete {
                 e.printStackTrace();
             }
             tbTask.setStatus(TaskStatusEnum.FINISH);
-            System.out.println(tbTask);
             tbTaskService.updateById(tbTask);
         }
     }

+ 12 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/TaskLogicService.java

@@ -1,9 +1,6 @@
 package com.qmth.distributed.print.business.templete.service;
 
-import org.springframework.util.LinkedMultiValueMap;
-
 import java.io.IOException;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -25,10 +22,20 @@ public interface TaskLogicService {
 
     /**
      * 处理考务数据逻辑
+     *
      * @param map 参数
      * @return 要导出的考务数据
      */
-    public Map<String,Object> executeExaminationLogic(Map<String, Object> map) throws Exception;
+    public Map<String, Object> executeExaminationLogic(Map<String, Object> map) throws Exception;
 
-    public Map<String,Object> executeImportExaminationLogic(Map<String, Object> map) throws IOException, Exception;
+    public Map<String, Object> executeImportExaminationLogic(Map<String, Object> map) throws IOException, Exception;
+
+    /**
+     * 下载pdf
+     *
+     * @param map
+     * @return
+     * @throws IOException
+     */
+    public Map<String, Object> executeDownloadPdfLogic(Map<String, Object> map) throws Exception;
 }

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

@@ -3,11 +3,14 @@ package com.qmth.distributed.print.business.templete.service.impl;
 import com.alibaba.fastjson.JSON;
 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.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.dto.ExaminationExportDto;
 import com.qmth.distributed.print.business.bean.dto.FieldsDto;
 import com.qmth.distributed.print.business.bean.dto.PdfDto;
+import com.qmth.distributed.print.business.bean.params.ArraysParams;
+import com.qmth.distributed.print.business.bean.params.SerialNumberParams;
 import com.qmth.distributed.print.business.entity.*;
 import com.qmth.distributed.print.business.enums.ExamStatusEnum;
 import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
@@ -20,12 +23,20 @@ import com.qmth.distributed.print.business.util.ExcelUtil;
 import com.qmth.distributed.print.business.util.OssUtil;
 import com.qmth.distributed.print.common.contant.SystemConstant;
 import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
+import com.qmth.distributed.print.common.util.FileUtil;
+import com.qmth.distributed.print.common.util.HexUtils;
 import com.qmth.distributed.print.common.util.ResultUtil;
+import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.support.atomic.RedisAtomicLong;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -92,6 +103,9 @@ public class TaskLogicServiceImpl implements TaskLogicService {
     @Resource
     CreatePdfUtil createPdfUtil;
 
+    @Resource
+    RedisTemplate<String, Object> redisTemplate;
+
     /**
      * 创建pdf逻辑
      *
@@ -317,7 +331,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         return map;
     }
 
-    @Transactional(rollbackFor = Exception.class)
+    @Transactional
     @Override
     public Map<String, Object> executeImportExaminationLogic(Map<String, Object> map) throws Exception {
         TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
@@ -474,29 +488,115 @@ public class TaskLogicServiceImpl implements TaskLogicService {
 
         // 删除印刷计划下的考务数据
         examDetailService.deleteExaminationData(printPlanId);
-        // 组装exam_detail数据
-        examDetailService.disposeExamDetailByExaminationExcel(dataList, userId);
-        // 组装exam_detail_course数据
-        examDetailService.disposeExamDetailCourseByExaminationExcel(dataList, userId);
-        // 组装exam_student数据
-        examDetailService.disposeExamStudentByExaminationExcel(dataList, userId);
-
-        List<Map<String, Object>> checkList = dataList.stream().flatMap(e -> {
-            Map<String, Object> tmp = new HashMap<>();
-            tmp.put("schoolId", e.get("schoolId"));
-            tmp.put("courseCode", e.get("courseCode"));
-            tmp.put("paperNumber", e.get("paperNumber"));
-            return Stream.of(tmp);
-        }).distinct().collect(Collectors.toList());
-        for (Map<String, Object> stringObjectMap : checkList) {
-            Long checkSchoolId = SystemConstant.convertIdToLong(String.valueOf(stringObjectMap.get("schoolId")));
-            String checkCourseCode = String.valueOf(stringObjectMap.get("courseCode"));
-            String checkPaperNumber = String.valueOf(stringObjectMap.get("paperNumber"));
-            SysUser user = (SysUser) map.get(SystemConstant.USER);
-            user.setSchoolId(schoolId);
-            commonService.checkData(checkSchoolId, checkCourseCode, checkPaperNumber, user);
+
+
+        SerialNumberParams serialNumberParams = new SerialNumberParams("packageCode-", "p", 6);
+        String key = serialNumberParams.getModel() + serialNumberParams.getPrefix();
+        RedisAtomicLong counter = new RedisAtomicLong(key, Objects.requireNonNull(redisTemplate.getConnectionFactory()));
+        Long value = counter.get();
+        try {
+            // 组装exam_detail数据
+            examDetailService.disposeExamDetailByExaminationExcel(dataList, userId, serialNumberParams);
+            // 组装exam_detail_course数据
+            examDetailService.disposeExamDetailCourseByExaminationExcel(dataList, userId);
+            // 组装exam_student数据
+            examDetailService.disposeExamStudentByExaminationExcel(dataList, userId);
+
+            List<Map<String, Object>> checkList = dataList.stream().flatMap(e -> {
+                Map<String, Object> tmp = new HashMap<>();
+                tmp.put("schoolId", e.get("schoolId"));
+                tmp.put("courseCode", e.get("courseCode"));
+                tmp.put("paperNumber", e.get("paperNumber"));
+                return Stream.of(tmp);
+            }).distinct().collect(Collectors.toList());
+            for (Map<String, Object> stringObjectMap : checkList) {
+                Long checkSchoolId = SystemConstant.convertIdToLong(String.valueOf(stringObjectMap.get("schoolId")));
+                String checkCourseCode = String.valueOf(stringObjectMap.get("courseCode"));
+                String checkPaperNumber = String.valueOf(stringObjectMap.get("paperNumber"));
+                SysUser user = (SysUser) map.get(SystemConstant.USER);
+                user.setSchoolId(schoolId);
+                commonService.checkData(checkSchoolId, checkCourseCode, checkPaperNumber, user);
+            }
+            map.put("dataCount", dataList.size());
+        } catch (Exception e) {
+            redisTemplate.opsForValue().set(key, value);
+            throw new RuntimeException(e);
+        }
+
+        return map;
+    }
+
+    /**
+     * 下载pdf
+     *
+     * @param map
+     * @return
+     * @throws IOException
+     */
+    @Override
+    @Transactional
+    public Map<String, Object> executeDownloadPdfLogic(Map<String, Object> map) throws Exception {
+        try {
+            TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+            JSONArray jsonArray = JSONArray.parseArray(tbTask.getRemark());
+            ArraysParams arraysParams = new ArraysParams(jsonArray.toArray(new Long[jsonArray.size()]));
+            if (Objects.isNull(arraysParams) || arraysParams.getIds().length == 0) {
+                throw ExceptionResultEnum.ERROR.exception("数组id为空");
+            }
+
+            //查询examDetail
+            QueryWrapper<ExamDetail> examDetailQueryWrapper = new QueryWrapper<>();
+            examDetailQueryWrapper.lambda().in(ExamDetail::getPrintPlanId, arraysParams.getIds());
+            List<ExamDetail> examDetailList = examDetailService.list(examDetailQueryWrapper);
+            if (Objects.nonNull(examDetailList)) {
+                Set<Long> attachmentIds = examDetailList.stream().map(ExamDetail::getAttachmentId).collect(Collectors.toSet());
+                List<BasicAttachment> basicAttachmentList = basicAttachmentService.listByIds(attachmentIds);
+
+                if (Objects.nonNull(basicAttachmentList)) {
+                    LocalDateTime nowTime = LocalDateTime.now();
+                    StringJoiner stringJoiner = new StringJoiner("")
+                            .add(SystemConstant.TEMP_FILES_DIR).add(File.separator);
+                    StringJoiner dirName = new StringJoiner("")
+                            .add(UploadFileEnum.FILE.getTitle()).add(File.separator)
+                            .add(String.valueOf(nowTime.getYear())).add(File.separator)
+                            .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
+                            .add(String.format("%02d", nowTime.getDayOfMonth()))
+                            .add(File.separator).add(SystemConstant.getUuid()).add(SystemConstant.ZIP_PREFIX);
+                    File zipFile = new File(stringJoiner.toString() + dirName.toString());
+                    if (!zipFile.getParentFile().exists()) {
+                        zipFile.getParentFile().mkdirs();
+                        zipFile.createNewFile();
+                    }
+                    List<File> sourceFiles = new ArrayList<>();
+                    for (BasicAttachment basicAttachment : basicAttachmentList) {
+                        JSONObject jsonObject = JSONObject.parseObject(basicAttachment.getPath());
+                        StringJoiner stringJoinerPdf = new StringJoiner("")
+                                .add(SystemConstant.TEMP_FILES_DIR).add(File.separator)
+                                .add((String) jsonObject.get("path"));
+                        sourceFiles.add(ossUtil.ossDownload((String) jsonObject.get("path"), stringJoinerPdf.toString()));
+                    }
+                    FileUtil.doZip(zipFile, sourceFiles);
+                    ossUtil.ossUpload(dirName.toString(), zipFile, BinaryUtil.toBase64String(HexUtils.decodeHex(DigestUtils.md5Hex(new FileInputStream(zipFile)))));
+                    JSONObject jsonObject = new JSONObject();
+                    jsonObject.put(SystemConstant.PATH, dirName.toString());
+                    jsonObject.put(SystemConstant.TYPE, SystemConstant.OSS);
+                    jsonObject.put(SystemConstant.UPLOAD_TYPE, UploadFileEnum.FILE);
+                    tbTask.setResultFilePath(jsonObject.toJSONString());
+                    for (File file : sourceFiles) {
+                        file.delete();
+                    }
+                    zipFile.delete();
+                }
+                map.computeIfAbsent(SystemConstant.SIZE, v -> attachmentIds.size());
+            }
+        } catch (Exception e) {
+            log.error("请求出错", e);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
         }
-        map.put("dataCount", dataList.size());
         return map;
     }
 }

+ 13 - 9
distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/ConvertUtil.java

@@ -131,23 +131,27 @@ public class ConvertUtil {
 
 
     /**
-     * 获取递增的序列号
-     *
-     * @param prefix 生成序列号的前缀
-     * @return
+     * 获取递增序列号
+     * @param prefix 前缀
+     * @param model 模块
+     * @param digit 补齐位数
+     * @return 序列号
      */
-    public String getIncre(String prefix,String model) {
-        final String STR_FORMAT = "000000";
+    public String getIncre(String prefix,String model,int digit) {
+        StringBuilder temp = new StringBuilder();
+        for (int i = 0;i < digit;i ++){
+            temp.append("0");
+        }
         //序列号前缀加特定标识,如系统模块名之类的 防止重复
-        String key = model + "-" + prefix;
+        String key = model + prefix;
         String increResult = "";
         try {
             //如果该key不存在 会自动创建,值为第二个参数delta
             //最终调用的还是jedis的incrBy(byte[] key, long value)方法
             RedisAtomicLong counter = new RedisAtomicLong(key, Objects.requireNonNull(redisTemplate.getConnectionFactory()));
-            Long increment = counter.getAndIncrement();
+            Long increment = counter.incrementAndGet();
             //不足补位
-            DecimalFormat df = new DecimalFormat(STR_FORMAT);
+            DecimalFormat df = new DecimalFormat(temp.toString());
             increResult = prefix + df.format(increment);
         } catch (Exception e) {
             // TODO: 2021/4/16  

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

@@ -28,7 +28,6 @@ public class SystemConstant {
     public static final String USER_DIR = "user.dir";
     public static final String PDF_TEMP = "pdf-temp";
     public static final String FILE_TEMP = "file-temp";
-    public static final String FTL_TEMP = "ftl-temp";
     public static final String DOWNLOAD_TEMP = "download-temp";
     public static final String SESSION = "session:";
     public static final String TASK = "task";
@@ -55,6 +54,7 @@ public class SystemConstant {
     public static final String HTML_PREFIX = ".html";
     public static final String PDF_PREFIX = ".pdf";
     public static final String FTL_PREFIX = ".ftl";
+    public static final String ZIP_PREFIX = ".zip";
     public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";
     public static final int PAGE_NUMBER = 0;
     public static final int PAGE_SIZE = 10000000;

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

@@ -11,9 +11,9 @@ import java.util.Objects;
  */
 public enum JobEnum {
 
-    TEST_JOB("测试job"),
+    TIMED_SYNC_SCHOOL_JOB("学校信息同步定时任务"),
 
-    TEST_JOB_GROUP("测试job组");
+    TIMED_TASK_JOB_GROUP("定时任务job组");
 
     private String title;
 

+ 0 - 26
distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/TestJob.java

@@ -1,26 +0,0 @@
-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;
-
-/**
- * @Description: 测试job
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2021/3/31
- */
-public class TestJob extends QuartzJobBean {
-
-    @Resource
-    JobService jobService;
-
-    @Override
-    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
-        jobService.testJob();
-    }
-}

+ 28 - 0
distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/TimedSyncSchoolJob.java

@@ -0,0 +1,28 @@
+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: 同步学校信息定时任务
+ * @Author: CaoZixuan
+ * @Date: 2021-04-19
+ */
+public class TimedSyncSchoolJob extends QuartzJobBean {
+    @Resource
+    JobService jobService;
+
+    @Override
+    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        try {
+            jobService.updateSchoolInfo();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 7 - 2
distributed-print-task/src/main/java/com/qmth/distributed/print/task/job/service/JobService.java

@@ -1,6 +1,8 @@
 package com.qmth.distributed.print.task.job.service;
 
-/** 
+import java.io.IOException;
+
+/**
 * @Description: job service
 * @Param:  
 * @return:  
@@ -9,5 +11,8 @@ package com.qmth.distributed.print.task.job.service;
 */ 
 public interface JobService {
 
-    public void testJob();
+    /**
+     * 同步学校信息
+     */
+    void updateSchoolInfo() throws IOException;
 }

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

@@ -1,13 +1,13 @@
 package com.qmth.distributed.print.task.job.service.impl;
 
-import com.qmth.distributed.print.business.service.CacheService;
-import com.qmth.distributed.print.common.util.JacksonUtil;
+import com.qmth.distributed.print.business.service.OrgCenterDataDisposeService;
 import com.qmth.distributed.print.task.job.service.JobService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.io.IOException;
 
 /**
  * @Description: job service impl
@@ -21,10 +21,10 @@ public class JobServiceImpl implements JobService {
     private final static Logger log = LoggerFactory.getLogger(JobServiceImpl.class);
 
     @Resource
-    CacheService cacheService;
+    OrgCenterDataDisposeService orgCenterDataDisposeService;
 
     @Override
-    public void testJob() {
-        log.info("testJob user info:{}", JacksonUtil.parseJson(cacheService.userCache(1L)));
+    public void updateSchoolInfo() throws IOException {
+        orgCenterDataDisposeService.updateSchoolInfo();
     }
 }

+ 18 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/ClientController.java

@@ -0,0 +1,18 @@
+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 io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Date: 2021/4/19.
+ */
+@Api(tags = "客户端Controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.client}")
+@Aac(auth = BOOL.FALSE)
+public class ClientController {
+}

+ 30 - 4
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPrintPlanController.java

@@ -9,17 +9,20 @@ import com.qmth.distributed.print.business.bean.dto.ExamTaskDetailDto;
 import com.qmth.distributed.print.business.bean.dto.PrintTaskDto;
 import com.qmth.distributed.print.business.bean.dto.PrintTaskTotalDto;
 import com.qmth.distributed.print.business.bean.dto.RelatePaperDto;
+import com.qmth.distributed.print.business.bean.params.ArraysParams;
 import com.qmth.distributed.print.business.bean.params.DeleteParams;
 import com.qmth.distributed.print.business.bean.params.PrintPlanParams;
 import com.qmth.distributed.print.business.bean.params.RelatePaperParam;
+import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.distributed.print.business.bean.result.LoginResult;
 import com.qmth.distributed.print.business.entity.ExamDetail;
 import com.qmth.distributed.print.business.entity.ExamPrintPlan;
 import com.qmth.distributed.print.business.entity.SysUser;
+import com.qmth.distributed.print.business.entity.TBTask;
 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.ExamTaskDetailService;
-import com.qmth.distributed.print.business.service.ExamTaskService;
+import com.qmth.distributed.print.business.enums.TaskTypeEnum;
+import com.qmth.distributed.print.business.service.*;
+import com.qmth.distributed.print.business.templete.execute.AsyncDownloadPdfTempleteService;
 import com.qmth.distributed.print.business.util.ServletUtil;
 import com.qmth.distributed.print.common.contant.SystemConstant;
 import com.qmth.distributed.print.common.util.Result;
@@ -34,6 +37,8 @@ import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * <p>
@@ -59,6 +64,11 @@ public class ExamPrintPlanController {
     @Autowired
     private ExamDetailService examDetailService;
 
+    @Resource
+    TBTaskService tbTaskService;
+
+    @Resource
+    AsyncDownloadPdfTempleteService asyncDownloadPdfTempleteService;
 
     @ApiOperation(value = "印刷计划查询")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
@@ -195,6 +205,7 @@ public class ExamPrintPlanController {
 
     /**
      * 提交印刷
+     *
      * @param examDetail
      * @return
      */
@@ -207,6 +218,7 @@ public class ExamPrintPlanController {
 
     /**
      * 撤回
+     *
      * @param examDetail
      * @return
      */
@@ -220,6 +232,7 @@ public class ExamPrintPlanController {
 
     /**
      * 重新提交
+     *
      * @param examDetail
      * @return
      */
@@ -269,5 +282,18 @@ public class ExamPrintPlanController {
         String path = examDetailService.taskViewPDF(examDetailId);
         return ResultUtil.ok(path);
     }
+
+    @ApiOperation(value = "印刷任务管理-批量下载PDF")
+    @RequestMapping(value = "/task_download_pdf", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = EditResult.class)})
+    public Result taskDownloadPdf(@ApiParam(value = "id数组", required = true) @Valid @RequestBody ArraysParams arraysParams, BindingResult bindingResult) throws Exception {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.PRINT_PDF_DOWNLOAD, arraysParams, (SysUser) ServletUtil.getRequestUser());
+        asyncDownloadPdfTempleteService.exportTask(map);
+        TBTask tbTask = Objects.nonNull(map.get(SystemConstant.TASK)) ? (TBTask) map.get(SystemConstant.TASK) : null;
+        return Objects.nonNull(tbTask) ? ResultUtil.ok(new EditResult(tbTask.getId())) : ResultUtil.error("创建任务失败");
+    }
 }
 

+ 14 - 8
distributed-print/src/main/java/com/qmth/distributed/print/start/StartRunning.java

@@ -2,12 +2,17 @@ package com.qmth.distributed.print.start;
 
 import com.qmth.distributed.print.business.service.OrgCenterDataDisposeService;
 import com.qmth.distributed.print.common.contant.SystemConstant;
+import com.qmth.distributed.print.task.enums.JobEnum;
+import com.qmth.distributed.print.task.job.TimedSyncSchoolJob;
+import com.qmth.distributed.print.task.service.QuartzService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * @Description: 服务启动时初始化运行,哪个微服务模块需要则拿此模版去用
@@ -20,8 +25,8 @@ import javax.annotation.Resource;
 public class StartRunning implements CommandLineRunner {
     private final static Logger log = LoggerFactory.getLogger(StartRunning.class);
 
-//    @Resource
-//    QuartzService quartzService;
+    @Resource
+    QuartzService quartzService;
 
     @Resource
     private OrgCenterDataDisposeService orgCenterDataDisposeService;
@@ -32,12 +37,13 @@ public class StartRunning implements CommandLineRunner {
         SystemConstant.initTempFiles();
         orgCenterDataDisposeService.updateSchoolInfo();
 
-//        log.info("增加test job start");
-//        Map testJobMap = new HashMap();
-//        testJobMap.computeIfAbsent("name", v -> TestJob.class.getName());
-//        quartzService.deleteJob(JobEnum.TEST_JOB.name(), JobEnum.TEST_JOB_GROUP.name());
-//        quartzService.addJob(TestJob.class, JobEnum.TEST_JOB.name(), JobEnum.TEST_JOB_GROUP.name(), "0/10 * * * * ?", testJobMap);
-//        log.info("增加test job end");
+        log.info("增加学校信息同步定时任务 start");
+        Map schoolJobMap = new HashMap();
+        schoolJobMap.computeIfAbsent("name", v -> TimedSyncSchoolJob.class.getName());
+        quartzService.deleteJob(JobEnum.TIMED_SYNC_SCHOOL_JOB.name(), JobEnum.TIMED_TASK_JOB_GROUP.name());
+        // 每天0点定时任务
+        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("服务器启动时执行 end");
     }

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

@@ -80,6 +80,7 @@ prefix.url.basic=admin/basic
 prefix.url.exam=admin/exam
 prefix.url.data=admin/data
 prefix.url.work=admin/work
+prefix.url.client=client
 
 #\u65E5\u5FD7\u914D\u7F6E
 com.qmth.logging.root-level=info