From b661bcf7e065092c876e052bad0bfaecb9dc0c17 Mon Sep 17 00:00:00 2001
From: luohairen <3399054449@qq.com>
Date: 星期二, 12 十一月 2024 21:21:06 +0800
Subject: [PATCH] 优化错题查询

---
 src/main/java/com/ycl/jxkg/service/WrongService.java                    |    3 
 src/main/resources/mapper/QuestionAnswerRecordMapper.xml                |   45 +++++++++++++++
 src/main/java/com/ycl/jxkg/domain/vo/student/wrong/WrongResponseVO.java |   14 +++-
 src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java            |   11 ++-
 src/main/java/com/ycl/jxkg/controller/student/WrongController.java      |    3 
 src/main/java/com/ycl/jxkg/mapper/QuestionAnswerRecordMapper.java       |    8 ++
 src/main/java/com/ycl/jxkg/service/impl/WrongServiceImpl.java           |   70 +++--------------------
 7 files changed, 84 insertions(+), 70 deletions(-)

diff --git a/src/main/java/com/ycl/jxkg/controller/student/WrongController.java b/src/main/java/com/ycl/jxkg/controller/student/WrongController.java
index 3947e50..2ee691d 100644
--- a/src/main/java/com/ycl/jxkg/controller/student/WrongController.java
+++ b/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));
     }
diff --git a/src/main/java/com/ycl/jxkg/domain/vo/student/wrong/WrongResponseVO.java b/src/main/java/com/ycl/jxkg/domain/vo/student/wrong/WrongResponseVO.java
index dfb1017..e145d06 100644
--- a/src/main/java/com/ycl/jxkg/domain/vo/student/wrong/WrongResponseVO.java
+++ b/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;
 }
diff --git a/src/main/java/com/ycl/jxkg/mapper/QuestionAnswerRecordMapper.java b/src/main/java/com/ycl/jxkg/mapper/QuestionAnswerRecordMapper.java
index 4597b1c..9d7c3c0 100644
--- a/src/main/java/com/ycl/jxkg/mapper/QuestionAnswerRecordMapper.java
+++ b/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锛歺p
@@ -10,6 +16,6 @@
 @Mapper
 public interface QuestionAnswerRecordMapper extends BaseMapper<QuestionAnswerRecord> {
 
-
+    List<WrongResponseVO> selectWrongQuestion(@Param("wrongRequestVo") WrongRequestVo wrongRequestVo);
 
 }
diff --git a/src/main/java/com/ycl/jxkg/service/WrongService.java b/src/main/java/com/ycl/jxkg/service/WrongService.java
index 066bff0..c153c10 100644
--- a/src/main/java/com/ycl/jxkg/service/WrongService.java
+++ b/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);
 
 }
diff --git a/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java b/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java
index 1a77e99..fe69d1a 100644
--- a/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java
+++ b/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("銆�")));
diff --git a/src/main/java/com/ycl/jxkg/service/impl/WrongServiceImpl.java b/src/main/java/com/ycl/jxkg/service/impl/WrongServiceImpl.java
index 70aa8fe..03736e3 100644
--- a/src/main/java/com/ycl/jxkg/service/impl/WrongServiceImpl.java
+++ b/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{
-                // 瑙f瀽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;
     }
 }
diff --git a/src/main/resources/mapper/QuestionAnswerRecordMapper.xml b/src/main/resources/mapper/QuestionAnswerRecordMapper.xml
index 048ba38..578eba4 100644
--- a/src/main/resources/mapper/QuestionAnswerRecordMapper.xml
+++ b/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>

--
Gitblit v1.8.0