|
@@ -1,38 +1,5 @@
|
|
|
package com.qmth.themis.business.service.impl;
|
|
|
|
|
|
-import java.io.File;
|
|
|
-import java.io.IOException;
|
|
|
-import java.io.InputStream;
|
|
|
-import java.math.BigDecimal;
|
|
|
-import java.text.SimpleDateFormat;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Calendar;
|
|
|
-import java.util.Collections;
|
|
|
-import java.util.Comparator;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.HashSet;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Objects;
|
|
|
-import java.util.Random;
|
|
|
-import java.util.Set;
|
|
|
-import java.util.UUID;
|
|
|
-import java.util.regex.Matcher;
|
|
|
-import java.util.regex.Pattern;
|
|
|
-import java.util.stream.Collectors;
|
|
|
-
|
|
|
-import javax.annotation.Resource;
|
|
|
-
|
|
|
-import org.apache.commons.lang3.StringUtils;
|
|
|
-import org.springframework.beans.BeanUtils;
|
|
|
-import org.springframework.cache.annotation.CacheEvict;
|
|
|
-import org.springframework.cache.annotation.CachePut;
|
|
|
-import org.springframework.cache.annotation.Cacheable;
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
-import org.springframework.transaction.annotation.Transactional;
|
|
|
-import org.springframework.web.multipart.MultipartFile;
|
|
|
-
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.aliyun.oss.common.utils.BinaryUtil;
|
|
@@ -40,29 +7,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.qmth.themis.business.bean.admin.OpenExamBean;
|
|
|
-import com.qmth.themis.business.bean.exam.AnswerSubmitBean;
|
|
|
-import com.qmth.themis.business.bean.exam.AudioLeftPlayCountSubmitBean;
|
|
|
-import com.qmth.themis.business.bean.exam.ExamFileUploadBean;
|
|
|
-import com.qmth.themis.business.bean.exam.ExamFinishBean;
|
|
|
-import com.qmth.themis.business.bean.exam.ExamPaperDownloadBean;
|
|
|
-import com.qmth.themis.business.bean.exam.ExamPrepareBean;
|
|
|
-import com.qmth.themis.business.bean.exam.ExamResultBean;
|
|
|
-import com.qmth.themis.business.bean.exam.ExamResumeBean;
|
|
|
-import com.qmth.themis.business.bean.exam.ExamStartBean;
|
|
|
-import com.qmth.themis.business.bean.exam.StudentPaperStructBean;
|
|
|
-import com.qmth.themis.business.cache.ExamActivityRecordCacheUtil;
|
|
|
-import com.qmth.themis.business.cache.ExamBreakCacheUtil;
|
|
|
-import com.qmth.themis.business.cache.ExamRecordCacheUtil;
|
|
|
-import com.qmth.themis.business.cache.ExamingDataCacheUtil;
|
|
|
-import com.qmth.themis.business.cache.RedisKeyHelper;
|
|
|
-import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
|
|
|
-import com.qmth.themis.business.cache.bean.ExamCacheBean;
|
|
|
-import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;
|
|
|
-import com.qmth.themis.business.cache.bean.ExamPaperCacheBean;
|
|
|
-import com.qmth.themis.business.cache.bean.ExamStudentAnswerCacheBean;
|
|
|
-import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
|
|
|
-import com.qmth.themis.business.cache.bean.ExamStudentPaperStructCacheBean;
|
|
|
-import com.qmth.themis.business.cache.bean.ObjectiveAnswerCacheBean;
|
|
|
+import com.qmth.themis.business.bean.exam.*;
|
|
|
+import com.qmth.themis.business.cache.*;
|
|
|
+import com.qmth.themis.business.cache.bean.*;
|
|
|
import com.qmth.themis.business.constant.SpringContextHolder;
|
|
|
import com.qmth.themis.business.constant.SystemConstant;
|
|
|
import com.qmth.themis.business.dao.TEExamMapper;
|
|
@@ -76,41 +23,32 @@ import com.qmth.themis.business.entity.TBSession;
|
|
|
import com.qmth.themis.business.entity.TBTaskHistory;
|
|
|
import com.qmth.themis.business.entity.TEExam;
|
|
|
import com.qmth.themis.business.entity.TOeExamRecord;
|
|
|
-import com.qmth.themis.business.enums.ExamModeEnum;
|
|
|
-import com.qmth.themis.business.enums.ExamRecordStatusEnum;
|
|
|
-import com.qmth.themis.business.enums.FinishExamResultEnum;
|
|
|
-import com.qmth.themis.business.enums.FinishTypeEnum;
|
|
|
-import com.qmth.themis.business.enums.InvigilateMonitorStatusEnum;
|
|
|
-import com.qmth.themis.business.enums.InvigilateVerifyEnum;
|
|
|
-import com.qmth.themis.business.enums.MonitorStatusSourceEnum;
|
|
|
-import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
|
|
|
-import com.qmth.themis.business.enums.MqTagEnum;
|
|
|
-import com.qmth.themis.business.enums.ObjectiveScorePolicyEnum;
|
|
|
-import com.qmth.themis.business.enums.ReviewResultEnum;
|
|
|
-import com.qmth.themis.business.enums.ScoreStatusEnum;
|
|
|
-import com.qmth.themis.business.enums.SystemOperationEnum;
|
|
|
-import com.qmth.themis.business.enums.TaskStatusEnum;
|
|
|
-import com.qmth.themis.business.enums.WebsocketStatusEnum;
|
|
|
-import com.qmth.themis.business.service.MqDtoService;
|
|
|
-import com.qmth.themis.business.service.TBTaskHistoryService;
|
|
|
-import com.qmth.themis.business.service.TEExamActivityService;
|
|
|
-import com.qmth.themis.business.service.TEExamCourseService;
|
|
|
-import com.qmth.themis.business.service.TEExamPaperService;
|
|
|
-import com.qmth.themis.business.service.TEExamService;
|
|
|
-import com.qmth.themis.business.service.TEExamStudentService;
|
|
|
-import com.qmth.themis.business.service.TGErrorService;
|
|
|
-import com.qmth.themis.business.service.TOeExamBreakHistoryService;
|
|
|
-import com.qmth.themis.business.service.TOeExamRecordService;
|
|
|
-import com.qmth.themis.business.util.JacksonUtil;
|
|
|
-import com.qmth.themis.business.util.MqUtil;
|
|
|
-import com.qmth.themis.business.util.OssUtil;
|
|
|
-import com.qmth.themis.business.util.RedisUtil;
|
|
|
-import com.qmth.themis.business.util.ServletUtil;
|
|
|
-import com.qmth.themis.business.util.TencentYunUtil;
|
|
|
+import com.qmth.themis.business.enums.*;
|
|
|
+import com.qmth.themis.business.service.*;
|
|
|
+import com.qmth.themis.business.util.*;
|
|
|
import com.qmth.themis.common.enums.ExceptionResultEnum;
|
|
|
import com.qmth.themis.common.exception.BusinessException;
|
|
|
import com.qmth.themis.common.util.HexUtils;
|
|
|
import com.qmth.themis.common.util.IpUtil;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.cache.annotation.CacheEvict;
|
|
|
+import org.springframework.cache.annotation.CachePut;
|
|
|
+import org.springframework.cache.annotation.Cacheable;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.io.File;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.*;
|
|
|
+import java.util.regex.Matcher;
|
|
|
+import java.util.regex.Pattern;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* @Description: 考试批次 服务实现类
|
|
@@ -184,7 +122,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
|
|
|
* @return
|
|
|
*/
|
|
|
@SuppressWarnings("rawtypes")
|
|
|
- @Override
|
|
|
+ @Override
|
|
|
public IPage<TEExamQueryDto> examQuery(IPage<Map> iPage, Long userId, Long id, String code, String name,
|
|
|
String mode, Integer enable, Long orgId, String type) {
|
|
|
return teExamMapper.examQuery(iPage, userId, id, code, name, mode, enable, orgId, type);
|
|
@@ -294,7 +232,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
|
|
|
, ep.getAudioPlayCount(), ExamRecordCacheUtil.getMonitorKey(recordId), monitorUserId
|
|
|
, tencentYunUtil.getSign(monitorUserId, SystemConstant.TENCENT_EXPIRE_TIME)
|
|
|
, tencentYunUtil.getTencentYunDomain().getAppId());
|
|
|
-
|
|
|
+ ExamRecordCacheUtil.updateExamRecordCache(recordId, examCache, ac);
|
|
|
TEExamActivityDto teExamActivityDto = new TEExamActivityDto(examCache, ac, examStudentCacheBean,
|
|
|
examStudentId, ec, recordId);
|
|
|
prepare.setTeExamActivityDto(teExamActivityDto);
|
|
@@ -681,7 +619,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
|
|
|
ExamRecordCacheUtil.getHasAnswerFile(recordId) :
|
|
|
0;
|
|
|
if (hasAnswerFile.intValue() == 1) {
|
|
|
- calculateObjectiveScore(answerCache, recordId);
|
|
|
+ calculateObjectiveScore(answerCache, recordId);
|
|
|
}
|
|
|
// 更新考生作答
|
|
|
redisUtil.set(RedisKeyHelper.examAnswerKey(recordId),
|
|
@@ -692,12 +630,12 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
-
|
|
|
- private void calculateObjectiveScore(ExamStudentAnswerCacheBean answer,Long recordId) {
|
|
|
- if(answer.getObjective()==null||!answer.getObjective()) {
|
|
|
- return;
|
|
|
- }
|
|
|
- answer.setScore(0.0);
|
|
|
+
|
|
|
+ private void calculateObjectiveScore(ExamStudentAnswerCacheBean answer, Long recordId) {
|
|
|
+ if (answer.getObjective() == null || !answer.getObjective()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ answer.setScore(0.0);
|
|
|
Integer mainNumber = answer.getMainNumber();
|
|
|
Integer subNumber = answer.getSubNumber();
|
|
|
Integer subIndex = answer.getSubIndex();
|
|
@@ -707,12 +645,12 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
|
|
|
//整卷客观题标答缓存集合
|
|
|
Map<String, ObjectiveAnswerCacheBean> map = examPaperService.getObjectiveAnswerCacheBean(paperId);
|
|
|
if (map == null || map.size() == 0) {
|
|
|
- throw new BusinessException(ExceptionResultEnum.NOT_FOUND_PAPER_OBJECTIVE_ANSWER);
|
|
|
+ throw new BusinessException(ExceptionResultEnum.NOT_FOUND_PAPER_OBJECTIVE_ANSWER);
|
|
|
}
|
|
|
//客观题标答缓存
|
|
|
ObjectiveAnswerCacheBean cb = map.get(key);
|
|
|
if (cb == null) {
|
|
|
- throw new BusinessException(ExceptionResultEnum.NOT_FOUND_QUESTION_OBJECTIVE_ANSWER);
|
|
|
+ throw new BusinessException(ExceptionResultEnum.NOT_FOUND_QUESTION_OBJECTIVE_ANSWER);
|
|
|
}
|
|
|
|
|
|
if (cb.getStructType().intValue() == 1) {
|
|
@@ -756,6 +694,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
private boolean checkSingleChoice(String answerArray, JSONArray ar) {
|
|
|
JSONArray an = JSONArray.parseArray(answerArray);
|
|
|
if (an.size() == 0) {
|
|
@@ -799,6 +738,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
|
|
|
}
|
|
|
return -1;
|
|
|
}
|
|
|
+
|
|
|
private boolean checkIsObjective(Long paperId, Integer mainNumber, Integer subNumber, Integer subIndex) {
|
|
|
Map<String, ObjectiveAnswerCacheBean> map = examPaperService.getObjectiveAnswerCacheBean(paperId);
|
|
|
if (map == null || map.size() == 0) {
|
|
@@ -1074,17 +1014,17 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
|
|
|
redisUtil.releaseLock(lockKey);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
@SuppressWarnings("unchecked")
|
|
|
- private Double calculateTotalObjectiveScore(Long recordId) {
|
|
|
- Double total = 0.0;
|
|
|
- Map<String, ExamStudentAnswerCacheBean> as = redisUtil.getHashEntries(RedisKeyHelper.examAnswerKey(recordId));
|
|
|
+ private Double calculateTotalObjectiveScore(Long recordId) {
|
|
|
+ Double total = 0.0;
|
|
|
+ Map<String, ExamStudentAnswerCacheBean> as = redisUtil.getHashEntries(RedisKeyHelper.examAnswerKey(recordId));
|
|
|
if (as != null && as.size() > 0) {
|
|
|
for (ExamStudentAnswerCacheBean sa : as.values()) {
|
|
|
if (sa.getObjective() != null && sa.getObjective()) {//是客观题
|
|
|
if (sa.getScore() != null) {//有分值
|
|
|
total = total + sa.getScore();
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1093,11 +1033,11 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
|
|
|
}
|
|
|
|
|
|
private ExamFinishBean diposeFinish(Long studentId, Long recordId, String type, Integer durationSeconds) {
|
|
|
- Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
|
|
|
+ Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
|
|
|
// 校验当前登录用户和参数一致性
|
|
|
- if(examStudentId==null) {
|
|
|
- throw new BusinessException(ExceptionResultEnum.NOT_FOUND_EXAM_RECORD);
|
|
|
- }
|
|
|
+ if (examStudentId == null) {
|
|
|
+ throw new BusinessException(ExceptionResultEnum.NOT_FOUND_EXAM_RECORD);
|
|
|
+ }
|
|
|
ExamStudentCacheBean es = (ExamStudentCacheBean) redisUtil
|
|
|
.get(RedisKeyHelper.examStudentCacheKey(examStudentId));
|
|
|
if (es == null) {
|
|
@@ -1106,12 +1046,12 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
|
|
|
if (!studentId.equals(es.getStudentId())) {
|
|
|
throw new BusinessException(ExceptionResultEnum.EXAM_ID_NOT_EQUALY);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
Date now = new Date();
|
|
|
ExamFinishBean ret = new ExamFinishBean();
|
|
|
ret.setFinishTime(now.getTime());
|
|
|
ret.setObjectiveScore(calculateTotalObjectiveScore(recordId));
|
|
|
-
|
|
|
+
|
|
|
if (ExamRecordCacheUtil.getId(recordId) == null || examStudentId == null) {
|
|
|
ret.setStatus(FinishExamResultEnum.NORMAL);
|
|
|
return ret;
|
|
@@ -1376,7 +1316,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
|
|
|
* @return
|
|
|
*/
|
|
|
@SuppressWarnings("rawtypes")
|
|
|
- @Override
|
|
|
+ @Override
|
|
|
public List<Map> examList(Long userId, Long orgId) {
|
|
|
return teExamMapper.examList(userId, orgId);
|
|
|
}
|