|
@@ -2,6 +2,8 @@ package com.qmth.themis.business.service.impl;
|
|
|
|
|
|
import java.io.File;
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.Comparator;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
@@ -22,6 +24,7 @@ import com.qmth.themis.business.bean.backend.OpenExamBean;
|
|
|
import com.qmth.themis.business.bean.backend.OpenExamCourseBean;
|
|
|
import com.qmth.themis.business.bean.backend.OpenRecordAnswerBean;
|
|
|
import com.qmth.themis.business.bean.backend.OpenRecordNeedMarkBean;
|
|
|
+import com.qmth.themis.business.cache.RedisKeyHelper;
|
|
|
import com.qmth.themis.business.cache.bean.ExamPaperCacheBean;
|
|
|
import com.qmth.themis.business.config.SystemConfig;
|
|
|
import com.qmth.themis.business.constant.SpringContextHolder;
|
|
@@ -29,9 +32,11 @@ import com.qmth.themis.business.constant.SystemConstant;
|
|
|
import com.qmth.themis.business.entity.TEExam;
|
|
|
import com.qmth.themis.business.entity.TEExamCourse;
|
|
|
import com.qmth.themis.business.enums.InvigilateMonitorStatusEnum;
|
|
|
+import com.qmth.themis.business.enums.RecordSelectStrategyEnum;
|
|
|
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.TEOpenService;
|
|
|
import com.qmth.themis.business.service.TOeExamAnswerService;
|
|
|
import com.qmth.themis.business.service.TOeExamRecordService;
|
|
@@ -55,22 +60,27 @@ public class TEOpenServiceImpl implements TEOpenService {
|
|
|
|
|
|
@Resource
|
|
|
TOeExamAnswerService examAnswerService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ TEExamStudentService examStudentService;
|
|
|
|
|
|
|
|
|
@Override
|
|
|
- public IPage<OpenExamBean> examQueryPage(Long examId, String examCode, int pageNumber, int pageSize) {
|
|
|
+ public List<OpenExamBean> examQueryPage(Long examId, String examCode, int pageNumber, int pageSize) {
|
|
|
Page<OpenExamBean> ipage = new Page<>(pageNumber, pageSize);
|
|
|
ipage.addOrder(OrderItem.desc("t.id"));
|
|
|
- return examService.examQueryForOpen(ipage, examId, examCode);
|
|
|
+ IPage<OpenExamBean> ret=examService.examQueryForOpen(ipage, examId, examCode);
|
|
|
+ return ret.getRecords();
|
|
|
}
|
|
|
|
|
|
|
|
|
@Override
|
|
|
- public IPage<OpenExamCourseBean> examCourseQueryPage(Long examId, String courseCode, Boolean hasPaper,
|
|
|
+ public List<OpenExamCourseBean> examCourseQueryPage(Long examId, String courseCode, Boolean hasPaper,
|
|
|
int pageNumber, int pageSize) {
|
|
|
Page<OpenExamCourseBean> ipage = new Page<>(pageNumber, pageSize);
|
|
|
ipage.addOrder(OrderItem.desc("t.id"));
|
|
|
- return examCourseService.examCourseQueryForOpen(ipage, examId,courseCode, hasPaper);
|
|
|
+ IPage<OpenExamCourseBean> ret=examCourseService.examCourseQueryForOpen(ipage, examId,courseCode, hasPaper);
|
|
|
+ return ret.getRecords();
|
|
|
}
|
|
|
|
|
|
|
|
@@ -224,27 +234,49 @@ public class TEOpenServiceImpl implements TEOpenService {
|
|
|
|
|
|
|
|
|
@Override
|
|
|
- public JSONArray examRecordNeedMark(Long examId, String courseCode, Integer idGt,
|
|
|
+ public JSONArray examRecordNeedMark(Long examId, String courseCode, Long idGt,
|
|
|
Integer count) {
|
|
|
checkExam(examId);
|
|
|
- List<OpenRecordNeedMarkBean> list=examRecordService.findExamRecordNeedMark(examId,courseCode,idGt,count);
|
|
|
- if(list==null||list.size()==0) {
|
|
|
- return null;
|
|
|
+ List<OpenRecordNeedMarkBean> list;
|
|
|
+ for(;;) {
|
|
|
+ List<Long> examStudentIds=examStudentService.findExamStudentIdsNeedMark(examId,courseCode,idGt,count);
|
|
|
+ if(examStudentIds==null||examStudentIds.size()==0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ list=findExamRecordNeedMark(examId,examStudentIds);
|
|
|
+ if(list==null||list.size()==0) {
|
|
|
+ idGt=examStudentIds.get(examStudentIds.size()-1);
|
|
|
+ }else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
- List<Long> ids = list.stream().map(dto -> dto.getId()).collect(Collectors.toList());
|
|
|
+ List<Long> ids = list.stream().map(dto -> dto.getExamRecordId()).collect(Collectors.toList());
|
|
|
List<OpenRecordAnswerBean> answers=examAnswerService.findByRecordIds(ids);
|
|
|
- Map<Long,Integer> map=new HashMap<>();
|
|
|
- for(int i=0;i<list.size();i++) {
|
|
|
- map.put(list.get(i).getId(), i);
|
|
|
+ if(answers!=null&&answers.size()>0) {
|
|
|
+ for(int i=0;i<answers.size();i++) {//剔除客观题答案
|
|
|
+ OpenRecordAnswerBean answer=answers.get(i);
|
|
|
+ Map<String, Integer> struct=examPaperService.getPaperStructCacheBean(answer.getPaperId());
|
|
|
+ Integer type=struct.get(RedisKeyHelper.examAnswerHashKey(answer.getMainNumber(), answer.getSubNumber(), answer.getSubIndex()));
|
|
|
+ if(type==1||type==2||type==3) {
|
|
|
+ answers.remove(i);
|
|
|
+ i--;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- for(OpenRecordAnswerBean anwser:answers) {
|
|
|
- OpenRecordNeedMarkBean mark=list.get(map.get(anwser.getRecordId()));
|
|
|
- List<OpenRecordAnswerBean> ans=mark.getAnswers();
|
|
|
- if(ans==null) {
|
|
|
- ans=new ArrayList<OpenRecordAnswerBean>();
|
|
|
- mark.setAnswers(ans);
|
|
|
+ if(answers!=null&&answers.size()>0) {
|
|
|
+ Map<Long,Integer> map=new HashMap<>();
|
|
|
+ for(int i=0;i<list.size();i++) {
|
|
|
+ map.put(list.get(i).getExamRecordId(), i);
|
|
|
+ }
|
|
|
+ for(OpenRecordAnswerBean anwser:answers) {
|
|
|
+ OpenRecordNeedMarkBean mark=list.get(map.get(anwser.getRecordId()));
|
|
|
+ List<OpenRecordAnswerBean> ans=mark.getAnswers();
|
|
|
+ if(ans==null) {
|
|
|
+ ans=new ArrayList<OpenRecordAnswerBean>();
|
|
|
+ mark.setAnswers(ans);
|
|
|
+ }
|
|
|
+ ans.add(anwser);
|
|
|
}
|
|
|
- ans.add(anwser);
|
|
|
}
|
|
|
JSONArray ja = JSONArray.parseArray(JSONArray.toJSONString(list));
|
|
|
for(int i=0;i<ja.size();i++) {
|
|
@@ -254,6 +286,7 @@ public class TEOpenServiceImpl implements TEOpenService {
|
|
|
for(int j=0;j<answersJa.size();j++) {
|
|
|
JSONObject answersJob=answersJa.getJSONObject(j);
|
|
|
answersJob.remove("recordId");
|
|
|
+ answersJob.remove("paperId");
|
|
|
String answerStr=answersJob.getString("answer");
|
|
|
if(StringUtils.isNotBlank(answerStr)) {
|
|
|
if(answerStr.toLowerCase().startsWith("true")||answerStr.toLowerCase().startsWith("false")) {
|
|
@@ -267,4 +300,92 @@ public class TEOpenServiceImpl implements TEOpenService {
|
|
|
}
|
|
|
return ja;
|
|
|
}
|
|
|
+
|
|
|
+ private List<OpenRecordNeedMarkBean> findExamRecordNeedMark(Long examId, List<Long> examStudentIds){
|
|
|
+ List<OpenRecordNeedMarkBean> list=examRecordService.findExamRecordNeedMark(examId,examStudentIds);
|
|
|
+ if(list==null||list.size()==0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ for(int i=0;i<list.size();i++) {//剔除没有主观题的试卷考试记录
|
|
|
+ ExamPaperCacheBean paper=examPaperService.getExamPaperCacheBean(list.get(i).getPaperId());
|
|
|
+ if(paper.getTotalSubjectiveScore()==0) {
|
|
|
+ list.remove(i);
|
|
|
+ i--;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(list==null||list.size()==0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ TEExam exam=examService.getById(examId);
|
|
|
+ if(RecordSelectStrategyEnum.HIGHEST_TOTAL_SCORE.equals(exam.getRecordSelectStrategy())) {//全阅
|
|
|
+ return list;
|
|
|
+ }else if(RecordSelectStrategyEnum.HIGHEST_OBJECTIVE_SCORE.equals(exam.getRecordSelectStrategy())) {//客观分最高,相同则都阅
|
|
|
+ Map<Long,List<OpenRecordNeedMarkBean>> map=new HashMap<>();
|
|
|
+ for(OpenRecordNeedMarkBean bean:list) {
|
|
|
+ List<OpenRecordNeedMarkBean> temList=map.get(bean.getExamStudentId());
|
|
|
+ if(temList==null) {
|
|
|
+ temList=new ArrayList<OpenRecordNeedMarkBean>();
|
|
|
+ temList.add(bean);
|
|
|
+ map.put(bean.getExamStudentId(), temList);
|
|
|
+ }else {
|
|
|
+ if(temList.get(0).getObjectiveScore()==bean.getObjectiveScore()) {
|
|
|
+ temList.add(bean);
|
|
|
+ }else if(temList.get(0).getObjectiveScore()<bean.getObjectiveScore()) {
|
|
|
+ temList=new ArrayList<OpenRecordNeedMarkBean>();
|
|
|
+ temList.add(bean);
|
|
|
+ map.put(bean.getExamStudentId(), temList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<OpenRecordNeedMarkBean> ret= new ArrayList<OpenRecordNeedMarkBean>();
|
|
|
+ for(List<OpenRecordNeedMarkBean> tem:map.values()) {
|
|
|
+ for(OpenRecordNeedMarkBean bean:tem) {
|
|
|
+ ret.add(bean);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Collections.sort(ret, new Comparator<OpenRecordNeedMarkBean>() {
|
|
|
+ @Override
|
|
|
+ public int compare(OpenRecordNeedMarkBean o1, OpenRecordNeedMarkBean o2) {
|
|
|
+ Long c1 = o1.getExamStudentId();
|
|
|
+ Long c2 = o2.getExamStudentId();
|
|
|
+ if (c1 > c2) {
|
|
|
+ return 1;
|
|
|
+ } else if (c1 < c2) {
|
|
|
+ return -1;
|
|
|
+ } else {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ return ret;
|
|
|
+ }else if(RecordSelectStrategyEnum.LATEST.equals(exam.getRecordSelectStrategy())) {//最后一次提交
|
|
|
+ Map<Long,OpenRecordNeedMarkBean> map=new HashMap<>();
|
|
|
+ for(OpenRecordNeedMarkBean bean:list) {
|
|
|
+ OpenRecordNeedMarkBean old=map.get(bean.getExamStudentId());
|
|
|
+ if(old==null||old.getFinishTime()<bean.getFinishTime()) {
|
|
|
+ map.put(bean.getExamStudentId(), bean);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<OpenRecordNeedMarkBean> ret= map.values().stream().collect(Collectors.toList());
|
|
|
+ Collections.sort(ret, new Comparator<OpenRecordNeedMarkBean>() {
|
|
|
+ @Override
|
|
|
+ public int compare(OpenRecordNeedMarkBean o1, OpenRecordNeedMarkBean o2) {
|
|
|
+ Long c1 = o1.getExamStudentId();
|
|
|
+ Long c2 = o2.getExamStudentId();
|
|
|
+ if (c1 > c2) {
|
|
|
+ return 1;
|
|
|
+ } else if (c1 < c2) {
|
|
|
+ return -1;
|
|
|
+ } else {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ return ret;
|
|
|
+ }else {
|
|
|
+ throw new BusinessException("考试批次阅卷类型未定义");
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|