diff --git a/safety-cedu-service/src/main/java/org/qinan/cedu/controller/PaperExamController.java b/safety-cedu-service/src/main/java/org/qinan/cedu/controller/PaperExamController.java index 1b337ad2..57af029d 100644 --- a/safety-cedu-service/src/main/java/org/qinan/cedu/controller/PaperExamController.java +++ b/safety-cedu-service/src/main/java/org/qinan/cedu/controller/PaperExamController.java @@ -3,10 +3,10 @@ package org.qinan.cedu.controller; import com.jjb.saas.framework.auth.utils.AuthContext; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.qinan.cedu.model.dto.AnswerQuestionDTO; 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.service.PaperExamService; 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.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** @@ -53,8 +52,8 @@ public class PaperExamController { */ @ApiOperation("交卷") @PostMapping("/submitExam") - public SingleResponse submitExam(@ApiParam(value = "试卷id", required = true) @RequestParam Long paperId) { - paperExamService.submitExam(paperId, AuthContext.getUserId()); + public SingleResponse submitExam(@Validated @RequestBody SubmitExamDTO dto) { + paperExamService.submitExam(dto, AuthContext.getUserId()); return SingleResponse.success(); } } diff --git a/safety-cedu-service/src/main/java/org/qinan/cedu/mapper/PaperExamQuestionUserMapper.java b/safety-cedu-service/src/main/java/org/qinan/cedu/mapper/PaperExamQuestionUserMapper.java index fbbd7bbc..1c44ebd1 100644 --- a/safety-cedu-service/src/main/java/org/qinan/cedu/mapper/PaperExamQuestionUserMapper.java +++ b/safety-cedu-service/src/main/java/org/qinan/cedu/mapper/PaperExamQuestionUserMapper.java @@ -2,11 +2,22 @@ package org.qinan.cedu.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import org.qinan.cedu.model.entity.PaperExamQuestionUserDO; +import java.math.BigDecimal; + /** * 用户试卷试题 Mapper */ @Mapper public interface PaperExamQuestionUserMapper extends BaseMapper { + + /** + * 汇总一次考试所有试题的作答得分(数据库SUM聚合,未作答按0分计入) + * + * @param paperExamId 考试记录id + * @return 作答总得分(无记录时返回0) + */ + BigDecimal sumAnswerScore(@Param("paperExamId") Long paperExamId); } diff --git a/safety-cedu-service/src/main/java/org/qinan/cedu/model/dto/SubmitExamDTO.java b/safety-cedu-service/src/main/java/org/qinan/cedu/model/dto/SubmitExamDTO.java new file mode 100644 index 00000000..bb5a63f8 --- /dev/null +++ b/safety-cedu-service/src/main/java/org/qinan/cedu/model/dto/SubmitExamDTO.java @@ -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; +} diff --git a/safety-cedu-service/src/main/java/org/qinan/cedu/service/PaperExamService.java b/safety-cedu-service/src/main/java/org/qinan/cedu/service/PaperExamService.java index 10cace5e..0f975574 100644 --- a/safety-cedu-service/src/main/java/org/qinan/cedu/service/PaperExamService.java +++ b/safety-cedu-service/src/main/java/org/qinan/cedu/service/PaperExamService.java @@ -6,6 +6,7 @@ import org.qinan.cedu.model.dto.AnswerQuestionDTO; import org.qinan.cedu.model.dto.PaperExamDTO; import org.qinan.cedu.model.dto.PaperExamPageQueryDTO; 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.vo.PaperExamVO; import org.qinan.cedu.model.vo.StartExamVO; @@ -74,8 +75,8 @@ public interface PaperExamService extends IService { /** * 交卷:汇总用户最近一次进行中考试各试题作答得分,更新考试成绩、是否通过并结束考试 * - * @param paperId 试卷id - * @param userId 用户id + * @param dto 交卷入参(试卷id必填) + * @param userId 当前用户id */ - void submitExam(Long paperId, Long userId); + void submitExam(SubmitExamDTO dto, Long userId); } diff --git a/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/PaperExamServiceImpl.java b/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/PaperExamServiceImpl.java index d206af74..272bf186 100644 --- a/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/PaperExamServiceImpl.java +++ b/safety-cedu-service/src/main/java/org/qinan/cedu/service/impl/PaperExamServiceImpl.java @@ -1,5 +1,6 @@ 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.extension.plugins.pagination.Page; 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.PaperExamStatusEnum; 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.AnswerQuestionDTO; import org.qinan.cedu.model.dto.PaperExamDTO; import org.qinan.cedu.model.dto.PaperExamPageQueryDTO; 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.PaperExamDO; import org.qinan.cedu.model.entity.PaperExamQuestionUserDO; @@ -36,7 +39,6 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; /** @@ -57,6 +59,8 @@ public class PaperExamServiceImpl extends ServiceImpl pageQuery(PaperExamPageQueryDTO query) { return this.lambdaQuery() @@ -139,14 +143,20 @@ public class PaperExamServiceImpl extends ServiceImpl() + .select(QuestionDO::getAnswer, QuestionDO::getAnswerQuestionOptionIds) + .eq(QuestionDO::getId, questionUser.getQuestionId())); if (question == null) { throw new IllegalArgumentException("试题不存在"); } @@ -162,9 +172,9 @@ public class PaperExamServiceImpl extends ServiceImpl questionUserList = paperExamQuestionUserService.lambdaQuery() - .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); + return paperExamQuestionUserMapper.sumAnswerScore(paperExamId); } /** diff --git a/safety-cedu-service/src/main/resources/mapper/PaperExamQuestionUserMapper.xml b/safety-cedu-service/src/main/resources/mapper/PaperExamQuestionUserMapper.xml new file mode 100644 index 00000000..b1001894 --- /dev/null +++ b/safety-cedu-service/src/main/resources/mapper/PaperExamQuestionUserMapper.xml @@ -0,0 +1,11 @@ + + + + + +