package com.tanpu.community.manager; import com.tanpu.common.exception.BizException; import com.tanpu.common.util.JsonUtil; import com.tanpu.community.api.beans.qo.FormerThemeQo; import com.tanpu.community.api.beans.qo.ThemeQo; import com.tanpu.community.api.beans.req.homepage.QueryRecordThemeReq; import com.tanpu.community.api.beans.req.theme.*; import com.tanpu.community.api.enums.BlockTypeEnum; import com.tanpu.community.api.enums.CollectionTypeEnum; import com.tanpu.community.api.enums.ThemeListTypeEnum; import com.tanpu.community.api.enums.ThemeTypeEnum; import com.tanpu.community.cache.CacheGet; import com.tanpu.community.dao.entity.community.*; import com.tanpu.community.service.*; import com.tanpu.community.service.other.BlackListService; import com.tanpu.community.util.ConvertUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; @Service public class ThemeManager { @Resource private ThemeService themeService; @Autowired private CollectionService collectionService; @Autowired private CommentService commentService; @Autowired private FollowRelService followRelService; @Autowired private BlackListService blackListService; @Autowired private UserInfoService userInfoService; @Autowired private ThemeAttachmentService themeAttachmentService; @Autowired private HomePageService homePageService; @Resource private ProductService productService; @Autowired private OSSFileService ossFileService; public void publishTheme(CreateThemeReq req, String userId) { //TODO 敏感词过滤 //保存主题表 ThemeEntity themeEntity = new ThemeEntity(); BeanUtils.copyProperties(req, themeEntity); themeEntity.setAuthorId(userId); themeEntity.setContent(JsonUtil.toJson(req.getContent())); if (StringUtils.isEmpty(req.getEditThemeId())){ //新建 themeService.insertTheme(themeEntity); }else { //修改 themeService.update(themeEntity,req.getEditThemeId()); } //保存附件表 List<ThemeAttachmentEntity> themeAttachments = ConvertUtil.themeReqToAttachmentList(req, themeEntity.getThemeId()); themeAttachmentService.insertList(themeAttachments); } // 返回推荐主题文章 public List<ThemeQo> queryThemes(ThemeListReq req, String userId) { List<ThemeEntity> themeEntities = new ArrayList<>(); if (ThemeListTypeEnum.RECOMMEND.getCode().equals(req.getType())) { // TODO:推荐 themeEntities = themeService.selectAll(req.getLastId(), req.getPageSize()); } else if (ThemeListTypeEnum.FOLLOW.getCode().equals(req.getType())) { //根据关注列表查询 List<String> fansList = followRelService.queryFansByFollowerId(userId); themeEntities = themeService.queryByUserIds(fansList, req.getLastId(), req.getPageSize()); } else if (ThemeListTypeEnum.TOPIC_HOT.getCode().equals(req.getType())) { //TODO 根据话题查询热门 if (StringUtils.isEmpty(req.getTopicId())) throw new BizException("TopicId为空"); themeEntities = themeService.queryByTopic(req.getTopicId(), req.getLastId(), req.getPageSize()); } else if (ThemeListTypeEnum.TOPIC_LATEST.getCode().equals(req.getType())) { //TODO 根据话题查询最新 if (StringUtils.isEmpty(req.getTopicId())) throw new BizException("TopicId为空"); themeEntities = themeService.queryByTopic(req.getTopicId(), req.getLastId(), req.getPageSize()); } //组装详情 return convertEntityToQo(themeEntities, userId); } // 返回用户发布、回复、收藏的主题列表 public List<ThemeQo> queryThemesByUser(QueryRecordThemeReq req, String userId) { List<ThemeEntity> themeEntities = Collections.emptyList(); switch (req.getRecordType()) { case 1://发布 themeEntities = themeService.queryThemeIdsByUserId(req.getUserId()); break; case 2://点赞 Set<String> likeThemeIds = collectionService.getListByUser(userId, CollectionTypeEnum.LIKE_THEME); themeEntities = themeService.queryByThemeIds(new ArrayList<>(likeThemeIds)); break; case 3://收藏 Set<String> collectThemeIds = collectionService.getListByUser(userId, CollectionTypeEnum.COLLECT_THEME); themeEntities = themeService.queryByThemeIds(new ArrayList<>(collectThemeIds)); break; } List<ThemeQo> themeQos = convertEntityToQo(themeEntities, userId); return themeQos; } public List<ThemeQo> queryThemesByUserComment(QueryRecordThemeReq req, String userId) { List<CommentEntity> commentEntities = commentService.queryThemesByUserId(req.getUserId()); Set<String> replyThemeIds = commentEntities.stream().map(CommentEntity::getThemeId).collect(Collectors.toSet()); List<ThemeEntity> themeEntities = themeService.queryByThemeIds(new ArrayList<>(replyThemeIds)); return null; } //查询正文 @CacheGet(prefix = "getThemeDetail", expireSeconds = 600) public ThemeQo getDetail(String themeId, String userId) { ThemeEntity themeEntity = themeService.queryByThemeId(themeId); if (themeEntity == null) { throw new BizException("找不到帖子id:" + themeId); } ThemeQo themeQo = ConvertUtil.themeEntityToQo(themeEntity); buildMainTestExtraInfo(themeQo, userId); return themeQo; } // 点赞/取消点赞 public void like(LikeThemeReq req, String userId) { //todo 枚举值 if (1 == req.getType()) { collectionService.addIfNotExist(req.getThemeId(), userId, CollectionTypeEnum.LIKE_THEME); } else if (2 == req.getType()) { collectionService.delete(req.getThemeId(), userId, CollectionTypeEnum.LIKE_THEME); } } //收藏/取消收藏 public void collect(CollectThemeReq req, String userId) { //todo 枚举值 if (1 == req.getType()) { collectionService.addIfNotExist(req.getThemeId(), userId, CollectionTypeEnum.COLLECT_THEME); } else if (2 == req.getType()) { collectionService.delete(req.getThemeId(), userId, CollectionTypeEnum.COLLECT_THEME); } } //转发 public void forward(ForwardThemeReq req, String userId) { ThemeEntity targetTheme = themeService.queryByThemeId(req.getFormerThemeId()); ThemeEntity newTheme = ThemeEntity.builder() .content(JsonUtil.toJson(req.getContent())) .topicId(req.getTopicId()) .formerThemeId(req.getFormerThemeId()) .authorId(userId) .themeType(ThemeTypeEnum.FORWARD.getCode()) .build(); if (StringUtils.isEmpty(req.getEditThemeId())){ //新建 themeService.insertTheme(newTheme); }else { //修改 themeService.update(newTheme,req.getEditThemeId()); } } //投诉(主题) public void complaint(String themeId, String user) { //TODO } // 屏蔽(用户) public void blockUser(String blockUser, String userId) { BlackListEntity selectOne = blackListService.selectOne(blockUser, userId, BlockTypeEnum.USER.getCode()); if (selectOne == null) { blackListService.addBlock(blockUser, userId, BlockTypeEnum.USER); } } // 解除屏蔽(用户) public void unblockUser(String blockUser, String userId) { //todo } // 屏蔽(主题) public void blockTheme(String themeId, String userId) { blackListService.addBlock(themeId, userId, BlockTypeEnum.THEME); BlackListEntity selectOne = blackListService.selectOne(themeService.queryByThemeId(themeId).getAuthorId(), userId, BlockTypeEnum.USER.getCode()); if (selectOne == null) { blackListService.addBlock(themeService.queryByThemeId(themeId).getAuthorId(), userId, BlockTypeEnum.USER); } } // 解除屏蔽(主题) public void unblockTheme(String themeId, String userId) { blackListService.removeBlackList(themeId, userId, BlockTypeEnum.USER); } //主题Entity转QO private List<ThemeQo> convertEntityToQo(List<ThemeEntity> themeEntities, String userId) { //Entity转Qo List<ThemeQo> themeQos = ConvertUtil.themeEntitiesToDTOs(themeEntities); //批量查询附件detail productService.transferAttachments(themeQos); //其他信息 for (ThemeQo themeQO : themeQos) { buildThemeQoExtraInfo(userId, themeQO); } return themeQos; } //组装主题列表 private void buildThemeQoExtraInfo(String userId, ThemeQo themeQo) { String themeId = themeQo.getThemeId(); //是否关注作者 String authorId = themeQo.getAuthorId(); Set<String> fansSet = new HashSet<>(followRelService.queryFansByFollowerId(userId)); themeQo.setFollow(fansSet.contains(authorId)); //是否点赞 CollectionEntity likeEntity = collectionService.getNotDeleteTargetCollection(themeId, userId, CollectionTypeEnum.LIKE_THEME); themeQo.setHasLiked(likeEntity != null); //是否转发 Integer forwardCountByUser = themeService.getForwardCountByUser(themeId, userId); themeQo.setHasForward(forwardCountByUser > 0); //转发原文 buildFormerTheme(themeQo); //热点数据:点赞,收藏,转发 Integer likeCount = collectionService.getCountByTypeAndId(themeId, CollectionTypeEnum.LIKE_THEME); Integer bookCount = collectionService.getCountByTypeAndId(themeId, CollectionTypeEnum.COLLECT_THEME); Integer forwardCount = themeService.getForwardCountById(themeId); themeQo.setCommentCount(bookCount); themeQo.setLikeCount(likeCount); themeQo.setForwardCount(forwardCount); } //组装正文详情 private void buildMainTestExtraInfo(ThemeQo themeQo, String userId) { //附件列表 String themeId = themeQo.getThemeId(); productService.transferAttachement(themeQo); //转发原文 buildFormerTheme(themeQo); return; } private void buildFormerTheme(ThemeQo themeQo) { String formerThemeId = themeQo.getFormerThemeId(); if (StringUtils.isNotEmpty(formerThemeId)) { ThemeQo formerTheme = ConvertUtil.themeEntityToQo2(themeService.queryByThemeId(formerThemeId)); if (formerTheme == null) { throw new BizException("转发主题Id错误,id:" + formerThemeId); } productService.transferAttachement(formerTheme); FormerThemeQo f = FormerThemeQo.builder().formerThemeId(formerThemeId) .forwardContent(formerTheme.getContent()) .userImg(formerTheme.getUserImg()) .nickName(formerTheme.getNickName()) .build(); themeQo.setFormerTheme(f); } } public void delete(String themeId) { themeService.deleteById(themeId); } }