489 lines
22 KiB
Java
489 lines
22 KiB
Java
|
|
package com.upchina.course.service;
|
||
|
|
|
||
|
|
import cn.hutool.core.collection.CollUtil;
|
||
|
|
import cn.hutool.core.util.StrUtil;
|
||
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||
|
|
import com.hazelcast.map.IMap;
|
||
|
|
import com.upchina.advisor.entity.AdvisorBasic;
|
||
|
|
import com.upchina.advisor.service.AdvisorInfoService;
|
||
|
|
import com.upchina.common.config.cache.CacheKey;
|
||
|
|
import com.upchina.common.constant.IsDisplay;
|
||
|
|
import com.upchina.common.constant.IsRecommend;
|
||
|
|
import com.upchina.common.handler.BizException;
|
||
|
|
import com.upchina.common.query.OnlyIdQuery;
|
||
|
|
import com.upchina.common.result.AppPager;
|
||
|
|
import com.upchina.common.result.Pager;
|
||
|
|
import com.upchina.common.result.ResponseStatus;
|
||
|
|
import com.upchina.common.service.AppUserService;
|
||
|
|
import com.upchina.common.service.CacheService;
|
||
|
|
import com.upchina.common.service.SensitiveWordService;
|
||
|
|
import com.upchina.common.state.StateMachine;
|
||
|
|
import com.upchina.common.vo.BackendUserVO;
|
||
|
|
import com.upchina.common.vo.FrontUserVO;
|
||
|
|
import com.upchina.common.vo.InsertIdVO;
|
||
|
|
import com.upchina.course.constant.*;
|
||
|
|
import com.upchina.course.entity.CoursePackage;
|
||
|
|
import com.upchina.course.entity.CoursePackageContent;
|
||
|
|
import com.upchina.course.entity.CourseSortEntity;
|
||
|
|
import com.upchina.course.mapper.CoursePackageContentMapper;
|
||
|
|
import com.upchina.course.mapper.CoursePackageMapper;
|
||
|
|
import com.upchina.course.query.*;
|
||
|
|
import com.upchina.course.vo.CoursePackageContentVO;
|
||
|
|
import com.upchina.course.vo.CoursePackageVO;
|
||
|
|
import com.upchina.course.vo.CourseVO;
|
||
|
|
import com.upchina.course.vo.SerialVO;
|
||
|
|
import com.upchina.rbac.entity.UserDept;
|
||
|
|
import com.upchina.rbac.service.AuthService;
|
||
|
|
import com.upchina.rbac.service.UserService;
|
||
|
|
import com.upchina.video.constant.VideoUserType;
|
||
|
|
import org.springframework.stereotype.Service;
|
||
|
|
import org.springframework.transaction.annotation.Transactional;
|
||
|
|
|
||
|
|
import javax.annotation.Resource;
|
||
|
|
import java.time.LocalDateTime;
|
||
|
|
import java.util.*;
|
||
|
|
import java.util.stream.Collectors;
|
||
|
|
import java.util.stream.Stream;
|
||
|
|
|
||
|
|
// 课程Service
|
||
|
|
@Service
|
||
|
|
public class CoursePackageService {
|
||
|
|
|
||
|
|
@Resource
|
||
|
|
private CoursePackageMapper coursePackageMapper;
|
||
|
|
|
||
|
|
@Resource
|
||
|
|
private SensitiveWordService sensitiveWordService;
|
||
|
|
|
||
|
|
@Resource
|
||
|
|
private StateMachine<CoursePackageStatus> coursePackageSM;
|
||
|
|
|
||
|
|
@Resource
|
||
|
|
private AdvisorInfoService advisorInfoService;
|
||
|
|
|
||
|
|
@Resource
|
||
|
|
private UserService userService;
|
||
|
|
|
||
|
|
@Resource
|
||
|
|
private CoursePackageContentMapper coursePackageContentMapper;
|
||
|
|
|
||
|
|
@Resource
|
||
|
|
private SerialService serialService;
|
||
|
|
|
||
|
|
@Resource
|
||
|
|
private CourseService courseService;
|
||
|
|
|
||
|
|
@Resource
|
||
|
|
private CacheService cacheService;
|
||
|
|
|
||
|
|
@Resource
|
||
|
|
private AuthService authService;
|
||
|
|
|
||
|
|
@Resource
|
||
|
|
private PageService pageService;
|
||
|
|
|
||
|
|
@Resource
|
||
|
|
private CourseCommonService courseCommonService;
|
||
|
|
|
||
|
|
@Resource
|
||
|
|
private AppUserService appUserService;
|
||
|
|
|
||
|
|
@Resource
|
||
|
|
private IMap<String, Object> courseCache;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 保存课程
|
||
|
|
*
|
||
|
|
* @param query 保存课程参数
|
||
|
|
* @param backendUserVO 后台用户
|
||
|
|
* @return 课程ID
|
||
|
|
*/
|
||
|
|
@Transactional(rollbackFor = Exception.class)
|
||
|
|
public InsertIdVO save(SaveCoursePackageQuery query, BackendUserVO backendUserVO) {
|
||
|
|
sensitiveWordService.check(query.getName(), query.getRemark());
|
||
|
|
Integer advisorId = courseCommonService.getAdvisorId(query.getAdvisorId(), backendUserVO);
|
||
|
|
CoursePackage coursePackage = query.toPO(backendUserVO, advisorId);
|
||
|
|
coursePackageMapper.insert(coursePackage);
|
||
|
|
return new InsertIdVO(coursePackage.getId());
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 更新课程
|
||
|
|
*
|
||
|
|
* @param query 更新课程参数
|
||
|
|
* @param backendUserVO 后台用户
|
||
|
|
*/
|
||
|
|
@Transactional(rollbackFor = Exception.class)
|
||
|
|
public void update(UpdateCoursePackageQuery query, BackendUserVO backendUserVO) {
|
||
|
|
sensitiveWordService.check(query.getName(), query.getRemark());
|
||
|
|
CoursePackage coursePackageInDB = coursePackageMapper.selectById(query.getId());
|
||
|
|
if (coursePackageInDB == null) {
|
||
|
|
throw new BizException(ResponseStatus.ID_NOT_EXIST_ERROR);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 状态机扭转,判断是否能够编辑
|
||
|
|
CoursePackageStatus dbStatus = CoursePackageStatus.fromValue(coursePackageInDB.getStatus());
|
||
|
|
coursePackageSM.send(dbStatus, CoursePackageStatus.EVENT_UPDATE);
|
||
|
|
|
||
|
|
CoursePackage coursePackage = query.toPO(backendUserVO);
|
||
|
|
coursePackageMapper.updateById(coursePackage);
|
||
|
|
clearCache(query.getId());
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 更新课程状态
|
||
|
|
*
|
||
|
|
* @param query 更新课程状态参数
|
||
|
|
* @param backendUserVO 后台用户
|
||
|
|
*/
|
||
|
|
@Transactional(rollbackFor = Exception.class)
|
||
|
|
public void updateStatus(UpdateCoursePackageStatusQuery query, BackendUserVO backendUserVO) {
|
||
|
|
CoursePackage coursePackageInDB = coursePackageMapper.selectById(query.getId());
|
||
|
|
if (coursePackageInDB == null) {
|
||
|
|
throw new BizException(ResponseStatus.ID_NOT_EXIST_ERROR);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 状态机扭转
|
||
|
|
CoursePackageStatus dbStatus = CoursePackageStatus.fromValue(coursePackageInDB.getStatus());
|
||
|
|
CoursePackageStatus targetStatus = coursePackageSM.send(dbStatus, CoursePackageStatus.fromValue(query.getEvent()));
|
||
|
|
|
||
|
|
CoursePackage coursePackage = query.toPO(targetStatus, backendUserVO);
|
||
|
|
coursePackageMapper.updateById(coursePackage);
|
||
|
|
clearCache(query.getId());
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 查询课程列表
|
||
|
|
*
|
||
|
|
* @param query 查询参数
|
||
|
|
* @param backendUserVO 后台用户
|
||
|
|
* @return 课程列表
|
||
|
|
*/
|
||
|
|
public Pager<CoursePackageVO> list(ListCoursePackageQuery query, BackendUserVO backendUserVO) {
|
||
|
|
String name = query.getName();
|
||
|
|
Integer status = query.getStatus();
|
||
|
|
Integer userType = query.getUserType();
|
||
|
|
Integer contentType = query.getContentType();
|
||
|
|
Integer contentId = query.getContentId();
|
||
|
|
Integer advisorId = query.getAdvisorId();
|
||
|
|
|
||
|
|
Set<Integer> authSet = authService.getAuthByUserType(VideoUserType.format(userType), backendUserVO, true);
|
||
|
|
if (authSet != null && authSet.isEmpty()) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
LambdaQueryWrapper<CoursePackage> wrapper = Wrappers.<CoursePackage>lambdaQuery()
|
||
|
|
.in(CollUtil.isNotEmpty(authSet), CoursePackage::getAdvisorId, authSet)
|
||
|
|
.eq(advisorId != null && advisorId != 0, CoursePackage::getAdvisorId, advisorId)
|
||
|
|
.like(StrUtil.isNotEmpty(name), CoursePackage::getName, name)
|
||
|
|
.eq(status != null && status != 0, CoursePackage::getStatus, status)
|
||
|
|
.exists(contentType != null && contentId != null,
|
||
|
|
"select 0 from course_package_content where course_package_content.course_package_id = course_package.id and course_package_content.type = {0} and course_package_content.content_id = {1}",
|
||
|
|
contentType, contentId)
|
||
|
|
.ne(!VideoUserType.MANAGER_USER.value.equals(userType), CoursePackage::getStatus, CoursePackageStatus.DELETED.value)
|
||
|
|
.orderByDesc(CoursePackage::getId);
|
||
|
|
Page<CoursePackage> page = coursePackageMapper.selectPage(query.toPage(), wrapper);
|
||
|
|
Map<Integer, String> advisorNameMap = advisorInfoService.getAdvisorMap().values().stream()
|
||
|
|
.collect(Collectors.toMap(AdvisorBasic::getId, AdvisorBasic::getName));
|
||
|
|
Map<Integer, String> userNameMap = userService.getUserMap().values().stream()
|
||
|
|
.collect(Collectors.toMap(UserDept::getUserId, UserDept::getName));
|
||
|
|
List<CoursePackageVO> list = page.getRecords().stream().map(coursePackage -> new CoursePackageVO(
|
||
|
|
coursePackage,
|
||
|
|
advisorNameMap.get(coursePackage.getAdvisorId()),
|
||
|
|
userNameMap.get(coursePackage.getCreateUserId()),
|
||
|
|
userNameMap.get(coursePackage.getAuditUserId()),
|
||
|
|
pageService.getForApp(coursePackage.getPageId()),
|
||
|
|
getContentCount(coursePackage.getId())
|
||
|
|
)).collect(Collectors.toList());
|
||
|
|
return new Pager<>(list, page.getTotal());
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 查询课程详情
|
||
|
|
*
|
||
|
|
* @param query 查询参数
|
||
|
|
* @param backendUserVO 后台用户
|
||
|
|
* @return 课程详情
|
||
|
|
*/
|
||
|
|
public CoursePackageVO get(OnlyIdQuery query, BackendUserVO backendUserVO) {
|
||
|
|
Integer id = query.getId();
|
||
|
|
CoursePackage coursePackage = getEntity(id, backendUserVO);
|
||
|
|
if (coursePackage == null) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
Map<Integer, String> advisorNameMap = advisorInfoService.getAdvisorMap().values().stream()
|
||
|
|
.collect(Collectors.toMap(AdvisorBasic::getId, AdvisorBasic::getName));
|
||
|
|
Map<Integer, String> userNameMap = userService.getUserMap().values().stream()
|
||
|
|
.collect(Collectors.toMap(UserDept::getUserId, UserDept::getName));
|
||
|
|
return new CoursePackageVO(
|
||
|
|
coursePackage,
|
||
|
|
advisorNameMap.get(coursePackage.getAdvisorId()),
|
||
|
|
userNameMap.get(coursePackage.getCreateUserId()),
|
||
|
|
userNameMap.get(coursePackage.getAuditUserId()),
|
||
|
|
coursePackage.getPageId() == null ? null : pageService.get(new OnlyIdQuery(coursePackage.getPageId()), null),
|
||
|
|
getContentCount(id));
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 查询课程内容列表
|
||
|
|
*
|
||
|
|
* @param query 查询参数
|
||
|
|
* @param backendUserVO 后台用户
|
||
|
|
*/
|
||
|
|
public Pager<CoursePackageContentVO> listContent(ListCoursePackageContentQuery query, BackendUserVO backendUserVO) {
|
||
|
|
// 不使用返回值,仅校验课程是否存在以及数据权限
|
||
|
|
if (getEntity(query.getCoursePackageId(), backendUserVO) == null) {
|
||
|
|
throw new BizException(ResponseStatus.ID_NOT_EXIST_ERROR);
|
||
|
|
}
|
||
|
|
Integer type = query.getType();
|
||
|
|
LambdaQueryWrapper<CoursePackageContent> wrapper = Wrappers.<CoursePackageContent>lambdaQuery()
|
||
|
|
.eq(CoursePackageContent::getCoursePackageId, query.getCoursePackageId())
|
||
|
|
.eq(type != null && type != 0, CoursePackageContent::getType, type)
|
||
|
|
.orderByDesc(CoursePackageContent::getIsRecommend, CoursePackageContent::getCreateTime);
|
||
|
|
Page<CoursePackageContent> page = coursePackageContentMapper.selectPage(query.toPage(), wrapper);
|
||
|
|
List<CoursePackageContentVO> list = page.getRecords().stream().map(content -> {
|
||
|
|
if (CoursePackageContentType.SERIAL.value.equals(content.getType())) {
|
||
|
|
SerialVO serial = serialService.get(new OnlyIdQuery(content.getContentId()), null);
|
||
|
|
return new CoursePackageContentVO(content, serial);
|
||
|
|
} else if (CoursePackageContentType.COURSE.value.equals(content.getType())) {
|
||
|
|
CourseVO course = courseService.get(new OnlyIdQuery(content.getContentId()), null);
|
||
|
|
return new CoursePackageContentVO(content, course);
|
||
|
|
}
|
||
|
|
return null;
|
||
|
|
}).filter(Objects::nonNull).collect(Collectors.toList());
|
||
|
|
return new Pager<>(list, page.getTotal());
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 更新课程内容
|
||
|
|
*
|
||
|
|
* @param query 更新课程内容参数
|
||
|
|
* @param backendUserVO 后台用户
|
||
|
|
*/
|
||
|
|
@Transactional(rollbackFor = Exception.class)
|
||
|
|
public void updateContent(UpdateCoursePackageContentQuery query, BackendUserVO backendUserVO) {
|
||
|
|
// 不使用返回值,仅校验课程是否存在以及数据权限
|
||
|
|
if (getEntity(query.getCoursePackageId(), backendUserVO) == null) {
|
||
|
|
throw new BizException(ResponseStatus.ID_NOT_EXIST_ERROR);
|
||
|
|
}
|
||
|
|
// 构造查询条件
|
||
|
|
LambdaQueryWrapper<CoursePackageContent> wrapper = Wrappers.<CoursePackageContent>lambdaQuery()
|
||
|
|
.eq(CoursePackageContent::getCoursePackageId, query.getCoursePackageId())
|
||
|
|
.eq(CoursePackageContent::getType, query.getType())
|
||
|
|
.eq(CoursePackageContent::getContentId, query.getContentId());
|
||
|
|
UpdateContentEvent event = UpdateContentEvent.fromValue(query.getEvent());
|
||
|
|
switch (event) {
|
||
|
|
case SAVE:
|
||
|
|
saveContentList(query.getCoursePackageId(), query.getType(), query.toContentListPO(), event);
|
||
|
|
break;
|
||
|
|
case RECOMMEND:
|
||
|
|
if (query.getIsRecommend() == null || IsRecommend.NO.value.equals(query.getIsRecommend())) {
|
||
|
|
throw new BizException(ResponseStatus.PARM_ERROR, "权重值错误");
|
||
|
|
}
|
||
|
|
CoursePackageContent recommendContent = new CoursePackageContent();
|
||
|
|
recommendContent.setIsRecommend(query.getIsRecommend());
|
||
|
|
coursePackageContentMapper.update(recommendContent, wrapper);
|
||
|
|
break;
|
||
|
|
case UN_RECOMMEND:
|
||
|
|
CoursePackageContent unRecommendContent = new CoursePackageContent();
|
||
|
|
unRecommendContent.setIsRecommend(IsRecommend.NO.value);
|
||
|
|
coursePackageContentMapper.update(unRecommendContent, wrapper);
|
||
|
|
break;
|
||
|
|
case ADD:
|
||
|
|
saveContentList(query.getCoursePackageId(), query.getType(), query.toContentListPO(), event);
|
||
|
|
break;
|
||
|
|
case DELETE:
|
||
|
|
saveContentList(query.getCoursePackageId(), query.getType(), Collections.singletonList(query.toContentPO()), event);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
clearCache(query.getCoursePackageId());
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* APP端查询课程详情
|
||
|
|
*
|
||
|
|
* @param query 查询参数
|
||
|
|
* @param frontUserVO 前台用户
|
||
|
|
* @return 课程详情
|
||
|
|
*/
|
||
|
|
public CoursePackageVO getForApp(OnlyIdQuery query, FrontUserVO frontUserVO) {
|
||
|
|
CoursePackageVO vo = cacheService.get(courseCache, CacheKey.CourseKey.COURSE_PACKAGE + query.getId(), () -> get(query, null));
|
||
|
|
if (vo == null) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
// 防止落地页修改后,未更新缓存
|
||
|
|
if (vo.getPage() != null) {
|
||
|
|
vo.setPage(pageService.getForApp(vo.getPage().getId()));
|
||
|
|
}
|
||
|
|
if (frontUserVO != null) {
|
||
|
|
vo.setAuthResult(appUserService.checkAuth(vo.getAuthorityId(), frontUserVO));
|
||
|
|
}
|
||
|
|
return vo;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* APP端查询课程内容列表
|
||
|
|
*
|
||
|
|
* @param query 查询参数
|
||
|
|
* @param frontUserVO 前台用户
|
||
|
|
* @return 课程内容列表
|
||
|
|
*/
|
||
|
|
public List<CoursePackageContentVO> listContentForApp(OnlyIdQuery query, FrontUserVO frontUserVO) {
|
||
|
|
if (frontUserVO != null) {
|
||
|
|
CoursePackageVO vo = getForApp(query, frontUserVO);
|
||
|
|
if (vo == null) {
|
||
|
|
throw new BizException(ResponseStatus.ID_NOT_EXIST_ERROR);
|
||
|
|
}
|
||
|
|
if (vo.getAuthResult() != null && !vo.getAuthResult().getAuth()) {
|
||
|
|
throw new BizException(ResponseStatus.NOT_PRODUCT_AUTH);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return cacheService.get(CacheKey.COURSE, CacheKey.CourseKey.COURSE_PACKAGE_CONTENT + query.getId(), () -> {
|
||
|
|
ListCoursePackageContentQuery contentQuery = new ListCoursePackageContentQuery();
|
||
|
|
contentQuery.setCoursePackageId(query.getId());
|
||
|
|
contentQuery.setCurrent(1);
|
||
|
|
contentQuery.setSize(10000);
|
||
|
|
List<CoursePackageContentVO> list = listContent(contentQuery, null).getList();
|
||
|
|
// 过滤合集状态
|
||
|
|
return list.stream()
|
||
|
|
.filter(content ->
|
||
|
|
(content.getSerial() != null && SerialStatus.AUDITED.value.equals(content.getSerial().getStatus())) ||
|
||
|
|
(content.getCourse() != null && CourseStatus.AUDITED.value.equals(content.getCourse().getStatus())))
|
||
|
|
.collect(Collectors.toList());
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* APP端查询课程列表
|
||
|
|
*
|
||
|
|
* @param query 查询参数
|
||
|
|
* @return 课程列表
|
||
|
|
*/
|
||
|
|
public AppPager<CoursePackageVO> listForApp(ListCourseAppQuery query) {
|
||
|
|
Integer id = query.getId();
|
||
|
|
Integer lastId = query.getLastId();
|
||
|
|
LocalDateTime lastPublishTime = query.getLastPublishTime();
|
||
|
|
Integer lastWeight = query.getLastWeight();
|
||
|
|
Integer size = query.getSize();
|
||
|
|
NavigableSet<CourseSortEntity> sortedSet = cacheService.get(courseCache, CacheKey.CourseKey.MAIN_COURSE_LIST + id, () -> {
|
||
|
|
LambdaQueryWrapper<CoursePackage> wrapper = Wrappers.<CoursePackage>lambdaQuery()
|
||
|
|
.eq(CoursePackage::getAdvisorId, id)
|
||
|
|
.eq(CoursePackage::getStatus, CoursePackageStatus.AUDITED.value)
|
||
|
|
.eq(CoursePackage::getIsDisplay, IsDisplay.YES.value)
|
||
|
|
.orderByDesc(CoursePackage::getIsRecommend, CoursePackage::getAuditTime);
|
||
|
|
List<CoursePackage> list = coursePackageMapper.selectList(wrapper);
|
||
|
|
NavigableSet<CourseSortEntity> set = new TreeSet<>();
|
||
|
|
list.stream().map(CourseSortEntity::new).forEach(set::add);
|
||
|
|
return set;
|
||
|
|
});
|
||
|
|
CourseSortEntity lastEntity = lastId == null || lastWeight == null || lastPublishTime == null ? null : new CourseSortEntity(lastId, lastWeight, lastPublishTime);
|
||
|
|
if (lastEntity != null) {
|
||
|
|
sortedSet = sortedSet.tailSet(lastEntity, false);
|
||
|
|
}
|
||
|
|
List<CoursePackageVO> voList = new ArrayList<>(size);
|
||
|
|
Iterator<CourseSortEntity> iterator = sortedSet.iterator();
|
||
|
|
while (iterator.hasNext() && voList.size() < size) {
|
||
|
|
CourseSortEntity entity = iterator.next();
|
||
|
|
CoursePackageVO vo = getForApp(new OnlyIdQuery(entity.getId()), null);
|
||
|
|
if (vo != null) {
|
||
|
|
voList.add(vo);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return new AppPager<>(voList, iterator.hasNext());
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 设置首页权重
|
||
|
|
*
|
||
|
|
* @param query 查询参数
|
||
|
|
* @param backendUserVO 后台用户
|
||
|
|
*/
|
||
|
|
public void setMainPageParam(SetMainPageQuery query, BackendUserVO backendUserVO) {
|
||
|
|
// 不使用返回值,仅校验课程是否存在以及数据权限
|
||
|
|
if (getEntity(query.getId(), backendUserVO) == null) {
|
||
|
|
throw new BizException(ResponseStatus.ID_NOT_EXIST_ERROR);
|
||
|
|
}
|
||
|
|
CoursePackage coursePackage = query.toCoursePackagePO();
|
||
|
|
coursePackageMapper.updateById(coursePackage);
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 清除缓存
|
||
|
|
*
|
||
|
|
* @param id 课程ID
|
||
|
|
*/
|
||
|
|
private void clearCache(Integer id) {
|
||
|
|
courseCache.delete(CacheKey.CourseKey.COURSE_PACKAGE + id);
|
||
|
|
courseCache.delete(CacheKey.CourseKey.COURSE_PACKAGE_CONTENT + id);
|
||
|
|
}
|
||
|
|
|
||
|
|
private CoursePackage getEntity(Integer id, BackendUserVO backendUserVO) {
|
||
|
|
CoursePackage coursePackage = coursePackageMapper.selectById(id);
|
||
|
|
if (coursePackage == null) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
courseCommonService.checkAdvisorId(coursePackage.getAdvisorId(), backendUserVO);
|
||
|
|
return coursePackage;
|
||
|
|
}
|
||
|
|
|
||
|
|
private Integer getContentCount(Integer coursePackageId) {
|
||
|
|
LambdaQueryWrapper<CoursePackageContent> wrapper = Wrappers.<CoursePackageContent>lambdaQuery()
|
||
|
|
.eq(CoursePackageContent::getCoursePackageId, coursePackageId);
|
||
|
|
List<CoursePackageContent> list = coursePackageContentMapper.selectList(wrapper);
|
||
|
|
return list.stream().mapToInt(content -> {
|
||
|
|
if (CoursePackageContentType.SERIAL.value.equals(content.getType())) {
|
||
|
|
return serialService.getContentCount(content.getContentId());
|
||
|
|
} else if (CoursePackageContentType.COURSE.value.equals(content.getType())) {
|
||
|
|
return courseService.getContentCount(content.getContentId());
|
||
|
|
} else {
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
}).sum();
|
||
|
|
}
|
||
|
|
|
||
|
|
private void saveContentList(Integer coursePackageId, Integer contentType, List<CoursePackageContent> contentListPO, UpdateContentEvent event) {
|
||
|
|
LambdaQueryWrapper<CoursePackageContent> wrapper = Wrappers.<CoursePackageContent>lambdaQuery()
|
||
|
|
.select(CoursePackageContent::getContentId)
|
||
|
|
.eq(CoursePackageContent::getCoursePackageId, coursePackageId)
|
||
|
|
.eq(CoursePackageContent::getType, contentType);
|
||
|
|
List<CoursePackageContent> existContentList = coursePackageContentMapper.selectList(wrapper);
|
||
|
|
Set<Integer> existContentIdSet = existContentList.stream().map(CoursePackageContent::getContentId).collect(Collectors.toSet());
|
||
|
|
if (UpdateContentEvent.SAVE.equals(event) || UpdateContentEvent.ADD.equals(event)) {
|
||
|
|
// 添加新增的
|
||
|
|
List<CoursePackageContent> contentList = contentListPO.stream().filter(content -> !existContentIdSet.contains(content.getContentId())).collect(Collectors.toList());
|
||
|
|
if (CollUtil.isNotEmpty(contentList)) {
|
||
|
|
coursePackageContentMapper.insertBatchSomeColumn(contentList);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (UpdateContentEvent.SAVE.equals(event) || UpdateContentEvent.DELETE.equals(event)) {
|
||
|
|
Stream<CoursePackageContent> contentStream = Stream.empty();
|
||
|
|
if (UpdateContentEvent.SAVE.equals(event)) {
|
||
|
|
// 删除多余的
|
||
|
|
Set<Integer> contentIdSet = contentListPO.stream().map(CoursePackageContent::getContentId).collect(Collectors.toSet());
|
||
|
|
contentStream = existContentList.stream().filter(content -> !contentIdSet.contains(content.getContentId()));
|
||
|
|
} else if (UpdateContentEvent.DELETE.equals(event)) {
|
||
|
|
// 删除传入的
|
||
|
|
contentStream = contentListPO.stream();
|
||
|
|
}
|
||
|
|
contentStream.forEach(content -> {
|
||
|
|
LambdaQueryWrapper<CoursePackageContent> deleteWrapper = Wrappers.<CoursePackageContent>lambdaQuery()
|
||
|
|
.eq(CoursePackageContent::getCoursePackageId, coursePackageId)
|
||
|
|
.eq(CoursePackageContent::getContentId, content.getContentId())
|
||
|
|
.eq(CoursePackageContent::getType, contentType);
|
||
|
|
coursePackageContentMapper.delete(deleteWrapper);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
refreshUpdateTime(coursePackageId);
|
||
|
|
}
|
||
|
|
|
||
|
|
public void refreshUpdateTime(Integer coursePackageId) {
|
||
|
|
CoursePackage coursePackage = new CoursePackage();
|
||
|
|
coursePackage.setId(coursePackageId);
|
||
|
|
coursePackage.setUpdateTime(LocalDateTime.now());
|
||
|
|
coursePackageMapper.updateById(coursePackage);
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|