|
@@ -1,6 +1,5 @@
|
|
|
package com.qmth.themis.mq.service.impl;
|
|
|
|
|
|
-import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
@@ -234,60 +233,45 @@ public class MqLogicServiceImpl implements MqLogicService {
|
|
|
mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);//表示成功处理
|
|
|
Map<String, Object> tranMap = mqDto.getProperties();
|
|
|
Long recordId = Long.parseLong(String.valueOf(tranMap.get("recordId")));
|
|
|
- Long clientLastSyncTime = ExamRecordCacheUtil.getClientLastSyncTime(recordId);
|
|
|
ExamRecordStatusEnum status = ExamRecordCacheUtil.getStatus(recordId);
|
|
|
WebsocketStatusEnum websocketStatusEnum = ExamRecordCacheUtil.getClientWebsocketStatus(recordId);
|
|
|
if (Objects.nonNull(websocketStatusEnum) && !Objects.equals(websocketStatusEnum, WebsocketStatusEnum.ON_LINE) && (!Objects.equals(status, ExamRecordStatusEnum.FIRST_PREPARE) || !Objects.equals(status, ExamRecordStatusEnum.FINISHED) || !Objects.equals(status, ExamRecordStatusEnum.PERSISTED))) {
|
|
|
- Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(recordId));
|
|
|
- if (Objects.nonNull(objectMap)) {
|
|
|
- Integer diff = 0;
|
|
|
- if (Objects.nonNull(clientLastSyncTime)) {//大于等于当前时间,说明未重连或重登录
|
|
|
- Long l = (System.currentTimeMillis() - clientLastSyncTime) / 1000;
|
|
|
- diff = l.intValue();
|
|
|
- }
|
|
|
- Long examId = ExamRecordCacheUtil.getExamId(recordId);
|
|
|
- Long examActivityId = ExamRecordCacheUtil.getExamActivityId(recordId);
|
|
|
- Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
|
|
|
- ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
|
|
|
- ExamCacheBean ec = teExamService.getExamCacheBean(examId);//考试缓存
|
|
|
- Long breakId = null;
|
|
|
- //增加断点记录,获取剩余断点次数
|
|
|
- Integer alreadyBreakCount = Objects.isNull(ExamRecordCacheUtil.getAlreadyBreakCount(recordId)) ? 0 : ExamRecordCacheUtil.getAlreadyBreakCount(recordId);
|
|
|
- Integer leftBreakResumeCount = ec.getBreakResumeCount() - alreadyBreakCount;
|
|
|
- if (leftBreakResumeCount < 0) {
|
|
|
- Integer durationSeconds = Objects.isNull(ExamRecordCacheUtil.getDurationSeconds(recordId)) ? 0 : ExamRecordCacheUtil.getDurationSeconds(recordId);
|
|
|
- teExamService.finish(examStudentCacheBean.getStudentId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
|
|
|
- } else {
|
|
|
- alreadyBreakCount++;
|
|
|
- breakId = Constants.idGen.next();
|
|
|
- ExamRecordCacheUtil.setLastBreakId(recordId, breakId, false);
|
|
|
- ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.BREAK_OFF, false);
|
|
|
- Long lastBreakTime = System.currentTimeMillis();
|
|
|
- ExamRecordCacheUtil.setLastBreakTime(recordId, lastBreakTime, false);
|
|
|
- ExamRecordCacheUtil.setAlreadyBreakCount(recordId, alreadyBreakCount, false);
|
|
|
- Long lastStartTime = System.currentTimeMillis();
|
|
|
- ExamRecordCacheUtil.setLastStartTime(recordId, lastStartTime, false);
|
|
|
- String[] columns = new String[]{ExamRecordFieldEnum.last_break_id.name(), ExamRecordFieldEnum.status.name(), ExamRecordFieldEnum.last_break_time.name(), ExamRecordFieldEnum.already_break_count.name(), ExamRecordFieldEnum.last_start_time.name()};
|
|
|
- Object[] values = new Object[]{breakId, ExamRecordStatusEnum.BREAK_OFF, lastBreakTime, alreadyBreakCount, lastStartTime};
|
|
|
- examRecordService.dataUpdatesMq(recordId, columns, values);
|
|
|
- //考试断点异常原因 发送mq start
|
|
|
- MqDto mqDtoBreak = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK.name(), ExceptionEnum.NET_TIME_OUT, MqTagEnum.EXAM_BREAK, String.valueOf(recordId), String.valueOf(recordId));
|
|
|
- mqDtoService.assembleSendOneWayMsg(mqDtoBreak);
|
|
|
- //考试断点异常原因 发送mq end
|
|
|
- //更新场次-考试记录缓存
|
|
|
- ExamActivityRecordCacheUtil.setExamRecordStatus(examActivityId, recordId, ExamRecordCacheUtil.getStatus(recordId));
|
|
|
- }
|
|
|
- //增加异常日志
|
|
|
- TIeInvigilateExceptionInfo tIeInvigilateExceptionInfo = new TIeInvigilateExceptionInfo(examId, examActivityId, recordId, examStudentId, ExceptionEnum.NET_TIME_OUT.getCode(), ExceptionEnum.NET_TIME_OUT, diff);
|
|
|
- tIeInvigilateExceptionInfoService.saveOrUpdate(tIeInvigilateExceptionInfo);
|
|
|
- TEExamStudentLog teExamStudentLog = new TEExamStudentLog(SystemOperationEnum.BREAK_OFF.name(), SystemOperationEnum.BREAK_OFF.getCode(), SystemOperationEnum.BREAK_OFF.getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId, breakId);
|
|
|
- teExamStudentLogService.save(teExamStudentLog);
|
|
|
-
|
|
|
- //发送移动端监考退出考试mq消息 start
|
|
|
- MqDto mqDtoExamStop = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STOP.name(), recordId, MqTagEnum.EXAM_STOP, String.valueOf(recordId), String.valueOf(recordId));
|
|
|
- mqDtoService.assembleSendOneWayMsg(mqDtoExamStop);
|
|
|
- //发送移动端监考退出考试mq消息 end
|
|
|
+ Long examId = ExamRecordCacheUtil.getExamId(recordId);
|
|
|
+ Long examActivityId = ExamRecordCacheUtil.getExamActivityId(recordId);
|
|
|
+ Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
|
|
|
+ ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
|
|
|
+ ExamCacheBean ec = teExamService.getExamCacheBean(examId);//考试缓存
|
|
|
+ Long breakId = null;
|
|
|
+ //增加断点记录,获取剩余断点次数
|
|
|
+ Integer alreadyBreakCount = Objects.isNull(ExamRecordCacheUtil.getAlreadyBreakCount(recordId)) ? 0 : ExamRecordCacheUtil.getAlreadyBreakCount(recordId);
|
|
|
+ Integer leftBreakResumeCount = ec.getBreakResumeCount() - alreadyBreakCount;
|
|
|
+ if (leftBreakResumeCount < 0) {
|
|
|
+ Integer durationSeconds = Objects.isNull(ExamRecordCacheUtil.getDurationSeconds(recordId)) ? 0 : ExamRecordCacheUtil.getDurationSeconds(recordId);
|
|
|
+ teExamService.finish(examStudentCacheBean.getStudentId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
|
|
|
+ } else {
|
|
|
+ alreadyBreakCount++;
|
|
|
+ breakId = Constants.idGen.next();
|
|
|
+ ExamRecordCacheUtil.setLastBreakId(recordId, breakId, false);
|
|
|
+ ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.BREAK_OFF, false);
|
|
|
+ Long lastBreakTime = System.currentTimeMillis();
|
|
|
+ ExamRecordCacheUtil.setLastBreakTime(recordId, lastBreakTime, false);
|
|
|
+ ExamRecordCacheUtil.setAlreadyBreakCount(recordId, alreadyBreakCount, false);
|
|
|
+ Long lastStartTime = System.currentTimeMillis();
|
|
|
+ ExamRecordCacheUtil.setLastStartTime(recordId, lastStartTime, false);
|
|
|
+ String[] columns = new String[]{ExamRecordFieldEnum.last_break_id.name(), ExamRecordFieldEnum.status.name(), ExamRecordFieldEnum.last_break_time.name(), ExamRecordFieldEnum.already_break_count.name(), ExamRecordFieldEnum.last_start_time.name()};
|
|
|
+ Object[] values = new Object[]{breakId, ExamRecordStatusEnum.BREAK_OFF, lastBreakTime, alreadyBreakCount, lastStartTime};
|
|
|
+ examRecordService.dataUpdatesMq(recordId, columns, values);
|
|
|
+ //考试断点异常原因 发送mq start
|
|
|
+ MqDto mqDtoBreak = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK.name(), ExceptionEnum.NET_TIME_OUT, MqTagEnum.EXAM_BREAK, String.valueOf(recordId), String.valueOf(recordId));
|
|
|
+ mqDtoService.assembleSendOneWayMsg(mqDtoBreak);
|
|
|
+ //考试断点异常原因 发送mq end
|
|
|
+ //更新场次-考试记录缓存
|
|
|
+ ExamActivityRecordCacheUtil.setExamRecordStatus(examActivityId, recordId, ExamRecordCacheUtil.getStatus(recordId));
|
|
|
}
|
|
|
+ //发送移动端监考退出考试mq消息 start
|
|
|
+ MqDto mqDtoExamStop = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STOP.name(), recordId, MqTagEnum.EXAM_STOP, String.valueOf(recordId), String.valueOf(recordId));
|
|
|
+ mqDtoService.assembleSendOneWayMsg(mqDtoExamStop);
|
|
|
+ //发送移动端监考退出考试mq消息 end
|
|
|
}
|
|
|
TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
|
|
|
tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
|
|
@@ -538,13 +522,15 @@ public class MqLogicServiceImpl implements MqLogicService {
|
|
|
Long l = ((System.currentTimeMillis() - lastBreakTime) / 1000);
|
|
|
diff = l.intValue();
|
|
|
}
|
|
|
+
|
|
|
//修改异常日志
|
|
|
String reason = String.valueOf(jsonObject.getJSONObject("reason").get("reason"));
|
|
|
UpdateWrapper<TIeInvigilateExceptionInfo> tIeInvigilateExceptionInfoUpdateWrapper = new UpdateWrapper<>();
|
|
|
tIeInvigilateExceptionInfoUpdateWrapper.lambda().set(TIeInvigilateExceptionInfo::getInfo, reason)
|
|
|
.set(TIeInvigilateExceptionInfo::getType, exceptionEnum)
|
|
|
.set(TIeInvigilateExceptionInfo::getDifference, diff)
|
|
|
- .eq(TIeInvigilateExceptionInfo::getId, breakId);
|
|
|
+ .set(TIeInvigilateExceptionInfo::getUpdateTime, System.currentTimeMillis())
|
|
|
+ .eq(TIeInvigilateExceptionInfo::getObjId, breakId);
|
|
|
tIeInvigilateExceptionInfoService.update(tIeInvigilateExceptionInfoUpdateWrapper);
|
|
|
|
|
|
//修改考生轨迹
|
|
@@ -552,6 +538,7 @@ public class MqLogicServiceImpl implements MqLogicService {
|
|
|
teExamStudentLogUpdateWrapper.lambda().set(TEExamStudentLog::getType, exceptionEnum.name())
|
|
|
.set(TEExamStudentLog::getInfo, exceptionEnum.getCode())
|
|
|
.set(TEExamStudentLog::getRemark, reason)
|
|
|
+ .set(TEExamStudentLog::getUpdateTime, System.currentTimeMillis())
|
|
|
.eq(TEExamStudentLog::getObjId, breakId);
|
|
|
teExamStudentLogService.update(teExamStudentLogUpdateWrapper);
|
|
|
}
|
|
@@ -629,6 +616,22 @@ public class MqLogicServiceImpl implements MqLogicService {
|
|
|
tOeExamBreakHistoryService.saveOrUpdate(tOeExamBreakHistory);
|
|
|
redisUtil.setForHash(RedisKeyHelper.examBreakCacheKey(tOeExamBreakHistory.getId()), SimpleBeanUtil.objectToMap(tOeExamBreakHistory));
|
|
|
|
|
|
+ Long clientLastSyncTime = ExamRecordCacheUtil.getClientLastSyncTime(recordId);
|
|
|
+ Integer diff = 0;
|
|
|
+ if (Objects.nonNull(clientLastSyncTime)) {//大于等于当前时间,说明未重连或重登录
|
|
|
+ Long l = (System.currentTimeMillis() - clientLastSyncTime) / 1000;
|
|
|
+ diff = l.intValue();
|
|
|
+ }
|
|
|
+ Long examId = ExamRecordCacheUtil.getExamId(recordId);
|
|
|
+ Long examActivityId = ExamRecordCacheUtil.getExamActivityId(recordId);
|
|
|
+ Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
|
|
|
+ ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
|
|
|
+ //增加异常日志
|
|
|
+ TIeInvigilateExceptionInfo tIeInvigilateExceptionInfo = new TIeInvigilateExceptionInfo(examId, examActivityId, recordId, examStudentId, ExceptionEnum.NET_TIME_OUT.getCode(), ExceptionEnum.NET_TIME_OUT, diff, ExamRecordCacheUtil.getLastBreakId(recordId));
|
|
|
+ tIeInvigilateExceptionInfoService.saveOrUpdate(tIeInvigilateExceptionInfo);
|
|
|
+ TEExamStudentLog teExamStudentLog = new TEExamStudentLog(SystemOperationEnum.BREAK_OFF.name(), SystemOperationEnum.BREAK_OFF.getCode(), SystemOperationEnum.BREAK_OFF.getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId, ExamRecordCacheUtil.getLastBreakId(recordId));
|
|
|
+ teExamStudentLogService.save(teExamStudentLog);
|
|
|
+
|
|
|
Gson gson = new Gson();
|
|
|
mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
|
|
|
TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
|