|
@@ -1,71 +1,41 @@
|
|
package com.qmth.themis.business.service.impl;
|
|
package com.qmth.themis.business.service.impl;
|
|
|
|
|
|
-import java.io.File;
|
|
|
|
-import java.math.BigDecimal;
|
|
|
|
-import java.text.SimpleDateFormat;
|
|
|
|
-import java.util.Date;
|
|
|
|
-import java.util.HashMap;
|
|
|
|
-import java.util.List;
|
|
|
|
-import java.util.Map;
|
|
|
|
-import java.util.Objects;
|
|
|
|
-import java.util.UUID;
|
|
|
|
-
|
|
|
|
-import javax.annotation.Resource;
|
|
|
|
-
|
|
|
|
-import org.apache.commons.lang3.StringUtils;
|
|
|
|
-import org.slf4j.Logger;
|
|
|
|
-import org.slf4j.LoggerFactory;
|
|
|
|
-import org.springframework.beans.BeanUtils;
|
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
|
-import org.springframework.transaction.annotation.Transactional;
|
|
|
|
-
|
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
import com.alibaba.fastjson.JSONArray;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
-import com.qmth.themis.business.bean.backend.InvigilateListBean;
|
|
|
|
-import com.qmth.themis.business.bean.backend.InvigilateListHistoryBean;
|
|
|
|
-import com.qmth.themis.business.bean.backend.InvigilateListPatrolBean;
|
|
|
|
-import com.qmth.themis.business.bean.backend.InvigilateListProgressBean;
|
|
|
|
-import com.qmth.themis.business.bean.backend.InvigilateListProgressExcelBean;
|
|
|
|
-import com.qmth.themis.business.bean.backend.InvigilateListVideoBean;
|
|
|
|
-import com.qmth.themis.business.bean.backend.InvigilateListWarningBean;
|
|
|
|
-import com.qmth.themis.business.bean.backend.OpenRecordNeedMarkBean;
|
|
|
|
|
|
+import com.qmth.themis.business.bean.backend.*;
|
|
import com.qmth.themis.business.cache.ExamRecordCacheUtil;
|
|
import com.qmth.themis.business.cache.ExamRecordCacheUtil;
|
|
import com.qmth.themis.business.cache.RedisKeyHelper;
|
|
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.ExamPaperCacheBean;
|
|
|
|
-import com.qmth.themis.business.cache.bean.ExamStudentAnswerCacheBean;
|
|
|
|
-import com.qmth.themis.business.cache.bean.ExamStudentPaperStructCacheBean;
|
|
|
|
-import com.qmth.themis.business.cache.bean.ObjectiveAnswerCacheBean;
|
|
|
|
|
|
+import com.qmth.themis.business.cache.bean.*;
|
|
import com.qmth.themis.business.config.SystemConfig;
|
|
import com.qmth.themis.business.config.SystemConfig;
|
|
import com.qmth.themis.business.constant.SpringContextHolder;
|
|
import com.qmth.themis.business.constant.SpringContextHolder;
|
|
import com.qmth.themis.business.constant.SystemConstant;
|
|
import com.qmth.themis.business.constant.SystemConstant;
|
|
import com.qmth.themis.business.dao.TOeExamRecordMapper;
|
|
import com.qmth.themis.business.dao.TOeExamRecordMapper;
|
|
import com.qmth.themis.business.dto.MqDto;
|
|
import com.qmth.themis.business.dto.MqDto;
|
|
|
|
+import com.qmth.themis.business.dto.response.MarkResultDto;
|
|
import com.qmth.themis.business.dto.response.TEExamUnFinishDto;
|
|
import com.qmth.themis.business.dto.response.TEExamUnFinishDto;
|
|
import com.qmth.themis.business.entity.TOeExamAnswer;
|
|
import com.qmth.themis.business.entity.TOeExamAnswer;
|
|
import com.qmth.themis.business.entity.TOeExamRecord;
|
|
import com.qmth.themis.business.entity.TOeExamRecord;
|
|
-import com.qmth.themis.business.enums.ExamRecordFieldEnum;
|
|
|
|
-import com.qmth.themis.business.enums.ExamRecordStatusEnum;
|
|
|
|
-import com.qmth.themis.business.enums.ExamTypeEnum;
|
|
|
|
-import com.qmth.themis.business.enums.LivenessTypeEnum;
|
|
|
|
-import com.qmth.themis.business.enums.MqTagEnum;
|
|
|
|
-import com.qmth.themis.business.enums.MqTopicEnum;
|
|
|
|
-import com.qmth.themis.business.enums.ObjectiveScorePolicyEnum;
|
|
|
|
-import com.qmth.themis.business.enums.VerifyExceptionEnum;
|
|
|
|
-import com.qmth.themis.business.service.MqDtoService;
|
|
|
|
-import com.qmth.themis.business.service.TEExamActivityService;
|
|
|
|
-import com.qmth.themis.business.service.TEExamPaperService;
|
|
|
|
-import com.qmth.themis.business.service.TEExamService;
|
|
|
|
-import com.qmth.themis.business.service.TOeExamAnswerService;
|
|
|
|
-import com.qmth.themis.business.service.TOeExamRecordService;
|
|
|
|
|
|
+import com.qmth.themis.business.enums.*;
|
|
|
|
+import com.qmth.themis.business.service.*;
|
|
import com.qmth.themis.business.util.OssUtil;
|
|
import com.qmth.themis.business.util.OssUtil;
|
|
import com.qmth.themis.business.util.RedisUtil;
|
|
import com.qmth.themis.business.util.RedisUtil;
|
|
import com.qmth.themis.common.contanst.Constants;
|
|
import com.qmth.themis.common.contanst.Constants;
|
|
import com.qmth.themis.common.util.FileUtil;
|
|
import com.qmth.themis.common.util.FileUtil;
|
|
import com.qmth.themis.common.util.SimpleBeanUtil;
|
|
import com.qmth.themis.common.util.SimpleBeanUtil;
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
+import org.slf4j.Logger;
|
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
+
|
|
|
|
+import javax.annotation.Resource;
|
|
|
|
+import java.io.File;
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
/**
|
|
* @Description: 考试记录 服务实现类
|
|
* @Description: 考试记录 服务实现类
|
|
@@ -264,16 +234,16 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (cb.getStructType().intValue() == 3) {
|
|
if (cb.getStructType().intValue() == 3) {
|
|
- if(StringUtils.isNotBlank(answer.getAnswer())) {
|
|
|
|
- String answerStr=answer.getAnswer().replaceAll("\n", "");
|
|
|
|
- if(StringUtils.isNotBlank(answerStr)) {
|
|
|
|
- if (Boolean.parseBoolean(answerStr) == cb.getBoolAnswer().booleanValue()) {
|
|
|
|
- answer.setScore(cb.getScore());
|
|
|
|
- } else {
|
|
|
|
- answer.setScore(0.0);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ if (StringUtils.isNotBlank(answer.getAnswer())) {
|
|
|
|
+ String answerStr = answer.getAnswer().replaceAll("\n", "");
|
|
|
|
+ if (StringUtils.isNotBlank(answerStr)) {
|
|
|
|
+ if (Boolean.parseBoolean(answerStr) == cb.getBoolAnswer().booleanValue()) {
|
|
|
|
+ answer.setScore(cb.getScore());
|
|
|
|
+ } else {
|
|
|
|
+ answer.setScore(0.0);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
if (answer.getScore() == null) {
|
|
if (answer.getScore() == null) {
|
|
@@ -859,6 +829,111 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public List<OpenRecordNeedMarkBean> findExamRecordNeedMark(Long examId, List<Long> examStudentIds) {
|
|
public List<OpenRecordNeedMarkBean> findExamRecordNeedMark(Long examId, List<Long> examStudentIds) {
|
|
- return tOeExamRecordMapper.findExamRecordNeedMark(examId,examStudentIds);
|
|
|
|
|
|
+ return tOeExamRecordMapper.findExamRecordNeedMark(examId, examStudentIds);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 寻找客观分最高
|
|
|
|
+ *
|
|
|
|
+ * @param examId
|
|
|
|
+ * @param examStudentId
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public List<TOeExamRecord> findMaxObjectiveScore(Long examId, Long examStudentId) {
|
|
|
|
+ return tOeExamRecordMapper.findMaxObjectiveScore(examId, examStudentId);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 查询成绩
|
|
|
|
+ *
|
|
|
|
+ * @param markResultDto
|
|
|
|
+ * @param recordSelectStrategyEnum
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public TOeExamRecord findMarkResult(MarkResultDto markResultDto, RecordSelectStrategyEnum recordSelectStrategyEnum) {
|
|
|
|
+ TOeExamRecord tOeExamRecord = null;
|
|
|
|
+ Double sumScore = null;
|
|
|
|
+ //客观分最高
|
|
|
|
+ if (Objects.nonNull(recordSelectStrategyEnum) && Objects.equals(recordSelectStrategyEnum, RecordSelectStrategyEnum.HIGHEST_OBJECTIVE_SCORE)) {
|
|
|
|
+ List<TOeExamRecord> tOeExamRecordList = this.findMaxObjectiveScore(markResultDto.getExamId(), markResultDto.getExamStudentId());
|
|
|
|
+ if (Objects.nonNull(tOeExamRecordList) && tOeExamRecordList.size() > 0) {
|
|
|
|
+ Long paperId = tOeExamRecordList.get(0).getPaperId();
|
|
|
|
+ ExamPaperCacheBean paperCacheBean = examPaperService.getExamPaperCacheBean(paperId);
|
|
|
|
+ boolean isHasSubjective = true;
|
|
|
|
+ if (paperCacheBean.getTotalSubjectiveScore().intValue() == 0) {
|
|
|
|
+ isHasSubjective = false;
|
|
|
|
+ }
|
|
|
|
+ //是否有主观题
|
|
|
|
+ if (!isHasSubjective) {
|
|
|
|
+ for (TOeExamRecord t : tOeExamRecordList) {
|
|
|
|
+ if (Objects.isNull(tOeExamRecord)) {
|
|
|
|
+ tOeExamRecord = t;
|
|
|
|
+ } else {
|
|
|
|
+ if (Objects.nonNull(t.getObjectiveScore()) && Objects.nonNull(tOeExamRecord.getObjectiveScore())
|
|
|
|
+ && t.getObjectiveScore().doubleValue() >= tOeExamRecord.getObjectiveScore().doubleValue()
|
|
|
|
+ && Objects.nonNull(t.getFinishTime()) && Objects.nonNull(tOeExamRecord.getFinishTime())
|
|
|
|
+ && t.getFinishTime().longValue() > tOeExamRecord.getFinishTime().longValue()) {
|
|
|
|
+ tOeExamRecord = t;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ //总分最高选取
|
|
|
|
+ tOeExamRecord = getMaxSumScore(tOeExamRecord, sumScore, markResultDto);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //最后一次提交
|
|
|
|
+ else if (Objects.nonNull(recordSelectStrategyEnum) && Objects.equals(recordSelectStrategyEnum, RecordSelectStrategyEnum.LATEST)) {
|
|
|
|
+ List<TOeExamRecord> tOeExamRecordList = this.findMaxObjectiveScore(markResultDto.getExamId(), markResultDto.getExamStudentId());
|
|
|
|
+ for (TOeExamRecord t : tOeExamRecordList) {
|
|
|
|
+ if (Objects.isNull(tOeExamRecord)) {
|
|
|
|
+ tOeExamRecord = t;
|
|
|
|
+ } else {
|
|
|
|
+ if (Objects.nonNull(t.getFinishTime()) && Objects.nonNull(tOeExamRecord.getFinishTime())
|
|
|
|
+ && t.getFinishTime().longValue() > tOeExamRecord.getFinishTime().longValue()) {
|
|
|
|
+ tOeExamRecord = t;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //全部阅卷后取最高分
|
|
|
|
+ else if (Objects.nonNull(recordSelectStrategyEnum) && Objects.equals(recordSelectStrategyEnum, RecordSelectStrategyEnum.HIGHEST_TOTAL_SCORE)) {
|
|
|
|
+ tOeExamRecord = getMaxSumScore(tOeExamRecord, sumScore, markResultDto);
|
|
|
|
+ }
|
|
|
|
+ return tOeExamRecord;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 取最高分
|
|
|
|
+ *
|
|
|
|
+ * @param tOeExamRecord
|
|
|
|
+ * @param sumScore
|
|
|
|
+ * @param markResultDto
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private TOeExamRecord getMaxSumScore(TOeExamRecord tOeExamRecord, Double sumScore, MarkResultDto markResultDto) {
|
|
|
|
+ Long examId = null, examStudentId = null;
|
|
|
|
+ if (Objects.isNull(sumScore)) {
|
|
|
|
+ sumScore = markResultDto.getSumScore();
|
|
|
|
+ examId = markResultDto.getExamId();
|
|
|
|
+ examStudentId = markResultDto.getExamStudentId();
|
|
|
|
+ } else {
|
|
|
|
+ if (Objects.nonNull(markResultDto.getSumScore())
|
|
|
|
+ && markResultDto.getSumScore().doubleValue() >= sumScore.doubleValue()) {
|
|
|
|
+ sumScore = markResultDto.getSumScore();
|
|
|
|
+ examId = markResultDto.getExamId();
|
|
|
|
+ examStudentId = markResultDto.getExamStudentId();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (Objects.nonNull(sumScore)) {
|
|
|
|
+ List<TOeExamRecord> tOeExamRecordList = this.findMaxObjectiveScore(examId, examStudentId);
|
|
|
|
+ if (Objects.nonNull(tOeExamRecordList) && tOeExamRecordList.size() > 0) {
|
|
|
|
+ tOeExamRecord = tOeExamRecordList.get(0);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return tOeExamRecord;
|
|
}
|
|
}
|
|
}
|
|
}
|