Commit c8c6c966 by Wangmin

修改开始答题返回数据、试卷试题返回逻辑,交卷计算逻辑

parent d2840902
...@@ -2,10 +2,13 @@ package com.ruoyi.school.paper.controller; ...@@ -2,10 +2,13 @@ package com.ruoyi.school.paper.controller;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.school.paper.domain.bo.TestPaperAnswerBo; import com.ruoyi.school.paper.domain.bo.TestPaperAnswerBo;
import com.ruoyi.school.paper.domain.vo.TestPaperVo; import com.ruoyi.school.paper.domain.vo.TestPaperVo;
import com.ruoyi.school.paper.domain.vo.TestQuestionItemVo;
import com.ruoyi.school.paper.service.ITestPaperService; import com.ruoyi.school.paper.service.ITestPaperService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
...@@ -42,6 +45,12 @@ public class TestPaperController extends BaseController { ...@@ -42,6 +45,12 @@ public class TestPaperController extends BaseController {
return R.ok(testPaperService.generateTestPaper(userId, paperId)); return R.ok(testPaperService.generateTestPaper(userId, paperId));
} }
@Log(title = "下一题", businessType = BusinessType.OTHER)
@PostMapping("/next")
public TableDataInfo<TestQuestionItemVo> nextQuestion(@RequestBody TestPaperAnswerBo request, @RequestBody PageQuery pageQuery) {
return testPaperService.nextQuestion(request, pageQuery);
}
/** /**
* [小程序端]交卷 * [小程序端]交卷
* *
......
...@@ -9,6 +9,7 @@ import lombok.EqualsAndHashCode; ...@@ -9,6 +9,7 @@ import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
/** /**
* 题库主业务对象 db_question_bank * 题库主业务对象 db_question_bank
* *
...@@ -48,7 +49,7 @@ public class DbQuestionBankBo extends BaseEntity { ...@@ -48,7 +49,7 @@ public class DbQuestionBankBo extends BaseEntity {
* 类型:1典例精讲 * 类型:1典例精讲
*/ */
// @NotNull(message = "类型:1典例精讲不能为空", groups = { AddGroup.class, EditGroup.class }) // @NotNull(message = "类型:1典例精讲不能为空", groups = { AddGroup.class, EditGroup.class })
private int type; private Integer type;
/** /**
* 强度:1基础,2中等,3提高 * 强度:1基础,2中等,3提高
......
...@@ -23,7 +23,7 @@ public class TestPaperAnswerBo { ...@@ -23,7 +23,7 @@ public class TestPaperAnswerBo {
private Long recordId; private Long recordId;
/** /**
* 试卷考题答案 * 考生作答内容
*/ */
private List<TestPaperAnswerItemBo> answers; private List<TestPaperAnswerItemBo> answers;
} }
...@@ -5,6 +5,7 @@ import com.ruoyi.common.core.validate.EditGroup; ...@@ -5,6 +5,7 @@ import com.ruoyi.common.core.validate.EditGroup;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.io.Serializable;
/** /**
* 答题卷结果单项 * 答题卷结果单项
...@@ -14,7 +15,7 @@ import javax.validation.constraints.NotNull; ...@@ -14,7 +15,7 @@ import javax.validation.constraints.NotNull;
* @version 1.0 * @version 1.0
*/ */
@Data @Data
public class TestPaperAnswerItemBo { public class TestPaperAnswerItemBo implements Serializable {
/** /**
* 问题ID * 问题ID
......
...@@ -14,10 +14,10 @@ public class OptionsVo { ...@@ -14,10 +14,10 @@ public class OptionsVo {
/** /**
* 标签名 * 标签名
*/ */
private String tag; private String optionTag;
/** /**
* 内容 * 内容
*/ */
private String content; private String optionContent;
} }
...@@ -2,8 +2,6 @@ package com.ruoyi.school.paper.domain.vo; ...@@ -2,8 +2,6 @@ package com.ruoyi.school.paper.domain.vo;
import lombok.Data; import lombok.Data;
import java.util.List;
/** /**
* 学生考试 试题实体 * 学生考试 试题实体
* <p>created in 2023/7/21 16:29 * <p>created in 2023/7/21 16:29
...@@ -24,9 +22,4 @@ public class TestPaperVo { ...@@ -24,9 +22,4 @@ public class TestPaperVo {
*/ */
private Long recordId; private Long recordId;
/**
* 试题
*/
private List<TestQuestionsVo> questions;
} }
...@@ -24,6 +24,11 @@ public class TestQuestionItemVo { ...@@ -24,6 +24,11 @@ public class TestQuestionItemVo {
private String topic; private String topic;
/** /**
* 我的答案
*/
private String answer;
/**
* 选择题选项 * 选择题选项
*/ */
@JsonInclude(JsonInclude.Include.NON_EMPTY) @JsonInclude(JsonInclude.Include.NON_EMPTY)
......
package com.ruoyi.school.paper.mapper; package com.ruoyi.school.paper.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.common.core.mapper.BaseMapperPlus;
import com.ruoyi.school.paper.domain.DbQuestionBankTestPaper; import com.ruoyi.school.paper.domain.DbQuestionBankTestPaper;
import com.ruoyi.school.paper.domain.bo.TestPaperAnswerBo;
import com.ruoyi.school.paper.domain.vo.DbQuestionBankTestPaperVo; import com.ruoyi.school.paper.domain.vo.DbQuestionBankTestPaperVo;
import com.ruoyi.school.paper.domain.vo.TestQuestionsVo; import com.ruoyi.school.paper.domain.vo.TestQuestionItemVo;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* 试卷题库主Mapper接口 * 试卷题库主Mapper接口
* *
...@@ -24,6 +25,6 @@ public interface DbQuestionBankTestPaperMapper extends BaseMapperPlus<DbQuestion ...@@ -24,6 +25,6 @@ public interface DbQuestionBankTestPaperMapper extends BaseMapperPlus<DbQuestion
* *
* @return 试卷 * @return 试卷
*/ */
List<TestQuestionsVo> selectTestPaperQuestion(@Param("paperId") Long paperId); Page<TestQuestionItemVo> selectTestPaperQuestion(IPage<Object> iPage, @Param("condition")TestPaperAnswerBo request);
} }
...@@ -5,6 +5,7 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus; ...@@ -5,6 +5,7 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
import com.ruoyi.school.paper.domain.DbTestPaperRecord; import com.ruoyi.school.paper.domain.DbTestPaperRecord;
import com.ruoyi.school.paper.domain.bo.DbTestPaperRecordBo; import com.ruoyi.school.paper.domain.bo.DbTestPaperRecordBo;
import com.ruoyi.school.paper.domain.vo.DbTestPaperRecordVo; import com.ruoyi.school.paper.domain.vo.DbTestPaperRecordVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
/** /**
...@@ -13,6 +14,7 @@ import org.apache.ibatis.annotations.Param; ...@@ -13,6 +14,7 @@ import org.apache.ibatis.annotations.Param;
* @author zyf * @author zyf
* @date 2023-07-20 * @date 2023-07-20
*/ */
@Mapper
public interface DbTestPaperRecordMapper extends BaseMapperPlus<DbTestPaperRecordMapper, DbTestPaperRecord, DbTestPaperRecordVo> { public interface DbTestPaperRecordMapper extends BaseMapperPlus<DbTestPaperRecordMapper, DbTestPaperRecord, DbTestPaperRecordVo> {
Page<DbTestPaperRecordVo> getTestPaperlist(Page<Object> build, @Param("bo") DbTestPaperRecordBo bo); Page<DbTestPaperRecordVo> getTestPaperlist(Page<Object> build, @Param("bo") DbTestPaperRecordBo bo);
......
...@@ -3,8 +3,9 @@ package com.ruoyi.school.paper.service; ...@@ -3,8 +3,9 @@ package com.ruoyi.school.paper.service;
import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.school.paper.domain.bo.DbQuestionBankTestPaperBo; import com.ruoyi.school.paper.domain.bo.DbQuestionBankTestPaperBo;
import com.ruoyi.school.paper.domain.bo.TestPaperAnswerBo;
import com.ruoyi.school.paper.domain.vo.DbQuestionBankTestPaperVo; import com.ruoyi.school.paper.domain.vo.DbQuestionBankTestPaperVo;
import com.ruoyi.school.paper.domain.vo.TestQuestionsVo; import com.ruoyi.school.paper.domain.vo.TestQuestionItemVo;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
...@@ -53,5 +54,5 @@ public interface IDbQuestionBankTestPaperService { ...@@ -53,5 +54,5 @@ public interface IDbQuestionBankTestPaperService {
* *
* @return 试卷 * @return 试卷
*/ */
List<TestQuestionsVo> getTestPaperQuestion(Long paperId); TableDataInfo<TestQuestionItemVo> getTestPaperQuestion(TestPaperAnswerBo request, PageQuery pageQuery);
} }
package com.ruoyi.school.paper.service; package com.ruoyi.school.paper.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.school.paper.domain.DbTestPaperRecord;
import com.ruoyi.school.paper.domain.bo.DbTestPaperRecordBo; import com.ruoyi.school.paper.domain.bo.DbTestPaperRecordBo;
import com.ruoyi.school.paper.domain.vo.DbTestPaperRecordVo; import com.ruoyi.school.paper.domain.vo.DbTestPaperRecordVo;
...@@ -47,4 +49,12 @@ public interface IDbTestPaperRecordService { ...@@ -47,4 +49,12 @@ public interface IDbTestPaperRecordService {
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
TableDataInfo<DbTestPaperRecordVo> testPaperlist(DbTestPaperRecordBo bo, PageQuery pageQuery); TableDataInfo<DbTestPaperRecordVo> testPaperlist(DbTestPaperRecordBo bo, PageQuery pageQuery);
/**
* 查询某条考试记录
*
* @param wrapper 查询条件
* @return 结果
*/
DbTestPaperRecord getOne(Wrapper<DbTestPaperRecord> wrapper);
} }
package com.ruoyi.school.paper.service; package com.ruoyi.school.paper.service;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.school.paper.domain.bo.TestPaperAnswerBo; import com.ruoyi.school.paper.domain.bo.TestPaperAnswerBo;
import com.ruoyi.school.paper.domain.vo.TestPaperVo; import com.ruoyi.school.paper.domain.vo.TestPaperVo;
import com.ruoyi.school.paper.domain.vo.TestQuestionItemVo;
/** /**
* 考试接口 * 考试接口
...@@ -30,4 +33,13 @@ public interface ITestPaperService { ...@@ -30,4 +33,13 @@ public interface ITestPaperService {
* @return 操作结果 * @return 操作结果
*/ */
boolean paperTestEnd(TestPaperAnswerBo bo); boolean paperTestEnd(TestPaperAnswerBo bo);
/**
* 下一题
*
* @param request 请求参数 【注】考试记录ID必传
* @param pageQuery 分页
* @return 考试题目
*/
TableDataInfo<TestQuestionItemVo> nextQuestion(TestPaperAnswerBo request, PageQuery pageQuery);
} }
package com.ruoyi.school.paper.service.impl; package com.ruoyi.school.paper.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.school.paper.domain.DbErrorList;
import com.ruoyi.school.paper.domain.DbQuestionBankAnswerTestPaper; import com.ruoyi.school.paper.domain.DbQuestionBankAnswerTestPaper;
import com.ruoyi.school.paper.domain.bo.DbErrorListBo;
import com.ruoyi.school.paper.domain.request.ErrorTopicRequest; import com.ruoyi.school.paper.domain.request.ErrorTopicRequest;
import com.ruoyi.school.paper.domain.vo.*; import com.ruoyi.school.paper.domain.vo.*;
import com.ruoyi.school.paper.mapper.DbErrorListMapper;
import com.ruoyi.school.paper.mapper.DbQuestionBankAnswerTestPaperMapper; import com.ruoyi.school.paper.mapper.DbQuestionBankAnswerTestPaperMapper;
import com.ruoyi.school.paper.service.IDbErrorListService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ruoyi.school.paper.domain.bo.DbErrorListBo;
import com.ruoyi.school.paper.domain.DbErrorList;
import com.ruoyi.school.paper.mapper.DbErrorListMapper;
import com.ruoyi.school.paper.service.IDbErrorListService;
import java.util.*; import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -149,11 +151,9 @@ public class DbErrorListServiceImpl implements IDbErrorListService { ...@@ -149,11 +151,9 @@ public class DbErrorListServiceImpl implements IDbErrorListService {
if (CollectionUtils.isNotEmpty(records)) { if (CollectionUtils.isNotEmpty(records)) {
records.forEach(myErrorTopicListVo -> { records.forEach(myErrorTopicListVo -> {
//根据每到题目查询对应的选项 //根据每到题目查询对应的选项
//拿到对应选项填充至每道错题当中
Optional.ofNullable(dbQuestionBankAnswerTestPaperMapper.selectList(Wrappers.<DbQuestionBankAnswerTestPaper>lambdaQuery().eq(DbQuestionBankAnswerTestPaper::getQuestionBankId, myErrorTopicListVo.getQuestionBankId()))) Optional.ofNullable(dbQuestionBankAnswerTestPaperMapper.selectList(Wrappers.<DbQuestionBankAnswerTestPaper>lambdaQuery().eq(DbQuestionBankAnswerTestPaper::getQuestionBankId, myErrorTopicListVo.getQuestionBankId())))
.ifPresent(dbQuestionBankAnswerTestPapers -> { .ifPresent(myErrorTopicListVo::setOptions);
//拿到对应选项填充至每道错题当中
myErrorTopicListVo.setOptions(dbQuestionBankAnswerTestPapers);
});
}); });
} }
return TableDataInfo.build(myErrorTopicListVoPage); return TableDataInfo.build(myErrorTopicListVoPage);
......
...@@ -40,7 +40,7 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService { ...@@ -40,7 +40,7 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService {
private final DbQuestionBankAnswerMapper questionBankAnswerMapper; private final DbQuestionBankAnswerMapper questionBankAnswerMapper;
private String DEFAULT_QUESTIOBN_BANK_KEY = "question_bank:default_question_bank"; private final String DEFAULT_QUESTIOBN_BANK_KEY = "question_bank:default_question_bank";
/** /**
* 查询题库主 * 查询题库主
...@@ -80,7 +80,7 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService { ...@@ -80,7 +80,7 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService {
lqw.eq(bo.getCategoryId() != null, DbQuestionBank::getCategoryId, bo.getCategoryId()); lqw.eq(bo.getCategoryId() != null, DbQuestionBank::getCategoryId, bo.getCategoryId());
lqw.eq(bo.getSpecies() != null, DbQuestionBank::getSpecies, bo.getSpecies()); lqw.eq(bo.getSpecies() != null, DbQuestionBank::getSpecies, bo.getSpecies());
lqw.eq(bo.getPhaseId() != null, DbQuestionBank::getPhaseId, bo.getPhaseId()); lqw.eq(bo.getPhaseId() != null, DbQuestionBank::getPhaseId, bo.getPhaseId());
lqw.eq(bo.getType() > -1, DbQuestionBank::getType, bo.getType()); lqw.eq(bo.getType() != null, DbQuestionBank::getType, bo.getType());
lqw.eq(bo.getIntensity() != null, DbQuestionBank::getIntensity, bo.getIntensity()); lqw.eq(bo.getIntensity() != null, DbQuestionBank::getIntensity, bo.getIntensity());
lqw.eq(StringUtils.isNotBlank(bo.getTopic()), DbQuestionBank::getTopic, bo.getTopic()); lqw.eq(StringUtils.isNotBlank(bo.getTopic()), DbQuestionBank::getTopic, bo.getTopic());
lqw.eq(StringUtils.isNotBlank(bo.getRightAnswers()), DbQuestionBank::getRightAnswers, bo.getRightAnswers()); lqw.eq(StringUtils.isNotBlank(bo.getRightAnswers()), DbQuestionBank::getRightAnswers, bo.getRightAnswers());
...@@ -127,7 +127,7 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService { ...@@ -127,7 +127,7 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService {
RedisUtils.setCacheObject(DEFAULT_QUESTIOBN_BANK_KEY, JsonUtils.toJsonString(questionBanks)); RedisUtils.setCacheObject(DEFAULT_QUESTIOBN_BANK_KEY, JsonUtils.toJsonString(questionBanks));
// 判断是否选择题,是则添加选择题选项 // 判断是否选择题,是则添加选择题选项
if ( insertRecord.getSpecies() == 2 && CollUtil.isNotEmpty(bo.getOptions())) { if (insertRecord.getSpecies() == 2 && CollUtil.isNotEmpty(bo.getOptions())) {
List<DbQuestionBankAnswer> options = new ArrayList<>(bo.getOptions().size()); List<DbQuestionBankAnswer> options = new ArrayList<>(bo.getOptions().size());
for (DbQuestionBankAnswerBo option : bo.getOptions()) { for (DbQuestionBankAnswerBo option : bo.getOptions()) {
DbQuestionBankAnswer bankAnswer = BeanUtil.toBean(option, DbQuestionBankAnswer.class); DbQuestionBankAnswer bankAnswer = BeanUtil.toBean(option, DbQuestionBankAnswer.class);
...@@ -160,7 +160,7 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService { ...@@ -160,7 +160,7 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService {
validEntityBeforeSave(updateRecord); validEntityBeforeSave(updateRecord);
boolean questionUpdateFlag = baseMapper.updateById(updateRecord) > 0; boolean questionUpdateFlag = baseMapper.updateById(updateRecord) > 0;
// 若为选择题则同步插入至选项答案中 // 若为选择题则同步插入至选项答案中
boolean answerUpdateFlag = false; boolean answerUpdateFlag = true;
if (questionUpdateFlag) { if (questionUpdateFlag) {
// 将新增的题目添加到redis题库缓存中 // 将新增的题目添加到redis题库缓存中
List<DbQuestionBank> questionBanks = JsonUtils.parseArray(RedisUtils.getCacheObject(DEFAULT_QUESTIOBN_BANK_KEY), DbQuestionBank.class); List<DbQuestionBank> questionBanks = JsonUtils.parseArray(RedisUtils.getCacheObject(DEFAULT_QUESTIOBN_BANK_KEY), DbQuestionBank.class);
...@@ -191,7 +191,7 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService { ...@@ -191,7 +191,7 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService {
* 保存前的数据校验 * 保存前的数据校验
*/ */
private void validEntityBeforeSave(DbQuestionBank entity) { private void validEntityBeforeSave(DbQuestionBank entity) {
//TODO 做一些数据校验,如唯一约束 // TODO 做一些数据校验,如唯一约束
} }
/** /**
...@@ -200,7 +200,7 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService { ...@@ -200,7 +200,7 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService {
@Override @Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) { if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验 // TODO 做一些业务上的校验,判断是否需要校验
} }
return baseMapper.deleteBatchIds(ids) > 0; return baseMapper.deleteBatchIds(ids) > 0;
} }
......
package com.ruoyi.school.paper.service.impl; package com.ruoyi.school.paper.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.school.paper.domain.vo.TestQuestionsVo; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor; import com.ruoyi.common.core.domain.PageQuery;
import org.springframework.stereotype.Service; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.school.paper.domain.DbQuestionBankTestPaper;
import com.ruoyi.school.paper.domain.bo.DbQuestionBankTestPaperBo; import com.ruoyi.school.paper.domain.bo.DbQuestionBankTestPaperBo;
import com.ruoyi.school.paper.domain.bo.TestPaperAnswerBo;
import com.ruoyi.school.paper.domain.vo.DbQuestionBankTestPaperVo; import com.ruoyi.school.paper.domain.vo.DbQuestionBankTestPaperVo;
import com.ruoyi.school.paper.domain.DbQuestionBankTestPaper; import com.ruoyi.school.paper.domain.vo.TestQuestionItemVo;
import com.ruoyi.school.paper.mapper.DbQuestionBankTestPaperMapper; import com.ruoyi.school.paper.mapper.DbQuestionBankTestPaperMapper;
import com.ruoyi.school.paper.service.IDbQuestionBankTestPaperService; import com.ruoyi.school.paper.service.IDbQuestionBankTestPaperService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Collection;
/** /**
* 试卷题库主Service业务层处理 * 试卷题库主Service业务层处理
...@@ -120,7 +121,8 @@ public class DbQuestionBankTestPaperServiceImpl implements IDbQuestionBankTestPa ...@@ -120,7 +121,8 @@ public class DbQuestionBankTestPaperServiceImpl implements IDbQuestionBankTestPa
} }
@Override @Override
public List<TestQuestionsVo> getTestPaperQuestion(Long paperId) { public TableDataInfo<TestQuestionItemVo> getTestPaperQuestion(TestPaperAnswerBo request, PageQuery pageQuery) {
return baseMapper.selectTestPaperQuestion(paperId); Page<TestQuestionItemVo> result = baseMapper.selectTestPaperQuestion(pageQuery.build(), request);
return TableDataInfo.build(result);
} }
} }
package com.ruoyi.school.paper.service.impl; package com.ruoyi.school.paper.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
...@@ -34,7 +35,7 @@ public class DbTestPaperRecordServiceImpl implements IDbTestPaperRecordService { ...@@ -34,7 +35,7 @@ public class DbTestPaperRecordServiceImpl implements IDbTestPaperRecordService {
* 查询答题记录 * 查询答题记录
*/ */
@Override @Override
public DbTestPaperRecordVo queryById(Long id){ public DbTestPaperRecordVo queryById(Long id) {
return baseMapper.selectVoById(id); return baseMapper.selectVoById(id);
} }
...@@ -94,8 +95,8 @@ public class DbTestPaperRecordServiceImpl implements IDbTestPaperRecordService { ...@@ -94,8 +95,8 @@ public class DbTestPaperRecordServiceImpl implements IDbTestPaperRecordService {
/** /**
* 保存前的数据校验 * 保存前的数据校验
*/ */
private void validEntityBeforeSave(DbTestPaperRecord entity){ private void validEntityBeforeSave(DbTestPaperRecord entity) {
//TODO 做一些数据校验,如唯一约束 // TODO 做一些数据校验,如唯一约束
} }
/** /**
...@@ -104,7 +105,7 @@ public class DbTestPaperRecordServiceImpl implements IDbTestPaperRecordService { ...@@ -104,7 +105,7 @@ public class DbTestPaperRecordServiceImpl implements IDbTestPaperRecordService {
@Override @Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) { if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验 // TODO 做一些业务上的校验,判断是否需要校验
} }
return baseMapper.deleteBatchIds(ids) > 0; return baseMapper.deleteBatchIds(ids) > 0;
} }
...@@ -121,4 +122,15 @@ public class DbTestPaperRecordServiceImpl implements IDbTestPaperRecordService { ...@@ -121,4 +122,15 @@ public class DbTestPaperRecordServiceImpl implements IDbTestPaperRecordService {
Page<DbTestPaperRecordVo> result = baseMapper.getTestPaperlist(pageQuery.build(), bo); Page<DbTestPaperRecordVo> result = baseMapper.getTestPaperlist(pageQuery.build(), bo);
return TableDataInfo.build(result); return TableDataInfo.build(result);
} }
/**
* 查询某条考试记录
*
* @param wrapper 擦汗寻条件
* @return 结果
*/
@Override
public DbTestPaperRecord getOne(Wrapper<DbTestPaperRecord> wrapper) {
return baseMapper.selectOne(wrapper);
}
} }
package com.ruoyi.school.paper.service.impl; package com.ruoyi.school.paper.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.redis.RedisUtils;
import com.ruoyi.school.paper.domain.DbTestPaperRecord;
import com.ruoyi.school.paper.domain.DbTestPaperRecordDetail; import com.ruoyi.school.paper.domain.DbTestPaperRecordDetail;
import com.ruoyi.school.paper.domain.bo.DbQuestionBankTestPaperBo;
import com.ruoyi.school.paper.domain.bo.DbTestPaperRecordBo; import com.ruoyi.school.paper.domain.bo.DbTestPaperRecordBo;
import com.ruoyi.school.paper.domain.bo.TestPaperAnswerBo; import com.ruoyi.school.paper.domain.bo.TestPaperAnswerBo;
import com.ruoyi.school.paper.domain.bo.TestPaperAnswerItemBo; import com.ruoyi.school.paper.domain.bo.TestPaperAnswerItemBo;
import com.ruoyi.school.paper.domain.vo.DbQuestionBankTestPaperVo; import com.ruoyi.school.paper.domain.vo.DbQuestionBankTestPaperVo;
import com.ruoyi.school.paper.domain.vo.DbTestPaperVo; import com.ruoyi.school.paper.domain.vo.DbTestPaperVo;
import com.ruoyi.school.paper.domain.vo.TestPaperVo; import com.ruoyi.school.paper.domain.vo.TestPaperVo;
import com.ruoyi.school.paper.domain.vo.TestQuestionsVo; import com.ruoyi.school.paper.domain.vo.TestQuestionItemVo;
import com.ruoyi.school.paper.service.*; import com.ruoyi.school.paper.service.*;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -20,6 +28,7 @@ import java.math.BigDecimal; ...@@ -20,6 +28,7 @@ import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional;
/** /**
* <p>created in 2023/7/21 17:03 * <p>created in 2023/7/21 17:03
...@@ -39,6 +48,9 @@ public class TestPaperServiceImpl implements ITestPaperService { ...@@ -39,6 +48,9 @@ public class TestPaperServiceImpl implements ITestPaperService {
private final IDbTestPaperRecordDetailService paperRecordDetailService; private final IDbTestPaperRecordDetailService paperRecordDetailService;
private final String TEST_PAPER_ANSWER_KEY = "test_paper_record_detail";
private final String TEST_PAPER_ANSWER_KEY_FORMAT = "%s:record:%d:question:%d";
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public TestPaperVo generateTestPaper(Long userId, Long paperId) { public TestPaperVo generateTestPaper(Long userId, Long paperId) {
...@@ -47,45 +59,98 @@ public class TestPaperServiceImpl implements ITestPaperService { ...@@ -47,45 +59,98 @@ public class TestPaperServiceImpl implements ITestPaperService {
DbTestPaperVo dbTestPaperVo = testPaperService.queryById(paperId); DbTestPaperVo dbTestPaperVo = testPaperService.queryById(paperId);
Objects.requireNonNull(dbTestPaperVo, "未检查到目标试卷"); Objects.requireNonNull(dbTestPaperVo, "未检查到目标试卷");
result.setTestName(dbTestPaperVo.getTestName()); result.setTestName(dbTestPaperVo.getTestName());
// 插入学生-试卷考试记录信息 // 判断是否有该生的未交卷答题记录
DbTestPaperRecordBo dbTestPaperRecord = new DbTestPaperRecordBo(); LambdaQueryWrapper<DbTestPaperRecord> paperRecordWrapper = new LambdaQueryWrapper<>();
dbTestPaperRecord.setTestPaperId(paperId); paperRecordWrapper.eq(DbTestPaperRecord::getTestPaperId, paperId)
dbTestPaperRecord.setUserId(userId); .eq(DbTestPaperRecord::getUserId, userId)
dbTestPaperRecord.setStatus(0); .eq(DbTestPaperRecord::getStatus, 0);
boolean recordInsertFlag = paperRecordService.insertByBo(dbTestPaperRecord); DbTestPaperRecord dbTestPaperRecord;
if (!recordInsertFlag) { if ((dbTestPaperRecord = paperRecordService.getOne(paperRecordWrapper)) == null) {
throw new ServiceException("考试记录生成失败"); // 插入学生-试卷考试记录信息
DbTestPaperRecordBo insertTestPaperRecord = new DbTestPaperRecordBo();
insertTestPaperRecord.setTestPaperId(paperId);
insertTestPaperRecord.setUserId(userId);
// 状态设置为考试中
insertTestPaperRecord.setStatus(0);
boolean recordInsertFlag = paperRecordService.insertByBo(insertTestPaperRecord);
if (!recordInsertFlag) {
throw new ServiceException("考试记录生成失败");
}
dbTestPaperRecord = BeanUtil.copyProperties(insertTestPaperRecord, DbTestPaperRecord.class);
} }
result.setRecordId(dbTestPaperRecord.getId()); result.setRecordId(dbTestPaperRecord.getId());
// 查询试卷试题
List<TestQuestionsVo> testPaperQuestion = bankTestPaperService.getTestPaperQuestion(paperId);
result.setQuestions(testPaperQuestion);
return result; return result;
} }
/**
* 下一题
*
* @param request 请求参数 【注】考试记录ID必传
* @param pageQuery 分页
* @return 考试题目
*/
@Override @Override
public boolean paperTestEnd(TestPaperAnswerBo bo) { public TableDataInfo<TestQuestionItemVo> nextQuestion(TestPaperAnswerBo request, PageQuery pageQuery) {
List<TestPaperAnswerItemBo> answers = bo.getAnswers(); // 若传入了本题的结果,则先将结果存入Redis中
if (CollUtil.isEmpty(answers)) { if (CollUtil.isNotEmpty(request.getAnswers())) {
return true; request.getAnswers().forEach(answer -> {
String key = String.format(TEST_PAPER_ANSWER_KEY_FORMAT, TEST_PAPER_ANSWER_KEY, request.getRecordId(), answer.getId());
RedisUtils.setCacheObject(key, answer);
});
} }
List<DbTestPaperRecordDetail> insertPaperRecords = new ArrayList<>(answers.size()); // 返回下一题
for (TestPaperAnswerItemBo answer : answers) { TableDataInfo<TestQuestionItemVo> result = bankTestPaperService.getTestPaperQuestion(request, pageQuery);
List<TestQuestionItemVo> rows = result.getRows();
// 查询Redis缓存中是否存在该生已作答过的答案
rows.forEach(question -> {
String key = String.format(TEST_PAPER_ANSWER_KEY_FORMAT, TEST_PAPER_ANSWER_KEY, request.getRecordId(), question.getId());
TestPaperAnswerItemBo cacheObject = RedisUtils.getCacheObject(key);
Optional.ofNullable(cacheObject).ifPresent(cache -> {
question.setAnswer(cache.getAnswer());
});
});
return result;
}
/**
* 交卷
*
* @param bo 试题类容
* @return 操作结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public boolean paperTestEnd(TestPaperAnswerBo bo) {
// 查询试卷对应所有的题目
DbTestPaperRecord testPaperRecord = paperRecordService.getOne(Wrappers.<DbTestPaperRecord>lambdaQuery().eq(DbTestPaperRecord::getId, bo.getRecordId()));
Objects.requireNonNull(testPaperRecord, "未检查到合法考试记录");
DbQuestionBankTestPaperBo queryCondition = new DbQuestionBankTestPaperBo();
queryCondition.setTestPaperId(testPaperRecord.getTestPaperId());
List<DbQuestionBankTestPaperVo> questionList = bankTestPaperService.queryList(queryCondition);
List<DbTestPaperRecordDetail> insertPaperRecords = new ArrayList<>(questionList.size());
// 装载学生考试答题卡
questionList.forEach(question -> {
DbTestPaperRecordDetail buffer = new DbTestPaperRecordDetail(); DbTestPaperRecordDetail buffer = new DbTestPaperRecordDetail();
buffer.setRecordId(bo.getRecordId()); buffer.setRecordId(bo.getRecordId());
buffer.setQuestionBankId(answer.getId()); buffer.setQuestionBankId(question.getId());
buffer.setAnswer(answer.getAnswer()); // 查询Redis中是否有该题的提交记录
DbQuestionBankTestPaperVo bankTestPaperVo = bankTestPaperService.queryById(answer.getId()); String key = String.format(TEST_PAPER_ANSWER_KEY_FORMAT, TEST_PAPER_ANSWER_KEY, bo.getRecordId(), question.getId());
TestPaperAnswerItemBo cacheObject = RedisUtils.getCacheObject(key);
Optional.ofNullable(cacheObject).ifPresent(cache -> {
buffer.setAnswer(cache.getAnswer());
});
// 计算选择题分数
DbQuestionBankTestPaperVo bankTestPaperVo = bankTestPaperService.queryById(question.getId());
buffer.setCorrectAnswer(StringUtils.isNotEmpty(bankTestPaperVo.getRightAnswers()) ? bankTestPaperVo.getRightAnswers() : bankTestPaperVo.getRightAnswersPic()); buffer.setCorrectAnswer(StringUtils.isNotEmpty(bankTestPaperVo.getRightAnswers()) ? bankTestPaperVo.getRightAnswers() : bankTestPaperVo.getRightAnswersPic());
if (bankTestPaperVo.getSpecies().equals(2)) { if (bankTestPaperVo.getSpecies().equals(2)) {
buffer.setScore(answer.getAnswer().equals(bankTestPaperVo.getRightAnswers()) ? BigDecimal.valueOf(bankTestPaperVo.getScore()) : BigDecimal.ZERO); buffer.setScore(bankTestPaperVo.getRightAnswers().equals(buffer.getAnswer()) ? BigDecimal.valueOf(bankTestPaperVo.getScore()) : BigDecimal.ZERO);
} }
insertPaperRecords.add(buffer); insertPaperRecords.add(buffer);
} RedisUtils.deleteKeys(key);
});
if (CollUtil.isNotEmpty(insertPaperRecords)) { if (CollUtil.isNotEmpty(insertPaperRecords)) {
paperRecordDetailService.saveBatch(insertPaperRecords); return paperRecordDetailService.saveBatch(insertPaperRecords);
return true;
} }
return false; return true;
} }
} }
...@@ -25,32 +25,28 @@ ...@@ -25,32 +25,28 @@
<result property="updateBy" column="update_by"/> <result property="updateBy" column="update_by"/>
</resultMap> </resultMap>
<resultMap id="TestPaper" type="com.ruoyi.school.paper.domain.vo.TestQuestionsVo"> <resultMap id="TestPaper" type="com.ruoyi.school.paper.domain.vo.TestQuestionItemVo">
<result property="questionsCategory" column="category"/> <id property="id" column="id"/>
<collection property="item" ofType="com.ruoyi.school.paper.domain.vo.TestQuestionItemVo"> <result property="topic" column="topic"/>
<id property="id" column="id"/> <collection property="options" column="id" ofType="com.ruoyi.school.paper.domain.vo.OptionsVo" select="selectOptions">
<result property="topic" column="topic"/> <result property="optionTag" column="option_tag"/>
<collection property="options" ofType="com.ruoyi.school.paper.domain.vo.OptionsVo"> <result property="optionContent" column="option_content"/>
<result property="tag" column="option_tag"/>
<result property="content" column="option_content"/>
</collection>
</collection> </collection>
</resultMap> </resultMap>
<select id="selectOptions" resultType="com.ruoyi.school.paper.domain.vo.OptionsVo">
select options.option_tag, options.option_content
from db_question_bank_answer_test_paper as options
where options.question_bank_id = #{id}
</select>
<select id="selectTestPaperQuestion" resultMap="TestPaper"> <select id="selectTestPaperQuestion" resultMap="TestPaper">
select test_repository.id, select question_bank.id,
case test_repository.species question_bank.topic
when 1 then '填空题' from db_test_paper_record as answer_sheet
when 2 then '选择题' join db_question_bank_test_paper as question_bank
when 3 then '解答题' on answer_sheet.test_paper_id = question_bank.test_paper_id
else '未知' where answer_sheet.id = #{condition.recordId}
end as category,
test_repository.topic,
optons.option_tag,
optons.option_content
from db_question_bank_test_paper as test_repository
left join db_question_bank_answer_test_paper as optons on optons.question_bank_id = test_repository.id
where test_repository.test_paper_id = #{paperId}
</select> </select>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment