TopicManager.java 8.07 KB
Newer Older
刘基明's avatar
刘基明 committed
1 2
package com.tanpu.community.manager;

刘基明's avatar
刘基明 committed
3
import com.tanpu.common.api.CommonResp;
刘基明's avatar
刘基明 committed
4
import com.tanpu.common.auth.UserHolder;
5
import com.tanpu.common.constant.ErrorCodeConstant;
刘基明's avatar
刘基明 committed
6
import com.tanpu.community.api.beans.qo.DiscussionAeraQo;
刘基明's avatar
刘基明 committed
7
import com.tanpu.community.api.beans.qo.TopicFollowQo;
刘基明's avatar
刘基明 committed
8
import com.tanpu.community.api.beans.qo.TopicPageDetailQo;
刘基明's avatar
刘基明 committed
9
import com.tanpu.community.api.beans.qo.TopicRankQo;
刘基明's avatar
刘基明 committed
10
import com.tanpu.community.api.beans.req.page.Page;
刘基明's avatar
刘基明 committed
11
import com.tanpu.community.api.beans.req.topic.FollowTopicReq;
刘基明's avatar
刘基明 committed
12
import com.tanpu.community.api.beans.req.topic.TopicDiscussionReq;
刘基明's avatar
刘基明 committed
13
import com.tanpu.community.api.beans.req.topic.TopicSearchReq;
刘基明's avatar
刘基明 committed
14
import com.tanpu.community.api.beans.vo.feign.fatools.UserInfoResp;
刘基明's avatar
刘基明 committed
15
import com.tanpu.community.api.enums.OperationTypeEnum;
刘基明's avatar
刘基明 committed
16
import com.tanpu.community.api.enums.TopicSpecialPermissionEnum;
刘基明's avatar
刘基明 committed
17
import com.tanpu.community.dao.entity.community.ThemeEntity;
18
import com.tanpu.community.dao.entity.community.TopicEntity;
刘基明's avatar
刘基明 committed
19
import com.tanpu.community.dao.mapper.community.TopicFollowRelMapper;
刘基明's avatar
刘基明 committed
20
import com.tanpu.community.service.FeignService;
刘基明's avatar
刘基明 committed
21
import com.tanpu.community.service.RankService;
刘基明's avatar
刘基明 committed
22
import com.tanpu.community.service.ThemeService;
刘基明's avatar
刘基明 committed
23
import com.tanpu.community.service.TopicService;
刘基明's avatar
刘基明 committed
24
import com.tanpu.community.util.ConvertUtil;
刘基明's avatar
刘基明 committed
25
import com.tanpu.community.util.PageUtils;
刘基明's avatar
刘基明 committed
26
import org.apache.commons.collections4.CollectionUtils;
刘基明's avatar
刘基明 committed
27
import org.springframework.beans.BeanUtils;
刘基明's avatar
刘基明 committed
28 29
import org.springframework.stereotype.Service;

刘基明's avatar
刘基明 committed
30
import javax.annotation.Resource;
刘基明's avatar
刘基明 committed
31 32
import java.util.ArrayList;
import java.util.Collections;
刘基明's avatar
刘基明 committed
33
import java.util.Comparator;
刘基明's avatar
刘基明 committed
34
import java.util.List;
刘基明's avatar
刘基明 committed
35 36
import java.util.Map;
import java.util.stream.Collectors;
刘基明's avatar
刘基明 committed
37 38 39 40 41

@Service
public class TopicManager {


刘基明's avatar
刘基明 committed
42
    @Resource
43
    private TopicService topicService;
刘基明's avatar
刘基明 committed
44
    @Resource
刘基明's avatar
刘基明 committed
45
    private RankService rankService;
刘基明's avatar
刘基明 committed
46

刘基明's avatar
刘基明 committed
47
    @Resource
刘基明's avatar
刘基明 committed
48
    private UserHolder userHolder;
刘基明's avatar
刘基明 committed
49

刘基明's avatar
刘基明 committed
50 51 52 53
    @Resource
    TopicFollowRelMapper topicFollowRelMapper;
    @Resource
    private ThemeService themeService;
刘基明's avatar
刘基明 committed
54 55
    @Resource
    private FeignService feignService;
刘基明's avatar
刘基明 committed
56

刘基明's avatar
刘基明 committed
57
    // 首页-话题标签
刘基明's avatar
刘基明 committed
58
    public List<TopicRankQo> getTop4TopicTitles() {
刘基明's avatar
刘基明 committed
59 60 61 62 63
        List<TopicRankQo> rankTopicListTop4 = rankService.getRankTopicListTop4();
        //检查权限
        topicService.batchCheckPermission(rankTopicListTop4, userHolder.getUserId());

        return rankTopicListTop4;
刘基明's avatar
刘基明 committed
64 65
    }

刘基明's avatar
刘基明 committed
66
    // 话题列表
刘基明's avatar
刘基明 committed
67
    public Page<TopicRankQo> getAllTopicRankInfo(TopicSearchReq req) {
刘基明's avatar
刘基明 committed
68
        // 全量排序,内存分页
刘基明's avatar
刘基明 committed
69
        List<TopicRankQo> topicList = rankService.getRankTopicList(req.getSearchKeyword());
刘基明's avatar
刘基明 committed
70 71
        Page<TopicRankQo> result = PageUtils.page(req.getPage(), topicList);
        // 添加权限
刘基明's avatar
刘基明 committed
72
        topicService.batchCheckPermission(result.getContent(), userHolder.getUserId());
刘基明's avatar
刘基明 committed
73
        return result;
刘基明's avatar
刘基明 committed
74 75
    }

刘基明's avatar
刘基明 committed
76 77 78 79 80 81
    // 关键字搜索话题(前2个)
    public List<TopicRankQo> getTopicRankList(String keyword) {
        // 全量排序,内存分页
        List<TopicRankQo> topicList = rankService.getRankTopicList(keyword);
        if (CollectionUtils.isEmpty(topicList)) return topicList;
        // 只取前两条
刘基明's avatar
刘基明 committed
82
        if (topicList.size() > 2) topicList = topicList.subList(0, 2);
刘基明's avatar
刘基明 committed
83 84 85 86 87
        // 添加权限
        topicService.batchCheckPermission(topicList, userHolder.getUserId());
        return topicList;
    }

刘基明's avatar
刘基明 committed
88 89
    /**
     * 关注话题(讨论区)列表
刘基明's avatar
刘基明 committed
90 91
     *
     * @param keyword
刘基明's avatar
刘基明 committed
92 93
     */

刘基明's avatar
刘基明 committed
94
    public List<TopicFollowQo> getFollowTopicList(String keyword) {
刘基明's avatar
刘基明 committed
95 96

        String userId = userHolder.getUserId();
刘基明's avatar
刘基明 committed
97
        // 查库
刘基明's avatar
刘基明 committed
98
        List<TopicFollowQo> topicFollowQos = topicService.queryFollowTopic(keyword, userId);
刘基明's avatar
刘基明 committed
99
        // 先从缓存中获取浏览量
刘基明's avatar
刘基明 committed
100 101
        Map<String, TopicRankQo> topicMap = rankService.getRankTopicList(null).stream().collect(Collectors.toMap(TopicRankQo::getTopicId, o -> o, (a, b) -> a));

刘基明's avatar
刘基明 committed
102
        topicFollowQos.stream().forEach(o -> {
刘基明's avatar
刘基明 committed
103
            TopicRankQo topicRankQo = topicMap.get(o.getTopicId());
刘基明's avatar
刘基明 committed
104
            BeanUtils.copyProperties(topicRankQo, o);
刘基明's avatar
刘基明 committed
105
            o.setHasPermission(true);
刘基明's avatar
刘基明 committed
106 107
        });

刘基明's avatar
刘基明 committed
108

刘基明's avatar
刘基明 committed
109 110
        // 最新讨论
        themeService.queryCommentForTopic(topicFollowQos, userId);
刘基明's avatar
刘基明 committed
111

刘基明's avatar
刘基明 committed
112
        // 排序
刘基明's avatar
刘基明 committed
113
        List<TopicFollowQo> res = topicFollowQos.stream().filter(o -> o.checkTopicName(keyword)).sorted(Comparator.comparing(TopicFollowQo::getSpecialPermission, Comparator.reverseOrder()).
刘基明's avatar
刘基明 committed
114
                thenComparing(TopicFollowQo::getLastThemeSecond, Comparator.nullsFirst(Long::compareTo).reversed()))
刘基明's avatar
刘基明 committed
115 116
                .collect(Collectors.toList());

刘基明's avatar
刘基明 committed
117
        return res;
刘基明's avatar
刘基明 committed
118 119
    }

刘基明's avatar
刘基明 committed
120 121
    /**
     * 话题详情页
刘基明's avatar
刘基明 committed
122
     *
刘基明's avatar
刘基明 committed
123 124 125
     * @param topicId
     * @return
     */
刘基明's avatar
刘基明 committed
126
    public CommonResp<TopicPageDetailQo> getDetail(String topicId) {
刘基明's avatar
刘基明 committed
127 128 129 130


        TopicEntity topicEntity = topicService.queryOnlineTopicById(topicId);
        if (topicEntity == null) {
刘基明's avatar
刘基明 committed
131
            return CommonResp.error(ErrorCodeConstant.TOPIC_NOT_FOUND.getCode(), "抱歉!该话题已下线。");
132
        }
刘基明's avatar
刘基明 committed
133

刘基明's avatar
刘基明 committed
134
        // 检验权限
刘基明's avatar
刘基明 committed
135 136 137
        if (TopicSpecialPermissionEnum.TRUE.getCode().equals(topicEntity.getSpecialPermission()) &&
                !topicService.checkPermission(topicId, userHolder.getUserId())) {
            return CommonResp.error(ErrorCodeConstant.TOPIC_PERMISSION_ABORT.getCode(), topicService.getPermissionToast(topicId));
刘基明's avatar
刘基明 committed
138 139
        }

刘基明's avatar
刘基明 committed
140 141 142 143 144 145
        // DATA Transform
        TopicRankQo topicDetail = rankService.getTopicDetail(topicId);
        TopicPageDetailQo result = new TopicPageDetailQo();
        BeanUtils.copyProperties(topicDetail, result);

        // 查询管理员
刘基明's avatar
刘基明 committed
146
        result.setManagers(topicService.queryManagerNames(result.getTopicId()));
刘基明's avatar
刘基明 committed
147 148 149 150 151 152 153
        // 查询关联产品
        topicService.queryAttachments(result);
        // 是否关注
        result.setHasFollow(topicService.checkFollow(result.getTopicId(), userHolder.getUserId()));


        return CommonResp.success(result);
刘基明's avatar
刘基明 committed
154 155 156
    }


刘基明's avatar
刘基明 committed
157 158 159 160 161 162 163 164 165 166 167
    /**
     * 关注/取关 话题
     *
     * @param req
     * @param userId
     * @return
     */
    public CommonResp<Void> followTopic(FollowTopicReq req, String userId) {

        // 检验话题权限是否专属
        TopicEntity topicEntity = topicService.queryOnlineTopicById(req.getTopicId());
刘基明's avatar
刘基明 committed
168 169 170 171
        if (topicEntity == null) {
            return CommonResp.error(ErrorCodeConstant.TOPIC_NOT_FOUND.getCode(), "抱歉!该话题已下线。");
        }

刘基明's avatar
刘基明 committed
172
        if (TopicSpecialPermissionEnum.TRUE.getCode().equals(topicEntity.getSpecialPermission())) {
刘基明's avatar
刘基明 committed
173 174
            return CommonResp.error(ErrorCodeConstant.ILLEGAL_ARGEMENT.getCode(), "专属话题不支持关注");
        }
刘基明's avatar
刘基明 committed
175 176 177 178 179 180

        if (OperationTypeEnum.CONFIRM.getCode().equals(req.getType())) {
            topicService.addFollowTopic(req.getTopicId(), userId);
        } else if (OperationTypeEnum.CANCEL.getCode().equals(req.getType())) {
            topicService.deleteFollowTopic(req.getTopicId(), userId);
        }
刘基明's avatar
刘基明 committed
181
        return CommonResp.success();
刘基明's avatar
刘基明 committed
182
    }
刘基明's avatar
刘基明 committed
183

刘基明's avatar
刘基明 committed
184
    public DiscussionAeraQo getForum(TopicDiscussionReq req) {
刘基明's avatar
刘基明 committed
185 186 187 188 189 190 191 192 193 194 195 196
        TopicEntity topicEntity = topicService.queryRelateTopic(req);
        // 没有关联话题,或者已下线
        if (topicEntity==null) return null;

        DiscussionAeraQo result = new DiscussionAeraQo();

        List<TopicRankQo> rankTopicList = rankService.getRankTopicList(topicEntity.getTopicTitle());

        List<TopicRankQo> collect = rankTopicList.stream().filter(o -> o.getTopicId().equals(topicEntity.getTopicId())).collect(Collectors.toList());

        BeanUtils.copyProperties(collect.get(0),result);

197 198 199
        if (result.getDisscussCount()!=null && result.getDisscussCount()>99){
            result.setFormatDisscussCount("99+");
        }
刘基明's avatar
刘基明 committed
200 201 202 203 204 205 206 207 208 209 210 211

        // 最新讨论
        List<ThemeEntity> themeEntities = themeService.queryNewestByTopic(topicEntity.getTopicId(), 0, 3, Collections.emptyList());
        // 查询用户信息
        List<String> authorIds = new ArrayList<>(themeEntities.stream().map(ThemeEntity::getAuthorId).collect(Collectors.toSet()));
        List<UserInfoResp> queryUsersListNew = feignService.getUserList(authorIds);

        Map<String, UserInfoResp> nameMap = queryUsersListNew.stream().collect(Collectors.toMap(UserInfoResp::getUserId, o->o));

        result.setThemes(ConvertUtil.themeEntity2Discussion(themeEntities,nameMap));

        return result;
刘基明's avatar
刘基明 committed
212
    }
刘基明's avatar
刘基明 committed
213
}
刘基明's avatar
刘基明 committed
214