Browse Source

考试断点记录

wangliang 4 years ago
parent
commit
a27e226b36

+ 1 - 0
themis-exam/src/main/java/com/qmth/themis/exam/api/TEStudentController.java

@@ -211,6 +211,7 @@ public class TEStudentController {
                     objectMap.put("status", ExamRecordStatusEnum.RESUME_PREPARE.name());
                     objectMap.put("lastBreakTime", new Date());
                     objectMap.put("leftBreakResumeCount", leftBreakResumeCount);
+                    objectMap.put("lastStartTime", new Date());
 
                     //发送mq,增加断点次数记录
                     MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.examBreakHistory.name(), JacksonUtil.parseJson(objectMap), MqEnum.EXAM_BREAK, String.valueOf(recordId), "增加断点记录");

+ 6 - 50
themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java

@@ -10,7 +10,7 @@ import com.qmth.themis.business.entity.TBSession;
 import com.qmth.themis.business.entity.TMRocketMessage;
 import com.qmth.themis.business.entity.TOeExamBreakHistory;
 import com.qmth.themis.business.enums.BreakReasonEnum;
-import com.qmth.themis.business.enums.FinishTypeEnum;
+import com.qmth.themis.business.enums.ExamRecordStatusEnum;
 import com.qmth.themis.business.enums.MqEnum;
 import com.qmth.themis.business.enums.SystemOperationEnum;
 import com.qmth.themis.business.service.*;
@@ -24,6 +24,7 @@ import com.qmth.themis.business.threadPool.MyThreadPool;
 import com.qmth.themis.business.util.JacksonUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.mq.dto.MqDto;
+import com.qmth.themis.mq.service.MqDtoService;
 import com.qmth.themis.mq.service.MqLogicService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -74,6 +75,7 @@ public class MqLogicServiceImpl implements MqLogicService {
 
     @Resource
     TOeLivenessVerifyHistoryService livenessVerifyHistoryService;
+
     @Resource
     TEExamService teExamService;
 
@@ -197,56 +199,10 @@ public class MqLogicServiceImpl implements MqLogicService {
         Long recordId = Long.parseLong(String.valueOf(tranMap.get("recordId")));
         Date clientLastSyncTime = ExamRecordCacheUtil.getClientLastSyncTime(recordId);
         if (Objects.nonNull(clientLastSyncTime) && (System.currentTimeMillis() - clientLastSyncTime.getTime()) / 1000 / 60 >= 2) {//大于等于当前时间,说明未重连或重登录
-            String deviceId = String.valueOf(tranMap.get("deviceId"));
-            String ip = String.valueOf(tranMap.get("ip"));
-            Long updateTime = Long.parseLong(String.valueOf(tranMap.get("updateTime")));
-            Date date = new Date();
-            date.setTime(updateTime);
-//            TOeExamRecord tOeExamRecord = tOeExamRecordService.getById(recordId);
+            //是否增加断点记录或者交卷处理统一放登录逻辑里处理,这里只更新考试记录状态为中断
             Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(recordId));
-//            Integer breakCount = tOeExamRecord.getLeftBreakResumeCount();
-            Integer leftBreakResumeCount = ExamRecordCacheUtil.getLeftBreakResumeCount(recordId);
-            Long examId = Long.parseLong(String.valueOf(objectMap.get("examId")));
-            Long examStudentId = Long.parseLong(String.valueOf(objectMap.get("examStudentId")));
-            Integer durationSeconds = Integer.parseInt(String.valueOf(objectMap.get("durationSeconds")));
-//            获取考试缓存
-//            ExamCacheBean ec = teExamService.getExamCacheBean(examId);
-            if (Objects.isNull(leftBreakResumeCount) || leftBreakResumeCount <= 0) {
-//                tOeExamRecordService.updateById(tOeExamRecord);
-                teExamService.finish(examStudentId, recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
-            }
-//            else {//否则断点次数减1
-//                leftBreakResumeCount--;
-//                //如果断点次数超过了考试整体断点次数,也强制交卷
-//                if (leftBreakResumeCount > ec.getBreakResumeCount()) {
-//                    teExamService.finish(examStudentId, recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
-//                } else {
-//                    //先查询之前的断点记录
-//                    QueryWrapper<TOeExamBreakHistory> tOeExamBreakHistoryQueryWrapper = new QueryWrapper<>();
-//                    tOeExamBreakHistoryQueryWrapper.lambda().eq(TOeExamBreakHistory::getExamRecordId, recordId);
-//                    List<TOeExamBreakHistory> tOeExamBreakHistoryList = tOeExamBreakHistoryService.list(tOeExamBreakHistoryQueryWrapper);
-//                    //删除历史断点缓存
-//                    if (Objects.nonNull(tOeExamBreakHistoryList) && tOeExamBreakHistoryList.size() > 0) {
-//                        tOeExamBreakHistoryList.forEach(s -> {
-//                            redisUtil.delete(SystemConstant.EXAM_BREAK + String.valueOf(s.getId()));
-//                        });
-//                    }
-//                    //增加断点记录
-//                    TOeExamBreakHistory tOeExamBreakHistory = new TOeExamBreakHistory(recordId, new Date(), BreakReasonEnum.NET_TIME_OUT, BreakReasonEnum.NET_TIME_OUT.name());
-//                    tOeExamBreakHistoryService.save(tOeExamBreakHistory);
-//                    redisUtil.set(SystemConstant.EXAM_BREAK + String.valueOf(tOeExamBreakHistory.getId()), tOeExamBreakHistory);
-//                    //更新考试记录状态
-////                    tOeExamRecord.setClientCurrentIp(ip);
-////                    tOeExamRecord.setClientWebsocketId(deviceId);
-////                    tOeExamRecord.setClientWebsocketStatus(WebsocketStatusEnum.UN_ONLINE.ordinal());
-////                    tOeExamRecord.setClientLastSyncTime(date);
-////                    tOeExamRecord.setLastBreakId(tOeExamBreakHistory.getId());
-////                    tOeExamRecord.setLastBreakTime(tOeExamBreakHistory.getBreakTime());
-////                    tOeExamRecord.setLeftBreakResumeCount(breakCount);
-////                    tOeExamRecord.setStatus(ExamRecordStatusEnum.bREAK_OFF);
-//                }
-////                tOeExamRecordService.updateById(tOeExamRecord);
-//            }
+            objectMap.put("status", ExamRecordStatusEnum.bREAK_OFF.name());
+            redisUtil.setForHash(RedisKeyHelper.examRecordCacheKey(recordId), objectMap);
         }
         teExamStudentLogService.saveStudentLogInfo(mqDto.getTimestamp(), MqEnum.valueOf(String.valueOf(mqDto.getType())).getId(), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), JacksonUtil.parseJson(mqDto));
         TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);

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

@@ -89,7 +89,7 @@ public class MqTaskLogicServiceImpl implements MqTaskLogicService {
                     Calendar calendar = Calendar.getInstance();
                     if (Objects.nonNull(finalMaxDurationSeconds)) {
                         calendar.setTime(startTime);
-                        calendar.add(Calendar.SECOND, (activityMaxDurationSeconds.intValue() + 60));
+                        calendar.add(Calendar.SECOND, (activityMaxDurationSeconds.intValue() + 30));
 //                        calendar.add(Calendar.SECOND, (activityMaxDurationSeconds.intValue()));
                     } else {
                         calendar.setTime(finishTime);

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

@@ -43,17 +43,17 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
     @Resource
     TEExamActivityService teExamActivityService;
 
-    @Resource
-    TEExamStudentService teExamStudentService;
-
-    @Resource
-    TOeExamRecordService tOeExamRecordService;
-
+//    @Resource
+//    TEExamStudentService teExamStudentService;
+//
+//    @Resource
+//    TOeExamRecordService tOeExamRecordService;
+//
 //    @Resource
 //    MqDtoService mqDtoService;
-
-    @Resource
-    TEExamService teExamService;
+//
+//    @Resource
+//    TEExamService teExamService;
 
     /**
      * 考试场次quartz逻辑
@@ -69,25 +69,26 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
         teExamActivityQueryWrapper.lambda().eq(TEExamActivity::getCode, strings[1]);
         TEExamActivity teExamActivity = teExamActivityService.getOne(teExamActivityQueryWrapper);
         if (Objects.nonNull(teExamActivity)) {
+            //TODO 获取该考试批次下所有考生
             //获取该考试批次下所有未交卷的考生的考试记录
-            QueryWrapper<TOeExamRecord> tOeExamRecordQueryWrapper = new QueryWrapper<>();
-            tOeExamRecordQueryWrapper.lambda().eq(TOeExamRecord::getExamActivityId, teExamActivity.getId()).ne(TOeExamRecord::getStatus, ExamRecordStatusEnum.FINISHED.ordinal());
-            List<TOeExamRecord> tOeExamRecordList = tOeExamRecordService.list(tOeExamRecordQueryWrapper);
-            List<Long> examStudentIdList = null;
-            List<String> examStudentIdentityList = null;
-            if (Objects.nonNull(tOeExamRecordList) && tOeExamRecordList.size() > 0) {
-                examStudentIdList = new ArrayList<>();
-            }
-            List<Long> finalExamStudentIdList = examStudentIdList;
-            tOeExamRecordList.forEach(s -> {
-                s.setStatus(ExamRecordStatusEnum.FINISHED);
-                s.setFinishTime(new Date());
-                s.setFinishType(FinishTypeEnum.AUTO);
-                finalExamStudentIdList.add(s.getExamStudentId());
-                //加入交卷逻辑
-                teExamService.finish(s.getExamStudentId(), s.getId(), FinishTypeEnum.AUTO.name(), s.getDurationSeconds() + 60);
-            });
-            tOeExamRecordService.updateBatchById(tOeExamRecordList);
+//            QueryWrapper<TOeExamRecord> tOeExamRecordQueryWrapper = new QueryWrapper<>();
+//            tOeExamRecordQueryWrapper.lambda().eq(TOeExamRecord::getExamActivityId, teExamActivity.getId()).ne(TOeExamRecord::getStatus, ExamRecordStatusEnum.FINISHED.ordinal());
+//            List<TOeExamRecord> tOeExamRecordList = tOeExamRecordService.list(tOeExamRecordQueryWrapper);
+//            List<Long> examStudentIdList = null;
+//            List<String> examStudentIdentityList = null;
+//            if (Objects.nonNull(tOeExamRecordList) && tOeExamRecordList.size() > 0) {
+//                examStudentIdList = new ArrayList<>();
+//            }
+//            List<Long> finalExamStudentIdList = examStudentIdList;
+//            tOeExamRecordList.forEach(s -> {
+//                s.setStatus(ExamRecordStatusEnum.FINISHED);
+//                s.setFinishTime(new Date());
+//                s.setFinishType(FinishTypeEnum.AUTO);
+////                finalExamStudentIdList.add(s.getExamStudentId());
+//                //加入交卷逻辑
+//                teExamService.finish(s.getExamStudentId(), s.getId(), FinishTypeEnum.AUTO.name(), s.getDurationSeconds() + 60);
+//            });
+//            tOeExamRecordService.updateBatchById(tOeExamRecordList);
 
 //            if (Objects.nonNull(examStudentIdList) && examStudentIdList.size() > 0) {
 //                //获取该考试批次下所有考生,考试次数减1
@@ -109,8 +110,6 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
 //                mqDtoService.assembleSendOneWayMsg(mqDto);
 //                //发送强行离线mq end
 //            }
-        } else {
-            log.info("考试场次:{}已删除", key);
         }
     }
 }