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 implements CourseService { @Autowired private CourseDepartmentService courseDepartmentService; @Autowired private ResourceCourseCategoryService courseCategoryService; @Override public PaginationResult paginate(int page, int size, CoursePaginateFiler filter) { filter.setPageStart((page - 1) * size); filter.setPageSize(size); PaginationResult 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 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 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 getDepIdsByCourseId(Integer courseId) { return courseDepartmentService.getDepIdsByCourseId(courseId); } @Override public List 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 chunks(List ids, List fields) { return list(query().getWrapper().in("id", ids).select(fields)); } @Override public List chunks(List ids) { return list(query().getWrapper().in("id", ids)); } @Override public List getOpenCoursesAndShow(Integer limit) { return getBaseMapper().openCoursesAndShow(limit); } @Override public List getDepCoursesAndShow(List depIds) { return list(query().getWrapper().in("id", courseDepartmentService.getCourseIdsByDepIds(depIds)).eq("is_show", 1)); } @Override public Map> getCategoryIdsGroup(List courseIds) { Map> data = courseCategoryService .list(courseCategoryService.query().getWrapper().in("course_id", courseIds)) .stream() .collect(Collectors.groupingBy(ResourceCourseCategory::getCourseId)); Map> result = new HashMap<>(); data.forEach((courseId, records) -> { result.put(courseId, records.stream().map(ResourceCourseCategory::getCategoryId).toList()); }); return result; } @Override public Map> getDepIdsGroup(List courseIds) { Map> data = courseDepartmentService .list(courseDepartmentService.query().getWrapper().in("course_id", courseIds)) .stream() .collect(Collectors.groupingBy(CourseDepartment::getCourseId)); log.info("data {}", data); Map> result = new HashMap<>(); data.forEach((courseId, records) -> { result.put(courseId, records.stream().map(CourseDepartment::getDepId).toList()); }); return result; } }