Przeglądaj źródła

3.0.1-同步云阅卷

xiaof 3 lat temu
rodzic
commit
f3ec713d1b
14 zmienionych plików z 199 dodań i 105 usunięć
  1. 0 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamPaperStructure.java
  2. 7 20
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TBSyncTask.java
  3. 2 8
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/ExamPaperStructureStatusEnum.java
  4. 4 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/DataSyncService.java
  5. 17 8
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TBSyncTaskService.java
  6. 65 33
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncServiceImpl.java
  7. 0 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPaperStructureServiceImpl.java
  8. 67 18
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBSyncTaskServiceImpl.java
  9. 12 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCloudMarkingTaskService.java
  10. 1 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPaperStructureController.java
  11. 16 3
      distributed-print/src/main/java/com/qmth/distributed/print/api/TBSyncTaskController.java
  12. 4 0
      distributed-print/src/main/resources/application-dev.properties
  13. 4 0
      distributed-print/src/main/resources/application-release.properties
  14. 0 4
      distributed-print/src/main/resources/application-test.properties

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

@@ -7,11 +7,8 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.distributed.print.business.enums.ExamPaperStructureStatusEnum;
 import com.qmth.teachcloud.common.base.BaseEntity;
 import io.swagger.annotations.ApiModelProperty;
-import org.springframework.data.annotation.Transient;
 
 import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
 
 /**
  * <p>

+ 7 - 20
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TBSyncTask.java

@@ -9,7 +9,6 @@ import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.PushTypeEnum;
 import com.qmth.teachcloud.common.enums.TaskResultEnum;
 import com.qmth.teachcloud.common.enums.TaskStatusEnum;
-import com.qmth.teachcloud.common.enums.TaskTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -45,13 +44,9 @@ public class TBSyncTask extends BaseEntity implements Serializable {
     private Long thirdRelateId;
 
     @JsonSerialize(using = ToStringSerializer.class)
-    @ApiModelProperty(value = "印刷计划id")
-    @TableField(value = "print_plan_id")
-    private Long printPlanId;
-
-    @ApiModelProperty(value = "印刷计划名称")
-    @TableField(value = "print_plan_name")
-    private String printPlanName;
+    @ApiModelProperty(value = "对象id")
+    @TableField(value = "object_id")
+    private Long objectId;
 
     @ApiModelProperty(value = "任务状态,INIT:未开始,RUNNING:进行中,FINISH:已完成")
     @TableField(value = "status")
@@ -121,20 +116,12 @@ public class TBSyncTask extends BaseEntity implements Serializable {
         this.schoolId = schoolId;
     }
 
-    public Long getPrintPlanId() {
-        return printPlanId;
-    }
-
-    public void setPrintPlanId(Long printPlanId) {
-        this.printPlanId = printPlanId;
-    }
-
-    public String getPrintPlanName() {
-        return printPlanName;
+    public Long getObjectId() {
+        return objectId;
     }
 
-    public void setPrintPlanName(String printPlanName) {
-        this.printPlanName = printPlanName;
+    public void setObjectId(Long objectId) {
+        this.objectId = objectId;
     }
 
     public TaskStatusEnum getStatus() {

+ 2 - 8
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/ExamPaperStructureStatusEnum.java

@@ -11,15 +11,9 @@ import java.util.List;
 public enum ExamPaperStructureStatusEnum {
 
     INIT("未开始"),
-    UPLOAD_FINISH("上传完成"),
-    START_SYNC("开始同步"),
-    PAPER_FINISH("试卷同步成功"),
-    ANSWER_FINISH("标答同步成功"),
-    OBJECTIVE_FINISH("客观题结构同步成功"),
-    SUBJECTIVE_FINISH("主观题结构同步成功"),
+    SUBJECTIVE_FINISH("试卷结构同步成功"),
     GROUP_FINISH("分组同步成功"),
-    MARKER_FINISH("绑定评卷员同步成功"),
-    FINISH("结束");
+    FINISH("绑定评卷员同步成功,结束");
 
     ExamPaperStructureStatusEnum(String desc) {
         this.desc = desc;

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

@@ -2,6 +2,7 @@ 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.TBSyncTask;
 
 /**
  * 同步数据到云阅卷 服务类
@@ -13,9 +14,9 @@ public interface DataSyncService {
 
     void syncDataMerge(SyncDataParam syncDataParam);
 
-    void syncPaperStructureAndGroup(ExamPaperStructure examPaperStructure);
+    void syncPaperStructureAndGroup(ExamPaperStructure examPaperStructure, TBSyncTask tbSyncTask);
 
-    void syncPaperAndAnswer(ExamPaperStructure examPaperStructure);
+    void syncPaperAndAnswer(ExamPaperStructure examPaperStructure, TBSyncTask tbSyncTask);
 
-    void syncObjectiveStructure(ExamPaperStructure examPaperStructure);
+    void syncObjectiveStructure(ExamPaperStructure examPaperStructure, TBSyncTask tbSyncTask);
 }

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

@@ -2,7 +2,6 @@ package com.qmth.distributed.print.business.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.qmth.distributed.print.business.entity.ExamPrintPlan;
 import com.qmth.distributed.print.business.entity.TBSyncTask;
 import com.qmth.teachcloud.common.bean.result.SyncListResult;
 import com.qmth.teachcloud.common.entity.SysUser;
@@ -19,19 +18,29 @@ import java.util.Map;
  */
 public interface TBSyncTaskService extends IService<TBSyncTask> {
 
-    TBSyncTask saveTask(ExamPrintPlan examPrintPlan);
+    TBSyncTask saveTask(Long schoolId, Long objectId, PushTypeEnum type);
+
+    void updateStatusAndResultById(Long id, TaskStatusEnum status, TaskResultEnum result, String errorMessage);
 
     TBSyncTask savePushCommon(PushTypeEnum pushTypeEnum, Map map, SysUser sysUser);
 
     /**
      * 同步任务管理分页查询
-     * @param schoolId 学校id
-     * @param status 任务状态
-     * @param type 同步任务类型
-     * @param result 任务结果
+     *
+     * @param schoolId   学校id
+     * @param status     任务状态
+     * @param type       同步任务类型
+     * @param result     任务结果
      * @param pageNumber 分页页数
-     * @param pageSize 分页容量
+     * @param pageSize   分页容量
      * @return 分页结果
      */
-    IPage<SyncListResult> query(Long schoolId, TaskStatusEnum status, PushTypeEnum type, TaskResultEnum result,int pageNumber,int pageSize);
+    IPage<SyncListResult> query(Long schoolId, TaskStatusEnum status, PushTypeEnum type, TaskResultEnum result, int pageNumber, int pageSize);
+
+    /**
+     * 失败任务-重新同步
+     *
+     * @param id 任务ID
+     */
+    void resync(Long id);
 }

+ 65 - 33
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncServiceImpl.java

@@ -9,9 +9,9 @@ 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.params.SyncDataParam;
 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.PrintPlanStatusEnum;
+import com.qmth.distributed.print.business.enums.ExamPaperStructureStatusEnum;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.teachcloud.common.bean.dto.stmms.GroupDetailDTO;
 import com.qmth.teachcloud.common.bean.dto.stmms.PicConfig;
@@ -22,10 +22,7 @@ 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.SysUser;
-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.service.BasicAttachmentService;
 import com.qmth.teachcloud.common.service.SysConfigService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
@@ -176,7 +173,7 @@ public class DataSyncServiceImpl implements DataSyncService {
             public void run() {
                 SysConfig sysConfig = sysConfigService.getByKey("sys.sync.enable");
                 if (sysConfig != null && "true".equals(sysConfig.getConfigValue())) {
-                    TBSyncTask syncTask = tbSyncTaskService.saveTask(examPrintPlan);
+                    TBSyncTask syncTask = tbSyncTaskService.saveTask(examPrintPlan.getSchoolId(), examPrintPlan.getId(), PushTypeEnum.EXAM_PUSH);
                     doSyncBaseData(examPrintPlan, thirdRelateId, thirdRelateName, syncTask, sysUser);
                 }
             }
@@ -185,10 +182,12 @@ public class DataSyncServiceImpl implements DataSyncService {
 
     @Async
     @Override
-    public void syncPaperStructureAndGroup(ExamPaperStructure examPaperStructure) {
+    public void syncPaperStructureAndGroup(ExamPaperStructure examPaperStructure, TBSyncTask tbSyncTask) {
         // 开始同步
-        examPaperStructureService.updateStatusById(examPaperStructure.getId(), ExamPaperStructureStatusEnum.START_SYNC);
-        ExamPaperStructureStatusEnum status = ExamPaperStructureStatusEnum.UPLOAD_FINISH;
+        ExamPaperStructureStatusEnum structureStatus = ExamPaperStructureStatusEnum.INIT;
+        // 同步初始参数
+        TaskResultEnum result = null;
+        String errorMessage = null;
         try {
             String paperTypes = examPaperStructure.getPaperType();
             if (StringUtils.isBlank(paperTypes)) {
@@ -201,6 +200,9 @@ public class DataSyncServiceImpl implements DataSyncService {
             // 科目代码(课程代码+卷型+课程序号)
             String subjectCode = examPaperStructure.getCourseCode().concat(examPaperStructure.getPaperType()).concat(examPaperStructure.getSequence());
 
+            // 同步中
+            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), TaskStatusEnum.RUNNING, null, null);
+
             // 同步主观题
             String subjectiveStructure = examPaperStructure.getSubjectiveStructure();
             if (StringUtils.isNotBlank(subjectiveStructure)) {
@@ -216,7 +218,7 @@ public class DataSyncServiceImpl implements DataSyncService {
 
                 cloudMarkingTaskUtils.syncPaperStructure(schoolId, examId, subjectCode, false, null, syncSubjectiveStructureDatas);
             }
-//            status = ExamPaperStructureStatusEnum.FINISH;
+            structureStatus = ExamPaperStructureStatusEnum.SUBJECTIVE_FINISH;
 
             // 同步分组
             int countGroup = cloudMarkingTaskUtils.countGroup(schoolId, examId, subjectCode);
@@ -255,6 +257,7 @@ public class DataSyncServiceImpl implements DataSyncService {
                 }
                 cloudMarkingTaskUtils.saveMarkerGroup(schoolId, examId, subjectCode, 0, groupDetailDTOS);
             }
+            structureStatus = ExamPaperStructureStatusEnum.GROUP_FINISH;
 
             // 同步绑定评卷员
             for (ExamPaperGroup examPaperGroup : examPaperGroups) {
@@ -263,18 +266,25 @@ public class DataSyncServiceImpl implements DataSyncService {
                     cloudMarkingTaskUtils.saveMarker(schoolId, examId, subjectCode, examPaperGroup.getGroupNumber(), examPaperGroupMarker.getLoginName());
                 }
             }
-
+            structureStatus = ExamPaperStructureStatusEnum.FINISH;
+            result = TaskResultEnum.SUCCESS;
         } catch (ApiException e) {
-            throw ExceptionResultEnum.ERROR.exception("试卷结构同步失败:" + e.getMessage());
+            result = TaskResultEnum.ERROR;
+            errorMessage = e.getMessage();
         } finally {
-            examPaperStructure.setStatus(status);
+            examPaperStructure.setStatus(structureStatus);
             examPaperStructureService.updateById(examPaperStructure);
+
+            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), TaskStatusEnum.FINISH, result, errorMessage);
         }
     }
 
     @Async
     @Override
-    public void syncPaperAndAnswer(ExamPaperStructure examPaperStructure) {
+    public void syncPaperAndAnswer(ExamPaperStructure examPaperStructure, TBSyncTask tbSyncTask) {
+        // 同步初始参数
+        TaskResultEnum result = null;
+        String errorMessage = null;
         try {
             Long schoolId = examPaperStructure.getSchoolId();
             // 云阅卷考试ID
@@ -282,6 +292,8 @@ public class DataSyncServiceImpl implements DataSyncService {
             // 科目代码(课程代码+卷型+课程序号)
             String subjectCode = examPaperStructure.getCourseCode().concat(examPaperStructure.getPaperType()).concat(examPaperStructure.getSequence());
 
+            // 同步中
+            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), TaskStatusEnum.RUNNING, null, null);
             // 同步试卷
             String paperAnswer = examPaperStructure.getPaperAnswer();
             if (StringUtils.isNotBlank(paperAnswer)) {
@@ -322,15 +334,21 @@ public class DataSyncServiceImpl implements DataSyncService {
                 }
                 examPaperStructure.setPaperAnswer(JSONObject.toJSONString(paperAnswerJsons));
             }
+            result = TaskResultEnum.SUCCESS;
         } catch (ApiException e) {
-            throw ExceptionResultEnum.ERROR.exception("试卷结构同步失败:" + e.getMessage());
+            result = TaskResultEnum.ERROR;
+            errorMessage = e.getMessage();
         } finally {
+            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), TaskStatusEnum.FINISH, result, errorMessage);
         }
     }
 
     @Async
     @Override
-    public void syncObjectiveStructure(ExamPaperStructure examPaperStructure) {
+    public void syncObjectiveStructure(ExamPaperStructure examPaperStructure, TBSyncTask tbSyncTask) {
+        // 同步初始参数
+        TaskResultEnum result = null;
+        String errorMessage = null;
         try {
             Long schoolId = examPaperStructure.getSchoolId();
             // 云阅卷考试ID
@@ -352,53 +370,67 @@ public class DataSyncServiceImpl implements DataSyncService {
                 }).collect(Collectors.toList());
                 cloudMarkingTaskUtils.syncPaperStructure(schoolId, examId, subjectCode, true, null, syncObjectiveStructureDatas);
             }
+
+            result = TaskResultEnum.SUCCESS;
         } catch (ApiException e) {
-            throw ExceptionResultEnum.ERROR.exception("试卷结构同步失败:" + e.getMessage());
+            result = TaskResultEnum.ERROR;
+            errorMessage = e.getMessage();
         } finally {
+            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), TaskStatusEnum.FINISH, result, errorMessage);
         }
     }
 
     /**
-     * 同步核心方法
+     * 同步考试、考生、科目、题卡
      *
-     * @param thirdRelateName
-     * @param syncTask
+     * @param examPrintPlan   计划
+     * @param thirdRelateId   云阅卷考试ID
+     * @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("印刷计划未打印完成或者未结束,不能同步数据");
             }
-            UpdateWrapper<TBSyncTask> tbSyncTaskUpdateWrapper = new UpdateWrapper<>();
-            tbSyncTaskUpdateWrapper.lambda().set(TBSyncTask::getStatus, TaskStatusEnum.RUNNING).eq(TBSyncTask::getId, syncTask.getId());
-            tbSyncTaskService.update(tbSyncTaskUpdateWrapper);
+            // 同步中
+            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("无法获取云阅卷考试,同步数据失败");
+                throw ExceptionResultEnum.ERROR.exception("无法获取云阅卷考试ID,同步数据失败");
             }
-
-            // 更新日志表
-            syncTask.setResult(TaskResultEnum.SUCCESS);
-            syncTask.setErrorMessage(null);
+            // 任务结果
+            result = TaskResultEnum.SUCCESS;
         } catch (Exception e) {
-            syncTask.setResult(TaskResultEnum.ERROR);
-            syncTask.setErrorMessage(e.getMessage());
+            result = TaskResultEnum.ERROR;
+            errorMessage = e.getMessage();
         } finally {
-            syncTask.setStatus(TaskStatusEnum.FINISH);
-            tbSyncTaskService.saveOrUpdate(syncTask);
+            // 同步结束
+            status = TaskStatusEnum.FINISH;
+            tbSyncTaskService.updateStatusAndResultById(syncTask.getId(), status, result, errorMessage);
+
             updateWrapper.lambda().set(ExamPrintPlan::getSyncStatus, syncStatus).eq(ExamPrintPlan::getId, examPrintPlan.getId());
             examPrintPlanService.update(updateWrapper);
             // 同步成功,发送短信

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

@@ -183,7 +183,6 @@ public class ExamPaperStructureServiceImpl extends ServiceImpl<ExamPaperStructur
         examPaperStructureTemp.setSubjectiveStructure(JSONObject.toJSONString(subjectiveStructureList));
         examPaperStructureTemp.setObjectiveStructure(JSONObject.toJSONString(objectiveStructureList));
         // 上传成功
-        examPaperStructureTemp.setStatus(ExamPaperStructureStatusEnum.UPLOAD_FINISH);
         this.updateById(examPaperStructureTemp);
 
         ExamTask examTask = examTaskService.getByCourseCodeAndPaperNumber(examPaperStructureTemp.getSchoolId(), examPaperStructureTemp.getCourseCode(), examPaperStructureTemp.getPaperNumber());

+ 67 - 18
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBSyncTaskServiceImpl.java

@@ -1,13 +1,16 @@
 package com.qmth.distributed.print.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.distributed.print.business.entity.ExamPrintPlan;
+import com.qmth.distributed.print.business.entity.ExamPaperStructure;
 import com.qmth.distributed.print.business.entity.TBSyncTask;
 import com.qmth.distributed.print.business.mapper.TBSyncTaskMapper;
+import com.qmth.distributed.print.business.service.ExamPaperStructureService;
 import com.qmth.distributed.print.business.service.TBSyncTaskService;
+import com.qmth.distributed.print.business.templete.execute.AsyncCloudMarkingTaskService;
 import com.qmth.teachcloud.common.bean.result.SyncListResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
@@ -30,33 +33,48 @@ import java.util.Set;
  */
 @Service
 public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncTask> implements TBSyncTaskService {
+
+    @Resource
+    AsyncCloudMarkingTaskService asyncCloudMarkingTaskService;
+
     @Resource
-    TBSyncTaskMapper tbSyncTaskMapper;
+    ExamPaperStructureService examPaperStructureService;
 
+    @Transactional
     @Override
-    public TBSyncTask saveTask(ExamPrintPlan examPrintPlan) {
+    public TBSyncTask saveTask(Long schoolId, Long objectId, PushTypeEnum type) {
         QueryWrapper<TBSyncTask> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(TBSyncTask::getSchoolId, examPrintPlan.getSchoolId())
-                .eq(TBSyncTask::getPrintPlanId, examPrintPlan.getId())
-                .eq(TBSyncTask::getType, PushTypeEnum.EXAM_PUSH)
-                .ne(TBSyncTask::getStatus, TaskStatusEnum.FINISH);
+        queryWrapper.lambda().eq(TBSyncTask::getSchoolId, schoolId)
+                .eq(TBSyncTask::getObjectId, objectId)
+                .eq(TBSyncTask::getType, type);
         TBSyncTask tbSyncTask = this.getOne(queryWrapper);
         if (tbSyncTask != null) {
-            throw ExceptionResultEnum.ERROR.exception("计划下有数据正在同步");
-        } else {
-            tbSyncTask = new TBSyncTask();
-            tbSyncTask.setId(SystemConstant.getDbUuid());
-            tbSyncTask.setSchoolId(examPrintPlan.getSchoolId());
-            tbSyncTask.setPrintPlanId(examPrintPlan.getId());
-            tbSyncTask.setPrintPlanName(examPrintPlan.getName());
-            tbSyncTask.setType(PushTypeEnum.EXAM_PUSH);
-            tbSyncTask.setStatus(TaskStatusEnum.INIT);
-            tbSyncTask.setCreateTime(System.currentTimeMillis());
+            if (!TaskStatusEnum.FINISH.equals(tbSyncTask.getStatus())) {
+                throw ExceptionResultEnum.ERROR.exception("有任务未结束");
+            }
+            this.removeById(tbSyncTask.getId());
         }
+        tbSyncTask = new TBSyncTask();
+        tbSyncTask.setId(SystemConstant.getDbUuid());
+        tbSyncTask.setSchoolId(schoolId);
+        tbSyncTask.setObjectId(objectId);
+        tbSyncTask.setType(type);
+        tbSyncTask.setStatus(TaskStatusEnum.INIT);
+        tbSyncTask.setCreateTime(System.currentTimeMillis());
         this.save(tbSyncTask);
         return tbSyncTask;
     }
 
+    @Override
+    public void updateStatusAndResultById(Long id, TaskStatusEnum status, TaskResultEnum result, String errorMessage) {
+        UpdateWrapper<TBSyncTask> tbSyncTaskUpdateWrapper = new UpdateWrapper<>();
+        tbSyncTaskUpdateWrapper.lambda().set(TBSyncTask::getStatus, status)
+                .set(TBSyncTask::getResult, result)
+                .set(TBSyncTask::getErrorMessage, errorMessage)
+                .eq(TBSyncTask::getId, id);
+        this.update(tbSyncTaskUpdateWrapper);
+    }
+
     @Transactional
     @Override
     public TBSyncTask savePushCommon(PushTypeEnum pushTypeEnum, Map map, SysUser sysUser) {
@@ -76,7 +94,7 @@ public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncT
     public IPage<SyncListResult> query(Long schoolId, TaskStatusEnum status, PushTypeEnum type, TaskResultEnum result, int pageNumber, int pageSize) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         Set<Long> orgIds = null;
-        IPage<SyncListResult> page = tbSyncTaskMapper.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();
         for (SyncListResult syncListResult : list) {
             syncListResult.setStatus(Objects.nonNull(syncListResult.getStatus()) ? TaskStatusEnum.valueOf(syncListResult.getStatus()).getTitle() : null);
@@ -85,4 +103,35 @@ public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncT
         }
         return page;
     }
+
+    @Override
+    public void resync(Long id) {
+        TBSyncTask tbSyncTask = this.getById(id);
+        if (tbSyncTask == null) {
+            throw ExceptionResultEnum.ERROR.exception("任务不存在");
+        }
+        if (!TaskStatusEnum.FINISH.equals(tbSyncTask.getStatus())) {
+            throw ExceptionResultEnum.ERROR.exception("任务同步中");
+        }
+        if (TaskResultEnum.SUCCESS.equals(tbSyncTask.getResult())) {
+            throw ExceptionResultEnum.ERROR.exception("任务同步成功");
+        }
+        ExamPaperStructure examPaperStructure = examPaperStructureService.getById(tbSyncTask.getObjectId());
+        if (examPaperStructure == null) {
+            throw ExceptionResultEnum.ERROR.exception("未找到同步数据");
+        }
+        switch (tbSyncTask.getType()) {
+            case STRUCTURE_GROUP_PUSH:
+                asyncCloudMarkingTaskService.syncPaperStructureAndGroup(examPaperStructure);
+                break;
+            case PAPER_ANSWER_FILE_PUSH:
+                asyncCloudMarkingTaskService.syncPaperAndAnswer(examPaperStructure);
+                break;
+            case OBJECTIVE_ANSWER_PUSH:
+                asyncCloudMarkingTaskService.syncObjectiveStructure(examPaperStructure);
+                break;
+        }
+
+
+    }
 }

+ 12 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCloudMarkingTaskService.java

@@ -1,8 +1,11 @@
 package com.qmth.distributed.print.business.templete.execute;
 
 import com.qmth.distributed.print.business.entity.ExamPaperStructure;
+import com.qmth.distributed.print.business.entity.TBSyncTask;
 import com.qmth.distributed.print.business.service.DataSyncService;
+import com.qmth.distributed.print.business.service.TBSyncTaskService;
 import com.qmth.teachcloud.common.entity.SysConfig;
+import com.qmth.teachcloud.common.enums.PushTypeEnum;
 import com.qmth.teachcloud.common.service.SysConfigService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -24,6 +27,9 @@ public class AsyncCloudMarkingTaskService {
     @Resource
     private DataSyncService dataSyncService;
 
+    @Resource
+    private TBSyncTaskService tbSyncTaskService;
+
     private boolean isSync() {
         SysConfig sysConfig = sysConfigService.getByKey("sys.sync.enable");
         return sysConfig != null && "true".equals(sysConfig.getConfigValue());
@@ -36,7 +42,8 @@ public class AsyncCloudMarkingTaskService {
      */
     public void syncPaperStructureAndGroup(ExamPaperStructure examPaperStructure) {
         if (isSync()) {
-            dataSyncService.syncPaperStructureAndGroup(examPaperStructure);
+            TBSyncTask tbSyncTask = tbSyncTaskService.saveTask(examPaperStructure.getSchoolId(), examPaperStructure.getId(), PushTypeEnum.STRUCTURE_GROUP_PUSH);
+            dataSyncService.syncPaperStructureAndGroup(examPaperStructure, tbSyncTask);
         }
     }
 
@@ -47,7 +54,8 @@ public class AsyncCloudMarkingTaskService {
      */
     public void syncPaperAndAnswer(ExamPaperStructure examPaperStructure) {
         if (isSync()) {
-            dataSyncService.syncPaperAndAnswer(examPaperStructure);
+            TBSyncTask tbSyncTask = tbSyncTaskService.saveTask(examPaperStructure.getSchoolId(), examPaperStructure.getId(), PushTypeEnum.PAPER_ANSWER_FILE_PUSH);
+            dataSyncService.syncPaperAndAnswer(examPaperStructure, tbSyncTask);
         }
     }
 
@@ -58,7 +66,8 @@ public class AsyncCloudMarkingTaskService {
      */
     public void syncObjectiveStructure(ExamPaperStructure examPaperStructure) {
         if (isSync()) {
-            dataSyncService.syncObjectiveStructure(examPaperStructure);
+            TBSyncTask tbSyncTask = tbSyncTaskService.saveTask(examPaperStructure.getSchoolId(), examPaperStructure.getId(), PushTypeEnum.OBJECTIVE_ANSWER_PUSH);
+            dataSyncService.syncObjectiveStructure(examPaperStructure, tbSyncTask);
         }
     }
 }

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

@@ -114,7 +114,7 @@ public class ExamPaperStructureController {
      * @param id                 试卷结构表id
      * @param objectiveStructure 客观题结构json
      */
-    @ApiOperation(value = "保存客观题答案")
+    @ApiOperation(value = "更新客观题答案")
     @RequestMapping(value = "/update_objective_answer", method = RequestMethod.POST)
     public Result uploadAnswer(@RequestParam("id") Long id,
                                @RequestParam("objectiveStructure") String objectiveStructure) {

+ 16 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/TBSyncTaskController.java

@@ -32,7 +32,7 @@ import javax.validation.constraints.Min;
  */
 @Api(tags = "数据管理-任务管理Controller")
 @RestController
-@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.data}")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.data}/sync")
 @Validated
 public class TBSyncTaskController {
     private final static Logger log = LoggerFactory.getLogger(TBSyncTaskController.class);
@@ -41,7 +41,7 @@ public class TBSyncTaskController {
     TBSyncTaskService tbSyncTaskService;
 
     @ApiOperation(value = "同步管理查询接口")
-    @RequestMapping(value = "/sync/query", method = RequestMethod.POST)
+    @RequestMapping(value = "/query", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "任务管理列表信息", response = TaskListResult.class)})
     public Result syncQuery(@ApiParam(value = "任务状态") @RequestParam(required = false) TaskStatusEnum status,
                             @ApiParam(value = "同步类型") @RequestParam(required = false) PushTypeEnum type,
@@ -49,7 +49,20 @@ public class TBSyncTaskController {
                             @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                             @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
         Long schoolId = SystemConstant.convertIdToLong(String.valueOf(ServletUtil.getRequestHeaderSchoolId()));
-        IPage<SyncListResult> page = tbSyncTaskService.query(schoolId,status,type,result,pageNumber,pageSize);
+        IPage<SyncListResult> page = tbSyncTaskService.query(schoolId, status, type, result, pageNumber, pageSize);
         return ResultUtil.ok(page);
     }
+
+    /**
+     * 重新同步
+     *
+     * @param id 任务ID
+     */
+    @ApiOperation(value = "重新同步")
+    @RequestMapping(value = "/resync", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "重新同步", response = TaskListResult.class)})
+    public Result syncQuery(@ApiParam(value = "任务ID") @RequestParam(required = false) Long id) {
+        tbSyncTaskService.resync(id);
+        return ResultUtil.ok(true);
+    }
 }

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

@@ -148,6 +148,10 @@ sync.config.studentScoreUrl=/api/exam/student/score
 sync.config.structureUrl=/api/exam/paper/save
 # \uFFFD\u00FB\uFFFD\u036C\uFFFD\uFFFD
 sync.config.userSaveUrl=/api/user/external/save
+sync.config.groupSaveUrl=/api/exam/mark_group/save
+sync.config.groupCountUrl=/api/exam/mark_group/count
+sync.config.groupDeleteUrl=/api/exam/mark_group/delete
+sync.config.markerSaveUrl=/api/exam/marker/save
 
 sms.config.smsNormalCode=qmth
 sms.config.codeExpiredTime=2

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

@@ -153,6 +153,10 @@ sync.config.studentScoreUrl=/api/exam/student/score
 sync.config.structureUrl=/api/exam/paper/save
 # \uFFFD\u00FB\uFFFD\u036C\uFFFD\uFFFD
 sync.config.userSaveUrl=/api/user/external/save
+sync.config.groupSaveUrl=/api/exam/mark_group/save
+sync.config.groupCountUrl=/api/exam/mark_group/count
+sync.config.groupDeleteUrl=/api/exam/mark_group/delete
+sync.config.markerSaveUrl=/api/exam/marker/save
 
 sms.config.smsNormalCode=8635
 sms.config.codeExpiredTime=2

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

@@ -148,13 +148,9 @@ sync.config.studentScoreUrl=/api/exam/student/score
 sync.config.structureUrl=/api/exam/paper/save
 # \uFFFD\u00FB\uFFFD\u036C\uFFFD\uFFFD
 sync.config.userSaveUrl=/api/user/external/save
-#????????
 sync.config.groupSaveUrl=/api/exam/mark_group/save
-#????????
 sync.config.groupCountUrl=/api/exam/mark_group/count
-#????????
 sync.config.groupDeleteUrl=/api/exam/mark_group/delete
-#???????
 sync.config.markerSaveUrl=/api/exam/marker/save
 
 sms.config.smsNormalCode=8635