PlayEdu/src/main/java/xyz/playedu/api/service/impl/CourseServiceImpl.java
2023-03-21 15:47:08 +08:00

214 lines
7.7 KiB
Java

package xyz.playedu.api.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import xyz.playedu.api.domain.ResourceCourseCategory;
import xyz.playedu.api.domain.Course;
import xyz.playedu.api.domain.CourseDepartment;
import xyz.playedu.api.exception.NotFoundException;
import xyz.playedu.api.service.CourseDepartmentService;
import xyz.playedu.api.service.CourseService;
import xyz.playedu.api.mapper.CourseMapper;
import org.springframework.stereotype.Service;
import xyz.playedu.api.service.internal.ResourceCourseCategoryService;
import xyz.playedu.api.types.paginate.CoursePaginateFiler;
import xyz.playedu.api.types.paginate.PaginationResult;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author tengteng
* @description 针对表【courses】的数据库操作Service实现
* @createDate 2023-02-24 14:14:01
*/
@Service
@Slf4j
public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> implements CourseService {
@Autowired
private CourseDepartmentService courseDepartmentService;
@Autowired
private ResourceCourseCategoryService courseCategoryService;
@Override
public PaginationResult<Course> paginate(int page, int size, CoursePaginateFiler filter) {
filter.setPageStart((page - 1) * size);
filter.setPageSize(size);
PaginationResult<Course> pageResult = new PaginationResult<>();
pageResult.setData(getBaseMapper().paginate(filter));
pageResult.setTotal(getBaseMapper().paginateCount(filter));
return pageResult;
}
@Override
@Transactional
public Course createWithCategoryIdsAndDepIds(String title, String thumb, String shortDesc, Integer isRequired, Integer isShow, Integer[] categoryIds, Integer[] depIds) {
// 创建课程
Course course = new Course();
course.setTitle(title);
course.setThumb(thumb);
course.setShortDesc(shortDesc);
course.setIsShow(isShow);
course.setIsRequired(isRequired);
course.setCreatedAt(new Date());
course.setUpdatedAt(new Date());
save(course);
// 关联分类
relateCategories(course, categoryIds);
// 关联部门
relateDepartments(course, depIds);
return course;
}
@Override
public void relateDepartments(Course course, Integer[] depIds) {
if (depIds == null || depIds.length == 0) {
return;
}
List<CourseDepartment> courseDepartments = new ArrayList<>();
for (int i = 0; i < depIds.length; i++) {
Integer tmpDepId = depIds[i];
courseDepartments.add(new CourseDepartment() {{
setCourseId(course.getId());
setDepId(tmpDepId);
}});
}
courseDepartmentService.saveBatch(courseDepartments);
}
@Override
public void resetRelateDepartments(Course course, Integer[] depIds) {
courseDepartmentService.removeByCourseId(course.getId());
relateDepartments(course, depIds);
}
@Override
public void relateCategories(Course course, Integer[] categoryIds) {
if (categoryIds == null || categoryIds.length == 0) {
return;
}
List<ResourceCourseCategory> resourceCourseCategories = new ArrayList<>();
for (int i = 0; i < categoryIds.length; i++) {
Integer tmpCategoryId = categoryIds[i];
resourceCourseCategories.add(new ResourceCourseCategory() {{
setCategoryId(tmpCategoryId);
setCourseId(course.getId());
}});
}
courseCategoryService.saveBatch(resourceCourseCategories);
}
@Override
public void resetRelateCategories(Course course, Integer[] categoryIds) {
courseCategoryService.removeByCourseId(course.getId());
relateCategories(course, categoryIds);
}
@Override
@Transactional
public void updateWithCategoryIdsAndDepIds(Course course, String title, String thumb, String shortDesc, Integer isRequired, Integer isShow, Integer[] categoryIds, Integer[] depIds) {
Course newCourse = new Course();
newCourse.setId(course.getId());
newCourse.setTitle(title);
newCourse.setThumb(thumb);
newCourse.setIsShow(isShow);
newCourse.setIsRequired(isRequired);
newCourse.setShortDesc(shortDesc);
updateById(newCourse);
resetRelateCategories(newCourse, categoryIds);
resetRelateDepartments(newCourse, depIds);
}
@Override
public Course findOrFail(Integer id) throws NotFoundException {
Course course = getOne(query().getWrapper().eq("id", id));
if (course == null) {
throw new NotFoundException("课程不存在");
}
return course;
}
@Override
public List<Integer> getDepIdsByCourseId(Integer courseId) {
return courseDepartmentService.getDepIdsByCourseId(courseId);
}
@Override
public List<Integer> getCategoryIdsByCourseId(Integer courseId) {
return courseCategoryService.getCategoryIdsByCourseId(courseId);
}
@Override
public void updateClassHour(Integer courseId, Integer classHour) {
Course course = new Course();
course.setId(courseId);
course.setClassHour(classHour);
updateById(course);
}
@Override
public void removeCategoryIdRelate(Integer categoryId) {
courseCategoryService.removeByCategoryId(categoryId);
}
@Override
public List<Course> chunks(List<Integer> ids, List<String> fields) {
return list(query().getWrapper().in("id", ids).select(fields));
}
@Override
public List<Course> chunks(List<Integer> ids) {
return list(query().getWrapper().in("id", ids));
}
@Override
public List<Course> getOpenCoursesAndShow(Integer limit) {
return getBaseMapper().openCoursesAndShow(limit);
}
@Override
public List<Course> getDepCoursesAndShow(List<Integer> depIds) {
return list(query().getWrapper().in("id", courseDepartmentService.getCourseIdsByDepIds(depIds)).eq("is_show", 1));
}
@Override
public Map<Integer, List<Integer>> getCategoryIdsGroup(List<Integer> courseIds) {
Map<Integer, List<ResourceCourseCategory>> data = courseCategoryService
.list(courseCategoryService.query().getWrapper().in("course_id", courseIds))
.stream()
.collect(Collectors.groupingBy(ResourceCourseCategory::getCourseId));
Map<Integer, List<Integer>> result = new HashMap<>();
data.forEach((courseId, records) -> {
result.put(courseId, records.stream().map(ResourceCourseCategory::getCategoryId).toList());
});
return result;
}
@Override
public Map<Integer, List<Integer>> getDepIdsGroup(List<Integer> courseIds) {
Map<Integer, List<CourseDepartment>> data = courseDepartmentService
.list(courseDepartmentService.query().getWrapper().in("course_id", courseIds))
.stream()
.collect(Collectors.groupingBy(CourseDepartment::getCourseId));
log.info("data {}", data);
Map<Integer, List<Integer>> result = new HashMap<>();
data.forEach((courseId, records) -> {
result.put(courseId, records.stream().map(CourseDepartment::getDepId).toList());
});
return result;
}
}