xiaofei 1 rok pred
rodič
commit
b5814e8751
22 zmenil súbory, kde vykonal 377 pridanie a 185 odobranie
  1. 36 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TBSyncTask.java
  2. 7 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/DataSyncService.java
  3. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPaperStructureService.java
  4. 0 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPrintPlanService.java
  5. 1 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TBSyncTaskService.java
  6. 7 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/CloudUserPushServiceImpl.java
  7. 98 112
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncServiceImpl.java
  8. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java
  9. 7 7
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPaperStructureServiceImpl.java
  10. 11 17
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPrintPlanServiceImpl.java
  11. 49 13
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBSyncTaskServiceImpl.java
  12. 2 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TSyncStmmsExamServiceImpl.java
  13. 44 14
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCloudMarkingTaskService.java
  14. 5 2
      distributed-print-business/src/main/resources/db/log/脚本-xiaof.sql
  15. 0 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPrintPlanSyncController.java
  16. 11 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/stmms/QuestionDTO.java
  17. 2 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  18. 77 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/sync/CloudMarkingTaskUtils.java
  19. 3 3
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/SubjectCalculateJob.java
  20. 1 1
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/JobService.java
  21. 2 2
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java
  22. 1 1
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/start/StartRunning.java

+ 36 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TBSyncTask.java

@@ -43,11 +43,23 @@ public class TBSyncTask extends BaseEntity implements Serializable {
     @TableField("third_relate_id")
     private Long thirdRelateId;
 
+    @ApiModelProperty(value = "第三方关联名称")
+    @TableField("third_relate_name")
+    private String thirdRelateName;
+
+    @ApiModelProperty(value = "考试时间")
+    @TableField("exam_time")
+    private String examTime;
+
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "对象id")
     @TableField(value = "object_id")
     private Long objectId;
 
+    @ApiModelProperty(value = "机构编码")
+    @TableField(value = "org_code")
+    private String orgCode;
+
     @ApiModelProperty(value = "任务状态,INIT:未开始,RUNNING:进行中,FINISH:已完成")
     @TableField(value = "status")
     private TaskStatusEnum status;
@@ -118,6 +130,22 @@ public class TBSyncTask extends BaseEntity implements Serializable {
         this.thirdRelateId = thirdRelateId;
     }
 
+    public String getThirdRelateName() {
+        return thirdRelateName;
+    }
+
+    public void setThirdRelateName(String thirdRelateName) {
+        this.thirdRelateName = thirdRelateName;
+    }
+
+    public String getExamTime() {
+        return examTime;
+    }
+
+    public void setExamTime(String examTime) {
+        this.examTime = examTime;
+    }
+
     public Long getSchoolId() {
         return schoolId;
     }
@@ -134,6 +162,14 @@ public class TBSyncTask extends BaseEntity implements Serializable {
         this.objectId = objectId;
     }
 
+    public String getOrgCode() {
+        return orgCode;
+    }
+
+    public void setOrgCode(String orgCode) {
+        this.orgCode = orgCode;
+    }
+
     public TaskStatusEnum getStatus() {
         return status;
     }

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

@@ -4,11 +4,13 @@ import com.qmth.distributed.print.business.entity.ExamPaperStructure;
 import com.qmth.distributed.print.business.entity.TBSyncTask;
 import com.qmth.teachcloud.common.entity.SysUser;
 
+import java.util.List;
+
 /**
  * 同步数据到云阅卷 服务类
  */
 public interface DataSyncService {
-    void syncExamAndStudentAndCard(Long thirdRelateId, String thirdRelateName, String examTime, TBSyncTask tbSyncTask, SysUser sysUser);
+    void syncExamAndStudentAndCard(String orgCode, String thirdRelateName, String examTime, List<TBSyncTask> tbSyncTaskList, SysUser sysUser);
 
     void syncPaperStructureAndGroup(ExamPaperStructure examPaperStructure, TBSyncTask tbSyncTask);
 
@@ -17,7 +19,10 @@ public interface DataSyncService {
     void syncObjectiveStructure(ExamPaperStructure examPaperStructure, TBSyncTask tbSyncTask);
 
     void syncMarkLeader(ExamPaperStructure examPaperStructure, TBSyncTask tbSyncTask);
+
     void syncMarker(ExamPaperStructure examPaperStructure, TBSyncTask tbSyncTask);
 
-    Integer saveSchool(Long schoolId, Integer thirdRelateId, String orgCode, String orgName);
+    Long saveExam(Long schoolId, Long objectId, String orgCode, Long thirdRelateId, String thirdRelateName, String examTime);
+
+    Integer saveSchool(Long schoolId, String orgCode, String orgName);
 }

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

@@ -94,5 +94,5 @@ public interface ExamPaperStructureService extends IService<ExamPaperStructure>
     /**
      * 自动统分
      */
-    void reunifyScore();
+    void subjectCalculate();
 }

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

@@ -12,8 +12,6 @@ import com.qmth.distributed.print.business.bean.result.PrintPlanResult;
 import com.qmth.distributed.print.business.entity.ExamPrintPlan;
 import com.qmth.distributed.print.business.enums.ExamTaskSyncStatusEnum;
 import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
-import com.qmth.distributed.print.business.enums.SyncCardTypeEnum;
-import com.qmth.teachcloud.common.entity.SysUser;
 
 import java.util.List;
 import java.util.Map;

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

@@ -21,6 +21,7 @@ import java.util.Map;
 public interface TBSyncTaskService extends IService<TBSyncTask> {
 
     TBSyncTask saveTask(Long schoolId,  Long objectId, PushTypeEnum type, String remark);
+    TBSyncTask saveTask(Long schoolId,  Long objectId, String orgCode, String thirdRelateName, String examTime, PushTypeEnum type, String remark);
 
     void updateStatusAndResultById(Long id, Long thirdRelateId, TaskStatusEnum status, TaskResultEnum result, String errorMessage);
 

+ 7 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/CloudUserPushServiceImpl.java

@@ -102,7 +102,7 @@ public class CloudUserPushServiceImpl implements CloudUserPushService {
                     Long schoolId = userPushParam.getSchoolId();
                     String orgCode = userPushParam.getOrgCode();
 
-                    PushResult pushResult = stmmsUtils.syncUser(account,name,password,roleValue,enable,schoolId,orgCode);
+                    PushResult pushResult = stmmsUtils.syncUser(account, name, password, roleValue, enable, schoolId, orgCode);
                     boolean syncResult = pushResult.getSuccess();
                     String syncExceptionCell = null;
 
@@ -168,7 +168,7 @@ public class CloudUserPushServiceImpl implements CloudUserPushService {
      */
     private Map<Long, List<UserPushParam>> buildUserPushMap(List<SysUser> sysUserList, Long schoolId) {
         // 构建用户机构id键值对
-        Map<Long, SysOrg> orgMap = sysOrgService.list(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getSchoolId,schoolId))
+        Map<Long, SysOrg> orgMap = sysOrgService.list(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getSchoolId, schoolId))
                 .stream()
                 .collect(Collectors.toMap(SysOrg::getId, v -> v));
 
@@ -183,9 +183,11 @@ public class CloudUserPushServiceImpl implements CloudUserPushService {
             SysOrg sysOrg = orgMap.get(orgId);
 
             // 判断并推送学院机构
-            if (cloudMarkingTaskUtils.isCollegeMode(schoolId) && sysOrg.getThirdRelateId() != null){
-                sysOrg.setThirdRelateId(dataSyncService.saveSchool(schoolId,sysOrg.getThirdRelateId(),sysOrg.getCode(),sysOrg.getName()));
-                orgMap.put(orgId,sysOrg);
+            if (cloudMarkingTaskUtils.isCollegeMode(schoolId) && sysOrg.getThirdRelateId() != null) {
+                if (sysOrg.getThirdRelateId() == null) {
+                    sysOrg.setThirdRelateId(dataSyncService.saveSchool(schoolId, sysOrg.getCode(), sysOrg.getName()));
+                }
+                orgMap.put(orgId, sysOrg);
             }
 
             // 用户推送相关信息

+ 98 - 112
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncServiceImpl.java

@@ -9,7 +9,6 @@ import com.qmth.distributed.print.business.bean.dto.SyncExamStudentDto;
 import com.qmth.distributed.print.business.bean.dto.SyncExamTaskDto;
 import com.qmth.distributed.print.business.bean.marking.GroupInfo;
 import com.qmth.distributed.print.business.bean.marking.Marker;
-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.ExamTaskSyncStatusEnum;
@@ -99,33 +98,27 @@ public class DataSyncServiceImpl implements DataSyncService {
 
     @Async
     @Override
-    public void syncExamAndStudentAndCard(Long thirdRelateId, String thirdRelateName, String examTime, TBSyncTask tbSyncTask, SysUser sysUser) {
-
-        // 同步初始参数
-        TaskResultEnum result = null;
-        TaskStatusEnum status;
-        String errorMessage = null;
-        Long schoolId = tbSyncTask.getSchoolId();
-        Long objectId = tbSyncTask.getObjectId();
-        SyncDataParam syncDataParam = JSON.parseObject(tbSyncTask.getRemark(), SyncDataParam.class);
-        Integer thirdRelateOrgId = null;
-
-        // 各步骤状态
-        try {
-            // 同步中
-            status = TaskStatusEnum.RUNNING;
-            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), null, status, null, null);
-
-            // 按学院code进行分组,并按学院进行循环同步
-            Map<String, List<SyncExamTaskDto>> byCollegeCodeMap = syncDataParam.getList().stream().collect(Collectors.groupingBy(SyncExamTaskDto::getCollegeCode));
-            for (Map.Entry<String, List<SyncExamTaskDto>> entry : byCollegeCodeMap.entrySet()) {
-                // 本行为,若为按学校同步,则后续方法都传null,方便校验
-                String orgCode = cloudMarkingTaskUtils.isCollegeMode(schoolId) ? entry.getKey() : null;
+    public void syncExamAndStudentAndCard(String orgCode, String thirdRelateName, String examTime, List<TBSyncTask> tbSyncTaskList, SysUser sysUser) {
+        for (TBSyncTask tbSyncTask : tbSyncTaskList) {
+            // 同步初始参数
+            TaskResultEnum result = null;
+            TaskStatusEnum status;
+            String errorMessage = null;
+            Long schoolId = tbSyncTask.getSchoolId();
+            Long objectId = tbSyncTask.getObjectId();
+            SyncExamTaskDto syncExamTaskDto = JSON.parseObject(tbSyncTask.getRemark(), SyncExamTaskDto.class);
+            Long thirdRelateId = null;
+
+            // 各步骤状态
+            try {
+                // 同步中
+                status = TaskStatusEnum.RUNNING;
+                tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), null, status, null, null);
 
                 if (StringUtils.isNotBlank(orgCode)) {
                     SysOrg byCode = sysOrgService.findByCode(schoolId, orgCode);
                     // 同步机构
-                    thirdRelateOrgId = saveSchool(schoolId, thirdRelateOrgId, orgCode, byCode.getName());
+                    saveSchool(schoolId, orgCode, byCode.getName());
                 }
                 // 查询本地库中云阅卷考试Id是否存在
                 TSyncStmmsExam tSyncStmmsExam = tSyncStmmsExamService.getBySchoolIdAndOrgCodeAndExamName(schoolId, orgCode, thirdRelateName);
@@ -133,90 +126,86 @@ public class DataSyncServiceImpl implements DataSyncService {
                     thirdRelateId = Long.valueOf(tSyncStmmsExam.getExamId());
                 }
 
-                //按课程做同步
-                for (SyncExamTaskDto param : syncDataParam.getList()) {
-                    // 前置方法已经校验过各课程下是否有学院代码
-                    // 同步考试
-                    thirdRelateId = saveExam(schoolId, objectId, orgCode, thirdRelateId, thirdRelateName, examTime);
+                // 前置方法已经校验过各课程下是否有学院代码
+                // 同步考试
+                thirdRelateId = saveExam(schoolId, objectId, orgCode, thirdRelateId, thirdRelateName, examTime);
 
-                    Long examTaskId = Long.valueOf(param.getExamTaskId());
-                    ExamTask examTask = examTaskService.getById(examTaskId);
+                Long examTaskId = Long.valueOf(syncExamTaskDto.getExamTaskId());
+                ExamTask examTask = examTaskService.getById(examTaskId);
 
-                    for (String paperType : param.getPaperType().split(",")) {
-                        ExamTaskSync examTaskSync = examTaskSyncService.getBySchoolIdAndOrgCodeAndPaperNumberAndPaperType(schoolId, examTask.getExamId(), orgCode, examTask.getPaperNumber(), paperType);
-                        if (examTaskSync != null && ExamTaskSyncStatusEnum.STARTING.equals(examTaskSync.getSyncStatus())) {
-                            throw ExceptionResultEnum.ERROR.exception("任务中有课程正在同步中,请刷新列表查看最新状态");
-                        }
-                        ExamTaskSyncStatusEnum syncStatus = ExamTaskSyncStatusEnum.STARTING;
-
-                        if (examTaskSync == null) {
-                            examTaskSync = new ExamTaskSync(schoolId, examTask.getExamId(), examTask.getCourseCode(), examTask.getPaperNumber(), paperType, param.getPaperType(), orgCode, Math.toIntExact(thirdRelateId), syncStatus, sysUser.getId(), System.currentTimeMillis(), null);
+                for (String paperType : syncExamTaskDto.getPaperType().split(",")) {
+                    ExamTaskSync examTaskSync = examTaskSyncService.getBySchoolIdAndOrgCodeAndPaperNumberAndPaperType(schoolId, examTask.getExamId(), orgCode, examTask.getPaperNumber(), paperType);
+                    if (examTaskSync != null && ExamTaskSyncStatusEnum.STARTING.equals(examTaskSync.getSyncStatus())) {
+                        throw ExceptionResultEnum.ERROR.exception("任务中有课程正在同步,请刷新列表查看最新状态");
+                    }
+                    ExamTaskSyncStatusEnum syncStatus = ExamTaskSyncStatusEnum.STARTING;
+                    if (examTaskSync == null) {
+                        examTaskSync = new ExamTaskSync(schoolId, examTask.getExamId(), examTask.getCourseCode(), examTask.getPaperNumber(), paperType, syncExamTaskDto.getPaperType(), orgCode, Math.toIntExact(thirdRelateId), syncStatus, sysUser.getId(), System.currentTimeMillis(), null);
+                    } else {
+                        examTaskSync.setThirdRelateId(Math.toIntExact(thirdRelateId));
+                        examTaskSync.setSyncStatus(syncStatus);
+                        examTaskSync.setSyncStartTime(System.currentTimeMillis());
+                        examTaskSync.setSyncUserId(sysUser.getId());
+                        examTaskSync.setErrorMsg(null);
+                    }
+                    examTaskSyncService.saveOrUpdate(examTaskSync);
+
+                    String errorMsg = null;
+                    ExamTaskSyncStatusEnum taskSyncStatusEnum = null;
+                    try {
+                        List<Long> printPlanIds = Arrays.asList(syncExamTaskDto.getPrintPlanIds().split(",")).stream().map(m -> Long.parseLong(m)).collect(Collectors.toList());
+                        List<ExamDetailCourseDto> examDetailCourseList = examDetailCourseService.listByPrintPlanIdAndExamTaskId(printPlanIds, examTaskId, paperType);
+                        // 同步考生
+                        List<SyncExamStudentDto> syncExamStudentDtoList = examStudentService.listStudentByExamDetailCourseId(examDetailCourseList, paperType);
+
+                        // 没有考生就单独推送科目
+                        if (CollectionUtils.isEmpty(syncExamStudentDtoList)) {
+                            for (ExamDetailCourseDto examDetailCourseDto : examDetailCourseList) {
+                                // 只同步当前卷型
+                                saveSubject(schoolId, thirdRelateId, examDetailCourseDto.getCourseCode(), examDetailCourseDto.getCourseName(), examDetailCourseDto.getSequence(), paperType);
+                            }
                         } else {
-                            examTaskSync.setThirdRelateId(Math.toIntExact(thirdRelateId));
-                            examTaskSync.setSyncStatus(syncStatus);
-                            examTaskSync.setSyncStartTime(System.currentTimeMillis());
-                            examTaskSync.setSyncUserId(sysUser.getId());
-                            examTaskSync.setErrorMsg(null);
-                        }
-                        examTaskSyncService.saveOrUpdate(examTaskSync);
-
-                        String errorMsg = null;
-                        ExamTaskSyncStatusEnum taskSyncStatusEnum = null;
-                        try {
-                            List<Long> printPlanIds = Arrays.asList(param.getPrintPlanIds().split(",")).stream().map(m -> Long.parseLong(m)).collect(Collectors.toList());
-                            List<ExamDetailCourseDto> examDetailCourseList = examDetailCourseService.listByPrintPlanIdAndExamTaskId(printPlanIds, examTaskId, paperType);
-                            // 同步考生
-                            List<SyncExamStudentDto> syncExamStudentDtoList = examStudentService.listStudentByExamDetailCourseId(examDetailCourseList, paperType);
-
-                            // 没有考生就单独推送科目
-                            if (CollectionUtils.isEmpty(syncExamStudentDtoList)) {
-                                for (ExamDetailCourseDto examDetailCourseDto : examDetailCourseList) {
-                                    // 只同步当前卷型
-                                    saveSubject(schoolId, thirdRelateId, examDetailCourseDto.getCourseCode(), examDetailCourseDto.getCourseName(), examDetailCourseDto.getSequence(), paperType);
-                                }
-                            } else {
-                                long count = syncExamStudentDtoList.stream().filter(m -> StringUtils.isBlank(m.getPaperType())).count();
-                                if (count > 0) {
-                                    throw ExceptionResultEnum.ERROR.exception("部分学生未关联试卷类型,数量[" + count + "]");
-                                }
-                                // 同步考生
-                                saveStudent(schoolId, thirdRelateId, syncExamStudentDtoList);
+                            long count = syncExamStudentDtoList.stream().filter(m -> StringUtils.isBlank(m.getPaperType())).count();
+                            if (count > 0) {
+                                throw ExceptionResultEnum.ERROR.exception("部分学生未关联试卷类型,数量[" + count + "]");
                             }
-
-                            // 同步题卡
-                            // 同步题卡(只上传当前卷型)
-                            cardUpload(schoolId, thirdRelateId, examTask, paperType);
-                        } catch (Exception e) {
-                            errorMsg = e.getMessage();
-                            taskSyncStatusEnum = ExamTaskSyncStatusEnum.FAIL;
-                        } finally {
-                            examTaskSync.setErrorMsg(errorMsg);
-                            taskSyncStatusEnum = taskSyncStatusEnum == null ? ExamTaskSyncStatusEnum.FINISH : taskSyncStatusEnum;
-                            examTaskSync.setSyncStatus(taskSyncStatusEnum);
+                            // 同步考生
+                            saveStudent(schoolId, thirdRelateId, syncExamStudentDtoList);
                         }
-                        examTaskSync.setSyncEndTime(System.currentTimeMillis());
-                        examTaskSyncService.saveOrUpdate(examTaskSync);
 
-                        if (StringUtils.isNotBlank(errorMsg)) {
-                            throw ExceptionResultEnum.ERROR.exception(errorMsg);
-                        }
+                        // 同步题卡
+                        // 同步题卡(只上传当前卷型)
+                        cardUpload(schoolId, thirdRelateId, examTask, paperType);
+                    } catch (Exception e) {
+                        errorMsg = e.getMessage();
+                        taskSyncStatusEnum = ExamTaskSyncStatusEnum.FAIL;
+                    } finally {
+                        examTaskSync.setErrorMsg(errorMsg);
+                        taskSyncStatusEnum = taskSyncStatusEnum == null ? ExamTaskSyncStatusEnum.FINISH : taskSyncStatusEnum;
+                        examTaskSync.setSyncStatus(taskSyncStatusEnum);
+                    }
+                    examTaskSync.setSyncEndTime(System.currentTimeMillis());
+                    examTaskSyncService.saveOrUpdate(examTaskSync);
+
+                    if (StringUtils.isNotBlank(errorMsg)) {
+                        throw ExceptionResultEnum.ERROR.exception(errorMsg);
                     }
                 }
-            }
-            // 任务结果
-            result = TaskResultEnum.SUCCESS;
-        } catch (Exception e) {
-            result = TaskResultEnum.ERROR;
-            errorMessage = e.getMessage();
-        } finally {
-            // 同步结束
-            status = TaskStatusEnum.FINISH;
-            tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), thirdRelateId, status, result, errorMessage);
+                // 任务结果
+                result = TaskResultEnum.SUCCESS;
+            } catch (Exception e) {
+                result = TaskResultEnum.ERROR;
+                errorMessage = e.getMessage();
+            } finally {
+                // 同步结束
+                status = TaskStatusEnum.FINISH;
+                tbSyncTaskService.updateStatusAndResultById(tbSyncTask.getId(), thirdRelateId, status, result, errorMessage);
 
-            // 同步成功,发送短信
+                // 同步成功,发送短信
 //            if (ExamPrintPlanSyncStatusEnum.FINISH.equals(syncStatus)) {
 //                examPrintPlanService.sendNoticeUploadStructure(printPlanId, sysUser);
 //            }
+            }
         }
     }
 
@@ -477,6 +466,9 @@ public class DataSyncServiceImpl implements DataSyncService {
                     if (m.containsKey("type")) {
                         syncStructureData.setType(ObjectiveTypeEnum.getByType(m.getInteger("type")));
                     }
+                    if (m.containsKey("objectivePolicy")) {
+                        syncStructureData.setObjectivePolicy(m.getString("objectivePolicy"));
+                    }
                     return syncStructureData;
                 }).collect(Collectors.toList());
                 cloudMarkingTaskUtils.syncPaperStructure(schoolId, examId, subjectCode, true, null, syncObjectiveStructureDatas);
@@ -565,20 +557,15 @@ public class DataSyncServiceImpl implements DataSyncService {
     /**
      * 创建考试
      *
-     * @param schoolId         学校ID
-     * @param thirdRelateOrgId 学院ID
-     * @param orgCode          学院代码
-     * @param orgName          学院名称
+     * @param schoolId 学校ID
+     * @param orgCode  学院代码
+     * @param orgName  学院名称
      */
     @Override
-    public Integer saveSchool(Long schoolId, Integer thirdRelateOrgId, String orgCode, String orgName) {
-        if (StringUtils.isBlank(orgCode)) {
-            return null;
-        }
+    public Integer saveSchool(Long schoolId, String orgCode, String orgName) {
+        Integer thirdRelateOrgId;
         try {
-            if (Objects.isNull(thirdRelateOrgId)) {
-                thirdRelateOrgId = cloudMarkingTaskUtils.syncSchool(schoolId, orgCode, orgName);
-            }
+            thirdRelateOrgId = cloudMarkingTaskUtils.syncSchool(schoolId, orgCode, orgName);
         } catch (Exception e) {
             throw ExceptionResultEnum.ERROR.exception(e.getMessage());
         }
@@ -586,10 +573,9 @@ public class DataSyncServiceImpl implements DataSyncService {
             UpdateWrapper<SysOrg> updateWrapper = new UpdateWrapper<>();
             updateWrapper.lambda().set(SysOrg::getThirdRelateId, thirdRelateOrgId)
                     .eq(SysOrg::getSchoolId, schoolId)
-                    .eq(SysOrg::getCode, orgCode)
-                    .isNull(SysOrg::getThirdRelateId);
+                    .eq(SysOrg::getCode, orgCode);
         } catch (Exception e) {
-            log.error("保存云阅卷机构数据失败。");
+            throw ExceptionResultEnum.ERROR.exception("保存云阅卷机构数据失败");
         }
         return thirdRelateOrgId;
     }
@@ -604,13 +590,13 @@ public class DataSyncServiceImpl implements DataSyncService {
      * @param thirdRelateName 云阅卷考试名称
      * @param examTime        考试时间
      */
+    @Override
     public Long saveExam(Long schoolId, Long objectId, String orgCode, Long thirdRelateId, String thirdRelateName, String examTime) {
         try {
             if (Objects.isNull(thirdRelateId)) {
                 String code = String.valueOf(objectId);
                 thirdRelateId = cloudMarkingTaskUtils.syncExam(schoolId, code, thirdRelateName, examTime, orgCode);
             }
-
         } catch (Exception e) {
             throw ExceptionResultEnum.ERROR.exception(e.getMessage());
         }
@@ -628,7 +614,7 @@ public class DataSyncServiceImpl implements DataSyncService {
                 tSyncStmmsExamService.save(tSyncStmmsExam);
             }
         } catch (Exception e) {
-            log.error("保存云阅卷考试数据失败。页面上可刷新从云阅卷系统获取考试列表。");
+            throw ExceptionResultEnum.ERROR.exception("保存云阅卷考试数据失败");
         }
         return thirdRelateId;
     }

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

@@ -87,6 +87,9 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
     @Resource
     BasicRoleDataPermissionService basicRoleDataPermissionService;
 
+    @Resource
+    ExamCardStageService examCardStageService;
+
     @Transactional
     @Override
     public String saveExamCard(ExamCardParams examCardParams) {
@@ -491,6 +494,15 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
 
     @Override
     public void storageCard(String id, String content) {
+        ExamCardStage examCardStage = examCardStageService.getById(id);
+        if (examCardStage != null) {
+            examCardStage.setContent(content);
+        } else {
+            examCardStage = new ExamCardStage();
+            examCardStage.setId(SystemConstant.getDbUuid());
+            examCardStage.setContent(content);
+        }
+        examCardStageService.saveOrUpdate(examCardStage);
 
     }
 

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

@@ -34,7 +34,6 @@ import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
 import com.qmth.teachcloud.common.util.ExcelUtil;
-import com.qmth.teachcloud.common.util.MD5Util;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.common.util.excel.ExcelError;
@@ -495,7 +494,7 @@ public class ExamPaperStructureServiceImpl extends ServiceImpl<ExamPaperStructur
     }
 
     @Override
-    public void reunifyScore() {
+    public void subjectCalculate() {
         QueryWrapper<ExamPaperStructure> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(ExamPaperStructure::getObjectAnswerChange, true)
                 .orderByAsc(ExamPaperStructure::getSchoolId)
@@ -504,12 +503,13 @@ public class ExamPaperStructureServiceImpl extends ServiceImpl<ExamPaperStructur
         List<ExamPaperStructure> examPaperStructureList = this.list(queryWrapper);
         for (ExamPaperStructure examPaperStructure : examPaperStructureList) {
             String subjectCode = examPaperStructure.getCourseCode() + examPaperStructure.getPaperType() + examPaperStructure.getSequence();
-            // todo 调用云阅卷接口
-
+            boolean subjectCalculate = cloudMarkingTaskUtils.subjectCalculate(examPaperStructure.getSchoolId(), String.valueOf(examPaperStructure.getThirdRelateId()), subjectCode);
             // 更新状态
-            UpdateWrapper<ExamPaperStructure> updateWrapper = new UpdateWrapper<>();
-            updateWrapper.lambda().set(ExamPaperStructure::getObjectAnswerChange, false).eq(ExamPaperStructure::getId, examPaperStructure.getId());
-            this.update(updateWrapper);
+            if (subjectCalculate) {
+                UpdateWrapper<ExamPaperStructure> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.lambda().set(ExamPaperStructure::getObjectAnswerChange, false).eq(ExamPaperStructure::getId, examPaperStructure.getId());
+                this.update(updateWrapper);
+            }
         }
     }
 

+ 11 - 17
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPrintPlanServiceImpl.java

@@ -1,10 +1,7 @@
 package com.qmth.distributed.print.business.service.impl;
 
-import cn.hutool.core.date.DateUtil;
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 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;
@@ -16,17 +13,20 @@ import com.qmth.distributed.print.business.bean.result.PrintPlanBrief;
 import com.qmth.distributed.print.business.bean.result.PrintPlanResult;
 import com.qmth.distributed.print.business.bean.result.TemplatePrintInfoResult;
 import com.qmth.distributed.print.business.entity.*;
-import com.qmth.distributed.print.business.enums.*;
-import com.qmth.teachcloud.common.entity.*;
-import com.qmth.teachcloud.common.enums.MessageEnum;
+import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
+import com.qmth.distributed.print.business.enums.ExamTaskSyncStatusEnum;
+import com.qmth.distributed.print.business.enums.PrintPlanStatusEnum;
 import com.qmth.distributed.print.business.mapper.ExamPrintPlanMapper;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.execute.AsyncCloudMarkingTaskService;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.BasicAttachment;
+import com.qmth.teachcloud.common.entity.BasicSchool;
+import com.qmth.teachcloud.common.entity.SysOrg;
+import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ClassifyEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.enums.SyncModeEnum;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
 import com.qmth.teachcloud.common.util.ServletUtil;
@@ -361,7 +361,7 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
             if (StringUtils.isBlank(className)) {
                 // 查询考场下考生对应的班级
                 List<ExamStudent> examStudentList = examDetailService.listStudentByExamDetailId(record.getExamDetailId());
-                if(!CollectionUtils.isEmpty(examStudentList)) {
+                if (!CollectionUtils.isEmpty(examStudentList)) {
                     List<String> classNameList = examStudentList.stream().filter(m -> StringUtils.isNotBlank(m.getClazzName())).map(ExamStudent::getClazzName).distinct().collect(Collectors.toList());
                     if (!CollectionUtils.isEmpty(classNameList)) {
                         className = String.join(",", classNameList);
@@ -448,21 +448,15 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
         if (CollectionUtils.isEmpty(params)) {
             throw ExceptionResultEnum.ERROR.exception("请选择需要推送的数据");
         }
-
-        if (Objects.isNull(syncDataParam.getThirdRelateId())
-                && StringUtils.isBlank(syncDataParam.getThirdRelateName())) {
-            throw ExceptionResultEnum.ERROR.exception("考试ID、考试名称至少选择一个");
+        if (StringUtils.isBlank(syncDataParam.getThirdRelateName())) {
+            throw ExceptionResultEnum.ERROR.exception("考试名称必填");
         } else if (StringUtils.isNotBlank(syncDataParam.getThirdRelateName())
                 && Objects.isNull(syncDataParam.getExamTime())) {
             throw ExceptionResultEnum.ERROR.exception("考试时间必填");
         }
-
         // 校验同步数据的所属学院(机构)是否为空
         checkSyncMode(syncDataParam);
-
-        Long objectId = SystemConstant.getDbUuid();
-        String examTime = Objects.isNull(syncDataParam.getExamTime()) ? null : DateUtil.format(new Date(syncDataParam.getExamTime()), CloudMarkingTaskUtils.DATE_FORMAT);
-        asyncCloudMarkingTaskService.syncExamAndStudentAndCard(schoolId, objectId, syncDataParam.getThirdRelateId(), syncDataParam.getThirdRelateName(), examTime, JSON.toJSONString(syncDataParam));
+        asyncCloudMarkingTaskService.syncExamAndStudentAndCard(schoolId, syncDataParam);
     }
 
     @Override

+ 49 - 13
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBSyncTaskServiceImpl.java

@@ -1,16 +1,12 @@
 package com.qmth.distributed.print.business.service.impl;
 
-import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 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.bean.dto.SyncExamTaskDto;
 import com.qmth.distributed.print.business.bean.marking.GroupInfo;
-import com.qmth.distributed.print.business.bean.params.SyncDataParam;
 import com.qmth.distributed.print.business.entity.TBSyncTask;
 import com.qmth.distributed.print.business.mapper.TBSyncTaskMapper;
 import com.qmth.distributed.print.business.service.*;
@@ -27,14 +23,16 @@ import com.qmth.teachcloud.common.enums.TaskResultEnum;
 import com.qmth.teachcloud.common.enums.TaskStatusEnum;
 import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
 import com.qmth.teachcloud.common.service.SysUserService;
-import com.qmth.teachcloud.common.service.TeachcloudCommonService;
-import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.*;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * @Date: 2021/5/20.
@@ -48,9 +46,6 @@ public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncT
     @Resource
     ExamPaperStructureService examPaperStructureService;
 
-    @Resource
-    TeachcloudCommonService teachcloudCommonService;
-
     @Resource
     AsyncTeachCloudReportService asyncTeachCloudReportService;
 
@@ -63,6 +58,9 @@ public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncT
     @Resource
     CloudUserPushService cloudUserPushService;
 
+    @Resource
+    DataSyncService dataSyncService;
+
     @Resource
     SysUserService sysUserService;
 
@@ -99,6 +97,44 @@ public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncT
         return tbSyncTask;
     }
 
+    @Transactional
+    @Override
+    public TBSyncTask saveTask(Long schoolId, Long objectId, String orgCode, String thirdRelateName, String examTime, PushTypeEnum type, String remark) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        QueryWrapper<TBSyncTask> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(TBSyncTask::getSchoolId, schoolId)
+                .eq(TBSyncTask::getObjectId, objectId)
+                .eq(TBSyncTask::getType, type);
+        if (StringUtils.isNotBlank(orgCode)) {
+            queryWrapper.lambda().eq(TBSyncTask::getOrgCode, orgCode);
+        } else {
+            queryWrapper.lambda().isNull(TBSyncTask::getOrgCode);
+        }
+        TBSyncTask tbSyncTask = this.getOne(queryWrapper);
+        Long id = SystemConstant.getDbUuid();
+        if (tbSyncTask != null) {
+            if (!TaskStatusEnum.FINISH.equals(tbSyncTask.getStatus())) {
+                throw ExceptionResultEnum.ERROR.exception("有任务未结束");
+            }
+            id = tbSyncTask.getId();
+            this.removeById(id);
+        }
+        tbSyncTask = new TBSyncTask();
+        tbSyncTask.setId(id);
+        tbSyncTask.setSchoolId(schoolId);
+        tbSyncTask.setObjectId(objectId);
+        tbSyncTask.setOrgCode(orgCode);
+        tbSyncTask.setThirdRelateName(thirdRelateName);
+        tbSyncTask.setExamTime(examTime);
+        tbSyncTask.setType(type);
+        tbSyncTask.setRemark(remark);
+        tbSyncTask.setStatus(TaskStatusEnum.INIT);
+        tbSyncTask.setCreateId(sysUser.getId());
+        tbSyncTask.setCreateTime(System.currentTimeMillis());
+        this.save(tbSyncTask);
+        return tbSyncTask;
+    }
+
     @Override
     public void updateStatusAndResultById(Long id, Long thirdRelateId, TaskStatusEnum status, TaskResultEnum result, String errorMessage) {
         UpdateWrapper<TBSyncTask> tbSyncTaskUpdateWrapper = new UpdateWrapper<>();
@@ -241,9 +277,9 @@ public class TBSyncTaskServiceImpl extends ServiceImpl<TBSyncTaskMapper, TBSyncT
         }
         switch (tbSyncTask.getType()) {
             case EXAM_PUSH:
-                SyncDataParam syncDataParam = JSON.parseObject(tbSyncTask.getRemark(), SyncDataParam.class);
-                String examTime = Objects.isNull(syncDataParam.getExamTime()) ? null : DateUtil.format(new Date(syncDataParam.getExamTime()), CloudMarkingTaskUtils.DATE_FORMAT);
-                asyncCloudMarkingTaskService.syncExamAndStudentAndCard(tbSyncTask.getSchoolId(), tbSyncTask.getObjectId(), syncDataParam.getThirdRelateId(), syncDataParam.getThirdRelateName(), examTime, tbSyncTask.getRemark());
+                List<TBSyncTask> tbSyncTaskList = Arrays.asList(tbSyncTask);
+                dataSyncService.syncExamAndStudentAndCard(tbSyncTask.getOrgCode(), tbSyncTask.getThirdRelateName(), tbSyncTask.getExamTime(), tbSyncTaskList, requestUser);
+
                 break;
             case STRUCTURE_GROUP_PUSH:
                 asyncCloudMarkingTaskService.syncPaperStructureAndGroup(examPaperStructureService.getById(tbSyncTask.getObjectId()));

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

@@ -101,6 +101,8 @@ public class TSyncStmmsExamServiceImpl extends ServiceImpl<TSyncStmmsExamMapper,
                 .eq(TSyncStmmsExam::getExamName, thirdRelateName);
         if (StringUtils.isNotBlank(orgCode)) {
             queryWrapper.lambda().eq(TSyncStmmsExam::getOrgCode, orgCode);
+        } else {
+            queryWrapper.lambda().isNull(TSyncStmmsExam::getOrgCode);
         }
         return this.getOne(queryWrapper);
     }

+ 44 - 14
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCloudMarkingTaskService.java

@@ -1,30 +1,29 @@
 package com.qmth.distributed.print.business.templete.execute;
 
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.qmth.distributed.print.business.bean.dto.SyncExamTaskDto;
 import com.qmth.distributed.print.business.bean.marking.GroupInfo;
+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;
 import com.qmth.distributed.print.business.service.DataSyncService;
 import com.qmth.distributed.print.business.service.TBSyncTaskService;
-import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.entity.SysConfig;
+import com.qmth.distributed.print.business.service.TSyncStmmsExamService;
 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.SyncModeEnum;
-import com.qmth.teachcloud.common.service.CommonCacheService;
-import com.qmth.teachcloud.common.service.SysConfigService;
+import com.qmth.teachcloud.common.service.SysOrgService;
+import com.qmth.teachcloud.common.sync.CloudMarkingTaskUtils;
 import com.qmth.teachcloud.common.util.ServletUtil;
-import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 异步同步云阅卷
@@ -34,6 +33,12 @@ public class AsyncCloudMarkingTaskService {
 
     private final static Logger log = LoggerFactory.getLogger(AsyncCloudMarkingTaskService.class);
 
+    @Resource
+    private SysOrgService sysOrgService;
+
+    @Resource
+    private TSyncStmmsExamService tSyncStmmsExamService;
+
     @Lazy
     @Resource
     private DataSyncService dataSyncService;
@@ -41,17 +46,42 @@ public class AsyncCloudMarkingTaskService {
     @Resource
     private TBSyncTaskService tbSyncTaskService;
 
+    @Resource
+    private CloudMarkingTaskUtils cloudMarkingTaskUtils;
+
     /**
      * 同步考试、考生、科目、题卡
      *
-     * @param schoolId      学校ID
-     * @param objectId      同步对象ID(命题任务Id)
-     * @param thirdRelateId 云阅卷考试ID
+     * @param schoolId 学校ID
      */
-    public void syncExamAndStudentAndCard(Long schoolId, Long objectId, Long thirdRelateId, String thirdRelateName, String examTime, String remark) {
-        TBSyncTask tbSyncTask = tbSyncTaskService.saveTask(schoolId, objectId, PushTypeEnum.EXAM_PUSH, remark);
+    public void syncExamAndStudentAndCard(Long schoolId, SyncDataParam syncDataParam) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        dataSyncService.syncExamAndStudentAndCard(thirdRelateId, thirdRelateName, examTime, tbSyncTask, sysUser);
+        String thirdRelateName = syncDataParam.getThirdRelateName();
+        String examTime = Objects.isNull(syncDataParam.getExamTime()) ? null : DateUtil.format(new Date(syncDataParam.getExamTime()), CloudMarkingTaskUtils.DATE_FORMAT);
+
+        // 分学院
+        if (cloudMarkingTaskUtils.isCollegeMode(schoolId)) {
+            // 按学院code进行分组,并按学院进行循环同步
+            Map<String, List<SyncExamTaskDto>> byCollegeCodeMap = syncDataParam.getList().stream().collect(Collectors.groupingBy(SyncExamTaskDto::getCollegeCode));
+            for (Map.Entry<String, List<SyncExamTaskDto>> entry : byCollegeCodeMap.entrySet()) {
+                // 本行为,若为按学校同步,则后续方法都传null,方便校验
+                String orgCode = entry.getKey();
+                List<SyncExamTaskDto> syncExamTaskDtos = entry.getValue();
+                List<TBSyncTask> tbSyncTaskList = new ArrayList<>();
+                for (SyncExamTaskDto syncExamTaskDto : syncExamTaskDtos) {
+                    TBSyncTask tbSyncTask = tbSyncTaskService.saveTask(schoolId, Long.valueOf(syncExamTaskDto.getExamTaskId()), orgCode, thirdRelateName, examTime, PushTypeEnum.EXAM_PUSH, JSON.toJSONString(syncExamTaskDto));
+                    tbSyncTaskList.add(tbSyncTask);
+                }
+                dataSyncService.syncExamAndStudentAndCard(orgCode, thirdRelateName, examTime, tbSyncTaskList, sysUser);
+            }
+        } else {
+            List<TBSyncTask> tbSyncTaskList = new ArrayList<>();
+            for (SyncExamTaskDto syncExamTaskDto : syncDataParam.getList()) {
+                TBSyncTask tbSyncTask = tbSyncTaskService.saveTask(schoolId, Long.valueOf(syncExamTaskDto.getExamTaskId()), null, thirdRelateName, examTime, PushTypeEnum.EXAM_PUSH, JSON.toJSONString(syncExamTaskDto));
+                tbSyncTaskList.add(tbSyncTask);
+            }
+            dataSyncService.syncExamAndStudentAndCard(null, thirdRelateName, examTime, tbSyncTaskList, sysUser);
+        }
     }
 
     /**

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

@@ -237,11 +237,14 @@ CHANGE COLUMN `update_time` `update_time` BIGINT NULL DEFAULT NULL COMMENT '更
 ALTER TABLE `exam_paper_structure`
     ADD COLUMN `object_answer_change` TINYINT(1) NULL DEFAULT '0' COMMENT '客观题答案有提交,需要重新统分。(1:有变动,需要统分,0:不统分)' AFTER `structure_change`;
 
-DROP TABLE `exam_card_detail`;
+ALTER TABLE `t_b_sync_task`
+    ADD COLUMN `org_code` VARCHAR(45) NULL COMMENT '学院编码' AFTER `object_id`,
+    ADD COLUMN `third_relate_name` VARCHAR(300) NULL COMMENT '云阅卷考试名称' AFTER `third_relate_id`,
+    ADD COLUMN `exam_time` VARCHAR(20) NULL COMMENT '考试时间' AFTER `third_relate_name`;
+
 
 CREATE TABLE `exam_card_stage` (
      `id` INT NOT NULL,
      `content` MEDIUMTEXT NULL COMMENT '题卡格式内容',
-     `html_content` MEDIUMTEXT NULL COMMENT 'html内容',
      PRIMARY KEY (`id`));
 

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

@@ -4,7 +4,6 @@ import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.bean.params.SyncDataParam;
 import com.qmth.distributed.print.business.bean.result.EditResult;
 import com.qmth.distributed.print.business.enums.ExamTaskSyncStatusEnum;
-import com.qmth.distributed.print.business.enums.SyncCardTypeEnum;
 import com.qmth.distributed.print.business.service.ExamPrintPlanService;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.contant.SystemConstant;

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

@@ -11,6 +11,9 @@ public class QuestionDTO extends QuestionBaseDTO {
     // 客观题类型
     private String type;
 
+    // 客观题判分规则
+    private String objectivePolicy;
+
     public String getMainTitle() {
         return mainTitle;
     }
@@ -42,4 +45,12 @@ public class QuestionDTO extends QuestionBaseDTO {
     public void setType(String type) {
         this.type = type;
     }
+
+    public String getObjectivePolicy() {
+        return objectivePolicy;
+    }
+
+    public void setObjectivePolicy(String objectivePolicy) {
+        this.objectivePolicy = objectivePolicy;
+    }
 }

+ 2 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -108,6 +108,8 @@ public class SystemConstant {
     public static final String CLOUD_MARK_EXAM_MARK_GROUP_DELETE_API = "/api/exam/mark_group/delete";
     public static final String CLOUD_MARK_EXAM_MARKER_SAVE_API = "/api/exam/marker/save";
     public static final String CLOUD_MARK_EXAM_SUBJECT_HEADER_SAVE_API = "/api/exam/subject_header/save";
+    public static final String CLOUD_MARK_USER_CLASS_SAVE_API = "/api/user/class/save";
+    public static final String CLOUD_MARK_EXAM_SUBJECT_CALCULATE_API = "/api/exam/subject/calculate";
 
     /**
      * 教研分析api

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

@@ -11,13 +11,13 @@ import com.qmth.teachcloud.common.entity.BasicSchool;
 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.ObjectiveTypeEnum;
 import com.qmth.teachcloud.common.enums.SyncFileTypeEnum;
 import com.qmth.teachcloud.common.enums.SyncModeEnum;
 import com.qmth.teachcloud.common.enums.userPush.SpecialPrivilegeEnum;
 import com.qmth.teachcloud.common.service.CommonCacheService;
 import com.qmth.teachcloud.common.util.HttpKit;
 import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -579,6 +579,64 @@ public class CloudMarkingTaskUtils {
         }
     }
 
+    /**
+     * 用户班级绑定接口
+     *
+     * @param schoolId  学校ID
+     * @param examId    考试ID
+     * @param loginName 用户名
+     * @param className 分组序号
+     */
+    public boolean saveUserClass(Long schoolId, String examId, String loginName, List<String> className) {
+        SysConfig sysConfig = commonCacheService.addSysConfigCache(schoolId, SystemConstant.CLOUDMARK_HOST_URL);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未配置云阅卷地址"));
+        String hostUrl = sysConfig.getConfigValue();
+        String userClassSaveUrl = SystemConstant.CLOUD_MARK_USER_CLASS_SAVE_API;
+        validUrl(hostUrl, userClassSaveUrl);
+        String postUrl = hostUrl.concat(userClassSaveUrl);
+        try {
+            //参数
+            Map<String, Object> map = new HashMap<>();
+            map.put("examId", validParam(examId, null, true, "考试ID"));
+            map.put("className", validParam(className, null, true, "班级名称"));
+            map.put("account", SpecialPrivilegeEnum.MARKER.getPrefix() + validParam(loginName, null, true, "用户名"));
+
+            String result = HttpKit.sendPost(postUrl, getHeaders(schoolId, userClassSaveUrl), map, null, null, null);
+            JSONObject jsonObject = JSONObject.parseObject(result);
+            return jsonObject.containsKey("updateTime");
+        } catch (Exception e) {
+            throw ExceptionResultEnum.ERROR.exception(e.getMessage());
+        }
+    }
+
+    /**
+     * 科目客观题统分接口
+     *
+     * @param schoolId    学校ID
+     * @param examId      考试ID
+     * @param subjectCode 科目代码
+     */
+    public boolean subjectCalculate(Long schoolId, String examId, String subjectCode) {
+        SysConfig sysConfig = commonCacheService.addSysConfigCache(schoolId, SystemConstant.CLOUDMARK_HOST_URL);
+        Optional.ofNullable(sysConfig).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未配置云阅卷地址"));
+        String hostUrl = sysConfig.getConfigValue();
+        String subjectCalculateUrl = SystemConstant.CLOUD_MARK_EXAM_SUBJECT_CALCULATE_API;
+        validUrl(hostUrl, subjectCalculateUrl);
+        String postUrl = hostUrl.concat(subjectCalculateUrl);
+        try {
+            //参数
+            Map<String, Object> map = new HashMap<>();
+            map.put("examId", validParam(examId, null, true, "考试ID"));
+            map.put("subjectCode", validParam(subjectCode, null, true, "科目代码"));
+
+            String result = HttpKit.sendPost(postUrl, getHeaders(schoolId, subjectCalculateUrl), map, null, null, null);
+            JSONObject jsonObject = JSONObject.parseObject(result);
+            return jsonObject.containsKey("updateTime");
+        } catch (Exception e) {
+            throw ExceptionResultEnum.ERROR.exception(e.getMessage());
+        }
+    }
+
     /**
      * 评卷员登录
      */
@@ -704,6 +762,22 @@ public class CloudMarkingTaskUtils {
 
     }
 
+    /**
+     * 校验参数值并返回(集合型)
+     *
+     * @param value        参数值
+     * @param defaultValue 默认值
+     * @param require      是否必填(true:是,false:否)
+     * @param name         参数名称
+     */
+    private List<String> validParam(List<String> value, List<String> defaultValue, boolean require, String name) {
+        if (require && (CollectionUtils.isEmpty(value) || CollectionUtils.isEmpty(defaultValue))) {
+            throw ExceptionResultEnum.ERROR.exception((StringUtils.isBlank(name) ? "" : name) + "值必填");
+        }
+        return CollectionUtils.isEmpty(value) ? defaultValue : value;
+
+    }
+
     /**
      * 校验试卷结构值
      *
@@ -718,7 +792,8 @@ public class CloudMarkingTaskUtils {
             validParam(String.valueOf(question.getTotalScore()), null, true, "满分");
             if (objective) {
                 validParam(question.getAnswer(), null, true, "标答");
-                validParam(question.getType(), null, false, "客观题类型");
+                validParam(question.getType(), null, true, "客观题类型");
+                validParam(question.getObjectivePolicy(), "NONE", true, "客观题判分规则");
             }
         }
         return questions;

+ 3 - 3
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/ReunifyJob.java → teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/SubjectCalculateJob.java

@@ -12,8 +12,8 @@ import javax.annotation.Resource;
 /**
  * 自动统分定时任务
  */
-public class ReunifyJob extends QuartzJobBean {
-    private final static Logger log = LoggerFactory.getLogger(ReunifyJob.class);
+public class SubjectCalculateJob extends QuartzJobBean {
+    private final static Logger log = LoggerFactory.getLogger(SubjectCalculateJob.class);
 
     @Resource
     JobService jobService;
@@ -21,7 +21,7 @@ public class ReunifyJob extends QuartzJobBean {
     @Override
     protected void executeInternal(JobExecutionContext jobExecutionContext) {
         try {
-            jobService.reunifyScore();
+            jobService.subjectCalculate();
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
         }

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

@@ -36,7 +36,7 @@ public interface JobService {
     /**
      * 自动统分
      */
-    void reunifyScore();
+    void subjectCalculate();
 
     /**
      * 自动同步考生

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

@@ -74,8 +74,8 @@ public class JobServiceImpl implements JobService {
     }
 
     @Override
-    public void reunifyScore() {
-        examPaperStructureService.reunifyScore();
+    public void subjectCalculate() {
+        examPaperStructureService.subjectCalculate();
     }
 
     @Override

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

@@ -83,7 +83,7 @@ public class StartRunning implements CommandLineRunner {
         // 每天0点开始,每2小时一次
         log.info("增加自动统分定时任务 start");
         Map reunifyJobMap = new HashMap();
-        reunifyJobMap.computeIfAbsent("name", v -> ReunifyJob.class.getName());
+        reunifyJobMap.computeIfAbsent("name", v -> SubjectCalculateJob.class.getName());
         quartzService.deleteJob(JobEnum.SYNC_REUNIFY_JOB.name(), JobEnum.SYNC_REUNIFY_JOB_GROUP.name());
         quartzService.addJob(SendSmsExpireJob.class, JobEnum.SYNC_REUNIFY_JOB.name(), JobEnum.SYNC_REUNIFY_JOB_GROUP.name(), "0 0 0/2 * * ?", reunifyJobMap);
         log.info("增加自动统分定时任务 end");