user paper exam
parent
5017255103
commit
ca2092bd82
|
|
@ -52,7 +52,7 @@ public class PaperExamController {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 交卷:汇总各试题作答得分,更新考试成绩、是否通过并结束考试
|
* 交卷:汇总各试题作答得分,更新考试成绩、是否通过并结束考试(携带班级id时保存班级学员考试记录)
|
||||||
*/
|
*/
|
||||||
@ApiOperation("交卷")
|
@ApiOperation("交卷")
|
||||||
@PostMapping("/submitExam")
|
@PostMapping("/submitExam")
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,10 @@ import javax.validation.constraints.NotNull;
|
||||||
@ApiModel(value = "SubmitExamDTO", description = "考试交卷入参")
|
@ApiModel(value = "SubmitExamDTO", description = "考试交卷入参")
|
||||||
public class SubmitExamDTO {
|
public class SubmitExamDTO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "试卷id", required = true)
|
@ApiModelProperty(value = "考试试卷id", required = true)
|
||||||
@NotNull(message = "试卷id不能为空")
|
@NotNull(message = "考试试卷id不能为空")
|
||||||
private Long paperId;
|
private Long paperExamId;
|
||||||
|
|
||||||
|
@ApiModelProperty("班级id(非空时保存班级学员考试记录)")
|
||||||
|
private Long classId;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package org.qinan.cedu.service.impl;
|
package org.qinan.cedu.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.extra.spring.SpringUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
|
@ -10,14 +11,17 @@ import org.qinan.cedu.convertor.PaperExamQuestionUserConvertor;
|
||||||
import org.qinan.cedu.enums.AnswerStatusEnum;
|
import org.qinan.cedu.enums.AnswerStatusEnum;
|
||||||
import org.qinan.cedu.enums.DeleteEnum;
|
import org.qinan.cedu.enums.DeleteEnum;
|
||||||
import org.qinan.cedu.enums.PaperExamStatusEnum;
|
import org.qinan.cedu.enums.PaperExamStatusEnum;
|
||||||
import org.qinan.cedu.mapper.*;
|
import org.qinan.cedu.mapper.PaperExamMapper;
|
||||||
|
import org.qinan.cedu.mapper.PaperExamQuestionUserMapper;
|
||||||
|
import org.qinan.cedu.mapper.PaperMapper;
|
||||||
|
import org.qinan.cedu.mapper.QuestionMapper;
|
||||||
import org.qinan.cedu.model.dto.*;
|
import org.qinan.cedu.model.dto.*;
|
||||||
import org.qinan.cedu.model.entity.*;
|
import org.qinan.cedu.model.entity.PaperDO;
|
||||||
import org.qinan.cedu.model.vo.PaperExamInfoVO;
|
import org.qinan.cedu.model.entity.PaperExamDO;
|
||||||
import org.qinan.cedu.model.vo.PaperExamQuestionStatVO;
|
import org.qinan.cedu.model.entity.PaperExamQuestionUserDO;
|
||||||
import org.qinan.cedu.model.vo.PaperExamVO;
|
import org.qinan.cedu.model.entity.QuestionDO;
|
||||||
import org.qinan.cedu.model.vo.StartExamQuestionVO;
|
import org.qinan.cedu.model.vo.*;
|
||||||
import org.qinan.cedu.model.vo.StartExamVO;
|
import org.qinan.cedu.service.ClassStudentExamRecordService;
|
||||||
import org.qinan.cedu.service.PaperExamQuestionUserService;
|
import org.qinan.cedu.service.PaperExamQuestionUserService;
|
||||||
import org.qinan.cedu.service.PaperExamService;
|
import org.qinan.cedu.service.PaperExamService;
|
||||||
import org.qinan.cedu.service.PaperService;
|
import org.qinan.cedu.service.PaperService;
|
||||||
|
|
@ -56,7 +60,7 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
|
||||||
|
|
||||||
private final PaperExamQuestionUserMapper paperExamQuestionUserMapper;
|
private final PaperExamQuestionUserMapper paperExamQuestionUserMapper;
|
||||||
|
|
||||||
private final ClassStudentExamRecordMapper classStudentExamRecordMapper;
|
private final ClassStudentExamRecordService classStudentExamRecordService;
|
||||||
|
|
||||||
private final PaperService paperService;
|
private final PaperService paperService;
|
||||||
|
|
||||||
|
|
@ -131,8 +135,6 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
|
||||||
this.save(paperExam);
|
this.save(paperExam);
|
||||||
// 生成并保存用户试题作答记录,同时回填作答记录信息到返回列表
|
// 生成并保存用户试题作答记录,同时回填作答记录信息到返回列表
|
||||||
saveQuestionUserList(paperExam, questionList);
|
saveQuestionUserList(paperExam, questionList);
|
||||||
// 携带班级id时,生成班级学员考试记录(交卷时回填成绩)
|
|
||||||
saveClassStudentExamRecord(paper, paperExam, dto.getClassId());
|
|
||||||
// 组装返回结果
|
// 组装返回结果
|
||||||
StartExamVO startExamVO = paperExamConvertor.convertEToStartExamVo(paperExam);
|
StartExamVO startExamVO = paperExamConvertor.convertEToStartExamVo(paperExam);
|
||||||
startExamVO.setPaperType(paper.getPaperType());
|
startExamVO.setPaperType(paper.getPaperType());
|
||||||
|
|
@ -175,12 +177,10 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void submitExam(SubmitExamDTO dto, Long userId) {
|
public void submitExam(SubmitExamDTO dto, Long userId) {
|
||||||
PaperExamDO paperExam = this.lambdaQuery()
|
PaperExamDO paperExam = this.lambdaQuery()
|
||||||
.eq(PaperExamDO::getPaperId, dto.getPaperId())
|
.eq(PaperExamDO::getId, dto.getPaperExamId())
|
||||||
.eq(PaperExamDO::getUserId, userId)
|
.eq(PaperExamDO::getUserId, userId)
|
||||||
.eq(PaperExamDO::getPaperExamStatus, PaperExamStatusEnum.DOING.getValue())
|
.eq(PaperExamDO::getPaperExamStatus, PaperExamStatusEnum.DOING.getValue())
|
||||||
.eq(PaperExamDO::getDeleteEnum, DeleteEnum.FALSE.getCode())
|
.eq(PaperExamDO::getDeleteEnum, DeleteEnum.FALSE.getCode())
|
||||||
.orderByDesc(PaperExamDO::getId)
|
|
||||||
.last("limit 1")
|
|
||||||
.one();
|
.one();
|
||||||
if (paperExam == null) {
|
if (paperExam == null) {
|
||||||
throw new IllegalArgumentException("没有进行中的考试记录");
|
throw new IllegalArgumentException("没有进行中的考试记录");
|
||||||
|
|
@ -193,8 +193,8 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
|
||||||
// paper_exam 表无 org_id 列,更新前不填充机构id
|
// paper_exam 表无 org_id 列,更新前不填充机构id
|
||||||
InsertFieldDefaults.applyForUpdateIgnoreOrgId(paperExam);
|
InsertFieldDefaults.applyForUpdateIgnoreOrgId(paperExam);
|
||||||
this.updateById(paperExam);
|
this.updateById(paperExam);
|
||||||
// 回填班级学员考试记录的成绩数据(开始考试未携带班级id时无记录,跳过)
|
// 交卷时携带班级id,则一次性保存班级学员考试记录(含成绩统计)
|
||||||
finishClassStudentExamRecord(paperExam, examScore);
|
saveClassStudentExamRecord(paperExam, examScore, dto.getClassId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -210,53 +210,32 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成并保存班级学员考试记录(初始0分、未通过,结束时间由交卷回填)
|
* 交卷时保存班级学员考试记录:得分、是否通过、正确/错误题数、正确率、起止时间(未携带班级id时跳过)
|
||||||
*/
|
*/
|
||||||
private void saveClassStudentExamRecord(PaperDO paper, PaperExamDO paperExam, Long classId) {
|
private void saveClassStudentExamRecord(PaperExamDO paperExam, BigDecimal examScore, Long classId) {
|
||||||
if (classId == null) {
|
if (classId == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ClassStudentExamRecordDO examRecord = new ClassStudentExamRecordDO();
|
|
||||||
examRecord.setStudentId(paperExam.getUserId());
|
|
||||||
String studentName = AuthUserContextAdapter.getCurrentUserName();
|
|
||||||
examRecord.setStudentName(studentName == null ? "系统" : studentName);
|
|
||||||
examRecord.setClassId(classId);
|
|
||||||
examRecord.setPaperName(paper.getPaperName());
|
|
||||||
examRecord.setPaperExamId(paperExam.getId());
|
|
||||||
examRecord.setScore(BigDecimal.ZERO);
|
|
||||||
examRecord.setPassed(0);
|
|
||||||
examRecord.setWrongCount(0);
|
|
||||||
examRecord.setAccuracy(BigDecimal.ZERO);
|
|
||||||
examRecord.setStartTime(LocalDateTime.now());
|
|
||||||
InsertFieldDefaults.apply(examRecord);
|
|
||||||
classStudentExamRecordMapper.insert(examRecord);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 交卷后回填班级学员考试记录:得分、是否通过、错误题数、正确率、结束时间
|
|
||||||
*/
|
|
||||||
private void finishClassStudentExamRecord(PaperExamDO paperExam, BigDecimal examScore) {
|
|
||||||
ClassStudentExamRecordDO examRecord = classStudentExamRecordMapper.selectOne(new LambdaQueryWrapper<ClassStudentExamRecordDO>()
|
|
||||||
.eq(ClassStudentExamRecordDO::getPaperExamId, paperExam.getId())
|
|
||||||
.eq(ClassStudentExamRecordDO::getDeleteEnum, DeleteEnum.FALSE.getCode())
|
|
||||||
.orderByDesc(ClassStudentExamRecordDO::getId)
|
|
||||||
.last("limit 1"));
|
|
||||||
if (examRecord == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// 一条统计SQL取总题数与答对题数,错误题数=总题数-答对题数(未作答按错误计),正确率=答对/总数*100
|
// 一条统计SQL取总题数与答对题数,错误题数=总题数-答对题数(未作答按错误计),正确率=答对/总数*100
|
||||||
PaperExamQuestionStatVO stat = paperExamQuestionUserMapper.countTotalAndCorrect(paperExam.getId());
|
PaperExamQuestionStatVO stat = paperExamQuestionUserMapper.countTotalAndCorrect(paperExam.getId());
|
||||||
long total = stat.getTotal();
|
long total = stat.getTotal();
|
||||||
long correct = stat.getCorrect();
|
long correct = stat.getCorrect();
|
||||||
examRecord.setScore(examScore);
|
ClassStudentExamRecordDTO recordDTO = new ClassStudentExamRecordDTO();
|
||||||
examRecord.setCorrectCount((int) correct);
|
recordDTO.setStudentId(paperExam.getUserId());
|
||||||
examRecord.setPassed(paperExam.getPassed());
|
String studentName = AuthUserContextAdapter.getCurrentUserName();
|
||||||
examRecord.setWrongCount((int) (total - correct));
|
recordDTO.setStudentName(studentName == null ? "系统" : studentName);
|
||||||
examRecord.setAccuracy(total == 0 ? BigDecimal.ZERO
|
recordDTO.setClassId(classId);
|
||||||
|
recordDTO.setPaperName(paperExam.getPaperName());
|
||||||
|
recordDTO.setPaperExamId(paperExam.getId());
|
||||||
|
recordDTO.setScore(examScore);
|
||||||
|
recordDTO.setCorrectCount((int) correct);
|
||||||
|
recordDTO.setPassed(paperExam.getPassed());
|
||||||
|
recordDTO.setWrongCount((int) (total - correct));
|
||||||
|
recordDTO.setAccuracy(total == 0 ? BigDecimal.ZERO
|
||||||
: BigDecimal.valueOf(correct * 100).divide(BigDecimal.valueOf(total), 2, RoundingMode.HALF_UP));
|
: BigDecimal.valueOf(correct * 100).divide(BigDecimal.valueOf(total), 2, RoundingMode.HALF_UP));
|
||||||
examRecord.setEndTime(LocalDateTime.now());
|
recordDTO.setStartTime(paperExam.getCreateTime());
|
||||||
InsertFieldDefaults.applyForUpdate(examRecord);
|
recordDTO.setEndTime(LocalDateTime.now());
|
||||||
classStudentExamRecordMapper.updateById(examRecord);
|
SpringUtil.getBean(ClassStudentExamRecordService.class).saveRecord(recordDTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue