From 0e56f62624254f2c950628cd5b8ad230ed7c2adf Mon Sep 17 00:00:00 2001
From: Mlxa0324 <mlx950324@163.com>
Date: Sun, 26 Feb 2023 20:27:54 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E7=AB=A0=E8=8A=82?=
 =?UTF-8?q?=E7=BB=83=E4=B9=A0=E5=92=8C=E8=AF=95=E9=A2=98=E7=AE=A1=E7=90=86?=
 =?UTF-8?q?=E5=90=8C=E6=AD=A5=E9=97=AE=E9=A2=98=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../jlw/dao/ResourcesQuestionSnapshotDao.java | 11 +++
 ...erOpenCourseMergeResourcesQuestionDao.java | 12 +++
 .../ResourcesQuestionSnapshotService.java     | 49 +++++++++++-
 ...enCourseMergeResourcesQuestionService.java |  4 +
 ...acherOpenCourseQuestionSettingService.java |  6 +-
 .../sql/jlw/resourcesQuestionSnapshot.md      |  7 ++
 ...teacherOpenCourseMergeResourcesQuestion.md | 76 +++++++++++++++++++
 7 files changed, 160 insertions(+), 5 deletions(-)

diff --git a/web/src/main/java/com/ibeetl/jlw/dao/ResourcesQuestionSnapshotDao.java b/web/src/main/java/com/ibeetl/jlw/dao/ResourcesQuestionSnapshotDao.java
index 774eee03..0135492e 100644
--- a/web/src/main/java/com/ibeetl/jlw/dao/ResourcesQuestionSnapshotDao.java
+++ b/web/src/main/java/com/ibeetl/jlw/dao/ResourcesQuestionSnapshotDao.java
@@ -3,6 +3,7 @@ package com.ibeetl.jlw.dao;
 import com.ibeetl.jlw.entity.ResourcesQuestionSnapshot;
 import com.ibeetl.jlw.entity.vo.TeacherOpenCourseQuestionTestDetailVO;
 import com.ibeetl.jlw.entity.vo.TeacherOpenCourseQuestionTestSimpleInfoVO;
+import com.ibeetl.jlw.enums.GlobalUpStatusEnum;
 import com.ibeetl.jlw.web.query.ResourcesQuestionSnapshotQuery;
 import org.beetl.sql.core.engine.PageQuery;
 import org.beetl.sql.mapper.BaseMapper;
@@ -67,4 +68,14 @@ public interface ResourcesQuestionSnapshotDao extends BaseMapper<ResourcesQuesti
                 .count();
         return toIntExact(count);
     }
+
+    /**
+     * 通过对应的开课题目库ID,批量修改题目快照状态
+     *
+     * @param ids               题目快照IDs
+     * @param questionStatus    题目状态
+     * @return
+     */
+    @Update
+    int updateQuestionStatusByTeacherOpenCourseMergeResourcesQuestionIds(String ids, GlobalUpStatusEnum questionStatus);
 }
diff --git a/web/src/main/java/com/ibeetl/jlw/dao/TeacherOpenCourseMergeResourcesQuestionDao.java b/web/src/main/java/com/ibeetl/jlw/dao/TeacherOpenCourseMergeResourcesQuestionDao.java
index 1690f8c8..d0f0960e 100644
--- a/web/src/main/java/com/ibeetl/jlw/dao/TeacherOpenCourseMergeResourcesQuestionDao.java
+++ b/web/src/main/java/com/ibeetl/jlw/dao/TeacherOpenCourseMergeResourcesQuestionDao.java
@@ -6,6 +6,7 @@ import com.ibeetl.jlw.entity.vo.QuestionTypeCountVO;
 import com.ibeetl.jlw.web.query.TeacherOpenCourseMergeResourcesQuestionQuery;
 import org.beetl.sql.core.engine.PageQuery;
 import org.beetl.sql.mapper.BaseMapper;
+import org.beetl.sql.mapper.annotation.Param;
 import org.beetl.sql.mapper.annotation.SqlResource;
 import org.beetl.sql.mapper.annotation.Update;
 import org.springframework.stereotype.Component;
@@ -40,6 +41,17 @@ public interface TeacherOpenCourseMergeResourcesQuestionDao extends BaseMapper<T
      * @return
      */
     List<TeacherOpenCourseMergeResourcesQuestion> getRandomMergeResourcesQuestionList(QuestionSettingDTO questionSettingDTO);
+    /**
+     * 根据题型和数量,随机取离线题库。通过开课的题目快照表和题目配置表
+     * 这里用章节练习的原因是:开课中的题库,是实时同步到章节练习中的,删除或者上下架,也都会同步的。
+     * @param questionSettingDTO
+     * @param teacherOpenCourseId   开课ID
+     * @param questionSettingId     题目配置ID
+     * @return
+     */
+    List<TeacherOpenCourseMergeResourcesQuestion> getRandomMergeResourcesQuestionListByChapterTestQuestion(QuestionSettingDTO questionSettingDTO,
+                                                                                                           @Param("teacherOpenCourseId") Long teacherOpenCourseId,
+                                                                                                           @Param("questionSettingId") Long questionSettingId);
 
     /**
      * 根据开课ID获取下面的题目类型和类型下的总题数
diff --git a/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionSnapshotService.java b/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionSnapshotService.java
index 6e952a2a..2dfbf9aa 100644
--- a/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionSnapshotService.java
+++ b/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionSnapshotService.java
@@ -18,6 +18,7 @@ import com.ibeetl.jlw.entity.dto.QuestionSettingDTO;
 import com.ibeetl.jlw.entity.dto.TeacherOpenCourseQuestionTestSimpleInfoDTO;
 import com.ibeetl.jlw.entity.vo.TeacherOpenCourseQuestionTestDetailVO;
 import com.ibeetl.jlw.entity.vo.TeacherOpenCourseQuestionTestSimpleInfoVO;
+import com.ibeetl.jlw.enums.GlobalUpStatusEnum;
 import com.ibeetl.jlw.enums.QuestionLogAddTypeEnum;
 import com.ibeetl.jlw.web.query.ResourcesQuestionSnapshotQuery;
 import com.ibeetl.jlw.web.query.TeacherOpenCourseQuestionSettingQuery;
@@ -45,6 +46,7 @@ import java.util.stream.Collectors;
 import static cn.hutool.core.util.ArrayUtil.join;
 import static cn.hutool.core.util.ObjectUtil.defaultIfNull;
 import static cn.jlw.util.CacheUserUtil.getStudent;
+import static com.ibeetl.admin.core.util.StreamUtils.listJoin;
 import static com.ibeetl.jlw.enums.QuestionLogAddTypeEnum.FINALLY_SUBMIT;
 
 /**
@@ -95,6 +97,23 @@ public class ResourcesQuestionSnapshotService extends CoreBaseService<ResourcesQ
         }
     }
 
+    /**
+     * 功能描述: <br>
+     * 通过对应的开课题目库ID,批量修改题目快照状态
+     *
+     * @param ids
+     * @param upStatusEnum
+     * @Author: 87966
+     * @Date: 2023/2/26 20:09
+     */
+    public void updateQuestionStatusByTeacherOpenCourseMergeResourcesQuestionIds(String ids, GlobalUpStatusEnum upStatusEnum){
+        try {
+            resourcesQuestionSnapshotDao.updateQuestionStatusByTeacherOpenCourseMergeResourcesQuestionIds(ids, upStatusEnum);
+        } catch (Exception e) {
+            throw new PlatformException("批量修改题目快照的题目状态失败", e);
+        }
+    }
+
     /**
      * 批量删除(通过题目配置ID)
      * @param settingIds
@@ -390,12 +409,12 @@ public class ResourcesQuestionSnapshotService extends CoreBaseService<ResourcesQ
      * 根据题目类型配置。从开课题库
      * 获取题目快照列表。并配置题目配置ID
      *
-     * @param teacherOpenCourseQuestionSettingId
+     * @param questionSettingId
      * @param questionSettingOptions
      * @return
      */
     public List<ResourcesQuestionSnapshot> getOpenResourcesQuestionSnapListBySettingOptions (
-            @NotNull(message = "开课题目配置ID不能为空!")  final Long teacherOpenCourseQuestionSettingId,
+            @NotNull(message = "开课题目配置ID不能为空!")  final Long questionSettingId,
             @NotBlank(message = "题目设置不能为空!") Collection<QuestionSettingDTO> questionSettingOptions, Map<Long, Long> courseInfoIdPair) {
 
         List<ResourcesQuestionSnapshot> result = new ArrayList<>();
@@ -403,12 +422,13 @@ public class ResourcesQuestionSnapshotService extends CoreBaseService<ResourcesQ
         for (QuestionSettingDTO questionSettingOption : questionSettingOptions) {
             // 根据配置随机出题。这里直接设置题目的分值。
             List<TeacherOpenCourseMergeResourcesQuestion> randomMergeResourcesQuestionList =
-                    teacherOpenCourseMergeResourcesQuestionDao.getRandomMergeResourcesQuestionList(questionSettingOption);
+                    teacherOpenCourseMergeResourcesQuestionDao
+                            .getRandomMergeResourcesQuestionListByChapterTestQuestion(questionSettingOption, null, questionSettingId);
 
             setRQNewCourseInfoId(randomMergeResourcesQuestionList, courseInfoIdPair);
 
             // 放入最终的集合中
-            result.addAll(getResourcesQuestionSnapshotList(randomMergeResourcesQuestionList, teacherOpenCourseQuestionSettingId, e -> {}));
+            result.addAll(getResourcesQuestionSnapshotList(randomMergeResourcesQuestionList, questionSettingId, e -> {}));
         }
         return result;
     }
@@ -559,4 +579,25 @@ public class ResourcesQuestionSnapshotService extends CoreBaseService<ResourcesQ
     public void deleteTeacherOpenCourseAllRelatedByTeacherOpenCourseId(@NotNull(message = "开课ID不能为空!") Long teacherOpenCourseId) {
         log.info("需要实现删除操作!");
     }
+
+    /**
+     * 通过题目ID,更改题目快照的状态
+     *
+     * @param openCourseMergeResourcesQuestionIds    开课题目IDs
+     * @param upStatusEnum                           上下架状态
+     */
+    public void updateStatusByTeacherOpenCourseMergeResourcesQuestionId(@NotEmpty(message = "开课的题目IDs不能为空!") String openCourseMergeResourcesQuestionIds,
+                                                                        @NotNull(message = "要更改的状态不能为空!") GlobalUpStatusEnum upStatusEnum) {
+        for (String mergeResourceQuestionId : openCourseMergeResourcesQuestionIds.split(",")) {
+
+
+        }
+
+        ResourcesQuestionSnapshotQuery query = new ResourcesQuestionSnapshotQuery();
+        query.setTeacherOpenCourseMergeResourcesQuestionIdPlural(openCourseMergeResourcesQuestionIds);
+        List<ResourcesQuestionSnapshot> questionSnapshotList = getValuesByQueryNotWithPermission(query);
+
+        String snapshotIds = listJoin(questionSnapshotList, ResourcesQuestionSnapshot::getResourcesQuestionSnapshotId);
+        deleteResourcesQuestionSnapshot(snapshotIds);
+    }
 }
diff --git a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseMergeResourcesQuestionService.java b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseMergeResourcesQuestionService.java
index 2f3a8a77..7a465dc7 100644
--- a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseMergeResourcesQuestionService.java
+++ b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseMergeResourcesQuestionService.java
@@ -21,6 +21,7 @@ import com.ibeetl.jlw.dao.TeacherOpenCourseMergeResourcesQuestionDao;
 import com.ibeetl.jlw.entity.*;
 import com.ibeetl.jlw.entity.dto.QuestionSettingDTO;
 import com.ibeetl.jlw.entity.vo.QuestionTypeCountVO;
+import com.ibeetl.jlw.enums.GlobalUpStatusEnum;
 import com.ibeetl.jlw.enums.ResourcesQuestionTypeEnum;
 import com.ibeetl.jlw.web.query.ResourcesQuestionQuery;
 import com.ibeetl.jlw.web.query.TeacherOpenCourseMergeResourcesQuestionQuery;
@@ -118,6 +119,9 @@ public class TeacherOpenCourseMergeResourcesQuestionService extends CoreBaseServ
             query.setQuestionStatus(questionStatus);
             query.set_given("questionStatus");
             teacherOpenCourseMergeResourcesQuestionDao.updateGivenByIds(query);
+            // 修改题目快照表的状态
+            resourcesQuestionSnapshotService.updateQuestionStatusByTeacherOpenCourseMergeResourcesQuestionIds(
+                    ids, EnumUtil.likeValueOf(GlobalUpStatusEnum.class, questionStatus));
         } catch (Exception e) {
             throw new PlatformException("批量上下架开课题目失败", e);
         }
diff --git a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionSettingService.java b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionSettingService.java
index c306a107..5719ded7 100644
--- a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionSettingService.java
+++ b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionSettingService.java
@@ -396,6 +396,7 @@ public class TeacherOpenCourseQuestionSettingService extends CoreBaseService<Tea
         // 题目类型区分
         Collection<QuestionSettingDTO> settingDTOList = null;
 
+        // 指定题目IDs的时候,指定题目。但是不传题目的类型,后台这里需要处理题目分类
         if(ObjectUtil.isNotEmpty(resourcesQuestionIdPlural)) {
             TeacherOpenCourseMergeResourcesQuestionQuery questionQuery = new TeacherOpenCourseMergeResourcesQuestionQuery();
             questionQuery.setQuestionStatus(1);
@@ -416,7 +417,10 @@ public class TeacherOpenCourseQuestionSettingService extends CoreBaseService<Tea
             });
 
             if (ObjectUtil.isNotEmpty(map)) { settingDTOList = map.values(); }
-        } else {
+        }
+
+        // 随机抽取题目的方式
+        else {
             settingDTOList = settingQuery.getQuestionSettingOptions();
         }
 
diff --git a/web/src/main/resources/sql/jlw/resourcesQuestionSnapshot.md b/web/src/main/resources/sql/jlw/resourcesQuestionSnapshot.md
index 3041ba31..def6bd0c 100644
--- a/web/src/main/resources/sql/jlw/resourcesQuestionSnapshot.md
+++ b/web/src/main/resources/sql/jlw/resourcesQuestionSnapshot.md
@@ -185,6 +185,13 @@ deleteResourcesQuestionSnapshotByIds
   delete from resources_question_snapshot where find_in_set(resources_question_snapshot_id,#ids#)
 
 
+updateQuestionStatusByTeacherOpenCourseMergeResourcesQuestionIds
+===
+* 通过对应的开课题目库ID,批量修改题目快照状态
+
+  update resources_question_snapshot set question_status = #questionStatus# where find_in_set(teacher_open_course_merge_resources_question_id,#ids#)
+
+
 deleteBySettingIds
 ===
 
diff --git a/web/src/main/resources/sql/jlw/teacherOpenCourseMergeResourcesQuestion.md b/web/src/main/resources/sql/jlw/teacherOpenCourseMergeResourcesQuestion.md
index 5352d55a..9be8e360 100644
--- a/web/src/main/resources/sql/jlw/teacherOpenCourseMergeResourcesQuestion.md
+++ b/web/src/main/resources/sql/jlw/teacherOpenCourseMergeResourcesQuestion.md
@@ -739,6 +739,82 @@ getRandomMergeResourcesQuestionList
     @}
   @}
 
+getRandomMergeResourcesQuestionListByChapterTestQuestion
+===
+* 根据题目设置随机出题, 通过题目快照表获取题目
+* 这里用章节练习的原因是:开课中的题库,是实时同步到章节练习中的,删除或者上下架,也都会同步的。
+
+  select
+  @if(!isEmpty(singleScore)){
+  t.teacher_open_course_id,
+  t.question_type,
+  t.question_stem,
+  t.question_option_a,
+  t.question_option_b,
+  t.question_option_c,
+  t.question_option_d,
+  t.question_option_e,
+  t.question_answer,
+  #singleScore# as question_score,
+  t.question_analysis,
+  t.question_status,
+  t.user_id,
+  t.org_id
+  @} else {
+  t.*
+  @}
+  from (
+      SELECT DISTINCT
+      b.teacher_open_course_id,
+      b.teacher_open_course_question_setting_type,
+      a.question_type,
+      a.question_stem,
+      a.question_option_a,
+      a.question_option_b,
+      a.question_option_c,
+      a.question_option_d,
+      a.question_option_e,
+      a.question_answer,
+      a.question_score,
+      a.question_analysis,
+      a.question_status,
+      b.user_id,
+      b.org_id
+      FROM
+      resources_question_snapshot a,
+      teacher_open_course_question_setting b
+      WHERE
+      1
+      AND a.teacher_open_course_question_setting_id = a.teacher_open_course_question_setting_id
+      AND question_status = 1
+      @if(!isEmpty(teacherOpenCourseId)){
+      AND b.teacher_open_course_id = #teacherOpenCourseId#
+      @}
+      @if(!isEmpty(questionSettingId)){
+      AND b.teacher_open_course_question_setting_id = #questionSettingId#
+      @}
+      @// 如果都为空,则不返回数据,比较保守些
+      @if(isEmpty(questionSettingId) && isEmpty(teacherOpenCourseId)){
+      AND false
+      @}
+      @// 这里用章节练习的原因是:开课中的题库,是实时同步到章节练习中的,删除或者上下架,也都会同步的。
+      AND b.teacher_open_course_question_setting_type = 'CHAPTER_EXERCISE'
+  ) t
+  where 1=1
+  and t.question_status = 1
+  @// 题目ID优先级高
+  @if(!isEmpty(resourcesQuestionIdPlural)) {
+  and find_in_set(t.teacher_open_course_merge_resources_question_id, #resourcesQuestionIdPlural#)
+  @} else {
+  @// 随机抽题,根据题目配置动态抽取题目。会存在题库抽不够数的情况。
+  @if(!isEmpty(questionType)){
+  and find_in_set(t.question_type, #questionType#)
+  @}
+  @if(!isEmpty(selectCount)){
+  ORDER BY RAND()
+  limit #selectCount#
+  @}
+  @}
 
 getRandomMergeResourcesQuestionListBySystem
 ===