package com.ycl.jxkg.service.impl;
|
|
import com.alibaba.fastjson2.JSON;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
|
import com.ycl.jxkg.context.WebContext;
|
import com.ycl.jxkg.domain.entity.Exam;
|
import com.ycl.jxkg.domain.entity.ExamSubmitTemp;
|
import com.ycl.jxkg.domain.entity.Question;
|
import com.ycl.jxkg.domain.vo.DoQuestionVO;
|
import com.ycl.jxkg.domain.vo.ExamSubmitVO;
|
import com.ycl.jxkg.enums.QuestionTypeEnum;
|
import com.ycl.jxkg.enums.general.ExamStatusEnum;
|
import com.ycl.jxkg.enums.general.ExamSubmitTempStatusEnum;
|
import com.ycl.jxkg.mapper.ExamMapper;
|
import com.ycl.jxkg.mapper.ExamSubmitTempMapper;
|
import com.ycl.jxkg.mapper.QuestionMapper;
|
import com.ycl.jxkg.service.ExamService;
|
import com.ycl.jxkg.base.Result;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ycl.jxkg.domain.form.ExamForm;
|
import com.ycl.jxkg.domain.vo.ExamVO;
|
import com.ycl.jxkg.domain.query.ExamQuery;
|
import org.springframework.stereotype.Service;
|
import lombok.RequiredArgsConstructor;
|
import com.ycl.jxkg.utils.PageUtil;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.util.Assert;
|
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.Objects;
|
import java.util.stream.Collectors;
|
|
/**
|
* 考试 服务实现类
|
*
|
* @author xp
|
* @since 2024-06-11
|
*/
|
@Service
|
@RequiredArgsConstructor
|
public class ExamServiceImpl extends ServiceImpl<ExamMapper, Exam> implements ExamService {
|
|
private final ExamMapper examMapper;
|
private final WebContext webContext;
|
private final QuestionMapper questionMapper;
|
private final ExamSubmitTempMapper examSubmitTempMapper;
|
|
/**
|
* 添加
|
*
|
* @param form
|
* @return
|
*/
|
@Override
|
public Result add(ExamForm form) {
|
Exam entity = ExamForm.getEntityByForm(form, null);
|
entity.setStatus(ExamStatusEnum.getStatusByTime(form.getStartTime(), form.getEndTime(), null));
|
entity.setTeacherId(webContext.getCurrentUser().getId());
|
baseMapper.insert(entity);
|
return Result.ok("添加成功");
|
}
|
|
/**
|
* 修改
|
*
|
* @param form
|
* @return
|
*/
|
@Override
|
public Result update(ExamForm form) {
|
Exam entity = baseMapper.selectById(form.getId());
|
// 为空抛IllegalArgumentException,做全局异常处理
|
Assert.notNull(entity, "记录不存在");
|
BeanUtils.copyProperties(form, entity);
|
entity.setStatus(ExamStatusEnum.getStatusByTime(form.getStartTime(), form.getEndTime(), null));
|
baseMapper.updateById(entity);
|
return Result.ok("修改成功");
|
}
|
|
/**
|
* 批量删除
|
*
|
* @param ids
|
* @return
|
*/
|
@Override
|
public Result remove(List<String> ids) {
|
baseMapper.deleteBatchIds(ids);
|
return Result.ok("删除成功");
|
}
|
|
/**
|
* id删除
|
*
|
* @param id
|
* @return
|
*/
|
@Override
|
public Result removeById(String id) {
|
baseMapper.deleteById(id);
|
return Result.ok("删除成功");
|
}
|
|
/**
|
* 分页查询
|
*
|
* @param query
|
* @return
|
*/
|
@Override
|
public Result page(ExamQuery query) {
|
IPage<ExamVO> page = PageUtil.getPage(query, ExamVO.class);
|
baseMapper.getPage(page, query);
|
return Result.ok().data(page.getRecords()).total(page.getTotal());
|
}
|
|
/**
|
* 根据id查找
|
*
|
* @param id
|
* @return
|
*/
|
@Override
|
public Result detail(Integer id) {
|
ExamVO vo = baseMapper.getById(id);
|
Assert.notNull(vo, "记录不存在");
|
return Result.ok().data(vo);
|
}
|
|
/**
|
* 列表
|
*
|
* @return
|
*/
|
@Override
|
public Result all() {
|
List<Exam> entities = baseMapper.selectList(null);
|
List<ExamVO> vos = entities.stream()
|
.map(entity -> ExamVO.getVoByEntity(entity, null))
|
.collect(Collectors.toList());
|
return Result.ok().data(vos);
|
}
|
|
@Override
|
public Result examSubmit(ExamSubmitVO submitData) {
|
// 校验
|
Exam exam = examMapper.selectById(submitData.getExamId());
|
if (Objects.isNull(exam)) {
|
throw new RuntimeException("该考试不存在");
|
}
|
// 判断单选、多选、判断题对错
|
List<Integer> questionIds = submitData.getQuestionList().stream().map(DoQuestionVO::getId).collect(Collectors.toList());
|
List<Question> questionList = questionMapper.getAnswerInfo(questionIds);
|
Map<Integer, Question> answerMap = questionList.stream().collect(Collectors.toMap(Question::getId, entity -> entity));
|
submitData.getQuestionList().stream().forEach(item -> {
|
Question question = answerMap.get(item.getId());
|
if (Objects.nonNull(question)
|
&& (QuestionTypeEnum.SingleChoice.getCode().equals(question.getQuestionType())
|
|| QuestionTypeEnum.MultipleChoice.getCode().equals(question.getQuestionType())
|
|| QuestionTypeEnum.TrueFalse.getCode().equals(question.getQuestionType())
|
)) {
|
String correct = question.getCorrect();
|
if (QuestionTypeEnum.MultipleChoice.getCode().equals(question.getQuestionType())) {
|
// 如果是选择题,那么将答案转为list
|
List<String> answerList = JSON.parseArray(correct, String.class);
|
item.setRight(answerList.containsAll(item.getAnswerList()));
|
} else {
|
item.setRight(question.getCorrect().equals(item.getAnswer()));
|
}
|
}
|
});
|
// 阅卷后才往exam_paper_answer保存考试成绩、以及保存到exam_paper_customer_answer
|
// 现在只需要保存到一张临时表
|
// 该接口是主动提交,所以状态都设置为完成,以便后续老师阅卷
|
saveTempExam(submitData, ExamSubmitTempStatusEnum.FINISH);
|
return Result.ok();
|
}
|
|
@Override
|
public Result timingSubmit(ExamSubmitVO submitData) {
|
saveTempExam(submitData, ExamSubmitTempStatusEnum.TEMP);
|
return Result.ok();
|
}
|
|
/**
|
* 保存临时试卷
|
*
|
* @param submitData 前端传递的试卷数据
|
* @param status 试卷的状态
|
*/
|
public void saveTempExam(ExamSubmitVO submitData, ExamSubmitTempStatusEnum status) {
|
ExamSubmitTemp one = new LambdaQueryChainWrapper<>(examSubmitTempMapper)
|
.eq(ExamSubmitTemp::getExamId, submitData.getExamId())
|
.eq(ExamSubmitTemp::getUserId, webContext.getCurrentUser().getId())
|
.one();
|
if (Objects.nonNull(one)) {
|
if (ExamSubmitTempStatusEnum.FINISH.equals(one.getStatus())) {
|
return;
|
}
|
one.setDoTime(submitData.getDoTime());
|
one.setExamSubmit(JSON.toJSONString(submitData.getQuestionList()));
|
one.setCreateTime(new Date());
|
one.setStatus(status);
|
examSubmitTempMapper.updateById(one);
|
} else {
|
ExamSubmitTemp examSubmitTemp = new ExamSubmitTemp();
|
examSubmitTemp.setExamId(submitData.getExamId());
|
examSubmitTemp.setDoTime(submitData.getDoTime());
|
examSubmitTemp.setStatus(status);
|
examSubmitTemp.setUserId(webContext.getCurrentUser().getId());
|
examSubmitTemp.setExamSubmit(JSON.toJSONString(submitData.getQuestionList()));
|
examSubmitTempMapper.insert(examSubmitTemp);
|
}
|
}
|
}
|