package com.ycl.jxkg.service.impl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ycl.jxkg.domain.other.KeyValue;
|
import com.ycl.jxkg.domain.Question;
|
import com.ycl.jxkg.domain.TextContent;
|
import com.ycl.jxkg.domain.enums.QuestionStatusEnum;
|
import com.ycl.jxkg.domain.enums.QuestionTypeEnum;
|
import com.ycl.jxkg.domain.question.QuestionItemObject;
|
import com.ycl.jxkg.domain.question.QuestionObject;
|
import com.ycl.jxkg.mapper.QuestionMapper;
|
import com.ycl.jxkg.service.QuestionService;
|
import com.ycl.jxkg.service.SubjectService;
|
import com.ycl.jxkg.service.TextContentService;
|
import com.ycl.jxkg.utils.DateTimeUtil;
|
import com.ycl.jxkg.utils.JsonUtil;
|
import com.ycl.jxkg.utils.ExamUtil;
|
import com.ycl.jxkg.vo.admin.question.QuestionEditItemVO;
|
import com.ycl.jxkg.vo.admin.question.QuestionEditRequestVO;
|
import com.ycl.jxkg.vo.admin.question.QuestionPageRequestVO;
|
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageInfo;
|
import lombok.RequiredArgsConstructor;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.util.Date;
|
import java.util.List;
|
import java.util.stream.Collectors;
|
|
@Service
|
@RequiredArgsConstructor
|
public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> implements QuestionService {
|
|
private final QuestionMapper questionMapper;
|
private final TextContentService textContentService;
|
private final SubjectService subjectService;
|
|
|
@Override
|
public PageInfo<Question> page(QuestionPageRequestVO requestVM) {
|
return PageHelper.startPage(requestVM.getPageIndex(), requestVM.getPageSize(), "id desc").doSelectPageInfo(() ->
|
questionMapper.page(requestVM)
|
);
|
}
|
|
|
@Override
|
@Transactional
|
public Question insertFullQuestion(QuestionEditRequestVO model, Integer userId) {
|
Date now = new Date();
|
Integer gradeLevel = subjectService.levelBySubjectId(model.getSubjectId());
|
|
//题干、解析、选项等 插入
|
TextContent infoTextContent = new TextContent();
|
infoTextContent.setCreateTime(now);
|
setQuestionInfoFromVM(infoTextContent, model);
|
textContentService.save(infoTextContent);
|
|
Question question = new Question();
|
question.setSubjectId(model.getSubjectId());
|
question.setGradeLevel(gradeLevel);
|
question.setCreateTime(now);
|
question.setQuestionType(model.getQuestionType());
|
question.setStatus(QuestionStatusEnum.OK.getCode());
|
question.setCorrectFromVM(model.getCorrect(), model.getCorrectArray());
|
question.setScore(ExamUtil.scoreFromVM(model.getScore()));
|
question.setDifficult(model.getDifficult());
|
question.setInfoTextContentId(infoTextContent.getId());
|
question.setCreateUser(userId);
|
question.setDeleted(false);
|
questionMapper.insert(question);
|
return question;
|
}
|
|
@Override
|
@Transactional
|
public Question updateFullQuestion(QuestionEditRequestVO model) {
|
Integer gradeLevel = subjectService.levelBySubjectId(model.getSubjectId());
|
Question question = questionMapper.selectById(model.getId());
|
question.setSubjectId(model.getSubjectId());
|
question.setGradeLevel(gradeLevel);
|
question.setScore(ExamUtil.scoreFromVM(model.getScore()));
|
question.setDifficult(model.getDifficult());
|
question.setCorrectFromVM(model.getCorrect(), model.getCorrectArray());
|
questionMapper.updateById(question);
|
|
//题干、解析、选项等 更新
|
TextContent infoTextContent = textContentService.getById(question.getInfoTextContentId());
|
setQuestionInfoFromVM(infoTextContent, model);
|
textContentService.updateById(infoTextContent);
|
|
return question;
|
}
|
|
@Override
|
public QuestionEditRequestVO getQuestionEditRequestVM(Integer questionId) {
|
//题目映射
|
Question question = questionMapper.selectById(questionId);
|
return getQuestionEditRequestVM(question);
|
}
|
|
@Override
|
public QuestionEditRequestVO getQuestionEditRequestVM(Question question) {
|
//题目映射
|
TextContent questionInfoTextContent = textContentService.getById(question.getInfoTextContentId());
|
QuestionObject questionObject = JsonUtil.toJsonObject(questionInfoTextContent.getContent(), QuestionObject.class);
|
QuestionEditRequestVO questionEditRequestVO = new QuestionEditRequestVO();
|
BeanUtils.copyProperties(question, questionEditRequestVO);
|
questionEditRequestVO.setTitle(questionObject.getTitleContent());
|
|
//答案
|
QuestionTypeEnum questionTypeEnum = QuestionTypeEnum.fromCode(question.getQuestionType());
|
switch (questionTypeEnum) {
|
case SingleChoice:
|
case TrueFalse:
|
questionEditRequestVO.setCorrect(question.getCorrect());
|
break;
|
case MultipleChoice:
|
questionEditRequestVO.setCorrectArray(ExamUtil.contentToArray(question.getCorrect()));
|
break;
|
case GapFilling:
|
List<String> correctContent = questionObject.getQuestionItemObjects().stream().map(d -> d.getContent()).collect(Collectors.toList());
|
questionEditRequestVO.setCorrectArray(correctContent);
|
break;
|
case ShortAnswer:
|
questionEditRequestVO.setCorrect(questionObject.getCorrect());
|
break;
|
default:
|
break;
|
}
|
questionEditRequestVO.setScore(ExamUtil.scoreToVM(question.getScore()));
|
questionEditRequestVO.setAnalyze(questionObject.getAnalyze());
|
|
|
//题目项映射
|
List<QuestionEditItemVO> editItems = questionObject.getQuestionItemObjects().stream().map(o -> {
|
QuestionEditItemVO questionEditItemVO = new QuestionEditItemVO();
|
BeanUtils.copyProperties(o, questionEditItemVO);
|
if (o.getScore() != null) {
|
questionEditItemVO.setScore(ExamUtil.scoreToVM(o.getScore()));
|
}
|
return questionEditItemVO;
|
}).collect(Collectors.toList());
|
questionEditRequestVO.setItems(editItems);
|
return questionEditRequestVO;
|
}
|
|
public void setQuestionInfoFromVM(TextContent infoTextContent, QuestionEditRequestVO model) {
|
List<QuestionItemObject> itemObjects = model.getItems().stream().map(i ->
|
{
|
QuestionItemObject item = new QuestionItemObject();
|
item.setPrefix(i.getPrefix());
|
item.setContent(i.getContent());
|
item.setItemUuid(i.getItemUuid());
|
item.setScore(ExamUtil.scoreFromVM(i.getScore()));
|
return item;
|
}
|
).collect(Collectors.toList());
|
QuestionObject questionObject = new QuestionObject();
|
questionObject.setQuestionItemObjects(itemObjects);
|
questionObject.setAnalyze(model.getAnalyze());
|
questionObject.setTitleContent(model.getTitle());
|
questionObject.setCorrect(model.getCorrect());
|
infoTextContent.setContent(JsonUtil.toJsonStr(questionObject));
|
}
|
|
@Override
|
public Integer selectAllCount() {
|
return questionMapper.selectAllCount();
|
}
|
|
@Override
|
public List<Integer> selectMothCount() {
|
Date startTime = DateTimeUtil.getMonthStartDay();
|
Date endTime = DateTimeUtil.getMonthEndDay();
|
List<String> mothStartToNowFormat = DateTimeUtil.MothStartToNowFormat();
|
List<KeyValue> mouthCount = questionMapper.selectCountByDate(startTime, endTime);
|
return mothStartToNowFormat.stream().map(md -> {
|
KeyValue keyValue = mouthCount.stream().filter(kv -> kv.getName().equals(md)).findAny().orElse(null);
|
return null == keyValue ? 0 : keyValue.getValue();
|
}).collect(Collectors.toList());
|
}
|
|
|
}
|