package com.ycl.jxkg.service.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ycl.jxkg.domain.TextContent;
|
import com.ycl.jxkg.domain.enums.ExamPaperTypeEnum;
|
import com.ycl.jxkg.domain.exam.ExamPaperQuestionItemObject;
|
import com.ycl.jxkg.domain.exam.ExamPaperTitleItemObject;
|
import com.ycl.jxkg.domain.other.KeyValue;
|
import com.ycl.jxkg.mapper.ExamPaperMapper;
|
import com.ycl.jxkg.mapper.QuestionMapper;
|
import com.ycl.jxkg.service.ExamPaperService;
|
import com.ycl.jxkg.service.QuestionService;
|
import com.ycl.jxkg.service.SubjectService;
|
import com.ycl.jxkg.service.TextContentService;
|
import com.ycl.jxkg.service.enums.ActionEnum;
|
import com.ycl.jxkg.utils.DateTimeUtil;
|
import com.ycl.jxkg.utils.JsonUtil;
|
import com.ycl.jxkg.utils.ExamUtil;
|
import com.ycl.jxkg.vo.admin.exam.ExamPaperEditRequestVO;
|
import com.ycl.jxkg.vo.admin.exam.ExamPaperPageRequestVO;
|
import com.ycl.jxkg.vo.admin.exam.ExamPaperTitleItemVO;
|
import com.ycl.jxkg.vo.admin.question.QuestionEditRequestVO;
|
import com.ycl.jxkg.vo.student.dashboard.PaperFilter;
|
import com.ycl.jxkg.vo.student.dashboard.PaperInfo;
|
import com.ycl.jxkg.vo.student.exam.ExamPaperPageVO;
|
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageInfo;
|
import com.ycl.jxkg.domain.ExamPaper;
|
import com.ycl.jxkg.domain.Question;
|
import com.ycl.jxkg.domain.User;
|
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.Arrays;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.function.Function;
|
import java.util.stream.Collectors;
|
|
@Service
|
@RequiredArgsConstructor
|
public class ExamPaperServiceImpl extends ServiceImpl<ExamPaperMapper, ExamPaper> implements ExamPaperService {
|
|
private final ExamPaperMapper examPaperMapper;
|
private final QuestionMapper questionMapper;
|
private final TextContentService textContentService;
|
private final QuestionService questionService;
|
private final SubjectService subjectService;
|
|
|
@Override
|
public PageInfo<ExamPaper> page(ExamPaperPageRequestVO requestVM) {
|
return PageHelper.startPage(requestVM.getPageIndex(), requestVM.getPageSize(), "id desc").doSelectPageInfo(() ->
|
examPaperMapper.page(requestVM));
|
}
|
|
@Override
|
public PageInfo<ExamPaper> taskExamPage(ExamPaperPageRequestVO requestVM) {
|
return PageHelper.startPage(requestVM.getPageIndex(), requestVM.getPageSize(), "id desc").doSelectPageInfo(() ->
|
examPaperMapper.taskExamPage(requestVM));
|
}
|
|
@Override
|
public PageInfo<ExamPaper> studentPage(ExamPaperPageVO requestVM) {
|
return PageHelper.startPage(requestVM.getPageIndex(), requestVM.getPageSize(), "id desc").doSelectPageInfo(() ->
|
examPaperMapper.studentPage(requestVM));
|
}
|
|
|
@Override
|
@Transactional
|
public ExamPaper savePaperFromVM(ExamPaperEditRequestVO examPaperEditRequestVO, User user) {
|
ActionEnum actionEnum = (examPaperEditRequestVO.getId() == null) ? ActionEnum.ADD : ActionEnum.UPDATE;
|
Date now = new Date();
|
List<ExamPaperTitleItemVO> titleItemsVM = examPaperEditRequestVO.getTitleItems();
|
List<ExamPaperTitleItemObject> frameTextContentList = frameTextContentFromVM(titleItemsVM);
|
String frameTextContentStr = JsonUtil.toJsonStr(frameTextContentList);
|
|
ExamPaper examPaper = new ExamPaper();
|
BeanUtils.copyProperties(examPaperEditRequestVO, examPaper);
|
if (actionEnum == ActionEnum.ADD) {
|
TextContent frameTextContent = new TextContent();
|
frameTextContent.setContent(frameTextContentStr);
|
frameTextContent.setCreateTime(now);
|
textContentService.save(frameTextContent);
|
examPaper.setFrameTextContentId(frameTextContent.getId());
|
examPaper.setCreateTime(now);
|
examPaper.setCreateUser(user.getId());
|
examPaper.setDeleted(false);
|
examPaperFromVM(examPaperEditRequestVO, examPaper, titleItemsVM);
|
examPaperMapper.insert(examPaper);
|
} else {
|
examPaper = examPaperMapper.selectById(examPaperEditRequestVO.getId());
|
TextContent frameTextContent = textContentService.getById(examPaper.getFrameTextContentId());
|
frameTextContent.setContent(frameTextContentStr);
|
textContentService.updateById(frameTextContent);
|
examPaperFromVM(examPaperEditRequestVO, examPaper, titleItemsVM);
|
examPaperMapper.updateById(examPaper);
|
}
|
return examPaper;
|
}
|
|
@Override
|
public ExamPaperEditRequestVO examPaperToVM(Integer id) {
|
ExamPaper examPaper = examPaperMapper.selectById(id);
|
ExamPaperEditRequestVO vo = new ExamPaperEditRequestVO();
|
BeanUtils.copyProperties(examPaper, vo);
|
vo.setLevel(examPaper.getGradeLevel());
|
TextContent frameTextContent = textContentService.getById(examPaper.getFrameTextContentId());
|
List<ExamPaperTitleItemObject> examPaperTitleItemObjects = JsonUtil.toJsonListObject(frameTextContent.getContent(), ExamPaperTitleItemObject.class);
|
List<Integer> questionIds = examPaperTitleItemObjects.stream()
|
.flatMap(t -> t.getQuestionItems().stream()
|
.map(q -> q.getId()))
|
.collect(Collectors.toList());
|
List<Question> questions = questionMapper.selectByIds(questionIds);
|
List<ExamPaperTitleItemVO> examPaperTitleItemVOS = examPaperTitleItemObjects.stream().map(t -> {
|
ExamPaperTitleItemVO tTitleVM = new ExamPaperTitleItemVO();
|
BeanUtils.copyProperties(t, tTitleVM);
|
List<QuestionEditRequestVO> questionItemsVM = t.getQuestionItems().stream().map(i -> {
|
Question question = questions.stream().filter(q -> q.getId().equals(i.getId())).findFirst().get();
|
QuestionEditRequestVO questionEditRequestVO = questionService.getQuestionEditRequestVM(question);
|
questionEditRequestVO.setItemOrder(i.getItemOrder());
|
return questionEditRequestVO;
|
}).collect(Collectors.toList());
|
tTitleVM.setQuestionItems(questionItemsVM);
|
return tTitleVM;
|
}).collect(Collectors.toList());
|
vo.setTitleItems(examPaperTitleItemVOS);
|
vo.setScore(ExamUtil.scoreToVM(examPaper.getScore()));
|
if (ExamPaperTypeEnum.TimeLimit == ExamPaperTypeEnum.fromCode(examPaper.getPaperType())) {
|
List<String> limitDateTime = Arrays.asList(DateTimeUtil.dateFormat(examPaper.getLimitStartTime()), DateTimeUtil.dateFormat(examPaper.getLimitEndTime()));
|
vo.setLimitDateTime(limitDateTime);
|
}
|
return vo;
|
}
|
|
@Override
|
public List<PaperInfo> indexPaper(PaperFilter paperFilter) {
|
return examPaperMapper.indexPaper(paperFilter);
|
}
|
|
|
@Override
|
public Integer selectAllCount() {
|
return examPaperMapper.selectAllCount();
|
}
|
|
@Override
|
public List<Integer> selectMothCount() {
|
Date startTime = DateTimeUtil.getMonthStartDay();
|
Date endTime = DateTimeUtil.getMonthEndDay();
|
List<KeyValue> mouthCount = examPaperMapper.selectCountByDate(startTime, endTime);
|
List<String> mothStartToNowFormat = DateTimeUtil.MothStartToNowFormat();
|
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());
|
}
|
|
private void examPaperFromVM(ExamPaperEditRequestVO examPaperEditRequestVO, ExamPaper examPaper, List<ExamPaperTitleItemVO> titleItemsVM) {
|
Integer gradeLevel = subjectService.levelBySubjectId(examPaperEditRequestVO.getSubjectId());
|
Integer questionCount = titleItemsVM.stream()
|
.mapToInt(t -> t.getQuestionItems().size()).sum();
|
Integer score = titleItemsVM.stream().
|
flatMapToInt(t -> t.getQuestionItems().stream()
|
.mapToInt(q -> ExamUtil.scoreFromVM(q.getScore()))
|
).sum();
|
examPaper.setQuestionCount(questionCount);
|
examPaper.setScore(score);
|
examPaper.setGradeLevel(gradeLevel);
|
List<String> dateTimes = examPaperEditRequestVO.getLimitDateTime();
|
if (ExamPaperTypeEnum.TimeLimit == ExamPaperTypeEnum.fromCode(examPaper.getPaperType())) {
|
examPaper.setLimitStartTime(DateTimeUtil.parse(dateTimes.get(0), DateTimeUtil.STANDER_FORMAT));
|
examPaper.setLimitEndTime(DateTimeUtil.parse(dateTimes.get(1), DateTimeUtil.STANDER_FORMAT));
|
}
|
}
|
|
private List<ExamPaperTitleItemObject> frameTextContentFromVM(List<ExamPaperTitleItemVO> titleItems) {
|
AtomicInteger index = new AtomicInteger(1);
|
return titleItems.stream().map(t -> {
|
ExamPaperTitleItemObject titleItem = new ExamPaperTitleItemObject();
|
BeanUtils.copyProperties(t, titleItem);
|
List<ExamPaperQuestionItemObject> questionItems = t.getQuestionItems().stream()
|
.map(q -> {
|
ExamPaperQuestionItemObject examPaperQuestionItemObject = new ExamPaperQuestionItemObject();
|
BeanUtils.copyProperties(q, examPaperQuestionItemObject);
|
examPaperQuestionItemObject.setItemOrder(index.getAndIncrement());
|
return examPaperQuestionItemObject;
|
})
|
.collect(Collectors.toList());
|
titleItem.setQuestionItems(questionItems);
|
return titleItem;
|
}).collect(Collectors.toList());
|
}
|
|
|
}
|