|
@@ -1,23 +1,5 @@
|
|
|
package com.qmth.teachcloud.mark.service.impl;
|
|
|
|
|
|
-import java.util.*;
|
|
|
-import java.util.stream.Collectors;
|
|
|
-import java.util.stream.Stream;
|
|
|
-
|
|
|
-import javax.annotation.Resource;
|
|
|
-import javax.servlet.http.HttpServletResponse;
|
|
|
-
|
|
|
-import com.qmth.teachcloud.common.bean.result.MarkQuestionResult;
|
|
|
-import com.qmth.teachcloud.mark.bean.cardJson.DescriptionCourse;
|
|
|
-import com.qmth.teachcloud.mark.bean.vo.parseCard.Struct;
|
|
|
-import com.qmth.teachcloud.mark.service.*;
|
|
|
-import org.apache.commons.collections4.CollectionUtils;
|
|
|
-import org.apache.commons.collections4.MapUtils;
|
|
|
-import org.apache.commons.lang3.StringUtils;
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
-import org.springframework.transaction.annotation.Transactional;
|
|
|
-import org.springframework.web.multipart.MultipartFile;
|
|
|
-
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
@@ -33,11 +15,26 @@ import com.qmth.teachcloud.common.util.ConvertUtil;
|
|
|
import com.qmth.teachcloud.common.util.ExcelUtil;
|
|
|
import com.qmth.teachcloud.common.util.FileStoreUtil;
|
|
|
import com.qmth.teachcloud.common.util.ServletUtil;
|
|
|
+import com.qmth.teachcloud.mark.dto.mark.MarkQuestionAnswerVo;
|
|
|
import com.qmth.teachcloud.mark.dto.mark.setting.MarkQuestionDto;
|
|
|
import com.qmth.teachcloud.mark.entity.MarkPaper;
|
|
|
+import com.qmth.teachcloud.mark.entity.MarkQuestionAnswer;
|
|
|
import com.qmth.teachcloud.mark.mapper.MarkQuestionMapper;
|
|
|
import com.qmth.teachcloud.mark.params.MarkObjectiveQuestionParams;
|
|
|
import com.qmth.teachcloud.mark.params.MarkQuestionParams;
|
|
|
+import com.qmth.teachcloud.mark.service.*;
|
|
|
+import org.apache.commons.collections4.CollectionUtils;
|
|
|
+import org.apache.commons.collections4.MapUtils;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+import java.util.stream.Stream;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
@@ -57,6 +54,8 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
|
|
|
@Resource
|
|
|
private MarkGroupService markGroupService;
|
|
|
@Resource
|
|
|
+ private MarkQuestionAnswerService markQuestionAnswerService;
|
|
|
+ @Resource
|
|
|
private MarkService markService;
|
|
|
@Resource
|
|
|
private FileStoreUtil fileStoreUtil;
|
|
@@ -66,14 +65,45 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
|
|
|
return this.baseMapper.assembleQuestionsByExamIdAndPaperNumberAndNumber(examId, paperNumber, groupNumber);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<MarkQuestion> listQuestionByExamIdAndPaperNumber(Long examId, String paperNumber) {
|
|
|
+ QueryWrapper<MarkQuestion> queryWrapper = new QueryWrapper<>();
|
|
|
+ LambdaQueryWrapper<MarkQuestion> lambdaQueryWrapper = queryWrapper.lambda();
|
|
|
+ lambdaQueryWrapper.eq(MarkQuestion::getExamId, examId)
|
|
|
+ .eq(MarkQuestion::getPaperNumber, paperNumber);
|
|
|
+ lambdaQueryWrapper.orderByAsc(MarkQuestion::getMainNumber)
|
|
|
+ .orderByAsc(MarkQuestion::getSubNumber);
|
|
|
+ return this.list(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public List<MarkQuestion> listQuestionByExamIdAndPaperNumberAndPaperType(Long examId, String paperNumber, String paperType) {
|
|
|
+ QueryWrapper<MarkQuestion> queryWrapper = new QueryWrapper<>();
|
|
|
+ LambdaQueryWrapper<MarkQuestion> lambdaQueryWrapper = queryWrapper.lambda();
|
|
|
+ lambdaQueryWrapper.eq(MarkQuestion::getExamId, examId)
|
|
|
+ .eq(MarkQuestion::getPaperNumber, paperNumber)
|
|
|
+ .and(m -> m.isNull(MarkQuestion::getPaperType).or().eq(MarkQuestion::getPaperType, paperType));
|
|
|
+ lambdaQueryWrapper.orderByAsc(MarkQuestion::getMainNumber)
|
|
|
+ .orderByAsc(MarkQuestion::getSubNumber);
|
|
|
+ return this.list(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkQuestion> listQuestionByExamIdAndPaperNumberAndPaperType(Long examId, String paperNumber, String paperType, Boolean objective) {
|
|
|
+ if (objective == null) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("objective参数必传");
|
|
|
+ }
|
|
|
QueryWrapper<MarkQuestion> queryWrapper = new QueryWrapper<>();
|
|
|
LambdaQueryWrapper<MarkQuestion> lambdaQueryWrapper = queryWrapper.lambda();
|
|
|
lambdaQueryWrapper.eq(MarkQuestion::getExamId, examId)
|
|
|
.eq(MarkQuestion::getPaperNumber, paperNumber);
|
|
|
- if (StringUtils.isNotBlank(paperType)) {
|
|
|
+ if (objective) {
|
|
|
+ if (StringUtils.isBlank(paperType)) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("查询客观题时,卷型必传");
|
|
|
+ }
|
|
|
lambdaQueryWrapper.eq(MarkQuestion::getPaperType, paperType);
|
|
|
+ } else {
|
|
|
+ lambdaQueryWrapper.isNull(MarkQuestion::getPaperType);
|
|
|
}
|
|
|
lambdaQueryWrapper.orderByAsc(MarkQuestion::getMainNumber)
|
|
|
.orderByAsc(MarkQuestion::getSubNumber);
|
|
@@ -81,12 +111,25 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<MarkQuestion> listQuestionByExamIdAndPaperNumberAndSerialNumber(Long examId, String paperNumber, Integer serialNumber) {
|
|
|
+ public List<MarkQuestion> listQuestionByExamIdAndPaperNumberAndSerialNumberAndObjectiveFalse(Long examId, String paperNumber, Integer serialNumber) {
|
|
|
QueryWrapper<MarkQuestion> queryWrapper = new QueryWrapper<>();
|
|
|
LambdaQueryWrapper<MarkQuestion> lambdaQueryWrapper = queryWrapper.lambda();
|
|
|
lambdaQueryWrapper.eq(MarkQuestion::getExamId, examId)
|
|
|
.eq(MarkQuestion::getPaperNumber, paperNumber)
|
|
|
- .eq(MarkQuestion::getSerialNumber, serialNumber);
|
|
|
+ .eq(MarkQuestion::getObjective, false);
|
|
|
+ lambdaQueryWrapper.orderByAsc(MarkQuestion::getMainNumber)
|
|
|
+ .orderByAsc(MarkQuestion::getSubNumber);
|
|
|
+ return this.list(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkQuestion> listQuestionByExamIdAndPaperNumberAndSerialNumberAndPaperTypeAndObjectiveTrue(Long examId, String paperNumber, Integer serialNumber, String paperType) {
|
|
|
+ QueryWrapper<MarkQuestion> queryWrapper = new QueryWrapper<>();
|
|
|
+ LambdaQueryWrapper<MarkQuestion> lambdaQueryWrapper = queryWrapper.lambda();
|
|
|
+ lambdaQueryWrapper.eq(MarkQuestion::getExamId, examId)
|
|
|
+ .eq(MarkQuestion::getPaperNumber, paperNumber)
|
|
|
+ .eq(MarkQuestion::getPaperType, paperType)
|
|
|
+ .eq(MarkQuestion::getObjective, true);
|
|
|
lambdaQueryWrapper.orderByAsc(MarkQuestion::getMainNumber)
|
|
|
.orderByAsc(MarkQuestion::getSubNumber);
|
|
|
return this.list(queryWrapper);
|
|
@@ -113,7 +156,7 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
|
|
|
}
|
|
|
|
|
|
// 查询已有结构信息
|
|
|
- List<MarkQuestion> markQuestionList = this.listQuestionByExamIdAndPaperNumberAndPaperType(examId, paperNumber, null);
|
|
|
+ List<MarkQuestion> markQuestionList = this.listQuestionByExamIdAndPaperNumber(examId, paperNumber);
|
|
|
if (CollectionUtils.isEmpty(markQuestionList)) {
|
|
|
for (MarkQuestion question : questions) {
|
|
|
if (question.getTotalScore() <= 0) {
|
|
@@ -163,19 +206,15 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
|
|
|
// 客观题变主观题
|
|
|
if (markQuestion.getObjective() && !question.getObjective()) {
|
|
|
// 清除判分策略
|
|
|
- markQuestion.setObjectivePolicy(null);
|
|
|
- markQuestion.setObjectivePolicyScore(null);
|
|
|
- markQuestion.setAnswer(null);
|
|
|
markQuestion.setOptionCount(0);
|
|
|
+ markQuestionAnswerService.deleteByExamIdAndPaperNumberAndMainNumberAndSubNumber(examId, paperNumber, markQuestion.getMainNumber(), markQuestion.getSubNumber());
|
|
|
}
|
|
|
// 客观题
|
|
|
if (question.getObjective()) {
|
|
|
markQuestion.setOptionCount(question.getOptionCount());
|
|
|
if (!markQuestion.getQuestionType().equals(question.getQuestionType())) {
|
|
|
// 清除判分策略
|
|
|
- markQuestion.setObjectivePolicy(null);
|
|
|
- markQuestion.setObjectivePolicyScore(null);
|
|
|
- markQuestion.setAnswer(null);
|
|
|
+ markQuestionAnswerService.resetObjectivePolicyByExamIdAndPaperNumberAndMainNumberAndSubNumber(examId, paperNumber, markQuestion.getMainNumber(), markQuestion.getSubNumber());
|
|
|
}
|
|
|
}
|
|
|
// 大题号
|
|
@@ -212,6 +251,10 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
|
|
|
if (CollectionUtils.isNotEmpty(markQuestionList)) {
|
|
|
List<Long> deleteIds = markQuestionList.stream().map(MarkQuestion::getId).collect(Collectors.toList());
|
|
|
this.removeByIds(deleteIds);
|
|
|
+
|
|
|
+ markQuestionList.stream().filter(m -> m.getObjective()).forEach(m -> {
|
|
|
+ markQuestionAnswerService.deleteByExamIdAndPaperNumberAndMainNumberAndSubNumber(examId, paperNumber, m.getMainNumber(), m.getSubNumber());
|
|
|
+ });
|
|
|
}
|
|
|
this.saveOrUpdateBatch(saveOrUpdateList);
|
|
|
}
|
|
@@ -277,7 +320,8 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
|
|
|
dto.setMainNumber(String.valueOf(e.getMainNumber()));
|
|
|
dto.setSubNumber(String.valueOf(e.getSubNumber()));
|
|
|
dto.setMainTitle(e.getMainTitle());
|
|
|
- dto.setAnswer(e.getAnswer());
|
|
|
+ // todo 2024-10-16
|
|
|
+// dto.setAnswer(e.getAnswer());
|
|
|
return Stream.of(dto);
|
|
|
}).collect(Collectors.toList());
|
|
|
|
|
@@ -326,7 +370,8 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
|
|
|
questionNumberSet.add(key);
|
|
|
if (markQuestionMap.containsKey(key)) {
|
|
|
MarkQuestion markQuestion = markQuestionMap.get(key);
|
|
|
- markQuestion.setAnswer(exAnswer);
|
|
|
+ // todo 2024-10-16
|
|
|
+// markQuestion.setAnswer(exAnswer);
|
|
|
willEditList.add(markQuestion);
|
|
|
String mainTitle = markQuestion.getMainTitle();
|
|
|
if (!Objects.equals(exMainTitle, mainTitle)) {
|
|
@@ -403,28 +448,29 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
|
|
|
@Transactional
|
|
|
@Override
|
|
|
public void saveObjectiveQuestions(MarkObjectiveQuestionParams markObjectiveQuestionParams) {
|
|
|
- for (MarkQuestion question : markObjectiveQuestionParams.getObjectiveInfo()) {
|
|
|
- if (StringUtils.isBlank(question.getAnswer())) {
|
|
|
+ for (MarkQuestionAnswer answer : markObjectiveQuestionParams.getObjectiveInfo()) {
|
|
|
+ if (StringUtils.isBlank(answer.getAnswer())) {
|
|
|
throw ExceptionResultEnum.ERROR.exception("答案不能为空");
|
|
|
}
|
|
|
- if (question.getObjectivePolicy() != null && question.getObjectivePolicy().equals(ObjectivePolicy.LEAK)) {
|
|
|
- if (question.getObjectivePolicyScore() == null) {
|
|
|
+ if (answer.getObjectivePolicy() != null && answer.getObjectivePolicy().equals(ObjectivePolicy.LEAK)) {
|
|
|
+ if (answer.getObjectivePolicyScore() == null) {
|
|
|
throw ExceptionResultEnum.ERROR.exception("漏选给分不能没有计分规则");
|
|
|
}
|
|
|
- if (question.getObjectivePolicyScore() > (question.getTotalScore() / question.getAnswer().length())) {
|
|
|
+ if (answer.getObjectivePolicyScore() > (answer.getTotalScore() / answer.getAnswer().length())) {
|
|
|
throw ExceptionResultEnum.ERROR.exception("漏选给分计分规则有误");
|
|
|
}
|
|
|
}
|
|
|
- UpdateWrapper<MarkQuestion> updateWrapper = new UpdateWrapper<>();
|
|
|
- updateWrapper.lambda().set(MarkQuestion::getAnswer, question.getAnswer());
|
|
|
- if (question.getObjectivePolicy() != null) {
|
|
|
- updateWrapper.lambda().set(MarkQuestion::getObjectivePolicy, question.getObjectivePolicy());
|
|
|
+ UpdateWrapper<MarkQuestionAnswer> updateWrapper = new UpdateWrapper<>();
|
|
|
+ updateWrapper.lambda().set(MarkQuestionAnswer::getAnswer, answer.getAnswer())
|
|
|
+ .set(MarkQuestionAnswer::getUpdateTime, System.currentTimeMillis());
|
|
|
+ if (answer.getObjectivePolicy() != null) {
|
|
|
+ updateWrapper.lambda().set(MarkQuestionAnswer::getObjectivePolicy, answer.getObjectivePolicy());
|
|
|
}
|
|
|
- if (question.getObjectivePolicyScore() != null) {
|
|
|
- updateWrapper.lambda().set(MarkQuestion::getObjectivePolicyScore, question.getObjectivePolicyScore());
|
|
|
+ if (answer.getObjectivePolicyScore() != null) {
|
|
|
+ updateWrapper.lambda().set(MarkQuestionAnswer::getObjectivePolicyScore, answer.getObjectivePolicyScore());
|
|
|
}
|
|
|
- updateWrapper.lambda().eq(MarkQuestion::getId, question.getId());
|
|
|
- this.update(updateWrapper);
|
|
|
+ updateWrapper.lambda().eq(MarkQuestionAnswer::getId, answer.getId());
|
|
|
+ markQuestionAnswerService.update(updateWrapper);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -480,13 +526,13 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public MarkQuestionDto pageQuestionsByExamIdAndPaperNumber(Long examId, String paperNumber, String paperType) {
|
|
|
+ public MarkQuestionDto pageQuestionsByExamIdAndPaperNumberAndSerialNumberAndPaperType(Long examId, String paperNumber, Integer serialNumber, String paperType) {
|
|
|
MarkQuestionDto markQuestionDto = new MarkQuestionDto();
|
|
|
- MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
|
|
|
- List<MarkQuestion> markQuestionList = this.listQuestionByExamIdAndPaperNumberAndPaperType(examId, paperNumber, null);
|
|
|
+ MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumberAndSerialNumber(examId, paperNumber, serialNumber);
|
|
|
+ // 试卷结构,默认只取A卷
|
|
|
+ List<MarkQuestion> markQuestionList = this.listQuestionByExamIdAndPaperNumberAndPaperType(examId, paperNumber, SystemConstant.DEFAULT_PAPER_TYPE_A);
|
|
|
markQuestionDto.setQuestionSubmit(markPaper.getQuestionStatus());
|
|
|
- long objectiveCount = markQuestionList.stream().filter(m -> m.getObjective() && StringUtils.isNotBlank(m.getAnswer()) && m.getUpdateTime() != null).count();
|
|
|
- markQuestionDto.setObjectiveSubmit(objectiveCount > 0);
|
|
|
+ markQuestionDto.setObjectiveSubmit(markQuestionAnswerService.countByExamIdAndPaperNumber(examId, paperNumber) > 0);
|
|
|
markQuestionDto.setQuestions(markQuestionList);
|
|
|
return markQuestionDto;
|
|
|
}
|
|
@@ -528,11 +574,6 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
|
|
|
return this.list(queryWrapper);
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public List<MarkQuestionResult> listDetailByExamIdAndPaperNumberAndPaperType(Long examId, String paperNumber, String paperType, Boolean objective) {
|
|
|
- return this.baseMapper.listByExamIdAndPaperNumberAndPaperType(examId, paperNumber, paperType, objective);
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
public void deleteByExamIdAndPaperNumber(Long examId, String paperNumber) {
|
|
|
UpdateWrapper<MarkQuestion> updateWrapper = new UpdateWrapper<>();
|
|
@@ -558,4 +599,9 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
|
|
|
.eq(MarkPaper::getPaperNumber, paperNumber);
|
|
|
markPaperService.update(updateWrapper);
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkQuestionAnswerVo> listQuestionAnswerByExamIdAndPaperNumberAndPaperType(Long examId, String paperNumber, String paperType, Boolean objective) {
|
|
|
+ return this.baseMapper.listQuestionAnswerByExamIdAndPaperNumberAndPaperType(examId, paperNumber, paperType, objective);
|
|
|
+ }
|
|
|
}
|