|
@@ -25,6 +25,8 @@ 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.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.dao.DuplicateKeyException;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
@@ -45,6 +47,7 @@ import java.util.stream.Collectors;
|
|
|
@RestController
|
|
|
@RequestMapping("/${prefix.url.admin}/exam")
|
|
|
public class TEExamController {
|
|
|
+ private final static Logger log = LoggerFactory.getLogger(TEExamController.class);
|
|
|
|
|
|
@Resource
|
|
|
TEExamService teExamService;
|
|
@@ -353,7 +356,7 @@ public class TEExamController {
|
|
|
if (Objects.nonNull(tbExamInvigilateUserList) && tbExamInvigilateUserList.size() > 0) {
|
|
|
roomCodeSet = tbExamInvigilateUserList.stream().map(s -> s.getRoomCode()).collect(Collectors.toSet());
|
|
|
}
|
|
|
- if (Objects.nonNull(roomCodeSet) || roomCodeSet.size() == 0) {
|
|
|
+ if (Objects.isNull(roomCodeSet) || roomCodeSet.size() == 0) {
|
|
|
throw new BusinessException("当前监考老师未设置任何监考考场");
|
|
|
}
|
|
|
//根据roomCode获取当前老师所要监考的全部应考学生数
|
|
@@ -371,53 +374,61 @@ public class TEExamController {
|
|
|
AtomicReference<Integer> alreadyComplete = new AtomicReference<>(0);
|
|
|
Integer notComplete = 0;
|
|
|
if (Objects.nonNull(teExamStudentList) && teExamStudentList.size() > 0) {
|
|
|
+ studentSet = new HashSet<>();
|
|
|
+ examActivityIdSet = new HashSet<>();
|
|
|
+ Set<Long> finalExamActivityIdSet = examActivityIdSet;
|
|
|
+ Set<String> finalStudentSet = studentSet;
|
|
|
teExamStudentList.forEach(s -> {
|
|
|
- studentSet.add(SystemConstant.STUDENT + s.getStudentId());
|
|
|
- examActivityIdSet.add(s.getExamActivityId());
|
|
|
+ finalStudentSet.add(SystemConstant.STUDENT + s.getStudentId());
|
|
|
+ finalExamActivityIdSet.add(s.getExamActivityId());
|
|
|
});
|
|
|
allCount = studentSet.size();
|
|
|
}
|
|
|
|
|
|
- //获取已登录学生
|
|
|
- List<TEStudentCacheDto> teStudentCacheDto = (List<TEStudentCacheDto>) redisUtil.multiGet(studentSet);
|
|
|
- if (Objects.nonNull(teExamStudentList) && teExamStudentList.size() > 0) {
|
|
|
- loginCount = teStudentCacheDto.size();
|
|
|
+ if (Objects.nonNull(studentSet)) {
|
|
|
+ //获取已登录学生
|
|
|
+ List<TEStudentCacheDto> teStudentCacheDtoList = (List<TEStudentCacheDto>) redisUtil.multiGet(studentSet);
|
|
|
+ if (Objects.nonNull(teStudentCacheDtoList) && teStudentCacheDtoList.size() > 0) {
|
|
|
+ loginCount = teStudentCacheDtoList.stream().filter(s -> Objects.nonNull(s)).collect(Collectors.toList()).size();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- //获取已待考、考试中、已完成学生
|
|
|
- examActivityIdSet.forEach(s -> {
|
|
|
- Map<Long, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(s));
|
|
|
- if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
|
|
|
- objectMap.forEach((k, v) -> {
|
|
|
- Map<String, Object> recordIdObjectMap = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(k));
|
|
|
- if (Objects.nonNull(recordIdObjectMap) && recordIdObjectMap.size() > 0) {
|
|
|
- //客户端通讯状态
|
|
|
- WebsocketStatusEnum clientStatus = Objects.isNull(recordIdObjectMap.get("clientWebsocketStatus")) ? null : (WebsocketStatusEnum) recordIdObjectMap.get("clientWebsocketStatus");
|
|
|
- if (Objects.equals(clientStatus, WebsocketStatusEnum.OFF_LINE)) {
|
|
|
- clientCommunicationStatusCount.getAndSet(clientCommunicationStatusCount.get() + 1);
|
|
|
+ if (Objects.nonNull(examActivityIdSet)) {
|
|
|
+ //获取已待考、考试中、已完成学生
|
|
|
+ examActivityIdSet.forEach(s -> {
|
|
|
+ Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(s));
|
|
|
+ if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
|
|
|
+ objectMap.forEach((k, v) -> {
|
|
|
+ Map<String, Object> recordIdObjectMap = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(Long.parseLong(k)));
|
|
|
+ if (Objects.nonNull(recordIdObjectMap) && recordIdObjectMap.size() > 0) {
|
|
|
+ //客户端通讯状态
|
|
|
+ WebsocketStatusEnum clientStatus = Objects.isNull(recordIdObjectMap.get("clientWebsocketStatus")) ? null : (WebsocketStatusEnum) recordIdObjectMap.get("clientWebsocketStatus");
|
|
|
+ if (Objects.equals(clientStatus, WebsocketStatusEnum.OFF_LINE)) {
|
|
|
+ clientCommunicationStatusCount.getAndSet(clientCommunicationStatusCount.get() + 1);
|
|
|
+ }
|
|
|
+ //监控端通讯状态
|
|
|
+ MonitorStatusSourceEnum monitorStatus = Objects.isNull(recordIdObjectMap.get("monitorStatusSource")) ? null : (MonitorStatusSourceEnum) recordIdObjectMap.get("monitorStatusSource");
|
|
|
+ if (Objects.nonNull(monitorStatus) && Objects.equals(monitorStatus, MonitorStatusSourceEnum.STOP)) {
|
|
|
+ monitorStatusSourceCount.getAndSet(monitorStatusSourceCount.get() + 1);
|
|
|
+ }
|
|
|
}
|
|
|
- //监控端通讯状态
|
|
|
- MonitorStatusSourceEnum monitorStatus = Objects.isNull(recordIdObjectMap.get("monitorStatusSource")) ? null : (MonitorStatusSourceEnum) recordIdObjectMap.get("monitorStatusSource");
|
|
|
- if (Objects.nonNull(monitorStatus) && Objects.equals(monitorStatus, MonitorStatusSourceEnum.STOP)) {
|
|
|
- monitorStatusSourceCount.getAndSet(monitorStatusSourceCount.get() + 1);
|
|
|
+ ExamRecordStatusEnum examRecordStatusEnum = (ExamRecordStatusEnum) v;
|
|
|
+ //已待考
|
|
|
+ if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FIRST_PREPARE)) {
|
|
|
+ prepareCount.getAndSet(prepareCount.get() + 1);
|
|
|
}
|
|
|
- }
|
|
|
- ExamRecordStatusEnum examRecordStatusEnum = (ExamRecordStatusEnum) v;
|
|
|
- //已待考
|
|
|
- if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FIRST_PREPARE)) {
|
|
|
- prepareCount.getAndSet(prepareCount.get() + 1);
|
|
|
- }
|
|
|
- //考试中
|
|
|
- else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.ANSWERING) || Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.RESUME_PREPARE)) {
|
|
|
- examCount.getAndSet(examCount.get() + 1);
|
|
|
- }
|
|
|
- //已完成
|
|
|
- else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FINISHED) || Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.PERSISTED)) {
|
|
|
- alreadyComplete.getAndSet(alreadyComplete.get() + 1);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- });
|
|
|
+ //考试中
|
|
|
+ else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.ANSWERING) || Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.RESUME_PREPARE)) {
|
|
|
+ examCount.getAndSet(examCount.get() + 1);
|
|
|
+ }
|
|
|
+ //已完成
|
|
|
+ else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FINISHED) || Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.PERSISTED)) {
|
|
|
+ alreadyComplete.getAndSet(alreadyComplete.get() + 1);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
notComplete = allCount - alreadyComplete.get();
|
|
|
ExamPropCountDto examPropCountDto = new ExamPropCountDto(examId, allCount, loginCount, prepareCount.get(), examCount.get(), clientCommunicationStatusCount.get(), monitorStatusSourceCount.get(), alreadyComplete.get(), notComplete);
|
|
|
return ResultUtil.ok(examPropCountDto);
|