|
@@ -7,7 +7,7 @@ import java.util.Objects;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
|
-import com.qmth.themis.business.dto.cache.TEStudentCacheDto;
|
|
|
+import org.springframework.web.bind.annotation.RequestBody;
|
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
import org.springframework.web.bind.annotation.RequestMethod;
|
|
|
import org.springframework.web.bind.annotation.RequestParam;
|
|
@@ -15,12 +15,20 @@ import org.springframework.web.bind.annotation.RestController;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.qmth.themis.business.bean.exam.AnswerSubmitParamBean;
|
|
|
+import com.qmth.themis.business.bean.exam.AudioLeftPlayCountSubmitParamBean;
|
|
|
+import com.qmth.themis.business.bean.exam.ExamStartParamBean;
|
|
|
+import com.qmth.themis.business.bean.exam.FinishParamBean;
|
|
|
+import com.qmth.themis.business.bean.exam.PrepareParamBean;
|
|
|
+import com.qmth.themis.business.bean.exam.ResultParamBean;
|
|
|
+import com.qmth.themis.business.bean.exam.ResumeParamBean;
|
|
|
+import com.qmth.themis.business.bean.exam.StudentPaperStructParamBean;
|
|
|
import com.qmth.themis.business.cache.ExamRecordCacheUtil;
|
|
|
import com.qmth.themis.business.constant.SystemConstant;
|
|
|
+import com.qmth.themis.business.dto.cache.TEStudentCacheDto;
|
|
|
import com.qmth.themis.business.dto.response.TEExamDto;
|
|
|
import com.qmth.themis.business.dto.response.TEExamResultDto;
|
|
|
import com.qmth.themis.business.entity.TEExam;
|
|
|
-import com.qmth.themis.business.entity.TEStudent;
|
|
|
import com.qmth.themis.business.enums.ExamRecordStatusEnum;
|
|
|
import com.qmth.themis.business.enums.MqEnum;
|
|
|
import com.qmth.themis.business.service.TEExamService;
|
|
@@ -46,236 +54,283 @@ import io.swagger.annotations.ApiResponses;
|
|
|
@RequestMapping("/${prefix.url.exam}/exam")
|
|
|
public class TEExamController {
|
|
|
|
|
|
- @Resource
|
|
|
- TEExamService teExamService;
|
|
|
- @Resource
|
|
|
- RedisUtil redisUtil;
|
|
|
- @Resource
|
|
|
- MqDtoService mqDtoService;
|
|
|
+ @Resource
|
|
|
+ TEExamService teExamService;
|
|
|
+ @Resource
|
|
|
+ RedisUtil redisUtil;
|
|
|
+ @Resource
|
|
|
+ MqDtoService mqDtoService;
|
|
|
+
|
|
|
+ @ApiOperation(value = "验证考试口令接口")
|
|
|
+ @RequestMapping(value = "/shortCode", method = RequestMethod.POST)
|
|
|
+ @ApiResponses({ @ApiResponse(code = 200, message = "考试信息", response = TEExam.class) })
|
|
|
+ public Result shortCode(@ApiParam(value = "考试口令", required = true) @RequestParam String shortCode) {
|
|
|
+ if (Objects.isNull(shortCode) || Objects.equals(shortCode, "")) {
|
|
|
+ throw new BusinessException(ExceptionResultEnum.SHORT_CODE_IS_NULL);
|
|
|
+ }
|
|
|
+ QueryWrapper<TEExam> teExamQueryWrapper = new QueryWrapper<>();
|
|
|
+ teExamQueryWrapper.lambda().eq(TEExam::getShortCode, shortCode);
|
|
|
+ TEExam teExam = teExamService.getOne(teExamQueryWrapper);
|
|
|
+ if (Objects.isNull(teExam)) {
|
|
|
+ throw new BusinessException(ExceptionResultEnum.EXAM_NO);
|
|
|
+ }
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ map.put(SystemConstant.ID, teExam.getId());
|
|
|
+ map.put(SystemConstant.NAME, teExam.getName());
|
|
|
+ return ResultUtil.ok(map);
|
|
|
+ }
|
|
|
|
|
|
- @ApiOperation(value = "验证考试口令接口")
|
|
|
- @RequestMapping(value = "/shortCode", method = RequestMethod.POST)
|
|
|
- @ApiResponses({@ApiResponse(code = 200, message = "考试信息", response = TEExam.class)})
|
|
|
- public Result shortCode(@ApiParam(value = "考试口令", required = true) @RequestParam String shortCode) {
|
|
|
- if (Objects.isNull(shortCode) || Objects.equals(shortCode, "")) {
|
|
|
- throw new BusinessException(ExceptionResultEnum.SHORT_CODE_IS_NULL);
|
|
|
- }
|
|
|
- QueryWrapper<TEExam> teExamQueryWrapper = new QueryWrapper<>();
|
|
|
- teExamQueryWrapper.lambda().eq(TEExam::getShortCode, shortCode);
|
|
|
- TEExam teExam = teExamService.getOne(teExamQueryWrapper);
|
|
|
- if (Objects.isNull(teExam)) {
|
|
|
- throw new BusinessException(ExceptionResultEnum.EXAM_NO);
|
|
|
- }
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
- map.put(SystemConstant.ID, teExam.getId());
|
|
|
- map.put(SystemConstant.NAME, teExam.getName());
|
|
|
- return ResultUtil.ok(map);
|
|
|
- }
|
|
|
+ @ApiOperation(value = "获取待考列表接口")
|
|
|
+ @RequestMapping(value = "/waiting", method = RequestMethod.POST)
|
|
|
+ @ApiResponses({ @ApiResponse(code = 200, message = "考试信息", response = TEExamResultDto.class) })
|
|
|
+ public Result waiting() {
|
|
|
+ TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
+ List<TEExamDto> list = teExamService.getWaitingExam(teStudent.getId(), null, teStudent.getOrgId());
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ if (Objects.nonNull(list) && list.size() > 0) {
|
|
|
+ map.put("waiting", list);
|
|
|
+ }
|
|
|
+ return ResultUtil.ok(map);
|
|
|
+ }
|
|
|
|
|
|
- @ApiOperation(value = "获取待考列表接口")
|
|
|
- @RequestMapping(value = "/waiting", method = RequestMethod.POST)
|
|
|
- @ApiResponses({@ApiResponse(code = 200, message = "考试信息", response = TEExamResultDto.class)})
|
|
|
- public Result waiting() {
|
|
|
- TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
- List<TEExamDto> list = teExamService.getWaitingExam(teStudent.getId(), null, teStudent.getOrgId());
|
|
|
- Map<String, Object> map = new HashMap<>();
|
|
|
- if (Objects.nonNull(list) && list.size() > 0) {
|
|
|
- map.put("waiting", list);
|
|
|
- }
|
|
|
- return ResultUtil.ok(map);
|
|
|
- }
|
|
|
+ @ApiOperation(value = "开始候考")
|
|
|
+ @RequestMapping(value = "/prepare", method = RequestMethod.POST)
|
|
|
+ @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
|
|
|
+ public Result prepare(@RequestBody PrepareParamBean param) {
|
|
|
+ TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
+ String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
+ Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
+ if (!lock) {
|
|
|
+ throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ if (param.getExamStudentId() == null) {
|
|
|
+ throw new BusinessException("考生id不能为空");
|
|
|
+ }
|
|
|
+ return ResultUtil.ok(teExamService.prepare(teStudent.getId(), param.getExamStudentId()));
|
|
|
+ } finally {
|
|
|
+ redisUtil.releaseLock(lockKey);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- @ApiOperation(value = "开始候考")
|
|
|
- @RequestMapping(value = "/prepare", method = RequestMethod.POST)
|
|
|
- @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
|
|
|
- public Result prepare(@ApiParam(value = "考生ID", required = true) @RequestParam Long examStudentId) {
|
|
|
- TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
- String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
- Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
- if (!lock) {
|
|
|
- throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
- }
|
|
|
- try {
|
|
|
- return ResultUtil.ok(teExamService.prepare(teStudent.getId(), examStudentId));
|
|
|
- } finally {
|
|
|
- redisUtil.releaseLock(lockKey);
|
|
|
- }
|
|
|
- }
|
|
|
+ @ApiOperation(value = "开始考试")
|
|
|
+ @RequestMapping(value = "/start", method = RequestMethod.POST)
|
|
|
+ @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
|
|
|
+ public Result start(@RequestBody ExamStartParamBean param) {
|
|
|
+ TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
+ String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
+ Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
+ if (!lock) {
|
|
|
+ throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ if (param.getRecordId() == null) {
|
|
|
+ throw new BusinessException("考试记录id不能为空");
|
|
|
+ }
|
|
|
+ return ResultUtil.ok(teExamService.start(teStudent.getId(), param.getRecordId()));
|
|
|
+ } finally {
|
|
|
+ redisUtil.releaseLock(lockKey);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- @ApiOperation(value = "开始考试")
|
|
|
- @RequestMapping(value = "/start", method = RequestMethod.POST)
|
|
|
- @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
|
|
|
- public Result start(@ApiParam(value = "考试记录ID", required = true) @RequestParam Long recordId,
|
|
|
- @ApiParam(value = "断点续考原因", required = false) @RequestParam String reason) {
|
|
|
- TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
- String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
- Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
- if (!lock) {
|
|
|
- throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
- }
|
|
|
- try {
|
|
|
- return ResultUtil.ok(teExamService.start(teStudent.getId(), recordId));
|
|
|
- } finally {
|
|
|
- redisUtil.releaseLock(lockKey);
|
|
|
- }
|
|
|
- }
|
|
|
+ @ApiOperation(value = "上传个人试卷结构")
|
|
|
+ @RequestMapping(value = "/student_paper_struct/upload", method = RequestMethod.POST)
|
|
|
+ @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
|
|
|
+ public Result studentPaperStruct(@RequestBody StudentPaperStructParamBean param) {
|
|
|
+ TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
+ String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
+ Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
+ if (!lock) {
|
|
|
+ throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ if (param.getRecordId() == null) {
|
|
|
+ throw new BusinessException("考试记录id不能为空");
|
|
|
+ }
|
|
|
+ if (param.getContent() == null) {
|
|
|
+ throw new BusinessException("试卷结构json字符串不能为空");
|
|
|
+ }
|
|
|
+ return ResultUtil
|
|
|
+ .ok(teExamService.studentPaperStruct(teStudent.getId(), param.getRecordId(), param.getContent()));
|
|
|
+ } finally {
|
|
|
+ redisUtil.releaseLock(lockKey);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- @ApiOperation(value = "上传个人试卷结构")
|
|
|
- @RequestMapping(value = "/student_paper_struct/upload", method = RequestMethod.POST)
|
|
|
- @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
|
|
|
- public Result studentPaperStruct(@ApiParam(value = "考试记录ID", required = true) @RequestParam Long recordId,
|
|
|
- @ApiParam(value = "试卷结构json字符串", required = true) @RequestParam String content) {
|
|
|
- TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
- String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
- Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
- if (!lock) {
|
|
|
- throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
- }
|
|
|
- try {
|
|
|
- return ResultUtil.ok(teExamService.studentPaperStruct(teStudent.getId(), recordId, content));
|
|
|
- } finally {
|
|
|
- redisUtil.releaseLock(lockKey);
|
|
|
- }
|
|
|
- }
|
|
|
+ @ApiOperation(value = "提交作答结果")
|
|
|
+ @RequestMapping(value = "/answer/submit", method = RequestMethod.POST)
|
|
|
+ @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
|
|
|
+ public Result answerSubmit(@RequestBody AnswerSubmitParamBean param) {
|
|
|
+ TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
+ String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
+ Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
+ if (!lock) {
|
|
|
+ throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ if (param.getRecordId() == null) {
|
|
|
+ throw new BusinessException("考试记录id不能为空");
|
|
|
+ }
|
|
|
+ if (param.getMainNumber() == null) {
|
|
|
+ throw new BusinessException("大题号不能为空");
|
|
|
+ }
|
|
|
+ if (param.getSubNumber() == null) {
|
|
|
+ throw new BusinessException("小题号不能为空");
|
|
|
+ }
|
|
|
+ if (param.getAnswer() == null) {
|
|
|
+ throw new BusinessException("答案json字符串不能为空");
|
|
|
+ }
|
|
|
+ if (param.getVersion() == null) {
|
|
|
+ throw new BusinessException("时间戳不能为空");
|
|
|
+ }
|
|
|
+ Long ret = teExamService.answerSubmit(teStudent.getId(), param.getRecordId(), param.getMainNumber(),
|
|
|
+ param.getSubNumber(), param.getSubIndex(), param.getAnswer(), param.getVersion(),
|
|
|
+ param.getDurationSeconds());
|
|
|
+ // 发消息计算客观分
|
|
|
+ calculateObjectiveScore(param.getRecordId(), param.getMainNumber(), param.getSubNumber(),
|
|
|
+ param.getSubIndex());
|
|
|
+ return ResultUtil.ok(ret);
|
|
|
+ } finally {
|
|
|
+ redisUtil.releaseLock(lockKey);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- @ApiOperation(value = "提交作答结果")
|
|
|
- @RequestMapping(value = "/answer/submit", method = RequestMethod.POST)
|
|
|
- @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
|
|
|
- public Result answerSubmit(@ApiParam(value = "考试记录ID", required = true) @RequestParam Long recordId,
|
|
|
- @ApiParam(value = "大题号", required = true) @RequestParam Integer mainNumber,
|
|
|
- @ApiParam(value = "小题号", required = true) @RequestParam Integer subNumber,
|
|
|
- @ApiParam(value = "套题子题序号", required = false) @RequestParam Integer subIndex,
|
|
|
- @ApiParam(value = "答案json字符串", required = true) @RequestParam String answer,
|
|
|
- @ApiParam(value = "时间戳", required = true) @RequestParam Long version,
|
|
|
- @ApiParam(value = "作答累计秒数", required = false) @RequestParam Integer durationSeconds) {
|
|
|
- TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
- String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
- Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
- if (!lock) {
|
|
|
- throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
- }
|
|
|
- try {
|
|
|
- Long ret = teExamService.answerSubmit(teStudent.getId(), recordId, mainNumber, subNumber, subIndex, answer, version, durationSeconds);
|
|
|
- //发消息计算客观分
|
|
|
- calculateObjectiveScore(recordId, mainNumber, subNumber, subIndex);
|
|
|
- return ResultUtil.ok(ret);
|
|
|
- } finally {
|
|
|
- redisUtil.releaseLock(lockKey);
|
|
|
- }
|
|
|
- }
|
|
|
+ @ApiOperation(value = "更新音频剩余播放次数")
|
|
|
+ @RequestMapping(value = "/audio_left_play_count/submit", method = RequestMethod.POST)
|
|
|
+ @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
|
|
|
+ public Result audioLeftPlayCountSubmit(@RequestBody AudioLeftPlayCountSubmitParamBean param) {
|
|
|
+ TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
+ String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
+ Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
+ if (!lock) {
|
|
|
+ throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ if (param.getRecordId() == null) {
|
|
|
+ throw new BusinessException("考试记录id不能为空");
|
|
|
+ }
|
|
|
+ if (param.getKey() == null) {
|
|
|
+ throw new BusinessException("音频标识不能为空");
|
|
|
+ }
|
|
|
+ if (param.getCount() == null) {
|
|
|
+ throw new BusinessException("剩余播放次数不能为空");
|
|
|
+ }
|
|
|
+ return ResultUtil.ok(teExamService.audioLeftPlayCountSubmit(teStudent.getId(), param.getRecordId(), param.getKey(), param.getCount()));
|
|
|
+ } finally {
|
|
|
+ redisUtil.releaseLock(lockKey);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- @ApiOperation(value = "更新音频剩余播放次数")
|
|
|
- @RequestMapping(value = "/audio_left_play_count/submit", method = RequestMethod.POST)
|
|
|
- @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
|
|
|
- public Result audioLeftPlayCountSubmit(@ApiParam(value = "考试记录ID", required = true) @RequestParam Long recordId,
|
|
|
- @ApiParam(value = "音频标识", required = true) @RequestParam String key,
|
|
|
- @ApiParam(value = "剩余播放次数", required = true) @RequestParam Integer count) {
|
|
|
- TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
- String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
- Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
- if (!lock) {
|
|
|
- throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
- }
|
|
|
- try {
|
|
|
- return ResultUtil.ok(teExamService.audioLeftPlayCountSubmit(teStudent.getId(), recordId, key, count));
|
|
|
- } finally {
|
|
|
- redisUtil.releaseLock(lockKey);
|
|
|
- }
|
|
|
- }
|
|
|
+ @ApiOperation(value = "文件上传")
|
|
|
+ @RequestMapping(value = "/file/upload", method = RequestMethod.POST)
|
|
|
+ @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
|
|
|
+ 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,
|
|
|
+ @ApiParam(value = "md5", required = true) @RequestParam String md5) {
|
|
|
+ TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
+ String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
+ Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
+ if (!lock) {
|
|
|
+ throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ return ResultUtil.ok(teExamService.fileUpload(teStudent.getId(), recordId, file, suffix, md5));
|
|
|
+ } finally {
|
|
|
+ redisUtil.releaseLock(lockKey);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- @ApiOperation(value = "文件上传")
|
|
|
- @RequestMapping(value = "/file/upload", method = RequestMethod.POST)
|
|
|
- @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
|
|
|
- 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,
|
|
|
- @ApiParam(value = "md5", required = true) @RequestParam String md5) {
|
|
|
- TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
- String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
- Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
- if (!lock) {
|
|
|
- throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
- }
|
|
|
- try {
|
|
|
- return ResultUtil.ok(teExamService.fileUpload(teStudent.getId(), recordId, file, suffix, md5));
|
|
|
- } finally {
|
|
|
- redisUtil.releaseLock(lockKey);
|
|
|
- }
|
|
|
- }
|
|
|
+ @ApiOperation(value = "断点恢复")
|
|
|
+ @RequestMapping(value = "/resume", method = RequestMethod.POST)
|
|
|
+ @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
|
|
|
+ public Result resume(@RequestBody ResumeParamBean param) {
|
|
|
+ TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
+ String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
+ Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
+ if (!lock) {
|
|
|
+ throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ if (param.getRecordId() == null) {
|
|
|
+ throw new BusinessException("考试记录id不能为空");
|
|
|
+ }
|
|
|
+ return ResultUtil.ok(teExamService.resume(teStudent.getId(), param.getRecordId()));
|
|
|
+ } finally {
|
|
|
+ redisUtil.releaseLock(lockKey);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @ApiOperation(value = "结束考试")
|
|
|
+ @RequestMapping(value = "/finish", method = RequestMethod.POST)
|
|
|
+ @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
|
|
|
+ public Result finish(@RequestBody FinishParamBean param) {
|
|
|
+ TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
+ String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
+ Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
+ if (!lock) {
|
|
|
+ throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ if (param.getRecordId() == null) {
|
|
|
+ throw new BusinessException("考试记录id不能为空");
|
|
|
+ }
|
|
|
+ if (param.getType() == null) {
|
|
|
+ throw new BusinessException("结束类型不能为空");
|
|
|
+ }
|
|
|
+ if (param.getDurationSeconds() == null) {
|
|
|
+ throw new BusinessException("总用时秒数不能为空");
|
|
|
+ }
|
|
|
+ Result re = ResultUtil.ok(teExamService.finish(teStudent.getId(), param.getRecordId(), param.getType(), param.getDurationSeconds()));
|
|
|
+ checkToPersisted(param.getRecordId());
|
|
|
+ return re;
|
|
|
+ } finally {
|
|
|
+ redisUtil.releaseLock(lockKey);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- @ApiOperation(value = "断点恢复")
|
|
|
- @RequestMapping(value = "/resume", method = RequestMethod.POST)
|
|
|
- @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
|
|
|
- public Result resume(@ApiParam(value = "考试记录ID", required = true) @RequestParam Long recordId) {
|
|
|
- TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
- String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
- Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
- if (!lock) {
|
|
|
- throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
- }
|
|
|
- try {
|
|
|
- return ResultUtil.ok(teExamService.resume(teStudent.getId(), recordId));
|
|
|
- } finally {
|
|
|
- redisUtil.releaseLock(lockKey);
|
|
|
- }
|
|
|
- }
|
|
|
+ private void calculateObjectiveScore(Long recordId, Integer mainNumber, Integer subNumber, Integer subIndex) {
|
|
|
+ Map<String, Object> transMap = new HashMap<String, Object>();
|
|
|
+ transMap.put("recordId", recordId);
|
|
|
+ transMap.put("mainNumber", mainNumber);
|
|
|
+ transMap.put("subNumber", subNumber);
|
|
|
+ transMap.put("subIndex", subIndex);
|
|
|
+ // mq发送消息start
|
|
|
+ MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.calculateObjectiveScore.name(), transMap,
|
|
|
+ MqEnum.EXAM, null, null);
|
|
|
+ mqDtoService.assembleSendOneWayMsg(mqDto);
|
|
|
+ }
|
|
|
|
|
|
- @ApiOperation(value = "结束考试")
|
|
|
- @RequestMapping(value = "/finish", method = RequestMethod.POST)
|
|
|
- @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
|
|
|
- public Result finish(@ApiParam(value = "考试记录ID", required = true) @RequestParam Long recordId,
|
|
|
- @ApiParam(value = "结束类型", required = true) @RequestParam String type,
|
|
|
- @ApiParam(value = "总用时秒数", required = true) @RequestParam Integer durationSeconds) {
|
|
|
- TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
- String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
- Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
|
- if (!lock) {
|
|
|
- throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
|
|
|
- }
|
|
|
- try {
|
|
|
- Result re=ResultUtil.ok(teExamService.finish(teStudent.getId(), recordId, type, durationSeconds));
|
|
|
- checkToPersisted(recordId);
|
|
|
- return re;
|
|
|
- } finally {
|
|
|
- redisUtil.releaseLock(lockKey);
|
|
|
- }
|
|
|
- }
|
|
|
+ @ApiOperation(value = "查询交卷结果")
|
|
|
+ @RequestMapping(value = "/result", method = RequestMethod.POST)
|
|
|
+ @ApiResponses({ @ApiResponse(code = 200, message = "试卷信息") })
|
|
|
+ public Result result(@RequestBody ResultParamBean param) {
|
|
|
+ if (param.getRecordId() == null) {
|
|
|
+ throw new BusinessException("考试记录id不能为空");
|
|
|
+ }
|
|
|
+ return ResultUtil.ok(teExamService.result(param.getRecordId()));
|
|
|
+ }
|
|
|
|
|
|
- private void calculateObjectiveScore(Long recordId, Integer mainNumber, Integer subNumber, Integer subIndex) {
|
|
|
- Map<String, Object> transMap = new HashMap<String, Object>();
|
|
|
- transMap.put("recordId", recordId);
|
|
|
- transMap.put("mainNumber", mainNumber);
|
|
|
- transMap.put("subNumber", subNumber);
|
|
|
- transMap.put("subIndex", subIndex);
|
|
|
- //mq发送消息start
|
|
|
- MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.calculateObjectiveScore.name(), transMap, MqEnum.EXAM, null, null);
|
|
|
- mqDtoService.assembleSendOneWayMsg(mqDto);
|
|
|
- }
|
|
|
+ /**
|
|
|
+ * 检查条件并发送持久化消息
|
|
|
+ *
|
|
|
+ * @param recordId
|
|
|
+ */
|
|
|
+ private void checkToPersisted(Long recordId) {
|
|
|
+ ExamRecordStatusEnum status = ExamRecordCacheUtil.getStatus(recordId);
|
|
|
+ if (!ExamRecordStatusEnum.FINISHED.equals(status)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Double score = ExamRecordCacheUtil.getObjectiveScore(recordId);
|
|
|
+ if (score == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- @ApiOperation(value = "查询交卷结果")
|
|
|
- @RequestMapping(value = "/result", method = RequestMethod.POST)
|
|
|
- @ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
|
|
|
- public Result result(@ApiParam(value = "考试记录ID", required = true) @RequestParam Long recordId) {
|
|
|
- return ResultUtil.ok(teExamService.result(recordId));
|
|
|
- }
|
|
|
-
|
|
|
- /**检查条件并发送持久化消息
|
|
|
- * @param recordId
|
|
|
- */
|
|
|
- private void checkToPersisted(Long recordId) {
|
|
|
- ExamRecordStatusEnum status=ExamRecordCacheUtil.getStatus(recordId);
|
|
|
- if(!ExamRecordStatusEnum.FINISHED.equals(status)) {
|
|
|
- return;
|
|
|
- }
|
|
|
- Double score=ExamRecordCacheUtil.getObjectiveScore(recordId);
|
|
|
- if(score==null) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- Map<String, Object> transMap = new HashMap<String, Object>();
|
|
|
- transMap.put("recordId", recordId);
|
|
|
- //mq发送消息start
|
|
|
- MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.examRecordPersisted.name(), transMap, MqEnum.EXAM, null, null);
|
|
|
- mqDtoService.assembleSendOneWayMsg(mqDto);
|
|
|
- }
|
|
|
+ Map<String, Object> transMap = new HashMap<String, Object>();
|
|
|
+ transMap.put("recordId", recordId);
|
|
|
+ // mq发送消息start
|
|
|
+ MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.examRecordPersisted.name(), transMap,
|
|
|
+ MqEnum.EXAM, null, null);
|
|
|
+ mqDtoService.assembleSendOneWayMsg(mqDto);
|
|
|
+ }
|
|
|
}
|