|
@@ -10,19 +10,20 @@ import com.qmth.boot.core.exception.ParameterException;
|
|
import com.qmth.teachcloud.common.entity.BasicExam;
|
|
import com.qmth.teachcloud.common.entity.BasicExam;
|
|
import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
|
|
import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
|
|
import com.qmth.teachcloud.common.enums.ScanStatus;
|
|
import com.qmth.teachcloud.common.enums.ScanStatus;
|
|
|
|
+import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
|
|
import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
|
|
import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
|
|
import com.qmth.teachcloud.common.enums.scan.ConditionType;
|
|
import com.qmth.teachcloud.common.enums.scan.ConditionType;
|
|
import com.qmth.teachcloud.common.service.TeachcloudCommonService;
|
|
import com.qmth.teachcloud.common.service.TeachcloudCommonService;
|
|
import com.qmth.teachcloud.mark.bean.scanexaminfo.CheckTask;
|
|
import com.qmth.teachcloud.mark.bean.scanexaminfo.CheckTask;
|
|
import com.qmth.teachcloud.mark.bean.scanexaminfo.ScanExamCheckInfoVo;
|
|
import com.qmth.teachcloud.mark.bean.scanexaminfo.ScanExamCheckInfoVo;
|
|
import com.qmth.teachcloud.mark.bean.scanexaminfo.ScanExamInfoVo;
|
|
import com.qmth.teachcloud.mark.bean.scanexaminfo.ScanExamInfoVo;
|
|
-import com.qmth.teachcloud.mark.dto.mark.score.SheetUrlDto;
|
|
|
|
-import com.qmth.teachcloud.mark.dto.mark.score.StudentPaperDetailDto;
|
|
|
|
-import com.qmth.teachcloud.mark.dto.mark.score.StudentScoreDetailDto;
|
|
|
|
|
|
+import com.qmth.teachcloud.mark.dto.mark.ScoreInfo;
|
|
|
|
+import com.qmth.teachcloud.mark.dto.mark.score.*;
|
|
import com.qmth.teachcloud.mark.entity.*;
|
|
import com.qmth.teachcloud.mark.entity.*;
|
|
import com.qmth.teachcloud.mark.enums.OmrTaskStatus;
|
|
import com.qmth.teachcloud.mark.enums.OmrTaskStatus;
|
|
import com.qmth.teachcloud.mark.mapper.MarkStudentMapper;
|
|
import com.qmth.teachcloud.mark.mapper.MarkStudentMapper;
|
|
import com.qmth.teachcloud.mark.service.*;
|
|
import com.qmth.teachcloud.mark.service.*;
|
|
|
|
+import com.qmth.teachcloud.mark.utils.ScoreCalculateUtil;
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -33,7 +34,9 @@ import javax.annotation.Resource;
|
|
import javax.validation.constraints.NotNull;
|
|
import javax.validation.constraints.NotNull;
|
|
import java.text.DecimalFormat;
|
|
import java.text.DecimalFormat;
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
|
|
+import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -61,6 +64,8 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
|
|
@Autowired
|
|
@Autowired
|
|
private ScanStudentPaperService studentPaperService;
|
|
private ScanStudentPaperService studentPaperService;
|
|
@Resource
|
|
@Resource
|
|
|
|
+ private MarkQuestionService markQuestionService;
|
|
|
|
+ @Resource
|
|
private TeachcloudCommonService teachcloudCommonService;
|
|
private TeachcloudCommonService teachcloudCommonService;
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -244,4 +249,135 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
|
|
lw.eq(MarkStudent::getStudentCode, studentCode);
|
|
lw.eq(MarkStudent::getStudentCode, studentCode);
|
|
return baseMapper.selectOne(wrapper);
|
|
return baseMapper.selectOne(wrapper);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public StudentObjectiveDetailDto getCheckObjectiveTask(Long studentId) {
|
|
|
|
+ MarkStudent markStudent = this.getById(studentId);
|
|
|
|
+ StudentObjectiveDetailDto studentObjectiveDetailDto = new StudentObjectiveDetailDto();
|
|
|
|
+ if (markStudent != null) {
|
|
|
|
+ studentObjectiveDetailDto.setStudentId(markStudent.getId());
|
|
|
|
+ studentObjectiveDetailDto.setStudentName(markStudent.getStudentName());
|
|
|
|
+ studentObjectiveDetailDto.setStudentCode(markStudent.getStudentCode());
|
|
|
|
+ studentObjectiveDetailDto.setExamPlace(markStudent.getExamPlace());
|
|
|
|
+ studentObjectiveDetailDto.setExamRoom(markStudent.getExamRoom());
|
|
|
|
+ studentObjectiveDetailDto.setExamId(markStudent.getExamId());
|
|
|
|
+ studentObjectiveDetailDto.setCourseCode(markStudent.getCourseCode());
|
|
|
|
+ studentObjectiveDetailDto.setCourseName(markStudent.getCourseName());
|
|
|
|
+ studentObjectiveDetailDto.setPaperNumber(markStudent.getPaperNumber());
|
|
|
|
+ studentObjectiveDetailDto.setObjectiveScore(markStudent.getObjectiveScore() != null ? markStudent.getObjectiveScore() : 0);
|
|
|
|
+ studentObjectiveDetailDto.setSubjectiveScore(markStudent.getSubjectiveScore() != null ? markStudent.getSubjectiveScore() : 0);
|
|
|
|
+ studentObjectiveDetailDto.setUpload(markStudent.getUpload());
|
|
|
|
+ studentObjectiveDetailDto.setAbsent(markStudent.getAbsent());
|
|
|
|
+ studentObjectiveDetailDto.setSheetUrls(this.buildSheetUrls(studentId));
|
|
|
|
+
|
|
|
|
+ List<MarkQuestion> questions = markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(markStudent.getExamId(), markStudent.getPaperNumber(), null, true);
|
|
|
|
+ List<String> answers = markStudent.getAnswerList();
|
|
|
|
+ int questionCount = questions.size();
|
|
|
|
+ int answerCount = answers.size();
|
|
|
|
+
|
|
|
|
+ List<StudentObjectiveAnswerDto> answerDtoList = new ArrayList<>();
|
|
|
|
+ Map<Integer, String> titles = new HashMap<>();
|
|
|
|
+ // 已设置客观题
|
|
|
|
+ int maxCount = Math.max(questionCount, answerCount);
|
|
|
|
+ for (int i = 0; i < maxCount; i++) {
|
|
|
|
+ MarkQuestion q = questionCount > i ? questions.get(i) : null;
|
|
|
|
+ String answer = answerCount > i ? answers.get(i) : "#";
|
|
|
|
+ StudentObjectiveAnswerDto studentObjectiveAnswerDto = new StudentObjectiveAnswerDto();
|
|
|
|
+ studentObjectiveAnswerDto.setMainNumber(q != null ? q.getMainNumber() : 0);
|
|
|
|
+ studentObjectiveAnswerDto.setSubNumber(q != null ? q.getSubNumber() : 0);
|
|
|
|
+ studentObjectiveAnswerDto.setAnswer(answer);
|
|
|
|
+ studentObjectiveAnswerDto.setExist(q != null && q.getTotalScore() > 0);
|
|
|
|
+ studentObjectiveAnswerDto.setQuestionType(q != null && q.getQuestionType() != null ? q.getQuestionType() : "");
|
|
|
|
+ answerDtoList.add(studentObjectiveAnswerDto);
|
|
|
|
+
|
|
|
|
+ if (q != null) {
|
|
|
|
+ titles.put(q.getMainNumber(), q.getMainTitle());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ studentObjectiveDetailDto.setAnswers(answerDtoList);
|
|
|
|
+ studentObjectiveDetailDto.setTitles(titles);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return studentObjectiveDetailDto;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public Boolean saveCheckObjectiveTask(Long studentId, String answers) {
|
|
|
|
+ MarkStudent student = this.getById(studentId);
|
|
|
|
+ answers = StringUtils.trimToEmpty(answers);
|
|
|
|
+ if (student != null) {
|
|
|
|
+ student.setAnswers(answers.toUpperCase());
|
|
|
|
+ this.updateById(student);
|
|
|
|
+ return saveUploadStudent(student);
|
|
|
|
+ } else {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public int countUploadedByExamIdAndPaperNumber(Long examId, String paperNumber) {
|
|
|
|
+ QueryWrapper<MarkStudent> queryWrapper = new QueryWrapper<>();
|
|
|
|
+ queryWrapper.lambda().eq(MarkStudent::getExamId, examId)
|
|
|
|
+ .eq(MarkStudent::getPaperNumber, paperNumber)
|
|
|
|
+ .eq(MarkStudent::getUpload, true)
|
|
|
|
+ .eq(MarkStudent::getAbsent, false)
|
|
|
|
+ .eq(MarkStudent::getBreach, false);
|
|
|
|
+ return this.count(queryWrapper);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public boolean updateScanInfo(MarkStudent student) {
|
|
|
|
+ UpdateWrapper<MarkStudent> updateWrapper = new UpdateWrapper<>();
|
|
|
|
+ updateWrapper.lambda().set(MarkStudent::getSheetCount, student.getSheetCount())
|
|
|
|
+ .set(MarkStudent::getAnswers, student.getAnswers())
|
|
|
|
+ .set(MarkStudent::getBatchCode, student.getBatchCode())
|
|
|
|
+ .set(MarkStudent::getAbsent, student.getAbsent())
|
|
|
|
+ .set(MarkStudent::getUpload, true)
|
|
|
|
+ .set(MarkStudent::getUploadTime, System.currentTimeMillis())
|
|
|
|
+ .set(MarkStudent::getObjectiveScore, student.getObjectiveScore())
|
|
|
|
+ .set(MarkStudent::getObjectiveScoreList, student.getObjectiveScoreList())
|
|
|
|
+ .set(MarkStudent::getCardNumber, student.getCardNumber())
|
|
|
|
+ .eq(MarkStudent::getId, student.getId());
|
|
|
|
+ return this.update(updateWrapper);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private boolean saveUploadStudent(MarkStudent student) {
|
|
|
|
+ MarkStudent old = this.getById(student.getId());
|
|
|
|
+ if (!student.getAbsent()) {// 正考
|
|
|
|
+ MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(student.getExamId(), student.getPaperNumber());
|
|
|
|
+ if (markPaper.getStatus().equals(MarkPaperStatus.FINISH)) {
|
|
|
|
+ markPaperService.updateStatus(markPaper.getExamId(), markPaper.getPaperNumber(), MarkPaperStatus.FORMAL, MarkPaperStatus.FINISH);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ calculateObjectiveScore(student);
|
|
|
|
+ if (student.getAbsent()) {// 转缺考
|
|
|
|
+ student.setObjectiveScore(0d);
|
|
|
|
+ student.setObjectiveScoreList(null);
|
|
|
|
+ }
|
|
|
|
+ if (!old.getAbsent() && student.getAbsent()) {// 正考转缺考
|
|
|
|
+ student.setSubjectiveScore(0d);
|
|
|
|
+ student.setSubjectiveScoreList(null);
|
|
|
|
+ this.updateById(student);
|
|
|
|
+ this.updateSubjectiveStatusAndScore(student.getId(), SubjectiveStatus.UNMARK, 0D, null);
|
|
|
|
+ }
|
|
|
|
+ boolean success = this.updateScanInfo(student);
|
|
|
|
+ if (success) {
|
|
|
|
+ markPaperService.updateUploadCount(
|
|
|
|
+ student.getExamId(),
|
|
|
|
+ student.getPaperNumber(),
|
|
|
|
+ this.countUploadedByExamIdAndPaperNumber(student.getExamId(), student.getPaperNumber()));
|
|
|
|
+ }
|
|
|
|
+ return success;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void calculateObjectiveScore(MarkStudent student) {
|
|
|
|
+ ScoreCalculateUtil util = ScoreCalculateUtil.instance(student);
|
|
|
|
+
|
|
|
|
+ ScoreInfo info = util.calculate(
|
|
|
|
+ markQuestionService.listQuestionByExamIdAndPaperNumberAndGroupNumber(student.getExamId(),
|
|
|
|
+ student.getPaperNumber(), null, true), null);
|
|
|
|
+ student.setObjectiveScore(info.getObjectiveScore());
|
|
|
|
+ student.setScoreList(info.getScoreList(), true);
|
|
|
|
+ }
|
|
}
|
|
}
|