user paper exam
parent
9eab9bf747
commit
1329ddc81a
|
|
@ -3,10 +3,10 @@ package org.qinan.cedu.controller;
|
||||||
import com.jjb.saas.framework.auth.utils.AuthContext;
|
import com.jjb.saas.framework.auth.utils.AuthContext;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import io.swagger.annotations.ApiParam;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.qinan.cedu.model.dto.AnswerQuestionDTO;
|
import org.qinan.cedu.model.dto.AnswerQuestionDTO;
|
||||||
import org.qinan.cedu.model.dto.StartExamDTO;
|
import org.qinan.cedu.model.dto.StartExamDTO;
|
||||||
|
import org.qinan.cedu.model.dto.SubmitExamDTO;
|
||||||
import org.qinan.cedu.model.vo.StartExamVO;
|
import org.qinan.cedu.model.vo.StartExamVO;
|
||||||
import org.qinan.cedu.service.PaperExamService;
|
import org.qinan.cedu.service.PaperExamService;
|
||||||
import org.qinan.safetyeval.client.dto.SingleResponse;
|
import org.qinan.safetyeval.client.dto.SingleResponse;
|
||||||
|
|
@ -14,7 +14,6 @@ import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -53,8 +52,8 @@ public class PaperExamController {
|
||||||
*/
|
*/
|
||||||
@ApiOperation("交卷")
|
@ApiOperation("交卷")
|
||||||
@PostMapping("/submitExam")
|
@PostMapping("/submitExam")
|
||||||
public SingleResponse<Void> submitExam(@ApiParam(value = "试卷id", required = true) @RequestParam Long paperId) {
|
public SingleResponse<Void> submitExam(@Validated @RequestBody SubmitExamDTO dto) {
|
||||||
paperExamService.submitExam(paperId, AuthContext.getUserId());
|
paperExamService.submitExam(dto, AuthContext.getUserId());
|
||||||
return SingleResponse.success();
|
return SingleResponse.success();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,22 @@ package org.qinan.cedu.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
import org.qinan.cedu.model.entity.PaperExamQuestionUserDO;
|
import org.qinan.cedu.model.entity.PaperExamQuestionUserDO;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户试卷试题 Mapper
|
* 用户试卷试题 Mapper
|
||||||
*/
|
*/
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface PaperExamQuestionUserMapper extends BaseMapper<PaperExamQuestionUserDO> {
|
public interface PaperExamQuestionUserMapper extends BaseMapper<PaperExamQuestionUserDO> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 汇总一次考试所有试题的作答得分(数据库SUM聚合,未作答按0分计入)
|
||||||
|
*
|
||||||
|
* @param paperExamId 考试记录id
|
||||||
|
* @return 作答总得分(无记录时返回0)
|
||||||
|
*/
|
||||||
|
BigDecimal sumAnswerScore(@Param("paperExamId") Long paperExamId);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
package org.qinan.cedu.model.dto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 考试交卷入参
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(value = "SubmitExamDTO", description = "考试交卷入参")
|
||||||
|
public class SubmitExamDTO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "试卷id", required = true)
|
||||||
|
@NotNull(message = "试卷id不能为空")
|
||||||
|
private Long paperId;
|
||||||
|
}
|
||||||
|
|
@ -6,6 +6,7 @@ import org.qinan.cedu.model.dto.AnswerQuestionDTO;
|
||||||
import org.qinan.cedu.model.dto.PaperExamDTO;
|
import org.qinan.cedu.model.dto.PaperExamDTO;
|
||||||
import org.qinan.cedu.model.dto.PaperExamPageQueryDTO;
|
import org.qinan.cedu.model.dto.PaperExamPageQueryDTO;
|
||||||
import org.qinan.cedu.model.dto.StartExamDTO;
|
import org.qinan.cedu.model.dto.StartExamDTO;
|
||||||
|
import org.qinan.cedu.model.dto.SubmitExamDTO;
|
||||||
import org.qinan.cedu.model.entity.PaperExamDO;
|
import org.qinan.cedu.model.entity.PaperExamDO;
|
||||||
import org.qinan.cedu.model.vo.PaperExamVO;
|
import org.qinan.cedu.model.vo.PaperExamVO;
|
||||||
import org.qinan.cedu.model.vo.StartExamVO;
|
import org.qinan.cedu.model.vo.StartExamVO;
|
||||||
|
|
@ -74,8 +75,8 @@ public interface PaperExamService extends IService<PaperExamDO> {
|
||||||
/**
|
/**
|
||||||
* 交卷:汇总用户最近一次进行中考试各试题作答得分,更新考试成绩、是否通过并结束考试
|
* 交卷:汇总用户最近一次进行中考试各试题作答得分,更新考试成绩、是否通过并结束考试
|
||||||
*
|
*
|
||||||
* @param paperId 试卷id
|
* @param dto 交卷入参(试卷id必填)
|
||||||
* @param userId 用户id
|
* @param userId 当前用户id
|
||||||
*/
|
*/
|
||||||
void submitExam(Long paperId, Long userId);
|
void submitExam(SubmitExamDTO dto, Long userId);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package org.qinan.cedu.service.impl;
|
package org.qinan.cedu.service.impl;
|
||||||
|
|
||||||
|
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;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
|
@ -10,12 +11,14 @@ 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.PaperExamMapper;
|
import org.qinan.cedu.mapper.PaperExamMapper;
|
||||||
|
import org.qinan.cedu.mapper.PaperExamQuestionUserMapper;
|
||||||
import org.qinan.cedu.mapper.PaperMapper;
|
import org.qinan.cedu.mapper.PaperMapper;
|
||||||
import org.qinan.cedu.mapper.QuestionMapper;
|
import org.qinan.cedu.mapper.QuestionMapper;
|
||||||
import org.qinan.cedu.model.dto.AnswerQuestionDTO;
|
import org.qinan.cedu.model.dto.AnswerQuestionDTO;
|
||||||
import org.qinan.cedu.model.dto.PaperExamDTO;
|
import org.qinan.cedu.model.dto.PaperExamDTO;
|
||||||
import org.qinan.cedu.model.dto.PaperExamPageQueryDTO;
|
import org.qinan.cedu.model.dto.PaperExamPageQueryDTO;
|
||||||
import org.qinan.cedu.model.dto.StartExamDTO;
|
import org.qinan.cedu.model.dto.StartExamDTO;
|
||||||
|
import org.qinan.cedu.model.dto.SubmitExamDTO;
|
||||||
import org.qinan.cedu.model.entity.PaperDO;
|
import org.qinan.cedu.model.entity.PaperDO;
|
||||||
import org.qinan.cedu.model.entity.PaperExamDO;
|
import org.qinan.cedu.model.entity.PaperExamDO;
|
||||||
import org.qinan.cedu.model.entity.PaperExamQuestionUserDO;
|
import org.qinan.cedu.model.entity.PaperExamQuestionUserDO;
|
||||||
|
|
@ -36,7 +39,6 @@ import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -57,6 +59,8 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
|
||||||
|
|
||||||
private final PaperExamQuestionUserService paperExamQuestionUserService;
|
private final PaperExamQuestionUserService paperExamQuestionUserService;
|
||||||
|
|
||||||
|
private final PaperExamQuestionUserMapper paperExamQuestionUserMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IPage<PaperExamVO> pageQuery(PaperExamPageQueryDTO query) {
|
public IPage<PaperExamVO> pageQuery(PaperExamPageQueryDTO query) {
|
||||||
return this.lambdaQuery()
|
return this.lambdaQuery()
|
||||||
|
|
@ -139,14 +143,20 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void answerQuestion(AnswerQuestionDTO dto, Long userId) {
|
public void answerQuestion(AnswerQuestionDTO dto, Long userId) {
|
||||||
|
// 仅查询后续用到的字段,updateById 默认忽略 null 字段,未查询字段不会被覆盖
|
||||||
PaperExamQuestionUserDO questionUser = paperExamQuestionUserService.lambdaQuery()
|
PaperExamQuestionUserDO questionUser = paperExamQuestionUserService.lambdaQuery()
|
||||||
|
.select(PaperExamQuestionUserDO::getId, PaperExamQuestionUserDO::getQuestionId,
|
||||||
|
PaperExamQuestionUserDO::getQuestionScore)
|
||||||
.eq(PaperExamQuestionUserDO::getId, dto.getId())
|
.eq(PaperExamQuestionUserDO::getId, dto.getId())
|
||||||
.eq(PaperExamQuestionUserDO::getUserId, userId)
|
.eq(PaperExamQuestionUserDO::getUserId, userId)
|
||||||
.one();
|
.one();
|
||||||
if (questionUser == null) {
|
if (questionUser == null) {
|
||||||
throw new IllegalArgumentException("作答记录不存在");
|
throw new IllegalArgumentException("作答记录不存在");
|
||||||
}
|
}
|
||||||
QuestionDO question = questionMapper.selectById(questionUser.getQuestionId());
|
// 仅查询判分需要的参考答案字段
|
||||||
|
QuestionDO question = questionMapper.selectOne(new LambdaQueryWrapper<QuestionDO>()
|
||||||
|
.select(QuestionDO::getAnswer, QuestionDO::getAnswerQuestionOptionIds)
|
||||||
|
.eq(QuestionDO::getId, questionUser.getQuestionId()));
|
||||||
if (question == null) {
|
if (question == null) {
|
||||||
throw new IllegalArgumentException("试题不存在");
|
throw new IllegalArgumentException("试题不存在");
|
||||||
}
|
}
|
||||||
|
|
@ -162,9 +172,9 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void submitExam(Long paperId, Long userId) {
|
public void submitExam(SubmitExamDTO dto, Long userId) {
|
||||||
PaperExamDO paperExam = this.lambdaQuery()
|
PaperExamDO paperExam = this.lambdaQuery()
|
||||||
.eq(PaperExamDO::getPaperId, paperId)
|
.eq(PaperExamDO::getPaperId, dto.getPaperId())
|
||||||
.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())
|
||||||
|
|
@ -211,17 +221,10 @@ public class PaperExamServiceImpl extends ServiceImpl<PaperExamMapper, PaperExam
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 汇总一次考试所有试题的作答得分(未作答按0分计入)
|
* 汇总一次考试所有试题的作答得分(数据库SUM聚合,未作答按0分计入)
|
||||||
*/
|
*/
|
||||||
private BigDecimal sumAnswerScore(Long paperExamId) {
|
private BigDecimal sumAnswerScore(Long paperExamId) {
|
||||||
List<PaperExamQuestionUserDO> questionUserList = paperExamQuestionUserService.lambdaQuery()
|
return paperExamQuestionUserMapper.sumAnswerScore(paperExamId);
|
||||||
.eq(PaperExamQuestionUserDO::getPaperExamId, paperExamId)
|
|
||||||
.eq(PaperExamQuestionUserDO::getDeleteEnum, DeleteEnum.FALSE.getCode())
|
|
||||||
.list();
|
|
||||||
return questionUserList.stream()
|
|
||||||
.map(PaperExamQuestionUserDO::getAnswerScore)
|
|
||||||
.filter(Objects::nonNull)
|
|
||||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="org.qinan.cedu.mapper.PaperExamQuestionUserMapper">
|
||||||
|
|
||||||
|
<select id="sumAnswerScore" resultType="java.math.BigDecimal">
|
||||||
|
SELECT IFNULL(SUM(answer_score), 0)
|
||||||
|
FROM paper_exam_question_user
|
||||||
|
WHERE paper_exam_id = #{paperExamId}
|
||||||
|
AND delete_enum = 'false'
|
||||||
|
</select>
|
||||||
|
</mapper>
|
||||||
Loading…
Reference in New Issue