Commit c8c6c966 by Wangmin

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

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