| | |
| | | package com.xinquan.meditation.service.impl; |
| | | |
| | | import com.xinquan.meditation.domain.Meditation; |
| | | import com.xinquan.meditation.mapper.MeditationMapper; |
| | | import com.xinquan.meditation.service.MeditationService; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.xinquan.common.core.constant.SecurityConstants; |
| | | import com.xinquan.common.core.enums.DisabledEnum; |
| | | import com.xinquan.common.core.exception.ServiceException; |
| | | import com.xinquan.common.core.utils.page.BeanUtils; |
| | | import com.xinquan.common.core.utils.page.CollUtils; |
| | | import com.xinquan.common.core.utils.page.PageDTO; |
| | | import com.xinquan.common.security.utils.SecurityUtils; |
| | | import com.xinquan.meditation.domain.Meditation; |
| | | import com.xinquan.meditation.domain.MeditationCategory; |
| | | import com.xinquan.meditation.domain.MeditationMusic; |
| | | import com.xinquan.meditation.domain.MeditationQuestion; |
| | | import com.xinquan.meditation.domain.MeditationQuestionLike; |
| | | import com.xinquan.meditation.domain.MeditationUserFavorite; |
| | | import com.xinquan.meditation.domain.vo.ClientMeditationAndCateVO; |
| | | import com.xinquan.meditation.domain.vo.ClientMeditationCategoryVO; |
| | | import com.xinquan.meditation.domain.vo.ClientMeditationDetailsVO; |
| | | import com.xinquan.meditation.domain.vo.ClientMeditationQuestionVO; |
| | | import com.xinquan.meditation.domain.vo.ClientMeditationVO; |
| | | import com.xinquan.meditation.mapper.MeditationCategoryMapper; |
| | | import com.xinquan.meditation.mapper.MeditationMapper; |
| | | import com.xinquan.meditation.mapper.MeditationMusicMapper; |
| | | import com.xinquan.meditation.mapper.MeditationQuestionMapper; |
| | | import com.xinquan.meditation.service.MeditationQuestionLikeService; |
| | | import com.xinquan.meditation.service.MeditationService; |
| | | import com.xinquan.meditation.service.MeditationUserFavoriteService; |
| | | import com.xinquan.user.api.domain.AppUser; |
| | | import com.xinquan.user.api.domain.dto.AppUserDTO; |
| | | import com.xinquan.user.api.feign.RemoteAppUserService; |
| | | import java.util.Arrays; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | import java.util.Optional; |
| | | import java.util.Set; |
| | | import java.util.function.Function; |
| | | import java.util.stream.Collectors; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | /** |
| | |
| | | * @since 2024-08-21 |
| | | */ |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class MeditationServiceImpl extends ServiceImpl<MeditationMapper, Meditation> implements MeditationService { |
| | | |
| | | private final RemoteAppUserService remoteAppUserService; |
| | | private final MeditationCategoryMapper meditationCategoryMapper; |
| | | private final MeditationMusicMapper meditationMusicMapper; |
| | | private final MeditationQuestionMapper meditationQuestionMapper; |
| | | private final MeditationQuestionLikeService meditationQuestionLikeService; |
| | | private final MeditationUserFavoriteService meditationUserFavoriteService; |
| | | |
| | | /** |
| | | * 获取私人订制 |
| | | * |
| | | * @return 冥想列表 |
| | | */ |
| | | @Override |
| | | public List<ClientMeditationVO> getPersonalityPlan() { |
| | | List<ClientMeditationVO> voList = null; |
| | | // 获取当前登录用户id |
| | | AppUser appUser = getCurrentUser(); |
| | | if (Optional.ofNullable(appUser.getTagId()).isPresent()) { |
| | | String tagId = appUser.getTagId(); |
| | | Integer sanskritFlag = appUser.getSanskritFlag(); |
| | | Set<Long> tagIdSet = Arrays.stream(tagId.split(",")).map(Long::parseLong) |
| | | .collect(Collectors.toSet()); |
| | | // 查询冥想列表 |
| | | voList = baseMapper.getMeditationListByTagId(tagIdSet, sanskritFlag); |
| | | } |
| | | return voList; |
| | | } |
| | | |
| | | /** |
| | | * 根据分类id获取冥想列表 |
| | | * |
| | | * @param cateId 分类id |
| | | * @return 冥想列表 |
| | | */ |
| | | @Override |
| | | public List<ClientMeditationVO> getMeditationListByCateId(Long cateId) { |
| | | List<ClientMeditationVO> voList = null; |
| | | // 获取当前登录用户id |
| | | AppUser appUser = getCurrentUser(); |
| | | // 查询 |
| | | List<Meditation> list = this.lambdaQuery().eq(Meditation::getCateId, cateId) |
| | | .eq(Meditation::getSanskrit, appUser.getSanskritFlag()) |
| | | .orderByDesc(Meditation::getSortNum).last("limit 8").list(); |
| | | if (CollUtils.isNotEmpty(list)) { |
| | | // 对象拷贝 |
| | | voList = BeanUtils.copyList(list, ClientMeditationVO.class); |
| | | } |
| | | return voList; |
| | | } |
| | | |
| | | /** |
| | | * 获取当前登录用户 |
| | | * |
| | | * @return AppUser |
| | | */ |
| | | private AppUser getCurrentUser() { |
| | | Long userId = SecurityUtils.getUserId(); |
| | | return remoteAppUserService.getUserByCondition( |
| | | AppUserDTO.builder().id(userId).build(), |
| | | SecurityConstants.INNER).getData(); |
| | | } |
| | | |
| | | /** |
| | | * 获取全部的冥想及分类列表 |
| | | * |
| | | * @return 冥想和分类列表 |
| | | */ |
| | | @Override |
| | | public List<ClientMeditationAndCateVO> getMeditationAndCateList() { |
| | | // 获取当前登录用户 |
| | | AppUser appUser = getCurrentUser(); |
| | | List<ClientMeditationAndCateVO> voList = CollUtils.newArrayList(); |
| | | // 查询分类列表 |
| | | List<MeditationCategory> cateList = meditationCategoryMapper.selectList( |
| | | Wrappers.lambdaQuery(MeditationCategory.class) |
| | | .orderByDesc(MeditationCategory::getSortNum)); |
| | | if (CollUtils.isNotEmpty(cateList)) { |
| | | for (MeditationCategory cate : cateList) { |
| | | ClientMeditationAndCateVO vo = new ClientMeditationAndCateVO(); |
| | | vo.setClientMeditationCategoryVO( |
| | | BeanUtils.copyBean(cateList, ClientMeditationCategoryVO.class)); |
| | | vo.setClientMeditationVOList(getMeditationListByCateId(cate.getId())); |
| | | voList.add(vo); |
| | | } |
| | | } |
| | | return voList; |
| | | } |
| | | |
| | | /** |
| | | * 根据分类id获取冥想列表-分页 |
| | | * |
| | | * @param cateId 分类id |
| | | * @param pageCurr 当前页码 |
| | | * @param pageSize 每页数量 |
| | | * @return 冥想列表 |
| | | */ |
| | | @Override |
| | | public PageDTO<ClientMeditationVO> getMeditationPageByCateId(Long cateId, Integer pageCurr, |
| | | Integer pageSize) { |
| | | PageDTO<ClientMeditationVO> pageDTO = PageDTO.empty(0L, 0L); |
| | | // 获取当前登录用户id |
| | | AppUser appUser = getCurrentUser(); |
| | | // 查询 |
| | | Page<Meditation> page = this.lambdaQuery().eq(Meditation::getCateId, cateId) |
| | | .eq(Meditation::getSanskrit, appUser.getSanskritFlag()) |
| | | .orderByDesc(Meditation::getSortNum) |
| | | .page(new Page<>(pageCurr, pageSize)); |
| | | // 如果没有查到数据直接返回 |
| | | if (Optional.ofNullable(page.getRecords()).isPresent()) { |
| | | return pageDTO; |
| | | } |
| | | // 将实体类转换为VO |
| | | pageDTO = PageDTO.of(page, ClientMeditationVO.class); |
| | | return pageDTO; |
| | | } |
| | | |
| | | /** |
| | | * 首页搜索首页 |
| | | * |
| | | * @param condition 搜索条件 |
| | | * @param pageCurr 当前页码 |
| | | * @param pageSize 每页数量 |
| | | * @return 冥想列表 |
| | | */ |
| | | @Override |
| | | public PageDTO<ClientMeditationVO> search(String condition, Integer pageCurr, |
| | | Integer pageSize) { |
| | | PageDTO<ClientMeditationVO> pageDTO = PageDTO.empty(0L, 0L); |
| | | // 获取当前登录用户id |
| | | AppUser appUser = getCurrentUser(); |
| | | // 查询 |
| | | Page<Meditation> page = this.lambdaQuery() |
| | | .like(Meditation::getMeditationTitle, condition).or() |
| | | .eq(Meditation::getSanskrit, appUser.getSanskritFlag()) |
| | | .orderByDesc(Meditation::getSortNum) |
| | | .page(new Page<>(pageCurr, pageSize)); |
| | | // 如果没有查到数据直接返回 |
| | | if (Optional.ofNullable(page.getRecords()).isPresent()) { |
| | | return pageDTO; |
| | | } |
| | | // 音频链接加密 |
| | | /* page.getRecords().forEach(meditation -> { |
| | | try { |
| | | meditation.setTutorAudioUrl(DES.encryptDES(meditation.getTutorAudioUrl())); |
| | | } catch (Exception e) { |
| | | throw new RuntimeException(e); |
| | | } |
| | | });*/ |
| | | // 将实体类转换为VO |
| | | pageDTO = PageDTO.of(page, ClientMeditationVO.class); |
| | | return pageDTO; |
| | | } |
| | | |
| | | /** |
| | | * 获取冥想音频详情 |
| | | * |
| | | * @param id 冥想音频id |
| | | * @return 客户端冥想详情视图对象 |
| | | */ |
| | | @Override |
| | | public ClientMeditationDetailsVO getMeditationDetails(Long id) { |
| | | // 查询冥想音频 |
| | | Meditation meditation = this.getById(id); |
| | | ClientMeditationDetailsVO vo = BeanUtils.copyBean(meditation, |
| | | ClientMeditationDetailsVO.class); |
| | | // 查询冥想音频 |
| | | List<MeditationMusic> meditationMusics = meditationMusicMapper.selectList( |
| | | Wrappers.lambdaQuery(MeditationMusic.class) |
| | | .eq(MeditationMusic::getMeditationId, id)); |
| | | if (CollUtils.isNotEmpty(meditationMusics)) { |
| | | // 获取音频链接 |
| | | List<String> musicUrlList = meditationMusics.stream() |
| | | .map(MeditationMusic::getMusicUrl).collect(Collectors.toList()); |
| | | vo.setMeditationMusicList(musicUrlList); |
| | | } |
| | | // 查询收藏记录 |
| | | vo.setFavorite(meditationUserFavoriteService.lambdaQuery() |
| | | .eq(MeditationUserFavorite::getMeditationId, id) |
| | | .eq(MeditationUserFavorite::getAppUserId, SecurityUtils.getUserId()) |
| | | .count() > 0 ? 1 : 2); |
| | | return vo; |
| | | } |
| | | |
| | | /** |
| | | * 收藏/取消收藏 |
| | | * |
| | | * @param id 冥想音频id |
| | | */ |
| | | @Override |
| | | public void favorite(Long id) { |
| | | Meditation meditation = this.getById(id); |
| | | if (Objects.isNull(meditation)) { |
| | | throw new ServiceException("该冥想音频不存在"); |
| | | } |
| | | // 查询收藏记录 |
| | | Optional<MeditationUserFavorite> userOperationOpt = meditationUserFavoriteService.lambdaQuery() |
| | | .eq(MeditationUserFavorite::getMeditationId, id) |
| | | .eq(MeditationUserFavorite::getAppUserId, SecurityUtils.getUserId()) |
| | | .last("limit 1").oneOpt(); |
| | | if (userOperationOpt.isPresent()) { |
| | | meditationUserFavoriteService.removeById(userOperationOpt.get()); |
| | | // 增加收藏数 |
| | | meditation.setFavoriteCount(meditation.getFavoriteCount() - 1); |
| | | } else { |
| | | // 增加收藏记录 |
| | | MeditationUserFavorite meditationUserFavorite = new MeditationUserFavorite(); |
| | | meditationUserFavorite.setMeditationId(id); |
| | | meditationUserFavorite.setAppUserId(SecurityUtils.getUserId()); |
| | | meditationUserFavoriteService.save(meditationUserFavorite); |
| | | // 减少收藏数 |
| | | meditation.setFavoriteCount(meditation.getFavoriteCount() + 1); |
| | | } |
| | | this.updateById(meditation); |
| | | } |
| | | |
| | | /** |
| | | * 获取冥想音频提问列表-分页 |
| | | * |
| | | * @param id 冥想音频id |
| | | * @param pageCurr 当前页码 |
| | | * @param pageSize 每页数量 |
| | | * @return 冥想音频提问分页列表 |
| | | */ |
| | | @Override |
| | | public PageDTO<ClientMeditationQuestionVO> getMeditationQuestionPage(Long id, |
| | | Integer pageCurr, Integer pageSize) { |
| | | // 查询冥想提问列表 |
| | | Page<MeditationQuestion> questionPage = meditationQuestionMapper.selectPage( |
| | | new Page<>(pageCurr, pageSize), |
| | | Wrappers.lambdaQuery(MeditationQuestion.class) |
| | | .eq(MeditationQuestion::getMeditationId, id) |
| | | .eq(MeditationQuestion::getShowFlag, DisabledEnum.YES) |
| | | .orderByDesc(MeditationQuestion::getPublishTime) |
| | | ); |
| | | |
| | | if (CollUtils.isEmpty(questionPage.getRecords())) { |
| | | return PageDTO.empty(questionPage); |
| | | } |
| | | |
| | | // 将 questionPage 转换为 PageDTO |
| | | PageDTO<ClientMeditationQuestionVO> pageDTO = PageDTO.of( |
| | | questionPage, ClientMeditationQuestionVO.class); |
| | | List<ClientMeditationQuestionVO> questionVOList = pageDTO.getList(); |
| | | |
| | | // 提取用户ID集合 |
| | | Set<Long> appUserIdSet = questionVOList.stream() |
| | | .map(ClientMeditationQuestionVO::getAppUserId) |
| | | .collect(Collectors.toSet()); |
| | | |
| | | // 远程调用,获取APP用户信息 |
| | | Map<Long, AppUser> appUserMap = Collections.emptyMap(); |
| | | if (!appUserIdSet.isEmpty()) { |
| | | List<AppUser> appUserList = remoteAppUserService.getAppUserList(appUserIdSet, |
| | | SecurityConstants.INNER) |
| | | .getData(); |
| | | appUserMap = appUserList.stream() |
| | | .collect(Collectors.toMap(AppUser::getId, Function.identity())); |
| | | } |
| | | |
| | | // 封装用户信息 |
| | | for (ClientMeditationQuestionVO questionVO : questionVOList) { |
| | | AppUser appUser = appUserMap.get(questionVO.getAppUserId()); |
| | | if (appUser != null) { |
| | | questionVO.setNickname(appUser.getNickname()); |
| | | questionVO.setAvatar(appUser.getAvatar()); |
| | | } |
| | | } |
| | | |
| | | // 获取当前登录用户ID |
| | | Long userId = SecurityUtils.getUserId(); |
| | | |
| | | // 查询用户已点赞提问列表 |
| | | Set<Long> likedQuestionIds = meditationQuestionLikeService.lambdaQuery() |
| | | .eq(MeditationQuestionLike::getAppUserId, userId) |
| | | .list() |
| | | .stream() |
| | | .map(MeditationQuestionLike::getMeditationQuestionId) |
| | | .collect(Collectors.toSet()); |
| | | |
| | | // 设置问题的点赞状态 |
| | | questionVOList.forEach(question -> { |
| | | if (likedQuestionIds.contains(question.getId())) { |
| | | question.setLike(DisabledEnum.YES.getCode()); |
| | | } |
| | | }); |
| | | |
| | | return pageDTO; |
| | | } |
| | | |
| | | } |