Commit d226227a by 郑云飞

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	school-paper/src/main/java/com/ruoyi/school/paper/service/impl/DbQuestionBankServiceImpl.java
parents 48543b2f 4d38e523
......@@ -167,7 +167,7 @@ mybatis-plus:
dbConfig:
# 主键类型
# AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID
idType: ASSIGN_ID
idType: AUTO
# 逻辑已删除值
logicDeleteValue: 2
# 逻辑未删除值
......
......@@ -13,6 +13,7 @@ import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.school.paper.domain.bo.DbQuestionBankBo;
import com.ruoyi.school.paper.domain.bo.QuestionBankAndAnswerBo;
import com.ruoyi.school.paper.domain.vo.DbQuestionBankAndAnswerVo;
import com.ruoyi.school.paper.domain.vo.DbQuestionBankVo;
import com.ruoyi.school.paper.service.IDbQuestionBankService;
import lombok.RequiredArgsConstructor;
......@@ -45,7 +46,6 @@ public class DbQuestionBankController extends BaseController {
*/
@GetMapping("/list")
public TableDataInfo<DbQuestionBankVo> list(DbQuestionBankBo bo, PageQuery pageQuery) {
return iDbQuestionBankService.queryPageList(bo, pageQuery);
}
......@@ -70,6 +70,17 @@ public class DbQuestionBankController extends BaseController {
}
/**
* [PC端]获取题目详细信息
*
* @param id 题目ID
* @return 题目详细信息
*/
@GetMapping("detail/{id}")
public R<DbQuestionBankAndAnswerVo> getDetailInfoById(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return R.ok(iDbQuestionBankService.getById(id));
}
/**
* 新增题库主
*/
@Log(title = "题库主", businessType = BusinessType.INSERT)
......@@ -103,6 +114,19 @@ public class DbQuestionBankController extends BaseController {
}
/**
* [PC端] 修改题目信息
*
* @param bo 修改信息
* @return 操作结果
*/
@Log(title = "题库", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping("/question")
public R<Void> editQuestionAndAnswerRecords(@Validated(EditGroup.class) @RequestBody QuestionBankAndAnswerBo bo) {
return toAjax(iDbQuestionBankService.updateByBo(bo));
}
/**
* 删除题库主
*
* @param ids 主键串
......
......@@ -11,6 +11,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
import java.util.Objects;
/**
......@@ -35,12 +36,18 @@ public class TestPaperController extends BaseController {
*/
@Log(title = "开始考试", businessType = BusinessType.OTHER)
@GetMapping("/startTest/{paperId}")
public R<TestPaperVo> startTest(@PathVariable("paperId") Long paperId) {
public R<TestPaperVo> startTest(@NotNull(message = "试卷ID不能为空") @PathVariable("paperId") Long paperId) {
Long userId = getUserId();
Objects.requireNonNull(userId, "未检查到合法账户信息");
return R.ok(testPaperService.generateTestPaper(userId, paperId));
}
/**
* 交卷
*
* @param bo 试卷参数
* @return 无返回值
*/
@Log(title = "交卷", businessType = BusinessType.INSERT)
@PostMapping("/endTest/")
public R<Void> paperTestEnd(@RequestBody TestPaperAnswerBo bo) {
......
......@@ -63,6 +63,6 @@ public class DbTestPaperRecordDetail extends BaseEntity {
/**
* 创建时间
*/
private Date cerateTime;
private Date createTime;
}
package com.ruoyi.school.paper.domain.bo;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.util.Date;
import com.ruoyi.common.core.domain.BaseEntity;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 题目答案业务对象 db_question_bank_answer
......@@ -48,13 +47,13 @@ public class DbQuestionBankAnswerBo extends BaseEntity {
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
/**
* 状态:0正常, 1删除
*/
@NotNull(message = "状态:0正常, 1删除不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotNull(message = "状态:0正常, 1删除不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer status;
......
package com.ruoyi.school.paper.domain.bo;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.util.Date;
import com.ruoyi.common.core.domain.BaseEntity;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 题库主业务对象 db_question_bank
......@@ -48,8 +47,8 @@ public class DbQuestionBankBo extends BaseEntity {
/**
* 类型:1典例精讲
*/
@NotNull(message = "类型:1典例精讲不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer type;
// @NotNull(message = "类型:1典例精讲不能为空", groups = { AddGroup.class, EditGroup.class })
private int type;
/**
* 强度:1基础,2中等,3提高
......@@ -78,25 +77,25 @@ public class DbQuestionBankBo extends BaseEntity {
/**
* 解答过程
*/
@NotBlank(message = "解答过程不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "解答过程不能为空", groups = { AddGroup.class, EditGroup.class })
private String resolveCourse;
/**
* 解答视频
*/
@NotBlank(message = "解答视频不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "解答视频不能为空", groups = { AddGroup.class, EditGroup.class })
private String resolveVideo;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
/**
* 状态:0正常,1删除
*/
@NotNull(message = "状态:0正常,1删除不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotNull(message = "状态:0正常,1删除不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer status;
......
package com.ruoyi.school.paper.domain.bo;
import com.ruoyi.school.paper.domain.DbQuestionBank;
import com.ruoyi.school.paper.domain.DbQuestionBankAnswer;
import lombok.Data;
import lombok.EqualsAndHashCode;
......@@ -17,11 +15,11 @@ import java.util.List;
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class QuestionBankAndAnswerBo extends DbQuestionBank {
public class QuestionBankAndAnswerBo extends DbQuestionBankBo {
/**
* 选择题对应选项
*/
private List<DbQuestionBankAnswer> options;
private List<DbQuestionBankAnswerBo> options;
}
package com.ruoyi.school.paper.domain.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* 问题详情实体类
* <p>created in 2023/7/24 10:08
*
* @author WangMin
* @version 1.0
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class DbQuestionBankAndAnswerVo extends DbQuestionBankVo {
/**
* 选择题对应选项
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<DbQuestionBankAnswerVo> options;
}
package com.ruoyi.school.paper.mapper;
import com.ruoyi.school.paper.domain.DbQuestionBank;
import com.ruoyi.school.paper.domain.vo.DbQuestionBankAndAnswerVo;
import com.ruoyi.school.paper.domain.vo.DbQuestionBankVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Mapper;
import java.io.Serializable;
/**
* 题库主Mapper接口
*
......@@ -14,4 +17,11 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface DbQuestionBankMapper extends BaseMapperPlus<DbQuestionBankMapper, DbQuestionBank, DbQuestionBankVo> {
/**
* 根据题目ID查询题目详细信息
*
* @param id 题目ID
* @return 题目详细信息
*/
DbQuestionBankAndAnswerVo selectDetailById(Serializable id);
}
......@@ -3,6 +3,7 @@ package com.ruoyi.school.paper.mapper;
import com.ruoyi.school.paper.domain.DbTestPaperRecordDetail;
import com.ruoyi.school.paper.domain.vo.DbTestPaperRecordDetailVo;
import com.ruoyi.common.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Mapper;
/**
* 答题记录详情Mapper接口
......@@ -10,6 +11,7 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus;
* @author zyf
* @date 2023-07-20
*/
@Mapper
public interface DbTestPaperRecordDetailMapper extends BaseMapperPlus<DbTestPaperRecordDetailMapper, DbTestPaperRecordDetail, DbTestPaperRecordDetailVo> {
}
package com.ruoyi.school.paper.service;
import com.ruoyi.school.paper.domain.DbQuestionBank;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.school.paper.domain.bo.DbQuestionBankBo;
import com.ruoyi.school.paper.domain.bo.QuestionBankAndAnswerBo;
import com.ruoyi.school.paper.domain.vo.DbQuestionBankAndAnswerVo;
import com.ruoyi.school.paper.domain.vo.DbQuestionBankVo;
import com.ruoyi.school.paper.domain.bo.DbQuestionBankBo;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
......@@ -23,6 +23,15 @@ public interface IDbQuestionBankService {
*/
DbQuestionBankVo queryById(Long id);
/**
* 查询题目详细信息
*
* @param id 题目ID
* @return 题目信息
*/
DbQuestionBankAndAnswerVo getById(Long id);
/**
* 查询题库主列表
*/
......@@ -38,7 +47,9 @@ public interface IDbQuestionBankService {
*/
Boolean insertByBo(DbQuestionBankBo bo);
/** 新增题库
/**
* 新增题库
*
* @param bo 题目参数及答案列表
* @return 操作结果
*/
......@@ -49,6 +60,8 @@ public interface IDbQuestionBankService {
*/
Boolean updateByBo(DbQuestionBankBo bo);
boolean updateByBo(QuestionBankAndAnswerBo bo);
/**
* 校验并批量删除题库主信息
*/
......
......@@ -12,8 +12,10 @@ import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.redis.RedisUtils;
import com.ruoyi.school.paper.domain.DbQuestionBank;
import com.ruoyi.school.paper.domain.DbQuestionBankAnswer;
import com.ruoyi.school.paper.domain.bo.DbQuestionBankAnswerBo;
import com.ruoyi.school.paper.domain.bo.DbQuestionBankBo;
import com.ruoyi.school.paper.domain.bo.QuestionBankAndAnswerBo;
import com.ruoyi.school.paper.domain.vo.DbQuestionBankAndAnswerVo;
import com.ruoyi.school.paper.domain.vo.DbQuestionBankVo;
import com.ruoyi.school.paper.mapper.DbQuestionBankAnswerMapper;
import com.ruoyi.school.paper.mapper.DbQuestionBankMapper;
......@@ -22,9 +24,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 题库主Service业务层处理
......@@ -50,6 +50,11 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService {
return baseMapper.selectVoById(id);
}
@Override
public DbQuestionBankAndAnswerVo getById(Long id) {
return baseMapper.selectDetailById(id);
}
/**
* 查询题库主列表
*/
......@@ -75,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() != null, DbQuestionBank::getType, bo.getType());
lqw.eq(bo.getType() > -1, 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());
......@@ -123,9 +128,11 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService {
// 判断是否选择题,是就添加选择题选项
if ( insertRecord.getSpecies() == 2 && CollUtil.isNotEmpty(bo.getOptions())) {
List<DbQuestionBankAnswer> options = bo.getOptions();
for (DbQuestionBankAnswer option : options) {
option.setQuestionBankId(insertRecord.getId());
List<DbQuestionBankAnswer> options = new ArrayList<>(bo.getOptions().size());
for (DbQuestionBankAnswerBo option : bo.getOptions()) {
DbQuestionBankAnswer bankAnswer = BeanUtil.toBean(option, DbQuestionBankAnswer.class);
bankAnswer.setQuestionBankId(insertRecord.getId());
options.add(bankAnswer);
}
answerInsertFlag = questionBankAnswerMapper.insertBatch(options);
}
......@@ -152,6 +159,35 @@ public class DbQuestionBankServiceImpl implements IDbQuestionBankService {
}
/**
* 修改题库
*/
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateByBo(QuestionBankAndAnswerBo bo) {
DbQuestionBank updateRecord = BeanUtil.toBean(bo, DbQuestionBank.class);
validEntityBeforeSave(updateRecord);
boolean questionUpdateFlag = baseMapper.updateById(updateRecord) > 0;
// 若为选择题则同步插入至选项答案中
boolean answerUpdateFlag = false;
if (questionUpdateFlag && updateRecord.getSpecies() == 2 && CollUtil.isNotEmpty(bo.getOptions())) {
// 删除选择题旧有数据
LambdaQueryWrapper<DbQuestionBankAnswer> wrapper = new LambdaQueryWrapper<>();
Objects.requireNonNull(bo.getId(), "题目ID不能为空");
wrapper.eq(DbQuestionBankAnswer::getQuestionBankId, bo.getId());
questionBankAnswerMapper.delete(wrapper);
// 插入新值
List<DbQuestionBankAnswer> options = new ArrayList<>(bo.getOptions().size());
for (DbQuestionBankAnswerBo option : bo.getOptions()) {
DbQuestionBankAnswer bankAnswer = BeanUtil.toBean(option, DbQuestionBankAnswer.class);
bankAnswer.setQuestionBankId(updateRecord.getId());
options.add(bankAnswer);
}
answerUpdateFlag = questionBankAnswerMapper.insertBatch(options);
}
return questionUpdateFlag && answerUpdateFlag;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(DbQuestionBank entity) {
......
......@@ -67,7 +67,7 @@ public class DbTestPaperRecordDetailServiceImpl implements IDbTestPaperRecordDet
lqw.eq(bo.getScore() != null, DbTestPaperRecordDetail::getScore, bo.getScore());
lqw.eq(bo.getGood() != null, DbTestPaperRecordDetail::getGood, bo.getGood());
lqw.eq(bo.getStatus() != null, DbTestPaperRecordDetail::getStatus, bo.getStatus());
lqw.eq(bo.getCerateTime() != null, DbTestPaperRecordDetail::getCerateTime, bo.getCerateTime());
lqw.eq(bo.getCerateTime() != null, DbTestPaperRecordDetail::getCreateTime, bo.getCerateTime());
return lqw;
}
......
<?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">
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.school.paper.mapper.DbQuestionBankMapper">
<resultMap type="com.ruoyi.school.paper.domain.DbQuestionBank" id="DbQuestionBankResult">
<resultMap id="DbQuestionBankResult" type="com.ruoyi.school.paper.domain.DbQuestionBank">
<result property="id" column="id"/>
<result property="categoryId" column="category_id"/>
<result property="species" column="species"/>
......@@ -24,5 +24,54 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="updateBy" column="update_by"/>
</resultMap>
<resultMap id="QuestionBankDetail" type="com.ruoyi.school.paper.domain.vo.DbQuestionBankAndAnswerVo">
<id property="id" column="id"/>
<result property="categoryId" column="category_id"/>
<result property="species" column="species"/>
<result property="phaseId" column="phase_id"/>
<result property="type" column="type"/>
<result property="intensity" column="intensity"/>
<result property="topic" column="topic"/>
<result property="rightAnswers" column="right_answers"/>
<result property="rightAnswersPic" column="right_answers_pic"/>
<result property="resolveCourse" column="resolve_course"/>
<result property="resolveVideo" column="resolve_video"/>
<result property="remark" column="remark"/>
<result property="status" column="status"/>
<collection property="options" ofType="com.ruoyi.school.paper.domain.vo.DbQuestionBankAnswerVo">
<id property="id" column="a_id"/>
<result property="questionBankId" column="question_bank_id"/>
<result property="optionTag" column="option_tag"/>
<result property="optionContent" column="option_content"/>
<result property="remark" column="a_remark"/>
<result property="status" column="a_status"/>
</collection>
</resultMap>
<select id="selectDetailById" resultMap="QuestionBankDetail">
select bank.id,
bank.category_id,
bank.species,
bank.phase_id,
bank.type,
bank.intensity,
bank.topic,
bank.right_answers,
bank.right_answers_pic,
bank.resolve_course,
bank.resolve_video,
bank.remark,
bank.status,
answer.id as a_id,
answer.question_bank_id,
answer.option_tag,
answer.option_content,
answer.remark as a_remark,
answer.status as a_status
from db_question_bank as bank
left join db_question_bank_answer as answer on bank.species = 2 and answer.question_bank_id = bank.id
where bank.id = #{id}
</select>
</mapper>
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