|
@@ -369,81 +369,84 @@ public class TEExamController {
|
|
|
}
|
|
|
if (authDto.getRoleCodes().toString().contains(RoleEnum.INVIGILATE.name()) && (Objects.isNull(roomCodeSet) || roomCodeSet.size() == 0)) {
|
|
|
throw new BusinessException("当前监考老师未设置任何监考考场");
|
|
|
- } else if (Objects.isNull(roomCodeSet) || roomCodeSet.size() == 0) {
|
|
|
- throw new BusinessException("当前考试批次未设置任何监考考场");
|
|
|
- }
|
|
|
- //根据roomCode获取当前老师所要监考的全部应考学生数
|
|
|
- QueryWrapper<TEExamStudent> teExamStudentQueryWrapper = new QueryWrapper<>();
|
|
|
- teExamStudentQueryWrapper.lambda().in(TEExamStudent::getRoomCode, roomCodeSet);
|
|
|
- List<TEExamStudent> teExamStudentList = teExamStudentService.list(teExamStudentQueryWrapper);
|
|
|
- Set<String> studentSet = null;
|
|
|
- Set<Long> examActivityIdSet = null;
|
|
|
- Integer allCount = 0;
|
|
|
- AtomicReference<Integer> prepareCount = new AtomicReference<>(0);
|
|
|
- AtomicReference<Integer> examCount = new AtomicReference<>(0);
|
|
|
- AtomicReference<Integer> clientWebsocketStatusCount = new AtomicReference<>(0);
|
|
|
- AtomicReference<Integer> monitorStatusSourceCount = new AtomicReference<>(0);
|
|
|
- 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 -> {
|
|
|
- finalStudentSet.add(SystemConstant.STUDENT + s.getStudentId());
|
|
|
- finalExamActivityIdSet.add(s.getExamActivityId());
|
|
|
- });
|
|
|
- allCount = studentSet.size();
|
|
|
}
|
|
|
+ ExamPropCountDto examPropCountDto = null;
|
|
|
+ if (Objects.nonNull(roomCodeSet) && roomCodeSet.size() > 0) {
|
|
|
+ //根据roomCode获取当前老师所要监考的全部应考学生数
|
|
|
+ QueryWrapper<TEExamStudent> teExamStudentQueryWrapper = new QueryWrapper<>();
|
|
|
+ teExamStudentQueryWrapper.lambda().in(TEExamStudent::getRoomCode, roomCodeSet);
|
|
|
+ List<TEExamStudent> teExamStudentList = teExamStudentService.list(teExamStudentQueryWrapper);
|
|
|
+ Set<String> studentSet = null;
|
|
|
+ Set<Long> examActivityIdSet = null;
|
|
|
+ Integer allCount = 0;
|
|
|
+ AtomicReference<Integer> prepareCount = new AtomicReference<>(0);
|
|
|
+ AtomicReference<Integer> examCount = new AtomicReference<>(0);
|
|
|
+ AtomicReference<Integer> clientWebsocketStatusCount = new AtomicReference<>(0);
|
|
|
+ AtomicReference<Integer> monitorStatusSourceCount = new AtomicReference<>(0);
|
|
|
+ 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 -> {
|
|
|
+ finalStudentSet.add(SystemConstant.STUDENT + s.getStudentId());
|
|
|
+ finalExamActivityIdSet.add(s.getExamActivityId());
|
|
|
+ });
|
|
|
+ allCount = studentSet.size();
|
|
|
+ }
|
|
|
|
|
|
- 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) -> {
|
|
|
- Long recordId = Long.parseLong(k);
|
|
|
- //客户端通讯状态
|
|
|
- WebsocketStatusEnum clientStatus = Objects.isNull(ExamRecordCacheUtil.getClientWebsocketStatus(recordId)) ? null : ExamRecordCacheUtil.getClientWebsocketStatus(recordId);
|
|
|
- if (Objects.nonNull(clientStatus) && Objects.equals(clientStatus, WebsocketStatusEnum.OFF_LINE)) {
|
|
|
- clientWebsocketStatusCount.getAndSet(clientWebsocketStatusCount.get() + 1);
|
|
|
- }
|
|
|
- //监控端通讯状态
|
|
|
- MonitorVideoSourceEnum source = null;
|
|
|
- if (Objects.nonNull(ExamRecordCacheUtil.getMonitorLiveUrlClientCamera(recordId))) {
|
|
|
- source = MonitorVideoSourceEnum.CLIENT_CAMERA;
|
|
|
- } else if (Objects.nonNull(ExamRecordCacheUtil.getMonitorLiveUrlClientScreen(recordId))) {
|
|
|
- source = MonitorVideoSourceEnum.CLIENT_SCREEN;
|
|
|
- } else if (Objects.nonNull(ExamRecordCacheUtil.getMonitorLiveUrlMobileFirst(recordId))) {
|
|
|
- source = MonitorVideoSourceEnum.MOBILE_FIRST;
|
|
|
- } else if (Objects.nonNull(ExamRecordCacheUtil.getMonitorLiveUrlMobileSecond(recordId))) {
|
|
|
- source = MonitorVideoSourceEnum.MOBILE_SECOND;
|
|
|
- }
|
|
|
- MonitorStatusSourceEnum status = Objects.isNull(source) ? null : ExamRecordCacheUtil.getMonitorStatus(recordId, source.name());
|
|
|
- if (Objects.nonNull(status) && Objects.equals(status, MonitorStatusSourceEnum.STOP)) {
|
|
|
- monitorStatusSourceCount.getAndSet(monitorStatusSourceCount.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);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- });
|
|
|
+ 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) -> {
|
|
|
+ Long recordId = Long.parseLong(k);
|
|
|
+ //客户端通讯状态
|
|
|
+ WebsocketStatusEnum clientStatus = Objects.isNull(ExamRecordCacheUtil.getClientWebsocketStatus(recordId)) ? null : ExamRecordCacheUtil.getClientWebsocketStatus(recordId);
|
|
|
+ if (Objects.nonNull(clientStatus) && Objects.equals(clientStatus, WebsocketStatusEnum.OFF_LINE)) {
|
|
|
+ clientWebsocketStatusCount.getAndSet(clientWebsocketStatusCount.get() + 1);
|
|
|
+ }
|
|
|
+ //监控端通讯状态
|
|
|
+ MonitorVideoSourceEnum source = null;
|
|
|
+ if (Objects.nonNull(ExamRecordCacheUtil.getMonitorLiveUrlClientCamera(recordId))) {
|
|
|
+ source = MonitorVideoSourceEnum.CLIENT_CAMERA;
|
|
|
+ } else if (Objects.nonNull(ExamRecordCacheUtil.getMonitorLiveUrlClientScreen(recordId))) {
|
|
|
+ source = MonitorVideoSourceEnum.CLIENT_SCREEN;
|
|
|
+ } else if (Objects.nonNull(ExamRecordCacheUtil.getMonitorLiveUrlMobileFirst(recordId))) {
|
|
|
+ source = MonitorVideoSourceEnum.MOBILE_FIRST;
|
|
|
+ } else if (Objects.nonNull(ExamRecordCacheUtil.getMonitorLiveUrlMobileSecond(recordId))) {
|
|
|
+ source = MonitorVideoSourceEnum.MOBILE_SECOND;
|
|
|
+ }
|
|
|
+ MonitorStatusSourceEnum status = Objects.isNull(source) ? null : ExamRecordCacheUtil.getMonitorStatus(recordId, source.name());
|
|
|
+ if (Objects.nonNull(status) && Objects.equals(status, MonitorStatusSourceEnum.STOP)) {
|
|
|
+ monitorStatusSourceCount.getAndSet(monitorStatusSourceCount.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);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ notComplete = allCount - alreadyComplete.get();
|
|
|
+ BigDecimal completionRate = new BigDecimal(alreadyComplete.get()).divide(new BigDecimal(allCount)).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ examPropCountDto = new ExamPropCountDto(examId, allCount, prepareCount.get(), examCount.get(), clientWebsocketStatusCount.get(), monitorStatusSourceCount.get(), alreadyComplete.get(), notComplete, completionRate);
|
|
|
+ } else {
|
|
|
+ examPropCountDto = new ExamPropCountDto(examId, 0, 0, 0, 0, 0, 0, 0, new BigDecimal(0));
|
|
|
}
|
|
|
- notComplete = allCount - alreadyComplete.get();
|
|
|
- BigDecimal completionRate = new BigDecimal(alreadyComplete.get()).divide(new BigDecimal(allCount)).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
- ExamPropCountDto examPropCountDto = new ExamPropCountDto(examId, allCount, prepareCount.get(), examCount.get(), clientWebsocketStatusCount.get(), monitorStatusSourceCount.get(), alreadyComplete.get(), notComplete, completionRate);
|
|
|
return ResultUtil.ok(examPropCountDto);
|
|
|
}
|
|
|
|