|
@@ -7,6 +7,7 @@ import com.qmth.themis.business.annotation.ApiJsonProperty;
|
|
|
import com.qmth.themis.business.bean.exam.*;
|
|
|
import com.qmth.themis.business.cache.ExamBreakCacheUtil;
|
|
|
import com.qmth.themis.business.cache.ExamRecordCacheUtil;
|
|
|
+import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
|
|
|
import com.qmth.themis.business.constant.SystemConstant;
|
|
|
import com.qmth.themis.business.dto.MqDto;
|
|
|
import com.qmth.themis.business.dto.cache.TEStudentCacheDto;
|
|
@@ -18,10 +19,7 @@ import com.qmth.themis.business.enums.ExamRecordStatusEnum;
|
|
|
import com.qmth.themis.business.enums.ExceptionEnum;
|
|
|
import com.qmth.themis.business.enums.MqTagEnum;
|
|
|
import com.qmth.themis.business.enums.SystemOperationEnum;
|
|
|
-import com.qmth.themis.business.service.MqDtoService;
|
|
|
-import com.qmth.themis.business.service.TEExamService;
|
|
|
-import com.qmth.themis.business.service.TOeExamBreakHistoryService;
|
|
|
-import com.qmth.themis.business.service.TOeExamRecordService;
|
|
|
+import com.qmth.themis.business.service.*;
|
|
|
import com.qmth.themis.business.util.JacksonUtil;
|
|
|
import com.qmth.themis.business.util.MqUtil;
|
|
|
import com.qmth.themis.business.util.RedisUtil;
|
|
@@ -31,7 +29,6 @@ import com.qmth.themis.common.exception.BusinessException;
|
|
|
import com.qmth.themis.common.util.Result;
|
|
|
import com.qmth.themis.common.util.ResultUtil;
|
|
|
import com.qmth.themis.exam.config.ExamConstant;
|
|
|
-import com.qmth.themis.exam.websocket.WebSocketOeServer;
|
|
|
import io.swagger.annotations.*;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
@@ -40,7 +37,6 @@ import javax.annotation.Resource;
|
|
|
import java.io.IOException;
|
|
|
import java.security.NoSuchAlgorithmException;
|
|
|
import java.util.*;
|
|
|
-import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
|
@Api(tags = "考试Controller")
|
|
|
@RestController
|
|
@@ -65,6 +61,9 @@ public class TEExamController {
|
|
|
@Resource
|
|
|
MqUtil mqUtil;
|
|
|
|
|
|
+ @Resource
|
|
|
+ TEExamStudentService teExamStudentService;
|
|
|
+
|
|
|
@ApiOperation(value = "验证考试口令接口")
|
|
|
@RequestMapping(value = "/short_code", method = RequestMethod.POST)
|
|
|
@ApiResponses({@ApiResponse(code = 200, message = "考试信息", response = TEExam.class)})
|
|
@@ -142,12 +141,13 @@ public class TEExamController {
|
|
|
throw new BusinessException(ExceptionResultEnum.EXAM_STATUS_ERROR);
|
|
|
}
|
|
|
}
|
|
|
- ConcurrentHashMap<String, WebSocketOeServer> webSocketMap = WebSocketOeServer.getWebSocketMap();
|
|
|
- String clientWebsocketId = ExamRecordCacheUtil.getClientWebsocketId(Long.parseLong(recordId));
|
|
|
- if (Objects.nonNull(clientWebsocketId)) {
|
|
|
- WebSocketOeServer webSocketOeServer = webSocketMap.get(clientWebsocketId);
|
|
|
- WebSocketOeServer.close(webSocketOeServer);
|
|
|
- }
|
|
|
+ ExamConstant.clientWebsocketClose(Long.parseLong(recordId));
|
|
|
+
|
|
|
+ Long examStudentId = ExamRecordCacheUtil.getExamStudentId(Long.parseLong(recordId));
|
|
|
+ ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
|
|
|
+ Optional.ofNullable(examStudentCacheBean).orElseThrow(() -> new BusinessException("考生数据为空"));
|
|
|
+
|
|
|
+ SystemConstant.mobileMonitorStatusStop(examStudentCacheBean.getStudentId(), Long.parseLong(recordId), true);
|
|
|
return ResultUtil.ok(true);
|
|
|
}
|
|
|
|
|
@@ -302,7 +302,7 @@ public class TEExamController {
|
|
|
@ApiOperation(value = "结束考试")
|
|
|
@RequestMapping(value = "/finish", method = RequestMethod.POST)
|
|
|
@ApiResponses({@ApiResponse(code = 200, message = "试卷信息")})
|
|
|
- public Result finish(@RequestBody FinishParamBean param) {
|
|
|
+ public Result finish(@RequestBody FinishParamBean param) throws IOException, NoSuchAlgorithmException {
|
|
|
TEStudentCacheDto teStudent = (TEStudentCacheDto) ServletUtil.getRequestStudentAccount();
|
|
|
String lockKey = SystemConstant.REDIS_LOCK_STUDENT_PREFIX + teStudent.getId();
|
|
|
Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
|
|
@@ -319,7 +319,13 @@ public class TEExamController {
|
|
|
if (param.getDurationSeconds() == null) {
|
|
|
throw new BusinessException("总用时秒数不能为空");
|
|
|
}
|
|
|
- return ResultUtil.ok(teExamService.finish(teStudent.getId(), param.getRecordId(), param.getType(), param.getDurationSeconds()));
|
|
|
+ ExamFinishBean examFinishBean = teExamService.finish(teStudent.getId(), param.getRecordId(), param.getType(), param.getDurationSeconds());
|
|
|
+ SystemConstant.clientMonitorStatusStop(param.getRecordId());
|
|
|
+ ExamConstant.clientWebsocketClose(param.getRecordId());
|
|
|
+
|
|
|
+ SystemConstant.mobileMonitorStatusStop(teStudent.getId(), param.getRecordId(), false);
|
|
|
+ ExamConstant.mobileWebsocketClose(param.getRecordId());
|
|
|
+ return ResultUtil.ok(examFinishBean);
|
|
|
} finally {
|
|
|
redisUtil.releaseLock(lockKey);
|
|
|
}
|