Browse Source

资源文件修改

wangliang 2 years ago
parent
commit
3505d07546
20 changed files with 911 additions and 40 deletions
  1. 66 9
      themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamController.java
  2. 3 0
      themis-admin/src/main/resources/application-dev.properties
  3. 61 0
      themis-business/src/main/java/com/qmth/themis/business/bean/cloudmark/BaseParams.java
  4. 67 0
      themis-business/src/main/java/com/qmth/themis/business/bean/cloudmark/SaveExamParams.java
  5. 226 0
      themis-business/src/main/java/com/qmth/themis/business/bean/cloudmark/SaveStudentParams.java
  6. 82 0
      themis-business/src/main/java/com/qmth/themis/business/bean/cloudmark/SaveSubjectParams.java
  7. 67 0
      themis-business/src/main/java/com/qmth/themis/business/bean/cloudmark/StudentScoreParams.java
  8. 5 0
      themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java
  9. 34 1
      themis-business/src/main/java/com/qmth/themis/business/domain/YunMarkDomain.java
  10. 11 0
      themis-business/src/main/java/com/qmth/themis/business/entity/TEExam.java
  11. 3 2
      themis-business/src/main/java/com/qmth/themis/business/enums/MqTagEnum.java
  12. 3 1
      themis-business/src/main/java/com/qmth/themis/business/enums/TaskTypeEnum.java
  13. 80 0
      themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskPushMarkCloudTemplete.java
  14. 2 1
      themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskSyncMarkCloudTemplete.java
  15. 9 0
      themis-business/src/main/java/com/qmth/themis/business/templete/service/TempleteLogicService.java
  16. 77 0
      themis-business/src/main/java/com/qmth/themis/business/templete/service/impl/TempleteLogicServiceImpl.java
  17. 107 24
      themis-business/src/main/java/com/qmth/themis/business/util/CloudMarkUtil.java
  18. 3 0
      themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java
  19. 1 1
      themis-task/src/main/java/com/qmth/themis/task/start/StartRunning.java
  20. 4 1
      themis-task/src/main/resources/application-dev.properties

+ 66 - 9
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamController.java

@@ -589,21 +589,14 @@ public class TEExamController {
             tbTaskHistory.setExamId(Long.parseLong(examId));
             tbTaskHistory.setExamId(Long.parseLong(examId));
             taskHistoryService.save(tbTaskHistory);
             taskHistoryService.save(tbTaskHistory);
 
 
-            TBOrg tbOrg = cacheService.addOrgCache(examCacheBean.getOrgId());
-            if (Objects.isNull(accessKey) || Objects.equals(accessKey.trim(), "")) {
-                accessKey = tbOrg.getAccessKey();
-            }
-            if (Objects.isNull(accessSecret) || Objects.equals(accessSecret.trim(), "")) {
-                accessSecret = tbOrg.getAccessSecret();
-            }
             transMap.put("tbTaskHistory", tbTaskHistory);
             transMap.put("tbTaskHistory", tbTaskHistory);
             transMap.put(SystemConstant.CREATE_ID, tbUser.getId());
             transMap.put(SystemConstant.CREATE_ID, tbUser.getId());
             transMap.put(SystemConstant.ORG_ID, tbUser.getOrgId());
             transMap.put(SystemConstant.ORG_ID, tbUser.getOrgId());
             transMap.put(SystemConstant.EXAM_ID, Long.parseLong(examId));
             transMap.put(SystemConstant.EXAM_ID, Long.parseLong(examId));
             transMap.put("yunMarkExamId", Long.parseLong(yunMarkExamId));
             transMap.put("yunMarkExamId", Long.parseLong(yunMarkExamId));
             transMap.put(SystemConstant.EXAM_CODE, examCacheBean.getCode());
             transMap.put(SystemConstant.EXAM_CODE, examCacheBean.getCode());
-            transMap.put(SystemConstant.ACCESS_KEY_ID, accessKey);
-            transMap.put(SystemConstant.ACCESS_KEY_SECRET, accessSecret);
+            transMap.put(SystemConstant.ACCESS_KEY, accessKey);
+            transMap.put(SystemConstant.ACCESS_SECRET, accessSecret);
             //mq发送消息start
             //mq发送消息start
             MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MARK_CLOUD_SCORE_PUSH.name(),
             MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MARK_CLOUD_SCORE_PUSH.name(),
                     transMap, MqTagEnum.MARK_CLOUD_SCORE_PUSH, String.valueOf(tbTaskHistory.getId()),
                     transMap, MqTagEnum.MARK_CLOUD_SCORE_PUSH, String.valueOf(tbTaskHistory.getId()),
@@ -619,4 +612,68 @@ public class TEExamController {
         }
         }
         return ResultUtil.ok(Collections.singletonMap(SystemConstant.TASK_ID, tbTaskHistory.getId()));
         return ResultUtil.ok(Collections.singletonMap(SystemConstant.TASK_ID, tbTaskHistory.getId()));
     }
     }
+
+    @ApiOperation(value = "推送云阅卷数据")
+    @ApiResponses({@ApiResponse(code = 200, message = "成绩同步信息", response = Result.class)})
+    @RequestMapping(value = "/cloud_mark/push/data", method = RequestMethod.POST)
+    public Result pushData(@ApiParam(value = "考试ID", required = true) @RequestParam String examId) {
+        TBTaskHistory tbTaskHistory = null;
+        try {
+            ExamCacheBean examCacheBean = teExamService.getExamCacheBean(Long.parseLong(examId));
+            Optional.ofNullable(examCacheBean).orElseThrow(() -> new BusinessException(ExceptionResultEnum.EXAM_NO));
+            InvigilateMonitorStatusEnum invigilateMonitorStatusEnum = examCacheBean.getMonitorStatus();//监考状态
+            if (Objects.nonNull(invigilateMonitorStatusEnum) && !Objects
+                    .equals(invigilateMonitorStatusEnum, InvigilateMonitorStatusEnum.FINISHED)) {
+                throw new BusinessException("当前批次监考未结束,请在结束后操作");
+            }
+            ScoreStatusEnum scoreStatusEnum = examCacheBean.getScoreStatus();//算分状态
+            if (Objects.nonNull(scoreStatusEnum) && (Objects.equals(scoreStatusEnum, ScoreStatusEnum.CALCULATING) || Objects
+                    .equals(scoreStatusEnum, ScoreStatusEnum.NEED_CALCULATE))) {
+                throw new BusinessException("当前批次算分未结束,请在结束后操作");
+            }
+            QueryWrapper<TEExamCourse> teExamCourseQueryWrapper = new QueryWrapper<>();
+            teExamCourseQueryWrapper.lambda().eq(TEExamCourse::getExamId, examId);
+            List<TEExamCourse> teExamCourseList = teExamCourseService.list(teExamCourseQueryWrapper);
+            Set answerList = null;
+            if (Objects.nonNull(teExamCourseList) && teExamCourseList.size() > 0) {
+                answerList = teExamCourseList.stream().filter(s -> {
+                    if (Objects.nonNull(s.getHasAnswer()) && s.getHasAnswer().intValue() == 0) {
+                        return true;
+                    } else {
+                        return false;
+                    }
+                }).collect(Collectors.toSet());
+            }
+            if (Objects.nonNull(answerList) && answerList.size() > 0) {
+                throw new BusinessException("当前批次标答未补齐,请补齐后操作");
+            }
+
+            Map transMap = new HashMap();
+            TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
+            //往任务表里插一条数据
+            tbTaskHistory = new TBTaskHistory(TaskTypeEnum.EXAM_DATA_PUSH, TaskStatusEnum.INIT,
+                    SystemConstant.DATA_PUSH_INIT, 0d, tbUser.getId(), tbUser.getOrgId());
+            tbTaskHistory.setExamId(Long.parseLong(examId));
+            taskHistoryService.save(tbTaskHistory);
+
+            transMap.put("tbTaskHistory", tbTaskHistory);
+            transMap.put(SystemConstant.CREATE_ID, tbUser.getId());
+            transMap.put(SystemConstant.ORG_ID, tbUser.getOrgId());
+            transMap.put(SystemConstant.EXAM_ID, Long.parseLong(examId));
+            transMap.put(SystemConstant.EXAM_CODE, examCacheBean.getCode());
+            //mq发送消息start
+            MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MARK_CLOUD_DATA_PUSH.name(),
+                    transMap, MqTagEnum.MARK_CLOUD_DATA_PUSH, String.valueOf(tbTaskHistory.getId()),
+                    tbUser.getName());
+            mqDtoService.assembleSendOneWayMsg(mqDto);
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            if (e instanceof BusinessException) {
+                throw new BusinessException(e.getMessage());
+            } else {
+                throw new RuntimeException(e);
+            }
+        }
+        return ResultUtil.ok(Collections.singletonMap(SystemConstant.TASK_ID, tbTaskHistory.getId()));
+    }
 }
 }

+ 3 - 0
themis-admin/src/main/resources/application-dev.properties

@@ -159,6 +159,9 @@ spring.resources.static-locations=file:${sys.config.serverUpload},classpath:/MET
 #\u4E91\u9605\u5377\u540C\u6B65\u914D\u7F6E
 #\u4E91\u9605\u5377\u540C\u6B65\u914D\u7F6E
 yun.mark.url=http://192.168.10.224:80
 yun.mark.url=http://192.168.10.224:80
 yun.mark.studentScoreApi=/api/exam/student/score
 yun.mark.studentScoreApi=/api/exam/student/score
+yun.mark.examSaveApi=/api/exam/save
+yun.mark.subjectSaveApi=/api/exam/subject/save
+yun.mark.studentSaveApi=/api/exam/student/save
 
 
 #============================================================================
 #============================================================================
 # \u914D\u7F6Erocketmq
 # \u914D\u7F6Erocketmq

+ 61 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/cloudmark/BaseParams.java

@@ -0,0 +1,61 @@
+package com.qmth.themis.business.bean.cloudmark;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 推送基础参数
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/9/28
+ */
+public class BaseParams implements Serializable {
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    Long orgId;
+
+    @ApiModelProperty(value = "密钥key")
+    String accessKey;
+
+    @ApiModelProperty(value = "密钥secret")
+    String accessSecret;
+
+    public BaseParams() {
+
+    }
+
+    public BaseParams(Long orgId, String accessKey, String accessSecret) {
+        this.orgId = orgId;
+        this.accessKey = accessKey;
+        this.accessSecret = accessSecret;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getAccessSecret() {
+        return accessSecret;
+    }
+
+    public void setAccessSecret(String accessSecret) {
+        this.accessSecret = accessSecret;
+    }
+}

+ 67 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/cloudmark/SaveExamParams.java

@@ -0,0 +1,67 @@
+package com.qmth.themis.business.bean.cloudmark;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.themis.common.exception.BusinessException;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @Description: 推送云阅卷考试接口参数
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/9/28
+ */
+public class SaveExamParams extends BaseParams implements Serializable {
+
+    @ApiModelProperty(value = "考试批次id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    Long id;
+
+    @ApiModelProperty(value = "考试批次编码")
+    String code;
+
+    public SaveExamParams() {
+
+    }
+
+    public SaveExamParams(Long orgId, Long id, String code) {
+        super(orgId, null, null);
+        this.id = id;
+        this.code = code;
+    }
+
+    public SaveExamParams(Long orgId, Long id, String code, String accessKey, String accessSecret) {
+        super(orgId, accessKey, accessSecret);
+        this.id = id;
+        this.code = code;
+    }
+
+    /**
+     * 校验参数
+     */
+    public void vaildParams() {
+        if (Objects.isNull(id) && Objects.isNull(code)) {
+            throw new BusinessException("id或code必填一个");
+        }
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+}

+ 226 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/cloudmark/SaveStudentParams.java

@@ -0,0 +1,226 @@
+package com.qmth.themis.business.bean.cloudmark;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.themis.common.exception.BusinessException;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @Description: 推送云阅卷学生接口参数
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/9/28
+ */
+public class SaveStudentParams extends BaseParams implements Serializable {
+
+    @ApiModelProperty(value = "云阅卷考试id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examId;
+
+    @ApiModelProperty(value = "准考证号")
+    private String examNumber;
+
+    @ApiModelProperty(value = "学号")
+    private String studentCode;
+
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @ApiModelProperty(value = "学院")
+    private String college;
+
+    @ApiModelProperty(value = "班级名称")
+    private String className;
+
+    @ApiModelProperty(value = "教师姓名")
+    private String teacher;
+
+    @ApiModelProperty(value = "科目代码")
+    private String subjectCode;
+
+    @ApiModelProperty(value = "科目名称")
+    private String subjectName;
+
+    @ApiModelProperty(value = "签到表编号")
+    private String packageCode;
+
+    @ApiModelProperty(value = "试卷类型")
+    private String paperType;
+
+    @ApiModelProperty(value = "考点")
+    private String examSite;
+
+    @ApiModelProperty(value = "考场")
+    private String examRoom;
+
+    public SaveStudentParams() {
+
+    }
+
+    public SaveStudentParams(Long orgId, Long examId, String examNumber, String studentCode, String name, String college,
+                             String className, String teacher, String subjectCode, String subjectName) {
+        super(orgId, null, null);
+        this.examId = examId;
+        this.examNumber = examNumber;
+        this.studentCode = studentCode;
+        this.name = name;
+        this.college = college;
+        this.className = className;
+        this.teacher = teacher;
+        this.subjectCode = subjectCode;
+        this.subjectName = subjectName;
+    }
+
+    public SaveStudentParams(Long orgId, Long examId, String examNumber, String studentCode, String name, String college,
+                             String className, String teacher, String subjectCode, String subjectName,
+                             String accessKey, String accessSecret) {
+        super(orgId, accessKey, accessSecret);
+        this.examId = examId;
+        this.examNumber = examNumber;
+        this.studentCode = studentCode;
+        this.name = name;
+        this.college = college;
+        this.className = className;
+        this.teacher = teacher;
+        this.subjectCode = subjectCode;
+        this.subjectName = subjectName;
+    }
+
+    public void vaildParams() {
+        if (Objects.isNull(examId)) {
+            throw new BusinessException("云阅卷考试id不能为空");
+        }
+        if (Objects.isNull(examNumber)) {
+            throw new BusinessException("准考证号不能为空");
+        }
+        if (Objects.isNull(studentCode)) {
+            throw new BusinessException("学号不能为空");
+        }
+        if (Objects.isNull(name)) {
+            throw new BusinessException("姓名不能为空");
+        }
+        if (Objects.isNull(college)) {
+            throw new BusinessException("学院不能为空");
+        }
+        if (Objects.isNull(className)) {
+            throw new BusinessException("班级名称不能为空");
+        }
+        if (Objects.isNull(teacher)) {
+            throw new BusinessException("教师不能为空");
+        }
+        if (Objects.isNull(subjectCode)) {
+            throw new BusinessException("科目编码不能为空");
+        }
+        if (Objects.isNull(subjectName)) {
+            throw new BusinessException("科目名称不能为空");
+        }
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCollege() {
+        return college;
+    }
+
+    public void setCollege(String college) {
+        this.college = college;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getTeacher() {
+        return teacher;
+    }
+
+    public void setTeacher(String teacher) {
+        this.teacher = teacher;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getPackageCode() {
+        return packageCode;
+    }
+
+    public void setPackageCode(String packageCode) {
+        this.packageCode = packageCode;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getExamSite() {
+        return examSite;
+    }
+
+    public void setExamSite(String examSite) {
+        this.examSite = examSite;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+}

+ 82 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/cloudmark/SaveSubjectParams.java

@@ -0,0 +1,82 @@
+package com.qmth.themis.business.bean.cloudmark;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.themis.common.exception.BusinessException;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @Description: 推送云阅卷科目接口参数
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/9/28
+ */
+public class SaveSubjectParams extends BaseParams implements Serializable {
+
+    @ApiModelProperty(value = "云阅卷考试id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    Long yunExamId;
+
+    @ApiModelProperty(value = "科目编码")
+    String courseCode;
+
+    @ApiModelProperty(value = "科目名称")
+    String courseName;
+
+    public SaveSubjectParams(Long orgId, Long yunExamId, String courseCode, String courseName) {
+        super(orgId, null, null);
+        this.yunExamId = yunExamId;
+        this.courseCode = courseCode;
+        this.courseName = courseName;
+    }
+
+    public SaveSubjectParams(Long orgId, Long yunExamId, String courseCode, String courseName, String accessKey, String accessSecret) {
+        super(orgId, accessKey, accessSecret);
+        this.yunExamId = yunExamId;
+        this.courseCode = courseCode;
+        this.courseName = courseName;
+    }
+
+    /**
+     * 校验参数
+     */
+    public void vaildParams() {
+        if (Objects.isNull(yunExamId)) {
+            throw new BusinessException("云阅卷考试id不能为空");
+        }
+        if (Objects.isNull(courseCode)) {
+            throw new BusinessException("科目编码不能为空");
+        }
+        if (Objects.isNull(courseName)) {
+            throw new BusinessException("科目名称不能为空");
+        }
+    }
+
+    public Long getYunExamId() {
+        return yunExamId;
+    }
+
+    public void setYunExamId(Long yunExamId) {
+        this.yunExamId = yunExamId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+}

+ 67 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/cloudmark/StudentScoreParams.java

@@ -0,0 +1,67 @@
+package com.qmth.themis.business.bean.cloudmark;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.themis.common.exception.BusinessException;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @Description: 获取云阅卷学生成绩接口 参数
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/9/28
+ */
+public class StudentScoreParams extends BaseParams implements Serializable {
+
+    @ApiModelProperty(value = "考试批次id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    Long examId;
+
+    @ApiModelProperty(value = "考试批次编码")
+    String examCode;
+
+    public StudentScoreParams() {
+
+    }
+
+    public StudentScoreParams(Long orgId, Long examId, String examCode) {
+        super(orgId, null, null);
+        this.examId = examId;
+        this.examCode = examCode;
+    }
+
+    public StudentScoreParams(Long orgId, Long examId, String examCode, String accessKey, String accessSecret) {
+        super(orgId, accessKey, accessSecret);
+        this.examId = examId;
+        this.examCode = examCode;
+    }
+
+    /**
+     * 校验参数
+     */
+    public void vaildParams() {
+        if (Objects.isNull(examId) && Objects.isNull(examCode)) {
+            throw new BusinessException("examId或examCode必填一个");
+        }
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getExamCode() {
+        return examCode;
+    }
+
+    public void setExamCode(String examCode) {
+        this.examCode = examCode;
+    }
+}

+ 5 - 0
themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java

@@ -65,6 +65,9 @@ public class SystemConstant {
     public static final String END_POINT = "endpoint";
     public static final String END_POINT = "endpoint";
 
 
     public static final String ACCESS_KEY_ID = "accessKeyId";
     public static final String ACCESS_KEY_ID = "accessKeyId";
+    public static final String ACCESS_KEY = "accessKey";
+
+    public static final String ACCESS_SECRET = "accessSecret";
 
 
     public static final String ACCESS_KEY_SECRET = "accessKeySecret";
     public static final String ACCESS_KEY_SECRET = "accessKeySecret";
 
 
@@ -165,6 +168,8 @@ public class SystemConstant {
 
 
     public static final String SCORE_PUSH_INIT = "准备同步云阅卷成绩数据";
     public static final String SCORE_PUSH_INIT = "准备同步云阅卷成绩数据";
 
 
+    public static final String DATA_PUSH_INIT = "准备推送云阅卷数据";
+
     public static final String RECORD_ID = "recordId";
     public static final String RECORD_ID = "recordId";
 
 
     public static final String STUDENT_ID = "studentId";
     public static final String STUDENT_ID = "studentId";

+ 34 - 1
themis-business/src/main/java/com/qmth/themis/business/domain/YunMarkDomain.java

@@ -15,13 +15,46 @@ public class YunMarkDomain implements Serializable {
 
 
     private String studentScoreApi;
     private String studentScoreApi;
 
 
+    private String examSaveApi;
+
+    private String subjectSaveApi;
+
+    private String studentSaveApi;
+
     public YunMarkDomain() {
     public YunMarkDomain() {
 
 
     }
     }
 
 
-    public YunMarkDomain(String url, String studentScoreApi) {
+    public YunMarkDomain(String url, String studentScoreApi, String examSaveApi, String subjectSaveApi, String studentSaveApi) {
         this.url = url;
         this.url = url;
         this.studentScoreApi = studentScoreApi;
         this.studentScoreApi = studentScoreApi;
+        this.examSaveApi = examSaveApi;
+        this.subjectSaveApi = subjectSaveApi;
+        this.studentScoreApi = studentScoreApi;
+    }
+
+    public String getExamSaveApi() {
+        return examSaveApi;
+    }
+
+    public void setExamSaveApi(String examSaveApi) {
+        this.examSaveApi = examSaveApi;
+    }
+
+    public String getSubjectSaveApi() {
+        return subjectSaveApi;
+    }
+
+    public void setSubjectSaveApi(String subjectSaveApi) {
+        this.subjectSaveApi = subjectSaveApi;
+    }
+
+    public String getStudentSaveApi() {
+        return studentSaveApi;
+    }
+
+    public void setStudentSaveApi(String studentSaveApi) {
+        this.studentSaveApi = studentSaveApi;
     }
     }
 
 
     public String getUrl() {
     public String getUrl() {

+ 11 - 0
themis-business/src/main/java/com/qmth/themis/business/entity/TEExam.java

@@ -203,6 +203,9 @@ public class TEExam extends BaseEntity {
     @ApiModelProperty(value = "扫描时间")
     @ApiModelProperty(value = "扫描时间")
     private Long scanTime;
     private Long scanTime;
 
 
+    @ApiModelProperty(value = "第三方考试id")
+    private String thirdExamId;
+
     public TEExam() {
     public TEExam() {
 
 
     }
     }
@@ -283,6 +286,14 @@ public class TEExam extends BaseEntity {
         this.monitorStatus = teExamDto.getMonitorStatus();
         this.monitorStatus = teExamDto.getMonitorStatus();
     }
     }
 
 
+    public String getThirdExamId() {
+        return thirdExamId;
+    }
+
+    public void setThirdExamId(String thirdExamId) {
+        this.thirdExamId = thirdExamId;
+    }
+
     public Long getScanTime() {
     public Long getScanTime() {
         return scanTime;
         return scanTime;
     }
     }

+ 3 - 2
themis-business/src/main/java/com/qmth/themis/business/enums/MqTagEnum.java

@@ -56,9 +56,10 @@ public enum MqTagEnum {
     OE_WEBSOCKET_MOBILE_MONITOR_STATUS("通知客户端移动端当前监控状态标签", "通知客户端移动端当前监控状态", "broadcast", 48),
     OE_WEBSOCKET_MOBILE_MONITOR_STATUS("通知客户端移动端当前监控状态标签", "通知客户端移动端当前监控状态", "broadcast", 48),
     TENCENT_VIDEO("腾讯云视频回调标签", "腾讯云视频回调", "delay", 49),
     TENCENT_VIDEO("腾讯云视频回调标签", "腾讯云视频回调", "delay", 49),
     MARK_CLOUD_SCORE_PUSH("同步云阅卷成绩任务标签", "同步云阅卷成绩任务", "normal", 50),
     MARK_CLOUD_SCORE_PUSH("同步云阅卷成绩任务标签", "同步云阅卷成绩任务", "normal", 50),
-    ONLINE_LOG("考生上下线标签", "考生上下线", "normal", 51);
+    ONLINE_LOG("考生上下线标签", "考生上下线", "normal", 51),
 //    EXAM_AUDIO("考试语音任务标签", "考试语音任务", "normal", 52),
 //    EXAM_AUDIO("考试语音任务标签", "考试语音任务", "normal", 52),
-//    EXAM_AUDIO_MOBILE("考试语音移动端任务标签", "考试语音移动端任务", "normal", 53);
+//    EXAM_AUDIO_MOBILE("考试语音移动端任务标签", "考试语音移动端任务", "normal", 53)
+    MARK_CLOUD_DATA_PUSH("推送云阅卷数据标签", "推送云阅卷数据任务", "normal", 52);
 
 
     private MqTagEnum(String desc, String code, String type, int id) {
     private MqTagEnum(String desc, String code, String type, int id) {
         this.desc = desc;
         this.desc = desc;

+ 3 - 1
themis-business/src/main/java/com/qmth/themis/business/enums/TaskTypeEnum.java

@@ -25,7 +25,9 @@ public enum TaskTypeEnum {
 
 
     EXPORT_MARK_RESULT_STANDARD("导出成绩标准版"),
     EXPORT_MARK_RESULT_STANDARD("导出成绩标准版"),
 
 
-    SCORE_PUSH("云阅卷成绩同步");
+    SCORE_PUSH("云阅卷成绩同步"),
+
+    EXAM_DATA_PUSH("云阅卷数据推送");
 
 
     private String code;
     private String code;
 
 

+ 80 - 0
themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskPushMarkCloudTemplete.java

@@ -0,0 +1,80 @@
+package com.qmth.themis.business.templete.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.qmth.themis.business.constant.SystemConstant;
+import com.qmth.themis.business.enums.TaskStatusEnum;
+import com.qmth.themis.business.templete.TaskSyncCommon;
+import com.qmth.themis.business.templete.TaskSyncTemplete;
+import com.qmth.themis.business.templete.service.TempleteLogicService;
+import com.qmth.themis.common.contanst.Constants;
+import com.qmth.themis.common.util.Result;
+import com.qmth.themis.common.util.ResultUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Map;
+import java.util.StringJoiner;
+
+/**
+ * @Description: 同步云阅卷成绩任务
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/10/20
+ */
+@Service
+public class TaskPushMarkCloudTemplete implements TaskSyncTemplete {
+
+    private final static Logger log = LoggerFactory.getLogger(TaskPushMarkCloudTemplete.class);
+
+    @Resource
+    TempleteLogicService templeteLogicService;
+
+    /**
+     * 同步模版
+     *
+     * @param map
+     * @return
+     */
+    @Override
+    public Result syncTask(Map<String, Object> map) throws IOException {
+        log.info("开始推送云阅卷数据");
+        long start = System.currentTimeMillis();
+        TaskSyncCommon taskSyncCommon = new TaskSyncCommon(map);
+        taskSyncCommon.init();
+        taskSyncCommon.setTxtList(new ArrayList());
+        StringJoiner stringJoiner = null;
+        try {
+            taskSyncCommon.getTxtList().add(DateUtil.format(new Date(), Constants.DEFAULT_DATE_PATTERN) + "->开始准备推送云阅卷数据");
+            boolean oss = (boolean) taskSyncCommon.getOssEnv().get(SystemConstant.OSS);
+            stringJoiner = new StringJoiner("");
+            if (!oss) {
+                stringJoiner.add(SystemConstant.FILES_DIR).add(File.separator);
+            }
+            LocalDateTime nowTime = LocalDateTime.now();
+            stringJoiner.add(String.valueOf(nowTime.getYear())).add(File.separator)
+                    .add(String.format("%02d", nowTime.getMonthValue())).add(File.separator)
+                    .add(String.format("%02d", nowTime.getDayOfMonth()));
+            taskSyncCommon.getTbTaskHistory().setStatus(TaskStatusEnum.RUNNING);
+            taskSyncCommon.getTbTaskHistory().setSummary("正在推送数据");
+            taskSyncCommon.getTxtList().add(DateUtil.format(new Date(), Constants.DEFAULT_DATE_PATTERN) + "->" + taskSyncCommon.getTbTaskHistory().getSummary());
+            map = templeteLogicService.execPushCloudMarkDataLogic(map);
+            long end = System.currentTimeMillis();
+            log.info("推送云阅卷数据结束,============耗时============:{}秒", (end - start) / 1000);
+        } catch (Exception e) {
+            log.error("推送云阅卷数据报错", e);
+            taskSyncCommon.exception(e, taskSyncCommon.getTxtList());
+        } finally {
+            //这里写入txt文件
+            taskSyncCommon.writeSyncResultTxt(stringJoiner.toString(), taskSyncCommon.getTxtList().toString());
+        }
+        return ResultUtil.ok(true);
+    }
+}

+ 2 - 1
themis-business/src/main/java/com/qmth/themis/business/templete/impl/TaskSyncMarkCloudTemplete.java

@@ -2,6 +2,7 @@ package com.qmth.themis.business.templete.impl;
 
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qmth.themis.business.bean.cloudmark.StudentScoreParams;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dao.TSyncExamStudentScoreMapper;
 import com.qmth.themis.business.dao.TSyncExamStudentScoreMapper;
 import com.qmth.themis.business.entity.TSyncExamStudentScore;
 import com.qmth.themis.business.entity.TSyncExamStudentScore;
@@ -87,7 +88,7 @@ public class TaskSyncMarkCloudTemplete implements TaskSyncTemplete {
             taskSyncCommon.getTbTaskHistory().setStatus(TaskStatusEnum.RUNNING);
             taskSyncCommon.getTbTaskHistory().setStatus(TaskStatusEnum.RUNNING);
             taskSyncCommon.getTbTaskHistory().setSummary("正在同步数据");
             taskSyncCommon.getTbTaskHistory().setSummary("正在同步数据");
             taskSyncCommon.getTxtList().add(DateUtil.format(new Date(), Constants.DEFAULT_DATE_PATTERN) + "->" + taskSyncCommon.getTbTaskHistory().getSummary());
             taskSyncCommon.getTxtList().add(DateUtil.format(new Date(), Constants.DEFAULT_DATE_PATTERN) + "->" + taskSyncCommon.getTbTaskHistory().getSummary());
-            List<Map> finalList = cloudMarkUtil.callStudentScore(orgId, yunMarkExamId, examCode, String.valueOf(map.get(SystemConstant.ACCESS_KEY_ID)), String.valueOf(map.get(SystemConstant.ACCESS_KEY_SECRET)));
+            List<Map> finalList = cloudMarkUtil.callStudentScoreApi(new StudentScoreParams(orgId, yunMarkExamId, examCode));
             if (!CollectionUtils.isEmpty(finalList)) {
             if (!CollectionUtils.isEmpty(finalList)) {
                 List<TSyncExamStudentScore> tSyncExamStudentScoreList = new ArrayList<>(finalList.size());
                 List<TSyncExamStudentScore> tSyncExamStudentScoreList = new ArrayList<>(finalList.size());
                 for (Map student : finalList) {
                 for (Map student : finalList) {

+ 9 - 0
themis-business/src/main/java/com/qmth/themis/business/templete/service/TempleteLogicService.java

@@ -2,6 +2,7 @@ package com.qmth.themis.business.templete.service;
 
 
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.LinkedMultiValueMap;
 
 
+import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.io.UnsupportedEncodingException;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
@@ -64,4 +65,12 @@ public interface TempleteLogicService {
      * @return
      * @return
      */
      */
     public Map<String, Object> execExportExamStudentLogic(Map<String, Object> map);
     public Map<String, Object> execExportExamStudentLogic(Map<String, Object> map);
+
+    /**
+     * 推送云阅卷数据逻辑
+     *
+     * @param map
+     * @return
+     */
+    public Map<String, Object> execPushCloudMarkDataLogic(Map<String, Object> map) throws IOException;
 }
 }

+ 77 - 0
themis-business/src/main/java/com/qmth/themis/business/templete/service/impl/TempleteLogicServiceImpl.java

@@ -3,6 +3,10 @@ package com.qmth.themis.business.templete.service.impl;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.google.gson.Gson;
 import com.google.gson.Gson;
+import com.qmth.themis.business.bean.cloudmark.SaveExamParams;
+import com.qmth.themis.business.bean.cloudmark.SaveStudentParams;
+import com.qmth.themis.business.bean.cloudmark.SaveSubjectParams;
+import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dao.TEExamCourseMapper;
 import com.qmth.themis.business.dao.TEExamCourseMapper;
@@ -14,7 +18,9 @@ import com.qmth.themis.business.enums.RoleEnum;
 import com.qmth.themis.business.enums.TaskStatusEnum;
 import com.qmth.themis.business.enums.TaskStatusEnum;
 import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.templete.service.TempleteLogicService;
 import com.qmth.themis.business.templete.service.TempleteLogicService;
+import com.qmth.themis.business.util.CloudMarkUtil;
 import com.qmth.themis.common.contanst.Constants;
 import com.qmth.themis.common.contanst.Constants;
+import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.Base64Util;
 import com.qmth.themis.common.util.Base64Util;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -23,6 +29,7 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.LinkedMultiValueMap;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.*;
@@ -63,6 +70,12 @@ public class TempleteLogicServiceImpl implements TempleteLogicService {
     @Resource
     @Resource
     TBExamInvigilateUserTempService tbExamInvigilateUserTempService;
     TBExamInvigilateUserTempService tbExamInvigilateUserTempService;
 
 
+    @Resource
+    CloudMarkUtil cloudMarkUtil;
+
+    @Resource
+    TEExamService teExamService;
+
     /**
     /**
      * 考生导入逻辑
      * 考生导入逻辑
      *
      *
@@ -350,6 +363,70 @@ public class TempleteLogicServiceImpl implements TempleteLogicService {
         return commonExport(map);
         return commonExport(map);
     }
     }
 
 
+    /**
+     * 推送云阅卷数据逻辑
+     *
+     * @param map
+     * @return
+     */
+    @Override
+    @Transactional
+    public Map<String, Object> execPushCloudMarkDataLogic(Map<String, Object> map) throws IOException {
+        Long examId = (Long) map.get(SystemConstant.EXAM_ID);
+        if (Objects.isNull(examId)) {
+            throw new RuntimeException("考试id为空");
+        }
+        Long orgId = (Long) map.get(SystemConstant.ORG_ID);
+        if (Objects.isNull(orgId)) {
+            throw new RuntimeException("机构id为空");
+        }
+        String examCode = (String) map.get(SystemConstant.EXAM_CODE);
+        if (Objects.isNull(examCode)) {
+            throw new RuntimeException("考试编码为空");
+        }
+        Long createId = (Long) map.get(SystemConstant.CREATE_ID);
+        createId = Objects.isNull(createId) ? -1L : createId;
+
+        //先推送考试
+        ExamCacheBean examCacheBean = teExamService.getExamCacheBean(examId);
+        Optional.ofNullable(examCacheBean).orElseThrow(() -> new BusinessException(ExceptionResultEnum.EXAM_NO));
+
+        int line = 0;
+        SaveExamParams saveExamParams = new SaveExamParams(orgId, examId, examCode);
+        Long cloudMarkExamId = cloudMarkUtil.callExamSaveApi(saveExamParams);
+        if (Objects.nonNull(cloudMarkExamId)) {
+            line++;
+            TEExam teExam = teExamService.cacheConvert(examCacheBean);
+            teExam.setUpdateTime(System.currentTimeMillis());
+            teExam.setThirdExamId(String.valueOf(cloudMarkExamId));
+            teExamService.updateById(teExam);
+
+            //推送科目
+            QueryWrapper<TEExamCourse> teExamCourseQueryWrapper = new QueryWrapper<>();
+            teExamCourseQueryWrapper.lambda().eq(TEExamCourse::getExamId, examId);
+            List<TEExamCourse> teExamCourseList = teExamCourseService.list(teExamCourseQueryWrapper);
+            if (!CollectionUtils.isEmpty(teExamCourseList)) {
+                for (TEExamCourse t : teExamCourseList) {
+                    line++;
+                    cloudMarkUtil.callSubjectSaveApi(new SaveSubjectParams(orgId, cloudMarkExamId, t.getCourseCode(), t.getCourseName()));
+                }
+            }
+
+            //推送考生
+            QueryWrapper<TEExamStudent> teExamStudentQueryWrapper = new QueryWrapper<>();
+            teExamStudentQueryWrapper.lambda().eq(TEExamStudent::getExamId, examId);
+            List<TEExamStudent> teExamStudentList = teExamStudentService.list(teExamStudentQueryWrapper);
+            if (!CollectionUtils.isEmpty(teExamStudentList)) {
+                for (TEExamStudent t : teExamStudentList) {
+                    line++;
+//                    cloudMarkUtil.callStudentSaveApi(new SaveStudentParams(orgId, cloudMarkExamId, t.getCourseCode(), t.getCourseName()));
+                }
+            }
+        }
+        map.put("line", line);
+        return map;
+    }
+
     /**
     /**
      * 查询监考帐号是否存在
      * 查询监考帐号是否存在
      *
      *

+ 107 - 24
themis-business/src/main/java/com/qmth/themis/business/util/CloudMarkUtil.java

@@ -1,6 +1,8 @@
 package com.qmth.themis.business.util;
 package com.qmth.themis.business.util;
 
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
+import com.qmth.themis.business.bean.cloudmark.*;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.domain.YunMarkDomain;
 import com.qmth.themis.business.domain.YunMarkDomain;
 import com.qmth.themis.business.entity.TBOrg;
 import com.qmth.themis.business.entity.TBOrg;
@@ -35,7 +37,11 @@ public class CloudMarkUtil {
 
 
     @Bean
     @Bean
     public YunMarkDomain yunMarkEnv(YunMarkDomain yunMarkDomain) {
     public YunMarkDomain yunMarkEnv(YunMarkDomain yunMarkDomain) {
-        this.yunMarkDomain = new YunMarkDomain(yunMarkDomain.getUrl(), yunMarkDomain.getStudentScoreApi());
+        this.yunMarkDomain = new YunMarkDomain(yunMarkDomain.getUrl(),
+                yunMarkDomain.getStudentScoreApi(),
+                yunMarkDomain.getExamSaveApi(),
+                yunMarkDomain.getSubjectSaveApi(),
+                yunMarkDomain.getStudentSaveApi());
         return this.yunMarkDomain;
         return this.yunMarkDomain;
     }
     }
 
 
@@ -43,34 +49,35 @@ public class CloudMarkUtil {
         return yunMarkDomain;
         return yunMarkDomain;
     }
     }
 
 
+    /**
+     * 获取accessKey和accessSecret
+     *
+     * @param baseParams
+     * @return
+     */
+    public BaseParams getAccessKeyAndAccessSecret(BaseParams baseParams) {
+        if (Objects.isNull(baseParams.getAccessKey()) && Objects.isNull(baseParams.getAccessSecret())) {
+            TBOrg tbOrg = cacheService.addOrgCache(baseParams.getOrgId());
+            Optional.ofNullable(tbOrg).orElseThrow(() -> new BusinessException(ExceptionResultEnum.ORG_NO));
+            baseParams.setAccessKey(tbOrg.getAccessKey());
+            baseParams.setAccessSecret(tbOrg.getAccessSecret());
+        }
+        return baseParams;
+    }
+
     /**
     /**
      * 考试成绩考生查询接口
      * 考试成绩考生查询接口
      *
      *
-     * @param orgId
-     * @param examId
-     * @param examCode
-     * @param accessKey
-     * @param accessSecret
+     * @param studentScoreParams
      * @return
      * @return
      * @throws IOException
      * @throws IOException
      */
      */
-    public List<Map> callStudentScore(Long orgId, Long examId, String examCode, String accessKey, String accessSecret) throws IOException {
-        String url = yunMarkDomain.getUrl() + yunMarkDomain.getStudentScoreApi();
-        Map<String, Object> params = new HashMap<>();
-        if (Objects.nonNull(examId)) {
-            params.put("examId", examId);
-        } else if (Objects.nonNull(examCode)) {
-            params.put("examCode", examCode);
-        }
-        TBOrg tbOrg = cacheService.addOrgCache(orgId);
-        Optional.ofNullable(tbOrg).orElseThrow(() -> new BusinessException(ExceptionResultEnum.ORG_NO));
+    public List<Map> callStudentScoreApi(StudentScoreParams studentScoreParams) throws IOException {
+        studentScoreParams.vaildParams();
+        this.getAccessKeyAndAccessSecret(studentScoreParams);
+        Map<String, Object> params = JSON.parseObject(JSON.toJSONString(studentScoreParams), Map.class);
 
 
-        if (Objects.isNull(accessKey) || Objects.equals("", accessKey.trim())) {
-            accessKey = tbOrg.getAccessKey();
-        }
-        if (Objects.isNull(accessSecret) || Objects.equals("", accessSecret.trim())) {
-            accessSecret = tbOrg.getAccessSecret();
-        }
+        String url = yunMarkDomain.getUrl() + yunMarkDomain.getStudentScoreApi();
         int pageNumber = 1;
         int pageNumber = 1;
         int pageSize = 100;
         int pageSize = 100;
         List<Map> students = null;
         List<Map> students = null;
@@ -78,12 +85,13 @@ public class CloudMarkUtil {
             params.put("pageNumber", pageNumber);
             params.put("pageNumber", pageNumber);
             params.put("pageSize", pageSize);
             params.put("pageSize", pageSize);
             Long timestamp = System.currentTimeMillis();
             Long timestamp = System.currentTimeMillis();
-            String accessToken = SignatureInfo.build(SignatureType.SECRET, SystemConstant.METHOD, yunMarkDomain.getStudentScoreApi(), timestamp, accessKey, accessSecret);
+            String accessToken = SignatureInfo.build(SignatureType.SECRET, SystemConstant.METHOD, yunMarkDomain.getStudentScoreApi(), timestamp, studentScoreParams.getAccessKey(), studentScoreParams.getAccessSecret());
             String result = HttpUtil.post(url, params, accessToken, timestamp);
             String result = HttpUtil.post(url, params, accessToken, timestamp);
             result = StringEscapeUtils.unescapeHtml4(result);
             result = StringEscapeUtils.unescapeHtml4(result);
             if (Objects.nonNull(result)) {
             if (Objects.nonNull(result)) {
                 if (result.contains("HTTP")) {
                 if (result.contains("HTTP")) {
-                    throw new BusinessException("云阅卷鉴权失败");
+                    log.error("callStudentScoreApi result:{}", result);
+                    throw new BusinessException("云阅卷拉取学生成绩失败");
                 }
                 }
                 List<Map> tempList = JSONObject.parseArray(JSONObject.toJSON(result).toString(), Map.class);
                 List<Map> tempList = JSONObject.parseArray(JSONObject.toJSON(result).toString(), Map.class);
                 if (Objects.nonNull(tempList) && tempList.size() > 0) {
                 if (Objects.nonNull(tempList) && tempList.size() > 0) {
@@ -101,4 +109,79 @@ public class CloudMarkUtil {
         }
         }
         return students;
         return students;
     }
     }
+
+    /**
+     * 推送云阅卷考试
+     *
+     * @param saveExamParams
+     * @return
+     * @throws IOException
+     */
+    public Long callExamSaveApi(SaveExamParams saveExamParams) throws IOException {
+        saveExamParams.vaildParams();
+        this.getAccessKeyAndAccessSecret(saveExamParams);
+        Map<String, Object> params = JSON.parseObject(JSON.toJSONString(saveExamParams), Map.class);
+
+        String url = yunMarkDomain.getUrl() + yunMarkDomain.getExamSaveApi();
+        long timestamp = System.currentTimeMillis();
+        String accessToken = SignatureInfo.build(SignatureType.SECRET, SystemConstant.METHOD, yunMarkDomain.getExamSaveApi(), timestamp, saveExamParams.getAccessKey(), saveExamParams.getAccessSecret());
+        String result = HttpUtil.post(url, params, accessToken, timestamp);
+        result = StringEscapeUtils.unescapeHtml4(result);
+        if (result.contains("HTTP")) {
+            log.error("callExamSaveApi result:{}", result);
+            throw new BusinessException("云阅卷推送考试信息失败");
+        }
+        Map<String, Object> resultMap = (Map<String, Object>) JSON.parse(result);
+        return Long.parseLong(String.valueOf(resultMap.get("id")));
+    }
+
+    /**
+     * 推送云阅卷科目
+     *
+     * @param saveSubjectParams
+     * @return
+     * @throws IOException
+     */
+    public String callSubjectSaveApi(SaveSubjectParams saveSubjectParams) throws IOException {
+        saveSubjectParams.vaildParams();
+        this.getAccessKeyAndAccessSecret(saveSubjectParams);
+        Map<String, Object> params = JSON.parseObject(JSON.toJSONString(saveSubjectParams), Map.class);
+
+        String url = yunMarkDomain.getUrl() + yunMarkDomain.getSubjectSaveApi();
+        long timestamp = System.currentTimeMillis();
+        String accessToken = SignatureInfo.build(SignatureType.SECRET, SystemConstant.METHOD, yunMarkDomain.getSubjectSaveApi(), timestamp, saveSubjectParams.getAccessKey(), saveSubjectParams.getAccessSecret());
+        String result = HttpUtil.post(url, params, accessToken, timestamp);
+        result = StringEscapeUtils.unescapeHtml4(result);
+        if (result.contains("HTTP")) {
+            log.error("callSubjectSaveApi result:{}", result);
+            throw new BusinessException("云阅卷推送考试科目信息失败");
+        }
+        Map<String, Object> resultMap = (Map<String, Object>) JSON.parse(result);
+        return String.valueOf(resultMap.get("updateTime"));
+    }
+
+    /**
+     * 推送云阅卷考生
+     *
+     * @param saveStudentParams
+     * @return
+     * @throws IOException
+     */
+    public String callStudentSaveApi(SaveStudentParams saveStudentParams) throws IOException {
+        saveStudentParams.vaildParams();
+        this.getAccessKeyAndAccessSecret(saveStudentParams);
+        Map<String, Object> params = JSON.parseObject(JSON.toJSONString(saveStudentParams), Map.class);
+
+        String url = yunMarkDomain.getUrl() + yunMarkDomain.getStudentSaveApi();
+        long timestamp = System.currentTimeMillis();
+        String accessToken = SignatureInfo.build(SignatureType.SECRET, SystemConstant.METHOD, yunMarkDomain.getStudentSaveApi(), timestamp, saveStudentParams.getAccessKey(), saveStudentParams.getAccessSecret());
+        String result = HttpUtil.post(url, params, accessToken, timestamp);
+        result = StringEscapeUtils.unescapeHtml4(result);
+        if (result.contains("HTTP")) {
+            log.error("callStudentSaveApi result:{}", result);
+            throw new BusinessException("云阅卷推送考生信息失败");
+        }
+        Map<String, Object> resultMap = (Map<String, Object>) JSON.parse(result);
+        return String.valueOf(resultMap.get("updateTime"));
+    }
 }
 }

+ 3 - 0
themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java

@@ -248,6 +248,9 @@ public class MqLogicServiceImpl implements MqLogicService {
             if (Objects.equals(MqTagEnum.MARK_CLOUD_SCORE_PUSH.name(), tag)) {
             if (Objects.equals(MqTagEnum.MARK_CLOUD_SCORE_PUSH.name(), tag)) {
                 taskSyncTemplete = SpringContextHolder.getBean(TaskSyncMarkCloudTemplete.class);
                 taskSyncTemplete = SpringContextHolder.getBean(TaskSyncMarkCloudTemplete.class);
             }
             }
+            if (Objects.equals(MqTagEnum.MARK_CLOUD_DATA_PUSH.name(), tag)) {
+                taskSyncTemplete = SpringContextHolder.getBean(TaskPushMarkCloudTemplete.class);
+            }
             try {
             try {
                 taskSyncTemplete.syncTask(map);
                 taskSyncTemplete.syncTask(map);
             } catch (IOException e) {
             } catch (IOException e) {

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

@@ -91,7 +91,7 @@ public class StartRunning implements CommandLineRunner {
         /**
         /**
          * task
          * task
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.TASK_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.EXAM_STUDENT_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_EXPORT.name() + "||" + MqTagEnum.EXAM_PAPER_IMPORT.name() + "||" + MqTagEnum.EXAM_STUDENT_EXPORT.name() + "||" + MqTagEnum.MARK_RESULT_SIMPLE_EXPORT.name() + "||" + MqTagEnum.MARK_RESULT_STANDARD_EXPORT.name() + "||" + MqTagEnum.MARK_CLOUD_SCORE_PUSH.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(TaskConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.TASK_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.EXAM_STUDENT_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_EXPORT.name() + "||" + MqTagEnum.EXAM_PAPER_IMPORT.name() + "||" + MqTagEnum.EXAM_STUDENT_EXPORT.name() + "||" + MqTagEnum.MARK_RESULT_SIMPLE_EXPORT.name() + "||" + MqTagEnum.MARK_RESULT_STANDARD_EXPORT.name() + "||" + MqTagEnum.MARK_CLOUD_SCORE_PUSH.name() + "||" + MqTagEnum.MARK_CLOUD_DATA_PUSH.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(TaskConcurrentlyImpl.class));
         /**
         /**
          * websocket mq start
          * websocket mq start
          */
          */

+ 4 - 1
themis-task/src/main/resources/application-dev.properties

@@ -219,4 +219,7 @@ monitor.config.prefix=oe_test
 
 
 #\u4E91\u9605\u5377\u540C\u6B65\u914D\u7F6E
 #\u4E91\u9605\u5377\u540C\u6B65\u914D\u7F6E
 yun.mark.url=http://192.168.10.224:80
 yun.mark.url=http://192.168.10.224:80
-yun.mark.studentScoreApi=/api/exam/student/score
+yun.mark.studentScoreApi=/api/exam/student/score
+yun.mark.examSaveApi=/api/exam/save
+yun.mark.subjectSaveApi=/api/exam/subject/save
+yun.mark.studentSaveApi=/api/exam/student/save