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

import com.tanpu.common.exception.BizException;
刘基明's avatar
刘基明 committed
4 5
import com.tanpu.community.api.beans.vo.TopicDO;
import com.tanpu.community.api.beans.vo.TopicDataAnalysDTO;
刘基明's avatar
刘基明 committed
6 7
import com.tanpu.community.api.beans.qo.TopicDetailQo;
import com.tanpu.community.api.beans.qo.TopicHotQo;
刘基明's avatar
刘基明 committed
8 9
import com.tanpu.community.api.beans.qo.TopicTitileQo;
import com.tanpu.community.api.beans.req.page.Page;
刘基明's avatar
刘基明 committed
10
import com.tanpu.community.api.beans.req.topic.TopicSearchReq;
刘基明's avatar
刘基明 committed
11
import com.tanpu.community.api.constants.RedisKeyConstant;
刘基明's avatar
刘基明 committed
12
import com.tanpu.community.api.enums.CollectionTypeEnum;
刘基明's avatar
刘基明 committed
13
import com.tanpu.community.dao.entity.community.TopicEntity;
刘基明's avatar
刘基明 committed
14
import com.tanpu.community.service.*;
刘基明's avatar
刘基明 committed
15
import com.tanpu.community.util.ConvertUtil;
刘基明's avatar
刘基明 committed
16
import com.tanpu.community.util.PageUtils;
17
import org.apache.commons.collections4.CollectionUtils;
刘基明's avatar
刘基明 committed
18
import org.springframework.beans.BeanUtils;
刘基明's avatar
刘基明 committed
19 20 21
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

刘基明's avatar
刘基明 committed
22
import java.util.HashSet;
刘基明's avatar
刘基明 committed
23
import java.util.List;
刘基明's avatar
刘基明 committed
24
import java.util.Set;
刘基明's avatar
刘基明 committed
25
import java.util.stream.Collectors;
刘基明's avatar
刘基明 committed
26 27 28 29 30 31 32

@Service
public class TopicManager {

    @Autowired
    private TopicService topicService;

刘基明's avatar
刘基明 committed
33 34 35 36 37 38 39 40 41 42 43 44
    @Autowired
    private RedisService redisService;

    @Autowired
    private ThemeService themeService;

    @Autowired
    private CollectionService collectionService;

    @Autowired
    private CommentService commentService;

刘基明's avatar
刘基明 committed
45 46 47
    @Autowired
    private VisitSummaryService visitSummaryService;

刘基明's avatar
刘基明 committed
48
    //新增话题
刘基明's avatar
刘基明 committed
49
    public void insertTopic(String topicTitle, String userId) {
刘基明's avatar
刘基明 committed
50
        if (topicService.queryByTitile(topicTitle) == null) {
刘基明's avatar
刘基明 committed
51 52 53
            topicService.addTopic(topicTitle, userId);
        }
        return;
刘基明's avatar
刘基明 committed
54

刘基明's avatar
刘基明 committed
55
    }
刘基明's avatar
刘基明 committed
56

刘基明's avatar
刘基明 committed
57
    //话题详情列表
刘基明's avatar
刘基明 committed
58
    public List<TopicDO> getAllTopicDetail() {
刘基明's avatar
刘基明 committed
59
        return ConvertUtil.topicEntitiesToDTOs(topicService.queryAll());
刘基明's avatar
刘基明 committed
60 61 62
    }


刘基明's avatar
刘基明 committed
63
    //话题简介列表
刘基明's avatar
刘基明 committed
64 65 66
    public Page<TopicTitileQo> getAllTopicBriefInfo(TopicSearchReq req) {
        List<TopicEntity> allTopic = topicService.queryByKeyword(req.getSearchKeyword());
        List<TopicTitileQo> topicTitileQos = ConvertUtil.topicEntitiesToBriefDTOs(allTopic);
刘基明's avatar
刘基明 committed
67

刘基明's avatar
刘基明 committed
68
        for (TopicTitileQo topicQo : topicTitileQos) {
刘基明's avatar
刘基明 committed
69 70 71
            //讨论数=发布主题贴数+回复总数
            List<String> themeIds = themeService.queryThemeIdsByTopic(topicQo.getTopicId());
            Integer commentCount = commentService.getCommentCountByThemeIds(themeIds);
刘基明's avatar
刘基明 committed
72 73 74 75 76
            topicQo.setDiscussionCount(String.valueOf(themeIds.size() + commentCount));
            //浏览量
            Integer topicPV = visitSummaryService.queryTopicDetailVisit(topicQo.getTopicId());
            Integer themePV = visitSummaryService.queryThemeVisit(themeIds);
            topicQo.setViewCount(String.valueOf(topicPV + themePV));
刘基明's avatar
刘基明 committed
77
        }
刘基明's avatar
刘基明 committed
78
        //TODO 判断顶置
刘基明's avatar
刘基明 committed
79
        return PageUtils.page(req.getPage(), topicTitileQos);
刘基明's avatar
刘基明 committed
80 81
    }

刘基明's avatar
刘基明 committed
82
    //话题详情页
刘基明's avatar
刘基明 committed
83 84 85 86 87 88
    public TopicDetailQo getDetail(String topicId) {
        TopicEntity topicEntity = topicService.queryById(topicId);
        if (topicEntity == null) {
            throw new BizException("找不到话题,id:" + topicId);
        }
        TopicDetailQo topicDetailQo = new TopicDetailQo();
刘基明's avatar
刘基明 committed
89
        BeanUtils.copyProperties(topicEntity, topicDetailQo);
刘基明's avatar
刘基明 committed
90
        List<String> themeIds = themeService.queryThemeIdsByTopic(topicId);
刘基明's avatar
刘基明 committed
91 92
        if (CollectionUtils.isEmpty(themeIds)) {
            topicDetailQo.setViewCount(visitSummaryService.queryTopicDetailVisit(topicId));
93 94 95
            topicDetailQo.setDisscussCount(0);
            return topicDetailQo;
        }
刘基明's avatar
刘基明 committed
96

刘基明's avatar
刘基明 committed
97 98 99 100
        //浏览量
        Integer topicPV = visitSummaryService.queryTopicDetailVisit(topicId);
        Integer themePV = visitSummaryService.queryThemeVisit(themeIds);
        topicDetailQo.setViewCount(topicPV + themePV);
刘基明's avatar
刘基明 committed
101 102
        //讨论数=发布主题贴数+回复总数
        Integer commentCount = commentService.getCommentCountByThemeIds(themeIds);
刘基明's avatar
刘基明 committed
103
        topicDetailQo.setDisscussCount(themeIds.size() + commentCount);
刘基明's avatar
刘基明 committed
104 105 106 107
        return topicDetailQo;
    }


刘基明's avatar
刘基明 committed
108
    public List<TopicHotQo> getHotTopicTitles() {
刘基明's avatar
刘基明 committed
109 110
        List<TopicEntity> topicEntities = topicService.queryAll();
        List<TopicHotQo> topicHotQos = ConvertUtil.topicEntityToHotQos(topicEntities);
刘基明's avatar
刘基明 committed
111 112 113 114 115 116 117 118 119 120 121 122
        for (TopicHotQo topic : topicHotQos) {
            List<String> themeIds = themeService.queryThemeIdsByTopic(topic.getTopicId());
            //浏览量
            Integer topicPV = visitSummaryService.queryTopicDetailVisit(topic.getTopicId());
            Integer themePV = visitSummaryService.queryThemeVisit(themeIds);
            topic.setViewCount(topicPV + themePV);
            //讨论数=发布主题贴数+回复总数
            Integer commentCount = commentService.getCommentCountByThemeIds(themeIds);
            topic.setDisscussCount(themeIds.size() + commentCount);
        }
        topicHotQos.stream().collect(Collectors.toMap(TopicHotQo::getRank, o->o));

刘基明's avatar
刘基明 committed
123
        //TODO 添加类型:热 新 顶
刘基明's avatar
刘基明 committed
124 125
        topicHotQos.get(0).setType(1);
        topicHotQos.get(2).setType(2);
刘基明's avatar
刘基明 committed
126 127 128
        return topicHotQos;

    }
刘基明's avatar
刘基明 committed
129

张辰's avatar
张辰 committed
130 131
    public void setTopTopic(String topicId, boolean setTop) {
        TopicEntity topicEntity = topicService.queryById(topicId);
刘基明's avatar
刘基明 committed
132 133
        if (topicEntity == null) {
            throw new BizException("找不到话题,id:" + topicId);
刘基明's avatar
刘基明 committed
134
        }
刘基明's avatar
刘基明 committed
135
        if (setTop) {
刘基明's avatar
刘基明 committed
136
            topicService.updateTopicToTop(topicId);
刘基明's avatar
刘基明 committed
137
        } else {
刘基明's avatar
刘基明 committed
138 139 140 141 142
            topicService.updateTopicNotTop(topicId);
        }
    }

    public void setTopicConceal(String topicId, boolean setConceal) {
刘基明's avatar
刘基明 committed
143 144 145
        TopicEntity topicEntity = topicService.queryById(topicId);
        if (topicEntity == null) {
            throw new BizException("找不到话题,id:" + topicId);
刘基明's avatar
刘基明 committed
146
        }
刘基明's avatar
刘基明 committed
147
        if (setConceal) {
刘基明's avatar
刘基明 committed
148
            topicService.updateTopicToConceal(topicId);
刘基明's avatar
刘基明 committed
149
        } else {
刘基明's avatar
刘基明 committed
150 151 152
            topicService.updateTopicNotConceal(topicId);
        }
    }
刘基明's avatar
刘基明 committed
153

刘基明's avatar
刘基明 committed
154

刘基明's avatar
刘基明 committed
155
    public void modifyViewCount(String topicId, Long modifyMount) {
刘基明's avatar
刘基明 committed
156 157 158 159
        TopicEntity topicEntity = topicService.queryById(topicId);
        if (topicEntity == null) {
            throw new BizException("找不到话题,id:" + topicId);
        }
刘基明's avatar
刘基明 committed
160
        topicService.modifyViewCount(topicId, modifyMount);
刘基明's avatar
刘基明 committed
161
        if (modifyMount > 0) {
刘基明's avatar
刘基明 committed
162
            redisService.incr(RedisKeyConstant.TOPIC_TOTAL_VIEW_COUNT_ + topicId, modifyMount);
刘基明's avatar
刘基明 committed
163
        } else {
刘基明's avatar
刘基明 committed
164
            redisService.decr(RedisKeyConstant.TOPIC_TOTAL_VIEW_COUNT_ + topicId, -modifyMount);
刘基明's avatar
刘基明 committed
165 166 167 168 169
        }

    }


刘基明's avatar
刘基明 committed
170
    public void refreshRedisCache() {
刘基明's avatar
刘基明 committed
171 172
        List<TopicEntity> topicEntities = topicService.queryAll();
        for (TopicEntity topic : topicEntities) {
刘基明's avatar
刘基明 committed
173
            String topicId = topic.getTopicId();
刘基明's avatar
刘基明 committed
174
            Long viewCountModify = topic.getviewCntAdjust();
刘基明's avatar
刘基明 committed
175
            List<String> themeIds = themeService.queryThemeIdsByTopic(topicId);
刘基明's avatar
刘基明 committed
176
            Integer likeCountByThemeIds = collectionService.getCountByTypeAndIds(themeIds, CollectionTypeEnum.LIKE_THEME);
刘基明's avatar
刘基明 committed
177
            Integer bookCountByThemeIds = collectionService.getCountByTypeAndIds(themeIds, CollectionTypeEnum.COLLECT_THEME);
刘基明's avatar
刘基明 committed
178
            Long commentCountByThemeIds = (long) commentService.getCommentCountByThemeIds(themeIds);
刘基明's avatar
刘基明 committed
179 180
            Set<String> postUsers = themeService.getPostUserCount(themeIds);
            Set<String> commentUsers = commentService.getCommentUserCount(themeIds);
刘基明's avatar
刘基明 committed
181 182
            HashSet<String> totalUsers = new HashSet<>(postUsers);
            totalUsers.addAll(commentUsers);
刘基明's avatar
刘基明 committed
183 184 185
            redisService.set(RedisKeyConstant.TOPIC_LIKE_COUNT_ + topicId, likeCountByThemeIds);
            redisService.set(RedisKeyConstant.TOPIC_BOOK_COUNT_ + topicId, bookCountByThemeIds);
            redisService.set(RedisKeyConstant.TOPIC_COMMENT_COUNT_ + topicId, commentCountByThemeIds);
刘基明's avatar
刘基明 committed
186 187


刘基明's avatar
刘基明 committed
188 189 190 191 192 193
            redisService.set(RedisKeyConstant.TOPIC_TOTAL_VIEW_COUNT_ + topicId, commentCountByThemeIds + themeIds.size());
            redisService.set(RedisKeyConstant.TOPIC_THEME_COUNT_ + topicId, commentCountByThemeIds + themeIds.size());
            redisService.set(RedisKeyConstant.TOPIC_DISCUSS_COUNT_ + topicId, commentCountByThemeIds + themeIds.size());
            redisService.set(RedisKeyConstant.TOPIC_POST_USER_COUNT_ + topicId, (long) postUsers.size());
            redisService.set(RedisKeyConstant.TOPIC_COMMENT_USER_COUNT_ + topicId, (long) commentUsers.size());
            redisService.set(RedisKeyConstant.TOPIC_TOTAL_USER_COUNT_ + topicId, (long) totalUsers.size());
刘基明's avatar
刘基明 committed
194

刘基明's avatar
刘基明 committed
195

刘基明's avatar
刘基明 committed
196 197 198
        }

    }
刘基明's avatar
刘基明 committed
199

刘基明's avatar
刘基明 committed
200 201 202 203
    //后台管理:返回数据分析
    public TopicDataAnalysDTO queryDataAnalysis(String topicId) {
        TopicDataAnalysDTO topicDataAnalysDTO = new TopicDataAnalysDTO();
        TopicEntity topicEntity = topicService.queryById(topicId);
刘基明's avatar
刘基明 committed
204 205 206
        if (topicEntity == null) {
            throw new BizException("话题未找到,id:" + topicId);
        }
刘基明's avatar
刘基明 committed
207 208 209
        this.refreshRedisCache();
        topicDataAnalysDTO.setId(topicId);
        topicDataAnalysDTO.setTopicTitle(topicEntity.getTopicTitle());
刘基明's avatar
刘基明 committed
210 211 212 213 214 215 216
        topicDataAnalysDTO.setCommentCount(redisService.getInteger(RedisKeyConstant.TOPIC_COMMENT_COUNT_ + topicId));
        topicDataAnalysDTO.setPosterCount(redisService.getInteger(RedisKeyConstant.TOPIC_POST_USER_COUNT_ + topicId));
        topicDataAnalysDTO.setReplIierCount(redisService.getInteger(RedisKeyConstant.TOPIC_COMMENT_USER_COUNT_ + topicId));
        topicDataAnalysDTO.setThemeCount(redisService.getInteger(RedisKeyConstant.TOPIC_THEME_COUNT_ + topicId));
        topicDataAnalysDTO.setUserTotalCount(redisService.getInteger(RedisKeyConstant.TOPIC_TOTAL_USER_COUNT_ + topicId));
        topicDataAnalysDTO.setViewTotalCount(redisService.getInteger(RedisKeyConstant.TOPIC_TOTAL_VIEW_COUNT_ + topicId));
        topicDataAnalysDTO.setViewPageCount(redisService.getInteger(RedisKeyConstant.TOPIC_PAGE_VIEW_COUNT_ + topicId));
刘基明's avatar
刘基明 committed
217
        return topicDataAnalysDTO;
刘基明's avatar
刘基明 committed
218
    }
刘基明's avatar
刘基明 committed
219
}
刘基明's avatar
刘基明 committed
220