Browse Source

Merge branch 'dev'
111

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

+ 6 - 7
themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamActivityController.java

@@ -3,7 +3,6 @@ package com.qmth.themis.backend.api;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.themis.business.base.BasePage;
-import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.response.TEExamActivityQueryDto;
 import com.qmth.themis.business.entity.TBUser;
@@ -81,15 +80,15 @@ public class TEExamActivityController {
             examId = teExamActivityList.get(0).getExamId();
             teExamActivityService.saveOrUpdateBatch(teExamActivityList);
             TEExam teExam = teExamService.getById(teExamActivityList.get(0).getExamId());
-            //新增quartz任务,发送mq消息start
-            Map<String, Object> prop = new HashMap<>();
-            prop.put("oper", "insert");
-            prop.put("exam", teExam);
-            if (Objects.nonNull(teExamActivityList.get(0)) && teExamActivityList.get(0).getEnable() == 1) {
+            if (Objects.nonNull(teExam.getForceFinish()) && teExam.getForceFinish().intValue() == 1) {
+                //新增quartz任务,发送mq消息start
+                Map<String, Object> prop = new HashMap<>();
+                prop.put("oper", "insert");
+                prop.put("exam", teExam);
                 MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_ACTIVITY.name(), JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY, String.valueOf(teExam.getId()), prop, tbUser.getName());
                 mqDtoService.assembleSendOneWayMsg(mqDto);
+                //新增quartz任务,发送mq消息end
             }
-            //新增quartz任务,发送mq消息end
             teExamActivityList.forEach(s -> {
                 teExamActivityService.updateExamActivityCacheBean(s.getId());
             });

+ 14 - 13
themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamController.java

@@ -8,7 +8,6 @@ import com.qmth.themis.business.annotation.ApiJsonProperty;
 import com.qmth.themis.business.base.BasePage;
 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.constant.SystemConstant;
 import com.qmth.themis.business.dto.AuthDto;
 import com.qmth.themis.business.dto.ExamPropCountDto;
@@ -148,13 +147,15 @@ public class TEExamController {
                         s.setUpdateId(tbUser.getId());
                     });
                     teExamActivityService.saveOrUpdateBatch(teExamActivityList);
-                    //新增quartz任务,发送mq消息start
-                    Map<String, Object> prop = new HashMap<>();
-                    prop.put("oper", "insert");
-                    prop.put("exam", teExam);
-                    MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_ACTIVITY.name(), JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY, String.valueOf(teExam.getId()), prop, tbUser.getName());
-                    mqDtoService.assembleSendOneWayMsg(mqDto);
-                    //新增quartz任务,发送mq消息end
+                    if (Objects.nonNull(teExam.getForceFinish()) && teExam.getForceFinish().intValue() == 1) {
+                        //新增quartz任务,发送mq消息start
+                        Map<String, Object> prop = new HashMap<>();
+                        prop.put("oper", "insert");
+                        prop.put("exam", teExam);
+                        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_ACTIVITY.name(), JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY, String.valueOf(teExam.getId()), prop, tbUser.getName());
+                        mqDtoService.assembleSendOneWayMsg(mqDto);
+                        //新增quartz任务,发送mq消息end
+                    }
                     teExamActivityList.forEach(s -> {
                         teExamActivityService.updateExamActivityCacheBean(s.getId());
                     });
@@ -165,11 +166,11 @@ public class TEExamController {
                     teExamActivity.setEnable(1);
                     teExamActivityService.saveOrUpdate(teExamActivity);
 
-                    //新增quartz任务,发送mq消息start
-                    Map<String, Object> prop = new HashMap<>();
-                    prop.put("oper", "insert");
-                    prop.put("exam", teExam);
-                    if (Objects.nonNull(teExamActivity) && teExamActivity.getEnable() == 1) {
+                    if (Objects.nonNull(teExam.getForceFinish()) && teExam.getForceFinish().intValue() == 1 && Objects.nonNull(teExamActivity) && teExamActivity.getEnable().intValue() == 1) {
+                        //新增quartz任务,发送mq消息start
+                        Map<String, Object> prop = new HashMap<>();
+                        prop.put("oper", "insert");
+                        prop.put("exam", teExam);
                         MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_ACTIVITY.name(), JacksonUtil.parseJson(Arrays.asList(teExamActivity)), MqTagEnum.EXAM_ACTIVITY, String.valueOf(teExam.getId()), prop, tbUser.getName());
                         mqDtoService.assembleSendOneWayMsg(mqDto);
                     }

+ 7 - 0
themis-business/src/main/java/com/qmth/themis/business/cache/ExamRecordCacheUtil.java

@@ -371,4 +371,11 @@ public class ExamRecordCacheUtil {
             examRecordService.dataUpdateMq(recordId, ExamRecordFieldEnum.force_finish.name(), forceFinish);
         }
     }
+
+    public static void setLastPrepareTime(Long recordId, Date date, boolean update) {
+        redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.last_prepare_time.getCode(), date);
+        if (update) {
+            examRecordService.dataUpdateMq(recordId, ExamRecordFieldEnum.last_prepare_time.name(), date, 1);
+        }
+    }
 }

+ 2 - 2
themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java

@@ -124,7 +124,7 @@ public class SystemConstant {
      */
     public static final int CONSUME_MESSAGE_BATCH_MAX_SIZE = 10;
     public static final int MAXRECONSUMETIMES = 3;
-//    public static final String MQDTO_OBJ = "mqDtoObj";
+    //    public static final String MQDTO_OBJ = "mqDtoObj";
     public static final long MESSAGE_TIMEOUT = 3000L;
     public static List<String> mqDelayLevelList = null;
     public static final String delayLevel = "1s,5s,10s,30s,1m,2m,3m,4m,5m,6m,7m,8m,9m,10m,20m,30m,1h,2h";
@@ -151,7 +151,7 @@ public class SystemConstant {
     public static final String WEBSOCKET_OE_ONLINE_COUNT = "websocket:oe:online:count";
     public static final String WEBSOCKET_ADMIN_ONLINE_COUNT = "websocket:admin:online:count";
     public static final String GET = "get";
-        public static final long WEBSOCKET_MAX_TIME_OUT = 1 * 60 * 1000;
+    public static final long WEBSOCKET_MAX_TIME_OUT = 1 * 60 * 1000;
     public static final String ACK_MESSAGE = "ackMessage";
     /**
      * 缓存配置

+ 76 - 11
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java

@@ -89,10 +89,13 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
 
     @Resource
     private TBTaskHistoryService tbTaskHistoryService;
-    
+
     @Resource
     TEExamPaperService examPaperService;
 
+    @Resource
+    TEExamService teExamService;
+
     /**
      * 查询考试批次
      *
@@ -188,7 +191,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
             throw new BusinessException("考生Id和当前登录用户不一致");
         }
         ExamCacheBean examCache = getExamCacheBean(es.getExamId());
-        Long unFinishedRecordId=ExamingDataCacheUtil.getUnFinishedRecordId(studentId);
+        Long unFinishedRecordId = ExamingDataCacheUtil.getUnFinishedRecordId(studentId);
         if (unFinishedRecordId != null) {
             Long recordId = unFinishedRecordId;
             if (examStudentId.equals(ExamRecordCacheUtil.getExamStudentId(recordId))) {//当前考生已存在候考的考试记录
@@ -292,7 +295,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         redisUtil.set(RedisKeyHelper.examStudentCacheKey(examStudentId), es);
         //更新场次-考试记录缓存
         ExamActivityRecordCacheUtil.setExamRecordStatus(activityId, recordId, ExamRecordCacheUtil.getStatus(recordId));
-        ExamingDataCacheUtil.setUnFinishedRecordId(studentId,recordId);
+        ExamingDataCacheUtil.setUnFinishedRecordId(studentId, recordId);
         //mq发送消息start
         TEStudentCacheDto teStudentCacheDto = (TEStudentCacheDto) redisUtil.getStudent(studentId);
         MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.FIRST_PREPARE, MqTagEnum.STUDENT, String.valueOf(teStudentCacheDto.getId()), teStudentCacheDto.getIdentity());
@@ -383,6 +386,46 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
             throw new BusinessException("未找到试卷");
         }
 
+        WebsocketStatusEnum websocketStatusEnum = ExamRecordCacheUtil.getClientWebsocketStatus(recordId);
+        if (Objects.isNull(websocketStatusEnum) || Objects.equals(WebsocketStatusEnum.OFF_LINE, websocketStatusEnum)) {
+            throw new BusinessException("客户端网络离线");
+        }
+        MonitorStatusSourceEnum clientCameraStatus = ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.CLIENT_CAMERA.name());
+        if (Objects.nonNull(clientCameraStatus) || Objects.equals(MonitorStatusSourceEnum.STOP, clientCameraStatus)) {
+            throw new BusinessException("客户端摄像头离线");
+        }
+        MonitorStatusSourceEnum clientScreenStatus = ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.CLIENT_SCREEN.name());
+        if (Objects.nonNull(clientScreenStatus) || Objects.equals(MonitorStatusSourceEnum.STOP, clientScreenStatus)) {
+            throw new BusinessException("客户端屏幕离线");
+        }
+        MonitorStatusSourceEnum mobileFirstStatus = ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.MOBILE_FIRST.name());
+        if (Objects.nonNull(mobileFirstStatus) || Objects.equals(MonitorStatusSourceEnum.STOP, mobileFirstStatus)) {
+            throw new BusinessException("移动端第一机位离线");
+        }
+        MonitorStatusSourceEnum mobileSecondStatus = ExamRecordCacheUtil.getMonitorStatus(recordId, MonitorVideoSourceEnum.MOBILE_SECOND.name());
+        if (Objects.nonNull(mobileSecondStatus) || Objects.equals(MonitorStatusSourceEnum.STOP, mobileSecondStatus)) {
+            throw new BusinessException("移动端第二机位离线");
+        }
+
+        Long examId = ExamRecordCacheUtil.getExamId(recordId);
+        ExamCacheBean ec = teExamService.getExamCacheBean(examId);//考试缓存
+        ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
+        Integer durationSeconds = Objects.isNull(ExamRecordCacheUtil.getDurationSeconds(recordId)) ? 0 : ExamRecordCacheUtil.getDurationSeconds(recordId);
+        //获取断点时间
+        Date lastBreakTime = ExamRecordCacheUtil.getLastBreakTime(recordId);
+        //获取剩余断点次数
+        Integer alreadyBreakCount = Objects.isNull(ExamRecordCacheUtil.getAlreadyBreakCount(recordId)) ? 0 : ExamRecordCacheUtil.getAlreadyBreakCount(recordId);
+        Integer leftBreakResumeCount = ec.getBreakResumeCount() - alreadyBreakCount;
+        Integer breakExpireSeconds = Objects.isNull(ec.getBreakExpireSeconds()) ? 0 : ec.getBreakExpireSeconds();
+        //如果断点时间大于整体断点时间,则强制交卷
+        if (Objects.nonNull(lastBreakTime) && (System.currentTimeMillis() - lastBreakTime.getTime()) / 1000 > breakExpireSeconds) {
+            teExamService.finish(examStudentCacheBean.getStudentId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
+        } else {
+            //如果断点次数小于0,也强制交卷
+            if (leftBreakResumeCount < 0) {
+                teExamService.finish(examStudentCacheBean.getStudentId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
+            }
+        }
         ret = new ExamStartBean();
         ret.setPaperDecryptSecret(ep.getDecryptSecret());
         ret.setPaperDecryptVector(ep.getDecryptVector());
@@ -391,8 +434,10 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         Date firstStartTime = new Date();
         ExamRecordCacheUtil.setFirstStartTime(recordId, firstStartTime, false);
         ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.ANSWERING, false);
-        String[] columns = new String[]{ExamRecordFieldEnum.first_start_time.name(), ExamRecordFieldEnum.status.name()};
-        Object[] values = new Object[]{firstStartTime, ExamRecordStatusEnum.ANSWERING};
+        Date lastStartTime = new Date();
+        ExamRecordCacheUtil.setLastStartTime(recordId, lastStartTime, false);
+        String[] columns = new String[]{ExamRecordFieldEnum.first_start_time.name(), ExamRecordFieldEnum.status.name(), ExamRecordFieldEnum.last_start_time.name()};
+        Object[] values = new Object[]{firstStartTime, ExamRecordStatusEnum.ANSWERING, lastStartTime};
         toeExamRecordService.dataUpdatesMq(recordId, columns, values);
         //更新场次-考试记录缓存
         ExamActivityRecordCacheUtil.setExamRecordStatus(activityId, recordId, ExamRecordCacheUtil.getStatus(recordId));
@@ -467,8 +512,8 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
             answerCache.setAnswer(answer);
             answerCache.setVersion(version);
             answerCache.setDurationSeconds(durationSeconds);
-        	answerCache.setObjective(checkIsObjective(ExamRecordCacheUtil.getPaperId(recordId), mainNumber, subNumber, subIndex));
-            	
+            answerCache.setObjective(checkIsObjective(ExamRecordCacheUtil.getPaperId(recordId), mainNumber, subNumber, subIndex));
+
         } else {
             if (version.longValue() > answerCache.getVersion().longValue()) {
                 answerCache.setAnswer(answer);
@@ -482,18 +527,18 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         redisUtil.set(RedisKeyHelper.examAnswerKey(recordId),
                 RedisKeyHelper.examAnswerHashKey(mainNumber, subNumber, subIndex), answerCache);
         // 如果是客观题,重置考试记录客观题得分
-        if(answerCache.getObjective()) {
-        	ExamRecordCacheUtil.setObjectiveScore(recordId, null, false);
+        if (answerCache.getObjective()) {
+            ExamRecordCacheUtil.setObjectiveScore(recordId, null, false);
             // 发消息计算客观分
             calculateObjectiveScore(recordId, mainNumber, subNumber, subIndex);
         }
-        
+
         AnswerSubmitBean ret = new AnswerSubmitBean();
         ret.setVersion(version);
 
         return ret;
     }
-    
+
     private boolean checkIsObjective(Long paperId, Integer mainNumber, Integer subNumber, Integer subIndex) {
         Map<String, ObjectiveAnswerCacheBean> map = examPaperService.getObjectiveAnswerCacheBean(paperId);
         if (map == null || map.size() == 0) {
@@ -633,6 +678,25 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         if (ExamRecordStatusEnum.FINISHED.equals(sta) || ExamRecordStatusEnum.PERSISTED.equals(sta)) {
             throw new BusinessException("该考试已结束");
         }
+        Long examId = ExamRecordCacheUtil.getExamId(recordId);
+        ExamCacheBean ec = teExamService.getExamCacheBean(examId);//考试缓存
+        ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
+        Integer durationSeconds = Objects.isNull(ExamRecordCacheUtil.getDurationSeconds(recordId)) ? 0 : ExamRecordCacheUtil.getDurationSeconds(recordId);
+        //获取断点时间
+        Date lastBreakTime = ExamRecordCacheUtil.getLastBreakTime(recordId);
+        //获取剩余断点次数
+        Integer alreadyBreakCount = Objects.isNull(ExamRecordCacheUtil.getAlreadyBreakCount(recordId)) ? 0 : ExamRecordCacheUtil.getAlreadyBreakCount(recordId);
+        Integer leftBreakResumeCount = ec.getBreakResumeCount() - alreadyBreakCount;
+        Integer breakExpireSeconds = Objects.isNull(ec.getBreakExpireSeconds()) ? 0 : ec.getBreakExpireSeconds();
+        //如果断点时间大于整体断点时间,则强制交卷
+        if (Objects.nonNull(lastBreakTime) && (System.currentTimeMillis() - lastBreakTime.getTime()) / 1000 > breakExpireSeconds) {
+            teExamService.finish(examStudentCacheBean.getStudentId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
+        } else {
+            //如果断点次数小于0,也强制交卷
+            if (leftBreakResumeCount < 0) {
+                teExamService.finish(examStudentCacheBean.getStudentId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
+            }
+        }
 
         ExamResumeBean ret = new ExamResumeBean();
         ret.setDurationSeconds(ExamRecordCacheUtil.getDurationSeconds(recordId));
@@ -659,6 +723,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         if (audioLeftPlayCounts != null && audioLeftPlayCounts.size() > 0) {
             ret.setAudioLeftPlayCount(audioLeftPlayCounts);
         }
+        ExamRecordCacheUtil.setLastPrepareTime(recordId, new Date(), true);
         return ret;
     }
 

+ 1 - 0
themis-exam/src/main/java/com/qmth/themis/exam/websocket/WebSocketOeServer.java

@@ -182,6 +182,7 @@ public class WebSocketOeServer implements Concurrently {
                 mqDtoService.assembleSendAsyncDelayMsg(mqDto);
                 //发送延时mq消息end
             } else {
+                log.info("正常退出");
                 Long ecExamId = ExamRecordCacheUtil.getExamId(recordId);
                 Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
                 TEExamStudentService teExamStudentService = SpringContextHolder.getBean(TEExamStudentService.class);

+ 6 - 18
themis-task/src/main/java/com/qmth/themis/task/listener/service/impl/MqTaskLogicServiceImpl.java

@@ -4,15 +4,14 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.google.gson.Gson;
-import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
+import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.entity.TEExam;
 import com.qmth.themis.business.entity.TEExamActivity;
 import com.qmth.themis.business.entity.TMRocketMessage;
 import com.qmth.themis.business.service.TMRocketMessageService;
 import com.qmth.themis.business.util.JacksonUtil;
 import com.qmth.themis.business.util.RedisUtil;
-import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.task.enums.QuartzTaskEnum;
 import com.qmth.themis.task.listener.service.MqTaskLogicService;
 import com.qmth.themis.task.quartz.ExamActivityJob;
@@ -79,23 +78,12 @@ public class MqTaskLogicServiceImpl implements MqTaskLogicService {
             if (Objects.equals("delete", oper)) {
                 quartzService.deleteJob(teExamActivity.getCode(), QuartzTaskEnum.EXAM_ACTIVITY_JOB_GROUP_NAME.name());
             } else {
-//                Integer forceFinish = teExam.getForceFinish();
-                Date startTime = teExamActivity.getStartTime();
-                Date finishTime = teExamActivity.getFinishTime();
-//                if (Objects.nonNull(forceFinish) && forceFinish.intValue() == 1) {//强制收卷
-                    Integer activityMaxDurationSeconds = Objects.nonNull(teExamActivity.getMaxDurationSeconds()) ? teExamActivity.getMaxDurationSeconds() : null;
-                    Integer maxDurationSeconds = Objects.nonNull(teExam.getMaxDurationSeconds()) ? teExam.getMaxDurationSeconds() : null;
-                    Integer finalMaxDurationSeconds = Objects.nonNull(activityMaxDurationSeconds) ? activityMaxDurationSeconds : maxDurationSeconds;
+                if (Objects.nonNull(teExam.getEnable()) && teExam.getEnable().intValue() == 1 && Objects.nonNull(teExamActivity.getEnable()) && teExamActivity.getEnable().intValue() == 1) {
+                    Date finishTime = teExamActivity.getFinishTime();
                     Calendar calendar = Calendar.getInstance();
-                    if (Objects.nonNull(finalMaxDurationSeconds)) {
-                        calendar.setTime(startTime);
-                        calendar.add(Calendar.SECOND, (activityMaxDurationSeconds.intValue() + 30));
-//                        calendar.add(Calendar.SECOND, (activityMaxDurationSeconds.intValue()));
-                    } else {
-                        calendar.setTime(finishTime);
-                    }
+                    calendar.setTime(finishTime);
+                    calendar.add(Calendar.SECOND, 30);
                     if (calendar.getTime().getTime() > System.currentTimeMillis()) {
-//                        calendar.setTime(new Date());
                         int year = calendar.get(Calendar.YEAR);//获取年份
                         int month = calendar.get(Calendar.MONTH) + 1;//获取月份
                         int day = calendar.get(Calendar.DATE);//获取日
@@ -111,7 +99,7 @@ public class MqTaskLogicServiceImpl implements MqTaskLogicService {
                         quartzService.deleteJob(activityCode, QuartzTaskEnum.EXAM_ACTIVITY_JOB_GROUP_NAME.name());
                         quartzService.addJob(ExamActivityJob.class, activityCode, QuartzTaskEnum.EXAM_ACTIVITY_JOB_GROUP_NAME.name(), cron, mapJob);
                     }
-//                }
+                }
             }
         }
         TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);

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

@@ -6,14 +6,11 @@ import com.qmth.themis.business.cache.RedisKeyHelper;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 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.service.TOeExamRecordService;
-import com.qmth.themis.business.threadPool.MyThreadPool;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.task.quartz.service.QuartzLogicService;
 import org.slf4j.Logger;
@@ -48,9 +45,6 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
     @Resource
     TEExamStudentService teExamStudentService;
 
-    @Resource
-    TOeExamRecordService tOeExamRecordService;
-
     /**
      * 考试场次quartz逻辑
      *
@@ -66,50 +60,20 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
         TEExamActivity teExamActivity = teExamActivityService.getOne(teExamActivityQueryWrapper);
         ExamCacheBean examCacheBean = teExamService.getExamCacheBean(teExamActivity.getExamId());
         if (Objects.nonNull(examCacheBean) && examCacheBean.getEnable() == 1 && Objects.nonNull(teExamActivity) && teExamActivity.getEnable() == 1) {
-            Integer forceFinish = examCacheBean.getForceFinish();
-            if (Objects.nonNull(forceFinish) && forceFinish.intValue() == 1) {//强制收卷
-                Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(teExamActivity.getId()));
-                if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
-                    objectMap.forEach((k, v) -> {
-                        ExamRecordStatusEnum examRecordStatusEnum = (ExamRecordStatusEnum) v;
-                        //获取该考试批次下所有未交卷的考生的考试记录
-                        if (Objects.nonNull(examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.FINISHED, 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);
-                        }
-                    });
-                }
-            } else {
-                Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(teExamActivity.getId()));
-                if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
-                    objectMap.forEach((k, v) -> {
-                        ExamRecordStatusEnum examRecordStatusEnum = (ExamRecordStatusEnum) v;
-                        //获取该考试批次下所有未交卷的考生的考试记录
-                        if (Objects.nonNull(examRecordStatusEnum) && (!Objects.equals(ExamRecordStatusEnum.FINISHED, 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);
-                        }
-                    });
-                }
-                TOeExamRecord tOeExamRecord = tOeExamRecordService.findOneByExamId(teExamActivity.getId(), ExamRecordStatusEnum.ANSWERING);
-                if (Objects.nonNull(tOeExamRecord)) {
-                    try {
-                        Thread.sleep(1000 * 60 * 15);//等15分钟再次检查
-                    } catch (InterruptedException e) {
-                        e.printStackTrace();
+            Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(teExamActivity.getId()));
+            if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
+                objectMap.forEach((k, v) -> {
+                    ExamRecordStatusEnum examRecordStatusEnum = (ExamRecordStatusEnum) v;
+                    //获取该考试批次下所有未交卷的考生的考试记录
+                    if (Objects.nonNull(examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.FINISHED, 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);
                     }
-                    execExamActivityJobLogic(key);
-                } else {
-                    return;
-                }
+                });
             }
         }
     }