Răsfoiți Sursa

3.0.1-同步云阅卷bug修改

xiaof 3 ani în urmă
părinte
comite
40f11380b8
25 a modificat fișierele cu 322 adăugiri și 274 ștergeri
  1. 5 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/SyncExamCardDto.java
  2. 5 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/SyncExamStudentDto.java
  3. 0 11
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamDetailCourse.java
  4. 2 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/EnumType.java
  5. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamPrintPlanMapper.java
  6. 2 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/DataSyncService.java
  7. 4 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPrintPlanService.java
  8. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TBSyncTaskService.java
  9. 100 186
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncServiceImpl.java
  10. 66 12
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPrintPlanServiceImpl.java
  11. 0 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  12. 21 11
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBSyncTaskServiceImpl.java
  13. 31 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCloudMarkingTaskService.java
  14. 1 1
      distributed-print-business/src/main/resources/mapper/ExamCardMapper.xml
  15. 16 7
      distributed-print-business/src/main/resources/mapper/ExamPrintPlanMapper.xml
  16. 1 1
      distributed-print-business/src/main/resources/mapper/ExamStudentMapper.xml
  17. 1 0
      distributed-print-business/src/main/resources/mapper/TBSyncTaskMapper.xml
  18. 3 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/EnumsController.java
  19. 10 12
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPaperStructureController.java
  20. 6 5
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPrintPlanSyncController.java
  21. 5 5
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/stmms/GroupDetailDTO.java
  22. 22 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/SyncListResult.java
  23. 15 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/PushTypeEnum.java
  24. 3 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/sync/CloudMarkingTaskUtils.java
  25. 1 1
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java

+ 5 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/SyncExamCardDto.java

@@ -13,7 +13,7 @@ public class SyncExamCardDto extends ExamCard {
 
 
     private String paperNumber;
     private String paperNumber;
 
 
-    private String paperNumberId;
+    private String sequence;
 
 
     private String title;
     private String title;
 
 
@@ -47,12 +47,12 @@ public class SyncExamCardDto extends ExamCard {
         this.paperNumber = paperNumber;
         this.paperNumber = paperNumber;
     }
     }
 
 
-    public String getPaperNumberId() {
-        return paperNumberId;
+    public String getSequence() {
+        return sequence;
     }
     }
 
 
-    public void setPaperNumberId(String paperNumberId) {
-        this.paperNumberId = paperNumberId;
+    public void setSequence(String sequence) {
+        this.sequence = sequence;
     }
     }
 
 
     @Override
     @Override

+ 5 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/SyncExamStudentDto.java

@@ -14,7 +14,7 @@ public class SyncExamStudentDto extends ExamStudent {
 
 
     private String paperNumber;
     private String paperNumber;
 
 
-    private String paperNumberId;
+    private String sequence;
 
 
     public String getCourseCode() {
     public String getCourseCode() {
         return courseCode;
         return courseCode;
@@ -40,11 +40,11 @@ public class SyncExamStudentDto extends ExamStudent {
         this.paperNumber = paperNumber;
         this.paperNumber = paperNumber;
     }
     }
 
 
-    public String getPaperNumberId() {
-        return paperNumberId;
+    public String getSequence() {
+        return sequence;
     }
     }
 
 
-    public void setPaperNumberId(String paperNumberId) {
-        this.paperNumberId = paperNumberId;
+    public void setSequence(String sequence) {
+        this.sequence = sequence;
     }
     }
 }
 }

+ 0 - 11
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamDetailCourse.java

@@ -46,9 +46,6 @@ public class ExamDetailCourse extends BaseEntity implements Serializable {
     @TableField("paper_number")
     @TableField("paper_number")
     private String paperNumber;
     private String paperNumber;
 
 
-    @TableField("sequence")
-    private String sequence;
-
     @TableField("total_subjects")
     @TableField("total_subjects")
     private Integer totalSubjects;
     private Integer totalSubjects;
 
 
@@ -137,14 +134,6 @@ public class ExamDetailCourse extends BaseEntity implements Serializable {
         this.paperNumber = paperNumber;
         this.paperNumber = paperNumber;
     }
     }
 
 
-    public String getSequence() {
-        return sequence;
-    }
-
-    public void setSequence(String sequence) {
-        this.sequence = sequence;
-    }
-
     public Integer getTotalSubjects() {
     public Integer getTotalSubjects() {
         return totalSubjects;
         return totalSubjects;
     }
     }

+ 2 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/EnumType.java

@@ -26,7 +26,8 @@ public enum EnumType {
     EXAM_DETAIL_STATUS_ENUM("考场状态类型"),
     EXAM_DETAIL_STATUS_ENUM("考场状态类型"),
     EXAMINATION_DB_FIELDS_ENUM("考务数据导入-数据库所必须字段枚举"),
     EXAMINATION_DB_FIELDS_ENUM("考务数据导入-数据库所必须字段枚举"),
     CARD_TYPE("题卡类型"),
     CARD_TYPE("题卡类型"),
-    SYSTEM_CODE_ENUM("系统编码类型");
+    SYSTEM_CODE_ENUM("系统编码类型"),
+    PUSH_TYPE_ENUM("同步云阅卷类型类型");
 
 
     EnumType(String desc) {
     EnumType(String desc) {
         this.desc = desc;
         this.desc = desc;

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

@@ -54,7 +54,7 @@ public interface ExamPrintPlanMapper extends BaseMapper<ExamPrintPlan> {
 
 
     ClientPrintStatisticsTotalDto clientStatisticsTotalData(@Param("schoolId") Long schoolId, @Param("printPlanId") String printPlanId, @Param("examPlace") String examPlace, @Param("examStartTime") Long examStartTime, @Param("examEndTime") Long examEndTime, @Param("courseCode") String courseCode, @Param("paperNumber") String paperNumber, @Param("orgId") Long orgId, @Param("examDetailStatus") String[] examDetailStatus);
     ClientPrintStatisticsTotalDto clientStatisticsTotalData(@Param("schoolId") Long schoolId, @Param("printPlanId") String printPlanId, @Param("examPlace") String examPlace, @Param("examStartTime") Long examStartTime, @Param("examEndTime") Long examEndTime, @Param("courseCode") String courseCode, @Param("paperNumber") String paperNumber, @Param("orgId") Long orgId, @Param("examDetailStatus") String[] examDetailStatus);
 
 
-    List<ThirdObjectDto> listThirdObject(Long schoolId);
+    List<ThirdObjectDto> listThirdObject(@Param("schoolId") Long schoolId, @Param("semesterId") Long semesterId, @Param("examId") Long examId);
 
 
     List<PrintPlanBrief> listToClient(@Param("schoolId") Long schoolId, @Param("source") String source, @Param("module") String module, @Param("status") String[] status, @Param("orgId") Long orgId);
     List<PrintPlanBrief> listToClient(@Param("schoolId") Long schoolId, @Param("source") String source, @Param("module") String module, @Param("status") String[] status, @Param("orgId") Long orgId);
 }
 }

+ 2 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/DataSyncService.java

@@ -1,8 +1,8 @@
 package com.qmth.distributed.print.business.service;
 package com.qmth.distributed.print.business.service;
 
 
-import com.qmth.distributed.print.business.bean.params.SyncDataParam;
 import com.qmth.distributed.print.business.entity.ExamPaperStructure;
 import com.qmth.distributed.print.business.entity.ExamPaperStructure;
 import com.qmth.distributed.print.business.entity.TBSyncTask;
 import com.qmth.distributed.print.business.entity.TBSyncTask;
+import com.qmth.teachcloud.common.entity.SysUser;
 
 
 /**
 /**
  * 同步数据到云阅卷 服务类
  * 同步数据到云阅卷 服务类
@@ -10,9 +10,7 @@ import com.qmth.distributed.print.business.entity.TBSyncTask;
 public interface DataSyncService {
 public interface DataSyncService {
     void syncToCloudReview();
     void syncToCloudReview();
 
 
-    void syncDataCloud(Long printPlanId, Long thirdRelateId);
-
-    void syncDataMerge(SyncDataParam syncDataParam);
+    void syncExamAndStudentAndCard(Long relateId, String thirdRelateName, Long examEndTime, TBSyncTask tbSyncTask, SysUser sysUser);
 
 
     void syncPaperStructureAndGroup(ExamPaperStructure examPaperStructure, TBSyncTask tbSyncTask);
     void syncPaperStructureAndGroup(ExamPaperStructure examPaperStructure, TBSyncTask tbSyncTask);
 
 

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

@@ -90,14 +90,14 @@ public interface ExamPrintPlanService extends IService<ExamPrintPlan> {
 
 
     ClientPrintStatisticsTotalDto clientStatisticsTotalData(Long orgId, String printPlanId, String examPlace, Long examStartTime, Long examEndTime, String courseCode, String paperNumber);
     ClientPrintStatisticsTotalDto clientStatisticsTotalData(Long orgId, String printPlanId, String examPlace, Long examStartTime, Long examEndTime, String courseCode, String paperNumber);
 
 
-    void syncDataCloud(Long printPlanId, Long thirdRelateId);
-
-    void syncDataMerge(SyncDataParam syncDataParam);
+    List<ThirdObjectDto> printSyncPlan(Long schoolId, Long semesterId, Long examId);
 
 
-    List<ThirdObjectDto> printSyncPlan(Long schoolId);
+    void syncDataCloud(Long printPlanId, Long thirdRelateId);
 
 
     void syncDataCloudBatch(SyncDataParam syncDataParam);
     void syncDataCloudBatch(SyncDataParam syncDataParam);
 
 
+    void syncDataMerge(SyncDataParam syncDataParam);
+
     /**
     /**
      * 根据考场详情表查找印刷计划
      * 根据考场详情表查找印刷计划
      *
      *

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

@@ -20,7 +20,7 @@ public interface TBSyncTaskService extends IService<TBSyncTask> {
 
 
     TBSyncTask saveTask(Long schoolId, Long objectId, PushTypeEnum type);
     TBSyncTask saveTask(Long schoolId, Long objectId, PushTypeEnum type);
 
 
-    void updateStatusAndResultById(Long id, TaskStatusEnum status, TaskResultEnum result, String errorMessage);
+    void updateStatusAndResultById(Long id, Long thirdRelateId, TaskStatusEnum status, TaskResultEnum result, String errorMessage);
 
 
     TBSyncTask savePushCommon(PushTypeEnum pushTypeEnum, Map map, SysUser sysUser);
     TBSyncTask savePushCommon(PushTypeEnum pushTypeEnum, Map map, SysUser sysUser);
 
 

+ 100 - 186
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncServiceImpl.java

@@ -7,11 +7,10 @@ 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.SyncExamCardDto;
 import com.qmth.distributed.print.business.bean.dto.SyncExamCardDto;
 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.params.SyncDataParam;
 import com.qmth.distributed.print.business.entity.*;
 import com.qmth.distributed.print.business.entity.*;
+import com.qmth.distributed.print.business.enums.ExamPaperStructureStatusEnum;
 import com.qmth.distributed.print.business.enums.ExamPrintPlanSyncStatusEnum;
 import com.qmth.distributed.print.business.enums.ExamPrintPlanSyncStatusEnum;
 import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
-import com.qmth.distributed.print.business.enums.ExamPaperStructureStatusEnum;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.teachcloud.common.bean.dto.stmms.GroupDetailDTO;
 import com.qmth.teachcloud.common.bean.dto.stmms.GroupDetailDTO;
 import com.qmth.teachcloud.common.bean.dto.stmms.PicConfig;
 import com.qmth.teachcloud.common.bean.dto.stmms.PicConfig;
@@ -19,12 +18,13 @@ import com.qmth.teachcloud.common.bean.dto.stmms.QuestionBaseDTO;
 import com.qmth.teachcloud.common.bean.dto.stmms.QuestionDTO;
 import com.qmth.teachcloud.common.bean.dto.stmms.QuestionDTO;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
-import com.qmth.teachcloud.common.entity.SysConfig;
 import com.qmth.teachcloud.common.entity.SysOrg;
 import com.qmth.teachcloud.common.entity.SysOrg;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.entity.SysUser;
-import com.qmth.teachcloud.common.enums.*;
+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.service.BasicAttachmentService;
 import com.qmth.teachcloud.common.service.BasicAttachmentService;
-import com.qmth.teachcloud.common.service.SysConfigService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
 import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
@@ -43,7 +43,7 @@ import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
- * @Date: 2021/5/20.
+ * 同步服务类
  */
  */
 @Service
 @Service
 public class DataSyncServiceImpl implements DataSyncService {
 public class DataSyncServiceImpl implements DataSyncService {
@@ -68,8 +68,6 @@ public class DataSyncServiceImpl implements DataSyncService {
     @Resource
     @Resource
     private ExamPaperStructureService examPaperStructureService;
     private ExamPaperStructureService examPaperStructureService;
 
 
-    @Resource
-    private SysConfigService sysConfigService;
 
 
     @Resource
     @Resource
     private TeachcloudCommonService teachcloudCommonService;
     private TeachcloudCommonService teachcloudCommonService;
@@ -88,8 +86,6 @@ public class DataSyncServiceImpl implements DataSyncService {
 
 
     ExecutorService executorService = Executors.newFixedThreadPool(5);
     ExecutorService executorService = Executors.newFixedThreadPool(5);
 
 
-    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
-
     /**
     /**
      * 定时任务批量同步
      * 定时任务批量同步
      */
      */
@@ -103,81 +99,62 @@ public class DataSyncServiceImpl implements DataSyncService {
         List<ExamPrintPlan> examPrintPlans = examPrintPlanService.list(queryWrapper);
         List<ExamPrintPlan> examPrintPlans = examPrintPlanService.list(queryWrapper);
         if (!CollectionUtils.isEmpty(examPrintPlans)) {
         if (!CollectionUtils.isEmpty(examPrintPlans)) {
             for (ExamPrintPlan examPrintPlan : examPrintPlans) {
             for (ExamPrintPlan examPrintPlan : examPrintPlans) {
-                executorService.execute(syncBaseData(examPrintPlan, null, examPrintPlan.getName(), sysUser));
+//                executorService.execute(syncBaseData(examPrintPlan, null, examPrintPlan.getName(), sysUser));
             }
             }
         }
         }
     }
     }
 
 
-    /**
-     * 单个同步
-     *
-     * @param printPlanId
-     * @param thirdRelateId
-     */
-    @Override
-    public void syncDataCloud(Long printPlanId, Long thirdRelateId) {
-        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        ExamPrintPlan examPrintPlan = examPrintPlanService.getById(printPlanId);
-        if (examPrintPlan == null) {
-            throw ExceptionResultEnum.ERROR.exception("印刷计划数据异常");
-        }
-        if (!PrintPlanStatusEnum.END.equals(examPrintPlan.getStatus()) && !PrintPlanStatusEnum.PRINT_FINISH.equals(examPrintPlan.getStatus())) {
-            throw ExceptionResultEnum.ERROR.exception("印刷计划未打印完成或者未结束,不能同步数据");
-        }
-        Long relateId = Objects.isNull(thirdRelateId) ? examPrintPlan.getThirdRelateId() : thirdRelateId;
-        String thirdRelateName = Objects.isNull(examPrintPlan.getThirdRelateId()) ? examPrintPlan.getName() : examPrintPlan.getThirdRelateName();
-        executorService.execute(syncBaseData(examPrintPlan, relateId, thirdRelateName, sysUser));
-
-    }
-
+    @Async
     @Override
     @Override
-    public void syncDataMerge(SyncDataParam syncDataParam) {
-        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        List<Long> printPlans = syncDataParam.getList();
-        if (CollectionUtils.isEmpty(printPlans)) {
-            throw ExceptionResultEnum.ERROR.exception("请选择需要合并的印刷任务");
-        }
+    public void syncExamAndStudentAndCard(Long thirdRelateId, String thirdRelateName, Long examEndTime, TBSyncTask tbSyncTask, SysUser sysUser) {
+        UpdateWrapper<ExamPrintPlan> updateWrapper = new UpdateWrapper<>();
+        ExamPrintPlanSyncStatusEnum syncStatus = ExamPrintPlanSyncStatusEnum.INIT;
 
 
-        if (Objects.isNull(syncDataParam.getThirdRelateId()) && Objects.isNull(syncDataParam.getThirdRelateName())) {
-            throw ExceptionResultEnum.ERROR.exception("考试ID、考试名称至少填一个");
-        }
+        // 同步初始参数
+        TaskResultEnum result = null;
+        TaskStatusEnum status;
+        String errorMessage = null;
+        Long schoolId = tbSyncTask.getSchoolId();
+        Long printPlanId = tbSyncTask.getObjectId();
+        try {
+            // 同步中
+            status = TaskStatusEnum.RUNNING;
+            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), null, status, null, null);
 
 
-        // todo 校验印刷计划是否完成
-        if (syncDataParam.getThirdRelateId() == null) {
-            String time = String.valueOf(System.currentTimeMillis());
-            QueryWrapper<ExamPrintPlan> printPlanQueryWrapper = new QueryWrapper<>();
-            printPlanQueryWrapper.lambda().in(ExamPrintPlan::getId, syncDataParam.getList());
-            List<ExamPrintPlan> examPrintPlans = examPrintPlanService.list(printPlanQueryWrapper);
-            ExamPrintPlan examPrintPlan = examPrintPlans.stream().max(Comparator.comparingLong(ExamPrintPlan::getExamEndTime)).get();
-            String examTime = DateUtil.format(new Date(examPrintPlan.getExamEndTime()), DATE_FORMAT);
-            syncDataParam.setThirdRelateId(cloudMarkingTaskUtils.syncExam(examPrintPlan.getSchoolId(), time, syncDataParam.getThirdRelateName(), examTime));
-        }
+            // 同步计划 -> 同步到云阅卷考试
+            thirdRelateId = saveExam(schoolId, printPlanId, thirdRelateId, thirdRelateName, examEndTime);
+            syncStatus = ExamPrintPlanSyncStatusEnum.EXAM_FINISH;
+            tbSyncTask.setThirdRelateId(thirdRelateId);
+            // 考试同步成功,才能同步考生和题卡
+            if (Objects.nonNull(thirdRelateId)) {
+                updateWrapper.lambda().set(ExamPrintPlan::getThirdRelateId, thirdRelateId).set(ExamPrintPlan::getThirdRelateName, thirdRelateName);
+                // 同步考生
+                saveStudent(schoolId, printPlanId, thirdRelateId);
+                syncStatus = ExamPrintPlanSyncStatusEnum.STUDENT_FINISH;
+                // 同步题卡
+                cardUpload(schoolId, printPlanId, thirdRelateId);
+                syncStatus = ExamPrintPlanSyncStatusEnum.FINISH;
+            } else {
+                throw ExceptionResultEnum.ERROR.exception("无法获取云阅卷考试ID,同步数据失败");
+            }
+            // 任务结果
+            result = TaskResultEnum.SUCCESS;
+        } catch (Exception e) {
+            result = TaskResultEnum.ERROR;
+            errorMessage = e.getMessage();
+        } finally {
+            // 同步结束
+            status = TaskStatusEnum.FINISH;
 
 
-        for (Long printPlanId : printPlans) {
-            ExamPrintPlan printPlan = examPrintPlanService.getById(printPlanId);
-            executorService.execute(syncBaseData(printPlan, syncDataParam.getThirdRelateId(), syncDataParam.getThirdRelateName(), sysUser));
-        }
-    }
+            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), thirdRelateId, status, result, errorMessage);
 
 
-    /**
-     * 同步基础信息
-     *
-     * @param examPrintPlan
-     * @param thirdRelateId
-     * @param thirdRelateName
-     * @return
-     */
-    private TimerTask syncBaseData(ExamPrintPlan examPrintPlan, Long thirdRelateId, String thirdRelateName, SysUser sysUser) {
-        return new TimerTask() {
-            @Override
-            public void run() {
-                SysConfig sysConfig = sysConfigService.getByKey("sys.sync.enable");
-                if (sysConfig != null && "true".equals(sysConfig.getConfigValue())) {
-                    TBSyncTask syncTask = tbSyncTaskService.saveTask(examPrintPlan.getSchoolId(), examPrintPlan.getId(), PushTypeEnum.EXAM_PUSH);
-                    doSyncBaseData(examPrintPlan, thirdRelateId, thirdRelateName, syncTask, sysUser);
-                }
+            updateWrapper.lambda().set(ExamPrintPlan::getSyncStatus, syncStatus).eq(ExamPrintPlan::getId, printPlanId);
+            examPrintPlanService.update(updateWrapper);
+            // 同步成功,发送短信
+            if (ExamPrintPlanSyncStatusEnum.FINISH.equals(syncStatus)) {
+                examPrintPlanService.sendNoticeUploadStructure(printPlanId, sysUser);
             }
             }
-        };
+        }
     }
     }
 
 
     @Async
     @Async
@@ -201,7 +178,7 @@ public class DataSyncServiceImpl implements DataSyncService {
             String subjectCode = examPaperStructure.getCourseCode().concat(examPaperStructure.getPaperType()).concat(examPaperStructure.getSequence());
             String subjectCode = examPaperStructure.getCourseCode().concat(examPaperStructure.getPaperType()).concat(examPaperStructure.getSequence());
 
 
             // 同步中
             // 同步中
-            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), TaskStatusEnum.RUNNING, null, null);
+            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), examPaperStructure.getThirdRelateId(), TaskStatusEnum.RUNNING, null, null);
 
 
             // 同步主观题
             // 同步主观题
             String subjectiveStructure = examPaperStructure.getSubjectiveStructure();
             String subjectiveStructure = examPaperStructure.getSubjectiveStructure();
@@ -235,13 +212,13 @@ public class DataSyncServiceImpl implements DataSyncService {
                     String picListString = examPaperGroup.getPictureConfig();
                     String picListString = examPaperGroup.getPictureConfig();
                     if (StringUtils.isNotBlank(picListString)) {
                     if (StringUtils.isNotBlank(picListString)) {
                         List<PicConfig> picConfigs = JSONObject.parseArray(picListString, PicConfig.class);
                         List<PicConfig> picConfigs = JSONObject.parseArray(picListString, PicConfig.class);
-                        groupDetailDTO.setPicList(picConfigs);
+                        groupDetailDTO.setPicConfig(picConfigs);
                     }
                     }
                     groupDetailDTO.setDoubleRate(examPaperGroup.getDoubleRate());
                     groupDetailDTO.setDoubleRate(examPaperGroup.getDoubleRate());
                     groupDetailDTO.setArbitrateThreshold(examPaperGroup.getArbitrateThreshold());
                     groupDetailDTO.setArbitrateThreshold(examPaperGroup.getArbitrateThreshold());
                     groupDetailDTO.setScorePolicy(examPaperGroup.getScorePolicy().getValue());
                     groupDetailDTO.setScorePolicy(examPaperGroup.getScorePolicy().getValue());
 //                    groupDetailDTO.setEnableAllZero();
 //                    groupDetailDTO.setEnableAllZero();
-                    groupDetailDTO.setMarkMode("");
+//                    groupDetailDTO.setMarkMode(null);
                     String questionsString = examPaperGroup.getQuestionInfo();
                     String questionsString = examPaperGroup.getQuestionInfo();
                     if (StringUtils.isNotBlank(questionsString)) {
                     if (StringUtils.isNotBlank(questionsString)) {
                         List<JSONObject> jsonObjects = JSONObject.parseArray(questionsString, JSONObject.class);
                         List<JSONObject> jsonObjects = JSONObject.parseArray(questionsString, JSONObject.class);
@@ -275,7 +252,7 @@ public class DataSyncServiceImpl implements DataSyncService {
             examPaperStructure.setStatus(structureStatus);
             examPaperStructure.setStatus(structureStatus);
             examPaperStructureService.updateById(examPaperStructure);
             examPaperStructureService.updateById(examPaperStructure);
 
 
-            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), TaskStatusEnum.FINISH, result, errorMessage);
+            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), examPaperStructure.getThirdRelateId(), TaskStatusEnum.FINISH, result, errorMessage);
         }
         }
     }
     }
 
 
@@ -293,14 +270,15 @@ public class DataSyncServiceImpl implements DataSyncService {
             String subjectCode = examPaperStructure.getCourseCode().concat(examPaperStructure.getPaperType()).concat(examPaperStructure.getSequence());
             String subjectCode = examPaperStructure.getCourseCode().concat(examPaperStructure.getPaperType()).concat(examPaperStructure.getSequence());
 
 
             // 同步中
             // 同步中
-            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), TaskStatusEnum.RUNNING, null, null);
-            // 同步试卷
+            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), examPaperStructure.getThirdRelateId(), TaskStatusEnum.RUNNING, null, null);
+
             String paperAnswer = examPaperStructure.getPaperAnswer();
             String paperAnswer = examPaperStructure.getPaperAnswer();
             if (StringUtils.isNotBlank(paperAnswer)) {
             if (StringUtils.isNotBlank(paperAnswer)) {
                 List<JSONObject> paperAnswerJsons = JSONObject.parseArray(paperAnswer, JSONObject.class);
                 List<JSONObject> paperAnswerJsons = JSONObject.parseArray(paperAnswer, JSONObject.class);
                 for (JSONObject paperAnswerJson : paperAnswerJsons) {
                 for (JSONObject paperAnswerJson : paperAnswerJsons) {
                     if (paperAnswerJson.containsKey("paperType") && paperAnswerJson.containsKey("paper")) {
                     if (paperAnswerJson.containsKey("paperType") && paperAnswerJson.containsKey("paper")) {
                         String paperType = paperAnswerJson.getString("paperType");
                         String paperType = paperAnswerJson.getString("paperType");
+                        // 同步试卷
                         String paper = paperAnswerJson.getString("paper");
                         String paper = paperAnswerJson.getString("paper");
                         if (StringUtils.isAnyBlank(paperType, paper)) {
                         if (StringUtils.isAnyBlank(paperType, paper)) {
                             continue;
                             continue;
@@ -310,17 +288,8 @@ public class DataSyncServiceImpl implements DataSyncService {
                         String syncPaperFileUrl = cloudMarkingTaskUtils.syncFile(schoolId, examId, subjectCode, SyncFileTypeEnum.PAPER, paperFile);
                         String syncPaperFileUrl = cloudMarkingTaskUtils.syncFile(schoolId, examId, subjectCode, SyncFileTypeEnum.PAPER, paperFile);
                         // 试卷文件保存url
                         // 试卷文件保存url
                         paperAnswerJson.put("paperUrl", syncPaperFileUrl);
                         paperAnswerJson.put("paperUrl", syncPaperFileUrl);
-                    }
-                }
-                examPaperStructure.setPaperAnswer(JSONObject.toJSONString(paperAnswerJsons));
-            }
 
 
-            // 同步标答
-            if (StringUtils.isNotBlank(paperAnswer)) {
-                List<JSONObject> paperAnswerJsons = JSONObject.parseArray(paperAnswer, JSONObject.class);
-                for (JSONObject paperAnswerJson : paperAnswerJsons) {
-                    if (paperAnswerJson.containsKey("paperType") && paperAnswerJson.containsKey("answer")) {
-                        String paperType = paperAnswerJson.getString("paperType");
+                        // 同步标答
                         String answer = paperAnswerJson.getString("answer");
                         String answer = paperAnswerJson.getString("answer");
                         if (StringUtils.isAnyBlank(paperType, answer)) {
                         if (StringUtils.isAnyBlank(paperType, answer)) {
                             continue;
                             continue;
@@ -332,14 +301,20 @@ public class DataSyncServiceImpl implements DataSyncService {
                         paperAnswerJson.put("answerUrl", syncAnswerFileUrl);
                         paperAnswerJson.put("answerUrl", syncAnswerFileUrl);
                     }
                     }
                 }
                 }
-                examPaperStructure.setPaperAnswer(JSONObject.toJSONString(paperAnswerJsons));
+                String paperAnswerUrl = JSONObject.toJSONString(paperAnswerJsons);
+
+                // 更新url
+                UpdateWrapper<ExamPaperStructure> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.lambda().set(ExamPaperStructure::getPaperAnswer, paperAnswerUrl).eq(ExamPaperStructure::getId, examPaperStructure.getId());
+                examPaperStructureService.update(updateWrapper);
             }
             }
+
             result = TaskResultEnum.SUCCESS;
             result = TaskResultEnum.SUCCESS;
         } catch (ApiException e) {
         } catch (ApiException e) {
             result = TaskResultEnum.ERROR;
             result = TaskResultEnum.ERROR;
             errorMessage = e.getMessage();
             errorMessage = e.getMessage();
         } finally {
         } finally {
-            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), TaskStatusEnum.FINISH, result, errorMessage);
+            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), examPaperStructure.getThirdRelateId(), TaskStatusEnum.FINISH, result, errorMessage);
         }
         }
     }
     }
 
 
@@ -376,84 +351,25 @@ public class DataSyncServiceImpl implements DataSyncService {
             result = TaskResultEnum.ERROR;
             result = TaskResultEnum.ERROR;
             errorMessage = e.getMessage();
             errorMessage = e.getMessage();
         } finally {
         } finally {
-            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), TaskStatusEnum.FINISH, result, errorMessage);
+            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), examPaperStructure.getThirdRelateId(), TaskStatusEnum.FINISH, result, errorMessage);
         }
         }
     }
     }
 
 
     /**
     /**
-     * 同步考试、考生、科目、题卡
+     * 创建考试
      *
      *
-     * @param examPrintPlan   计划
+     * @param schoolId        学校ID
+     * @param printPlanId     计划ID
      * @param thirdRelateId   云阅卷考试ID
      * @param thirdRelateId   云阅卷考试ID
      * @param thirdRelateName 云阅卷考试名称
      * @param thirdRelateName 云阅卷考试名称
-     * @param syncTask        同步任务对象
-     * @param sysUser         登录用户
-     */
-    public void doSyncBaseData(ExamPrintPlan examPrintPlan, Long thirdRelateId, String thirdRelateName, TBSyncTask syncTask, SysUser sysUser) {
-        UpdateWrapper<ExamPrintPlan> updateWrapper = new UpdateWrapper<>();
-        ExamPrintPlanSyncStatusEnum syncStatus = ExamPrintPlanSyncStatusEnum.INIT;
-
-        // 同步初始参数
-        TaskResultEnum result = null;
-        TaskStatusEnum status;
-        String errorMessage = null;
-        try {
-            if (!PrintPlanStatusEnum.END.equals(examPrintPlan.getStatus()) && !PrintPlanStatusEnum.PRINT_FINISH.equals(examPrintPlan.getStatus())) {
-                throw ExceptionResultEnum.ERROR.exception("印刷计划未打印完成或者未结束,不能同步数据");
-            }
-            // 同步中
-            status = TaskStatusEnum.RUNNING;
-            tbSyncTaskService.updateStatusAndResultById(syncTask.getId(), status, null, null);
-
-            // 同步计划 -> 同步到云阅卷考试
-            thirdRelateId = saveExam(examPrintPlan, thirdRelateId);
-            syncStatus = ExamPrintPlanSyncStatusEnum.EXAM_FINISH;
-            syncTask.setThirdRelateId(thirdRelateId);
-            // 考试同步成功,才能同步考生和题卡
-            if (Objects.nonNull(thirdRelateId)) {
-                updateWrapper.lambda().set(ExamPrintPlan::getThirdRelateId, thirdRelateId).set(ExamPrintPlan::getThirdRelateName, thirdRelateName);
-                // 同步考生
-                saveStudent(examPrintPlan.getSchoolId(), examPrintPlan.getId(), thirdRelateId);
-                syncStatus = ExamPrintPlanSyncStatusEnum.STUDENT_FINISH;
-                // 同步题卡
-                cardUpload(examPrintPlan.getSchoolId(), examPrintPlan.getId(), thirdRelateId);
-                syncStatus = ExamPrintPlanSyncStatusEnum.FINISH;
-            } else {
-                throw ExceptionResultEnum.ERROR.exception("无法获取云阅卷考试ID,同步数据失败");
-            }
-            // 任务结果
-            result = TaskResultEnum.SUCCESS;
-        } catch (Exception e) {
-            result = TaskResultEnum.ERROR;
-            errorMessage = e.getMessage();
-        } finally {
-            // 同步结束
-            status = TaskStatusEnum.FINISH;
-            tbSyncTaskService.updateStatusAndResultById(syncTask.getId(), status, result, errorMessage);
-
-            updateWrapper.lambda().set(ExamPrintPlan::getSyncStatus, syncStatus).eq(ExamPrintPlan::getId, examPrintPlan.getId());
-            examPrintPlanService.update(updateWrapper);
-            // 同步成功,发送短信
-            if (ExamPrintPlanSyncStatusEnum.FINISH.equals(syncStatus)) {
-                examPrintPlanService.sendNoticeUploadStructure(examPrintPlan.getId(), sysUser);
-            }
-        }
-
-    }
-
-    /**
-     * 创建考试
-     *
-     * @param examPrintPlan
-     * @return
+     * @param examEndTime     考试时间
      */
      */
-    public Long saveExam(ExamPrintPlan examPrintPlan, Long thirdRelateId) {
+    public Long saveExam(Long schoolId, Long printPlanId, Long thirdRelateId, String thirdRelateName, Long examEndTime) {
         try {
         try {
             if (Objects.isNull(thirdRelateId)) {
             if (Objects.isNull(thirdRelateId)) {
-                String code = String.valueOf(examPrintPlan.getId());
-                String name = examPrintPlan.getName();
-                String examTime = DateUtil.format(new Date(examPrintPlan.getExamEndTime()), DATE_FORMAT);
-                thirdRelateId = cloudMarkingTaskUtils.syncExam(examPrintPlan.getSchoolId(), code, name, examTime);
+                String code = String.valueOf(printPlanId);
+                String examTime = DateUtil.format(new Date(examEndTime), CloudMarkingTaskUtils.DATE_FORMAT);
+                thirdRelateId = cloudMarkingTaskUtils.syncExam(schoolId, code, thirdRelateName, examTime);
             }
             }
             return thirdRelateId;
             return thirdRelateId;
         } catch (Exception e) {
         } catch (Exception e) {
@@ -464,7 +380,9 @@ public class DataSyncServiceImpl implements DataSyncService {
     /**
     /**
      * 新增考生
      * 新增考生
      *
      *
-     * @return
+     * @param schoolId        学校ID
+     * @param examPrintPlanId 计划ID
+     * @param thirdRelateId   云阅卷考试ID
      */
      */
     public void saveStudent(Long schoolId, Long examPrintPlanId, Long thirdRelateId) {
     public void saveStudent(Long schoolId, Long examPrintPlanId, Long thirdRelateId) {
         List<SyncExamStudentDto> examStudents = examStudentService.listStudentByPrintPlanIdAndSyncStatus(examPrintPlanId);
         List<SyncExamStudentDto> examStudents = examStudentService.listStudentByPrintPlanIdAndSyncStatus(examPrintPlanId);
@@ -479,8 +397,8 @@ public class DataSyncServiceImpl implements DataSyncService {
                 String college = Objects.nonNull(sysOrg) && StringUtils.isNotBlank(sysOrg.getName()) ? sysOrg.getName() : "无";
                 String college = Objects.nonNull(sysOrg) && StringUtils.isNotBlank(sysOrg.getName()) ? sysOrg.getName() : "无";
                 String className = StringUtils.isBlank(examStudent.getClazzName()) ? getClassName(examStudent.getExtendFields()) : examStudent.getClazzName();
                 String className = StringUtils.isBlank(examStudent.getClazzName()) ? getClassName(examStudent.getExtendFields()) : examStudent.getClazzName();
                 String teacher = "无";
                 String teacher = "无";
-                String subjectCode = examStudent.getPaperNumberId() + examStudent.getPaperType(); // 取试卷编号
-                String subjectName = examStudent.getPaperNumber() + examStudent.getPaperType() + "-" + examStudent.getCourseName();
+                String subjectCode = examStudent.getCourseCode() + examStudent.getPaperType() + examStudent.getSequence(); // 取试卷编号
+                String subjectName = examStudent.getCourseName();
                 boolean syncStudent = cloudMarkingTaskUtils.syncStudent(schoolId, examId, examNumber, studentCode, name, college, className, teacher, subjectCode, subjectName, null, null, null, null);
                 boolean syncStudent = cloudMarkingTaskUtils.syncStudent(schoolId, examId, examNumber, studentCode, name, college, className, teacher, subjectCode, subjectName, null, null, null, null);
 
 
                 if (syncStudent) {
                 if (syncStudent) {
@@ -497,7 +415,9 @@ public class DataSyncServiceImpl implements DataSyncService {
     /**
     /**
      * 同步题卡
      * 同步题卡
      *
      *
-     * @return
+     * @param schoolId        学校ID
+     * @param examPrintPlanId 计划ID
+     * @param thirdRelateId   云阅卷考试ID
      */
      */
     public void cardUpload(Long schoolId, Long examPrintPlanId, Long thirdRelateId) {
     public void cardUpload(Long schoolId, Long examPrintPlanId, Long thirdRelateId) {
         List<ExamDetailCourse> examDetailCourses = examDetailService.listSyncPaperNumberByPrintPlanId(examPrintPlanId);
         List<ExamDetailCourse> examDetailCourses = examDetailService.listSyncPaperNumberByPrintPlanId(examPrintPlanId);
@@ -509,18 +429,15 @@ public class DataSyncServiceImpl implements DataSyncService {
             if (CollectionUtils.isEmpty(syncExamCardDtos)) {
             if (CollectionUtils.isEmpty(syncExamCardDtos)) {
                 return;
                 return;
             }
             }
-
             if (syncExamCardDtos.size() > 1) {
             if (syncExamCardDtos.size() > 1) {
                 log.info("数据异常,通过学校:{},课程代码:{},试卷编号:{}查出{}个题卡数据", examDetailCours.getSchoolId(), examDetailCours.getCourseCode(), examDetailCours.getPaperNumber(), syncExamCardDtos.size());
                 log.info("数据异常,通过学校:{},课程代码:{},试卷编号:{}查出{}个题卡数据", examDetailCours.getSchoolId(), examDetailCours.getCourseCode(), examDetailCours.getPaperNumber(), syncExamCardDtos.size());
                 return;
                 return;
             }
             }
-
             String paperType = examDetailCours.getPaperType();
             String paperType = examDetailCours.getPaperType();
             if (StringUtils.isBlank(paperType)) {
             if (StringUtils.isBlank(paperType)) {
                 log.info("数据异常,通过学校:{},课程代码:{},试卷编号:{}查出绑定试卷类型为空", examDetailCours.getSchoolId(), examDetailCours.getCourseCode(), examDetailCours.getPaperNumber());
                 log.info("数据异常,通过学校:{},课程代码:{},试卷编号:{}查出绑定试卷类型为空", examDetailCours.getSchoolId(), examDetailCours.getCourseCode(), examDetailCours.getPaperNumber());
                 return;
                 return;
             }
             }
-
             SyncExamCardDto syncExamCardDto = syncExamCardDtos.get(0);
             SyncExamCardDto syncExamCardDto = syncExamCardDtos.get(0);
             if (StringUtils.isNotEmpty(syncExamCardDto.getContent())) {
             if (StringUtils.isNotEmpty(syncExamCardDto.getContent())) {
                 for (String s : paperType.split(",")) {
                 for (String s : paperType.split(",")) {
@@ -531,7 +448,7 @@ public class DataSyncServiceImpl implements DataSyncService {
                         String filePath = getTempDir(SyncFileTypeEnum.CARD);
                         String filePath = getTempDir(SyncFileTypeEnum.CARD);
                         file = createJsonFile(filePath, syncExamCardDto.getContent());
                         file = createJsonFile(filePath, syncExamCardDto.getContent());
                         if (file.exists()) {
                         if (file.exists()) {
-                            String uploadCardUrl = cloudMarkingTaskUtils.syncFile(schoolId, String.valueOf(thirdRelateId), syncExamCardDto.getPaperNumberId() + s, SyncFileTypeEnum.CARD, file);
+                            String uploadCardUrl = cloudMarkingTaskUtils.syncFile(schoolId, String.valueOf(thirdRelateId), syncExamCardDto.getCourseCode() + s + syncExamCardDto.getSequence(), SyncFileTypeEnum.CARD, file);
                             if (StringUtils.isNotBlank(uploadCardUrl)) {
                             if (StringUtils.isNotBlank(uploadCardUrl)) {
                                 UpdateWrapper<ExamCard> updateWrapper = new UpdateWrapper<>();
                                 UpdateWrapper<ExamCard> updateWrapper = new UpdateWrapper<>();
                                 updateWrapper.lambda().set(ExamCard::getSyncStatus, true).eq(ExamCard::getId, syncExamCardDto.getId());
                                 updateWrapper.lambda().set(ExamCard::getSyncStatus, true).eq(ExamCard::getId, syncExamCardDto.getId());
@@ -553,8 +470,7 @@ public class DataSyncServiceImpl implements DataSyncService {
     /**
     /**
      * 上传文件临时目录
      * 上传文件临时目录
      *
      *
-     * @param type
-     * @return
+     * @param type 同步类型
      */
      */
     private String getTempDir(SyncFileTypeEnum type) {
     private String getTempDir(SyncFileTypeEnum type) {
         return SystemConstant.TEMP_FILES_DIR + File.separator + "upload-temp" + File.separator + type.name().toLowerCase() + File.separator + System.currentTimeMillis();
         return SystemConstant.TEMP_FILES_DIR + File.separator + "upload-temp" + File.separator + type.name().toLowerCase() + File.separator + System.currentTimeMillis();
@@ -563,11 +479,10 @@ public class DataSyncServiceImpl implements DataSyncService {
     /**
     /**
      * 通过扩展字段,获取班级名称
      * 通过扩展字段,获取班级名称
      *
      *
-     * @param extendCloumn
-     * @return
+     * @param extendColumn 扩展字段
      */
      */
-    private String getClassName(String extendCloumn) {
-        List<Map> mapList = JSONObject.parseArray(extendCloumn, Map.class);
+    private String getClassName(String extendColumn) {
+        List<Map> mapList = JSONObject.parseArray(extendColumn, Map.class);
         for (Map map : mapList) {
         for (Map map : mapList) {
             if (Objects.equals("className", map.get("code").toString())
             if (Objects.equals("className", map.get("code").toString())
                     || Objects.equals("clazzName", map.get("code").toString())) {
                     || Objects.equals("clazzName", map.get("code").toString())) {
@@ -577,12 +492,13 @@ public class DataSyncServiceImpl implements DataSyncService {
         return "无";
         return "无";
     }
     }
 
 
-    /*
+    /**
      * 生成文件
      * 生成文件
-     * @param file 文件路径+文件名称
-     * @param conent 要生成的文件内容
+     *
+     * @param url     文件路径+文件名称
+     * @param content 要生成的文件内容
      */
      */
-    public static File createJsonFile(String url, String conent) {
+    public static File createJsonFile(String url, String content) {
 
 
         File file = new File(url);
         File file = new File(url);
         if (!file.exists()) {
         if (!file.exists()) {
@@ -593,7 +509,7 @@ public class DataSyncServiceImpl implements DataSyncService {
         try {
         try {
             file.createNewFile();
             file.createNewFile();
             out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true)));
             out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true)));
-            out.write(conent);
+            out.write(content);
         } catch (Exception e) {
         } catch (Exception e) {
         } finally {
         } finally {
             try {
             try {
@@ -607,10 +523,9 @@ public class DataSyncServiceImpl implements DataSyncService {
     /**
     /**
      * 下载附件临时文件
      * 下载附件临时文件
      *
      *
-     * @param attachmentId
-     * @param name
-     * @param type
-     * @return
+     * @param attachmentId 附件ID
+     * @param name         文件名称
+     * @param type         文件类型
      */
      */
     private File downFileFromFss(String attachmentId, String name, SyncFileTypeEnum type) {
     private File downFileFromFss(String attachmentId, String name, SyncFileTypeEnum type) {
         try {
         try {
@@ -620,8 +535,7 @@ public class DataSyncServiceImpl implements DataSyncService {
                     throw ExceptionResultEnum.ERROR.exception("附件数据异常");
                     throw ExceptionResultEnum.ERROR.exception("附件数据异常");
                 }
                 }
                 String fileName = attachment.getName() + "-" + name + attachment.getType();
                 String fileName = attachment.getName() + "-" + name + attachment.getType();
-                File file = teachcloudCommonService.copyFile(getTempDir(type), fileName, attachment);
-                return file;
+                return teachcloudCommonService.copyFile(getTempDir(type), fileName, attachment);
             }
             }
         } catch (Exception e) {
         } catch (Exception e) {
             throw ExceptionResultEnum.ERROR.exception(e.getMessage());
             throw ExceptionResultEnum.ERROR.exception(e.getMessage());

+ 66 - 12
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPrintPlanServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qmth.distributed.print.business.service.impl;
 package com.qmth.distributed.print.business.service.impl;
 
 
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -16,6 +17,7 @@ import com.qmth.distributed.print.business.entity.*;
 import com.qmth.distributed.print.business.enums.*;
 import com.qmth.distributed.print.business.enums.*;
 import com.qmth.distributed.print.business.mapper.ExamPrintPlanMapper;
 import com.qmth.distributed.print.business.mapper.ExamPrintPlanMapper;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.service.*;
+import com.qmth.distributed.print.business.templete.execute.AsyncCloudMarkingTaskService;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
 import com.qmth.teachcloud.common.entity.BasicSchool;
 import com.qmth.teachcloud.common.entity.BasicSchool;
@@ -24,12 +26,14 @@ import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ClassifyEnum;
 import com.qmth.teachcloud.common.enums.ClassifyEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.service.*;
+import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 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 javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.util.*;
 import java.util.*;
@@ -85,6 +89,12 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
     @Resource
     @Resource
     ExamDetailCourseService examDetailCourseService;
     ExamDetailCourseService examDetailCourseService;
 
 
+    @Resource
+    AsyncCloudMarkingTaskService asyncCloudMarkingTaskService;
+
+    @Resource
+    CloudMarkingTaskUtils cloudMarkingTaskUtils;
+
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     @Override
     @Override
     public IPage<PrintPlanResult> printPlanPage(Long schoolId, Long semesterId, Long examId, List<Long> printPlanIdList, PrintPlanStatusEnum status, Long startTime, Long endTime, int pageNumber, int pageSize) {
     public IPage<PrintPlanResult> printPlanPage(Long schoolId, Long semesterId, Long examId, List<Long> printPlanIdList, PrintPlanStatusEnum status, Long startTime, Long endTime, int pageNumber, int pageSize) {
@@ -436,25 +446,69 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
 
 
     @Override
     @Override
     public void syncDataCloud(Long printPlanId, Long thirdRelateId) {
     public void syncDataCloud(Long printPlanId, Long thirdRelateId) {
-        dataSyncService.syncDataCloud(printPlanId, thirdRelateId);
+        ExamPrintPlan examPrintPlan = this.getById(printPlanId);
+        if (examPrintPlan == null) {
+            throw ExceptionResultEnum.ERROR.exception("印刷计划数据异常");
+        }
+        if (!PrintPlanStatusEnum.END.equals(examPrintPlan.getStatus())
+                && !PrintPlanStatusEnum.PRINT_FINISH.equals(examPrintPlan.getStatus())) {
+            throw ExceptionResultEnum.ERROR.exception("印刷计划未打印完成或者未结束,不能同步数据");
+        }
+        asyncCloudMarkingTaskService.syncExamAndStudentAndCard(examPrintPlan, thirdRelateId, null);
     }
     }
 
 
     @Override
     @Override
-    public void syncDataMerge(SyncDataParam syncDataParam) {
-        dataSyncService.syncDataMerge(syncDataParam);
+    public void syncDataCloudBatch(SyncDataParam syncDataParam) {
+        List<Long> ids = syncDataParam.getList();
+        if (ids == null || ids.size() == 0) {
+            throw ExceptionResultEnum.ERROR.exception("请选择操作数据");
+        }
+        QueryWrapper<ExamPrintPlan> queryWrapper = new QueryWrapper<>();
+        List<PrintPlanStatusEnum> statusEnums = Arrays.asList(PrintPlanStatusEnum.END, PrintPlanStatusEnum.PRINT_FINISH);
+        queryWrapper.lambda().in(ExamPrintPlan::getId, ids);
+        List<ExamPrintPlan> examPrintPlans = this.list(queryWrapper);
+        if (examPrintPlans != null && examPrintPlans.size() > 0) {
+            long count = examPrintPlans.stream().filter(m -> statusEnums.indexOf(m.getStatus()) > 0).count();
+            if (count > 0) {
+                throw ExceptionResultEnum.ERROR.exception("印刷计划未打印完成或者未结束,不能同步数据");
+            }
+            for (ExamPrintPlan examPrintPlan : examPrintPlans) {
+                asyncCloudMarkingTaskService.syncExamAndStudentAndCard(examPrintPlan, null, null);
+            }
+        }
     }
     }
 
 
     @Override
     @Override
-    public List<ThirdObjectDto> printSyncPlan(Long schoolId) {
-        return this.baseMapper.listThirdObject(schoolId);
+    public void syncDataMerge(SyncDataParam syncDataParam) {
+        List<Long> printPlans = syncDataParam.getList();
+        if (CollectionUtils.isEmpty(printPlans)) {
+            throw ExceptionResultEnum.ERROR.exception("请选择需要合并的印刷任务");
+        }
+
+        if (Objects.isNull(syncDataParam.getThirdRelateId()) && Objects.isNull(syncDataParam.getThirdRelateName())) {
+            throw ExceptionResultEnum.ERROR.exception("考试ID、考试名称至少填一个");
+        }
+
+        // todo 校验印刷计划是否完成
+        if (syncDataParam.getThirdRelateId() == null) {
+            String time = String.valueOf(System.currentTimeMillis());
+            QueryWrapper<ExamPrintPlan> printPlanQueryWrapper = new QueryWrapper<>();
+            printPlanQueryWrapper.lambda().in(ExamPrintPlan::getId, syncDataParam.getList());
+            List<ExamPrintPlan> examPrintPlans = this.list(printPlanQueryWrapper);
+            ExamPrintPlan examPrintPlan = examPrintPlans.stream().max(Comparator.comparingLong(ExamPrintPlan::getExamEndTime)).get();
+            String examTime = DateUtil.format(new Date(examPrintPlan.getExamEndTime()), CloudMarkingTaskUtils.DATE_FORMAT);
+            syncDataParam.setThirdRelateId(cloudMarkingTaskUtils.syncExam(examPrintPlan.getSchoolId(), time, syncDataParam.getThirdRelateName(), examTime));
+        }
+
+        for (Long printPlanId : printPlans) {
+            ExamPrintPlan examPrintPlan = this.getById(printPlanId);
+            asyncCloudMarkingTaskService.syncExamAndStudentAndCard(examPrintPlan, syncDataParam.getThirdRelateId(), syncDataParam.getThirdRelateName());
+        }
     }
     }
 
 
     @Override
     @Override
-    public void syncDataCloudBatch(SyncDataParam syncDataParam) {
-        List<Long> ids = syncDataParam.getList();
-        for (Long id : ids) {
-            dataSyncService.syncDataCloud(id, null);
-        }
+    public List<ThirdObjectDto> printSyncPlan(Long schoolId, Long semesterId, Long examId) {
+        return this.baseMapper.listThirdObject(schoolId, semesterId, examId);
     }
     }
 
 
     @Override
     @Override
@@ -500,8 +554,8 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
         }
         }
 
 
         List<ExamPrintPlan> examPrintPlanList = new ArrayList<>();
         List<ExamPrintPlan> examPrintPlanList = new ArrayList<>();
-        if (examPrintPlanIdSet.size() > 0){
-            examPrintPlanList = this.list(new QueryWrapper<ExamPrintPlan>().lambda().in(ExamPrintPlan::getId,examPrintPlanIdSet));
+        if (examPrintPlanIdSet.size() > 0) {
+            examPrintPlanList = this.list(new QueryWrapper<ExamPrintPlan>().lambda().in(ExamPrintPlan::getId, examPrintPlanIdSet));
         }
         }
         return examPrintPlanList;
         return examPrintPlanList;
     }
     }

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

@@ -1782,7 +1782,6 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                         examDetailCourse.setCourseCode(examTask.getCourseCode());
                         examDetailCourse.setCourseCode(examTask.getCourseCode());
                         examDetailCourse.setCourseName(examTask.getCourseName());
                         examDetailCourse.setCourseName(examTask.getCourseName());
                         examDetailCourse.setPaperNumber(examTask.getPaperNumber());
                         examDetailCourse.setPaperNumber(examTask.getPaperNumber());
-                        examDetailCourse.setSequence(examTask.getSequence());
                         examDetailCourse.setClazzId(examDetailList.getClassId());
                         examDetailCourse.setClazzId(examDetailList.getClassId());
                         examDetailCourse.setTotalSubjects(examDetailList.getStudentCount());
                         examDetailCourse.setTotalSubjects(examDetailList.getStudentCount());
                         examDetailCourse.setCreateId(sysUser.getId());
                         examDetailCourse.setCreateId(sysUser.getId());

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

@@ -5,10 +5,10 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.distributed.print.business.entity.ExamPaperStructure;
 import com.qmth.distributed.print.business.entity.TBSyncTask;
 import com.qmth.distributed.print.business.entity.TBSyncTask;
 import com.qmth.distributed.print.business.mapper.TBSyncTaskMapper;
 import com.qmth.distributed.print.business.mapper.TBSyncTaskMapper;
 import com.qmth.distributed.print.business.service.ExamPaperStructureService;
 import com.qmth.distributed.print.business.service.ExamPaperStructureService;
+import com.qmth.distributed.print.business.service.ExamPrintPlanService;
 import com.qmth.distributed.print.business.service.TBSyncTaskService;
 import com.qmth.distributed.print.business.service.TBSyncTaskService;
 import com.qmth.distributed.print.business.templete.execute.AsyncCloudMarkingTaskService;
 import com.qmth.distributed.print.business.templete.execute.AsyncCloudMarkingTaskService;
 import com.qmth.teachcloud.common.bean.result.SyncListResult;
 import com.qmth.teachcloud.common.bean.result.SyncListResult;
@@ -18,6 +18,7 @@ import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.PushTypeEnum;
 import com.qmth.teachcloud.common.enums.PushTypeEnum;
 import com.qmth.teachcloud.common.enums.TaskResultEnum;
 import com.qmth.teachcloud.common.enums.TaskResultEnum;
 import com.qmth.teachcloud.common.enums.TaskStatusEnum;
 import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
@@ -40,9 +41,16 @@ public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncT
     @Resource
     @Resource
     ExamPaperStructureService examPaperStructureService;
     ExamPaperStructureService examPaperStructureService;
 
 
+    @Resource
+    ExamPrintPlanService examPrintPlanService;
+
+    @Resource
+    TeachcloudCommonService teachcloudCommonService;
+
     @Transactional
     @Transactional
     @Override
     @Override
     public TBSyncTask saveTask(Long schoolId, Long objectId, PushTypeEnum type) {
     public TBSyncTask saveTask(Long schoolId, Long objectId, PushTypeEnum type) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         QueryWrapper<TBSyncTask> queryWrapper = new QueryWrapper<>();
         QueryWrapper<TBSyncTask> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(TBSyncTask::getSchoolId, schoolId)
         queryWrapper.lambda().eq(TBSyncTask::getSchoolId, schoolId)
                 .eq(TBSyncTask::getObjectId, objectId)
                 .eq(TBSyncTask::getObjectId, objectId)
@@ -60,15 +68,17 @@ public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncT
         tbSyncTask.setObjectId(objectId);
         tbSyncTask.setObjectId(objectId);
         tbSyncTask.setType(type);
         tbSyncTask.setType(type);
         tbSyncTask.setStatus(TaskStatusEnum.INIT);
         tbSyncTask.setStatus(TaskStatusEnum.INIT);
+        tbSyncTask.setCreateId(sysUser.getId());
         tbSyncTask.setCreateTime(System.currentTimeMillis());
         tbSyncTask.setCreateTime(System.currentTimeMillis());
         this.save(tbSyncTask);
         this.save(tbSyncTask);
         return tbSyncTask;
         return tbSyncTask;
     }
     }
 
 
     @Override
     @Override
-    public void updateStatusAndResultById(Long id, TaskStatusEnum status, TaskResultEnum result, String errorMessage) {
+    public void updateStatusAndResultById(Long id, Long thirdRelateId, TaskStatusEnum status, TaskResultEnum result, String errorMessage) {
         UpdateWrapper<TBSyncTask> tbSyncTaskUpdateWrapper = new UpdateWrapper<>();
         UpdateWrapper<TBSyncTask> tbSyncTaskUpdateWrapper = new UpdateWrapper<>();
         tbSyncTaskUpdateWrapper.lambda().set(TBSyncTask::getStatus, status)
         tbSyncTaskUpdateWrapper.lambda().set(TBSyncTask::getStatus, status)
+                .set(TBSyncTask::getThirdRelateId, thirdRelateId)
                 .set(TBSyncTask::getResult, result)
                 .set(TBSyncTask::getResult, result)
                 .set(TBSyncTask::getErrorMessage, errorMessage)
                 .set(TBSyncTask::getErrorMessage, errorMessage)
                 .eq(TBSyncTask::getId, id);
                 .eq(TBSyncTask::getId, id);
@@ -93,13 +103,14 @@ public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncT
     @Override
     @Override
     public IPage<SyncListResult> query(Long schoolId, TaskStatusEnum status, PushTypeEnum type, TaskResultEnum result, int pageNumber, int pageSize) {
     public IPage<SyncListResult> query(Long schoolId, TaskStatusEnum status, PushTypeEnum type, TaskResultEnum result, int pageNumber, int pageSize) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        Set<Long> orgIds = null;
+        Set<Long> orgIds = teachcloudCommonService.listSubOrgIds(null);
+        ;
         IPage<SyncListResult> page = this.baseMapper.query(new Page<>(pageNumber, pageSize), schoolId, status, type, result, sysUser.getId(), orgIds);
         IPage<SyncListResult> page = this.baseMapper.query(new Page<>(pageNumber, pageSize), schoolId, status, type, result, sysUser.getId(), orgIds);
         List<SyncListResult> list = page.getRecords();
         List<SyncListResult> list = page.getRecords();
         for (SyncListResult syncListResult : list) {
         for (SyncListResult syncListResult : list) {
             syncListResult.setStatus(Objects.nonNull(syncListResult.getStatus()) ? TaskStatusEnum.valueOf(syncListResult.getStatus()).getTitle() : null);
             syncListResult.setStatus(Objects.nonNull(syncListResult.getStatus()) ? TaskStatusEnum.valueOf(syncListResult.getStatus()).getTitle() : null);
             syncListResult.setType(Objects.nonNull(syncListResult.getType()) ? PushTypeEnum.valueOf(syncListResult.getType()).getTitle() : null);
             syncListResult.setType(Objects.nonNull(syncListResult.getType()) ? PushTypeEnum.valueOf(syncListResult.getType()).getTitle() : null);
-            syncListResult.setResult(Objects.nonNull(syncListResult.getResult()) ? TaskResultEnum.valueOf(syncListResult.getResult()).getTitle() : null);
+            syncListResult.setResultStr(Objects.nonNull(syncListResult.getResult()) ? TaskResultEnum.valueOf(syncListResult.getResult()).getTitle() : null);
         }
         }
         return page;
         return page;
     }
     }
@@ -116,19 +127,18 @@ public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncT
         if (TaskResultEnum.SUCCESS.equals(tbSyncTask.getResult())) {
         if (TaskResultEnum.SUCCESS.equals(tbSyncTask.getResult())) {
             throw ExceptionResultEnum.ERROR.exception("任务同步成功");
             throw ExceptionResultEnum.ERROR.exception("任务同步成功");
         }
         }
-        ExamPaperStructure examPaperStructure = examPaperStructureService.getById(tbSyncTask.getObjectId());
-        if (examPaperStructure == null) {
-            throw ExceptionResultEnum.ERROR.exception("未找到同步数据");
-        }
         switch (tbSyncTask.getType()) {
         switch (tbSyncTask.getType()) {
+            case EXAM_PUSH:
+                asyncCloudMarkingTaskService.syncExamAndStudentAndCard(examPrintPlanService.getById(tbSyncTask.getObjectId()), tbSyncTask.getThirdRelateId(), null);
+                break;
             case STRUCTURE_GROUP_PUSH:
             case STRUCTURE_GROUP_PUSH:
-                asyncCloudMarkingTaskService.syncPaperStructureAndGroup(examPaperStructure);
+                asyncCloudMarkingTaskService.syncPaperStructureAndGroup(examPaperStructureService.getById(tbSyncTask.getObjectId()));
                 break;
                 break;
             case PAPER_ANSWER_FILE_PUSH:
             case PAPER_ANSWER_FILE_PUSH:
-                asyncCloudMarkingTaskService.syncPaperAndAnswer(examPaperStructure);
+                asyncCloudMarkingTaskService.syncPaperAndAnswer(examPaperStructureService.getById(tbSyncTask.getObjectId()));
                 break;
                 break;
             case OBJECTIVE_ANSWER_PUSH:
             case OBJECTIVE_ANSWER_PUSH:
-                asyncCloudMarkingTaskService.syncObjectiveStructure(examPaperStructure);
+                asyncCloudMarkingTaskService.syncObjectiveStructure(examPaperStructureService.getById(tbSyncTask.getObjectId()));
                 break;
                 break;
         }
         }
 
 

+ 31 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCloudMarkingTaskService.java

@@ -1,18 +1,23 @@
 package com.qmth.distributed.print.business.templete.execute;
 package com.qmth.distributed.print.business.templete.execute;
 
 
 import com.qmth.distributed.print.business.entity.ExamPaperStructure;
 import com.qmth.distributed.print.business.entity.ExamPaperStructure;
+import com.qmth.distributed.print.business.entity.ExamPrintPlan;
 import com.qmth.distributed.print.business.entity.TBSyncTask;
 import com.qmth.distributed.print.business.entity.TBSyncTask;
 import com.qmth.distributed.print.business.service.DataSyncService;
 import com.qmth.distributed.print.business.service.DataSyncService;
 import com.qmth.distributed.print.business.service.TBSyncTaskService;
 import com.qmth.distributed.print.business.service.TBSyncTaskService;
 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.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.PushTypeEnum;
 import com.qmth.teachcloud.common.enums.PushTypeEnum;
 import com.qmth.teachcloud.common.service.SysConfigService;
 import com.qmth.teachcloud.common.service.SysConfigService;
+import com.qmth.teachcloud.common.util.ServletUtil;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import java.util.Objects;
 
 
 /**
 /**
  * 异步同步云阅卷
  * 异步同步云阅卷
@@ -37,12 +42,32 @@ public class AsyncCloudMarkingTaskService {
         return sysConfig != null && "true".equals(sysConfig.getConfigValue());
         return sysConfig != null && "true".equals(sysConfig.getConfigValue());
     }
     }
 
 
+    /**
+     * 同步考试、考生、科目、题卡
+     *
+     * @param examPrintPlan 印刷计划
+     * @param thirdRelateId 云阅卷考试ID
+     */
+    public void syncExamAndStudentAndCard(ExamPrintPlan examPrintPlan, Long thirdRelateId, String thirdRelateName) {
+        if (isSync()) {
+            TBSyncTask tbSyncTask = tbSyncTaskService.saveTask(examPrintPlan.getSchoolId(), examPrintPlan.getId(), PushTypeEnum.EXAM_PUSH);
+
+            Long relateId = Objects.isNull(thirdRelateId) ? examPrintPlan.getThirdRelateId() : thirdRelateId;
+            thirdRelateName = Objects.isNull(examPrintPlan.getThirdRelateId()) ? examPrintPlan.getName() : examPrintPlan.getThirdRelateName();
+            SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+            dataSyncService.syncExamAndStudentAndCard(relateId, thirdRelateName, examPrintPlan.getExamEndTime(), tbSyncTask ,sysUser);
+        }
+    }
+
     /**
     /**
      * 同步试卷结构、分组信息、评卷员绑定关系
      * 同步试卷结构、分组信息、评卷员绑定关系
      *
      *
      * @param examPaperStructure 试卷结构对象
      * @param examPaperStructure 试卷结构对象
      */
      */
     public void syncPaperStructureAndGroup(ExamPaperStructure examPaperStructure) {
     public void syncPaperStructureAndGroup(ExamPaperStructure examPaperStructure) {
+        if (examPaperStructure == null) {
+            throw ExceptionResultEnum.ERROR.exception("未找到同步数据");
+        }
         if (isSync()) {
         if (isSync()) {
             TBSyncTask tbSyncTask = tbSyncTaskService.saveTask(examPaperStructure.getSchoolId(), examPaperStructure.getId(), PushTypeEnum.STRUCTURE_GROUP_PUSH);
             TBSyncTask tbSyncTask = tbSyncTaskService.saveTask(examPaperStructure.getSchoolId(), examPaperStructure.getId(), PushTypeEnum.STRUCTURE_GROUP_PUSH);
             dataSyncService.syncPaperStructureAndGroup(examPaperStructure, tbSyncTask);
             dataSyncService.syncPaperStructureAndGroup(examPaperStructure, tbSyncTask);
@@ -55,6 +80,9 @@ public class AsyncCloudMarkingTaskService {
      * @param examPaperStructure 试卷结构对象
      * @param examPaperStructure 试卷结构对象
      */
      */
     public void syncPaperAndAnswer(ExamPaperStructure examPaperStructure) {
     public void syncPaperAndAnswer(ExamPaperStructure examPaperStructure) {
+        if (examPaperStructure == null) {
+            throw ExceptionResultEnum.ERROR.exception("未找到同步数据");
+        }
         if (isSync()) {
         if (isSync()) {
             TBSyncTask tbSyncTask = tbSyncTaskService.saveTask(examPaperStructure.getSchoolId(), examPaperStructure.getId(), PushTypeEnum.PAPER_ANSWER_FILE_PUSH);
             TBSyncTask tbSyncTask = tbSyncTaskService.saveTask(examPaperStructure.getSchoolId(), examPaperStructure.getId(), PushTypeEnum.PAPER_ANSWER_FILE_PUSH);
             dataSyncService.syncPaperAndAnswer(examPaperStructure, tbSyncTask);
             dataSyncService.syncPaperAndAnswer(examPaperStructure, tbSyncTask);
@@ -67,6 +95,9 @@ public class AsyncCloudMarkingTaskService {
      * @param examPaperStructure 试卷结构对象
      * @param examPaperStructure 试卷结构对象
      */
      */
     public void syncObjectiveStructure(ExamPaperStructure examPaperStructure) {
     public void syncObjectiveStructure(ExamPaperStructure examPaperStructure) {
+        if (examPaperStructure == null) {
+            throw ExceptionResultEnum.ERROR.exception("未找到同步数据");
+        }
         if (isSync()) {
         if (isSync()) {
             TBSyncTask tbSyncTask = tbSyncTaskService.saveTask(examPaperStructure.getSchoolId(), examPaperStructure.getId(), PushTypeEnum.OBJECTIVE_ANSWER_PUSH);
             TBSyncTask tbSyncTask = tbSyncTaskService.saveTask(examPaperStructure.getSchoolId(), examPaperStructure.getId(), PushTypeEnum.OBJECTIVE_ANSWER_PUSH);
             dataSyncService.syncObjectiveStructure(examPaperStructure, tbSyncTask);
             dataSyncService.syncObjectiveStructure(examPaperStructure, tbSyncTask);

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

@@ -174,7 +174,7 @@
             a.school_id schoolId,
             a.school_id schoolId,
             a.course_code courseCode,
             a.course_code courseCode,
             a.paper_number paperNumber,
             a.paper_number paperNumber,
-            a.paper_number_id paperNumberId,
+            a.sequence,
             c.title,
             c.title,
             d.content
             d.content
         FROM
         FROM

+ 16 - 7
distributed-print-business/src/main/resources/mapper/ExamPrintPlanMapper.xml

@@ -107,6 +107,7 @@
         SELECT
         SELECT
         a.id,
         a.id,
         be.semester_id semesterId,
         be.semester_id semesterId,
+        be.id examId,
         a.name,
         a.name,
         a.exam_start_time AS examStartTime,
         a.exam_start_time AS examStartTime,
         a.exam_end_time AS examEndTime,
         a.exam_end_time AS examEndTime,
@@ -536,14 +537,22 @@
     <select id="listThirdObject" resultType="com.qmth.distributed.print.business.bean.dto.ThirdObjectDto">
     <select id="listThirdObject" resultType="com.qmth.distributed.print.business.bean.dto.ThirdObjectDto">
         SELECT
         SELECT
             distinct
             distinct
-            third_relate_id thirdRelateId,
-            third_relate_name thirdRelateName
+            epp.third_relate_id thirdRelateId,
+            epp.third_relate_name thirdRelateName
         FROM
         FROM
-            exam_print_plan
-        WHERE
-            school_id = #{schoolId}
-            and third_relate_id is not null
-        ORDER BY third_relate_id DESC
+            exam_print_plan epp
+            LEFT JOIN basic_exam be ON epp.exam_id = be.id
+        <where>
+            epp.school_id = #{schoolId}
+            <if test="semesterId != null and semesterId != ''">
+                and be.semester_id = #{semesterId}
+            </if>
+            <if test="examId != null and examId != ''">
+                and epp.exam_id = #{examId}
+            </if>
+            and epp.third_relate_id is not null
+        </where>
+        ORDER BY epp.third_relate_id DESC
     </select>
     </select>
     <select id="listToClient" resultType="com.qmth.distributed.print.business.bean.result.PrintPlanBrief">
     <select id="listToClient" resultType="com.qmth.distributed.print.business.bean.result.PrintPlanBrief">
         SELECT DISTINCT
         SELECT DISTINCT

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

@@ -106,7 +106,7 @@
             a.clazz_name clazzName,
             a.clazz_name clazzName,
             a.extend_fields extendFields,
             a.extend_fields extendFields,
             a.paper_type paperType,
             a.paper_type paperType,
-            et.paper_number_id paperNumberId
+            et.sequence
         FROM
         FROM
             exam_student a
             exam_student a
                 LEFT JOIN
                 LEFT JOIN

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

@@ -5,6 +5,7 @@
         SELECT
         SELECT
             tbst.id,
             tbst.id,
             tbst.type,
             tbst.type,
+            tbst.object_id objectId,
             tbst.status,
             tbst.status,
             tbst.result,
             tbst.result,
             if(ISNULL(tbst.report_file_path),false,true) as hasReportFile,
             if(ISNULL(tbst.report_file_path),false,true) as hasReportFile,

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

@@ -100,6 +100,9 @@ public class EnumsController {
         } else if (type.equals(EnumType.SYSTEM_CODE_ENUM.name())){
         } else if (type.equals(EnumType.SYSTEM_CODE_ENUM.name())){
             // 系统自生成编码
             // 系统自生成编码
             list = SystemCodeEnum.listTypes();
             list = SystemCodeEnum.listTypes();
+        } else if (type.equals(EnumType.PUSH_TYPE_ENUM.name())){
+            // 同步云阅卷类型类型
+            list = PushTypeEnum.listTypes();
         }
         }
         return ResultUtil.ok(list);
         return ResultUtil.ok(list);
     }
     }

+ 10 - 12
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPaperStructureController.java

@@ -1,10 +1,9 @@
 package com.qmth.distributed.print.api;
 package com.qmth.distributed.print.api;
 
 
 
 
-import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 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.marking.EvaluationParameters;
 import com.qmth.distributed.print.business.bean.result.EditResult;
 import com.qmth.distributed.print.business.bean.result.EditResult;
 import com.qmth.distributed.print.business.entity.ExamPaperStructure;
 import com.qmth.distributed.print.business.entity.ExamPaperStructure;
 import com.qmth.distributed.print.business.service.ExamPaperStructureService;
 import com.qmth.distributed.print.business.service.ExamPaperStructureService;
@@ -15,12 +14,10 @@ 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;
 import io.swagger.annotations.*;
 import io.swagger.annotations.*;
-import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
-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.util.List;
 import java.util.List;
@@ -109,13 +106,14 @@ public class ExamPaperStructureController {
     /**
     /**
      * 保存客观题答案
      * 保存客观题答案
      *
      *
-     * @param id                 试卷结构表id
-     * @param objectiveStructure 客观题结构json
+     * @param body body
      */
      */
     @ApiOperation(value = "更新客观题答案")
     @ApiOperation(value = "更新客观题答案")
     @RequestMapping(value = "/update_objective_answer", method = RequestMethod.POST)
     @RequestMapping(value = "/update_objective_answer", method = RequestMethod.POST)
-    public Result uploadAnswer(@RequestParam("id") Long id,
-                               @RequestParam("objectiveStructure") String objectiveStructure) {
+    public Result updateObjectiveAnswer(@RequestBody String body) {
+        JSONObject object = JSONObject.parseObject(body, JSONObject.class);
+        Long id = object.getLong("id");
+        String objectiveStructure = object.getString("objectiveStructure");
         ExamPaperStructure examPaperStructure = examPaperStructureService.updateObjectiveAnswer(id, objectiveStructure);
         ExamPaperStructure examPaperStructure = examPaperStructureService.updateObjectiveAnswer(id, objectiveStructure);
         // 异步同步到云阅卷
         // 异步同步到云阅卷
         asyncCloudMarkingTaskService.syncObjectiveStructure(examPaperStructure);
         asyncCloudMarkingTaskService.syncObjectiveStructure(examPaperStructure);
@@ -138,10 +136,10 @@ public class ExamPaperStructureController {
     @ApiOperation(value = "评卷参数设置-获取题卡图片")
     @ApiOperation(value = "评卷参数设置-获取题卡图片")
     @RequestMapping(value = "/find_jpg_file", method = RequestMethod.POST)
     @RequestMapping(value = "/find_jpg_file", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
     @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
-    public Result findCardJpgFileByPaperNumber(@ApiParam(value = "考试id",required = true) @RequestParam String examId,
-                                               @ApiParam(value = "课程代码",required = true) @RequestParam String courseCode,
-                                               @ApiParam(value = "试卷编号",required = true) @RequestParam String paperNumber) {
-        return ResultUtil.ok(examPaperStructureService.findCardJpgFileByPaperNumber(SystemConstant.convertIdToLong(examId),courseCode,paperNumber));
+    public Result findCardJpgFileByPaperNumber(@ApiParam(value = "考试id", required = true) @RequestParam String examId,
+                                               @ApiParam(value = "课程代码", required = true) @RequestParam String courseCode,
+                                               @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) {
+        return ResultUtil.ok(examPaperStructureService.findCardJpgFileByPaperNumber(SystemConstant.convertIdToLong(examId), courseCode, paperNumber));
     }
     }
 }
 }
 
 

+ 6 - 5
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPrintPlanSyncController.java

@@ -58,15 +58,16 @@ public class ExamPrintPlanSyncController {
 
 
     /**
     /**
      * 已同步过的云阅卷考试列表
      * 已同步过的云阅卷考试列表
-     *
-     * @return
+     * @param semesterId 学期ID
+     * @param examId 考试ID
      */
      */
     @ApiOperation(value = "印刷计划合并管理-合并推送-云阅卷考试ID列表")
     @ApiOperation(value = "印刷计划合并管理-合并推送-云阅卷考试ID列表")
     @RequestMapping(value = "/list_relate_ids", method = RequestMethod.POST)
     @RequestMapping(value = "/list_relate_ids", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
     @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
-    public Result findPrintPlanPage() {
+    public Result findPrintPlanPage(@ApiParam(value = "学期ID") @RequestParam(required = false) Long semesterId,
+                                    @ApiParam(value = "考试ID") @RequestParam(required = false) Long examId) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
-        return ResultUtil.ok(examPrintPlanService.printSyncPlan(schoolId));
+        return ResultUtil.ok(examPrintPlanService.printSyncPlan(schoolId, semesterId, examId));
     }
     }
 
 
 
 
@@ -101,7 +102,7 @@ public class ExamPrintPlanSyncController {
     }
     }
 
 
     /**
     /**
-     * 手动同步
+     * 单个手动同步
      *
      *
      * @param printPlanId
      * @param printPlanId
      * @param thirdRelateId
      * @param thirdRelateId

+ 5 - 5
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/stmms/GroupDetailDTO.java

@@ -6,7 +6,7 @@ public class GroupDetailDTO {
     //是 分组序号
     //是 分组序号
     private Integer number;
     private Integer number;
     //否
     //否
-    private List<PicConfig> picList;
+    private List<PicConfig> picConfig;
     //是 双评比例 0关闭,1开启
     //是 双评比例 0关闭,1开启
     private Double doubleRate;
     private Double doubleRate;
     //否 仲裁阈值 开启双评是必填
     //否 仲裁阈值 开启双评是必填
@@ -28,12 +28,12 @@ public class GroupDetailDTO {
         this.number = number;
         this.number = number;
     }
     }
 
 
-    public List<PicConfig> getPicList() {
-        return picList;
+    public List<PicConfig> getPicConfig() {
+        return picConfig;
     }
     }
 
 
-    public void setPicList(List<PicConfig> picList) {
-        this.picList = picList;
+    public void setPicConfig(List<PicConfig> picConfig) {
+        this.picConfig = picConfig;
     }
     }
 
 
     public Double getDoubleRate() {
     public Double getDoubleRate() {

+ 22 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/SyncListResult.java

@@ -20,12 +20,18 @@ public class SyncListResult implements Serializable {
     @ApiModelProperty(value = "同步任务类型:USER_PUSH(用户推送),EXAM_PUSH(考试、考生、题卡推送),STRUCTURE_PUSH(试卷结构推送),SCORE_PUSH(成绩推送)")
     @ApiModelProperty(value = "同步任务类型:USER_PUSH(用户推送),EXAM_PUSH(考试、考生、题卡推送),STRUCTURE_PUSH(试卷结构推送),SCORE_PUSH(成绩推送)")
     private String type;
     private String type;
 
 
+    @ApiModelProperty(value = "objectId")
+    private String objectId;
+
     @ApiModelProperty(value = "任务状态,INIT:未开始,RUNNING:进行中,FINISH:已完成")
     @ApiModelProperty(value = "任务状态,INIT:未开始,RUNNING:进行中,FINISH:已完成")
     private String status;
     private String status;
 
 
     @ApiModelProperty(value = "数据结果,SUCCESS:成功,ERROR:失败")
     @ApiModelProperty(value = "数据结果,SUCCESS:成功,ERROR:失败")
     private String result;
     private String result;
 
 
+    @ApiModelProperty(value = "数据结果,SUCCESS:成功,ERROR:失败")
+    private String resultStr;
+
     @JsonSerialize(using = ToStringSerializer.class)
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "创建人id")
     @ApiModelProperty(value = "创建人id")
     private Long createId;
     private Long createId;
@@ -113,4 +119,20 @@ public class SyncListResult implements Serializable {
     public void setErrorMessage(String errorMessage) {
     public void setErrorMessage(String errorMessage) {
         this.errorMessage = errorMessage;
         this.errorMessage = errorMessage;
     }
     }
+
+    public String getObjectId() {
+        return objectId;
+    }
+
+    public void setObjectId(String objectId) {
+        this.objectId = objectId;
+    }
+
+    public String getResultStr() {
+        return resultStr;
+    }
+
+    public void setResultStr(String resultStr) {
+        this.resultStr = resultStr;
+    }
 }
 }

+ 15 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/PushTypeEnum.java

@@ -1,5 +1,7 @@
 package com.qmth.teachcloud.common.enums;
 package com.qmth.teachcloud.common.enums;
 
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Objects;
 import java.util.Objects;
 
 
 /**
 /**
@@ -44,4 +46,17 @@ public enum PushTypeEnum {
         }
         }
         return null;
         return null;
     }
     }
+
+    public static List<EnumResult> listTypes() {
+        List<EnumResult> list = new ArrayList<>();
+        for (PushTypeEnum value : PushTypeEnum.values()) {
+            EnumResult result = new EnumResult();
+            result.setName(value.name());
+            result.setOrdinal(value.ordinal());
+            result.setCode(null);
+            result.setDesc(value.getTitle());
+            list.add(result);
+        }
+        return list;
+    }
 }
 }

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

@@ -52,6 +52,9 @@ public class CloudMarkingTaskUtils {
     // 科组长前缀
     // 科组长前缀
     private static final String MARKER_LEADER_PREFIX = "S_";
     private static final String MARKER_LEADER_PREFIX = "S_";
 
 
+    // 时间格式化
+    public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
+
     @Resource
     @Resource
     private CommonCacheService commonCacheService;
     private CommonCacheService commonCacheService;
 
 

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

@@ -132,7 +132,7 @@ public class JobServiceImpl implements JobService {
     @Override
     @Override
     public void syncData() {
     public void syncData() {
         // 2021-05-20 同步数据到云阅卷
         // 2021-05-20 同步数据到云阅卷
-        dataSyncService.syncToCloudReview();
+//        dataSyncService.syncToCloudReview();
     }
     }
 
 
     @Override
     @Override