From 9a1c378ec5566a727efcb85120cdafd52c3ee9f1 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期四, 23 五月 2024 16:21:37 +0800
Subject: [PATCH] 在线练习增加练习模式、融合在线练题

---
 src/main/java/com/mindskip/xzs/domain/enums/PracticeModeENum.java             |   23 +++++
 src/main/java/com/mindskip/xzs/domain/vo/SelfPracticeVO.java                  |    3 
 src/main/java/com/mindskip/xzs/controller/student/SelfPracticeController.java |   11 ++
 src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java          |    9 +
 src/main/java/com/mindskip/xzs/domain/SelfPractice.java                       |    3 
 src/main/java/com/mindskip/xzs/service/impl/SelfPracticeServiceImpl.java      |   60 +++++++++++++-
 src/main/resources/mapper/SelfPracticeMapper.xml                              |   10 +-
 src/main/java/com/mindskip/xzs/domain/vo/SubjectQuestionVO.java               |    4 +
 src/main/resources/mapper/QuestionSubjectMapper.xml                           |   36 ++++++++
 src/main/java/com/mindskip/xzs/service/SelfPracticeService.java               |    8 ++
 src/main/java/com/mindskip/xzs/repository/QuestionSubjectMapper.java          |    6 +
 src/main/resources/mapper/DeptQuestionMapper.xml                              |   15 ++-
 12 files changed, 167 insertions(+), 21 deletions(-)

diff --git a/src/main/java/com/mindskip/xzs/controller/student/SelfPracticeController.java b/src/main/java/com/mindskip/xzs/controller/student/SelfPracticeController.java
index 270edaa..6b48e87 100644
--- a/src/main/java/com/mindskip/xzs/controller/student/SelfPracticeController.java
+++ b/src/main/java/com/mindskip/xzs/controller/student/SelfPracticeController.java
@@ -48,6 +48,17 @@
     }
 
     /**
+     * 寮�濮嬬湅棰�
+     *
+     * @param id 缁冧範id
+     * @return
+     */
+    @PostMapping("/start/look/{id}")
+    public RestResponse startLook(@PathVariable("id") Integer id) {
+        return selfPracticeService.startLook(id);
+    }
+
+    /**
      * 闅忔満涓�閬撻
      *
      * @param id
diff --git a/src/main/java/com/mindskip/xzs/domain/SelfPractice.java b/src/main/java/com/mindskip/xzs/domain/SelfPractice.java
index 8c991f8..dc81f7d 100644
--- a/src/main/java/com/mindskip/xzs/domain/SelfPractice.java
+++ b/src/main/java/com/mindskip/xzs/domain/SelfPractice.java
@@ -18,6 +18,9 @@
     /** 鐢ㄦ埛ID */
     private Integer userId;
 
+    /** 缁冧範妯″紡锛氬埛棰樸�佺湅棰� */
+    private String practiceMode;
+
     /** 澶囨敞 */
     private String remark;
 
diff --git a/src/main/java/com/mindskip/xzs/domain/enums/PracticeModeENum.java b/src/main/java/com/mindskip/xzs/domain/enums/PracticeModeENum.java
new file mode 100644
index 0000000..a9b4962
--- /dev/null
+++ b/src/main/java/com/mindskip/xzs/domain/enums/PracticeModeENum.java
@@ -0,0 +1,23 @@
+package com.mindskip.xzs.domain.enums;
+
+import lombok.Getter;
+
+/**
+ * @author锛歺p
+ * @date锛�2024/5/23 11:24
+ */
+@Getter
+public enum PracticeModeENum {
+
+    BRUSH("brush", "鍒烽"),
+    LOOK("look", "鐪嬮"),
+    ;
+
+    private final String value;
+    private final String desc;
+
+    PracticeModeENum(String value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+}
diff --git a/src/main/java/com/mindskip/xzs/domain/vo/SelfPracticeVO.java b/src/main/java/com/mindskip/xzs/domain/vo/SelfPracticeVO.java
index 79ca623..05ad0b1 100644
--- a/src/main/java/com/mindskip/xzs/domain/vo/SelfPracticeVO.java
+++ b/src/main/java/com/mindskip/xzs/domain/vo/SelfPracticeVO.java
@@ -23,6 +23,9 @@
     /** 鐢ㄦ埛ID */
     private Integer userId;
 
+    /** 缁冧範妯″紡锛氬埛棰樸�佺湅棰� */
+    private String practiceMode;
+
     /** 澶囨敞 */
     @NotBlank(message = "璇峰~鍐欐澶勬ā鎷熺殑鍚嶇О")
     private String remark;
diff --git a/src/main/java/com/mindskip/xzs/domain/vo/SubjectQuestionVO.java b/src/main/java/com/mindskip/xzs/domain/vo/SubjectQuestionVO.java
index 00dc870..0674ebe 100644
--- a/src/main/java/com/mindskip/xzs/domain/vo/SubjectQuestionVO.java
+++ b/src/main/java/com/mindskip/xzs/domain/vo/SubjectQuestionVO.java
@@ -16,6 +16,10 @@
 
     private String subjectName;
 
+    /** 鍒烽妯″紡涓嬬殑棰樺垪琛� */
     private List<PracticeQuestionCondition.QuestionFinishCondition> questionConditions;
 
+    /** 鐪嬮妯″紡涓嬬殑棰樺垪琛� */
+    private List<QuestionVO> lookQuestionList;
+
 }
diff --git a/src/main/java/com/mindskip/xzs/repository/QuestionSubjectMapper.java b/src/main/java/com/mindskip/xzs/repository/QuestionSubjectMapper.java
index c77a9c6..e7bde69 100644
--- a/src/main/java/com/mindskip/xzs/repository/QuestionSubjectMapper.java
+++ b/src/main/java/com/mindskip/xzs/repository/QuestionSubjectMapper.java
@@ -45,4 +45,10 @@
 
     /** 鏍规嵁璇剧洰鍜岄鍨嬫煡璇㈤鐩甀D */
     List<Integer> questionsBySubjectIdAndQuestionType(@Param("subjectId") Integer subjectId, @Param("questionType") Integer questionType);
+
+    /** 鏍规嵁璇剧洰ID鏌ヨ棰樼洰璇︽儏 */
+    List<QuestionVO> bySubjectId(@Param("subjectId") Integer subjectId);
+
+    /** 鏍规嵁璇剧洰鍜岄鍨嬫煡鎵鹃鐩暟鎹� */
+    List<QuestionVO> bySubjectIdAndQuestionType(Integer subjectId, Integer dataBaseValueByValue);
 }
diff --git a/src/main/java/com/mindskip/xzs/service/SelfPracticeService.java b/src/main/java/com/mindskip/xzs/service/SelfPracticeService.java
index f666a66..d356736 100644
--- a/src/main/java/com/mindskip/xzs/service/SelfPracticeService.java
+++ b/src/main/java/com/mindskip/xzs/service/SelfPracticeService.java
@@ -54,4 +54,12 @@
      * @return
      */
     RestResponse randomOneQuestion(Integer id);
+
+    /**
+     * 寮�濮嬬湅棰�
+     *
+     * @param id
+     * @return
+     */
+    RestResponse startLook(Integer id);
 }
diff --git a/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java b/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java
index 3c152c9..f6925e4 100644
--- a/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java
+++ b/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java
@@ -39,6 +39,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import java.util.Arrays;
@@ -108,7 +109,9 @@
             deptQuestion.setDeptId(deptId);
             return deptQuestion;
         }).collect(Collectors.toList());
-        deptQuestionMapper.add(deptQuestions);
+        if (! CollectionUtils.isEmpty(model.getDeptIds())) {
+            deptQuestionMapper.add(deptQuestions);
+        }
 
         //鎵归噺娣诲姞
         List<QuestionSubject> list = Arrays.asList(model.getSubjectIds()).stream().map(e -> {
@@ -143,7 +146,9 @@
             deptQuestion.setDeptId(deptId);
             return deptQuestion;
         }).collect(Collectors.toList());
-        deptQuestionMapper.add(deptQuestions);
+        if (! CollectionUtils.isEmpty(model.getDeptIds())) {
+            deptQuestionMapper.add(deptQuestions);
+        }
 
         //棰樺共銆佽В鏋愩�侀�夐」绛� 鏇存柊
         TextContent infoTextContent = textContentService.selectById(question.getInfoTextContentId());
diff --git a/src/main/java/com/mindskip/xzs/service/impl/SelfPracticeServiceImpl.java b/src/main/java/com/mindskip/xzs/service/impl/SelfPracticeServiceImpl.java
index d137530..6040be6 100644
--- a/src/main/java/com/mindskip/xzs/service/impl/SelfPracticeServiceImpl.java
+++ b/src/main/java/com/mindskip/xzs/service/impl/SelfPracticeServiceImpl.java
@@ -10,6 +10,7 @@
 import com.mindskip.xzs.domain.PracticeQuestionCondition;
 import com.mindskip.xzs.domain.Question;
 import com.mindskip.xzs.domain.SelfPractice;
+import com.mindskip.xzs.domain.enums.PracticeModeENum;
 import com.mindskip.xzs.domain.enums.PracticeQuestionTypeEnum;
 import com.mindskip.xzs.domain.enums.PracticeTypeEnum;
 import com.mindskip.xzs.domain.enums.QuestionTypeEnum;
@@ -147,7 +148,7 @@
                 throw new RuntimeException("娌℃湁鎵惧埌棰樼洰锛屽彲鑳芥墍閫夎鐩寘鍚鐩笉瓒�");
             }
             QuestionVO questionVO = one.get(0);
-            jsonQuestion(questionVO);
+            jsonQuestion(questionVO, Boolean.TRUE);
             return RestResponse.ok(questionVO);
         }
         return RestResponse.ok();
@@ -165,9 +166,52 @@
             throw new RuntimeException("娌℃湁鎵惧埌棰樼洰锛屽彲鑳芥墍閫夎鐩寘鍚鐩笉瓒�");
         }
         QuestionVO questionVO = one.get(0);
-        jsonQuestion(questionVO);
+        jsonQuestion(questionVO, Boolean.TRUE);
 
         return RestResponse.ok(questionVO);
+    }
+
+    @Override
+    public RestResponse startLook(Integer id) {
+        SelfPractice en = selfPracticeMapper.selectById(id);
+        if (Objects.isNull(en)) {
+            throw new RuntimeException("缁冧範涓嶅瓨鍦�");
+        }
+        List<Integer> subjectIds = JSON.parseArray(en.getSubjects(), Integer.class);
+        if (PracticeTypeEnum.ORDERED.getValue().equals(en.getPracticeType())) {
+            List<SubjectQuestionVO> list = new ArrayList<>(2);
+            // 椤哄簭鍋氶锛屾妸閫夋嫨鐨勯搴撶殑棰�(id)鍏ㄩ儴鏌ュ嚭鏉ワ紝鍓嶇鏈変釜搴忓彿闈㈡澘锛岀偣鍑诲摢閬撻鍋氬摢閬�
+            for (Integer subjectId : subjectIds) {
+                // 鏌ヨ鐩悕瀛�
+                String subjectName = subjectMapper.selectSubjectNameById(subjectId);
+                List<QuestionVO> questionVOs = new ArrayList<>();
+                if (PracticeQuestionTypeEnum.ALL.getValue().equals(en.getQuestionType())) {
+                    questionVOs = questionSubjectMapper.bySubjectId(subjectId);
+                } else {
+                    questionVOs = questionSubjectMapper.bySubjectIdAndQuestionType(subjectId, PracticeQuestionTypeEnum.getDataBaseValueByValue(en.getQuestionType()));
+                }
+                questionVOs.stream().forEach(question -> {
+                    question.setContent(JSON.parseObject(question.getContentJson(), QuestionContentVO.class));
+                });
+                // 杩斿洖鍝嶅簲鏁版嵁
+                SubjectQuestionVO subjectQuestionVO = new SubjectQuestionVO();
+                subjectQuestionVO.setSubjectId(subjectId);
+                subjectQuestionVO.setSubjectName(subjectName);
+                subjectQuestionVO.setLookQuestionList(questionVOs);
+                list.add(subjectQuestionVO);
+            }
+            return RestResponse.ok(list);
+        } else if (PracticeTypeEnum.RANDOM.getValue().equals(en.getPracticeType())) {
+            // 闅忔満缁冧範锛屾槸涓�閬撻涓�閬撻缁冧範
+            List<QuestionVO> one = questionSubjectMapper.getRandomQuestionId(subjectIds, PracticeQuestionTypeEnum.getDataBaseValueByValue(en.getQuestionType()), 1);
+            if (one.size() < 1) {
+                throw new RuntimeException("娌℃湁鎵惧埌棰樼洰锛屽彲鑳芥墍閫夎鐩寘鍚鐩笉瓒�");
+            }
+            QuestionVO questionVO = one.get(0);
+            jsonQuestion(questionVO, Boolean.FALSE);
+            return RestResponse.ok(questionVO);
+        }
+        return RestResponse.ok();
     }
 
     /**
@@ -175,7 +219,7 @@
      *
      * @param questionVO
      */
-    public void jsonQuestion(QuestionVO questionVO) {
+    public void jsonQuestion(QuestionVO questionVO, Boolean clearAnswer) {
         if (StringUtils.hasText(questionVO.getContentJson())) {
             QuestionContentVO questionContent = JSON.parseObject(questionVO.getContentJson(), QuestionContentVO.class);
             questionVO.setContent(questionContent);
@@ -186,9 +230,11 @@
                 questionVO.setAnswerNum(questionVO.getCorrect().split(",").length);
             }
         }
-        questionVO.setContentJson("");
-        questionVO.setCorrect("");
-        questionVO.getContent().setCorrect("");
-        questionVO.getContent().setAnalyze("");
+        if (clearAnswer) {
+            questionVO.setContentJson("");
+            questionVO.setCorrect("");
+            questionVO.getContent().setCorrect("");
+            questionVO.getContent().setAnalyze("");
+        }
     }
 }
diff --git a/src/main/resources/mapper/DeptQuestionMapper.xml b/src/main/resources/mapper/DeptQuestionMapper.xml
index 7edda4a..9ad9983 100644
--- a/src/main/resources/mapper/DeptQuestionMapper.xml
+++ b/src/main/resources/mapper/DeptQuestionMapper.xml
@@ -16,14 +16,19 @@
         DELETE
         FROM t_dept_question
         WHERE question_id = #{questionId}
-        AND dept_id IN
-        <foreach collection="deptIds" open="(" separator="," close=")" item="deptId">
-            #{deptId}
-        </foreach>
+        <if test="deptIds != null and deptIds.size > 0">
+            AND dept_id IN
+            <foreach collection="deptIds" open="(" separator="," close=")" item="deptId">
+                #{deptId}
+            </foreach>
+        </if>
     </delete>
 
     <select id="deptByQuestionId" resultType="com.mindskip.xzs.domain.vo.DeptQuestionVO">
-        SELECT tdq.dept_id, td.name as deptName FROM t_dept_question tdq INNER JOIN t_department td ON td.id = tdq.dept_id WHERE tdq.question_id = #{questionId}
+        SELECT tdq.dept_id, td.name as deptName
+        FROM t_dept_question tdq
+                 INNER JOIN t_department td ON td.id = tdq.dept_id
+        WHERE tdq.question_id = #{questionId}
     </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/QuestionSubjectMapper.xml b/src/main/resources/mapper/QuestionSubjectMapper.xml
index 69f5979..c5aa74d 100644
--- a/src/main/resources/mapper/QuestionSubjectMapper.xml
+++ b/src/main/resources/mapper/QuestionSubjectMapper.xml
@@ -98,24 +98,54 @@
             id DESC
     </select>
 
-    <select id="questionsBySubjectId"  resultType="integer">
+    <select id="questionsBySubjectId" resultType="integer">
         SELECT
-            tqs.question_id
+            tqs.question_id, ttc.content
         FROM
             t_question_subject tqs
                 INNER JOIN t_question tq ON tqs.question_id = tq.id AND tqs.subject_id = #{subjectId}
+                INNER JOIN t_text_content ttc tct.id = tq.info_text_content_id
         ORDER BY
             tqs.id DESC
     </select>
 
     <select id="questionsBySubjectIdAndQuestionType" resultType="integer">
         SELECT
-            tqs.question_id
+            tqs.question_id, ttc.content
         FROM
             t_question_subject tqs
                 INNER JOIN t_question tq ON tqs.question_id = tq.id AND tqs.subject_id = #{subjectId} AND tq.question_type = #{questionType}
+                INNER JOIN t_text_content ttc ttc.id = tq.info_text_content_id
         ORDER BY
             tqs.id DESC
     </select>
 
+    <select id="bySubjectId" resultType="com.mindskip.xzs.domain.vo.QuestionVO">
+        SELECT
+           tq.id,
+           tq.question_type,
+           tq.correct,
+           ttc.content as contentJson
+        FROM
+            t_question_subject tqs
+                INNER JOIN t_question tq ON tqs.question_id = tq.id AND tqs.subject_id = #{subjectId}
+                INNER JOIN t_text_content ttc ON ttc.id = tq.info_text_content_id
+        ORDER BY
+            tq.id DESC
+    </select>
+
+    <select id="bySubjectIdAndQuestionType" resultType="com.mindskip.xzs.domain.vo.QuestionVO">
+        SELECT
+            tq.id,
+            tq.question_type,
+            tq.correct,
+            ttc.content as contentJson
+        FROM
+            t_question_subject tqs
+                INNER JOIN t_question tq ON tqs.question_id = tq.id AND tqs.subject_id = #{subjectId} AND tq.question_type = #{questionType}
+                INNER JOIN t_text_content ttc ON tct.id = tq.info_text_content_id
+        ORDER BY
+            tq.id DESC
+    </select>
+
 </mapper>
diff --git a/src/main/resources/mapper/SelfPracticeMapper.xml b/src/main/resources/mapper/SelfPracticeMapper.xml
index 1b02250..c9c0785 100644
--- a/src/main/resources/mapper/SelfPracticeMapper.xml
+++ b/src/main/resources/mapper/SelfPracticeMapper.xml
@@ -5,9 +5,9 @@
 
     <insert id="add" keyColumn="id" useGeneratedKeys="true" parameterType="com.mindskip.xzs.domain.SelfPractice">
         INSERT INTO
-            t_self_practice(user_id, remark, subjects, practice_type, create_time, update_time, question_type, deleted)
+            t_self_practice(user_id, remark, subjects, practice_type, create_time, update_time, question_type, deleted, practice_mode)
         VALUE
-            (#{userId}, #{remark}, #{subjects}, #{practiceType}, #{createTime}, #{updateTime}, #{questionType}, #{deleted})
+            (#{userId}, #{remark}, #{subjects}, #{practiceType}, #{createTime}, #{updateTime}, #{questionType}, #{deleted}, #{practiceMode})
     </insert>
 
     <select id="page" resultType="com.mindskip.xzs.domain.vo.SelfPracticeVO">
@@ -19,7 +19,8 @@
                practice_type as practiceType,
                create_time createTime,
                update_time as updateTime,
-               question_type as questionType
+               question_type as questionType,
+               practice_mode as practiceMode
         FROM
              t_self_practice
         <where>
@@ -47,7 +48,8 @@
             practice_type as practiceType,
             create_time createTime,
             update_time as updateTime,
-            question_type as questionType
+            question_type as questionType,
+            practice_mode as practiceMode
         FROM
              t_self_practice
         WHERE

--
Gitblit v1.8.0