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

刘基明's avatar
刘基明 committed
3 4
import com.google.common.collect.Sets;
import com.tanpu.common.api.CommonResp;
刘基明's avatar
刘基明 committed
5
import com.tanpu.common.exception.BizException;
刘基明's avatar
刘基明 committed
6
import com.tanpu.common.util.JsonUtil;
张辰's avatar
张辰 committed
7
import com.tanpu.community.api.beans.qo.ESThemeQo;
刘基明's avatar
刘基明 committed
8
import com.tanpu.community.api.beans.qo.FormerThemeQo;
刘基明's avatar
刘基明 committed
9
import com.tanpu.community.api.beans.qo.ThemeContentQo;
刘基明's avatar
刘基明 committed
10
import com.tanpu.community.api.beans.qo.ThemeQo;
刘基明's avatar
刘基明 committed
11
import com.tanpu.community.api.beans.req.homepage.QueryRecordThemeReq;
刘基明's avatar
刘基明 committed
12
import com.tanpu.community.api.beans.req.theme.*;
刘基明's avatar
刘基明 committed
13
import com.tanpu.community.api.beans.resp.CreateThemeResp;
张辰's avatar
张辰 committed
14
import com.tanpu.community.api.beans.resp.ThemeFullSearchResp;
刘基明's avatar
刘基明 committed
15
import com.tanpu.community.api.enums.*;
刘基明's avatar
刘基明 committed
16
import com.tanpu.community.dao.entity.community.*;
刘基明's avatar
刘基明 committed
17
import com.tanpu.community.dao.entity.user.UserInfoEntity;
刘基明's avatar
刘基明 committed
18
import com.tanpu.community.feign.fatools.FeignClientForFatools;
刘基明's avatar
刘基明 committed
19
import com.tanpu.community.service.*;
张辰's avatar
张辰 committed
20
import com.tanpu.community.service.base.ESService;
21
import com.tanpu.community.util.ConvertUtil;
刘基明's avatar
刘基明 committed
22
import com.tanpu.community.util.TencentcloudUtils;
张辰's avatar
张辰 committed
23
import lombok.extern.slf4j.Slf4j;
刘基明's avatar
刘基明 committed
24
import org.apache.commons.collections4.CollectionUtils;
刘基明's avatar
刘基明 committed
25
import org.apache.commons.lang3.StringUtils;
张辰's avatar
张辰 committed
26
import org.apache.commons.lang3.exception.ExceptionUtils;
刘基明's avatar
刘基明 committed
27
import org.springframework.beans.BeanUtils;
刘基明's avatar
刘基明 committed
28 29
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
刘基明's avatar
刘基明 committed
30
import org.springframework.transaction.annotation.Transactional;
刘基明's avatar
刘基明 committed
31

刘基明's avatar
刘基明 committed
32
import javax.annotation.Resource;
刘基明's avatar
刘基明 committed
33
import java.time.LocalDateTime;
刘基明's avatar
刘基明 committed
34 35
import java.util.*;
import java.util.stream.Collectors;
刘基明's avatar
刘基明 committed
36

张辰's avatar
张辰 committed
37
@Slf4j
刘基明's avatar
刘基明 committed
38 39
@Service
public class ThemeManager {
刘基明's avatar
刘基明 committed
40
    @Resource
刘基明's avatar
刘基明 committed
41
    private ThemeService themeService;
刘基明's avatar
刘基明 committed
42 43 44 45 46 47 48 49

    @Autowired
    private CollectionService collectionService;

    @Autowired
    private CommentService commentService;

    @Autowired
刘基明's avatar
刘基明 committed
50
    private FollowRelService followRelService;
刘基明's avatar
刘基明 committed
51

刘基明's avatar
刘基明 committed
52 53 54
    @Autowired
    private BlackListService blackListService;

55
    @Autowired
刘基明's avatar
刘基明 committed
56
    private UserInfoService userInfoService;
57

刘基明's avatar
刘基明 committed
58 59 60
    @Autowired
    private ThemeAttachmentService themeAttachmentService;

刘基明's avatar
刘基明 committed
61
    @Resource
刘基明's avatar
刘基明 committed
62
    private BatchFeignCallService batchFeignCallService;
刘基明's avatar
刘基明 committed
63

刘基明's avatar
刘基明 committed
64
    @Autowired
刘基明's avatar
刘基明 committed
65
    private VisitSummaryService visitSummaryService;
刘基明's avatar
刘基明 committed
66

刘基明's avatar
刘基明 committed
67 68 69
    @Autowired
    private RankService rankService;

张辰's avatar
张辰 committed
70 71 72
    @Autowired
    private ESService esService;

刘基明's avatar
刘基明 committed
73 74 75
    @Autowired
    private FeignClientForFatools feignClientForFatools;

张辰's avatar
张辰 committed
76
    public ThemeFullSearchResp themeFullSearch(String keyword, Integer pageNo, Integer pageSize, List<String> excludeIds, String userId) {
张辰's avatar
张辰 committed
77
        Integer from = (pageNo - 1) * pageSize;
张辰's avatar
张辰 committed
78
        ThemeFullSearchResp resp = new ThemeFullSearchResp();
张辰's avatar
张辰 committed
79 80

        // 按时间倒叙查询
张辰's avatar
张辰 committed
81 82 83 84
        // todo redis
        List<ESThemeQo> esIds = esService.queryThemeIdByContentAndTitle(keyword, from, pageSize * 5);
        if (esIds.isEmpty()) {
            return resp;
张辰's avatar
张辰 committed
85 86
        }

张辰's avatar
张辰 committed
87 88 89 90 91 92 93 94 95
        // 排除已经展示过的id
        List<String> filterEsIds = esIds.stream().map(ESThemeQo::getThemeId).filter(tId -> {
            return !excludeIds.contains(tId);
        }).limit(pageSize).collect(Collectors.toList());

        resp.themes = convertEntityToQo(themeService.queryByThemeIds(filterEsIds), userId);
        resp.excludeIds.addAll(filterEsIds);

        return resp;
张辰's avatar
张辰 committed
96
    }
刘基明's avatar
刘基明 committed
97

刘基明's avatar
刘基明 committed
98
    @Transactional
刘基明's avatar
刘基明 committed
99
    public CreateThemeResp publishTheme(CreateThemeReq req, String userId) {
刘基明's avatar
刘基明 committed
100 101 102 103 104 105 106 107 108 109 110 111 112
        //直播类型做转播检查
        List<ThemeContentReq> contents = req.getContent();
        for (ThemeContentReq content : contents) {
            if (content != null && content.getType().equals(RelTypeEnum.LIVE.type)) {
                CommonResp<Set<String>> notRelayResp = feignClientForFatools.getNotRelaySet(userId, Sets.newHashSet(content.getValue()));
                if (!notRelayResp.isSuccess()) {
                    throw new BizException("转播失败");
                }
                if (CollectionUtils.isEmpty(notRelayResp.getData())) {
                    throw new BizException("9999", "很抱歉!您需要购买或报名成功后才可以添加这个直播哦~");
                }
            }
        }
刘基明's avatar
刘基明 committed
113

刘基明's avatar
刘基明 committed
114
        //保存主题表
刘基明's avatar
刘基明 committed
115
        ThemeEntity themeEntity = new ThemeEntity();
刘基明's avatar
刘基明 committed
116
        BeanUtils.copyProperties(req, themeEntity);
刘基明's avatar
刘基明 committed
117
        themeEntity.setAuthorId(userId);
刘基明's avatar
刘基明 committed
118
        themeEntity.setContent(JsonUtil.toJson(req.getContent()));
刘基明's avatar
刘基明 committed
119

刘基明's avatar
刘基明 committed
120 121
        //TODO 敏感词过滤
        checkContent(themeEntity.getContent());
刘基明's avatar
刘基明 committed
122

刘基明's avatar
刘基明 committed
123
        if (StringUtils.isEmpty(req.getEditThemeId())) {
刘基明's avatar
刘基明 committed
124 125
            //新建
            themeService.insertTheme(themeEntity);
刘基明's avatar
刘基明 committed
126
        } else {
刘基明's avatar
刘基明 committed
127
            //修改
刘基明's avatar
刘基明 committed
128
            themeService.update(themeEntity, req.getEditThemeId());
刘基明's avatar
刘基明 committed
129
            themeEntity.setThemeId(req.getEditThemeId());
刘基明's avatar
刘基明 committed
130
        }
刘基明's avatar
刘基明 committed
131
        //保存附件表
刘基明's avatar
刘基明 committed
132
        List<ThemeAttachmentEntity> themeAttachments = ConvertUtil.themeReqToAttachmentList(req, themeEntity.getThemeId());
刘基明's avatar
刘基明 committed
133 134
        if (StringUtils.isNotEmpty(req.getEditThemeId())) {
            //修改需要刪除
刘基明's avatar
刘基明 committed
135
            themeAttachmentService.deleteByThemeId(req.getEditThemeId());
刘基明's avatar
刘基明 committed
136
        }
刘基明's avatar
刘基明 committed
137
        themeAttachmentService.insertList(themeAttachments);
刘基明's avatar
刘基明 committed
138

张辰's avatar
张辰 committed
139 140 141 142 143
        try {
            esService.insertOrUpdateTheme(ConvertUtil.convert(themeEntity));
        } catch (Exception e) {
            log.error("error in save theme to ES. themeId:{}, error:{}", themeEntity.getThemeId(), ExceptionUtils.getStackTrace(e));
        }
刘基明's avatar
刘基明 committed
144

刘基明's avatar
刘基明 committed
145
        return CreateThemeResp.builder().themeId(themeEntity.getThemeId()).build();
刘基明's avatar
刘基明 committed
146
    }
刘基明's avatar
刘基明 committed
147

刘基明's avatar
刘基明 committed
148

刘基明's avatar
刘基明 committed
149 150
    /**
     * 返回主题列表
刘基明's avatar
刘基明 committed
151
     *
刘基明's avatar
刘基明 committed
152 153 154 155
     * @param req
     * @param userId
     * @return
     */
刘基明's avatar
刘基明 committed
156
    public List<ThemeQo> queryThemes(ThemeListReq req, String userId) {
刘基明's avatar
刘基明 committed
157
        List<ThemeEntity> themeEntities = new ArrayList<>();
刘基明's avatar
刘基明 committed
158 159
        if (ThemeListTypeEnum.RECOMMEND.getCode().equals(req.getType())) {
            // TODO:推荐
刘基明's avatar
刘基明 committed
160
//            themeEntities = themeService.selectExcludeUser(userId, req.getLastId(), req.getPageSize());
刘基明's avatar
刘基明 committed
161
            List<String> recommendThemeIds = rankService.getHotAndNewThemes(100, 100);
刘基明's avatar
刘基明 committed
162
            themeEntities = themeService.queryByThemeIdsExcludeUser(recommendThemeIds, userId, req.getLastId(), req.getPageSize());
刘基明's avatar
刘基明 committed
163

刘基明's avatar
刘基明 committed
164
        } else if (ThemeListTypeEnum.FOLLOW.getCode().equals(req.getType())) {
刘基明's avatar
刘基明 committed
165
            //根据关注列表查询
刘基明's avatar
刘基明 committed
166
            List<String> fansList = followRelService.queryFansByFollowerId(userId);
刘基明's avatar
刘基明 committed
167
            themeEntities = themeService.queryByUserIds(fansList, req.getLastId(), req.getPageSize());
刘基明's avatar
刘基明 committed
168

刘基明's avatar
刘基明 committed
169
        } else if (ThemeListTypeEnum.TOPIC_HOT.getCode().equals(req.getType())) {
刘基明's avatar
刘基明 committed
170 171 172
            //TODO 根据话题查询热门
            if (StringUtils.isEmpty(req.getTopicId())) throw new BizException("TopicId为空");
            themeEntities = themeService.queryByTopic(req.getTopicId(), req.getLastId(), req.getPageSize());
刘基明's avatar
刘基明 committed
173
        } else if (ThemeListTypeEnum.TOPIC_LATEST.getCode().equals(req.getType())) {
刘基明's avatar
刘基明 committed
174 175 176
            //TODO 根据话题查询最新
            if (StringUtils.isEmpty(req.getTopicId())) throw new BizException("TopicId为空");
            themeEntities = themeService.queryByTopic(req.getTopicId(), req.getLastId(), req.getPageSize());
刘基明's avatar
刘基明 committed
177
        }
178
        //组装详情
刘基明's avatar
刘基明 committed
179
        return convertEntityToQo(themeEntities, userId);
刘基明's avatar
刘基明 committed
180 181
    }

刘基明's avatar
刘基明 committed
182 183
    public List<ThemeQo> searchThemes(ThemeSearchReq req, String userId) {

刘基明's avatar
刘基明 committed
184
        List<ThemeEntity> themeEntities = themeService.search(req.getKeyword(), req.getLastId(), req.getPageSize());
刘基明's avatar
刘基明 committed
185 186 187 188
        return convertEntityToQo(themeEntities, userId);
    }


刘基明's avatar
刘基明 committed
189
    // 返回用户发布、回复、收藏的主题列表
刘基明's avatar
刘基明 committed
190
    public List<ThemeQo> queryThemesByUser(QueryRecordThemeReq req, String userId) {
刘基明's avatar
刘基明 committed
191 192 193 194

        List<ThemeEntity> themeEntities = Collections.emptyList();
        switch (req.getRecordType()) {
            case 1://发布
刘基明's avatar
刘基明 committed
195
                themeEntities = themeService.queryThemesByUserId(req.getUserId(), req.getLastId(), req.getPageSize());
刘基明's avatar
刘基明 committed
196
                break;
刘基明's avatar
刘基明 committed
197
            case 2://回复
刘基明's avatar
刘基明 committed
198 199
                List<ThemeQo> commentThemeList = new ArrayList<>();
                //评论列表
刘基明's avatar
刘基明 committed
200
                List<CommentEntity> commentEntities = commentService.queryThemesByUserId(req.getUserId(), req.getLastId(), req.getPageSize());
刘基明's avatar
刘基明 committed
201
                //当前用户信息
刘基明's avatar
刘基明 committed
202
                UserInfoEntity userInfoEntity = userInfoService.queryUserById(req.getUserId());
刘基明's avatar
刘基明 committed
203
                Set<String> replyThemeIds = commentEntities.stream().map(CommentEntity::getThemeId).collect(Collectors.toSet());
刘基明's avatar
刘基明 committed
204
                if (CollectionUtils.isEmpty(replyThemeIds)) {
刘基明's avatar
刘基明 committed
205 206
                    return commentThemeList;
                }
刘基明's avatar
刘基明 committed
207 208
                themeEntities = themeService.queryByThemeIds(new ArrayList<>(replyThemeIds));
                List<ThemeQo> themeQos = convertEntityToQo(themeEntities, userId);
刘基明's avatar
刘基明 committed
209
                //组装附件
刘基明's avatar
刘基明 committed
210
                batchFeignCallService.getAttachDetailByBatch(themeQos);
刘基明's avatar
刘基明 committed
211 212 213 214 215 216 217
                //主题列表
                Map<String, ThemeQo> themeMap = themeQos.stream()
                        .collect(Collectors.toMap(ThemeQo::getThemeId, o -> o));
                //主题+评论封装转发对象
                for (CommentEntity commentEntity : commentEntities) {
                    String themeId = commentEntity.getThemeId();
                    //评论内容包装到ThemeContentQo里
刘基明's avatar
刘基明 committed
218 219
                    ThemeContentQo commentContent = ThemeContentQo.builder()
                            .type(RelTypeEnum.TEXT.type)
刘基明's avatar
刘基明 committed
220
                            .value(commentEntity.getContent())
刘基明's avatar
刘基明 committed
221
                            .build();
刘基明's avatar
刘基明 committed
222 223 224 225 226
                    //原主题包装到FormerThemeQo中
                    ThemeQo themeQo = themeMap.get(themeId);
                    FormerThemeQo f = ConvertUtil.themeQo2FormerThemeQo(themeQo);
                    //ThemeContentQo和原主题包装到FormerThemeQo中包装到ThemeQo中
                    ThemeQo commentThemeQo = ThemeQo.builder()
刘基明's avatar
刘基明 committed
227
                            .authorId(userInfoEntity.getId())
刘基明's avatar
刘基明 committed
228 229
                            .nickName(userInfoEntity.getUiUsernameMp())
                            .userImg(userInfoEntity.getUiHeadimgMp())
刘基明's avatar
刘基明 committed
230
                            .content(Arrays.asList(commentContent))
刘基明's avatar
刘基明 committed
231 232
                            .formerTheme(f)
                            .commentId(commentEntity.getCommentId())
刘基明's avatar
刘基明 committed
233
                            .themeType(ThemeTypeEnum.RES_COMMENT.getCode())
刘基明's avatar
刘基明 committed
234
                            .build();
刘基明's avatar
刘基明 committed
235

刘基明's avatar
刘基明 committed
236
                    commentThemeList.add(commentThemeQo);
刘基明's avatar
刘基明 committed
237
                }
刘基明's avatar
刘基明 committed
238
                return commentThemeList;
刘基明's avatar
刘基明 committed
239
            case 3://点赞
刘基明's avatar
刘基明 committed
240
                Set<String> likeThemeIds = collectionService.getListByUser(req.getUserId(), CollectionTypeEnum.LIKE_THEME);
刘基明's avatar
刘基明 committed
241
                themeEntities = themeService.queryByThemeIds(new ArrayList<>(likeThemeIds), req.getLastId(), req.getPageSize());
刘基明's avatar
刘基明 committed
242
                break;
刘基明's avatar
刘基明 committed
243
            case 4://收藏
刘基明's avatar
刘基明 committed
244
                Set<String> collectThemeIds = collectionService.getListByUser(req.getUserId(), CollectionTypeEnum.COLLECT_THEME);
刘基明's avatar
刘基明 committed
245
                themeEntities = themeService.queryByThemeIds(new ArrayList<>(collectThemeIds), req.getLastId(), req.getPageSize());
刘基明's avatar
刘基明 committed
246 247 248 249 250 251
                break;
        }
        List<ThemeQo> themeQos = convertEntityToQo(themeEntities, userId);
        return themeQos;
    }

刘基明's avatar
刘基明 committed
252

刘基明's avatar
刘基明 committed
253 254
    //查询正文
    public ThemeQo getDetail(String themeId, String userId) {
刘基明's avatar
刘基明 committed
255
        ThemeEntity themeEntity = themeService.queryByThemeId(themeId);
刘基明's avatar
刘基明 committed
256 257
        if (themeEntity == null) {
            throw new BizException("找不到帖子id:" + themeId);
刘基明's avatar
刘基明 committed
258
        }
刘基明's avatar
刘基明 committed
259
        ThemeQo themeQo = ConvertUtil.themeEntityToQo(themeEntity);
刘基明's avatar
刘基明 committed
260
        batchFeignCallService.getAttachDetail(themeQo);
刘基明's avatar
刘基明 committed
261
        buildThemeQoExtraInfo(userId, themeQo);
刘基明's avatar
刘基明 committed
262
        return themeQo;
刘基明's avatar
刘基明 committed
263 264
    }

刘基明's avatar
刘基明 committed
265 266
    // 点赞/取消点赞
    public void like(LikeThemeReq req, String userId) {
刘基明's avatar
刘基明 committed
267
        if (OperationTypeEnum.CONFIRM.getCode().equals(req.getType())) {
刘基明's avatar
刘基明 committed
268
            collectionService.addIfNotExist(req.getThemeId(), userId, CollectionTypeEnum.LIKE_THEME);
刘基明's avatar
刘基明 committed
269
        } else if (OperationTypeEnum.CANCEL.getCode().equals(req.getType())) {
刘基明's avatar
刘基明 committed
270 271 272
            collectionService.delete(req.getThemeId(), userId, CollectionTypeEnum.LIKE_THEME);
        }

刘基明's avatar
刘基明 committed
273 274
    }

刘基明's avatar
刘基明 committed
275 276
    //收藏/取消收藏
    public void collect(CollectThemeReq req, String userId) {
刘基明's avatar
刘基明 committed
277
        if (OperationTypeEnum.CONFIRM.getCode().equals(req.getType())) {
刘基明's avatar
刘基明 committed
278
            collectionService.addIfNotExist(req.getThemeId(), userId, CollectionTypeEnum.COLLECT_THEME);
刘基明's avatar
刘基明 committed
279
        } else if (OperationTypeEnum.CANCEL.getCode().equals(req.getType())) {
刘基明's avatar
刘基明 committed
280 281
            collectionService.delete(req.getThemeId(), userId, CollectionTypeEnum.COLLECT_THEME);
        }
张辰's avatar
张辰 committed
282 283
    }

刘基明's avatar
刘基明 committed
284
    //转发
刘基明's avatar
刘基明 committed
285
    public CreateThemeResp forward(ForwardThemeReq req, String userId) {
刘基明's avatar
刘基明 committed
286
        ThemeEntity targetTheme = themeService.queryByThemeId(req.getFormerThemeId());
刘基明's avatar
刘基明 committed
287
        ThemeEntity themeEntity = ThemeEntity.builder()
刘基明's avatar
刘基明 committed
288
                .content(JsonUtil.toJson(req.getContent()))
刘基明's avatar
刘基明 committed
289 290
                .topicId(req.getTopicId())
                .formerThemeId(req.getFormerThemeId())
291
                .authorId(userId)
刘基明's avatar
刘基明 committed
292
                .themeType(ThemeTypeEnum.FORWARD.getCode())
293 294
                .build();

刘基明's avatar
刘基明 committed
295
        if (StringUtils.isEmpty(req.getEditThemeId()) || req.getEditThemeId() == req.getFormerThemeId()) {
刘基明's avatar
刘基明 committed
296
            //新建
刘基明's avatar
刘基明 committed
297
            themeService.insertTheme(themeEntity);
刘基明's avatar
刘基明 committed
298
        } else {
刘基明's avatar
刘基明 committed
299
            //修改
刘基明's avatar
刘基明 committed
300 301 302
            themeService.update(themeEntity, req.getEditThemeId());
            themeEntity.setThemeId(req.getEditThemeId());

刘基明's avatar
刘基明 committed
303
        }
刘基明's avatar
刘基明 committed
304
        return CreateThemeResp.builder().themeId(themeEntity.getThemeId()).build();
刘基明's avatar
刘基明 committed
305 306 307
    }


刘基明's avatar
刘基明 committed
308 309 310 311 312 313
    //    屏蔽(用户)
    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);
        }
刘基明's avatar
刘基明 committed
314
    }
刘基明's avatar
刘基明 committed
315

张辰's avatar
张辰 committed
316
    // 解除屏蔽(用户)
刘基明's avatar
刘基明 committed
317
    public void unblockUser(String blockUser, String userId) {
刘基明's avatar
刘基明 committed
318
        //todo
张辰's avatar
张辰 committed
319 320 321 322 323
    }

    // 屏蔽(主题)
    public void blockTheme(String themeId, String userId) {
        blackListService.addBlock(themeId, userId, BlockTypeEnum.THEME);
刘基明's avatar
刘基明 committed
324
        BlackListEntity selectOne = blackListService.selectOne(themeService.queryByThemeId(themeId).getAuthorId(), userId, BlockTypeEnum.USER.getCode());
刘基明's avatar
刘基明 committed
325
        if (selectOne == null) {
刘基明's avatar
刘基明 committed
326
            blackListService.addBlock(themeService.queryByThemeId(themeId).getAuthorId(), userId, BlockTypeEnum.USER);
刘基明's avatar
刘基明 committed
327
        }
刘基明's avatar
刘基明 committed
328
    }
刘基明's avatar
刘基明 committed
329

张辰's avatar
张辰 committed
330 331 332
    // 解除屏蔽(主题)
    public void unblockTheme(String themeId, String userId) {
        blackListService.removeBlackList(themeId, userId, BlockTypeEnum.USER);
刘基明's avatar
刘基明 committed
333
    }
张辰's avatar
张辰 committed
334

刘基明's avatar
刘基明 committed
335

刘基明's avatar
刘基明 committed
336 337
    //主题Entity转QO
    private List<ThemeQo> convertEntityToQo(List<ThemeEntity> themeEntities, String userId) {
338
        //Entity转Qo
刘基明's avatar
刘基明 committed
339
        List<ThemeQo> themeQos = ConvertUtil.themeEntitiesToDTOs(themeEntities);
340
        //批量查询附件detail
刘基明's avatar
刘基明 committed
341
        batchFeignCallService.getAttachDetailByBatch(themeQos);
刘基明's avatar
刘基明 committed
342
        //其他信息
刘基明's avatar
刘基明 committed
343
        for (ThemeQo themeQO : themeQos) {
刘基明's avatar
刘基明 committed
344 345
            buildThemeQoExtraInfo(userId, themeQO);
        }
刘基明's avatar
刘基明 committed
346

刘基明's avatar
刘基明 committed
347 348
        return themeQos;
    }
刘基明's avatar
刘基明 committed
349 350


刘基明's avatar
刘基明 committed
351
    //组装主题详情
刘基明's avatar
刘基明 committed
352
    private void buildThemeQoExtraInfo(String userId, ThemeQo themeQo) {
刘基明's avatar
刘基明 committed
353

刘基明's avatar
刘基明 committed
354 355 356
        //封装转发对象
        buildFormerTheme(themeQo);

刘基明's avatar
刘基明 committed
357
        String themeId = themeQo.getThemeId();
刘基明's avatar
刘基明 committed
358

刘基明's avatar
刘基明 committed
359
        //是否关注作者
刘基明's avatar
刘基明 committed
360
        String authorId = themeQo.getAuthorId();
刘基明's avatar
刘基明 committed
361
        Set<String> fansSet = new HashSet<>(followRelService.queryFansByFollowerId(userId));
刘基明's avatar
刘基明 committed
362
        themeQo.setFollow(fansSet.contains(authorId));
刘基明's avatar
刘基明 committed
363
        //是否点赞
刘基明's avatar
刘基明 committed
364
        CollectionEntity likeEntity = collectionService.getNotDeleteTargetCollection(themeId, userId, CollectionTypeEnum.LIKE_THEME);
刘基明's avatar
刘基明 committed
365
        themeQo.setHasLiked(likeEntity != null);
刘基明's avatar
刘基明 committed
366 367
        //是否转发
        Integer forwardCountByUser = themeService.getForwardCountByUser(themeId, userId);
刘基明's avatar
刘基明 committed
368
        themeQo.setHasForward(forwardCountByUser > 0);
刘基明's avatar
刘基明 committed
369
        //是否收藏
刘基明's avatar
刘基明 committed
370
        CollectionEntity collectionEntity = collectionService.getNotDeleteTargetCollection(themeId, userId, CollectionTypeEnum.COLLECT_THEME);
刘基明's avatar
刘基明 committed
371
        themeQo.setHasCollect(collectionEntity != null);
刘基明's avatar
刘基明 committed
372
        //点赞,收藏,转发
刘基明's avatar
刘基明 committed
373
        Integer likeCount = collectionService.getCountByTypeAndId(themeId, CollectionTypeEnum.LIKE_THEME);
刘基明's avatar
刘基明 committed
374 375
//        Integer bookCount = collectionService.getCountByTypeAndId(themeId, CollectionTypeEnum.COLLECT_THEME);
        Integer commentCount = commentService.getCommentCountByThemeId(themeId);
刘基明's avatar
刘基明 committed
376
        Integer forwardCount = themeService.getForwardCountById(themeId);
刘基明's avatar
刘基明 committed
377
        themeQo.setCommentCount(commentCount);
刘基明's avatar
刘基明 committed
378 379
        themeQo.setLikeCount(likeCount);
        themeQo.setForwardCount(forwardCount);
刘基明's avatar
刘基明 committed
380 381
    }

刘基明's avatar
刘基明 committed
382

刘基明's avatar
刘基明 committed
383
    //组装被转发主题
刘基明's avatar
刘基明 committed
384
    private void buildFormerTheme(ThemeQo themeQo) {
刘基明's avatar
刘基明 committed
385
        String formerThemeId = themeQo.getFormerThemeId();
刘基明's avatar
刘基明 committed
386
        if (StringUtils.isNotEmpty(formerThemeId)) {
刘基明's avatar
刘基明 committed
387
            ThemeQo formerTheme = ConvertUtil.themeEntityToQo(themeService.queryByThemeId(formerThemeId));
刘基明's avatar
刘基明 committed
388 389 390
            if (formerTheme != null) {

                //单个查询详情
刘基明's avatar
刘基明 committed
391
                batchFeignCallService.getAttachDetail(formerTheme);
刘基明's avatar
刘基明 committed
392 393
                FormerThemeQo f = ConvertUtil.themeQo2FormerThemeQo(formerTheme);
                themeQo.setFormerTheme(f);
刘基明's avatar
刘基明 committed
394
            }
刘基明's avatar
刘基明 committed
395

刘基明's avatar
刘基明 committed
396
        }
刘基明's avatar
刘基明 committed
397 398
    }

刘基明's avatar
刘基明 committed
399

刘基明's avatar
刘基明 committed
400
    //逻辑删除
刘基明's avatar
刘基明 committed
401 402 403
    public void delete(String themeId) {
        themeService.deleteById(themeId);
    }
刘基明's avatar
刘基明 committed
404 405 406 407 408 409

    //投诉(主题)
    public void complaint(String themeId, String user) {
        //TODO
    }

刘基明's avatar
刘基明 committed
410 411 412 413 414
    public Integer getFollowUpdateCount(String userId) {
        LocalDateTime lastViewTime = visitSummaryService.queryLatestViewFollow(userId);
        List<String> fansList = followRelService.queryFansByFollowerId(userId);
        return themeService.queryCountFromLastTime(fansList, lastViewTime);
    }
刘基明's avatar
刘基明 committed
415 416


刘基明's avatar
刘基明 committed
417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432
    private void checkContent(String content) {
        // 腾讯云接口最多支持5000文字校验,超过5000执行2次
        // 检查内容是否涉黄违法
        CommonResp commonResp = TencentcloudUtils.textModeration(content.length() > 5000 ? content.substring(0, 5000) : content);
        if (!commonResp.isSuccess()) {
            throw new BizException("内容校验失败,请检查内容后重新发送");
        }
        if (content.length() > 5000) {
            CommonResp commonResp2 = TencentcloudUtils.textModeration(content.substring(5000, content.length()));
            if (!commonResp2.isSuccess()) {
                throw new BizException("内容校验失败,请检查内容后重新发送");
            }
        }
        return ;
    }

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