From 2862c3e4da3adbb4bea43151514f0c43b86476d6 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期六, 07 九月 2024 17:49:17 +0800 Subject: [PATCH] APP端冥想首页相关接口 --- xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java | 333 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 330 insertions(+), 3 deletions(-) diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java index 631cfcb..0142788 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java @@ -1,9 +1,46 @@ 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; /** @@ -15,6 +52,296 @@ * @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; + } + } -- Gitblit v1.7.1