Browse Source

修改在线人数等从数据库获取

wangliang 4 năm trước cách đây
mục cha
commit
2bd3052c5f

+ 53 - 57
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamController.java

@@ -4,11 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.themis.business.annotation.ApiJsonObject;
 import com.qmth.themis.business.annotation.ApiJsonProperty;
-import com.qmth.themis.business.cache.ExamRecordCacheUtil;
-import com.qmth.themis.business.cache.RedisKeyHelper;
-import com.qmth.themis.business.cache.bean.ExamActivityRecordCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
-import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.AuthDto;
 import com.qmth.themis.business.dto.ExamPropCountDto;
@@ -474,60 +470,60 @@ public class TEExamController {
                 alreadyComplete = new HashSet<>();
                 //获取已待考、考试中、已完成学生
                 Set<Long> finalAlreadyComplete = alreadyComplete;
-                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);
-                            ExamActivityRecordCacheBean examActivityRecordCacheBean = (ExamActivityRecordCacheBean) v;
-                            ExamRecordStatusEnum examRecordStatusEnum = examActivityRecordCacheBean.getStatus();
-                            ExamStudentCacheBean examStudentCacheBean = teExamStudentService
-                                    .getExamStudentCacheBean(examActivityRecordCacheBean.getExamStudentId());
-                            if (Objects.nonNull(examStudentCacheBean)
-                                    && examStudentCacheBean.getEnable().intValue() == 1) {
-                                //客户端通讯状态
-                                WebsocketStatusEnum clientStatus = Objects
-                                        .isNull(ExamRecordCacheUtil.getClientWebsocketStatus(recordId)) ?
-                                        null :
-                                        ExamRecordCacheUtil.getClientWebsocketStatus(recordId);
-                                if (Objects
-                                        .nonNull(examRecordStatusEnum) && !Objects
-                                        .equals(examRecordStatusEnum, ExamRecordStatusEnum.PERSISTED) && !Objects
-                                        .equals(examRecordStatusEnum, ExamRecordStatusEnum.FINISHED)) {
-                                    if (Objects.nonNull(clientStatus) && Objects
-                                            .equals(clientStatus, WebsocketStatusEnum.OFF_LINE)) {
-                                        clientWebsocketStatusCount.getAndSet(clientWebsocketStatusCount.get() + 1);
-                                    }
-                                    //监控端通讯状态
-                                    if (Objects.nonNull(ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.CLIENT_CAMERA)) && Objects.equals(ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.CLIENT_CAMERA), MonitorStatusSourceEnum.STOP)) {
-                                        monitorStatusSourceCount.getAndSet(monitorStatusSourceCount.get() + 1);
-                                    } else if (Objects.nonNull(ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.CLIENT_SCREEN)) && Objects.equals(ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.CLIENT_SCREEN), MonitorStatusSourceEnum.STOP)) {
-                                        monitorStatusSourceCount.getAndSet(monitorStatusSourceCount.get() + 1);
-                                    } else if (Objects.nonNull(ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.MOBILE_FIRST)) && Objects.equals(ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.MOBILE_FIRST), MonitorStatusSourceEnum.STOP)) {
-                                        monitorStatusSourceCount.getAndSet(monitorStatusSourceCount.get() + 1);
-                                    } else if (Objects.nonNull(ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.MOBILE_SECOND)) && Objects.equals(ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.MOBILE_SECOND), MonitorStatusSourceEnum.STOP)) {
-                                        monitorStatusSourceCount.getAndSet(monitorStatusSourceCount.get() + 1);
-                                    }
-                                }
-                                //已待考
-                                if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FIRST_PREPARE) && Objects.nonNull(clientStatus) && Objects
-                                        .equals(clientStatus, WebsocketStatusEnum.ON_LINE)) {
-                                    prepareCount.getAndSet(prepareCount.get() + 1);
-                                }
-                                //考试中
-                                else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.ANSWERING) && Objects.nonNull(clientStatus) && Objects
-                                        .equals(clientStatus, WebsocketStatusEnum.ON_LINE)) {
-                                    examCount.getAndSet(examCount.get() + 1);
-                                }
-                                //已完成
-                                else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FINISHED) || Objects
-                                        .equals(examRecordStatusEnum, ExamRecordStatusEnum.PERSISTED)) {
-                                    finalAlreadyComplete.add(examActivityRecordCacheBean.getExamStudentId());
-                                }
-                            }
-                        });
+                QueryWrapper<TOeExamRecord> tOeExamRecordQueryWrapper = new QueryWrapper<>();
+                tOeExamRecordQueryWrapper.lambda().in(TOeExamRecord::getExamActivityId, examActivityIdSet);
+                List<TOeExamRecord> examRecordList = tOeExamRecordService.list(tOeExamRecordQueryWrapper);
+                examRecordList.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);
+//                            ExamActivityRecordCacheBean examActivityRecordCacheBean = (ExamActivityRecordCacheBean) v;
+                    ExamRecordStatusEnum examRecordStatusEnum = s.getStatus();
+//                            ExamStudentCacheBean examStudentCacheBean = teExamStudentService
+//                                    .getExamStudentCacheBean(examActivityRecordCacheBean.getExamStudentId());
+//                            if (Objects.nonNull(examStudentCacheBean)
+//                                    && examStudentCacheBean.getEnable().intValue() == 1) {
+                    //客户端通讯状态
+                    WebsocketStatusEnum clientStatus = Objects.isNull(s.getClientWebsocketStatus()) ? null : s.getClientWebsocketStatus();
+                    if (Objects
+                            .nonNull(examRecordStatusEnum) && !Objects
+                            .equals(examRecordStatusEnum, ExamRecordStatusEnum.PERSISTED) && !Objects
+                            .equals(examRecordStatusEnum, ExamRecordStatusEnum.FINISHED)) {
+                        if (Objects.nonNull(clientStatus) && Objects
+                                .equals(clientStatus, WebsocketStatusEnum.OFF_LINE)) {
+                            clientWebsocketStatusCount.getAndSet(clientWebsocketStatusCount.get() + 1);
+                        }
+                        //监控端通讯状态
+                        if (Objects.nonNull(s.getCameraMonitorStatus()) && Objects.equals(s.getCameraMonitorStatus(), MonitorStatusSourceEnum.STOP)) {
+                            monitorStatusSourceCount.getAndSet(monitorStatusSourceCount.get() + 1);
+                        } else if (Objects.nonNull(s.getScreenMonitorStatus()) && Objects.equals(s.getScreenMonitorStatus(), MonitorStatusSourceEnum.STOP)) {
+                            monitorStatusSourceCount.getAndSet(monitorStatusSourceCount.get() + 1);
+                        } else if (Objects.nonNull(s.getMobileFirstMonitorStatus()) && Objects.equals(s.getMobileFirstMonitorStatus(), MonitorStatusSourceEnum.STOP)) {
+                            monitorStatusSourceCount.getAndSet(monitorStatusSourceCount.get() + 1);
+                        } else if (Objects.nonNull(s.getMobileSecondMonitorStatus()) && Objects.equals(s.getMobileSecondMonitorStatus(), MonitorStatusSourceEnum.STOP)) {
+                            monitorStatusSourceCount.getAndSet(monitorStatusSourceCount.get() + 1);
+                        }
+                    }
+                    //已待考
+                    if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FIRST_PREPARE) && Objects.nonNull(clientStatus) && Objects
+                            .equals(clientStatus, WebsocketStatusEnum.ON_LINE)) {
+                        prepareCount.getAndSet(prepareCount.get() + 1);
+                    }
+                    //考试中
+                    else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.ANSWERING) && Objects.nonNull(clientStatus) && Objects
+                            .equals(clientStatus, WebsocketStatusEnum.ON_LINE)) {
+                        examCount.getAndSet(examCount.get() + 1);
+                    }
+                    //已完成
+                    else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FINISHED) || Objects
+                            .equals(examRecordStatusEnum, ExamRecordStatusEnum.PERSISTED)) {
+                        finalAlreadyComplete.add(s.getExamStudentId());
                     }
+//                            }
+//                        });
+//                    }
                 });
             }
             notComplete = allCount - alreadyComplete.size();

+ 23 - 18
themis-admin/src/main/java/com/qmth/themis/admin/api/TIeInvigilateController.java

@@ -9,9 +9,7 @@ import com.qmth.themis.business.annotation.ApiJsonObject;
 import com.qmth.themis.business.annotation.ApiJsonProperty;
 import com.qmth.themis.business.bean.admin.*;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
-import com.qmth.themis.business.cache.RedisKeyHelper;
 import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
-import com.qmth.themis.business.cache.bean.ExamActivityRecordCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.constant.SystemConstant;
@@ -653,9 +651,12 @@ public class TIeInvigilateController {
             examPropCountDto.setReexamCount(reexamCount);
         }
         if (Objects.nonNull(examActivityIdSet)) {
+            QueryWrapper<TOeExamRecord> tOeExamRecordQueryWrapper = new QueryWrapper<>();
+            tOeExamRecordQueryWrapper.lambda().in(TOeExamRecord::getExamActivityId, examActivityIdSet);
+            List<TOeExamRecord> examRecordList = tOeExamRecordService.list(tOeExamRecordQueryWrapper);
             //获取已待考、考试中学生
-            examActivityIdSet.forEach(s -> {
-                ExamActivityCacheBean examActivityCacheBean = teExamActivityService.getExamActivityCacheBean(s);
+            examRecordList.forEach(s -> {
+                ExamActivityCacheBean examActivityCacheBean = teExamActivityService.getExamActivityCacheBean(s.getExamActivityId());
                 Long startTime = examActivityCacheBean.getStartTime();
                 Long finishTime = examActivityCacheBean.getFinishTime();
                 Integer activityMaxDurationSeconds = Objects.nonNull(examActivityCacheBean.getMaxDurationSeconds()) ? examActivityCacheBean.getMaxDurationSeconds() : null;
@@ -672,21 +673,25 @@ public class TIeInvigilateController {
                 if (Objects.nonNull(examCacheBean.getForceFinish()) && examCacheBean.getForceFinish() == 1) {
                     examPropCountDto.setFinishTime(finishTime);
                 }
-                Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(s));
-                if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
-                    objectMap.forEach((k, v) -> {
-                        ExamActivityRecordCacheBean examActivityRecordCache = (ExamActivityRecordCacheBean) v;
-                        ExamRecordStatusEnum examRecordStatusEnum = examActivityRecordCache.getStatus();
-                        //已待考
-                        if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FIRST_PREPARE)) {
-                            prepareCount.getAndSet(prepareCount.get() + 1);
-                        }
-                        //考试中
-                        else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.ANSWERING)) {
-                            examCount.getAndSet(examCount.get() + 1);
-                        }
-                    });
+//                Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(s));
+//                if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
+//                    objectMap.forEach((k, v) -> {
+//                        ExamActivityRecordCacheBean examActivityRecordCache = (ExamActivityRecordCacheBean) v;
+//                        ExamRecordStatusEnum examRecordStatusEnum = examActivityRecordCache.getStatus();
+                ExamRecordStatusEnum examRecordStatusEnum = s.getStatus();
+                WebsocketStatusEnum clientStatus = Objects.isNull(s.getClientWebsocketStatus()) ? null : s.getClientWebsocketStatus();
+                //已待考
+                if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FIRST_PREPARE) && Objects.nonNull(clientStatus) && Objects
+                        .equals(clientStatus, WebsocketStatusEnum.ON_LINE)) {
+                    prepareCount.getAndSet(prepareCount.get() + 1);
                 }
+                //考试中
+                else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.ANSWERING) && Objects.nonNull(clientStatus) && Objects
+                        .equals(clientStatus, WebsocketStatusEnum.ON_LINE)) {
+                    examCount.getAndSet(examCount.get() + 1);
+                }
+//                    });
+//                }
 //                }
             });
         }

+ 1 - 0
themis-business/src/main/java/com/qmth/themis/business/service/impl/CommonServiceImpl.java

@@ -91,6 +91,7 @@ public class CommonServiceImpl implements CommonService {
             redisUtil.delete(RedisKeyHelper.faceVerifyCacheKey(recordId));
             //2021-03-01新增
             redisUtil.delete(RedisKeyHelper.studentPaperStructKey(recordId));
+            redisUtil.delete(RedisKeyHelper.examStudentCacheKey(examStudentId));
             //先查询之前的断点记录
             QueryWrapper<TOeExamBreakHistory> tOeExamBreakHistoryQueryWrapper = new QueryWrapper<>();
             tOeExamBreakHistoryQueryWrapper.lambda().eq(TOeExamBreakHistory::getExamRecordId, recordId);

+ 41 - 43
themis-business/src/main/java/com/qmth/themis/business/service/impl/TIeReportServiceImpl.java

@@ -5,21 +5,16 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.OrderItem;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.themis.business.bean.admin.*;
-import com.qmth.themis.business.cache.ExamRecordCacheUtil;
-import com.qmth.themis.business.cache.RedisKeyHelper;
 import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
-import com.qmth.themis.business.cache.bean.ExamActivityRecordCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.dao.*;
 import com.qmth.themis.business.entity.TBUser;
 import com.qmth.themis.business.entity.TEExam;
 import com.qmth.themis.business.entity.TEExamActivity;
+import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.*;
-import com.qmth.themis.business.service.TEExamActivityService;
-import com.qmth.themis.business.service.TEExamService;
-import com.qmth.themis.business.service.TEExamStudentService;
-import com.qmth.themis.business.service.TIeReportService;
+import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.ServletUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -74,6 +69,9 @@ public class TIeReportServiceImpl implements TIeReportService {
     @Resource
     TEExamStudentService teExamStudentService;
 
+    @Resource
+    TOeExamRecordService tOeExamRecordService;
+
     @Override
     public Map<String, Object> examView(Long orgId, Long examId, Long examActivityId, String roomCode, String courseCode,
                                         String name, String identity) {
@@ -428,49 +426,49 @@ public class TIeReportServiceImpl implements TIeReportService {
         AtomicReference<Integer> prepareCount = new AtomicReference<>(0);
 //        AtomicReference<Integer> orgExamingCount = new AtomicReference<>(0);
         Set<Long> examActivityIdSet = teExamActivityList.stream().map(TEExamActivity::getId).collect(Collectors.toSet());
-        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);
-                    ExamActivityRecordCacheBean examActivityRecordCacheBean = (ExamActivityRecordCacheBean) v;
-                    ExamRecordStatusEnum examRecordStatusEnum = examActivityRecordCacheBean.getStatus();
-                    ExamStudentCacheBean examStudentCacheBean = teExamStudentService
-                            .getExamStudentCacheBean(examActivityRecordCacheBean.getExamStudentId());
-                    if (Objects.nonNull(examStudentCacheBean)
-                            && examStudentCacheBean.getEnable().intValue() == 1) {
-                        //客户端通讯状态
-                        WebsocketStatusEnum clientStatus = Objects
-                                .isNull(ExamRecordCacheUtil.getClientWebsocketStatus(recordId)) ?
-                                null :
-                                ExamRecordCacheUtil.getClientWebsocketStatus(recordId);
-                        // 在线人数
-                        if (Objects
-                                .nonNull(examRecordStatusEnum) && !Objects
-                                .equals(examRecordStatusEnum, ExamRecordStatusEnum.PERSISTED) && !Objects
-                                .equals(examRecordStatusEnum, ExamRecordStatusEnum.FINISHED) && Objects.nonNull(clientStatus) && Objects
-                                .equals(clientStatus, WebsocketStatusEnum.ON_LINE)) {
-                            onlineCount.getAndSet(onlineCount.get() + 1);
-                        }
+        QueryWrapper<TOeExamRecord> tOeExamRecordQueryWrapper = new QueryWrapper<>();
+        tOeExamRecordQueryWrapper.lambda().in(TOeExamRecord::getExamActivityId, examActivityIdSet);
+        List<TOeExamRecord> examRecordList = tOeExamRecordService.list(tOeExamRecordQueryWrapper);
+        examRecordList.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);
+//                    ExamActivityRecordCacheBean examActivityRecordCacheBean = (ExamActivityRecordCacheBean) v;
+            ExamRecordStatusEnum examRecordStatusEnum = s.getStatus();
+            ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(s.getExamStudentId());
+            if (Objects.nonNull(examStudentCacheBean)
+                    && examStudentCacheBean.getEnable().intValue() == 1) {
+                //客户端通讯状态
+                WebsocketStatusEnum clientStatus = Objects.isNull(s.getClientWebsocketStatus()) ? null : s.getClientWebsocketStatus();
+                // 在线人数
+                if (Objects
+                        .nonNull(examRecordStatusEnum) && !Objects
+                        .equals(examRecordStatusEnum, ExamRecordStatusEnum.PERSISTED) && !Objects
+                        .equals(examRecordStatusEnum, ExamRecordStatusEnum.FINISHED) && Objects.nonNull(clientStatus) && Objects
+                        .equals(clientStatus, WebsocketStatusEnum.ON_LINE)) {
+                    onlineCount.getAndSet(onlineCount.get() + 1);
+                }
 //                        // 机构在考人数
 //                        if (Objects
 //                                .nonNull(examRecordStatusEnum) && Objects
 //                                .equals(examRecordStatusEnum, ExamRecordStatusEnum.ANSWERING)) {
 //                            orgExamingCount.getAndSet(orgExamingCount.get() + 1);
 //                        }
-                        //已待考
-                        if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FIRST_PREPARE)) {
-                            prepareCount.getAndSet(prepareCount.get() + 1);
-                        }
-                        // 考试人数
-                        else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.ANSWERING) && Objects.nonNull(clientStatus) && Objects
-                                .equals(clientStatus, WebsocketStatusEnum.ON_LINE)) {
-                            examingCount.getAndSet(examingCount.get() + 1);
-                        }
-                    }
-                });
+                //已待考
+                if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.FIRST_PREPARE) && Objects.nonNull(clientStatus) && Objects
+                        .equals(clientStatus, WebsocketStatusEnum.ON_LINE)) {
+                    prepareCount.getAndSet(prepareCount.get() + 1);
+                }
+                // 考试人数
+                else if (Objects.equals(examRecordStatusEnum, ExamRecordStatusEnum.ANSWERING) && Objects.nonNull(clientStatus) && Objects
+                        .equals(clientStatus, WebsocketStatusEnum.ON_LINE)) {
+                    examingCount.getAndSet(examingCount.get() + 1);
+                }
             }
+//                });
+//            }
         });
 //        Long onlineCount = tOeExamRecordMapper.getOnlineCount(orgId);
 //        if (onlineCount == null) {

+ 27 - 25
themis-task/src/main/java/com/qmth/themis/task/quartz/MqActivityJob.java

@@ -1,18 +1,16 @@
 package com.qmth.themis.task.quartz;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.qmth.themis.business.cache.ExamRecordCacheUtil;
-import com.qmth.themis.business.cache.RedisKeyHelper;
-import com.qmth.themis.business.cache.bean.ExamActivityRecordCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.entity.TEExam;
 import com.qmth.themis.business.entity.TEExamActivity;
+import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.ExamRecordStatusEnum;
 import com.qmth.themis.business.enums.FinishTypeEnum;
 import com.qmth.themis.business.service.TEExamActivityService;
 import com.qmth.themis.business.service.TEExamService;
 import com.qmth.themis.business.service.TEExamStudentService;
-import com.qmth.themis.business.util.RedisUtil;
+import com.qmth.themis.business.service.TOeExamRecordService;
 import org.quartz.JobExecutionContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -20,8 +18,9 @@ import org.springframework.scheduling.quartz.QuartzJobBean;
 
 import javax.annotation.Resource;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 非强制交卷activity任务
@@ -40,10 +39,10 @@ public class MqActivityJob extends QuartzJobBean {
     TEExamActivityService teExamActivityService;
 
     @Resource
-    RedisUtil redisUtil;
+    TEExamStudentService teExamStudentService;
 
     @Resource
-    TEExamStudentService teExamStudentService;
+    TOeExamRecordService tOeExamRecordService;
 
     @Override
     protected void executeInternal(JobExecutionContext context) {
@@ -59,26 +58,29 @@ public class MqActivityJob extends QuartzJobBean {
                         .eq(TEExamActivity::getExamId, exam.getId());
                 List<TEExamActivity> teExamActivityList = teExamActivityService.list(teExamActivityQueryWrapper);
                 if (Objects.nonNull(teExamActivityList) && teExamActivityList.size() > 0) {
-                    for (TEExamActivity teExamActivity : teExamActivityList) {
-                        Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(teExamActivity.getId()));
-                        if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
-                            objectMap.forEach((k, v) -> {
-                                ExamActivityRecordCacheBean examActivityRecordCacheBean = (ExamActivityRecordCacheBean) v;
-                                ExamRecordStatusEnum examRecordStatusEnum = examActivityRecordCacheBean.getStatus();
-                                //获取该考试批次下所有未交卷的考生的考试记录
-                                if (Objects.nonNull(examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
-                                    Long recordId = Long.parseLong(k);
-                                    Integer durationSeconds = ExamRecordCacheUtil.getDurationSeconds(recordId);
-                                    Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
-                                    ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
-                                    //交卷
-                                    teExamService.finish(examStudentCacheBean.getStudentId(), Long.parseLong(k), FinishTypeEnum.AUTO.name(), durationSeconds);
-                                }
-                            });
+                    Set<Long> examActivityIdSet = teExamActivityList.stream().map(s -> s.getId()).collect(Collectors.toSet());
+//                    for (TEExamActivity teExamActivity : teExamActivityList) {
+                    QueryWrapper<TOeExamRecord> tOeExamRecordQueryWrapper = new QueryWrapper<>();
+                    tOeExamRecordQueryWrapper.lambda().in(TOeExamRecord::getExamActivityId, examActivityIdSet);
+                    List<TOeExamRecord> examRecordList = tOeExamRecordService.list(tOeExamRecordQueryWrapper);
+//                        Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(teExamActivity.getId()));
+//                        if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
+                    examRecordList.forEach(s -> {
+//                        ExamActivityRecordCacheBean examActivityRecordCacheBean = (ExamActivityRecordCacheBean) v;
+                        ExamRecordStatusEnum examRecordStatusEnum = s.getStatus();
+                        //获取该考试批次下所有未交卷的考生的考试记录
+                        if (Objects.nonNull(examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
+//                            Long recordId = s.getId();
+                            Integer durationSeconds = s.getDurationSeconds();
+                            Long examStudentId = s.getExamStudentId();
+                            ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
+                            //交卷
+                            teExamService.finish(examStudentCacheBean.getStudentId(), s.getId(), FinishTypeEnum.AUTO.name(), durationSeconds);
                         }
-                    }
+                    });
+//                    }
                 }
             }
         }
     }
-}
+}

+ 26 - 26
themis-task/src/main/java/com/qmth/themis/task/quartz/service/impl/QuartzLogicServiceImpl.java

@@ -1,18 +1,17 @@
 package com.qmth.themis.task.quartz.service.impl;
 
-import com.qmth.themis.business.cache.ExamActivityRecordCacheUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
-import com.qmth.themis.business.cache.RedisKeyHelper;
 import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
-import com.qmth.themis.business.cache.bean.ExamActivityRecordCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
+import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.ExamRecordStatusEnum;
 import com.qmth.themis.business.enums.FinishTypeEnum;
 import com.qmth.themis.business.service.TEExamActivityService;
 import com.qmth.themis.business.service.TEExamService;
 import com.qmth.themis.business.service.TEExamStudentService;
-import com.qmth.themis.business.util.RedisUtil;
+import com.qmth.themis.business.service.TOeExamRecordService;
 import com.qmth.themis.task.quartz.service.QuartzLogicService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -20,7 +19,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.Map;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -41,10 +40,10 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
     TEExamService teExamService;
 
     @Resource
-    RedisUtil redisUtil;
+    TEExamStudentService teExamStudentService;
 
     @Resource
-    TEExamStudentService teExamStudentService;
+    TOeExamRecordService tOeExamRecordService;
 
     /**
      * 考试场次quartz逻辑
@@ -60,22 +59,25 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
         ExamCacheBean examCacheBean = teExamService.getExamCacheBean(examActivityCacheBean.getExamId());
         if (Objects.nonNull(examCacheBean) && examCacheBean.getEnable() == 1 && Objects.nonNull(examActivityCacheBean) && examActivityCacheBean.getEnable() == 1) {
             Integer forceFinish = examCacheBean.getForceFinish();
-            Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(examActivityCacheBean.getId()));
+            QueryWrapper<TOeExamRecord> tOeExamRecordQueryWrapper = new QueryWrapper<>();
+            tOeExamRecordQueryWrapper.lambda().eq(TOeExamRecord::getExamActivityId, examActivityCacheBean.getId());
+            List<TOeExamRecord> examRecordList = tOeExamRecordService.list(tOeExamRecordQueryWrapper);
+//            Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(examActivityCacheBean.getId()));
             if (Objects.nonNull(forceFinish) && forceFinish.intValue() == 1) {//强制收卷
-                if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
-                    objectMap.forEach((k, v) -> {
-                        ExamActivityRecordCacheBean examActivityRecordCacheBean = (ExamActivityRecordCacheBean) v;
-                        ExamRecordStatusEnum examRecordStatusEnum = examActivityRecordCacheBean.getStatus();
+                if (Objects.nonNull(examRecordList) && examRecordList.size() > 0) {
+                    examRecordList.forEach(s -> {
+//                        ExamActivityRecordCacheBean examActivityRecordCacheBean = (ExamActivityRecordCacheBean) v;
+                        ExamRecordStatusEnum examRecordStatusEnum = s.getStatus();
                         //获取该考试批次下所有未交卷的考生的考试记录
                         if (Objects.nonNull(examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)) {
-                            Long recordId = Long.parseLong(k);
-                            Long recordEndTime = ExamRecordCacheUtil.getEndTime(recordId);
+//                            Long recordId = Long.parseLong(k);
+                            Long recordEndTime = s.getEndTime();
                             if (Objects.nonNull(examActivityCacheBean.getFinishTime()) && Objects.nonNull(recordEndTime) && examActivityCacheBean.getFinishTime().longValue() == recordEndTime.longValue()) {
-                                Integer durationSeconds = ExamRecordCacheUtil.getDurationSeconds(recordId);
-                                Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
+                                Integer durationSeconds = s.getDurationSeconds();
+                                Long examStudentId = s.getExamStudentId();
                                 ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
                                 //交卷
-                                teExamService.finish(examStudentCacheBean.getStudentId(), Long.parseLong(k), FinishTypeEnum.AUTO.name(), durationSeconds);
+                                teExamService.finish(examStudentCacheBean.getStudentId(), s.getId(), FinishTypeEnum.AUTO.name(), durationSeconds);
                                 // 清除缓存
 //                                ExamActivityRecordCacheUtil.removeActivityRecordCache(ExamRecordCacheUtil.getExamActivityId(recordId), recordId);
                             }
@@ -83,20 +85,18 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
                     });
                 }
             } else {
-                if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
-                    objectMap.forEach((k, v) -> {
-                        ExamActivityRecordCacheBean examActivityRecordCacheBean = (ExamActivityRecordCacheBean) v;
-                        ExamRecordStatusEnum examRecordStatusEnum = examActivityRecordCacheBean.getStatus();
+                if (Objects.nonNull(examRecordList) && examRecordList.size() > 0) {
+                    examRecordList.forEach(s -> {
+                        ExamRecordStatusEnum examRecordStatusEnum = s.getStatus();
                         //获取该考试批次下所有未交卷的考生的考试记录
                         if (Objects.nonNull(examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
-                            Long recordId = Long.parseLong(k);
-                            Long recordEndTime = ExamRecordCacheUtil.getEndTime(recordId);
+                            Long recordEndTime = s.getEndTime();
                             if (Objects.nonNull(examActivityCacheBean.getFinishTime()) && Objects.nonNull(recordEndTime) && examActivityCacheBean.getFinishTime().longValue() == recordEndTime.longValue()) {
-                                Integer durationSeconds = ExamRecordCacheUtil.getDurationSeconds(recordId);
-                                Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
+                                Integer durationSeconds = s.getDurationSeconds();
+                                Long examStudentId = s.getExamStudentId();
                                 ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
                                 //交卷
-                                teExamService.finish(examStudentCacheBean.getStudentId(), Long.parseLong(k), FinishTypeEnum.AUTO.name(), durationSeconds);
+                                teExamService.finish(examStudentCacheBean.getStudentId(), s.getId(), FinishTypeEnum.AUTO.name(), durationSeconds);
                                 // 清除缓存
 //                                ExamActivityRecordCacheUtil.removeActivityRecordCache(ExamRecordCacheUtil.getExamActivityId(recordId), recordId);
                             }