user paper exam

dev-tmp1
luotaiqian 2026-08-25 11:48:48 +08:00
parent 5017255103
commit ca2092bd82
3 changed files with 39 additions and 57 deletions

View File

@ -52,7 +52,7 @@ public class PaperExamController {
}
/**
*
* id
*/
@ApiOperation("交卷")
@PostMapping("/submitExam")

View File

@ -13,7 +13,10 @@ import javax.validation.constraints.NotNull;
@ApiModel(value = "SubmitExamDTO", description = "考试交卷入参")
public class SubmitExamDTO {
@ApiModelProperty(value = "试卷id", required = true)
@NotNull(message = "试卷id不能为空")
private Long paperId;
@ApiModelProperty(value = "考试试卷id", required = true)
@NotNull(message = "考试试卷id不能为空")
private Long paperExamId;
@ApiModelProperty("班级id非空时保存班级学员考试记录")
private Long classId;
}

View File

@ -1,5 +1,6 @@
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.metadata.IPage;
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.DeleteEnum;
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.entity.*;
import org.qinan.cedu.model.vo.PaperExamInfoVO;
import org.qinan.cedu.model.vo.PaperExamQuestionStatVO;
import org.qinan.cedu.model.vo.PaperExamVO;
import org.qinan.cedu.model.vo.StartExamQuestionVO;
import org.qinan.cedu.model.vo.StartExamVO;
import org.qinan.cedu.model.entity.PaperDO;
import org.qinan.cedu.model.entity.PaperExamDO;
import org.qinan.cedu.model.entity.PaperExamQuestionUserDO;
import org.qinan.cedu.model.entity.QuestionDO;
import org.qinan.cedu.model.vo.*;
import org.qinan.cedu.service.ClassStudentExamRecordService;
import org.qinan.cedu.service.PaperExamQuestionUserService;
import org.qinan.cedu.service.PaperExamService;
import org.qinan.cedu.service.PaperService;
@ -56,7 +60,7 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
private final PaperExamQuestionUserMapper paperExamQuestionUserMapper;
private final ClassStudentExamRecordMapper classStudentExamRecordMapper;
private final ClassStudentExamRecordService classStudentExamRecordService;
private final PaperService paperService;
@ -131,8 +135,6 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
this.save(paperExam);
// 生成并保存用户试题作答记录,同时回填作答记录信息到返回列表
saveQuestionUserList(paperExam, questionList);
// 携带班级id时生成班级学员考试记录交卷时回填成绩
saveClassStudentExamRecord(paper, paperExam, dto.getClassId());
// 组装返回结果
StartExamVO startExamVO = paperExamConvertor.convertEToStartExamVo(paperExam);
startExamVO.setPaperType(paper.getPaperType());
@ -175,12 +177,10 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
@Transactional(rollbackFor = Exception.class)
public void submitExam(SubmitExamDTO dto, Long userId) {
PaperExamDO paperExam = this.lambdaQuery()
.eq(PaperExamDO::getPaperId, dto.getPaperId())
.eq(PaperExamDO::getId, dto.getPaperExamId())
.eq(PaperExamDO::getUserId, userId)
.eq(PaperExamDO::getPaperExamStatus, PaperExamStatusEnum.DOING.getValue())
.eq(PaperExamDO::getDeleteEnum, DeleteEnum.FALSE.getCode())
.orderByDesc(PaperExamDO::getId)
.last("limit 1")
.one();
if (paperExam == null) {
throw new IllegalArgumentException("没有进行中的考试记录");
@ -193,8 +193,8 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
// paper_exam 表无 org_id 列更新前不填充机构id
InsertFieldDefaults.applyForUpdateIgnoreOrgId(paperExam);
this.updateById(paperExam);
// 回填班级学员考试记录的成绩数据开始考试未携带班级id时无记录跳过
finishClassStudentExamRecord(paperExam, examScore);
// 交卷时携带班级id则一次性保存班级学员考试记录含成绩统计
saveClassStudentExamRecord(paperExam, examScore, dto.getClassId());
}
@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) {
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
PaperExamQuestionStatVO stat = paperExamQuestionUserMapper.countTotalAndCorrect(paperExam.getId());
long total = stat.getTotal();
long correct = stat.getCorrect();
examRecord.setScore(examScore);
examRecord.setCorrectCount((int) correct);
examRecord.setPassed(paperExam.getPassed());
examRecord.setWrongCount((int) (total - correct));
examRecord.setAccuracy(total == 0 ? BigDecimal.ZERO
ClassStudentExamRecordDTO recordDTO = new ClassStudentExamRecordDTO();
recordDTO.setStudentId(paperExam.getUserId());
String studentName = AuthUserContextAdapter.getCurrentUserName();
recordDTO.setStudentName(studentName == null ? "系统" : studentName);
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));
examRecord.setEndTime(LocalDateTime.now());
InsertFieldDefaults.applyForUpdate(examRecord);
classStudentExamRecordMapper.updateById(examRecord);
recordDTO.setStartTime(paperExam.getCreateTime());
recordDTO.setEndTime(LocalDateTime.now());
SpringUtil.getBean(ClassStudentExamRecordService.class).saveRecord(recordDTO);
}
/**