Commit 15f58cdf by Wangmin

Merge remote-tracking branch 'origin/master'

parents 647d521e 657eaf33
package com.ruoyi.school.paper.controller;
import java.util.List;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import cn.dev33.satoken.annotation.SaIgnore;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.RepeatSubmit;
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.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.core.validate.QueryGroup;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.school.paper.domain.vo.DbTestPaperVo;
import com.ruoyi.school.paper.domain.bo.DbTestPaperBo;
import com.ruoyi.school.paper.domain.vo.DbTestPaperVo;
import com.ruoyi.school.paper.service.IDbTestPaperService;
import com.ruoyi.common.core.page.TableDataInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
import java.util.List;
/**
* 试卷
......@@ -81,7 +79,7 @@ public class DbTestPaperController extends BaseController {
}
/**
* 随机生成试卷
* 【PC】随机生成试卷
*/
@Log(title = "试卷", businessType = BusinessType.INSERT)
@RepeatSubmit()
......
......@@ -18,14 +18,18 @@ import lombok.EqualsAndHashCode;
@TableName("db_question_bank_test_paper")
public class DbQuestionBankTestPaper extends BaseEntity {
private static final long serialVersionUID=1L;
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "id",type = IdType.AUTO)
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 题库id
*/
private Long questionBankId;
/**
* 试卷id
*/
private Long testPaperId;
......@@ -70,6 +74,10 @@ public class DbQuestionBankTestPaper extends BaseEntity {
*/
private String resolveVideo;
/**
* 分数
*/
private Integer score;
/**
* 备注
*/
private String remark;
......
......@@ -210,7 +210,7 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService {
*/
@Override
public void init() {
List<DbQuestionBank> dbQuestionBanks = baseMapper.selectList();
List<DbQuestionBank> dbQuestionBanks = baseMapper.selectList(Wrappers.<DbQuestionBank>lambdaQuery().eq(DbQuestionBank::getStatus, 0));
RedisUtils.setCacheObject("question_bank:default_question_bank", JsonUtils.toJsonString(dbQuestionBanks));
}
}
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 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.JsonUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.redis.RedisUtils;
import com.ruoyi.school.paper.domain.*;
import com.ruoyi.school.paper.domain.bo.DbTestPaperBo;
import com.ruoyi.school.paper.domain.vo.DbTestPaperVo;
import com.ruoyi.school.paper.domain.DbTestPaper;
import com.ruoyi.school.paper.mapper.DbQuestionBankAnswerMapper;
import com.ruoyi.school.paper.mapper.DbQuestionBankAnswerTestPaperMapper;
import com.ruoyi.school.paper.mapper.DbQuestionBankTestPaperMapper;
import com.ruoyi.school.paper.mapper.DbTestPaperMapper;
import com.ruoyi.school.paper.service.IDbTestPaperService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.*;
import java.util.stream.Collectors;
/**
* 试卷Service业务层处理
......@@ -30,14 +35,10 @@ import java.util.Collection;
public class DbTestPaperServiceImpl implements IDbTestPaperService {
private final DbTestPaperMapper baseMapper;
/**
* 查询试卷
*/
@Override
public DbTestPaperVo queryById(Long id){
return baseMapper.selectVoById(id);
}
private final DbQuestionBankTestPaperMapper questionBankTestPaperMapper;
private final DbQuestionBankAnswerMapper questionBankAnswerMapper;
private final DbQuestionBankAnswerTestPaperMapper questionBankAnswerTestPaperMapper;
private String DEFAULT_QUESTIOBN_BANK_KEY = "question_bank:default_question_bank";
/**
* 查询试卷列表
......@@ -95,9 +96,17 @@ public class DbTestPaperServiceImpl implements IDbTestPaperService {
}
/**
* 查询试卷
*/
@Override
public DbTestPaperVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(DbTestPaper entity){
private void validEntityBeforeSave(DbTestPaper entity) {
//TODO 做一些数据校验,如唯一约束
}
......@@ -106,17 +115,138 @@ public class DbTestPaperServiceImpl implements IDbTestPaperService {
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 随机生成试卷
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean randomGeneration(DbTestPaperBo bo) {
DbTestPaper add = BeanUtil.toBean(bo, DbTestPaper.class);
baseMapper.insert(add);
// 从redis中获取所有题目
List<DbQuestionBank> dbQuestionBanks = JsonUtils.parseArray(RedisUtils.getCacheObject(DEFAULT_QUESTIOBN_BANK_KEY), DbQuestionBank.class);
// 筛选符合条件的题目
Map<Integer, List<DbQuestionBank>> collect = dbQuestionBanks.stream()
.filter(bank -> bank.getCategoryId().equals(bo.getCategoryId())
&& bank.getPhaseId().equals(bo.getPhaseId())
).collect(Collectors.groupingBy(DbQuestionBank::getSpecies));
// 根据习题种类分组
// 选择题
List<DbQuestionBank> select = collect.get("2");
// 填空题
List<DbQuestionBank> gapFilling = collect.get("1");
// 解答题
List<DbQuestionBank> resolve = collect.get("3");
// 随机筛选题目
List<DbQuestionBankTestPaper> papers = new ArrayList<>();
List<DbQuestionBankTestPaper> selectList = null;
if (bo.getTotalPoints().equals(100)) {
selectList = generatePaper(select, 4, bo.getTotalPoints(), add.getId());
List<DbQuestionBankTestPaper> gapFillingList = generatePaper(gapFilling, 5, bo.getTotalPoints(), add.getId());
List<DbQuestionBankTestPaper> resolveList = generatePaper(resolve, 2, bo.getTotalPoints(), add.getId());
papers.addAll(selectList);
papers.addAll(gapFillingList);
papers.addAll(resolveList);
} else {
selectList = generatePaper(select, 4, bo.getTotalPoints(), add.getId());
List<DbQuestionBankTestPaper> gapFillingList = generatePaper(gapFilling, 12, bo.getTotalPoints(), add.getId());
List<DbQuestionBankTestPaper> resolveList = generatePaper(resolve, 5, bo.getTotalPoints(), add.getId());
papers.addAll(selectList);
papers.addAll(gapFillingList);
papers.addAll(resolveList);
}
questionBankTestPaperMapper.insertBatch(papers);
this.saveSelectListOptions(add.getId());
return null;
}
/**
* 保存选择题的选项
*
* @param paperId 试卷id
*/
private void saveSelectListOptions(Long paperId) {
List<DbQuestionBankTestPaper> papers = questionBankTestPaperMapper.selectList(Wrappers.<DbQuestionBankTestPaper>lambdaQuery()
.eq(DbQuestionBankTestPaper::getTestPaperId, paperId)
.eq(DbQuestionBankTestPaper::getSpecies, 2));
papers.forEach(questionBank -> {
List<DbQuestionBankAnswer> dbQuestionBankAnswers = questionBankAnswerMapper.selectList(Wrappers.<DbQuestionBankAnswer>lambdaQuery()
.select(DbQuestionBankAnswer::getOptionContent, DbQuestionBankAnswer::getOptionTag)
.eq(DbQuestionBankAnswer::getQuestionBankId, questionBank.getQuestionBankId())
.eq(DbQuestionBankAnswer::getStatus, 0)
);
dbQuestionBankAnswers.forEach(questionBankAnswer -> {
questionBankAnswer.setQuestionBankId(questionBank.getId());
});
List<DbQuestionBankAnswerTestPaper> answerTestPapers = BeanUtil.copyToList(dbQuestionBankAnswers, DbQuestionBankAnswerTestPaper.class);
questionBankAnswerTestPaperMapper.insertBatch(answerTestPapers);
});
}
/**
* 随机筛选题目
*
* @param list 习题列表
* @param num 习题数量
* @param totalPoints 总分
* @return
*/
private List<DbQuestionBankTestPaper> generatePaper(List<DbQuestionBank> list, int num, Integer totalPoints, Long paperId) {
System.out.println("系统正在随机抽取题目生成试卷,这可能需要一段时间,请耐心等候···");
HashSet<DbQuestionBankTestPaper> paper = new HashSet<>();//用来存储题目,set集合去重复
//这个while循环用来生成不重复的一套题目
while (paper.size() != num) {
DbQuestionBank question = list.get(new Random().nextInt(list.size()));
DbQuestionBankTestPaper questionBankTestPaper = BeanUtil.copyProperties(question, DbQuestionBankTestPaper.class);
if (totalPoints.equals(100)) {
switch (questionBankTestPaper.getSpecies()) {
case 1:
questionBankTestPaper.setScore(10);
break;
case 2:
questionBankTestPaper.setScore(4);
break;
case 3:
questionBankTestPaper.setScore(15);
break;
}
} else {
switch (questionBankTestPaper.getSpecies()) {
case 1:
if (paper.size() <= 6) {
questionBankTestPaper.setScore(4);
} else {
questionBankTestPaper.setScore(5);
}
break;
case 2:
if (paper.size() <= 2) {
questionBankTestPaper.setScore(4);
} else {
questionBankTestPaper.setScore(5);
}
break;
case 3:
if (paper.size() <= 3) {
questionBankTestPaper.setScore(14);
} else {
questionBankTestPaper.setScore(18);
}
break;
}
}
questionBankTestPaper.setId(null);
questionBankTestPaper.setTestPaperId(paperId);
questionBankTestPaper.setQuestionBankId(question.getId());
paper.add(questionBankTestPaper);
}
List<DbQuestionBankTestPaper> newPaper = new ArrayList<>(paper);
return newPaper;
}
}
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