2025-02-27 11:23:21 +08:00

156 lines
5.8 KiB
Java

package com.syzb.course.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists;
import com.hazelcast.map.IMap;
import com.syzb.advisor.service.AdvisorInfoService;
import com.syzb.advisor.vo.AdvisorBasicVO;
import com.syzb.common.config.cache.CacheKey;
import com.syzb.common.constant.IsDisplay;
import com.syzb.common.constant.ProductType;
import com.syzb.common.handler.BizException;
import com.syzb.common.query.OnlyIdQuery;
import com.syzb.common.result.ResponseStatus;
import com.syzb.common.service.CacheService;
import com.syzb.common.vo.BackendUserVO;
import com.syzb.course.entity.MainTab;
import com.syzb.course.mapper.MainTabMapper;
import com.syzb.course.query.MainTabQuery;
import com.syzb.course.query.SaveMainTabListQuery;
import com.syzb.course.vo.MainTabVO;
import com.syzb.rbac.service.AuthService;
import com.syzb.video.constant.VideoUserType;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class MainTabService {
@Resource
private MainTabMapper mainTabMapper;
@Resource
private AuthService authService;
@Resource
private AdvisorInfoService advisorInfoService;
@Resource
private CourseCommonService courseCommonService;
@Resource
private CacheService cacheService;
@Resource
private IMap<String, Object> courseCache;
private static final List<MainTabVO> defaultMainTabList;
static {
defaultMainTabList = Lists.newArrayList(
new MainTabVO(ProductType.VIDEO_SINGLE, "直播", 1, IsDisplay.YES.value),
// new MainTabVO(ProductType.SHORT_VIDEO, "短视频", 2, IsDisplay.YES.value),
new MainTabVO(ProductType.COURSE_SINGLE, "课程", 3, IsDisplay.YES.value),
// new MainTabVO(ProductType.LIVE, "图文", 4, IsDisplay.YES.value),
// new MainTabVO(ProductType.COURSE_PACKAGE, "甄选服务", 5, IsDisplay.YES.value)
new MainTabVO(ProductType.GROUP, "圈子", 6, IsDisplay.YES.value)
);
}
/**
* 保存首页Tab
*
* @param query 查询对象
* @param backendUserVO 后台用户
*/
@Transactional(rollbackFor = Exception.class)
public void save(SaveMainTabListQuery query, BackendUserVO backendUserVO) {
validateMainTabList(query);
// 全量删除
LambdaQueryWrapper<MainTab> wrapper = Wrappers.<MainTab>lambdaQuery()
.eq(MainTab::getAdvisorId, query.getAdvisorId());
mainTabMapper.delete(wrapper);
// 批量插入
Integer advisorId = courseCommonService.getAdvisorId(query.getAdvisorId(), backendUserVO);
List<MainTab> list = query.toPOList(advisorId);
mainTabMapper.insertBatchSomeColumn(list);
clearCache(advisorId);
}
/**
* 查询首页Tab列表
*
* @param query 查询对象
* @param backendUserVO 后台用户
* @return 首页Tab列表
*/
public List<MainTabVO> list(OnlyIdQuery query, BackendUserVO backendUserVO, Integer status) {
// 检查数据权限
courseCommonService.checkAdvisorId(query.getId(), backendUserVO);
LambdaQueryWrapper<MainTab> wrapper = Wrappers.<MainTab>lambdaQuery()
.eq(MainTab::getAdvisorId, query.getId())
.eq(status != null, MainTab::getStatus, status)
.orderByAsc(MainTab::getSort);
List<MainTab> list = mainTabMapper.selectList(wrapper);
// 如果没有配置,返回默认配置
if (list.isEmpty()) {
return defaultMainTabList;
}
return list.stream().map(MainTabVO::new).collect(Collectors.toList());
}
/**
* 查询投顾列表
*
* @param backendUserVO 后台用户
* @return 投顾列表
*/
public List<AdvisorBasicVO> listAdvisor(BackendUserVO backendUserVO) {
Set<Integer> authSet = authService.getAuthByUserType(VideoUserType.MANAGER_USER, backendUserVO, true);
if (authSet == null) {
return Collections.emptyList();
}
Map<Integer, AdvisorBasicVO> advisorVOMap = advisorInfoService.getAdvisorVoMap();
return authSet.stream().map(advisorVOMap::get).collect(Collectors.toList());
}
/**
* app查询首页Tab列表
*
* @param query 查询对象
* @return 首页Tab列表
*/
public List<MainTabVO> listForApp(OnlyIdQuery query) {
return cacheService.get(CacheKey.COURSE, CacheKey.CourseKey.MAIN_TAB + query.getId(), () -> list(query, null, IsDisplay.YES.value));
}
private void clearCache(Integer advisorId) {
courseCache.delete(CacheKey.CourseKey.MAIN_TAB + advisorId);
}
private void validateMainTabList(SaveMainTabListQuery query) {
// 校验sort字段是否重复
List<MainTabQuery> list = query.getTabList();
Set<Integer> sortSet = new HashSet<>();
for (MainTabQuery mainTabQuery : list) {
if (!sortSet.add(mainTabQuery.getSort())) {
throw new BizException(ResponseStatus.PARM_ERROR, "sort字段重复");
}
}
// 校验productType字段是否缺失
Set<Integer> productTypeSet = list.stream().map(MainTabQuery::getProductType).collect(Collectors.toSet());
Set<Integer> missingProductTypeSet = defaultMainTabList.stream()
.map(MainTabVO::getProductType)
.filter(p -> !productTypeSet.contains(p))
.collect(Collectors.toSet());
if (!missingProductTypeSet.isEmpty()) {
throw new BizException(ResponseStatus.PARM_ERROR, "缺少产品类型:" + missingProductTypeSet);
}
}
}