Procházet zdrojové kódy

新增云阅卷成绩同步功能

wangliang před 2 roky
rodič
revize
0c720e5317

+ 73 - 0
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamController.java

@@ -89,6 +89,9 @@ public class TEExamController {
     @Resource
     TSLogService tsLogService;
 
+    @Resource
+    TEExamCourseService teExamCourseService;
+
     @ApiOperation(value = "考试批次修改/新增接口")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @Transactional
@@ -539,4 +542,74 @@ public class TEExamController {
         }
         return ResultUtil.ok(Collections.singletonMap(SystemConstant.TASK_ID, tbTaskHistory.getId()));
     }
+
+    @ApiOperation(value = "云阅卷成绩同步")
+    @ApiResponses({@ApiResponse(code = 200, message = "成绩同步信息", response = Result.class)})
+    @RequestMapping(value = "/score/sync", method = RequestMethod.POST)
+    public Result scoreSync(@ApiParam(value = "考试ID", required = true) @RequestParam String examId,
+                            @ApiParam(value = "云阅卷考试id", required = true) @RequestParam String yunMarkExamId,
+                            @ApiParam(value = "accessKey", required = false) @RequestParam(required = false) String accessKey,
+                            @ApiParam(value = "accessSecret", required = false) @RequestParam(required = false) String accessSecret) {
+        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.SCORE_PUSH, TaskStatusEnum.INIT,
+                    SystemConstant.SCORE_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("yunMarkExamId", Long.parseLong(yunMarkExamId));
+            transMap.put(SystemConstant.EXAM_CODE, examCacheBean.getCode());
+            transMap.put(SystemConstant.ACCESS_KEY_ID, accessKey);
+            transMap.put(SystemConstant.ACCESS_KEY_SECRET, accessSecret);
+            //mq发送消息start
+            MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MARK_CLOUD_SCORE_PUSH.name(),
+                    transMap, MqTagEnum.MARK_CLOUD_SCORE_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()));
+    }
 }

+ 9 - 106
themis-admin/src/main/java/com/qmth/themis/admin/api/TEOpenController.java

@@ -2,21 +2,12 @@ package com.qmth.themis.admin.api;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.qmth.themis.business.cache.bean.ExamCacheBean;
-import com.qmth.themis.business.constant.SystemConstant;
-import com.qmth.themis.business.dto.MqDto;
-import com.qmth.themis.business.entity.TBTaskHistory;
-import com.qmth.themis.business.entity.TBUser;
-import com.qmth.themis.business.entity.TEExamCourse;
-import com.qmth.themis.business.enums.*;
-import com.qmth.themis.business.service.*;
-import com.qmth.themis.business.util.MqUtil;
-import com.qmth.themis.business.util.ServletUtil;
-import com.qmth.themis.common.enums.ExceptionResultEnum;
+import com.qmth.themis.business.bean.admin.OpenExamBean;
+import com.qmth.themis.business.bean.admin.OpenExamCourseBean;
+import com.qmth.themis.business.bean.mobile.MobileAuthorizationBean;
+import com.qmth.themis.business.service.TEOpenService;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.Result;
-import com.qmth.themis.common.util.ResultUtil;
 import io.swagger.annotations.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -28,8 +19,6 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import java.io.IOException;
-import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * 开放接口
@@ -47,24 +36,9 @@ public class TEOpenController {
     @Resource
     private TEOpenService openService;
 
-    @Resource
-    TEExamService teExamService;
-
-    @Resource
-    MqDtoService mqDtoService;
-
-    @Resource
-    TEExamCourseService teExamCourseService;
-
-    @Resource
-    TBTaskHistoryService taskHistoryService;
-
-    @Resource
-    MqUtil mqUtil;
-
     @ApiOperation(value = "获取考试详情")
     @RequestMapping(value = "/exam/query", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})
+    @ApiResponses({@ApiResponse(code = 200, message = "考试详情信息", response = OpenExamBean.class)})
     public Object examQueryPage(@ApiParam(value = "考试id", required = false) @RequestParam(required = false) Long id,
                                 @ApiParam(value = "考试code", required = false) @RequestParam(required = false) String code,
                                 @ApiParam(value = "分页页码", required = false) @RequestParam(required = false) Integer pageNumber,
@@ -80,7 +54,7 @@ public class TEOpenController {
 
     @ApiOperation(value = "获取考试课程详情")
     @RequestMapping(value = "/exam/course/query", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})
+    @ApiResponses({@ApiResponse(code = 200, message = "考试课程详情信息", response = OpenExamCourseBean.class)})
     public Object examCourseQueryPage(@ApiParam(value = "考试id", required = true) @RequestParam Long examId,
                                       @ApiParam(value = "课程code", required = false) @RequestParam(required = false) String courseCode,
                                       @ApiParam(value = "是否有试卷", required = false) @RequestParam(required = false) Boolean hasPaper,
@@ -95,13 +69,12 @@ public class TEOpenController {
         if (pageSize > 100) {
             pageSize = 100;
         }
-        return openService
-                .examCourseQueryPage(examId, StringUtils.trimToNull(courseCode), hasPaper, pageNumber, pageSize);
+        return openService.examCourseQueryPage(examId, StringUtils.trimToNull(courseCode), hasPaper, pageNumber, pageSize);
     }
 
     @ApiOperation(value = "获取考试试卷详情")
     @RequestMapping(value = "/exam/paper/detail", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})
+    @ApiResponses({@ApiResponse(code = 200, message = "结果信息", response = Result.class)})
     public JSONObject examPaperDetail(@ApiParam(value = "试卷id", required = true) @RequestParam Long id,
                                       @ApiParam(value = "内容过滤", required = false) @RequestParam(required = false) String filter)
             throws IOException {
@@ -114,7 +87,7 @@ public class TEOpenController {
 
     @ApiOperation(value = "待评卷考试记录查询")
     @RequestMapping(value = "/exam/record/need_mark", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "结果信息")})
+    @ApiResponses({@ApiResponse(code = 200, message = "结果信息", response = Result.class)})
     public JSONArray examRecordNeedMark(@ApiParam(value = "考试id", required = true) @RequestParam Long examId,
                                         @ApiParam(value = "课程代码", required = false) @RequestParam(required = false) String courseCode,
                                         @ApiParam(value = "考生ID大于此参数", required = false) @RequestParam(required = false) Long examStudentIdGt,
@@ -127,74 +100,4 @@ public class TEOpenController {
         }
         return openService.examRecordNeedMark(examId, StringUtils.trimToNull(courseCode), examStudentIdGt, count);
     }
-
-    @ApiOperation(value = "成绩查询同步")
-    @ApiResponses({@ApiResponse(code = 200, message = "成绩查询同步信息", response = Result.class)})
-    @RequestMapping(value = "/score/sync", method = RequestMethod.POST)
-    public Result scoreSync(@ApiParam(value = "考试ID", required = true) @RequestParam String examId,
-                            @ApiParam(value = "云阅卷考试id", required = true) @RequestParam String yunMarkExamId,
-                            @ApiParam(value = "accessKey", required = false) @RequestParam(required = false) String accessKey,
-                            @ApiParam(value = "accessSecret", required = false) @RequestParam(required = false) String accessSecret) {
-        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.SCORE_PUSH, TaskStatusEnum.INIT,
-                    SystemConstant.SCORE_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("yunMarkExamId", Long.parseLong(yunMarkExamId));
-            transMap.put(SystemConstant.EXAM_CODE, examCacheBean.getCode());
-            transMap.put(SystemConstant.ACCESS_KEY_ID, accessKey);
-            transMap.put(SystemConstant.ACCESS_KEY_SECRET, accessSecret);
-            //mq发送消息start
-            MqDto mqDto = new MqDto(mqUtil.getMqGroupDomain().getTopic(), MqTagEnum.MARK_CLOUD_SCORE_PUSH.name(),
-                    transMap, MqTagEnum.MARK_CLOUD_SCORE_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()));
-    }
 }

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

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

+ 7 - 8
themis-exam/src/main/java/com/qmth/themis/exam/api/TEMobileController.java

@@ -1,10 +1,7 @@
 package com.qmth.themis.exam.api;
 
 import com.alibaba.fastjson.JSONObject;
-import com.qmth.themis.business.bean.exam.AnswerReadyParamBean;
-import com.qmth.themis.business.bean.exam.AnswerReadyResponseBean;
-import com.qmth.themis.business.bean.exam.MobileAnswerSubmitParamBean;
-import com.qmth.themis.business.bean.exam.MobileAnswerSubmitReponseBean;
+import com.qmth.themis.business.bean.exam.*;
 import com.qmth.themis.business.bean.mobile.MobileAuthorizationBean;
 import com.qmth.themis.business.bean.mobile.MobileAuthorizationParamBean;
 import com.qmth.themis.business.bean.result.TEAudioResult;
@@ -72,6 +69,7 @@ public class TEMobileController {
 
     @ApiOperation(value = "获取登录详细信息")
     @RequestMapping(value = "/authorization", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "登录信息", response = MobileAuthorizationBean.class)})
     public Result authorization(@RequestBody MobileAuthorizationParamBean param) throws NoSuchAlgorithmException {
         if (param.getMode() == null) {
             throw new BusinessException("mode不能为空");
@@ -103,6 +101,7 @@ public class TEMobileController {
 
     @ApiOperation(value = "拍照/录音答题就绪")
     @RequestMapping(value = "/answer/ready", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "拍照/录音信息", response = AnswerReadyResponseBean.class)})
     public Result answerReady(@RequestBody AnswerReadyParamBean param) {
         if (param.getRecordId() == null) {
             throw new BusinessException(ExceptionResultEnum.RECORD_ID_IS_NULL);
@@ -145,7 +144,7 @@ public class TEMobileController {
 
     @ApiOperation(value = "文件上传")
     @RequestMapping(value = "/file/upload", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
+    @ApiResponses({@ApiResponse(code = 200, message = "附件信息", response = ExamFileUploadBean.class)})
     public Result fileUpload(@ApiParam(value = "考试记录ID", required = true) @RequestParam Long recordId,
                              @ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
                              @ApiParam(value = "后缀名", required = true) @RequestParam String suffix,
@@ -157,7 +156,7 @@ public class TEMobileController {
 
     @ApiOperation(value = "提交作答结果")
     @RequestMapping(value = "/answer/submit", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
+    @ApiResponses({@ApiResponse(code = 200, message = "答案信息", response = MobileAnswerSubmitReponseBean.class)})
     public Result answerSubmit(@RequestBody MobileAnswerSubmitParamBean param) {
         TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
         if (param.getRecordId() == null) {
@@ -191,7 +190,7 @@ public class TEMobileController {
 
     @ApiOperation(value = "查询考试状态")
     @RequestMapping(value = "/exam/status", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
+    @ApiResponses({@ApiResponse(code = 200, message = "考试状态", response = ExamRecordStatusEnum.class)})
     public Result examStatus(@RequestBody MobileAnswerSubmitParamBean param) {
         if (Objects.isNull(param)) {
             throw new BusinessException(ExceptionResultEnum.PARAMS_ILLEGALITY);
@@ -208,7 +207,7 @@ public class TEMobileController {
 
     @ApiOperation(value = "查询考试语音信息")
     @RequestMapping(value = "/exam/audio/query", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
+    @ApiResponses({@ApiResponse(code = 200, message = "语音信息", response = TEAudioResult.class)})
     public Result examAudioQuery(@ApiParam(value = "考试id", required = true) @RequestParam Long recordId) {
         List<TEAudioResult> teAudioList = null;
         ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);