Переглянути джерело

1、数字人列表接口
2、课程配置改变

liyanbo 10 місяців тому
батько
коміт
b89323baf1
14 змінених файлів з 283 додано та 46 видалено
  1. 15 4
      byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/controller/admin/courseconfig/vo/CourseConfigPageReqVO.java
  2. 20 0
      byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/controller/admin/courseconfig/vo/CourseConfigRespVO.java
  3. 15 0
      byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/controller/admin/courseconfig/vo/CourseConfigSaveReqVO.java
  4. 29 2
      byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/dal/dataobject/courseconfig/CourseConfigDO.java
  5. 28 15
      byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/service/courseconfig/CourseConfigServiceImpl.java
  6. 2 1
      byzs-course/src/main/resources/mapper/course/CourseMapper.xml
  7. 10 7
      byzs-course/src/main/resources/mapper/courseconfig/CourseConfigMapper.xml
  8. 1 0
      byzs-module-ai/src/main/java/cn/iocoder/byzs/module/ai/controller/admin/model/AiChatRoleController.java
  9. 1 1
      byzs-module-ai/src/main/java/cn/iocoder/byzs/module/ai/dal/mysql/model/AiChatRoleMapper.java
  10. 3 3
      byzs-server/src/main/resources/application-prod.yaml
  11. 32 10
      byzs-web/src/main/java/cn/iocoder/byzs/module/web/controller/admin/ai/WebAiController.java
  12. 9 3
      byzs-web/src/main/java/cn/iocoder/byzs/module/web/controller/admin/course/WebCourseController.java
  13. 64 0
      byzs-web/src/main/java/cn/iocoder/byzs/module/web/controller/admin/course/vo/WebCourseVO.java
  14. 54 0
      byzs-web/src/main/java/cn/iocoder/byzs/module/web/service/course/WebCourseServiceImpl.java

+ 15 - 4
byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/controller/admin/courseconfig/vo/CourseConfigPageReqVO.java

@@ -20,13 +20,24 @@ public class CourseConfigPageReqVO extends PageParam {
     @Schema(description = "课程暂停时长")
     private Double ccTime;
 
+    @Schema(description = "试题来源")
+    private String ccQuestSource;
+
+    @Schema(description = "试题内容")
+    private String ccQuestContent;
+
+    @Schema(description = "试题选项")
+    private String ccQuestOption;
+
+    @Schema(description = "ai答案")
+    private String ccAiAnswer;
+
+    @Schema(description = "答案")
+    private String ccAnswer;
+
     @Schema(description = "试题id")
     private Integer ccQuestId;
 
-    @Schema(description = "试题名称")
-    private String questContent;
-
     @Schema(description = "是否显示答案")
     private String ccAnswerJudge;
-
 }

+ 20 - 0
byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/controller/admin/courseconfig/vo/CourseConfigRespVO.java

@@ -26,6 +26,26 @@ public class CourseConfigRespVO {
     @ExcelProperty("课程暂停时长")
     private Integer ccTime;
 
+    @Schema(description = "试题来源")
+    @ExcelProperty("试题来源")
+    private String ccQuestSource;
+
+    @Schema(description = "试题内容")
+    @ExcelProperty("试题内容")
+    private String ccQuestContent;
+
+    @Schema(description = "试题选项")
+    @ExcelProperty("试题选项")
+    private String ccQuestOption;
+
+    @Schema(description = "ai答案")
+    @ExcelProperty("ai答案")
+    private String ccAiAnswer;
+
+    @Schema(description = "答案")
+    @ExcelProperty("答案")
+    private String ccAnswer;
+
     @Schema(description = "试题id")
     @ExcelProperty("试题id")
     private Long ccQuestId;

+ 15 - 0
byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/controller/admin/courseconfig/vo/CourseConfigSaveReqVO.java

@@ -18,6 +18,21 @@ public class CourseConfigSaveReqVO {
     @Schema(description = "课程暂停时长")
     private Integer ccTime;
 
+    @Schema(description = "试题来源")
+    private String ccQuestSource;
+
+    @Schema(description = "试题内容")
+    private String ccQuestContent;
+
+    @Schema(description = "试题选项")
+    private String ccQuestOption;
+
+    @Schema(description = "ai答案")
+    private String ccAiAnswer;
+
+    @Schema(description = "答案")
+    private String ccAnswer;
+
     @Schema(description = "试题id")
     private Integer ccQuestId;
 

+ 29 - 2
byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/dal/dataobject/courseconfig/CourseConfigDO.java

@@ -1,8 +1,10 @@
 package cn.iocoder.byzs.module.bjdx.dal.dataobject.courseconfig;
 
-import lombok.*;
-import com.baomidou.mybatisplus.annotation.*;
 import cn.iocoder.byzs.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
 
 /**
  * 课程配置 DO
@@ -32,6 +34,31 @@ public class CourseConfigDO extends BaseDO {
      * 课程暂停时长
      */
     private Integer ccTime;
+
+    /**
+     * 试题来源
+     */
+    private String ccQuestSource;
+
+    /**
+     * 试题内容
+     */
+    private String ccQuestContent;
+
+    /**
+     * 试题选项
+     */
+    private String ccQuestOption;
+
+    /**
+     * ai答案
+     */
+    private String ccAiAnswer;
+
+    /**
+     * 答案
+     */
+    private String ccAnswer;
     /**
      * 试题id
      */

+ 28 - 15
byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/service/courseconfig/CourseConfigServiceImpl.java

@@ -107,23 +107,36 @@ public class CourseConfigServiceImpl implements CourseConfigService {
                 .map(doItem -> BeanUtils.toBean(doItem, CourseConfigRespVO.class))
                 .toList();
 
-        //课程配置试题Map
-        Map<Long, List<CourseQuestionRespVO>> questionMap =  courseQuestionMapper.selectByIds(courseConfigList.stream()
+        List<Long> quesIdList = courseConfigList.stream()
                 .map(CourseConfigRespVO::getCcQuestId)
-                .toList()).stream()
-                .map(doItem -> BeanUtils.toBean(doItem, CourseQuestionRespVO.class))
-                .collect(Collectors.groupingBy(CourseQuestionRespVO::getId));
-
+                .toList();
+        //课程配置试题Map
+        Map<Long, List<CourseQuestionRespVO>> questionMap;
         //课程配置试题选项Map
-        Map<Long, List<CourseQuestOptionDO>> questOptionMap = courseQuestOptionMapper.selectListByQuestId(questionMap.keySet()).stream().collect(Collectors.groupingBy(CourseQuestOptionDO::getCqoQuestId));
-
-        //封装
-        courseConfigList.forEach(courseConfig -> {
-            Long questId = courseConfig.getCcQuestId();
-            CourseQuestionRespVO courseQuestion = questionMap.get(questId).get(0);
-            courseQuestion.setCourseQuestOptionList(questOptionMap.get(questId));
-            courseConfig.setCourseQuestion(courseQuestion);
-        });
+        Map<Long, List<CourseQuestOptionDO>> questOptionMap = new HashMap<>();
+
+        if (quesIdList.isEmpty()) {
+            questionMap = courseQuestionMapper.selectByIds(quesIdList).stream()
+                    .map(doItem -> BeanUtils.toBean(doItem, CourseQuestionRespVO.class))
+                    .collect(Collectors.groupingBy(CourseQuestionRespVO::getId));
+        } else {
+            questionMap = new HashMap<>();
+        }
+        if (quesIdList.isEmpty()) {
+            questOptionMap = courseQuestOptionMapper.selectListByQuestId(questionMap.keySet()).stream().collect(Collectors.groupingBy(CourseQuestOptionDO::getCqoQuestId));
+
+        }
+
+        if(questionMap.size() > 0 && questOptionMap.size() > 0) {
+            //封装
+            Map<Long, List<CourseQuestOptionDO>> finalQuestOptionMap = questOptionMap;
+            courseConfigList.forEach(courseConfig -> {
+                Long questId = courseConfig.getCcQuestId();
+                CourseQuestionRespVO courseQuestion = questionMap.get(questId).get(0);
+                courseQuestion.setCourseQuestOptionList(finalQuestOptionMap.get(questId));
+                courseConfig.setCourseQuestion(courseQuestion);
+            });
+        }
 
         return courseConfigList;
     }

+ 2 - 1
byzs-course/src/main/resources/mapper/course/CourseMapper.xml

@@ -6,7 +6,7 @@
             resultType="cn.iocoder.byzs.module.bjdx.controller.admin.course.vo.CoursePageReqVO">
 
         SELECT c.id, c.course_name courseName, c.course_image_path courseImagePath, c.course_music_path courseMusicPath, c.course_video_path courseVideoPath, c.course_content_type courseContentType, c.course_author courseAuthor, c.course_teacher courseTeacher, c.course_size courseSize,
-               c.course_time courseTime, c.course_is_inspect courseIsInspect, c.course_status courseStatus, ct.ct_type courseTypeName
+               c.course_time courseTime, c.course_is_inspect courseIsInspect, c.course_label courseLabel, c.course_status courseStatus, ct.ct_type courseTypeName
         FROM bjdx_course c
         LEFT JOIN bjdx_course_type ct ON c.course_type = ct.id
         <where>
@@ -27,6 +27,7 @@
                 AND c.course_content_type = #{courseContentType}
             </if>
         </where>
+        ORDER BY c.course_label
 
     </select>
 </mapper>

+ 10 - 7
byzs-course/src/main/resources/mapper/courseconfig/CourseConfigMapper.xml

@@ -4,19 +4,22 @@
 
 
     <select id="selectCourseConfigPage" parameterType="cn.iocoder.byzs.module.bjdx.controller.admin.courseconfig.vo.CourseConfigPageReqVO" resultType="cn.iocoder.byzs.module.bjdx.controller.admin.courseconfig.vo.CourseConfigPageReqVO">
-        SELECT cc.id, cc.cc_course_id as ccCourseId, cc.cc_quest_id as ccQuestId, cc.cc_time as ccTime, cc.cc_answer_judge as ccAnswerJudge,
-               c.course_name as courseName,
-               cq.cq_question as questContent
+        SELECT cc.id, cc.cc_course_id as ccCourseId,
+                cc_quest_source as ccQuestSource,
+                cc_quest_content as ccQuestContent,
+                cc_quest_option as ccQuestOption,
+                cc_ai_answer as ccAiAnswer,
+                cc_answer as ccAnswer, cc.cc_quest_id as ccQuestId, cc.cc_time as ccTime, cc.cc_answer_judge as ccAnswerJudge,
+               c.course_name as courseName
         FROM bjdx_course_config cc
         LEFT JOIN bjdx_course c ON cc.cc_course_id = c.id
-        LEFT JOIN bjdx_course_question cq ON cc.cc_quest_id = cq.id
         <where>
-                c.deleted = 0 and cq.deleted = 0 and cc.deleted = 0
+                c.deleted = 0 and cc.deleted = 0
             <if test="ccCourseId != null and ccCourseId != ''">
                 AND cc.cc_course_id  = #{ccCourseId}
             </if>
-            <if test="questContent != null and questContent != ''">
-                AND cq.cq_question LIKE CONCAT('%', #{questContent}, '%')
+            <if test="ccQuestContent != null and ccQuestContent != ''">
+                AND cc.cc_quest_content LIKE CONCAT('%', #{ccQuestContent}, '%')
             </if>
             <if test="ccTime != null and ccTime != ''">
                 AND cc.cc_time LIKE CONCAT('%', #{ccTime}, '%')

+ 1 - 0
byzs-module-ai/src/main/java/cn/iocoder/byzs/module/ai/controller/admin/model/AiChatRoleController.java

@@ -36,6 +36,7 @@ public class AiChatRoleController {
     @GetMapping("/my-page")
     @Operation(summary = "获得【我的】聊天角色分页")
     public CommonResult<PageResult<AiChatRoleRespVO>> getChatRoleMyPage(@Valid AiChatRolePageReqVO pageReqVO) {
+        pageReqVO.setCategory("老师");
         PageResult<AiChatRoleDO> pageResult = chatRoleService.getChatRoleMyPage(pageReqVO, getLoginUserId());
         return success(BeanUtils.toBean(pageResult, AiChatRoleRespVO.class));
     }

+ 1 - 1
byzs-module-ai/src/main/java/cn/iocoder/byzs/module/ai/dal/mysql/model/AiChatRoleMapper.java

@@ -21,7 +21,7 @@ public interface AiChatRoleMapper extends BaseMapperX<AiChatRoleDO> {
     default PageResult<AiChatRoleDO> selectPage(AiChatRolePageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<AiChatRoleDO>()
                 .likeIfPresent(AiChatRoleDO::getName, reqVO.getName())
-                .eqIfPresent(AiChatRoleDO::getCategory, reqVO.getCategory())
+                .likeIfPresent(AiChatRoleDO::getCategory, reqVO.getCategory())
                 .eqIfPresent(AiChatRoleDO::getPublicStatus, reqVO.getPublicStatus())
                 .orderByAsc(AiChatRoleDO::getSort));
     }

+ 3 - 3
byzs-server/src/main/resources/application-prod.yaml

@@ -49,8 +49,8 @@ spring:
       datasource:
         master:
           url: jdbc:mysql://59.110.91.129:3306/byzs-bjdx?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useLegacyDatetimeCode=false
-          username: root
-          password: qweQWE123!@#
+          username: bjdx
+          password: u#&uwyW+K(66HG8
 
   # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
   data:
@@ -58,7 +58,7 @@ spring:
       host: 59.110.91.129 # 地址
       port: 6379 # 端口
       database: 0 # 数据库索引
-      password: qweQWE123!@# # 密码,建议生产环境开启
+      password: y>;F[*B2Y<[v<.z # 密码,建议生产环境开启
 
 --- #################### 定时任务相关配置 ####################
 

+ 32 - 10
byzs-web/src/main/java/cn/iocoder/byzs/module/web/controller/admin/ai/WebAiController.java

@@ -2,25 +2,22 @@ package cn.iocoder.byzs.module.web.controller.admin.ai;
 
 import cn.hutool.core.util.ObjUtil;
 import cn.iocoder.byzs.framework.common.pojo.CommonResult;
+import cn.iocoder.byzs.framework.common.pojo.PageResult;
 import cn.iocoder.byzs.framework.common.util.object.BeanUtils;
 import cn.iocoder.byzs.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.byzs.module.ai.controller.admin.chat.vo.conversation.AiChatConversationCreateMyReqVO;
-import cn.iocoder.byzs.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO;
 import cn.iocoder.byzs.module.ai.controller.admin.chat.vo.message.AiChatMessageSendReqVO;
 import cn.iocoder.byzs.module.ai.controller.admin.chat.vo.message.AiChatMessageSendRespVO;
 import cn.iocoder.byzs.module.ai.controller.admin.image.vo.AiImageDrawReqVO;
 import cn.iocoder.byzs.module.ai.controller.admin.image.vo.AiImageRespVO;
-import cn.iocoder.byzs.module.ai.dal.dataobject.chat.AiChatConversationDO;
+import cn.iocoder.byzs.module.ai.controller.admin.model.vo.chatRole.AiChatRolePageReqVO;
+import cn.iocoder.byzs.module.ai.controller.admin.model.vo.chatRole.AiChatRoleRespVO;
 import cn.iocoder.byzs.module.ai.dal.dataobject.image.AiImageDO;
+import cn.iocoder.byzs.module.ai.dal.dataobject.model.AiChatRoleDO;
 import cn.iocoder.byzs.module.ai.service.chat.AiChatConversationService;
 import cn.iocoder.byzs.module.ai.service.chat.AiChatMessageService;
 import cn.iocoder.byzs.module.ai.service.image.AiImageService;
-import cn.iocoder.byzs.module.bjdx.controller.admin.course.vo.CoursePageReqVO;
-import cn.iocoder.byzs.module.bjdx.controller.admin.coursetype.vo.CourseTypeListReqVO;
-import cn.iocoder.byzs.module.bjdx.controller.admin.coursetype.vo.CourseTypeRespVO;
-import cn.iocoder.byzs.module.bjdx.dal.dataobject.coursetype.CourseTypeDO;
-import cn.iocoder.byzs.module.bjdx.service.course.CourseService;
-import cn.iocoder.byzs.module.bjdx.service.coursetype.CourseTypeService;
+import cn.iocoder.byzs.module.ai.service.model.AiChatRoleService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -41,8 +38,6 @@ import static cn.iocoder.byzs.framework.security.core.util.SecurityFrameworkUtil
 @RestController
 @RequestMapping("/bjdxWeb/ai")
 @Validated
-@PermitAll
-@TenantIgnore
 public class WebAiController {
 
     @Resource
@@ -51,6 +46,8 @@ public class WebAiController {
     private AiChatMessageService chatMessageService;
     @Resource
     private AiImageService imageService;
+    @Resource
+    private AiChatRoleService chatRoleService;
     
     private Long userId = 1L;
 
@@ -84,12 +81,16 @@ public class WebAiController {
 
     // ================ 绘图管理 ================
 
+    @PermitAll
+    @TenantIgnore
     @Operation(summary = "生成图片")
     @PostMapping("/create-painting")
     public CommonResult<Long> drawImage(@Valid @RequestBody AiImageDrawReqVO drawReqVO) {
         return success(imageService.drawImage(userId, drawReqVO));
     }
 
+    @PermitAll
+    @TenantIgnore
     @GetMapping("/painting-get-my")
     @Operation(summary = "绘画-获取绘图记录")
     public CommonResult<AiImageRespVO> getImageMy(@RequestParam("id") Long id) {
@@ -99,4 +100,25 @@ public class WebAiController {
         }
         return success(BeanUtils.toBean(image, AiImageRespVO.class));
     }
+
+    @PermitAll
+    @TenantIgnore
+    @GetMapping("/painting-get-mys")
+    @Operation(summary = "获取【我的】绘图记录列表")
+    @Parameter(name = "ids", required = true, description = "绘画编号数组", example = "1024,2048")
+    public CommonResult<List<AiImageRespVO>> getImageListMyByIds(@RequestParam("ids") List<Long> ids) {
+        List<AiImageDO> imageList = imageService.getImageList(ids);
+//        imageList.removeIf(item -> !ObjUtil.equal(getLoginUserId(), item.getUserId()));
+        return success(BeanUtils.toBean(imageList, AiImageRespVO.class));
+    }
+
+
+    @GetMapping("/selectRoleModel")
+    @Operation(summary = "获得聊天角色分页")
+    public CommonResult<PageResult<AiChatRoleRespVO>> selectRoleModel() {
+        AiChatRolePageReqVO pageReqVO = new AiChatRolePageReqVO();
+        pageReqVO.setCategory("老师");
+        PageResult<AiChatRoleDO> pageResult = chatRoleService.getChatRoleMyPage(pageReqVO, getLoginUserId());
+        return success(BeanUtils.toBean(pageResult, AiChatRoleRespVO.class));
+    }
 }

+ 9 - 3
byzs-web/src/main/java/cn/iocoder/byzs/module/web/controller/admin/course/WebCourseController.java

@@ -7,6 +7,8 @@ import cn.iocoder.byzs.module.bjdx.controller.admin.coursetype.vo.CourseTypeList
 import cn.iocoder.byzs.module.bjdx.controller.admin.coursetype.vo.CourseTypeRespVO;
 import cn.iocoder.byzs.module.bjdx.dal.dataobject.coursetype.CourseTypeDO;
 import cn.iocoder.byzs.module.bjdx.service.coursetype.CourseTypeService;
+import cn.iocoder.byzs.module.web.controller.admin.course.vo.WebCourseVO;
+import cn.iocoder.byzs.module.web.service.course.WebCourseServiceImpl;
 import jakarta.annotation.security.PermitAll;
 import org.springframework.web.bind.annotation.*;
 import jakarta.annotation.Resource;
@@ -34,6 +36,8 @@ public class WebCourseController {
     @Resource
     private CourseService courseService;
     @Resource
+    private WebCourseServiceImpl webCourseService;
+    @Resource
     private CourseTypeService courseTypeService;
 
 
@@ -42,9 +46,11 @@ public class WebCourseController {
     @GetMapping("/getCourseByTypeId")
     @Operation(summary = "根据类型获得课程列表")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
-    public CommonResult<List<CoursePageReqVO>> getCourseByTypeId(@RequestParam("typeId") String typeId) {
-        List<CoursePageReqVO> courseList = courseService.getCourseList(new CoursePageReqVO().setCourseType(typeId));
-        return success(courseList);
+    public CommonResult<List<WebCourseVO>> getCourseByTypeId(@RequestParam("typeId") String typeId) {
+//        List<CoursePageReqVO> courseList = courseService.getCourseList(new CoursePageReqVO().setCourseType(typeId));
+
+        List<WebCourseVO> courseVoList = webCourseService.getCourseVoByTypeId(typeId);
+        return success(courseVoList);
     }
 
     @PermitAll

+ 64 - 0
byzs-web/src/main/java/cn/iocoder/byzs/module/web/controller/admin/course/vo/WebCourseVO.java

@@ -0,0 +1,64 @@
+package cn.iocoder.byzs.module.web.controller.admin.course.vo;
+
+import cn.iocoder.byzs.framework.common.pojo.PageParam;
+import cn.iocoder.byzs.module.bjdx.controller.admin.courseconfig.vo.CourseConfigRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "管理后台 - 课程分页 Request VO")
+@Data
+public class WebCourseVO extends PageParam {
+
+    @Schema(description = "课程id")
+    private Long id;
+
+    @Schema(description = "课程名称")
+    private String courseName;
+
+    @Schema(description = "课程内容类型")
+    private String courseContentType;
+
+    @Schema(description = "课程图片路径")
+    private String courseImagePath;
+
+    @Schema(description = "课程音频路径")
+    private String courseMusicPath;
+
+    @Schema(description = "课程视频路径")
+    private String courseVideoPath;
+
+    @Schema(description = "课程内容")
+    private String courseContent;
+
+    @Schema(description = "课程作者")
+    private String courseAuthor;
+
+    @Schema(description = "课程老师")
+    private String courseTeacher;
+
+    @Schema(description = "课程大小")
+    private Double courseSize;
+
+    @Schema(description = "课程时长")
+    private Integer courseTime;
+
+    @Schema(description = "课程是否有检查")
+    private String courseIsInspect;
+
+    @Schema(description = "课程类型id")
+    private String courseType;
+
+    @Schema(description = "课程类型名称")
+    private String courseTypeName;
+
+    @Schema(description = "课程标签")
+    private String courseLabel;
+
+    @Schema(description = "课程状态")
+    private String courseStatus;
+
+    private List<CourseConfigRespVO> courseConfigList;
+
+}

+ 54 - 0
byzs-web/src/main/java/cn/iocoder/byzs/module/web/service/course/WebCourseServiceImpl.java

@@ -0,0 +1,54 @@
+package cn.iocoder.byzs.module.web.service.course;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.byzs.framework.common.util.object.BeanUtils;
+import cn.iocoder.byzs.module.bjdx.controller.admin.course.vo.CoursePageReqVO;
+import cn.iocoder.byzs.module.bjdx.controller.admin.courseconfig.vo.CourseConfigRespVO;
+import cn.iocoder.byzs.module.bjdx.service.course.CourseService;
+import cn.iocoder.byzs.module.bjdx.service.courseconfig.CourseConfigService;
+import cn.iocoder.byzs.module.web.controller.admin.course.vo.WebCourseVO;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * web课程 Service 实现类
+ *
+ * @author lyb
+ */
+@Service
+@Validated
+public class WebCourseServiceImpl{
+
+    @Resource
+    private CourseService courseService;
+    @Resource
+    private CourseConfigService courseConfigService;
+
+
+    public List<WebCourseVO> getCourseVoByTypeId(String typeId) {
+        List<CoursePageReqVO> courseList = courseService.getCourseList(new CoursePageReqVO().setCourseType(typeId));
+
+        // 目前数据少先循环查询即可
+//        List<Long> idList = courseList.stream()
+//                .map(CoursePageReqVO::getId)
+//                .collect(Collectors.toList());
+
+        List<WebCourseVO> courseVoList = new ArrayList<>();
+
+        for (CoursePageReqVO course : courseList) {
+            List<CourseConfigRespVO> courseConfigQuestion = courseConfigService.getCourseConfigQuestion(course.getId());
+            if (CollUtil.isEmpty(courseConfigQuestion)) continue;
+            // 根据 ccTime 升序排序(已满足需求)
+            List<CourseConfigRespVO> list = courseConfigQuestion.stream().sorted(Comparator.comparing(CourseConfigRespVO::getCcTime)).toList();
+            courseVoList.add(BeanUtils.toBean(course, WebCourseVO.class).setCourseConfigList(list));
+        }
+
+        return courseVoList;
+    }
+
+}