package com.mindskip.xzs.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.mindskip.xzs.base.RestResponse;
|
import com.mindskip.xzs.domain.DeptQuestion;
|
import com.mindskip.xzs.domain.QuestionSubject;
|
import com.mindskip.xzs.domain.other.KeyValue;
|
import com.mindskip.xzs.domain.Question;
|
import com.mindskip.xzs.domain.TextContent;
|
import com.mindskip.xzs.domain.enums.QuestionStatusEnum;
|
import com.mindskip.xzs.domain.enums.QuestionTypeEnum;
|
import com.mindskip.xzs.domain.question.QuestionItemObject;
|
import com.mindskip.xzs.domain.question.QuestionObject;
|
import com.mindskip.xzs.domain.vo.DeptQuestionVO;
|
import com.mindskip.xzs.domain.vo.QuestionContentVO;
|
import com.mindskip.xzs.domain.vo.QuestionVO;
|
import com.mindskip.xzs.repository.BaseMapper;
|
import com.mindskip.xzs.repository.DeptQuestionMapper;
|
import com.mindskip.xzs.repository.QuestionMapper;
|
import com.mindskip.xzs.repository.SubjectMapper;
|
import com.mindskip.xzs.service.QuestionService;
|
import com.mindskip.xzs.service.QuestionSubjectService;
|
import com.mindskip.xzs.service.SubjectService;
|
import com.mindskip.xzs.service.TextContentService;
|
import com.mindskip.xzs.utility.*;
|
import com.mindskip.xzs.viewmodel.admin.education.SubjectPageRequestVM;
|
import com.mindskip.xzs.viewmodel.admin.question.ExamQuestionVO;
|
import com.mindskip.xzs.viewmodel.admin.question.QuestionEditItemVM;
|
import com.mindskip.xzs.viewmodel.admin.question.QuestionEditRequestVM;
|
import com.mindskip.xzs.viewmodel.admin.question.QuestionPageRequestVM;
|
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageInfo;
|
import com.mindskip.xzs.viewmodel.student.question.answer.QuestionPageStudentRequestVM;
|
import com.mindskip.xzs.viewmodel.student.question.answer.QuestionPageStudentResponseVM;
|
import com.mindskip.xzs.vo.QuestionExportData;
|
import com.mindskip.xzs.vo.QuestionExportVO;
|
import com.mindskip.xzs.vo.QuestionImportVO;
|
import com.mindskip.xzs.vo.QuestionSubjectVO;
|
import lombok.RequiredArgsConstructor;
|
import org.modelmapper.ModelMapper;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.StringUtils;
|
|
import java.util.Arrays;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.stream.Collectors;
|
|
@Service
|
public class QuestionServiceImpl extends BaseServiceImpl<Question> implements QuestionService {
|
|
protected final static ModelMapper modelMapper = ModelMapperSingle.Instance();
|
private final QuestionMapper questionMapper;
|
private final TextContentService textContentService;
|
private final SubjectService subjectService;
|
private final QuestionSubjectService questionSubjectService;
|
private final SubjectMapper subjectMapper;
|
private final DeptQuestionMapper deptQuestionMapper;
|
|
public QuestionServiceImpl(BaseMapper<Question> baseMapper, QuestionMapper questionMapper, TextContentService textContentService, SubjectService subjectService, QuestionSubjectService questionSubjectService, SubjectMapper subjectMapper, DeptQuestionMapper deptQuestionMapper) {
|
super(baseMapper);
|
this.questionMapper = questionMapper;
|
this.textContentService = textContentService;
|
this.subjectService = subjectService;
|
this.questionSubjectService = questionSubjectService;
|
this.subjectMapper = subjectMapper;
|
this.deptQuestionMapper = deptQuestionMapper;
|
}
|
|
@Override
|
public PageInfo<Question> page(QuestionPageRequestVM requestVM) {
|
return PageHelper.startPage(requestVM.getPageIndex(), requestVM.getPageSize(), "id desc").doSelectPageInfo(() ->
|
questionMapper.page(requestVM)
|
);
|
}
|
|
|
@Override
|
@Transactional
|
public Question insertFullQuestion(QuestionEditRequestVM model, Integer userId) {
|
Date now = new Date();
|
|
// 题干、解析、选项等 插入
|
TextContent infoTextContent = new TextContent();
|
infoTextContent.setCreateTime(now);
|
setQuestionInfoFromVM(infoTextContent, model);
|
textContentService.insertByFilter(infoTextContent);
|
|
// 题目插入
|
Question question = new Question();
|
question.setGradeLevel(model.getGradeLevel());
|
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.insertSelective(question);
|
|
// 题目所属部门插入
|
if (! CollectionUtils.isEmpty(model.getDeptIds())) {
|
List<DeptQuestion> deptQuestions = model.getDeptIds().stream().map(deptId -> {
|
DeptQuestion deptQuestion = new DeptQuestion();
|
deptQuestion.setQuestionId(question.getId());
|
deptQuestion.setDeptId(deptId);
|
return deptQuestion;
|
}).collect(Collectors.toList());
|
if (! CollectionUtils.isEmpty(model.getDeptIds())) {
|
deptQuestionMapper.add(deptQuestions);
|
}
|
}
|
|
//批量添加
|
List<QuestionSubject> list = Arrays.asList(model.getSubjectIds()).stream().map(e -> {
|
QuestionSubject questionSubject = new QuestionSubject();
|
questionSubject.setQuestionId(question.getId());
|
questionSubject.setSubjectId(e);
|
questionSubject.setDeleted(0);
|
return questionSubject;
|
}).collect(Collectors.toList());
|
questionSubjectService.saves(list);
|
return question;
|
}
|
|
@Override
|
@Transactional
|
public Question updateFullQuestion(QuestionEditRequestVM model) {
|
|
// 题目修改
|
Question question = questionMapper.selectByPrimaryKey(model.getId());
|
question.setSubjectId(model.getSubjectId());
|
question.setGradeLevel(model.getGradeLevel());
|
question.setScore(ExamUtil.scoreFromVM(model.getScore()));
|
question.setDifficult(model.getDifficult());
|
question.setCorrectFromVM(model.getCorrect(), model.getCorrectArray());
|
questionMapper.updateByPrimaryKeySelective(question);
|
|
// 处理题目所属部门
|
deptQuestionMapper.remove(question.getId());
|
List<DeptQuestion> deptQuestions = model.getDeptIds().stream().map(deptId -> {
|
DeptQuestion deptQuestion = new DeptQuestion();
|
deptQuestion.setQuestionId(question.getId());
|
deptQuestion.setDeptId(deptId);
|
return deptQuestion;
|
}).collect(Collectors.toList());
|
if (! CollectionUtils.isEmpty(model.getDeptIds())) {
|
deptQuestionMapper.add(deptQuestions);
|
}
|
|
//题干、解析、选项等 更新
|
TextContent infoTextContent = textContentService.selectById(question.getInfoTextContentId());
|
setQuestionInfoFromVM(infoTextContent, model);
|
textContentService.updateByIdFilter(infoTextContent);
|
|
questionSubjectService.removeQuestionId(question.getId());
|
//批量添加
|
List<QuestionSubject> list = Arrays.asList(model.getSubjectIds()).stream().map(e -> {
|
QuestionSubject questionSubject = new QuestionSubject();
|
questionSubject.setQuestionId(question.getId());
|
questionSubject.setSubjectId(e);
|
questionSubject.setDeleted(0);
|
return questionSubject;
|
}).collect(Collectors.toList());
|
questionSubjectService.saves(list);
|
|
return question;
|
}
|
|
@Override
|
public ExamQuestionVO getQuestionEditRequestVM(Integer questionId) {
|
// 题目映射
|
Question question = questionMapper.selectByPrimaryKey(questionId);
|
List<QuestionSubject> list = questionSubjectService.getQuestion(questionId).stream().map(e -> {
|
SubjectPageRequestVM subject = new SubjectPageRequestVM();
|
subject.setId(e.getSubjectId());
|
e.setSubName(subjectMapper.page(subject).get(0).getName());
|
return e;
|
}).collect(Collectors.toList());
|
ExamQuestionVO questionEditRequestVM = getQuestionEditRequestVM(question);
|
questionEditRequestVM.setQuestionSubjects(list);
|
// 查询题目所属部门
|
List<Integer> deptIds = deptQuestionMapper.deptByQuestionId(questionId)
|
.stream().map(DeptQuestionVO::getDeptId).collect(Collectors.toList());
|
questionEditRequestVM.setDeptIds(deptIds);
|
return questionEditRequestVM;
|
}
|
|
@Override
|
public ExamQuestionVO getQuestionEditRequestVM(Question question) {
|
//题目映射
|
TextContent questionInfoTextContent = textContentService.selectById(question.getInfoTextContentId());
|
QuestionObject questionObject = JsonUtil.toJsonObject(questionInfoTextContent.getContent(), QuestionObject.class);
|
ExamQuestionVO questionEditRequestVM = modelMapper.map(question, ExamQuestionVO.class);
|
questionEditRequestVM.setTitle(questionObject.getTitleContent());
|
|
//答案
|
QuestionTypeEnum questionTypeEnum = QuestionTypeEnum.fromCode(question.getQuestionType());
|
switch (questionTypeEnum) {
|
case SingleChoice:
|
case TrueFalse:
|
questionEditRequestVM.setCorrect(question.getCorrect());
|
break;
|
case MultipleChoice:
|
questionEditRequestVM.setCorrectArray(ExamUtil.contentToArray(question.getCorrect()));
|
break;
|
case GapFilling:
|
List<String> correctContent = questionObject.getQuestionItemObjects().stream().map(d -> d.getContent()).collect(Collectors.toList());
|
questionEditRequestVM.setCorrectArray(correctContent);
|
break;
|
case ShortAnswer:
|
questionEditRequestVM.setCorrect(questionObject.getCorrect());
|
break;
|
default:
|
break;
|
}
|
questionEditRequestVM.setScore(ExamUtil.scoreToVM(question.getScore()));
|
questionEditRequestVM.setAnalyze(questionObject.getAnalyze());
|
|
|
//题目项映射
|
List<QuestionEditItemVM> editItems = questionObject.getQuestionItemObjects().stream().map(o -> {
|
QuestionEditItemVM questionEditItemVM = modelMapper.map(o, QuestionEditItemVM.class);
|
if (o.getScore() != null) {
|
questionEditItemVM.setScore(ExamUtil.scoreToVM(o.getScore()));
|
}
|
return questionEditItemVM;
|
}).collect(Collectors.toList());
|
questionEditRequestVM.setItems(editItems);
|
return questionEditRequestVM;
|
}
|
|
public void setQuestionInfoFromVM(TextContent infoTextContent, QuestionEditRequestVM 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());
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public Integer remove(Integer id) {
|
Question question = questionMapper.selectByPrimaryKey(id);
|
question.setDeleted(true);
|
questionMapper.updateByPrimaryKeySelective(question);
|
List<Integer> list = questionSubjectService.getQuestion(id)
|
.stream().map(e -> {
|
return e.getId();
|
}).collect(Collectors.toList());
|
return questionSubjectService.removes(list.toArray(new Integer[list.size()]));
|
}
|
|
@Override
|
public List<Question> getAll() {
|
return questionMapper.getAll();
|
}
|
|
@Override
|
public List<Question> selectByIds(List<Integer> ids) {
|
return questionMapper.selectByIds(ids);
|
}
|
|
|
@Override
|
public List<QuestionImportVO> export(QuestionExportVO query) {
|
return questionMapper.export(query);
|
}
|
|
@Override
|
public List<QuestionImportVO> exportData(QuestionExportVO query) {
|
return questionMapper.exportData(query);
|
}
|
|
@Override
|
public PageInfo<QuestionPageStudentResponseVM> selectQuestion(QuestionPageStudentRequestVM model) {
|
return PageHelper.startPage(model.getPageIndex(), model.getPageSize()).doSelectPageInfo(() ->
|
questionMapper.selectQuestion(model).stream().peek(
|
q -> q.setShortTitle(HtmlUtil.clear(q.getShortTitle()))
|
).collect(Collectors.toList())
|
);
|
}
|
|
@Override
|
public RestResponse selectContentById(Integer id) {
|
QuestionVO questionVO = questionMapper.selectContentById(id);
|
jsonQuestion(questionVO);
|
if (QuestionTypeEnum.MultipleChoice.getCode().equals(questionVO.getQuestionType())) {
|
// 多选题需要返回答案数量,学员选中对应数量才查询答案
|
if (StringUtils.hasText(questionVO.getCorrect())) {
|
questionVO.setAnswerNum(questionVO.getCorrect().split(",").length);
|
}
|
}
|
questionVO.setContentJson("");
|
questionVO.setCorrect("");
|
questionVO.getContent().setCorrect("");
|
questionVO.getContent().setAnalyze("");
|
return RestResponse.ok(questionVO);
|
}
|
|
@Override
|
public RestResponse getAnswer(Integer id) {
|
QuestionVO questionVO = questionMapper.getAnswer(id);
|
if (Objects.nonNull(questionVO) && StringUtils.hasText(questionVO.getCorrect())) {
|
QuestionContentVO vo = JSON.parseObject(questionVO.getContentJson(), QuestionContentVO.class);
|
vo.setQuestionItemObjects(null);
|
vo.setTitleContent(null);
|
vo.setCorrect(questionVO.getCorrect());
|
return RestResponse.ok(vo);
|
}
|
return RestResponse.ok(null);
|
}
|
|
@Override
|
public Integer countQuestionByTitle(String title) {
|
return questionMapper.countQuestionByTitle(title);
|
}
|
|
@Override
|
public List<QuestionSubjectVO> countQuestionByTitleAndSubject(String title, Integer subjectId) {
|
return questionMapper.countQuestionByTitleAndSubject(title, subjectId);
|
}
|
|
/**
|
* 处理题目内容JSON
|
*
|
* @param vo
|
*/
|
public void jsonQuestion(QuestionVO vo) {
|
if (StringUtils.hasText(vo.getContentJson())) {
|
QuestionContentVO questionContent = JSON.parseObject(vo.getContentJson(), QuestionContentVO.class);
|
vo.setContent(questionContent);
|
}
|
}
|
}
|