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 ===