ThemeManager.java 13.4 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.exception.BizException;
刘基明's avatar
刘基明 committed
5 6 7
import com.tanpu.common.util.JsonUtil;
import com.tanpu.community.api.beans.qo.AttachmentDetailVo;
import com.tanpu.community.api.beans.qo.ThemeContentQo;
刘基明's avatar
刘基明 committed
8
import com.tanpu.community.api.beans.qo.ThemeQo;
刘基明's avatar
刘基明 committed
9
import com.tanpu.community.api.beans.req.homepage.QueryRecordThemeReq;
刘基明's avatar
刘基明 committed
10
import com.tanpu.community.api.beans.req.theme.CreateThemeReq;
刘基明's avatar
刘基明 committed
11
import com.tanpu.community.api.beans.req.theme.ForwardThemeReq;
刘基明's avatar
刘基明 committed
12
import com.tanpu.community.api.beans.req.theme.LikeThemeReq;
刘基明's avatar
刘基明 committed
13
import com.tanpu.community.api.beans.req.theme.ThemeListReq;
刘基明's avatar
刘基明 committed
14 15 16 17
import com.tanpu.community.api.beans.vo.feign.CoursePackageDetail;
import com.tanpu.community.api.beans.vo.feign.ProductInfoVO;
import com.tanpu.community.api.beans.vo.feign.ShortVideoBaseInfoResp;
import com.tanpu.community.api.beans.vo.feign.ZhiboDetailVO;
刘基明's avatar
刘基明 committed
18
import com.tanpu.community.api.constants.CommunityConstant;
刘基明's avatar
刘基明 committed
19
import com.tanpu.community.api.enums.*;
刘基明's avatar
刘基明 committed
20
import com.tanpu.community.dao.entity.community.*;
刘基明's avatar
刘基明 committed
21
import com.tanpu.community.feign.course.FeignClientForCourse;
刘基明's avatar
刘基明 committed
22 23 24
import com.tanpu.community.feign.product.FeignClientForProducts;
import com.tanpu.community.feign.tanpuroom.FeignClientForTanpuroom;
import com.tanpu.community.feign.zhibo.FeignClientForZhibo;
刘基明's avatar
刘基明 committed
25
import com.tanpu.community.service.*;
刘基明's avatar
刘基明 committed
26
import com.tanpu.community.service.other.*;
27
import com.tanpu.community.util.ConvertUtil;
刘基明's avatar
刘基明 committed
28
import org.apache.commons.lang3.StringUtils;
刘基明's avatar
刘基明 committed
29
import org.springframework.beans.BeanUtils;
刘基明's avatar
刘基明 committed
30 31 32
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

刘基明's avatar
刘基明 committed
33
import javax.annotation.Resource;
刘基明's avatar
刘基明 committed
34 35 36
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
刘基明's avatar
刘基明 committed
37
import java.util.*;
刘基明's avatar
刘基明 committed
38

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

    @Autowired
    private CollectionService collectionService;

    @Autowired
    private CommentService commentService;

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

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

56 57 58
    @Autowired
    private FinProResService finProResService;

刘基明's avatar
刘基明 committed
59 60 61
    @Autowired
    private RedisService redisService;

62 63 64 65 66 67
    @Autowired
    private ZhiboService zhiboService;

    @Autowired
    private CurriculumResService curriculumResService;

68 69 70
    @Autowired
    private OrderFlowService orderFlowService;

刘基明's avatar
刘基明 committed
71 72 73
    @Autowired
    private ThemeAttachmentService themeAttachmentService;

刘基明's avatar
刘基明 committed
74 75 76
    @Autowired
    private HomePageService homePageService;

刘基明's avatar
刘基明 committed
77 78 79 80 81 82 83 84 85
    @Resource
    private FeignClientForTanpuroom feignClientForTanpuroom;

    @Resource
    private FeignClientForZhibo feignClientForZhibo;

    @Resource
    private FeignClientForProducts feignClientForProducts;

刘基明's avatar
刘基明 committed
86 87 88
    @Autowired
    private FeignClientForCourse feignClientForCourse;

刘基明's avatar
刘基明 committed
89
    @Autowired
刘基明's avatar
刘基明 committed
90 91
    private OSSFileService ossFileService;

刘基明's avatar
刘基明 committed
92

刘基明's avatar
刘基明 committed
93
    public void publishTheme(CreateThemeReq req, String userId) {
刘基明's avatar
刘基明 committed
94 95 96

        //TODO 敏感词过滤

刘基明's avatar
刘基明 committed
97
        //保存主题表
刘基明's avatar
刘基明 committed
98
        ThemeEntity themeEntity = new ThemeEntity();
刘基明's avatar
刘基明 committed
99
        BeanUtils.copyProperties(req, themeEntity);
刘基明's avatar
刘基明 committed
100
        themeEntity.setAuthorId(userId);
刘基明's avatar
刘基明 committed
101
        themeEntity.setContent(JsonUtil.toJson(req.getContent()));
刘基明's avatar
刘基明 committed
102
        themeService.insertTheme(themeEntity);
刘基明's avatar
刘基明 committed
103
        //保存附件表
刘基明's avatar
刘基明 committed
104
        List<ThemeAttachmentEntity> themeAttachments = ConvertUtil.themeReqToAttachmentList(req, themeEntity.getThemeId());
刘基明's avatar
刘基明 committed
105 106
        themeAttachmentService.insertList(themeAttachments);
    }
刘基明's avatar
刘基明 committed
107

刘基明's avatar
刘基明 committed
108
    // 返回推荐主题文章
刘基明's avatar
刘基明 committed
109
    public List<ThemeQo> queryThemes(ThemeListReq req, String userId) {
刘基明's avatar
刘基明 committed
110
        List<ThemeEntity> themeEntities = new ArrayList<>();
刘基明's avatar
刘基明 committed
111 112 113
        if (ThemeListTypeEnum.RECOMMEND.getCode().equals(req.getType())) {
            // TODO:推荐
            themeEntities = themeService.selectAll(req.getLastId(), req.getPageSize());
刘基明's avatar
刘基明 committed
114

刘基明's avatar
刘基明 committed
115
        } else if (ThemeListTypeEnum.FOLLOW.getCode().equals(req.getType())) {
刘基明's avatar
刘基明 committed
116
            //根据关注列表查询
刘基明's avatar
刘基明 committed
117 118
            List<String> fansList = followRelService.queryFansByFollowerId(userId);
            themeEntities = themeService.queryByFans(fansList, req.getLastId(), req.getPageSize());
刘基明's avatar
刘基明 committed
119

刘基明's avatar
刘基明 committed
120
        } else if (ThemeListTypeEnum.TOPIC_HOT.getCode().equals(req.getType())) {
刘基明's avatar
刘基明 committed
121 122 123
            //TODO 根据话题查询热门
            if (StringUtils.isEmpty(req.getTopicId())) throw new BizException("TopicId为空");
            themeEntities = themeService.queryByTopic(req.getTopicId(), req.getLastId(), req.getPageSize());
刘基明's avatar
刘基明 committed
124
        } else if (ThemeListTypeEnum.TOPIC_LATEST.getCode().equals(req.getType())) {
刘基明's avatar
刘基明 committed
125 126 127
            //TODO 根据话题查询最新
            if (StringUtils.isEmpty(req.getTopicId())) throw new BizException("TopicId为空");
            themeEntities = themeService.queryByTopic(req.getTopicId(), req.getLastId(), req.getPageSize());
刘基明's avatar
刘基明 committed
128
        }
刘基明's avatar
刘基明 committed
129
        return convertEntityToQo(themeEntities, userId);
刘基明's avatar
刘基明 committed
130 131
    }

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

刘基明's avatar
刘基明 committed
135 136 137
//        List<ThemeEntity> themeEntities = themeService.queryByUser(req.getUserId(), req.getPageSize(),req.getLastId());
        List<ThemeEntity> themeEntities = themeService.selectAll(req.getLastId(), req.getPageSize());
        return convertEntityToQo(themeEntities, userId);
刘基明's avatar
刘基明 committed
138 139
    }

刘基明's avatar
刘基明 committed
140

刘基明's avatar
刘基明 committed
141 142
    //查询正文
    public ThemeQo getDetail(String themeId, String userId) {
刘基明's avatar
刘基明 committed
143

刘基明's avatar
刘基明 committed
144
        ThemeEntity themeEntity = themeService.queryByThemeId(themeId);
刘基明's avatar
刘基明 committed
145 146
        if (themeEntity == null) {
            throw new BizException("找不到帖子id:" + themeId);
刘基明's avatar
刘基明 committed
147
        }
刘基明's avatar
刘基明 committed
148 149 150
        ThemeQo themeQo = ConvertUtil.themeEntityToQo(themeEntity);
        buildMainTestExtraInfo(themeQo, userId);
        return themeQo;
刘基明's avatar
刘基明 committed
151 152
    }

刘基明's avatar
刘基明 committed
153 154 155 156 157 158 159 160 161
    // 点赞/取消点赞
    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);
        }

刘基明's avatar
刘基明 committed
162 163
    }

张辰's avatar
张辰 committed
164 165 166
    public void unlike(String themeId, String userId) {
    }

刘基明's avatar
刘基明 committed
167

刘基明's avatar
刘基明 committed
168
    //转发
刘基明's avatar
刘基明 committed
169
    public void forward(ForwardThemeReq req, String userId) {
刘基明's avatar
刘基明 committed
170
        ThemeEntity targetTheme = themeService.queryByThemeId(req.getFormerThemeId());
171
        ThemeEntity newTheme = ThemeEntity.builder()
刘基明's avatar
刘基明 committed
172 173 174
                .content(req.getContent())
                .topicId(req.getTopicId())
                .formerThemeId(req.getFormerThemeId())
175
                .authorId(userId)
刘基明's avatar
刘基明 committed
176
                .themeType(ThemeTypeEnum.DISCUSSION.getCode())
177 178 179
                .build();

        themeService.insertTheme(newTheme);
刘基明's avatar
刘基明 committed
180 181 182 183
    }


    //收藏
张辰's avatar
张辰 committed
184
    public void favorite(String themeId, String userId) {
刘基明's avatar
刘基明 committed
185
        collectionService.addIfNotExist(themeId, userId, CollectionTypeEnum.BOOK_THEME);
张辰's avatar
张辰 committed
186 187 188
    }

    public void unFavorite(String themeId, String userId) {
刘基明's avatar
刘基明 committed
189
        collectionService.delete(themeId, userId, CollectionTypeEnum.BOOK_THEME);
刘基明's avatar
刘基明 committed
190
    }
张辰's avatar
张辰 committed
191

刘基明's avatar
刘基明 committed
192
    //投诉(主题)
刘基明's avatar
刘基明 committed
193
    public void complaint(String themeId, String user) {
刘基明's avatar
刘基明 committed
194
        //TODO
刘基明's avatar
刘基明 committed
195
    }
张辰's avatar
张辰 committed
196

刘基明's avatar
刘基明 committed
197 198 199 200 201 202
    //    屏蔽(用户)
    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
203
    }
刘基明's avatar
刘基明 committed
204

张辰's avatar
张辰 committed
205
    // 解除屏蔽(用户)
刘基明's avatar
刘基明 committed
206
    public void unblockUser(String blockUser, String userId) {
刘基明's avatar
刘基明 committed
207
        //todo
张辰's avatar
张辰 committed
208 209 210 211 212
    }

    // 屏蔽(主题)
    public void blockTheme(String themeId, String userId) {
        blackListService.addBlock(themeId, userId, BlockTypeEnum.THEME);
刘基明's avatar
刘基明 committed
213
        BlackListEntity selectOne = blackListService.selectOne(themeService.queryByThemeId(themeId).getAuthorId(), userId, BlockTypeEnum.USER.getCode());
刘基明's avatar
刘基明 committed
214
        if (selectOne == null) {
刘基明's avatar
刘基明 committed
215
            blackListService.addBlock(themeService.queryByThemeId(themeId).getAuthorId(), userId, BlockTypeEnum.USER);
刘基明's avatar
刘基明 committed
216
        }
刘基明's avatar
刘基明 committed
217
    }
刘基明's avatar
刘基明 committed
218

张辰's avatar
张辰 committed
219 220 221
    // 解除屏蔽(主题)
    public void unblockTheme(String themeId, String userId) {
        blackListService.removeBlackList(themeId, userId, BlockTypeEnum.USER);
刘基明's avatar
刘基明 committed
222
    }
张辰's avatar
张辰 committed
223

刘基明's avatar
刘基明 committed
224

刘基明's avatar
刘基明 committed
225 226 227 228
    //主题Entity转QO
    private List<ThemeQo> convertEntityToQo(List<ThemeEntity> themeEntities, String userId) {
        List<ThemeQo> themeQos = ConvertUtil.themeEntitiesToDTOs(themeEntities);
        for (ThemeQo themeQO : themeQos) {
刘基明's avatar
刘基明 committed
229 230 231 232
            buildThemeQoExtraInfo(userId, themeQO);
        }
        return themeQos;
    }
刘基明's avatar
刘基明 committed
233 234


刘基明's avatar
刘基明 committed
235 236 237
    //组装主题列表
    private void buildThemeQoExtraInfo(String userId, ThemeQo themeQO) {
        //附件列表
刘基明's avatar
刘基明 committed
238
        String themeId = themeQO.getThemeId();
刘基明's avatar
刘基明 committed
239
        List<ThemeContentQo> content = themeQO.getContent();
刘基明's avatar
刘基明 committed
240

刘基明's avatar
刘基明 committed
241 242
        if (content != null && content.size() > 2) {
            themeQO.setContent(content.subList(0, 2));
刘基明's avatar
刘基明 committed
243 244
        }
        content = themeQO.getContent();
刘基明's avatar
刘基明 committed
245
        for (ThemeContentQo themeContentQo : content) {
刘基明's avatar
刘基明 committed
246
            transferAttachment(themeContentQo, userId);
刘基明's avatar
刘基明 committed
247
        }
刘基明's avatar
刘基明 committed
248

刘基明's avatar
刘基明 committed
249 250 251 252
        //迄今时间
        themeQO.setUpToNowTime(calUpToNowTime(themeQO.getCreateTime()));
        //是否关注作者
        String authorId = themeQO.getAuthorId();
刘基明's avatar
刘基明 committed
253
        Set<String> fansSet = new HashSet<>(followRelService.queryFansByFollowerId(userId));
刘基明's avatar
刘基明 committed
254 255 256 257 258
        themeQO.setFollow(fansSet.contains(authorId));
        //用户信息:头像、昵称
        HomePageEntity userEntity = homePageService.selectByUserId(userId);
        themeQO.setUserImg(userEntity.getHeadImg());
        themeQO.setNickName(userEntity.getNickName());
刘基明's avatar
刘基明 committed
259 260 261 262 263 264 265
        //热点数据:点赞,收藏,转发
        Integer likeCount = collectionService.getCountByTypeAndId(themeId, CollectionTypeEnum.LIKE_THEME);
        Integer bookCount = collectionService.getCountByTypeAndId(themeId, CollectionTypeEnum.BOOK_THEME);
        Integer forwardCount = themeService.getForwardCountById(themeId);
        themeQO.setCommentCount(bookCount);
        themeQO.setLikeCount(likeCount);
        themeQO.setForwardCount(forwardCount);
刘基明's avatar
刘基明 committed
266 267 268
    }

    //组装正文详情
刘基明's avatar
刘基明 committed
269
    private void buildMainTestExtraInfo(ThemeQo themeQo, String userId) {
刘基明's avatar
刘基明 committed
270
        //附件列表
刘基明's avatar
刘基明 committed
271 272 273
        String themeId = themeQo.getThemeId();
        List<ThemeContentQo> content = themeQo.getContent();
        for (ThemeContentQo themeContentQo : content) {
刘基明's avatar
刘基明 committed
274
            transferAttachment(themeContentQo, userId);
刘基明's avatar
刘基明 committed
275 276
        }
        //迄今时间
刘基明's avatar
刘基明 committed
277
        themeQo.setUpToNowTime(calUpToNowTime(themeQo.getCreateTime()));
刘基明's avatar
刘基明 committed
278
        //用户信息:头像、昵称
刘基明's avatar
刘基明 committed
279
        HomePageEntity author = homePageService.selectByUserId(userId);
刘基明's avatar
刘基明 committed
280 281
        themeQo.setUserImg(author.getHeadImg());
        themeQo.setNickName(author.getNickName());
刘基明's avatar
刘基明 committed
282

刘基明's avatar
刘基明 committed
283
        return;
刘基明's avatar
刘基明 committed
284 285
    }

刘基明's avatar
刘基明 committed
286

刘基明's avatar
刘基明 committed
287 288
    public void transferAttachment(ThemeContentQo themeContentQo, String userId) {
        String type = themeContentQo.getType();
刘基明's avatar
刘基明 committed
289
        if (RelTypeEnum.FUND.type.equals(type)) {
刘基明's avatar
刘基明 committed
290 291 292 293 294
            //产品
            String productId = themeContentQo.getValue();
            CommonResp<ProductInfoVO> productDetailInfo = feignClientForProducts.getProductDetailInfo(productId);
            themeContentQo.setDetail(AttachmentDetailVo.builder().productInfoVO(productDetailInfo.getData()).build());

刘基明's avatar
刘基明 committed
295
        } else if (RelTypeEnum.LIVE.type.equals(type)) {
刘基明's avatar
刘基明 committed
296 297 298 299 300
            //直播
            String zhiboId = themeContentQo.getValue();
            CommonResp<ZhiboDetailVO> zhiboDetailVOCommonResp = feignClientForZhibo.queryZhiboDetail(zhiboId);
            themeContentQo.setDetail(AttachmentDetailVo.builder().zhiboDetailVO(zhiboDetailVOCommonResp.getData()).build());

刘基明's avatar
刘基明 committed
301
        } else if (RelTypeEnum.SHORT_VIDEO.type.equals(type)) {
刘基明's avatar
刘基明 committed
302 303 304 305 306 307 308
            //短视频
            String videoId = themeContentQo.getValue();
            String[] attachmentIds = new String[]{videoId};
            CommonResp<List<ShortVideoBaseInfoResp>> shortVideoBaseInfo =
                    feignClientForTanpuroom.getShortVideoBaseInfo(Arrays.asList(attachmentIds));
            themeContentQo.setDetail(AttachmentDetailVo.builder().shortVideoBaseInfoResp(shortVideoBaseInfo.getData().get(0)).build());

刘基明's avatar
刘基明 committed
309
        } else if (RelTypeEnum.NEW_COURSE_WARE.type.equals(type)) {
刘基明's avatar
刘基明 committed
310 311 312 313
            //课程
            String packageId = themeContentQo.getValue();
            CommonResp<CoursePackageDetail> courseIdDetailInfo = feignClientForCourse.getCoursePackageDetailInfo(packageId);
            themeContentQo.setDetail(AttachmentDetailVo.builder().coursePackageDetail(courseIdDetailInfo.getData()).build());
刘基明's avatar
刘基明 committed
314
        } else if (RelTypeEnum.SINGLE_IMG.type.equals(type)) {
刘基明's avatar
刘基明 committed
315 316 317
            //单图,根据id传入url
            String imgId = themeContentQo.getValue();
            FileRecordEntity fileEntity = ossFileService.queryById(imgId);
刘基明's avatar
刘基明 committed
318 319
            if (fileEntity == null) {
                throw new BizException("图片未找到,id:" + imgId);
刘基明's avatar
刘基明 committed
320
            }
刘基明's avatar
刘基明 committed
321
            themeContentQo.setValue(CommunityConstant.OSS_PREFIX_URL + fileEntity.getFileOssKey());
刘基明's avatar
刘基明 committed
322
        }
323 324


刘基明's avatar
刘基明 committed
325
    }
326

刘基明's avatar
刘基明 committed
327

刘基明's avatar
刘基明 committed
328 329 330 331 332 333 334 335 336 337 338 339 340 341
    //计算迄今时间
    private String calUpToNowTime(LocalDateTime start) {
        Duration between = Duration.between(start, LocalDateTime.now());
        long duration = between.toMinutes();
        if (duration < 1) {
            return "刚刚";
        } else if (duration < 60) {
            return duration + "分钟前";
        } else if (duration < 60 * 24) {
            return duration / 60 + "小时前";
        } else if (start.getYear() == LocalDateTime.now().getYear()) {
            return start.format(DateTimeFormatter.ofPattern("MM-dd HH:mm:ss"));
        }
        return start.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
刘基明's avatar
刘基明 committed
342
    }
刘基明's avatar
刘基明 committed
343

刘基明's avatar
刘基明 committed
344

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