瀏覽代碼

3.2.7 优化

xiaofei 1 年之前
父節點
當前提交
afd64a0055
共有 35 個文件被更改,包括 747 次插入312 次删除
  1. 20 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamPaperStructurePageDto.java
  2. 10 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/PrintTaskDto.java
  3. 61 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamCardStage.java
  4. 13 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamPaperStructure.java
  5. 13 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamCardStageMapper.java
  6. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamPaperStructureMapper.java
  7. 2 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamCardService.java
  8. 13 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamCardStageService.java
  9. 5 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPaperStructureService.java
  10. 2 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPrintPlanService.java
  11. 4 9
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncServiceImpl.java
  12. 5 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java
  13. 11 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardStageServiceImpl.java
  14. 42 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPaperStructureServiceImpl.java
  15. 5 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPrintPlanServiceImpl.java
  16. 12 0
      distributed-print-business/src/main/resources/db/log/脚本-xiaof.sql
  17. 4 0
      distributed-print-business/src/main/resources/mapper/ExamCardStageMapper.xml
  18. 1 0
      distributed-print-business/src/main/resources/mapper/ExamDetailMapper.xml
  19. 53 51
      distributed-print-business/src/main/resources/mapper/ExamPaperStructureMapper.xml
  20. 13 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamCardController.java
  21. 4 208
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPrintPlanController.java
  22. 247 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPrintTaskController.java
  23. 0 3
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java
  24. 10 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/stmms/QuestionDTO.java
  25. 22 11
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/BasicOperationLogResult.java
  26. 43 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/ObjectiveTypeEnum.java
  27. 2 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/sync/CloudMarkingTaskUtils.java
  28. 18 16
      teachcloud-common/src/main/resources/mapper/BasicOperationLogMapper.xml
  29. 8 0
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/enums/JobEnum.java
  30. 29 0
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/AutoSyncJob.java
  31. 1 1
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/ResendSmsJob.java
  32. 29 0
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/ReunifyJob.java
  33. 10 1
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/JobService.java
  34. 17 3
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java
  35. 17 4
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/start/StartRunning.java

+ 20 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamPaperStructurePageDto.java

@@ -24,8 +24,6 @@ public class ExamPaperStructurePageDto extends ExamPaperStructure implements Ser
 
 
     private String statusStr;
     private String statusStr;
 
 
-    private String paperNumberId;
-
     private String taskStatus;
     private String taskStatus;
 
 
     private String transferId;
     private String transferId;
@@ -34,6 +32,10 @@ public class ExamPaperStructurePageDto extends ExamPaperStructure implements Ser
 
 
     private Long examTaskId;
     private Long examTaskId;
 
 
+    private String loginName;
+
+    private String realName;
+
     @Override
     @Override
     public String getStatusStr() {
     public String getStatusStr() {
         return statusStr;
         return statusStr;
@@ -79,4 +81,20 @@ public class ExamPaperStructurePageDto extends ExamPaperStructure implements Ser
     public void setExamTaskId(Long examTaskId) {
     public void setExamTaskId(Long examTaskId) {
         this.examTaskId = examTaskId;
         this.examTaskId = examTaskId;
     }
     }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
 }
 }

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

@@ -30,6 +30,8 @@ public class PrintTaskDto {
     private String packageCode;
     private String packageCode;
     private Boolean normal;
     private Boolean normal;
 
 
+    private String taskId;
+
     @JsonSerialize(using = ToStringSerializer.class)
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "印刷室id")
     @ApiModelProperty(value = "印刷室id")
     private Long printHouseId;
     private Long printHouseId;
@@ -269,4 +271,12 @@ public class PrintTaskDto {
     public void setExamName(String examName) {
     public void setExamName(String examName) {
         this.examName = examName;
         this.examName = examName;
     }
     }
+
+    public String getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
 }
 }

+ 61 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamCardStage.java

@@ -0,0 +1,61 @@
+package com.qmth.distributed.print.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 题卡临时保存表
+ * </p>
+ */
+@TableName("exam_card_stage")
+public class ExamCardStage implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "题卡id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("id")
+    private Long id;
+
+    /**
+     * 题卡内容
+     */
+    @TableField("content")
+    private String content;
+    /**
+     * html内容
+     */
+    @TableField("html_content")
+    private String htmlContent;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getHtmlContent() {
+        return htmlContent;
+    }
+
+    public void setHtmlContent(String htmlContent) {
+        this.htmlContent = htmlContent;
+    }
+}

+ 13 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamPaperStructure.java

@@ -130,6 +130,11 @@ public class ExamPaperStructure extends BaseEntity implements Serializable {
     @TableField("structure_change")
     @TableField("structure_change")
     private Boolean structureChange;
     private Boolean structureChange;
 
 
+
+    @ApiModelProperty(value = "客观题答案有提交,需要重新统分。(1:有变动,需要统分,0:不统分)(默认0)")
+    @TableField("object_answer_change")
+    private Boolean objectAnswerChange;
+
     @TableField(exist = false)
     @TableField(exist = false)
     private String taskStatus;
     private String taskStatus;
 
 
@@ -327,4 +332,12 @@ public class ExamPaperStructure extends BaseEntity implements Serializable {
     public void setTransferId(String transferId) {
     public void setTransferId(String transferId) {
         this.transferId = transferId;
         this.transferId = transferId;
     }
     }
+
+    public Boolean getObjectAnswerChange() {
+        return objectAnswerChange;
+    }
+
+    public void setObjectAnswerChange(Boolean objectAnswerChange) {
+        this.objectAnswerChange = objectAnswerChange;
+    }
 }
 }

+ 13 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamCardStageMapper.java

@@ -0,0 +1,13 @@
+package com.qmth.distributed.print.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.distributed.print.business.entity.ExamCardStage;
+
+/**
+ * <p>
+ * 题卡临时表 Mapper 接口
+ * </p>
+ */
+public interface ExamCardStageMapper extends BaseMapper<ExamCardStage> {
+
+}

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamPaperStructureMapper.java

@@ -18,7 +18,7 @@ import java.util.List;
  * @author xf
  * @author xf
  */
  */
 public interface ExamPaperStructureMapper extends BaseMapper<ExamPaperStructure> {
 public interface ExamPaperStructureMapper extends BaseMapper<ExamPaperStructure> {
-    IPage<ExamPaperStructurePageDto> listByPropositionTeacherId(@Param("page") Page<ExamPaperStructure> page, @Param("schoolId") Long schoolId, @Param("semesterId") Long semesterId, @Param("examId") Long examId, @Param("propositionTeacherId") Long propositionTeacherId, @Param("syncStatus") String syncStatus, @Param("structureStatusEnums") String[] structureStatusEnums, @Param("ready") Boolean ready, @Param("dpr") DataPermissionRule dpr);
+    IPage<ExamPaperStructurePageDto> listByPropositionTeacherId(@Param("page") Page<ExamPaperStructure> page, @Param("schoolId") Long schoolId, @Param("semesterId") Long semesterId, @Param("examId") Long examId, @Param("syncStatus") String syncStatus, @Param("structureStatusEnums") String[] structureStatusEnums, @Param("ready") Boolean ready, @Param("dpr") DataPermissionRule dpr);
 
 
     List<ExamPaperStructure> listByPropositionTeacherId(@Param("schoolId") Long schoolId, @Param("semesterId") Long semesterId, @Param("examId") Long examId, @Param("propositionTeacherId") Long propositionTeacherId, @Param("syncStatus") String syncStatus, @Param("structureStatusEnums") String[] structureStatusEnums, @Param("ready") Boolean ready,@Param("dpr") DataPermissionRule dpr);
     List<ExamPaperStructure> listByPropositionTeacherId(@Param("schoolId") Long schoolId, @Param("semesterId") Long semesterId, @Param("examId") Long examId, @Param("propositionTeacherId") Long propositionTeacherId, @Param("syncStatus") String syncStatus, @Param("structureStatusEnums") String[] structureStatusEnums, @Param("ready") Boolean ready,@Param("dpr") DataPermissionRule dpr);
 }
 }

+ 2 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamCardService.java

@@ -41,4 +41,6 @@ public interface ExamCardService extends IService<ExamCard> {
     void convertImage(Long id);
     void convertImage(Long id);
 
 
     void cardDownload(HttpServletResponse response, String id);
     void cardDownload(HttpServletResponse response, String id);
+
+    void storageCard(String id, String content);
 }
 }

+ 13 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamCardStageService.java

@@ -0,0 +1,13 @@
+package com.qmth.distributed.print.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.distributed.print.business.entity.ExamCardStage;
+
+/**
+ * <p>
+ * 题卡临时表 服务类
+ * </p>
+ */
+public interface ExamCardStageService extends IService<ExamCardStage> {
+
+}

+ 5 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPaperStructureService.java

@@ -90,4 +90,9 @@ public interface ExamPaperStructureService extends IService<ExamPaperStructure>
      * @param transferId  转办对象ID
      * @param transferId  转办对象ID
      */
      */
     boolean transfer(Long examId, String courseCode, String paperNumber, Long transferId);
     boolean transfer(Long examId, String courseCode, String paperNumber, Long transferId);
+
+    /**
+     * 自动统分
+     */
+    void reunifyScore();
 }
 }

+ 2 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPrintPlanService.java

@@ -117,4 +117,6 @@ public interface ExamPrintPlanService extends IService<ExamPrintPlan> {
     IPage<SyncExamTaskDto> listSyncExamTask(Long semesterId, Long examId, Long orgId, String cardType, ExamTaskSyncStatusEnum syncStatus, String courseCode, String paperNumber, Long startTime, Long endTime, Integer pageNumber, Integer pageSize);
     IPage<SyncExamTaskDto> listSyncExamTask(Long semesterId, Long examId, Long orgId, String cardType, ExamTaskSyncStatusEnum syncStatus, String courseCode, String paperNumber, Long startTime, Long endTime, Integer pageNumber, Integer pageSize);
 
 
     void checkSyncMode(SyncDataParam syncDataParam);
     void checkSyncMode(SyncDataParam syncDataParam);
+
+    void autoSyncStudent();
 }
 }

+ 4 - 9
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncServiceImpl.java

@@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.boot.api.exception.ApiException;
-import com.qmth.distributed.print.business.bean.dto.CardDetailDto;
 import com.qmth.distributed.print.business.bean.dto.ExamDetailCourseDto;
 import com.qmth.distributed.print.business.bean.dto.ExamDetailCourseDto;
 import com.qmth.distributed.print.business.bean.dto.SyncExamStudentDto;
 import com.qmth.distributed.print.business.bean.dto.SyncExamStudentDto;
 import com.qmth.distributed.print.business.bean.dto.SyncExamTaskDto;
 import com.qmth.distributed.print.business.bean.dto.SyncExamTaskDto;
@@ -23,14 +22,10 @@ import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.*;
 import com.qmth.teachcloud.common.entity.*;
-import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.enums.SyncFileTypeEnum;
-import com.qmth.teachcloud.common.enums.TaskResultEnum;
-import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
 import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
 import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
-import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
@@ -40,8 +35,6 @@ import org.springframework.util.CollectionUtils;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.io.File;
 import java.io.File;
-import java.io.FileOutputStream;
-import java.nio.charset.StandardCharsets;
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -481,9 +474,11 @@ public class DataSyncServiceImpl implements DataSyncService {
                     syncStructureData.setMainTitle(m.getString("mainTitle"));
                     syncStructureData.setMainTitle(m.getString("mainTitle"));
                     syncStructureData.setTotalScore(m.getDouble("totalScore"));
                     syncStructureData.setTotalScore(m.getDouble("totalScore"));
                     syncStructureData.setAnswer(m.getString("answer"));
                     syncStructureData.setAnswer(m.getString("answer"));
+                    if (m.containsKey("type")) {
+                        syncStructureData.setType(ObjectiveTypeEnum.getByType(m.getInteger("type")));
+                    }
                     return syncStructureData;
                     return syncStructureData;
                 }).collect(Collectors.toList());
                 }).collect(Collectors.toList());
-//                cloudMarkingTaskUtils.syncPaperStructure(schoolId, examId, subjectCode, true, examPaperStructure.getPaperType(), syncObjectiveStructureDatas);
                 cloudMarkingTaskUtils.syncPaperStructure(schoolId, examId, subjectCode, true, null, syncObjectiveStructureDatas);
                 cloudMarkingTaskUtils.syncPaperStructure(schoolId, examId, subjectCode, true, null, syncObjectiveStructureDatas);
             }
             }
 
 

+ 5 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java

@@ -489,6 +489,11 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
         }
         }
     }
     }
 
 
+    @Override
+    public void storageCard(String id, String content) {
+
+    }
+
     /**
     /**
      * 生成新的title
      * 生成新的title
      *
      *

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

@@ -0,0 +1,11 @@
+package com.qmth.distributed.print.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.distributed.print.business.entity.ExamCardStage;
+import com.qmth.distributed.print.business.mapper.ExamCardStageMapper;
+import com.qmth.distributed.print.business.service.ExamCardStageService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ExamCardStageServiceImpl extends ServiceImpl<ExamCardStageMapper, ExamCardStage> implements ExamCardStageService {
+}

+ 42 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPaperStructureServiceImpl.java

@@ -34,6 +34,7 @@ import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
 import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
 import com.qmth.teachcloud.common.util.ExcelUtil;
 import com.qmth.teachcloud.common.util.ExcelUtil;
+import com.qmth.teachcloud.common.util.MD5Util;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.common.util.excel.ExcelError;
 import com.qmth.teachcloud.common.util.excel.ExcelError;
@@ -42,6 +43,7 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.DigestUtils;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
@@ -106,7 +108,7 @@ public class ExamPaperStructureServiceImpl extends ServiceImpl<ExamPaperStructur
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(schoolId, sysUser.getId(), ServletUtil.getRequest().getServletPath());
         DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(schoolId, sysUser.getId(), ServletUtil.getRequest().getServletPath());
         Page<ExamPaperStructure> page = new Page<>(pageNumber, pageSize);
         Page<ExamPaperStructure> page = new Page<>(pageNumber, pageSize);
-        IPage<ExamPaperStructurePageDto> examPaperStructureIPage = this.baseMapper.listByPropositionTeacherId(page, schoolId, semesterId, examId, sysUser.getId(), ExamTaskSyncStatusEnum.FINISH.name(), structureStatusEnums, ready, dpr);
+        IPage<ExamPaperStructurePageDto> examPaperStructureIPage = this.baseMapper.listByPropositionTeacherId(page, schoolId, semesterId, examId, ExamTaskSyncStatusEnum.FINISH.name(), structureStatusEnums, ready, dpr);
         examPaperStructureIPage.getRecords().forEach(m -> {
         examPaperStructureIPage.getRecords().forEach(m -> {
             m.setStatusStr(ExamPaperStructureStatusEnum.INIT.equals(m.getStatus()) ? "未提交" : "已提交");
             m.setStatusStr(ExamPaperStructureStatusEnum.INIT.equals(m.getStatus()) ? "未提交" : "已提交");
 
 
@@ -366,8 +368,27 @@ public class ExamPaperStructureServiceImpl extends ServiceImpl<ExamPaperStructur
         if (examPaperStructure == null) {
         if (examPaperStructure == null) {
             throw ExceptionResultEnum.ERROR.exception("试卷结构数据不存在");
             throw ExceptionResultEnum.ERROR.exception("试卷结构数据不存在");
         }
         }
-        // todo xf 20220414 校验所有题卡都有答案
+
+        // 客观题答案有变动,需要重新统分
+        String objectiveAnswer = examPaperStructure.getObjectiveStructure();
+        if (StringUtils.isBlank(objectiveAnswer)) {
+            examPaperStructure.setObjectAnswerChange(true);
+        } else {
+            List<JSONObject> oldObjectiveAnswer = JSONObject.parseArray(objectiveAnswer, JSONObject.class);
+            List<JSONObject> newObjectiveAnswer = JSONObject.parseArray(objectiveStructure, JSONObject.class);
+
+            oldObjectiveAnswer.sort(Comparator.comparing(m -> m.getString("mainNumber") + "-" + m.getString("subNumber")));
+            newObjectiveAnswer.sort(Comparator.comparing(m -> m.getString("mainNumber") + "-" + m.getString("subNumber")));
+
+            // md5加密,比较
+            String md5OldExtends = DigestUtils.md5DigestAsHex(JSONObject.toJSONBytes(oldObjectiveAnswer));
+            String newOldExtends = DigestUtils.md5DigestAsHex(JSONObject.toJSONBytes(newObjectiveAnswer));
+            if (!md5OldExtends.equals(newOldExtends)) {
+                examPaperStructure.setObjectAnswerChange(true);
+            }
+        }
         examPaperStructure.setObjectiveStructure(objectiveStructure);
         examPaperStructure.setObjectiveStructure(objectiveStructure);
+
         this.updateById(examPaperStructure);
         this.updateById(examPaperStructure);
         return examPaperStructure;
         return examPaperStructure;
     }
     }
@@ -473,6 +494,25 @@ public class ExamPaperStructureServiceImpl extends ServiceImpl<ExamPaperStructur
         return examTaskService.update(updateWrapper);
         return examTaskService.update(updateWrapper);
     }
     }
 
 
+    @Override
+    public void reunifyScore() {
+        QueryWrapper<ExamPaperStructure> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(ExamPaperStructure::getObjectAnswerChange, true)
+                .orderByAsc(ExamPaperStructure::getSchoolId)
+                .orderByAsc(ExamPaperStructure::getCourseCode)
+                .orderByAsc(ExamPaperStructure::getSequence);
+        List<ExamPaperStructure> examPaperStructureList = this.list(queryWrapper);
+        for (ExamPaperStructure examPaperStructure : examPaperStructureList) {
+            String subjectCode = examPaperStructure.getCourseCode() + examPaperStructure.getPaperType() + examPaperStructure.getSequence();
+            // todo 调用云阅卷接口
+
+            // 更新状态
+            UpdateWrapper<ExamPaperStructure> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.lambda().set(ExamPaperStructure::getObjectAnswerChange, false).eq(ExamPaperStructure::getId, examPaperStructure.getId());
+            this.update(updateWrapper);
+        }
+    }
+
     /**
     /**
      * 保存试卷结构
      * 保存试卷结构
      *
      *

+ 5 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPrintPlanServiceImpl.java

@@ -539,6 +539,11 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
         }
         }
     }
     }
 
 
+    @Override
+    public void autoSyncStudent() {
+
+    }
+
     /**
     /**
      * 查找子机构
      * 查找子机构
      *
      *

+ 12 - 0
distributed-print-business/src/main/resources/db/log/脚本-xiaof.sql

@@ -233,3 +233,15 @@ CHANGE COLUMN `create_id` `create_id` BIGINT NULL DEFAULT NULL COMMENT '创建
 CHANGE COLUMN `create_time` `create_time` BIGINT NULL DEFAULT NULL COMMENT '创建时间' AFTER `create_id`,
 CHANGE COLUMN `create_time` `create_time` BIGINT NULL DEFAULT NULL COMMENT '创建时间' AFTER `create_id`,
 CHANGE COLUMN `update_id` `update_id` BIGINT NULL DEFAULT NULL COMMENT '更新人' AFTER `create_time`,
 CHANGE COLUMN `update_id` `update_id` BIGINT NULL DEFAULT NULL COMMENT '更新人' AFTER `create_time`,
 CHANGE COLUMN `update_time` `update_time` BIGINT NULL DEFAULT NULL COMMENT '更新时间' AFTER `update_id`;
 CHANGE COLUMN `update_time` `update_time` BIGINT NULL DEFAULT NULL COMMENT '更新时间' AFTER `update_id`;
+
+ALTER TABLE `exam_paper_structure`
+    ADD COLUMN `object_answer_change` TINYINT(1) NULL DEFAULT '0' COMMENT '客观题答案有提交,需要重新统分。(1:有变动,需要统分,0:不统分)' AFTER `structure_change`;
+
+DROP TABLE `exam_card_detail`;
+
+CREATE TABLE `exam_card_stage` (
+     `id` INT NOT NULL,
+     `content` MEDIUMTEXT NULL COMMENT '题卡格式内容',
+     `html_content` MEDIUMTEXT NULL COMMENT 'html内容',
+     PRIMARY KEY (`id`));
+

+ 4 - 0
distributed-print-business/src/main/resources/mapper/ExamCardStageMapper.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.qmth.distributed.print.business.mapper.ExamCardStageMapper">
+</mapper>

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

@@ -48,6 +48,7 @@
             b.print_end_time printEndTime,
             b.print_end_time printEndTime,
             b.normal,
             b.normal,
             b.print_house_id as printHouseId,
             b.print_house_id as printHouseId,
+            b.task_id taskId,
             e.name as printHouseName,
             e.name as printHouseName,
             e.code as printHouseCode,
             e.code as printHouseCode,
             a.semester_id as semesterId,
             a.semester_id as semesterId,

+ 53 - 51
distributed-print-business/src/main/resources/mapper/ExamPaperStructureMapper.xml

@@ -4,55 +4,57 @@
     <select id="listByPropositionTeacherId"
     <select id="listByPropositionTeacherId"
             resultType="com.qmth.distributed.print.business.bean.dto.ExamPaperStructurePageDto">
             resultType="com.qmth.distributed.print.business.bean.dto.ExamPaperStructurePageDto">
         select
         select
-        temp.*,
-        eps.objective_structure objectiveStructure,
-        eps.subjective_structure subjectiveStructure,
-        eps.paper_info_json paperInfoJson,
-        eps.paper_answer paperAnswer,
-        eps.mark_leader markLeader
-        from
-        (SELECT
-        distinct eps.id,
-        et.id as examTaskId,
-        et.sequence,
-        et.org_id orgId,
-        et.user_id propositionTeacherId,
-        et.transfer_id transferId,
-        ed.school_id schoolId,
-        ed.exam_id examId,
-        edc.paper_number paperNumber,
-        edc.course_code courseCode,
-        edc.course_name courseName,
-        edcpt.paper_type paperType,
-        ets.third_relate_id thirdRelateId,
-        ets.sync_start_time syncStartTime,
-        tsse.exam_name thirdRelateName,
-        IFNULL(eps.status, 'INIT') status
+            temp.*,
+            eps.objective_structure objectiveStructure,
+            eps.subjective_structure subjectiveStructure,
+            eps.paper_info_json paperInfoJson,
+            eps.paper_answer paperAnswer,
+            eps.mark_leader markLeader,
+            su.login_name loginName,
+            su.real_name realName
+            from
+            (SELECT
+            distinct eps.id,
+            et.id as examTaskId,
+            et.sequence,
+            et.org_id orgId,
+            ifnull(eps.proposition_teacher_id, et.user_id) propositionTeacherId,
+            et.transfer_id transferId,
+            ed.school_id schoolId,
+            ed.exam_id examId,
+            edc.paper_number paperNumber,
+            edc.course_code courseCode,
+            edc.course_name courseName,
+            edcpt.paper_type paperType,
+            ets.third_relate_id thirdRelateId,
+            ets.sync_start_time syncStartTime,
+            tsse.exam_name thirdRelateName,
+            IFNULL(eps.status, 'INIT') status
         FROM
         FROM
-        exam_detail ed
-        left join exam_detail_course edc on
-        ed.id = edc.exam_detail_id
-        left join exam_detail_course_paper_type edcpt on
-        edc.id = edcpt.exam_detail_course_id
-        left join exam_task_sync ets on
-        edc.school_id = ets.school_id
-        and ed.exam_id = ets.exam_id
-        and edc.paper_number = ets.paper_number
-        and edcpt.paper_type = ets.paper_type
-        left join t_sync_stmms_exam tsse on
-        edc.school_id = tsse.school_id
-        and ets.third_relate_id = tsse.exam_id
-        left join basic_exam be on
-        ed.exam_id = be.id
-        left join exam_task et on
-        et.school_id = ed.school_id
-        and et.paper_number = edc.paper_number
-        and et.exam_id = ed.exam_id
-        left join exam_paper_structure eps on
-        eps.school_id = ets.school_id
-        and eps.exam_id = ets.exam_id
-        and eps.paper_number = ets.paper_number
-        and eps.paper_type = ets.paper_type
+            exam_detail ed
+                left join exam_detail_course edc on
+            ed.id = edc.exam_detail_id
+                left join exam_detail_course_paper_type edcpt on
+            edc.id = edcpt.exam_detail_course_id
+                left join exam_task_sync ets on
+            edc.school_id = ets.school_id
+            and ed.exam_id = ets.exam_id
+            and edc.paper_number = ets.paper_number
+            and edcpt.paper_type = ets.paper_type
+                left join t_sync_stmms_exam tsse on
+            edc.school_id = tsse.school_id
+            and ets.third_relate_id = tsse.exam_id
+                left join basic_exam be on
+            ed.exam_id = be.id
+                left join exam_task et on
+            et.school_id = ed.school_id
+            and et.paper_number = edc.paper_number
+            and et.exam_id = ed.exam_id
+                left join exam_paper_structure eps on
+            eps.school_id = ets.school_id
+            and eps.exam_id = ets.exam_id
+            and eps.paper_number = ets.paper_number
+            and eps.paper_type = ets.paper_type
         <where>
         <where>
             and ed.school_id = #{schoolId}
             and ed.school_id = #{schoolId}
             AND ets.sync_status = #{syncStatus}
             AND ets.sync_status = #{syncStatus}
@@ -63,8 +65,7 @@
             <if test="examId != null">
             <if test="examId != null">
                 and be.id = #{examId}
                 and be.id = #{examId}
             </if>
             </if>
-            and (et.transfer_id = #{propositionTeacherId}
-            or et.user_id = #{propositionTeacherId})
+
             <if test="structureStatusEnums != null and structureStatusEnums != ''">
             <if test="structureStatusEnums != null and structureStatusEnums != ''">
                 <choose>
                 <choose>
                     <when test="ready != null and ready != '' and ready == true">
                     <when test="ready != null and ready != '' and ready == true">
@@ -85,7 +86,7 @@
             </if>
             </if>
             <if test="dpr != null">
             <if test="dpr != null">
                 <if test="dpr.requestUserId != null">
                 <if test="dpr.requestUserId != null">
-                    AND et.user_id = #{dpr.requestUserId}
+                    and (et.transfer_id = #{dpr.requestUserId} or et.user_id = #{dpr.requestUserId})
                 </if>
                 </if>
                 <if test="dpr.orgIdSet != null and dpr.orgIdSet != '' and dpr.orgIdSet.size > 0">
                 <if test="dpr.orgIdSet != null and dpr.orgIdSet != '' and dpr.orgIdSet.size > 0">
                     AND et.org_id IN
                     AND et.org_id IN
@@ -99,5 +100,6 @@
         ) temp
         ) temp
         left join exam_paper_structure eps on
         left join exam_paper_structure eps on
         eps.id = temp.id
         eps.id = temp.id
+        left join sys_user su on temp.propositionTeacherId = su.id
     </select>
     </select>
 </mapper>
 </mapper>

+ 13 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamCardController.java

@@ -178,4 +178,17 @@ public class ExamCardController {
     public void cardDownload(HttpServletResponse response, @RequestParam(value = "id") String id) {
     public void cardDownload(HttpServletResponse response, @RequestParam(value = "id") String id) {
         examCardService.cardDownload(response, id);
         examCardService.cardDownload(response, id);
     }
     }
+
+    /**
+     * 题卡自动保存临时表
+     *
+     * @param id 题卡ID
+     * @param content 卡格式
+     */
+    @ApiOperation(value = "题卡自动暂存")
+    @RequestMapping(value = "/storage_card", method = RequestMethod.POST)
+    public void storageCard(@RequestParam(value = "id") String id,
+                             @RequestParam(value = "id") String content) {
+        examCardService.storageCard(id, content);
+    }
 }
 }

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

@@ -1,34 +1,20 @@
 package com.qmth.distributed.print.api;
 package com.qmth.distributed.print.api;
 
 
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.bean.dto.ExamTaskDetailDto;
 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.dto.RelatePaperDto;
 import com.qmth.distributed.print.business.bean.params.DeleteParams;
 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.PrintPlanParams;
 import com.qmth.distributed.print.business.bean.params.RelatePaperParam;
 import com.qmth.distributed.print.business.bean.params.RelatePaperParam;
-import com.qmth.distributed.print.business.bean.result.EditResult;
-import com.qmth.distributed.print.business.entity.ExamDetail;
-import com.qmth.distributed.print.business.entity.ExamPrintPlan;
-import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
 import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 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.ExamPrintPlanService;
 import com.qmth.distributed.print.business.service.ExamTaskDetailService;
 import com.qmth.distributed.print.business.service.ExamTaskDetailService;
 import com.qmth.distributed.print.business.service.ExamTaskService;
 import com.qmth.distributed.print.business.service.ExamTaskService;
-import com.qmth.distributed.print.business.templete.execute.AsyncDownloadPdfTempleteService;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
-import com.qmth.teachcloud.common.bean.params.ArraysParams;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.entity.SysUser;
-import com.qmth.teachcloud.common.entity.TBTask;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.enums.TaskTypeEnum;
 import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
 import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
-import com.qmth.teachcloud.common.service.TBTaskService;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
@@ -42,7 +28,10 @@ import javax.validation.Valid;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.Min;
 import java.io.IOException;
 import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -64,12 +53,6 @@ public class ExamPrintPlanController {
     private ExamTaskService examTaskService;
     private ExamTaskService examTaskService;
     @Resource
     @Resource
     private ExamTaskDetailService examTaskDetailService;
     private ExamTaskDetailService examTaskDetailService;
-    @Resource
-    private ExamDetailService examDetailService;
-    @Resource
-    TBTaskService tbTaskService;
-    @Resource
-    AsyncDownloadPdfTempleteService asyncDownloadPdfTempleteService;
 
 
     @ApiOperation(value = "印刷计划查询")
     @ApiOperation(value = "印刷计划查询")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     @RequestMapping(value = "/list", method = RequestMethod.POST)
@@ -279,192 +262,5 @@ public class ExamPrintPlanController {
         List<RelatePaperDto> list = examTaskService.listPaperTypes(examTaskId, printPlanId, courseCode);
         List<RelatePaperDto> list = examTaskService.listPaperTypes(examTaskId, printPlanId, courseCode);
         return ResultUtil.ok(list);
         return ResultUtil.ok(list);
     }
     }
-
-    /**
-     * 印刷任务管理-查询
-     *
-     * @param printPlanId
-     * @param status
-     * @param courseCode
-     * @param paperNumber
-     * @param examPlace
-     * @param examStartTime
-     * @param examEndTime
-     * @param printHouseId  印刷室id
-     * @param pageNumber
-     * @param pageSize
-     * @return
-     */
-    @ApiOperation(value = "印刷任务管理-查询")
-    @RequestMapping(value = "/task_list", method = RequestMethod.POST)
-    public Result taskList(@ApiParam(value = "学期ID") @RequestParam(required = false) String semesterId,
-                           @ApiParam(value = "考试id") @RequestParam(required = false) String examId,
-                           @RequestParam(value = "printPlanId", required = false) Long printPlanId,
-                           @RequestParam(value = "status", required = false) String status,
-                           @RequestParam(value = "courseCode", required = false) String courseCode,
-                           @RequestParam(value = "paperNumber", required = false) String paperNumber,
-                           @RequestParam(value = "examPlace", required = false) String examPlace,
-                           @RequestParam(value = "examRoom", required = false) String examRoom,
-                           @RequestParam(value = "examStartTime", required = false) Long examStartTime,
-                           @RequestParam(value = "examEndTime", required = false) Long examEndTime,
-                           @RequestParam(value = "printStartTime", required = false) Long printStartTime,
-                           @RequestParam(value = "printEndTime", required = false) Long printEndTime,
-                           @RequestParam(value = "printHouseId", required = false) String printHouseId,
-                           @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                           @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        if (semesterId == null) {
-            throw ExceptionResultEnum.ERROR.exception("请选择学期");
-        }
-        IPage<PrintTaskDto> examTasks = examDetailService.listPrintTask(SystemConstant.convertIdToLong(semesterId), SystemConstant.convertIdToLong(examId), printPlanId, status, courseCode, paperNumber, examPlace, examRoom, examStartTime, examEndTime, printStartTime, printEndTime, SystemConstant.convertIdToLong(printHouseId), pageNumber, pageSize);
-        return ResultUtil.ok(examTasks);
-    }
-
-    /**
-     * 印刷任务管理-汇总数据查询
-     *
-     * @param printPlanId
-     * @param status
-     * @param courseCode
-     * @param paperNumber
-     * @param examPlace
-     * @param examRoom
-     * @param examStartTime
-     * @param examEndTime
-     * @return
-     */
-    @ApiOperation(value = "印刷任务管理-汇总数据查询")
-    @RequestMapping(value = "/task_total_data", method = RequestMethod.POST)
-    public Result taskTotalData(@ApiParam(value = "学期ID") @RequestParam(required = false) Long semesterId,
-                                @ApiParam(value = "考试id") @RequestParam(required = false) Long examId,
-                                @RequestParam(value = "printPlanId", required = false) Long printPlanId,
-                                @RequestParam(value = "status", required = false) String status,
-                                @RequestParam(value = "courseCode", required = false) String courseCode,
-                                @RequestParam(value = "paperNumber", required = false) String paperNumber,
-                                @RequestParam(value = "examPlace", required = false) String examPlace,
-                                @RequestParam(value = "examRoom", required = false) String examRoom,
-                                @RequestParam(value = "examStartTime", required = false) Long examStartTime,
-                                @RequestParam(value = "examEndTime", required = false) Long examEndTime,
-                                @RequestParam(value = "printStartTime", required = false) Long printStartTime,
-                                @RequestParam(value = "printEndTime", required = false) Long printEndTime,
-                                @RequestParam(value = "printHouseId", required = false) String printHouseId) {
-        PrintTaskTotalDto printTaskTotalDto = examDetailService.taskTotalData(semesterId, examId, printPlanId, status, courseCode, paperNumber, examPlace, examRoom, examStartTime, examEndTime, printStartTime, printEndTime, SystemConstant.convertIdToLong(printHouseId));
-        return ResultUtil.ok(printTaskTotalDto);
-    }
-
-    /**
-     * 提交印刷
-     *
-     * @param examDetail
-     * @return
-     */
-    @ApiOperation(value = "印刷任务管理-提交印刷")
-    @RequestMapping(value = "/task_submit", method = RequestMethod.POST)
-    @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
-    public Result taskSubmit(@RequestBody ExamDetail examDetail) throws IOException {
-        boolean isSuccess = examDetailService.submitTask(examDetail);
-        return ResultUtil.ok(isSuccess);
-    }
-
-    /**
-     * 撤回
-     *
-     * @param examDetail
-     * @return
-     */
-    @ApiOperation(value = "印刷任务管理-撤回提交")
-    @RequestMapping(value = "/task_cancel", method = RequestMethod.POST)
-    @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
-    public Result taskCancel(@RequestBody ExamDetail examDetail) {
-        boolean isSuccess = examDetailService.taskCancel(examDetail.getId());
-        return ResultUtil.ok(isSuccess);
-    }
-
-    /**
-     * 批量撤回
-     *
-     * @param data id集合
-     * @return
-     */
-    @ApiOperation(value = "印刷任务管理-撤回提交")
-    @RequestMapping(value = "/task_batch_cancel", method = RequestMethod.POST)
-    @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
-    public Result taskCancel(@RequestBody Map data) {
-        boolean isSuccess = examDetailService.taskBatchCancel(data);
-        return ResultUtil.ok(isSuccess);
-    }
-
-
-    /**
-     * 重新提交
-     *
-     * @param examDetail
-     * @return
-     */
-    @ApiOperation(value = "印刷任务管理-重新提交")
-    @RequestMapping(value = "/task_resubmit", method = RequestMethod.POST)
-    @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
-    public Result taskResubmit(@RequestBody ExamDetail examDetail) throws IOException {
-        boolean isSuccess = examDetailService.resubmitTask(examDetail);
-        return ResultUtil.ok(isSuccess);
-    }
-
-    /**
-     * 印刷任务管理-查看印品
-     *
-     * @param map
-     * @return
-     */
-    @ApiOperation(value = "印刷任务管理-查看印品")
-    @RequestMapping(value = "/template_view", method = RequestMethod.POST)
-    public Result templateViewPDF(@RequestBody Map<String, Long> map) {
-        List<Map<String, String>> list = examPrintPlanService.tempalteView(map.get("printPlanId"));
-        return ResultUtil.ok(list);
-    }
-
-    /**
-     * 印刷任务管理-查看PDF
-     *
-     * @param map
-     * @return
-     */
-    @ApiOperation(value = "印刷任务管理-查看PDF")
-    @RequestMapping(value = "/task_view_pdf", method = RequestMethod.POST)
-    public Result taskViewPDF(@RequestBody Map<String, Long> map) {
-        List<JSONObject> list = examDetailService.taskViewPDF(map.get("examDetailId"));
-        return ResultUtil.ok(list);
-    }
-
-    @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());
-        }
-        List<ExamDetail> examDetailList = examDetailService.listByIds(Arrays.asList(arraysParams.getIds()));
-        for (ExamDetail ExamDetail : examDetailList) {
-            if (ExamDetail.getStatus() == ExamDetailStatusEnum.NEW) {
-                throw ExceptionResultEnum.ERROR.exception("状态为新建不能下载");
-            }
-        }
-        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("创建任务失败");
-    }
-
-    /**
-     * 印刷任务做废、恢复
-     *
-     * @param examDetail
-     * @return
-     */
-    @ApiOperation(value = "印刷任务管理-做废/恢复")
-    @RequestMapping(value = "/task_normal", method = RequestMethod.POST)
-    @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
-    public Result taskNormal(@RequestBody ExamDetail examDetail) {
-        boolean isSuccess = examDetailService.taskNormal(examDetail);
-        return ResultUtil.ok(isSuccess);
-    }
 }
 }
 
 

+ 247 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPrintTaskController.java

@@ -0,0 +1,247 @@
+package com.qmth.distributed.print.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qmth.boot.api.constant.ApiConstant;
+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.result.EditResult;
+import com.qmth.distributed.print.business.entity.ExamDetail;
+import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
+import com.qmth.distributed.print.business.service.ExamDetailService;
+import com.qmth.distributed.print.business.service.ExamPrintPlanService;
+import com.qmth.distributed.print.business.templete.execute.AsyncDownloadPdfTempleteService;
+import com.qmth.teachcloud.common.annotation.OperationLogDetail;
+import com.qmth.teachcloud.common.bean.params.ArraysParams;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.entity.TBTask;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.TaskTypeEnum;
+import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
+import com.qmth.teachcloud.common.service.TBTaskService;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import io.swagger.annotations.*;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 印刷任务管理 前端控制器
+ * </p>
+ */
+@Api(tags = "印刷任务管理Controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_EXAM + "/print")
+@Validated
+public class ExamPrintTaskController {
+    @Resource
+    private ExamPrintPlanService examPrintPlanService;
+    @Resource
+    private ExamDetailService examDetailService;
+    @Resource
+    TBTaskService tbTaskService;
+    @Resource
+    AsyncDownloadPdfTempleteService asyncDownloadPdfTempleteService;
+
+    /**
+     * 印刷任务管理-查询
+     *
+     * @param printPlanId
+     * @param status
+     * @param courseCode
+     * @param paperNumber
+     * @param examPlace
+     * @param examStartTime
+     * @param examEndTime
+     * @param printHouseId  印刷室id
+     * @param pageNumber
+     * @param pageSize
+     * @return
+     */
+    @ApiOperation(value = "印刷任务管理-查询")
+    @RequestMapping(value = "/task_list", method = RequestMethod.POST)
+    public Result taskList(@ApiParam(value = "学期ID") @RequestParam(required = false) String semesterId,
+                           @ApiParam(value = "考试id") @RequestParam(required = false) String examId,
+                           @RequestParam(value = "printPlanId", required = false) Long printPlanId,
+                           @RequestParam(value = "status", required = false) String status,
+                           @RequestParam(value = "courseCode", required = false) String courseCode,
+                           @RequestParam(value = "paperNumber", required = false) String paperNumber,
+                           @RequestParam(value = "examPlace", required = false) String examPlace,
+                           @RequestParam(value = "examRoom", required = false) String examRoom,
+                           @RequestParam(value = "examStartTime", required = false) Long examStartTime,
+                           @RequestParam(value = "examEndTime", required = false) Long examEndTime,
+                           @RequestParam(value = "printStartTime", required = false) Long printStartTime,
+                           @RequestParam(value = "printEndTime", required = false) Long printEndTime,
+                           @RequestParam(value = "printHouseId", required = false) String printHouseId,
+                           @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                           @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        if (semesterId == null) {
+            throw ExceptionResultEnum.ERROR.exception("请选择学期");
+        }
+        IPage<PrintTaskDto> examTasks = examDetailService.listPrintTask(SystemConstant.convertIdToLong(semesterId), SystemConstant.convertIdToLong(examId), printPlanId, status, courseCode, paperNumber, examPlace, examRoom, examStartTime, examEndTime, printStartTime, printEndTime, SystemConstant.convertIdToLong(printHouseId), pageNumber, pageSize);
+        return ResultUtil.ok(examTasks);
+    }
+
+    /**
+     * 印刷任务管理-汇总数据查询
+     *
+     * @param printPlanId
+     * @param status
+     * @param courseCode
+     * @param paperNumber
+     * @param examPlace
+     * @param examRoom
+     * @param examStartTime
+     * @param examEndTime
+     * @return
+     */
+    @ApiOperation(value = "印刷任务管理-汇总数据查询")
+    @RequestMapping(value = "/task_total_data", method = RequestMethod.POST)
+    public Result taskTotalData(@ApiParam(value = "学期ID") @RequestParam(required = false) Long semesterId,
+                                @ApiParam(value = "考试id") @RequestParam(required = false) Long examId,
+                                @RequestParam(value = "printPlanId", required = false) Long printPlanId,
+                                @RequestParam(value = "status", required = false) String status,
+                                @RequestParam(value = "courseCode", required = false) String courseCode,
+                                @RequestParam(value = "paperNumber", required = false) String paperNumber,
+                                @RequestParam(value = "examPlace", required = false) String examPlace,
+                                @RequestParam(value = "examRoom", required = false) String examRoom,
+                                @RequestParam(value = "examStartTime", required = false) Long examStartTime,
+                                @RequestParam(value = "examEndTime", required = false) Long examEndTime,
+                                @RequestParam(value = "printStartTime", required = false) Long printStartTime,
+                                @RequestParam(value = "printEndTime", required = false) Long printEndTime,
+                                @RequestParam(value = "printHouseId", required = false) String printHouseId) {
+        PrintTaskTotalDto printTaskTotalDto = examDetailService.taskTotalData(semesterId, examId, printPlanId, status, courseCode, paperNumber, examPlace, examRoom, examStartTime, examEndTime, printStartTime, printEndTime, SystemConstant.convertIdToLong(printHouseId));
+        return ResultUtil.ok(printTaskTotalDto);
+    }
+
+    /**
+     * 提交印刷
+     *
+     * @param examDetail
+     * @return
+     */
+    @ApiOperation(value = "印刷任务管理-提交印刷")
+    @RequestMapping(value = "/task_submit", method = RequestMethod.POST)
+    @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
+    public Result taskSubmit(@RequestBody ExamDetail examDetail) throws IOException {
+        boolean isSuccess = examDetailService.submitTask(examDetail);
+        return ResultUtil.ok(isSuccess);
+    }
+
+    /**
+     * 撤回
+     *
+     * @param examDetail
+     * @return
+     */
+    @ApiOperation(value = "印刷任务管理-撤回提交")
+    @RequestMapping(value = "/task_cancel", method = RequestMethod.POST)
+    @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
+    public Result taskCancel(@RequestBody ExamDetail examDetail) {
+        boolean isSuccess = examDetailService.taskCancel(examDetail.getId());
+        return ResultUtil.ok(isSuccess);
+    }
+
+    /**
+     * 批量撤回
+     *
+     * @param data id集合
+     * @return
+     */
+    @ApiOperation(value = "印刷任务管理-撤回提交")
+    @RequestMapping(value = "/task_batch_cancel", method = RequestMethod.POST)
+    @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
+    public Result taskCancel(@RequestBody Map data) {
+        boolean isSuccess = examDetailService.taskBatchCancel(data);
+        return ResultUtil.ok(isSuccess);
+    }
+
+
+    /**
+     * 重新提交
+     *
+     * @param examDetail
+     * @return
+     */
+    @ApiOperation(value = "印刷任务管理-重新提交")
+    @RequestMapping(value = "/task_resubmit", method = RequestMethod.POST)
+    @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
+    public Result taskResubmit(@RequestBody ExamDetail examDetail) throws IOException {
+        boolean isSuccess = examDetailService.resubmitTask(examDetail);
+        return ResultUtil.ok(isSuccess);
+    }
+
+    /**
+     * 印刷任务管理-查看印品
+     *
+     * @param map
+     * @return
+     */
+    @ApiOperation(value = "印刷任务管理-查看印品")
+    @RequestMapping(value = "/template_view", method = RequestMethod.POST)
+    public Result templateViewPDF(@RequestBody Map<String, Long> map) {
+        List<Map<String, String>> list = examPrintPlanService.tempalteView(map.get("printPlanId"));
+        return ResultUtil.ok(list);
+    }
+
+    /**
+     * 印刷任务管理-查看PDF
+     *
+     * @param map
+     * @return
+     */
+    @ApiOperation(value = "印刷任务管理-查看PDF")
+    @RequestMapping(value = "/task_view_pdf", method = RequestMethod.POST)
+    public Result taskViewPDF(@RequestBody Map<String, Long> map) {
+        List<JSONObject> list = examDetailService.taskViewPDF(map.get("examDetailId"));
+        return ResultUtil.ok(list);
+    }
+
+    @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());
+        }
+        List<ExamDetail> examDetailList = examDetailService.listByIds(Arrays.asList(arraysParams.getIds()));
+        for (ExamDetail ExamDetail : examDetailList) {
+            if (ExamDetail.getStatus() == ExamDetailStatusEnum.NEW) {
+                throw ExceptionResultEnum.ERROR.exception("状态为新建不能下载");
+            }
+        }
+        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("创建任务失败");
+    }
+
+    /**
+     * 印刷任务做废、恢复
+     *
+     * @param examDetail
+     * @return
+     */
+    @ApiOperation(value = "印刷任务管理-做废/恢复")
+    @RequestMapping(value = "/task_normal", method = RequestMethod.POST)
+    @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
+    public Result taskNormal(@RequestBody ExamDetail examDetail) {
+        boolean isSuccess = examDetailService.taskNormal(examDetail);
+        return ResultUtil.ok(isSuccess);
+    }
+}
+

+ 0 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java

@@ -107,9 +107,6 @@ public class SysController {
     @Resource
     @Resource
     TBSyncTaskService tbSyncTaskService;
     TBSyncTaskService tbSyncTaskService;
 
 
-    @Resource
-    BasicCollegeService basicCollegeService;
-
     @Resource
     @Resource
     AuthInfoService authInfoService;
     AuthInfoService authInfoService;
 
 

+ 10 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/stmms/QuestionDTO.java

@@ -8,6 +8,9 @@ public class QuestionDTO extends QuestionBaseDTO {
 
 
     private Double totalScore;
     private Double totalScore;
 
 
+    // 客观题类型
+    private String type;
+
     public String getMainTitle() {
     public String getMainTitle() {
         return mainTitle;
         return mainTitle;
     }
     }
@@ -32,4 +35,11 @@ public class QuestionDTO extends QuestionBaseDTO {
         this.totalScore = totalScore;
         this.totalScore = totalScore;
     }
     }
 
 
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
 }
 }

+ 22 - 11
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/BasicOperationLogResult.java

@@ -22,10 +22,13 @@ public class BasicOperationLogResult implements Serializable {
 
 
     @JsonSerialize(using = ToStringSerializer.class)
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty("操作人id")
     @ApiModelProperty("操作人id")
-    private Long operatorId;
+    private Long userId;
 
 
-    @ApiModelProperty("操作人名称")
-    private String operatorName;
+    @ApiModelProperty("操作人账号")
+    private String loginName;
+
+    @ApiModelProperty("操作人姓名")
+    private String realName;
 
 
     @ApiModelProperty("IP")
     @ApiModelProperty("IP")
     private String ip;
     private String ip;
@@ -53,20 +56,28 @@ public class BasicOperationLogResult implements Serializable {
         this.detail = detail;
         this.detail = detail;
     }
     }
 
 
-    public Long getOperatorId() {
-        return operatorId;
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getLoginName() {
+        return loginName;
     }
     }
 
 
-    public void setOperatorId(Long operatorId) {
-        this.operatorId = operatorId;
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
     }
     }
 
 
-    public String getOperatorName() {
-        return operatorName;
+    public String getRealName() {
+        return realName;
     }
     }
 
 
-    public void setOperatorName(String operatorName) {
-        this.operatorName = operatorName;
+    public void setRealName(String realName) {
+        this.realName = realName;
     }
     }
 
 
     public String getIp() {
     public String getIp() {

+ 43 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/ObjectiveTypeEnum.java

@@ -0,0 +1,43 @@
+package com.qmth.teachcloud.common.enums;
+
+/**
+ * 客观题类型enum
+ */
+public enum ObjectiveTypeEnum {
+
+    SINGLE(1, "单选题"),
+    MULTIPLE(2, "多选题"),
+
+    TRUE_OR_FALSE(3, "判断题");
+
+    private int type;
+    private String name;
+
+    private ObjectiveTypeEnum(int type, String name) {
+        this.type = type;
+        this.name = name;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param type
+     * @return
+     */
+    public static String getByType(int type) {
+        for (ObjectiveTypeEnum e : ObjectiveTypeEnum.values()) {
+            if (type == e.getType()) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+}

+ 2 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/sync/CloudMarkingTaskUtils.java

@@ -11,6 +11,7 @@ import com.qmth.teachcloud.common.entity.BasicSchool;
 import com.qmth.teachcloud.common.entity.SysConfig;
 import com.qmth.teachcloud.common.entity.SysConfig;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.ObjectiveTypeEnum;
 import com.qmth.teachcloud.common.enums.SyncFileTypeEnum;
 import com.qmth.teachcloud.common.enums.SyncFileTypeEnum;
 import com.qmth.teachcloud.common.enums.SyncModeEnum;
 import com.qmth.teachcloud.common.enums.SyncModeEnum;
 import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
 import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
@@ -717,6 +718,7 @@ public class CloudMarkingTaskUtils {
             validParam(String.valueOf(question.getTotalScore()), null, true, "满分");
             validParam(String.valueOf(question.getTotalScore()), null, true, "满分");
             if (objective) {
             if (objective) {
                 validParam(question.getAnswer(), null, true, "标答");
                 validParam(question.getAnswer(), null, true, "标答");
+                validParam(question.getType(), null, false, "客观题类型");
             }
             }
         }
         }
         return questions;
         return questions;

+ 18 - 16
teachcloud-common/src/main/resources/mapper/BasicOperationLogMapper.xml

@@ -5,43 +5,45 @@
     <select id="findOperationLogPage"
     <select id="findOperationLogPage"
             resultType="com.qmth.teachcloud.common.bean.result.BasicOperationLogResult">
             resultType="com.qmth.teachcloud.common.bean.result.BasicOperationLogResult">
         SELECT
         SELECT
-            id,
-            detail,
-            user_id AS operatorId,
-            user_name AS operatorName,
-            ip,
-            customized_operation_type AS customizedOperationType,
-            create_time AS createTime
+            bol.id,
+            bol.detail,
+            bol.user_id userId,
+            su.login_name loginName,
+            su.real_name realName,
+            bol.ip,
+            bol.customized_operation_type AS customizedOperationType,
+            bol.create_time AS createTime
         FROM
         FROM
-            basic_operation_log
+            basic_operation_log  bol
+                left join sys_user su on bol.user_id = su.id
         <where>
         <where>
             <if test="schoolId != null">
             <if test="schoolId != null">
-                AND school_id = #{schoolId}
+                AND bol.school_id = #{schoolId}
             </if>
             </if>
             <if test="customizedOperationType != null">
             <if test="customizedOperationType != null">
-                AND customized_operation_type = #{customizedOperationType}
+                AND bol.customized_operation_type = #{customizedOperationType}
             </if>
             </if>
             <if test="startTime != null">
             <if test="startTime != null">
-                AND create_time >= #{startTime}
+                AND bol.create_time >= #{startTime}
             </if>
             </if>
             <if test="endTime != null">
             <if test="endTime != null">
-                AND #{endTime} >= create_time
+                AND #{endTime} >= bol.create_time
             </if>
             </if>
             <if test="operatorName != null and operatorName != ''">
             <if test="operatorName != null and operatorName != ''">
-                AND user_name LIKE CONCAT('%',#{operatorName},'%')
+                AND su.login_name LIKE CONCAT('%',#{operatorName},'%')
             </if>
             </if>
             <if test="dpr != null">
             <if test="dpr != null">
                 <if test="dpr.requestUserId != null">
                 <if test="dpr.requestUserId != null">
-                    AND user_id = #{dpr.requestUserId}
+                    AND bol.user_id = #{dpr.requestUserId}
                 </if>
                 </if>
                 <if test="dpr.orgIdSet != null and dpr.orgIdSet != '' and dpr.orgIdSet.size > 0">
                 <if test="dpr.orgIdSet != null and dpr.orgIdSet != '' and dpr.orgIdSet.size > 0">
-                    AND org_id IN
+                    AND bol.org_id IN
                     <foreach collection="dpr.orgIdSet" item="item" index="index" open="(" separator="," close=")">
                     <foreach collection="dpr.orgIdSet" item="item" index="index" open="(" separator="," close=")">
                         #{item}
                         #{item}
                     </foreach>
                     </foreach>
                 </if>
                 </if>
             </if>
             </if>
         </where>
         </where>
-        ORDER BY create_time DESC
+        ORDER BY bol.create_time DESC
     </select>
     </select>
 </mapper>
 </mapper>

+ 8 - 0
teachcloud-task/src/main/java/com/qmth/teachcloud/task/enums/JobEnum.java

@@ -27,6 +27,14 @@ public enum JobEnum {
 
 
     SMS_NOTICE_TASK_RESEND_JOB_GROUP("短信发送失败重发定时任务job组"),
     SMS_NOTICE_TASK_RESEND_JOB_GROUP("短信发送失败重发定时任务job组"),
 
 
+    SYNC_REUNIFY_JOB("自动统分定时任务"),
+
+    SYNC_REUNIFY_JOB_GROUP("自动统分定时任务job组"),
+
+    SYNC_STUDENT_JOB("自动同步考生定时任务"),
+
+    SYNC_STUDENT_JOB_GROUP("自动同步考生定时任务job组"),
+
     REDIS_MQ_JOB("学校信息同步定时任务"),
     REDIS_MQ_JOB("学校信息同步定时任务"),
 
 
     REDIS_MQ_JOB_GROUP("学校信息同步定时任务组");
     REDIS_MQ_JOB_GROUP("学校信息同步定时任务组");

+ 29 - 0
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/AutoSyncJob.java

@@ -0,0 +1,29 @@
+package com.qmth.teachcloud.task.job;
+
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.task.job.service.JobService;
+import org.quartz.JobExecutionContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import javax.annotation.Resource;
+
+/**
+ * 自动同步考生定时任务
+ */
+public class AutoSyncJob extends QuartzJobBean {
+    private final static Logger log = LoggerFactory.getLogger(AutoSyncJob.class);
+
+    @Resource
+    JobService jobService;
+
+    @Override
+    protected void executeInternal(JobExecutionContext jobExecutionContext) {
+        try {
+            jobService.autoSyncStudent();
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        }
+    }
+}

+ 1 - 1
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/ResendSmsJob.java

@@ -20,7 +20,7 @@ public class ResendSmsJob extends QuartzJobBean {
     JobService jobService;
     JobService jobService;
 
 
     @Override
     @Override
-    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+    protected void executeInternal(JobExecutionContext jobExecutionContext) {
         try {
         try {
             jobService.resendSmsTask();
             jobService.resendSmsTask();
         } catch (Exception e) {
         } catch (Exception e) {

+ 29 - 0
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/ReunifyJob.java

@@ -0,0 +1,29 @@
+package com.qmth.teachcloud.task.job;
+
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.task.job.service.JobService;
+import org.quartz.JobExecutionContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import javax.annotation.Resource;
+
+/**
+ * 自动统分定时任务
+ */
+public class ReunifyJob extends QuartzJobBean {
+    private final static Logger log = LoggerFactory.getLogger(ReunifyJob.class);
+
+    @Resource
+    JobService jobService;
+
+    @Override
+    protected void executeInternal(JobExecutionContext jobExecutionContext) {
+        try {
+            jobService.reunifyScore();
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        }
+    }
+}

+ 10 - 1
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/JobService.java

@@ -33,6 +33,16 @@ public interface JobService {
      */
      */
     void resendSmsTask();
     void resendSmsTask();
 
 
+    /**
+     * 自动统分
+     */
+    void reunifyScore();
+
+    /**
+     * 自动同步考生
+     */
+    void autoSyncStudent();
+
     /**
     /**
      * 组装job
      * 组装job
      *
      *
@@ -44,5 +54,4 @@ public interface JobService {
      * 机器心跳
      * 机器心跳
      */
      */
     void machineHeart();
     void machineHeart();
-
 }
 }

+ 17 - 3
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java

@@ -1,9 +1,7 @@
 package com.qmth.teachcloud.task.job.service.impl;
 package com.qmth.teachcloud.task.job.service.impl;
 
 
 import com.qmth.boot.redis.uid.RedisMachineService;
 import com.qmth.boot.redis.uid.RedisMachineService;
-import com.qmth.distributed.print.business.service.BasicMessageService;
-import com.qmth.distributed.print.business.service.PrintCommonService;
-import com.qmth.distributed.print.business.service.SmsSendService;
+import com.qmth.distributed.print.business.service.*;
 import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.common.util.RedisUtil;
@@ -38,6 +36,12 @@ public class JobServiceImpl implements JobService {
     @Resource
     @Resource
     BasicMessageService basicMessageService;
     BasicMessageService basicMessageService;
 
 
+    @Resource
+    ExamPaperStructureService examPaperStructureService;
+
+    @Resource
+    ExamPrintPlanService examPrintPlanService;
+
     @Resource
     @Resource
     RedisUtil redisUtil;
     RedisUtil redisUtil;
 
 
@@ -69,6 +73,16 @@ public class JobServiceImpl implements JobService {
         basicMessageService.resendSmsTask();
         basicMessageService.resendSmsTask();
     }
     }
 
 
+    @Override
+    public void reunifyScore() {
+        examPaperStructureService.reunifyScore();
+    }
+
+    @Override
+    public void autoSyncStudent() {
+        examPrintPlanService.autoSyncStudent();
+    }
+
     @Override
     @Override
     public void machineHeart() {
     public void machineHeart() {
         redisUtil.set(SystemConstant.TASK_MACHINE_ID + redisMachineService.getMachineId(), redisMachineService.getMachineId(), 30, TimeUnit.SECONDS);
         redisUtil.set(SystemConstant.TASK_MACHINE_ID + redisMachineService.getMachineId(), redisMachineService.getMachineId(), 30, TimeUnit.SECONDS);

+ 17 - 4
teachcloud-task/src/main/java/com/qmth/teachcloud/task/start/StartRunning.java

@@ -2,10 +2,7 @@ package com.qmth.teachcloud.task.start;
 
 
 import com.qmth.distributed.print.business.service.PrintCommonService;
 import com.qmth.distributed.print.business.service.PrintCommonService;
 import com.qmth.teachcloud.task.enums.JobEnum;
 import com.qmth.teachcloud.task.enums.JobEnum;
-import com.qmth.teachcloud.task.job.RedisMqSyncJob;
-import com.qmth.teachcloud.task.job.ResendSmsJob;
-import com.qmth.teachcloud.task.job.SendSmsExpireJob;
-import com.qmth.teachcloud.task.job.SendSmsOverdueJob;
+import com.qmth.teachcloud.task.job.*;
 import com.qmth.teachcloud.task.job.service.JobService;
 import com.qmth.teachcloud.task.job.service.JobService;
 import com.qmth.teachcloud.task.service.QuartzService;
 import com.qmth.teachcloud.task.service.QuartzService;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
@@ -83,6 +80,22 @@ public class StartRunning implements CommandLineRunner {
         quartzService.addJob(RedisMqSyncJob.class, JobEnum.REDIS_MQ_JOB.name(), JobEnum.REDIS_MQ_JOB_GROUP.name(), "0 0/1 * * * ?", redisMqJobMap);
         quartzService.addJob(RedisMqSyncJob.class, JobEnum.REDIS_MQ_JOB.name(), JobEnum.REDIS_MQ_JOB_GROUP.name(), "0 0/1 * * * ?", redisMqJobMap);
         log.info("增加mq信息同步定时任务 end");
         log.info("增加mq信息同步定时任务 end");
 
 
+        // 每天0点开始,每2小时一次
+        log.info("增加自动统分定时任务 start");
+        Map reunifyJobMap = new HashMap();
+        reunifyJobMap.computeIfAbsent("name", v -> ReunifyJob.class.getName());
+        quartzService.deleteJob(JobEnum.SYNC_REUNIFY_JOB.name(), JobEnum.SYNC_REUNIFY_JOB_GROUP.name());
+        quartzService.addJob(SendSmsExpireJob.class, JobEnum.SYNC_REUNIFY_JOB.name(), JobEnum.SYNC_REUNIFY_JOB_GROUP.name(), "0 0 0/2 * * ?", reunifyJobMap);
+        log.info("增加自动统分定时任务 end");
+
+        // 每天1点开始,每2小时一次
+        log.info("增加自动同步考生定时任务 start");
+        Map autoSyncStudentJobMap = new HashMap();
+        autoSyncStudentJobMap.computeIfAbsent("name", v -> AutoSyncJob.class.getName());
+        quartzService.deleteJob(JobEnum.SYNC_STUDENT_JOB.name(), JobEnum.SYNC_STUDENT_JOB_GROUP.name());
+        quartzService.addJob(SendSmsExpireJob.class, JobEnum.SYNC_STUDENT_JOB.name(), JobEnum.SYNC_STUDENT_JOB_GROUP.name(), "0 0 1/2 * * ?", autoSyncStudentJobMap);
+        log.info("增加自动同步考生定时任务 end");
+
         log.info("服务器启动时执行 end");
         log.info("服务器启动时执行 end");
     }
     }
 }
 }