|
@@ -1,10 +1,18 @@
|
|
|
package com.qmth.teachcloud.common.service.impl;
|
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.qmth.teachcloud.common.bean.params.mark.setting.MarkQuestionParams;
|
|
|
import com.qmth.teachcloud.common.entity.MarkQuestion;
|
|
|
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
|
|
|
import com.qmth.teachcloud.common.mapper.MarkQuestionMapper;
|
|
|
import com.qmth.teachcloud.common.service.MarkQuestionService;
|
|
|
+import org.apache.commons.collections4.CollectionUtils;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
@@ -21,4 +29,76 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
|
|
|
public String groupQuestionsByExamIdAndPaperNumberAndNumber(Long examId, String paperNumber, Integer groupNumber) {
|
|
|
return this.baseMapper.groupQuestionsByExamIdAndPaperNumberAndNumber(examId, paperNumber, groupNumber);
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkQuestion> listQuestionByExamIdAndPaperNumber(Long examId, String paperNumber) {
|
|
|
+ QueryWrapper<MarkQuestion> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkQuestion::getExamId, examId)
|
|
|
+ .eq(MarkQuestion::getPaperNumber, paperNumber)
|
|
|
+ .orderByAsc(MarkQuestion::getMainNumber)
|
|
|
+ .orderByAsc(MarkQuestion::getSubNumber);
|
|
|
+ return this.list(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional
|
|
|
+ @Override
|
|
|
+ public void saveQuestions(MarkQuestionParams markQuestionParams) {
|
|
|
+ Long examId = markQuestionParams.getExamId();
|
|
|
+ String paperNumber = markQuestionParams.getPaperNumber();
|
|
|
+ List<MarkQuestion> questions = markQuestionParams.getQuestions();
|
|
|
+ if (CollectionUtils.isEmpty(questions)) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("没有可保存的结构数据");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 校验题号不能重复
|
|
|
+ Map<String, Long> longMap = questions.stream().collect(Collectors.groupingBy(m -> m.getMainNumber() + m.getSubNumber(), Collectors.counting()));
|
|
|
+ long count = longMap.entrySet().stream().filter(m -> m.getValue().intValue() > 1).count();
|
|
|
+ if (count > 0) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("大题号+小题号有重复数据");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询已有结构信息
|
|
|
+ List<MarkQuestion> markQuestionList = this.listQuestionByExamIdAndPaperNumber(examId, paperNumber);
|
|
|
+ if (CollectionUtils.isEmpty(markQuestionList)) {
|
|
|
+ for (MarkQuestion question : questions) {
|
|
|
+ if (question.getTotalScore() <= 0) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("小题满分必须大于0");
|
|
|
+ }
|
|
|
+ if (question.getIntervalScore() <= 0) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("间隔分必须大于0");
|
|
|
+ }
|
|
|
+ question.setExamId(examId);
|
|
|
+ question.setPaperNumber(paperNumber);
|
|
|
+ }
|
|
|
+ this.saveBatch(questions);
|
|
|
+ } else {
|
|
|
+ List<MarkQuestion> saveOrUpdateList = new ArrayList<>();
|
|
|
+ for (MarkQuestion question : questions) {
|
|
|
+ if (Objects.isNull(question.getId())) {
|
|
|
+ saveOrUpdateList.add(question);
|
|
|
+ } else {
|
|
|
+ Optional<MarkQuestion> questionOptional = markQuestionList.stream().filter(m -> m.getId().equals(question.getId())).findFirst();
|
|
|
+ if (questionOptional.isPresent()) {
|
|
|
+ MarkQuestion markQuestion = questionOptional.get();
|
|
|
+ if (markQuestion.getGroupNumber() != null && markQuestion.getGroupNumber().intValue() > 0 && markQuestion.getTotalScore().doubleValue() - question.getTotalScore().doubleValue() != 0) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("大题号" + markQuestion.getMainNumber() + "小题号" + markQuestion.getSubNumber() + "已分组,不能修改小题满分");
|
|
|
+ }
|
|
|
+ markQuestion.setTotalScore(question.getTotalScore());
|
|
|
+ saveOrUpdateList.add(markQuestion);
|
|
|
+ markQuestionList.remove(markQuestion);
|
|
|
+ } else {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("数据异常,请刷新页面后重新操作");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 已删除的结构
|
|
|
+ if (CollectionUtils.isNotEmpty(markQuestionList)) {
|
|
|
+ List<Long> deleteIds = markQuestionList.stream().map(MarkQuestion::getId).collect(Collectors.toList());
|
|
|
+ this.removeByIds(deleteIds);
|
|
|
+ }
|
|
|
+ this.saveOrUpdateBatch(saveOrUpdateList);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
}
|