luohairen
2024-11-12 b661bcf7e065092c876e052bad0bfaecb9dc0c17
优化错题查询
7个文件已修改
154 ■■■■ 已修改文件
src/main/java/com/ycl/jxkg/controller/student/WrongController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/domain/vo/student/wrong/WrongResponseVO.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/mapper/QuestionAnswerRecordMapper.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/service/WrongService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/service/impl/WrongServiceImpl.java 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/QuestionAnswerRecordMapper.xml 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ycl/jxkg/controller/student/WrongController.java
@@ -1,5 +1,6 @@
package com.ycl.jxkg.controller.student;
import com.github.pagehelper.PageInfo;
import com.ycl.jxkg.base.BaseApiController;
import com.ycl.jxkg.base.Result;
import com.ycl.jxkg.domain.vo.DoQuestionVO;
@@ -20,7 +21,7 @@
    private final WrongService wrongService;
    @PostMapping("/list")
    public Result<WrongResponseVO> list(@RequestBody WrongRequestVo model) {
    public Result<PageInfo<WrongResponseVO>> list(@RequestBody WrongRequestVo model) {
        model.setUserId(getCurrentUser().getId());
        return Result.ok(wrongService.list(model));
    }
src/main/java/com/ycl/jxkg/domain/vo/student/wrong/WrongResponseVO.java
@@ -1,18 +1,24 @@
package com.ycl.jxkg.domain.vo.student.wrong;
import com.ycl.jxkg.domain.entity.ExamPaper;
import com.ycl.jxkg.domain.entity.Question;
import com.ycl.jxkg.domain.entity.QuestionAnswerRecord;
import com.ycl.jxkg.domain.vo.DoQuestionVO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WrongResponseVO {
    private List<DoQuestionVO> list;
    private Integer pageIndex;
    private Integer pageSize;
    private Integer total;
    private Integer paperId;
    private String title;
    private Integer questionType;
    private BigDecimal score;
    private Integer difficult;
    private String examName;
}
src/main/java/com/ycl/jxkg/mapper/QuestionAnswerRecordMapper.java
@@ -1,7 +1,13 @@
package com.ycl.jxkg.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ycl.jxkg.domain.entity.QuestionAnswerRecord;
import com.ycl.jxkg.domain.vo.student.wrong.WrongRequestVo;
import com.ycl.jxkg.domain.vo.student.wrong.WrongResponseVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * @author:xp
@@ -10,6 +16,6 @@
@Mapper
public interface QuestionAnswerRecordMapper extends BaseMapper<QuestionAnswerRecord> {
    List<WrongResponseVO> selectWrongQuestion(@Param("wrongRequestVo") WrongRequestVo wrongRequestVo);
}
src/main/java/com/ycl/jxkg/service/WrongService.java
@@ -1,5 +1,6 @@
package com.ycl.jxkg.service;
import com.github.pagehelper.PageInfo;
import com.ycl.jxkg.domain.vo.student.wrong.WrongRequestVo;
import com.ycl.jxkg.domain.vo.student.wrong.WrongResponseVO;
@@ -8,6 +9,6 @@
    /**
     * 条件查询错题
     * */
    WrongResponseVO list(WrongRequestVo wrongRequestVo);
    PageInfo<WrongResponseVO> list(WrongRequestVo wrongRequestVo);
}
src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java
@@ -1008,7 +1008,7 @@
        if (!org.springframework.util.CollectionUtils.isEmpty(examPaperMark.getTitleItems())) {
            examPaperScore.setPaperContent(JSON.toJSONString(examPaperMark.getTitleItems()));
            // 保存答题记录
            this.saveQuestionAnswerRecord(examPaperMark.getUserId(), examPaperMark.getTitleItems());
            this.saveQuestionAnswerRecord(examPaperMark.getUserId(), examPaperMark.getTitleItems(), examPaperMark.getExamId(), examPaperMark.getPaperId());
        }
        if (!org.springframework.util.CollectionUtils.isEmpty(examPaperMark.getNavbar())) {
            examPaperScore.setNavbar(JSON.toJSONString(examPaperMark.getNavbar()));
@@ -1053,14 +1053,19 @@
     *
     * @param titleItems
     */
    private void saveQuestionAnswerRecord(Integer studentUserId, List<PaperFixQuestionVO> titleItems) {
    private void saveQuestionAnswerRecord(Integer studentUserId, List<PaperFixQuestionVO> titleItems, Integer examId, Integer paperId) {
        // 删除原来的答题记录
        new LambdaUpdateChainWrapper<>(questionAnswerRecordMapper)
                .eq(QuestionAnswerRecord::getExamId, examId)
                .eq(QuestionAnswerRecord::getUserId, studentUserId).remove();
        for (PaperFixQuestionVO titleItem : titleItems) {
            for (DoQuestionVO question : titleItem.getQuestionList()) {
                QuestionAnswerRecord record = new QuestionAnswerRecord();
                record.setQuestionType(titleItem.getQuestionType());
                record.setUserId(studentUserId);
                record.setDoRight(question.getRight());
                record.setExamId(question.getExamId());
                record.setExamId(examId);
                record.setPaperId(paperId);
                record.setQuestionId(question.getId());
                record.setScore(question.getScore());
                record.setUserAnswer(StringUtils.hasText(question.getAnswer()) ? question.getAnswer() : question.getAnswerList().stream().collect(Collectors.joining("、")));
src/main/java/com/ycl/jxkg/service/impl/WrongServiceImpl.java
@@ -1,19 +1,24 @@
package com.ycl.jxkg.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ycl.jxkg.domain.entity.ExamPaperScore;
import com.ycl.jxkg.domain.entity.Question;
import com.ycl.jxkg.domain.entity.QuestionAnswerRecord;
import com.ycl.jxkg.domain.vo.DoQuestionVO;
import com.ycl.jxkg.domain.vo.PaperFixQuestionVO;
import com.ycl.jxkg.domain.vo.student.wrong.WrongPageVo;
import com.ycl.jxkg.domain.vo.student.wrong.WrongRequestVo;
import com.ycl.jxkg.domain.vo.student.wrong.WrongResponseVO;
import com.ycl.jxkg.mapper.ExamPaperScoreMapper;
import com.ycl.jxkg.mapper.QuestionAnswerRecordMapper;
import com.ycl.jxkg.mapper.QuestionMapper;
import com.ycl.jxkg.service.WrongService;
import com.ycl.jxkg.utils.JsonUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -30,6 +35,8 @@
    private ExamPaperScoreMapper examPaperScoreMapper;
    @Autowired
    private QuestionMapper questionMapper;
    @Autowired
    private QuestionAnswerRecordMapper questionAnswerRecordMapper;
@@ -37,66 +44,9 @@
     * 条件查询错题
     * */
    @Override
    public WrongResponseVO list(WrongRequestVo wrongRequestVo) {
        WrongResponseVO wrongResponseVO = new WrongResponseVO();
        // 查询该用户的所有考试
        List<ExamPaperScore> examPaperScores = examPaperScoreMapper.selectByUserId(wrongRequestVo.getUserId());
        List<DoQuestionVO> questions = new ArrayList<>();
        // 遍历所有考试获得考试详情
        examPaperScores.stream().forEach(examPaperScore -> {
            try{
                // 解析json字符串
                List<PaperFixQuestionVO> paperFixQuestionVOS = JsonUtil.toJsonListObject(examPaperScore.getPaperContent(), PaperFixQuestionVO.class);
                paperFixQuestionVOS.stream().forEach(paperFixQuestionVO -> {
                    List<DoQuestionVO> doQuestionVOS = paperFixQuestionVO.getQuestionList().stream()
                            .filter(doQuestionVO -> !doQuestionVO.getRight())
                            .map(doQuestionVO -> {
                                // 根据id查询题干
                                Question question = questionMapper.selectOne(new LambdaQueryWrapper<>(Question.class).eq(Question::getId, doQuestionVO.getId()));
//                                Question question = questionMapper.selectById(doQuestionVO.getId());
                                doQuestionVO.setExamId(examPaperScore.getExamId());
                                doQuestionVO.setExamName(examPaperScore.getExamName());
                                doQuestionVO.setTitle(question.getTitle());
                                // 考试结果记录id
                                doQuestionVO.setId(examPaperScore.getId());
                                return doQuestionVO;
                            })
                            .collect(Collectors.toList());
                    questions.addAll(doQuestionVOS);
                });
            }catch (Exception e){
                e.printStackTrace();
            }
    public PageInfo<WrongResponseVO> list(WrongRequestVo wrongRequestVo) {
        return PageHelper.startPage(wrongRequestVo.getPageIndex(), wrongRequestVo.getPageSize()).doSelectPageInfo(() -> {
            questionAnswerRecordMapper.selectWrongQuestion(wrongRequestVo);
        });
        // 条件查询
        // 对集合中的题目进行模糊查询过滤
        List<DoQuestionVO> doQuestionVOS = questions.stream()
                // 标题不为空或空字符串,模糊查询
                .filter(question -> {
                    if (wrongRequestVo.getTitle() == null || wrongRequestVo.getTitle().trim().isEmpty()) {
                        return true;
                    }
                    return Optional.ofNullable(question.getTitle()).orElse("").toLowerCase().contains(wrongRequestVo.getTitle().toLowerCase());
                })
                .filter(question -> {
                    if (wrongRequestVo.getQuestionType() == null) {
                        return true;
                    }
                    return question.getQuestionType().equals(wrongRequestVo.getQuestionType());
                })
                .filter(question -> {
                    if (wrongRequestVo.getExamName() == null || wrongRequestVo.getExamName().trim().isEmpty()) {
                        return true;
                    }
                    return Optional.ofNullable(question.getExamName()).orElse("").toLowerCase().contains(wrongRequestVo.getExamName().toLowerCase());
                })
                .collect(Collectors.toList());
        // 分页
        List<DoQuestionVO> list = doQuestionVOS.stream().skip((wrongRequestVo.getPageIndex() - 1) * wrongRequestVo.getPageSize()).collect(Collectors.toList()).stream().limit(wrongRequestVo.getPageSize()).collect(Collectors.toList());
        wrongResponseVO.setList(list);
        wrongResponseVO.setTotal(doQuestionVOS.size());
        wrongResponseVO.setPageSize(wrongRequestVo.getPageSize());
        wrongResponseVO.setPageIndex(wrongRequestVo.getPageIndex());
        return wrongResponseVO;
    }
}
src/main/resources/mapper/QuestionAnswerRecordMapper.xml
@@ -1,6 +1,51 @@
<?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">
<mapper namespace="com.ycl.jxkg.mapper.QuestionAnswerRecordMapper">
    <resultMap id="BaseResultMap" type="com.ycl.jxkg.domain.entity.QuestionAnswerRecord">
        <id property="id" column="id" />
        <result property="userId" column="user_id" />
        <result property="examId" column="exam_id" />
        <result property="paperId" column="paper_id" />
        <result property="questionId" column="question_id" />
        <result property="doRight" column="do_right" />
        <result property="userAnswer" column="user_answer" />
        <result property="score" column="score" />
        <result property="questionType" column="question_type" />
    </resultMap>
    <resultMap id="WrongResultMap" type="com.ycl.jxkg.domain.vo.student.wrong.WrongResponseVO">
        <result property="paperId" column="paper_id" />
        <result property="title" column="title" />
        <result property="questionType" column="question_type" />
        <result property="difficult" column="difficult" />
        <result property="score" column="score" />
        <result property="examName" column="exam_name" />
    </resultMap>
    <select id="selectWrongQuestion" resultMap="WrongResultMap">
        SELECT
            qar.paper_id,
            q.title,
            q.question_type,
            q.difficult,
            qar.score,
            e.exam_name
        FROM t_question_answer_record qar
            LEFT JOIN t_question q ON q.id = qar.question_id
            LEFT JOIN t_exam e ON e.id = qar.exam_id
        <where>
            qar.user_id = #{wrongRequestVo.userId}
            and do_right = 0
            <if test="wrongRequestVo.title != null and wrongRequestVo.title != ''">
                and q.title like concat('%',#{wrongRequestVo.title},'%')
            </if>
            <if test="wrongRequestVo.questionType != null">
                and q.question_type = #{wrongRequestVo.questionType}
            </if>
            <if test="wrongRequestVo.examName != null and wrongRequestVo.examName != ''">
                and e.exam_name like concat('%',#{wrongRequestVo.examName},'%')
            </if>
        </where>
    </select>
</mapper>