视图修改、接口修改
This commit is contained in:
@@ -10,11 +10,11 @@ import org.xyzh.common.core.page.PageRequest;
|
||||
import org.xyzh.common.dto.study.TbCourse;
|
||||
import org.xyzh.common.dto.study.TbCourseChapter;
|
||||
import org.xyzh.common.dto.study.TbCourseNode;
|
||||
import org.xyzh.common.dto.study.TbLearningRecord;
|
||||
import org.xyzh.common.vo.ChapterVO;
|
||||
import org.xyzh.common.vo.CourseVO;
|
||||
import org.xyzh.common.vo.CourseItemVO;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
@@ -52,24 +52,30 @@ public class CourseController {
|
||||
* 根据ID获取课程详情
|
||||
*/
|
||||
@GetMapping("/{courseID}")
|
||||
public ResultDomain<CourseVO> getCourseById(@PathVariable("courseID") String courseID) {
|
||||
public ResultDomain<CourseItemVO> getCourseById(@PathVariable("courseID") String courseID) {
|
||||
return courseService.getCourseById(courseID);
|
||||
}
|
||||
|
||||
@GetMapping("/{courseID}/progress")
|
||||
public ResultDomain<CourseItemVO> getCourseProgress(@PathVariable("courseID") String courseID) {
|
||||
return courseService.getCourseProgress(courseID);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 创建课程
|
||||
*/
|
||||
@PostMapping("/course")
|
||||
public ResultDomain<CourseVO> createCourse(@RequestBody CourseVO courseVO) {
|
||||
return courseService.createCourse(courseVO);
|
||||
public ResultDomain<CourseItemVO> createCourse(@RequestBody CourseItemVO courseItemVO) {
|
||||
return courseService.createCourse(courseItemVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新课程基本信息
|
||||
*/
|
||||
@PutMapping("/course")
|
||||
public ResultDomain<CourseVO> updateCourse(@RequestBody CourseVO courseVO) {
|
||||
return courseService.updateCourse(courseVO);
|
||||
public ResultDomain<CourseItemVO> updateCourse(@RequestBody CourseItemVO courseItemVO) {
|
||||
return courseService.updateCourse(courseItemVO);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -88,8 +88,8 @@ public class LearningTaskController {
|
||||
* 删除任务
|
||||
*/
|
||||
@DeleteMapping("/task")
|
||||
public ResultDomain<Boolean> deleteTask(@PathVariable("taskID") String taskID) {
|
||||
return learningTaskService.deleteTask(taskID);
|
||||
public ResultDomain<Boolean> deleteTask(@RequestBody TbLearningTask task) {
|
||||
return learningTaskService.deleteTask(task.getTaskID());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -5,6 +5,7 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.xyzh.common.core.page.PageParam;
|
||||
import org.xyzh.common.dto.study.TbCourse;
|
||||
import org.xyzh.common.vo.CourseItemVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -181,4 +182,14 @@ public interface CourseMapper extends BaseMapper<TbCourse> {
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
int incrementViewCount(@Param("courseID") String courseID);
|
||||
|
||||
/**
|
||||
* @description 增加课程学习人数
|
||||
* @param courseID 课程ID
|
||||
* @param count 增加人数
|
||||
* @return int 影响行数
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
int incrementLearnCount(@Param("courseID") String courseID, @Param("count") int count);
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.xyzh.common.core.page.PageParam;
|
||||
import org.xyzh.common.dto.study.TbCourseNode;
|
||||
import org.xyzh.common.vo.CourseItemVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -35,6 +36,16 @@ public interface CourseNodeMapper extends BaseMapper<TbCourseNode> {
|
||||
* @since 2025-10-21
|
||||
*/
|
||||
List<TbCourseNode> selectCourseNodesByChapterIDs(@Param("chapterIDs") List<String> chapterIDs);
|
||||
|
||||
/**
|
||||
* @description 查询节点进度
|
||||
* @param chapterIDs 章节ID列表
|
||||
* @param userID 用户ID(可选,传null则不关联学习记录)
|
||||
* @return List<CourseItemVO> 节点进度列表
|
||||
* @author yslg
|
||||
* @since 2025-10-28
|
||||
*/
|
||||
List<CourseItemVO> selectNodesProgress(@Param("chapterIDs") List<String> chapterIDs, @Param("userID") String userID);
|
||||
/**
|
||||
* @description 根据节点ID查询节点信息
|
||||
* @param nodeId 节点ID
|
||||
|
||||
@@ -20,14 +20,10 @@ import org.xyzh.common.core.page.PageRequest;
|
||||
import org.xyzh.common.dto.study.TbCourse;
|
||||
import org.xyzh.common.dto.study.TbCourseChapter;
|
||||
import org.xyzh.common.dto.study.TbCourseNode;
|
||||
import org.xyzh.common.dto.study.TbCourseTag;
|
||||
import org.xyzh.common.dto.study.TbLearningRecord;
|
||||
import org.xyzh.common.dto.user.TbSysUser;
|
||||
import org.xyzh.common.utils.IDUtils;
|
||||
import org.xyzh.common.vo.ChapterVO;
|
||||
import org.xyzh.common.vo.CourseVO;
|
||||
import org.xyzh.common.vo.CourseItemVO;
|
||||
import org.xyzh.study.mapper.CourseMapper;
|
||||
import org.xyzh.study.mapper.CourseTagMapper;
|
||||
import org.xyzh.study.mapper.CourseChapterMapper;
|
||||
import org.xyzh.study.mapper.CourseNodeMapper;
|
||||
import org.xyzh.study.service.SCCourseService;
|
||||
@@ -51,9 +47,6 @@ public class SCCourseServiceImpl implements SCCourseService {
|
||||
@Autowired
|
||||
private CourseChapterMapper courseChapterMapper;
|
||||
|
||||
@Autowired
|
||||
private CourseTagMapper courseTagMapper;
|
||||
|
||||
@Autowired
|
||||
private CourseNodeMapper courseNodeMapper;
|
||||
|
||||
@@ -81,108 +74,133 @@ public class SCCourseServiceImpl implements SCCourseService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultDomain<CourseVO> getCourseById(String courseID) {
|
||||
ResultDomain<CourseVO> resultDomain = new ResultDomain<>();
|
||||
public ResultDomain<CourseItemVO> getCourseById(String courseID) {
|
||||
ResultDomain<CourseItemVO> resultDomain = new ResultDomain<>();
|
||||
// 查询课程
|
||||
TbCourse course = courseMapper.selectByCourseId(courseID);
|
||||
// 查询标签
|
||||
List<TbCourseTag> tags = courseTagMapper.selectByCourseId(courseID);
|
||||
CourseVO courseVO = new CourseVO();
|
||||
courseVO.setCourse(course);
|
||||
courseVO.setCourseTags(tags);
|
||||
if (course == null) {
|
||||
resultDomain.fail("课程不存在");
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
// 从课程实体创建CourseItemVO
|
||||
CourseItemVO courseItemVO = CourseItemVO.fromCourse(course);
|
||||
|
||||
// 查询课程章节
|
||||
TbCourseChapter filter = new TbCourseChapter();
|
||||
filter.setCourseID(courseID);
|
||||
List<TbCourseChapter> chapters = courseChapterMapper.selectCourseChapters(filter);
|
||||
// 查询子节点
|
||||
if (chapters.size() > 0) {
|
||||
List<String> chapterIDs = chapters.stream().map(TbCourseChapter::getChapterID).collect(Collectors.toList());
|
||||
|
||||
// 查询并构建章节及节点结构
|
||||
if (!chapters.isEmpty()) {
|
||||
List<String> chapterIDs = chapters.stream()
|
||||
.map(TbCourseChapter::getChapterID)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 查询所有节点
|
||||
List<TbCourseNode> nodes = courseNodeMapper.selectCourseNodesByChapterIDs(chapterIDs);
|
||||
Map<String, List<TbCourseNode>> nodesMap = nodes.stream().collect(Collectors.groupingBy(TbCourseNode::getChapterID));
|
||||
List<ChapterVO> chapterVOs = chapters.stream().map(chapter -> {
|
||||
ChapterVO chapterVO = new ChapterVO();
|
||||
chapterVO.setChapter(chapter);
|
||||
chapterVO.setNodes(nodesMap.get(chapter.getChapterID()));
|
||||
return chapterVO;
|
||||
}).collect(Collectors.toList());
|
||||
courseVO.setCourseChapters(chapterVOs);
|
||||
|
||||
// 转换章节为CourseItemVO列表
|
||||
List<CourseItemVO> chapterVOs = chapters.stream()
|
||||
.map(CourseItemVO::fromChapter)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 转换节点为CourseItemVO,并按章节ID分组
|
||||
Map<String, List<CourseItemVO>> nodesMap = nodes.stream()
|
||||
.map(CourseItemVO::fromNode)
|
||||
.collect(Collectors.groupingBy(CourseItemVO::getChapterID));
|
||||
|
||||
// 设置章节列表和章节节点映射
|
||||
courseItemVO.setChapters(chapterVOs);
|
||||
courseItemVO.setChapterNodes(nodesMap);
|
||||
}
|
||||
|
||||
resultDomain.success("获取课程详情成功", courseVO);
|
||||
resultDomain.success("获取课程详情成功", courseItemVO);
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultDomain<CourseVO> createCourse(CourseVO courseVO) {
|
||||
ResultDomain<CourseVO> resultDomain = new ResultDomain<>();
|
||||
public ResultDomain<CourseItemVO> createCourse(CourseItemVO courseItemVO) {
|
||||
ResultDomain<CourseItemVO> resultDomain = new ResultDomain<>();
|
||||
TbSysUser user = LoginUtil.getCurrentUser();
|
||||
if (user == null) {
|
||||
resultDomain.fail("请先登录");
|
||||
return resultDomain;
|
||||
}
|
||||
TbCourse course = courseVO.getCourse();
|
||||
|
||||
// 转换为课程实体并保存
|
||||
TbCourse course = courseItemVO.toCourse();
|
||||
String courseID = IDUtils.generateID();
|
||||
course.setID(IDUtils.generateID());
|
||||
course.setCreator(user.getID());
|
||||
course.setCourseID(courseID);
|
||||
Date now = new Date();
|
||||
course.setCreateTime(now);
|
||||
course.setStatus(0);
|
||||
|
||||
|
||||
if (course.getStatus() == null) {
|
||||
course.setStatus(0);
|
||||
}
|
||||
courseMapper.insertCourse(course);
|
||||
courseItemVO.setCourseID(courseID);
|
||||
|
||||
List<ChapterVO> courseChapters = courseVO.getCourseChapters();
|
||||
List<TbCourseChapter> chapters = new ArrayList<>();
|
||||
List<TbCourseNode> nodes = new ArrayList<>();
|
||||
int length = courseChapters.size();
|
||||
for (int i=0; i<length; i++) {
|
||||
ChapterVO chapterVO = courseChapters.get(i);
|
||||
TbCourseChapter chapter = chapterVO.getChapter();
|
||||
List<TbCourseNode> nodesList = chapterVO.getNodes();
|
||||
// 处理章节和节点
|
||||
List<CourseItemVO> chapterVOs = courseItemVO.getChapters();
|
||||
if (chapterVOs != null && !chapterVOs.isEmpty()) {
|
||||
List<TbCourseChapter> chapters = new ArrayList<>();
|
||||
List<TbCourseNode> allNodes = new ArrayList<>();
|
||||
|
||||
for (int i = 0; i < chapterVOs.size(); i++) {
|
||||
CourseItemVO chapterVO = chapterVOs.get(i);
|
||||
TbCourseChapter chapter = chapterVO.toChapter();
|
||||
|
||||
String chapterID = IDUtils.generateID();
|
||||
chapter.setID(IDUtils.generateID());
|
||||
chapter.setChapterID(chapterID);
|
||||
chapter.setCourseID(courseID);
|
||||
chapter.setCreator(user.getID());
|
||||
chapter.setCreateTime(now);
|
||||
chapter.setOrderNum(i);
|
||||
chapters.add(chapter);
|
||||
|
||||
// 更新chapterVO中的ID
|
||||
chapterVO.setChapterID(chapterID);
|
||||
|
||||
chapter.setCourseID(courseID);
|
||||
String chapterID = IDUtils.generateID();
|
||||
chapter.setID(IDUtils.generateID());
|
||||
chapter.setChapterID(chapterID);
|
||||
chapter.setCreator(user.getID());
|
||||
chapter.setCreateTime(now);
|
||||
chapter.setOrderNum(i);
|
||||
chapters.add(chapter);
|
||||
|
||||
for (int j=0; j<nodesList.size(); j++) {
|
||||
TbCourseNode node = nodesList.get(j);
|
||||
node.setNodeID(IDUtils.generateID());
|
||||
node.setChapterID(chapterID);
|
||||
node.setCreator(user.getID());
|
||||
node.setCreateTime(now);
|
||||
nodes.add(node);
|
||||
// 处理该章节的节点
|
||||
List<CourseItemVO> nodeVOs = chapterVO.getChapters(); // 节点存储在chapters字段中
|
||||
if (nodeVOs != null && !nodeVOs.isEmpty()) {
|
||||
for (int j = 0; j < nodeVOs.size(); j++) {
|
||||
CourseItemVO nodeVO = nodeVOs.get(j);
|
||||
TbCourseNode node = nodeVO.toNode();
|
||||
|
||||
String nodeID = IDUtils.generateID();
|
||||
node.setID(IDUtils.generateID());
|
||||
node.setNodeID(nodeID);
|
||||
node.setChapterID(chapterID);
|
||||
node.setCreator(user.getID());
|
||||
node.setCreateTime(now);
|
||||
node.setOrderNum(j);
|
||||
allNodes.add(node);
|
||||
|
||||
// 更新nodeVO中的ID
|
||||
nodeVO.setNodeID(nodeID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!chapters.isEmpty()) {
|
||||
courseChapterMapper.batchInsertCourseChapters(chapters);
|
||||
}
|
||||
if (!allNodes.isEmpty()) {
|
||||
courseNodeMapper.batchInsertCourseNodes(allNodes);
|
||||
}
|
||||
}
|
||||
courseChapterMapper.batchInsertCourseChapters(chapters);
|
||||
courseNodeMapper.batchInsertCourseNodes(nodes);
|
||||
|
||||
List<TbCourseTag> courseTags = courseVO.getCourseTags();
|
||||
length = courseTags.size();
|
||||
if (length > 0) {
|
||||
for (int i=0; i<length; i++) {
|
||||
TbCourseTag tag = courseTags.get(i);
|
||||
tag.setCourseID(courseID);
|
||||
tag.setTagID(IDUtils.generateID());
|
||||
tag.setCreator(user.getID());
|
||||
tag.setCreateTime(now);
|
||||
}
|
||||
courseTagMapper.batchInsertCourseTags(courseTags);
|
||||
}
|
||||
|
||||
|
||||
resultDomain.success("创建课程成功",courseVO);
|
||||
resultDomain.success("创建课程成功", courseItemVO);
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultDomain<CourseVO> updateCourse(CourseVO courseVO) {
|
||||
ResultDomain<CourseVO> resultDomain = new ResultDomain<>();
|
||||
public ResultDomain<CourseItemVO> updateCourse(CourseItemVO courseItemVO) {
|
||||
ResultDomain<CourseItemVO> resultDomain = new ResultDomain<>();
|
||||
|
||||
TbSysUser user = LoginUtil.getCurrentUser();
|
||||
if (user == null) {
|
||||
@@ -190,8 +208,7 @@ public class SCCourseServiceImpl implements SCCourseService {
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
TbCourse course = courseVO.getCourse();
|
||||
String courseID = course.getCourseID();
|
||||
String courseID = courseItemVO.getCourseID();
|
||||
|
||||
if (courseID == null || courseID.isEmpty()) {
|
||||
resultDomain.fail("课程ID不能为空");
|
||||
@@ -199,12 +216,14 @@ public class SCCourseServiceImpl implements SCCourseService {
|
||||
}
|
||||
|
||||
// 1. 更新课程基本信息
|
||||
TbCourse course = courseItemVO.toCourse();
|
||||
course.setUpdater(user.getID());
|
||||
course.setUpdateTime(new Date());
|
||||
Date now = new Date();
|
||||
course.setUpdateTime(now);
|
||||
courseMapper.updateCourse(course);
|
||||
|
||||
// 2. 处理章节和节点
|
||||
List<ChapterVO> newChapterVOs = courseVO.getCourseChapters();
|
||||
List<CourseItemVO> newChapterVOs = courseItemVO.getChapters();
|
||||
if (newChapterVOs == null) {
|
||||
newChapterVOs = new ArrayList<>();
|
||||
}
|
||||
@@ -235,12 +254,11 @@ public class SCCourseServiceImpl implements SCCourseService {
|
||||
List<TbCourseNode> nodesToUpdate = new ArrayList<>();
|
||||
|
||||
Set<String> newChapterIDs = new HashSet<>();
|
||||
Date now = new Date();
|
||||
|
||||
// 遍历新的章节
|
||||
for (int i = 0; i < newChapterVOs.size(); i++) {
|
||||
ChapterVO chapterVO = newChapterVOs.get(i);
|
||||
TbCourseChapter chapter = chapterVO.getChapter();
|
||||
CourseItemVO chapterVO = newChapterVOs.get(i);
|
||||
TbCourseChapter chapter = chapterVO.toChapter();
|
||||
String chapterID = chapter.getChapterID();
|
||||
|
||||
chapter.setCourseID(courseID);
|
||||
@@ -266,9 +284,9 @@ public class SCCourseServiceImpl implements SCCourseService {
|
||||
newChapterIDs.add(chapterID);
|
||||
|
||||
// 处理该章节的节点
|
||||
List<TbCourseNode> newNodes = chapterVO.getNodes();
|
||||
if (newNodes == null) {
|
||||
newNodes = new ArrayList<>();
|
||||
List<CourseItemVO> newNodeVOs = chapterVO.getChapters(); // 节点存储在chapters字段中
|
||||
if (newNodeVOs == null) {
|
||||
newNodeVOs = new ArrayList<>();
|
||||
}
|
||||
|
||||
List<TbCourseNode> existingNodesForChapter = existingNodesMap.getOrDefault(chapterID, new ArrayList<>());
|
||||
@@ -278,8 +296,9 @@ public class SCCourseServiceImpl implements SCCourseService {
|
||||
Set<String> newNodeIDs = new HashSet<>();
|
||||
|
||||
// 遍历新的节点
|
||||
for (int j = 0; j < newNodes.size(); j++) {
|
||||
TbCourseNode node = newNodes.get(j);
|
||||
for (int j = 0; j < newNodeVOs.size(); j++) {
|
||||
CourseItemVO nodeVO = newNodeVOs.get(j);
|
||||
TbCourseNode node = nodeVO.toNode();
|
||||
String nodeID = node.getNodeID();
|
||||
|
||||
node.setChapterID(chapterID);
|
||||
@@ -349,50 +368,7 @@ public class SCCourseServiceImpl implements SCCourseService {
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 处理标签
|
||||
List<TbCourseTag> newTags = courseVO.getCourseTags();
|
||||
if (newTags == null) {
|
||||
newTags = new ArrayList<>();
|
||||
}
|
||||
|
||||
// 获取现有标签
|
||||
List<TbCourseTag> existingTags = courseTagMapper.selectByCourseId(courseID);
|
||||
Map<String, TbCourseTag> existingTagMap = existingTags.stream()
|
||||
.collect(Collectors.toMap(TbCourseTag::getTagID, tag -> tag));
|
||||
|
||||
Set<String> newTagIDs = new HashSet<>();
|
||||
List<TbCourseTag> tagsToInsert = new ArrayList<>();
|
||||
|
||||
// 处理新标签
|
||||
for (TbCourseTag tag : newTags) {
|
||||
String tagID = tag.getTagID();
|
||||
|
||||
if (tagID == null || tagID.isEmpty() || !existingTagMap.containsKey(tagID)) {
|
||||
// 新增标签
|
||||
tag.setID(IDUtils.generateID());
|
||||
tag.setCourseID(courseID);
|
||||
tag.setCreator(user.getID());
|
||||
tag.setCreateTime(now);
|
||||
tagsToInsert.add(tag);
|
||||
} else {
|
||||
newTagIDs.add(tagID);
|
||||
}
|
||||
}
|
||||
|
||||
// 找出要删除的标签
|
||||
List<String> tagIDsToDelete = existingTagMap.keySet().stream()
|
||||
.filter(id -> !newTagIDs.contains(id))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (!tagIDsToDelete.isEmpty()) {
|
||||
courseTagMapper.batchDeleteCourseTags(tagIDsToDelete);
|
||||
}
|
||||
|
||||
if (!tagsToInsert.isEmpty()) {
|
||||
courseTagMapper.batchInsertCourseTags(tagsToInsert);
|
||||
}
|
||||
|
||||
resultDomain.success("更新课程成功", courseVO);
|
||||
resultDomain.success("更新课程成功", courseItemVO);
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
@@ -544,4 +520,57 @@ public class SCCourseServiceImpl implements SCCourseService {
|
||||
return resultDomain;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultDomain<CourseItemVO> getCourseProgress(String courseID) {
|
||||
ResultDomain<CourseItemVO> resultDomain = new ResultDomain<>();
|
||||
|
||||
// 获取当前用户
|
||||
TbSysUser user = LoginUtil.getCurrentUser();
|
||||
if (user == null) {
|
||||
resultDomain.fail("用户未登录");
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
// 查询课程
|
||||
TbCourse course = courseMapper.selectByCourseId(courseID);
|
||||
if (course == null) {
|
||||
resultDomain.fail("课程不存在");
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
// 从课程实体创建CourseItemVO
|
||||
CourseItemVO courseItemVO = CourseItemVO.fromCourse(course);
|
||||
|
||||
// 查询课程章节
|
||||
TbCourseChapter filter = new TbCourseChapter();
|
||||
filter.setCourseID(courseID);
|
||||
List<TbCourseChapter> chapters = courseChapterMapper.selectCourseChapters(filter);
|
||||
|
||||
// 查询并构建章节及节点结构(带进度)
|
||||
if (!chapters.isEmpty()) {
|
||||
List<String> chapterIDs = chapters.stream()
|
||||
.map(TbCourseChapter::getChapterID)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 查询带进度的节点(传入用户ID)
|
||||
List<CourseItemVO> nodesWithProgress = courseNodeMapper.selectNodesProgress(chapterIDs, user.getID());
|
||||
|
||||
// 转换章节为CourseItemVO列表
|
||||
List<CourseItemVO> chapterVOs = chapters.stream()
|
||||
.map(CourseItemVO::fromChapter)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 按章节ID分组节点
|
||||
Map<String, List<CourseItemVO>> nodesMap = nodesWithProgress.stream()
|
||||
.collect(Collectors.groupingBy(CourseItemVO::getChapterID));
|
||||
|
||||
// 设置章节列表和章节节点映射
|
||||
courseItemVO.setChapters(chapterVOs);
|
||||
courseItemVO.setChapterNodes(nodesMap);
|
||||
}
|
||||
|
||||
resultDomain.success("获取课程进度成功", courseItemVO);
|
||||
return resultDomain;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ import org.xyzh.common.vo.TaskItemVO;
|
||||
import org.xyzh.common.vo.TaskVO;
|
||||
import org.xyzh.study.mapper.LearningTaskMapper;
|
||||
import org.xyzh.study.mapper.TaskUserMapper;
|
||||
import org.xyzh.study.mapper.CourseMapper;
|
||||
import org.xyzh.system.utils.LoginUtil;
|
||||
import org.xyzh.study.mapper.TaskItemMapper;
|
||||
import org.xyzh.api.study.task.LearningTaskService;
|
||||
@@ -48,6 +49,9 @@ public class SCLearningTaskServiceImpl implements LearningTaskService {
|
||||
@Autowired
|
||||
private TaskUserMapper taskUserMapper;
|
||||
|
||||
@Autowired
|
||||
private CourseMapper courseMapper;
|
||||
|
||||
@Autowired
|
||||
private TaskItemMapper taskItemMapper;
|
||||
|
||||
@@ -82,7 +86,8 @@ public class SCLearningTaskServiceImpl implements LearningTaskService {
|
||||
taskUsers.add(taskUser);
|
||||
}
|
||||
int result = taskUserMapper.batchInsertTaskUsers(taskUsers);
|
||||
if (result > 0) {
|
||||
int learnCount = courseMapper.incrementLearnCount(taskID, userIDs.size());
|
||||
if (result > 0 && learnCount > 0) {
|
||||
resultDomain.success("添加任务用户成功", taskUsers);
|
||||
return resultDomain;
|
||||
} else {
|
||||
@@ -181,6 +186,10 @@ public class SCLearningTaskServiceImpl implements LearningTaskService {
|
||||
item.setCreateTime(now);
|
||||
});
|
||||
taskUserMapper.batchInsertTaskUsers(taskUsers);
|
||||
for(TbTaskItem item : taskCourses) {
|
||||
int learnCount = courseMapper.incrementLearnCount(item.getItemID(), taskUsers.size());
|
||||
|
||||
}
|
||||
|
||||
resultDomain.success("创建任务成功", taskVO);
|
||||
return resultDomain;
|
||||
@@ -349,6 +358,7 @@ public class SCLearningTaskServiceImpl implements LearningTaskService {
|
||||
|
||||
if (!usersToInsert.isEmpty()) {
|
||||
taskUserMapper.batchInsertTaskUsers(usersToInsert);
|
||||
int learnCount = courseMapper.incrementLearnCount(taskID, usersToInsert.size());
|
||||
}
|
||||
|
||||
resultDomain.success("更新任务成功", taskVO);
|
||||
@@ -357,8 +367,17 @@ public class SCLearningTaskServiceImpl implements LearningTaskService {
|
||||
|
||||
@Override
|
||||
public ResultDomain<Boolean> deleteTask(String taskID) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
ResultDomain<Boolean> resultDomain = new ResultDomain<>();
|
||||
TbLearningTask filter = new TbLearningTask();
|
||||
filter.setTaskID(taskID);
|
||||
int result = learningTaskMapper.deleteLearningTask(filter);
|
||||
if (result > 0) {
|
||||
resultDomain.success("删除任务成功", true);
|
||||
return resultDomain;
|
||||
} else {
|
||||
resultDomain.fail("删除任务失败");
|
||||
return resultDomain;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
teacher, status, view_count, learn_count, order_num, creator, create_time
|
||||
) VALUES (
|
||||
#{id}, #{courseID}, #{name}, #{coverImage}, #{description}, #{content}, #{duration},
|
||||
#{teacher}, #{status}, #{viewCount}, #{learnCount}, #{orderNum}, #{creator},#{createTime}
|
||||
#{teacher}, #{status}, 0, 0, #{orderNum}, #{creator},#{createTime}
|
||||
)
|
||||
</insert>
|
||||
|
||||
@@ -248,15 +248,14 @@
|
||||
<insert id="batchInsertCourses" parameterType="java.util.List">
|
||||
INSERT INTO tb_course (
|
||||
id, course_id, name, cover_image, description, content, duration,
|
||||
teacher, status, view_count, learn_count, order_num, creator, updater,
|
||||
create_time, update_time, delete_time, deleted
|
||||
teacher, status, view_count, learn_count, order_num, creator,
|
||||
create_time, delete_time, deleted
|
||||
) VALUES
|
||||
<foreach collection="courseList" item="item" separator=",">
|
||||
(
|
||||
#{item.id}, #{item.courseID}, #{item.name}, #{item.coverImage}, #{item.description},
|
||||
#{item.content}, #{item.duration}, #{item.teacher}, #{item.status}, #{item.viewCount},
|
||||
#{item.learnCount}, #{item.orderNum}, #{item.creator}, #{item.updater},
|
||||
#{item.createTime}, #{item.updateTime}, #{item.deleteTime}, #{item.deleted}
|
||||
#{item.content}, #{item.duration}, #{item.teacher}, #{item.status}, 0,
|
||||
0, #{item.orderNum}, #{item.creator}, #{item.createTime}, #{item.deleteTime}, #{item.deleted}
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
@@ -292,4 +291,14 @@
|
||||
SET view_count = view_count + 1
|
||||
WHERE course_id = #{courseID} AND deleted = 0
|
||||
</update>
|
||||
|
||||
<!-- incrementLearnCount -->
|
||||
|
||||
<update id="incrementLearnCount">
|
||||
UPDATE tb_course
|
||||
SET learn_count = learn_count + #{count}
|
||||
WHERE course_id = #{courseID} AND deleted = 0
|
||||
</update>
|
||||
|
||||
|
||||
</mapper>
|
||||
@@ -23,6 +23,27 @@
|
||||
<result column="deleted" property="deleted" jdbcType="BOOLEAN"/>
|
||||
</resultMap>
|
||||
|
||||
<resultMap id="CourseItemResultMap" type="org.xyzh.common.vo.CourseItemVO">
|
||||
<id column="id" property="id" jdbcType="VARCHAR"/>
|
||||
<result column="node_id" property="nodeID" jdbcType="VARCHAR"/>
|
||||
<result column="chapter_id" property="chapterID" jdbcType="VARCHAR"/>
|
||||
<result column="name" property="name" jdbcType="VARCHAR"/>
|
||||
<result column="content" property="content" jdbcType="LONGVARCHAR"/>
|
||||
<result column="node_type" property="nodeType" jdbcType="INTEGER"/>
|
||||
<result column="resource_id" property="resourceID" jdbcType="VARCHAR"/>
|
||||
<result column="video_url" property="videoUrl" jdbcType="VARCHAR"/>
|
||||
<result column="duration" property="duration" jdbcType="INTEGER"/>
|
||||
<result column="order_num" property="orderNum" jdbcType="INTEGER"/>
|
||||
<result column="is_required" property="isRequired" jdbcType="INTEGER"/>
|
||||
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
|
||||
<!-- 学习记录相关字段 -->
|
||||
<result column="progress" property="progress" jdbcType="DECIMAL"/>
|
||||
<result column="is_complete" property="isComplete" jdbcType="BOOLEAN"/>
|
||||
<result column="learning_duration" property="learningDuration" jdbcType="INTEGER"/>
|
||||
<result column="last_learn_time" property="lastLearnTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="complete_time" property="completeTime" jdbcType="TIMESTAMP"/>
|
||||
</resultMap>
|
||||
|
||||
<!-- 基础字段 -->
|
||||
<sql id="Base_Column_List">
|
||||
id, node_id, chapter_id, name, content, node_type, resource_id, video_url, duration, order_num, is_required,
|
||||
@@ -236,4 +257,41 @@
|
||||
AND deleted = 0
|
||||
ORDER BY order_num ASC, create_time ASC
|
||||
</select>
|
||||
<!-- selectNodesProgress -->
|
||||
|
||||
<select id="selectNodesProgress" resultMap="CourseItemResultMap">
|
||||
SELECT
|
||||
tcn.id,
|
||||
tcn.node_id,
|
||||
tcn.chapter_id,
|
||||
tcn.`name`,
|
||||
tcn.content,
|
||||
tcn.node_type,
|
||||
tcn.resource_id,
|
||||
tcn.video_url,
|
||||
tcn.duration,
|
||||
tcn.order_num,
|
||||
tcn.is_required,
|
||||
tcn.create_time,
|
||||
tlr.duration as learning_duration,
|
||||
tlr.progress,
|
||||
tlr.is_complete,
|
||||
tlr.last_learn_time,
|
||||
tlr.complete_time
|
||||
FROM
|
||||
tb_course_node tcn
|
||||
LEFT JOIN tb_learning_record tlr ON tcn.node_id = tlr.node_id
|
||||
<if test="userID != null and userID != ''">
|
||||
AND tlr.user_id = #{userID}
|
||||
</if>
|
||||
WHERE
|
||||
tcn.chapter_id IN
|
||||
<foreach collection="chapterIDs" item="chapterID" open="(" separator="," close=")">
|
||||
#{chapterID}
|
||||
</foreach>
|
||||
AND tcn.deleted = 0
|
||||
ORDER BY
|
||||
tcn.order_num ASC,
|
||||
tcn.create_time ASC
|
||||
</select>
|
||||
</mapper>
|
||||
|
||||
@@ -125,11 +125,9 @@
|
||||
<!-- 插入学习记录 -->
|
||||
<insert id="insertLearningRecord" parameterType="org.xyzh.common.dto.study.TbLearningRecord">
|
||||
INSERT INTO tb_learning_record (
|
||||
id, user_id, task_id, resource_type, resource_id, course_id, chapter_id, node_id, duration, progress,
|
||||
is_complete, complete_time, last_learn_time, create_time
|
||||
id, user_id, task_id, resource_type, resource_id, course_id, chapter_id, node_id, create_time
|
||||
) VALUES (
|
||||
#{id}, #{userID}, #{taskID}, #{resourceType}, #{resourceID}, #{courseID}, #{chapterID}, #{nodeID}, #{duration}, #{progress},
|
||||
#{isComplete}, #{completeTime}, #{lastLearnTime}, #{createTime}
|
||||
#{id}, #{userID}, #{taskID}, #{resourceType}, #{resourceID}, #{courseID}, #{chapterID}, #{nodeID}, #{createTime}
|
||||
)
|
||||
</insert>
|
||||
|
||||
@@ -171,14 +169,11 @@
|
||||
<!-- 批量插入学习记录 -->
|
||||
<insert id="batchInsertLearningRecords" parameterType="java.util.List">
|
||||
INSERT INTO tb_learning_record (
|
||||
id, user_id, resource_type, resource_id, task_id, duration, progress,
|
||||
is_complete, complete_time, last_learn_time, create_time, update_time
|
||||
id, user_id, resource_type, resource_id, task_id, course_id, chapter_id, node_id, create_time
|
||||
) VALUES
|
||||
<foreach collection="learningRecordList" item="item" separator=",">
|
||||
(
|
||||
#{item.id}, #{item.userID}, #{item.resourceType}, #{item.resourceID}, #{item.taskID},
|
||||
#{item.duration}, #{item.progress}, #{item.isComplete}, #{item.completeTime},
|
||||
#{item.lastLearnTime}, #{item.createTime}, #{item.updateTime}
|
||||
#{item.id}, #{item.userID}, #{item.resourceType}, #{item.resourceID}, #{item.taskID}, #{item.courseID}, #{item.chapterID}, #{item.nodeID}, #{item.createTime}
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
|
||||
@@ -152,9 +152,9 @@
|
||||
<!-- 插入任务用户关联 -->
|
||||
<insert id="insertTaskUser" parameterType="org.xyzh.common.dto.study.TbTaskUser">
|
||||
INSERT INTO tb_task_user (
|
||||
id, task_id, user_id, dept_id,creator, create_time
|
||||
id, task_id, user_id, dept_id,creator, status, progress, create_time
|
||||
) VALUES (
|
||||
#{id}, #{taskID}, #{userID}, #{deptID}, #{creator}, #{createTime}
|
||||
#{id}, #{taskID}, #{userID}, #{deptID}, #{creator}, 0, 0, #{createTime}
|
||||
)
|
||||
</insert>
|
||||
|
||||
@@ -193,8 +193,8 @@
|
||||
) VALUES
|
||||
<foreach collection="taskUserList" item="item" separator=",">
|
||||
(
|
||||
#{item.id}, #{item.taskID}, #{item.userID}, #{item.deptID}, #{item.status},
|
||||
#{item.progress}, #{item.completeTime}, #{item.creator}, #{item.createTime}
|
||||
#{item.id}, #{item.taskID}, #{item.userID}, #{item.deptID}, 0,
|
||||
0, #{item.completeTime}, #{item.creator}, #{item.createTime}
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
|
||||
Reference in New Issue
Block a user