peng
4 天以前 aac2321d1cf5536f7ea03f30d55a4aba30fbf710
framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java
@@ -73,6 +73,7 @@
    private final RocketmqCustomProperties rocketmqCustomProperties;
    private final RocketMQTemplate rocketMQTemplate;
    private final ThumbsUpRecordService thumbsUpRecordService;
    /**
@@ -463,6 +464,10 @@
                query2.setAuthorId(query.getAuthorId());
                baseMapper.getAuthorCollectVideoPage(page, query2);
                break;
            case "like":
                AuthorVideoQuery query3 = new AuthorVideoQuery();
                query3.setAuthorId(query.getAuthorId());
                baseMapper.getAuthorLikeVideoPage(page, query3);
            default:
                break;
        }
@@ -471,16 +476,21 @@
            Map<String, List<SimpleVideoTagVO>> tagMap = videoTagRefService.getTagsByVideoIds(videoIds)
                    .stream()
                    .collect(Collectors.groupingBy(SimpleVideoTagVO::getVideoId));
            Map<String, List<SimpleMyCollectVO>> collectMap =myCollectService.getCollectsByVideoIds(videoIds)
            Map<String, List<SimpleMyCollectVO>> collectMap = myCollectService.getCollectsByVideoIds(videoIds)
                    .stream()
                    .collect(Collectors.groupingBy(SimpleMyCollectVO::getRefId));
            Map<String, List<SimpleMyThumbsUpVO>> thumbsUpMap = thumbsUpRecordService.getThumbssByVideoIds(videoIds)
                    .stream()
                    .collect(Collectors.groupingBy(SimpleMyThumbsUpVO::getRefId));
            List<String> subscribes = mySubscribeService.getSubscribesByUserId(UserContext.getCurrentUserId());
            // 3. 获取视频临时访问地址、设置视频标签、我是否收藏、作者是否关注
            // 3. 获取视频临时访问地址、设置视频标签、我是否收藏、是否点赞、作者是否关注
            page.getRecords().forEach(v -> {
                v.setTagList(tagMap.get(v.getId()));
                v.setCollected(CollectionUtils.isNotEmpty(collectMap.get(v.getId())));
                v.setThumbsUp(CollectionUtils.isNotEmpty(thumbsUpMap.get(v.getId())));
                v.setCommentNum(this.getCommentNum(v.getId(), v.getCommentNum()));
                v.setCollectNum(this.getCollectNum(v.getId(), v.getCollectNum()));
                v.setThumbsUpNum(this.getThumbsUpNum(v.getId(), v.getThumbsUpNum()));
                if (VideoContentTypeEnum.VIDEO.getValue().equals(v.getVideoContentType())) {
                    v.setVideoUrl(cosUtil.getPreviewUrl(v.getVideoFileKey()));
                    v.setCoverUrl(cosUtil.getPreviewUrl(v.getCoverFileKey()));
@@ -532,6 +542,23 @@
        return (Integer) redisNum;
    }
    /**
     * 从redis中获取点赞数量,如果redis中没有则将mysql中的数量写入到redis
     *
     * @param videoId
     * @param mysqlNum
     * @return
     */
    private Integer getThumbsUpNum(String videoId, Integer mysqlNum) {
        Object redisNum = cache.get(CachePrefix.VIDEO_THUMBS_UP_NUM.getPrefixWithId(videoId));
        if (Objects.isNull(redisNum)) {
            // redis中没有就把数据库的写到redis中
            cache.put(CachePrefix.VIDEO_THUMBS_UP_NUM.getPrefixWithId(videoId), mysqlNum, RedisKeyExpireConstant.VIDEO_THUMBS_UP_EXPIRE, RedisKeyExpireConstant.EXPIRE_DAY);
            return mysqlNum;
        }
        return (Integer) redisNum;
    }
    @Override
    public Result healthRecommendVideo(WxHealthVideoQuery query) {
        IPage<WxVideoVO> page = PageUtil.getPage(query, WxVideoVO.class);
@@ -572,8 +599,8 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateCollectNumBatch(List<CollectTypeNumVO> numList) {
        // 按500条数据进行拆分
        List<List<CollectTypeNumVO>> chunks = ListUtils.partition(numList, 500);
        // 按200条数据进行拆分
        List<List<CollectTypeNumVO>> chunks = ListUtils.partition(numList, 200);
        for (List<CollectTypeNumVO> chunk : chunks) {
            baseMapper.updateCollectNumBatch(chunk);
            new LambdaUpdateChainWrapper<>(baseMapper)
@@ -586,8 +613,8 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateCommentNumBatch(List<CollectTypeNumVO> numList) {
        // 按500条数据进行拆分
        List<List<CollectTypeNumVO>> chunks = ListUtils.partition(numList, 500);
        // 按200条数据进行拆分
        List<List<CollectTypeNumVO>> chunks = ListUtils.partition(numList, 200);
        for (List<CollectTypeNumVO> chunk : chunks) {
            baseMapper.updateCommentNumBatch(chunk);
            new LambdaUpdateChainWrapper<>(baseMapper)
@@ -628,16 +655,39 @@
        IPage<WxVideoVO> page = PageUtil.getPage(query, WxVideoVO.class);
        query.setAuthorSelf(UserContext.getCurrentUserId().equals(query.getAuthorId()));
        baseMapper.getAuthorVideoPage(page, query);
        for (WxVideoVO vo : page.getRecords()) {
            if (VideoContentTypeEnum.VIDEO.getValue().equals(vo.getVideoContentType())) {
                vo.setVideoUrl(cosUtil.getPreviewUrl(vo.getVideoFileKey()));
                vo.setCoverUrl(cosUtil.getPreviewUrl(vo.getCoverFileKey()));
            } else if (VideoContentTypeEnum.IMG.getValue().equals(vo.getVideoContentType()) && StringUtils.isNotBlank(vo.getVideoImgs())) {
                vo.setImgs(JSON.parseArray(vo.getVideoImgs(), String.class).stream().map(fileKey -> cosUtil.getPreviewUrl(fileKey)).collect(Collectors.toList()));
        List<String> videoIds = page.getRecords().stream().map(WxVideoVO::getId).collect(Collectors.toList());
        Map<String, List<SimpleVideoTagVO>> tagMap = videoTagRefService.getTagsByVideoIds(videoIds)
                .stream()
                .collect(Collectors.groupingBy(SimpleVideoTagVO::getVideoId));
        Map<String, List<SimpleMyCollectVO>> collectMap = myCollectService.getCollectsByVideoIds(videoIds)
                .stream()
                .collect(Collectors.groupingBy(SimpleMyCollectVO::getRefId));
        Map<String, List<SimpleMyThumbsUpVO>> thumbsUpMap = thumbsUpRecordService.getThumbssByVideoIds(videoIds)
                .stream()
                .collect(Collectors.groupingBy(SimpleMyThumbsUpVO::getRefId));
        List<String> subscribes = mySubscribeService.getSubscribesByUserId(UserContext.getCurrentUserId());
        if (CollectionUtils.isNotEmpty(page.getRecords())) {
            for (WxVideoVO v : page.getRecords()) {
                v.setTagList(tagMap.get(v.getId()));
                v.setCollected(CollectionUtils.isNotEmpty(collectMap.get(v.getId())));
                v.setThumbsUp(CollectionUtils.isNotEmpty(thumbsUpMap.get(v.getId())));
                v.setCommentNum(this.getCommentNum(v.getId(), v.getCommentNum()));
                v.setCollectNum(this.getCollectNum(v.getId(), v.getCollectNum()));
                v.setThumbsUpNum(this.getThumbsUpNum(v.getId(), v.getThumbsUpNum()));
                if (VideoContentTypeEnum.VIDEO.getValue().equals(v.getVideoContentType())) {
                    v.setVideoUrl(cosUtil.getPreviewUrl(v.getVideoFileKey()));
                    v.setCoverUrl(cosUtil.getPreviewUrl(v.getCoverFileKey()));
                } else if (VideoContentTypeEnum.IMG.getValue().equals(v.getVideoContentType()) && StringUtils.isNotBlank(v.getVideoImgs())) {
                    v.setImgs(JSON.parseArray(v.getVideoImgs(), String.class).stream().map(fileKey -> cosUtil.getPreviewUrl(fileKey)).collect(Collectors.toList()));
                }
                v.setOptions(VideoSupportOpEnum.getVideoOpByStatus(v.getStatus()));
                if (CollectionUtils.isNotEmpty(v.getGoodsList())) {
                    v.getGoodsList().stream().forEach(goods -> {
                        goods.setThumbnail(cosUtil.getPreviewUrl(goods.getThumbnail()));
                    });
                }
                v.setSubscribeThisAuthor(subscribes.contains(v.getAuthorId()));
            }
            vo.setOptions(VideoSupportOpEnum.getVideoOpByStatus(vo.getStatus()));
        }
        return Result.ok().data(page.getRecords()).total(page.getTotal());
    }
@@ -646,14 +696,72 @@
    public Result getAuthorCollectVideoPage(AuthorVideoQuery query) {
        IPage<WxVideoVO> page = PageUtil.getPage(query, WxVideoVO.class);
        baseMapper.getAuthorCollectVideoPage(page, query);
        for (WxVideoVO vo : page.getRecords()) {
            if (VideoContentTypeEnum.VIDEO.getValue().equals(vo.getVideoContentType())) {
                vo.setVideoUrl(cosUtil.getPreviewUrl(vo.getVideoFileKey()));
                vo.setCoverUrl(cosUtil.getPreviewUrl(vo.getCoverFileKey()));
            } else if (VideoContentTypeEnum.IMG.getValue().equals(vo.getVideoContentType()) && StringUtils.isNotBlank(vo.getVideoImgs())) {
                vo.setImgs(JSON.parseArray(vo.getVideoImgs(), String.class).stream().map(fileKey -> cosUtil.getPreviewUrl(fileKey)).collect(Collectors.toList()));
        if (CollectionUtils.isNotEmpty(page.getRecords())) {
            List<String> videoIds = page.getRecords().stream().map(WxVideoVO::getId).collect(Collectors.toList());
            Map<String, List<SimpleVideoTagVO>> tagMap = videoTagRefService.getTagsByVideoIds(videoIds)
                    .stream()
                    .collect(Collectors.groupingBy(SimpleVideoTagVO::getVideoId));
            Map<String, List<SimpleMyThumbsUpVO>> thumbsUpMap = thumbsUpRecordService.getThumbssByVideoIds(videoIds)
                    .stream()
                    .collect(Collectors.groupingBy(SimpleMyThumbsUpVO::getRefId));
            List<String> subscribes = mySubscribeService.getSubscribesByUserId(UserContext.getCurrentUserId());
            for (WxVideoVO v : page.getRecords()) {
                v.setTagList(tagMap.get(v.getId()));
                v.setCollected(Boolean.TRUE);
                v.setThumbsUp(CollectionUtils.isNotEmpty(thumbsUpMap.get(v.getId())));
                v.setCommentNum(this.getCommentNum(v.getId(), v.getCommentNum()));
                v.setCollectNum(this.getCollectNum(v.getId(), v.getCollectNum()));
                v.setThumbsUpNum(this.getThumbsUpNum(v.getId(), v.getThumbsUpNum()));
                if (VideoContentTypeEnum.VIDEO.getValue().equals(v.getVideoContentType())) {
                    v.setVideoUrl(cosUtil.getPreviewUrl(v.getVideoFileKey()));
                    v.setCoverUrl(cosUtil.getPreviewUrl(v.getCoverFileKey()));
                } else if (VideoContentTypeEnum.IMG.getValue().equals(v.getVideoContentType()) && StringUtils.isNotBlank(v.getVideoImgs())) {
                    v.setImgs(JSON.parseArray(v.getVideoImgs(), String.class).stream().map(fileKey -> cosUtil.getPreviewUrl(fileKey)).collect(Collectors.toList()));
                }
                if (CollectionUtils.isNotEmpty(v.getGoodsList())) {
                    v.getGoodsList().stream().forEach(goods -> {
                        goods.setThumbnail(cosUtil.getPreviewUrl(goods.getThumbnail()));
                    });
                }
                v.setSubscribeThisAuthor(subscribes.contains(v.getAuthorId()));
            }
            vo.setCollected(Boolean.TRUE);
        }
        return Result.ok().data(page.getRecords()).total(page.getTotal());
    }
    @Override
    public Result getAuthorLikeVideoPage(AuthorVideoQuery query) {
        IPage<WxVideoVO> page = PageUtil.getPage(query, WxVideoVO.class);
        baseMapper.getAuthorLikeVideoPage(page, query);
        if (CollectionUtils.isNotEmpty(page.getRecords())) {
            List<String> videoIds = page.getRecords().stream().map(WxVideoVO::getId).collect(Collectors.toList());
            Map<String, List<SimpleVideoTagVO>> tagMap = videoTagRefService.getTagsByVideoIds(videoIds)
                    .stream()
                    .collect(Collectors.groupingBy(SimpleVideoTagVO::getVideoId));
            Map<String, List<SimpleMyCollectVO>> collectMap = myCollectService.getCollectsByVideoIds(videoIds)
                    .stream()
                    .collect(Collectors.groupingBy(SimpleMyCollectVO::getRefId));
            List<String> subscribes = mySubscribeService.getSubscribesByUserId(UserContext.getCurrentUserId());
            for (WxVideoVO v : page.getRecords()) {
                v.setTagList(tagMap.get(v.getId()));
                v.setCollected(CollectionUtils.isNotEmpty(collectMap.get(v.getId())));
                v.setThumbsUp(Boolean.TRUE);
                v.setCommentNum(this.getCommentNum(v.getId(), v.getCommentNum()));
                v.setCollectNum(this.getCollectNum(v.getId(), v.getCollectNum()));
                v.setThumbsUpNum(this.getThumbsUpNum(v.getId(), v.getThumbsUpNum()));
                if (VideoContentTypeEnum.VIDEO.getValue().equals(v.getVideoContentType())) {
                    v.setVideoUrl(cosUtil.getPreviewUrl(v.getVideoFileKey()));
                    v.setCoverUrl(cosUtil.getPreviewUrl(v.getCoverFileKey()));
                } else if (VideoContentTypeEnum.IMG.getValue().equals(v.getVideoContentType()) && StringUtils.isNotBlank(v.getVideoImgs())) {
                    v.setImgs(JSON.parseArray(v.getVideoImgs(), String.class).stream().map(fileKey -> cosUtil.getPreviewUrl(fileKey)).collect(Collectors.toList()));
                }
                if (CollectionUtils.isNotEmpty(v.getGoodsList())) {
                    v.getGoodsList().stream().forEach(goods -> {
                        goods.setThumbnail(cosUtil.getPreviewUrl(goods.getThumbnail()));
                    });
                }
                v.setSubscribeThisAuthor(subscribes.contains(v.getAuthorId()));
            }
        }
        return Result.ok().data(page.getRecords()).total(page.getTotal());
    }
@@ -903,4 +1011,73 @@
        rocketMQTemplate.asyncSend(destination, "1", RocketmqSendCallbackBuilder.commonCallback());
        return Result.ok("已成功发起构建请求,稍作等待后便会自动完成");
    }
    @Override
    public Result changeThumbsUp(ThumbsUpRecordForm form) {
        // mq异步处理
        ThumbsUpRecord thumbsUp = new ThumbsUpRecord();
        thumbsUp.setRefId(form.getRefId());
        thumbsUp.setThumbsUpType(ThumbsUpTypeEnum.VIDEO.getValue());
        thumbsUp.setUserId(UserContext.getCurrentUserId());
        String destination = rocketmqCustomProperties.getVideoTopic() + ":" + VideoTagsEnum.THUMBS_UP.name();
        rocketMQTemplate.asyncSend(destination, JSON.toJSONString(thumbsUp), RocketmqSendCallbackBuilder.commonCallback());
        return Result.ok();
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void mqChangeThumbsUp(ThumbsUpRecord thumbsUpRecord) {
        ThumbsUpRecord exists = new LambdaQueryChainWrapper<>(thumbsUpRecordService.getBaseMapper())
                .eq(ThumbsUpRecord::getUserId, thumbsUpRecord.getUserId())
                .eq(ThumbsUpRecord::getRefId, thumbsUpRecord.getRefId())
                .eq(ThumbsUpRecord::getThumbsUpType, thumbsUpRecord.getThumbsUpType())
                .one();
        boolean add = false;
        if (Objects.nonNull(exists)) {
            // 取消点赞
            thumbsUpRecordService.removeById(exists.getId());
        } else {
            // 点赞
            thumbsUpRecordService.save(thumbsUpRecord);
            add = true;
        }
        // 处理缓存
        Video video = baseMapper.selectById(thumbsUpRecord.getRefId());
        if (cache.exist(CachePrefix.VIDEO_THUMBS_UP_NUM.getPrefixWithId(thumbsUpRecord.getRefId()))) {
            if (add) {
                cache.incr(CachePrefix.VIDEO_THUMBS_UP_NUM.getPrefixWithId(thumbsUpRecord.getRefId()));
            } else {
                cache.decr(CachePrefix.VIDEO_THUMBS_UP_NUM.getPrefixWithId(thumbsUpRecord.getRefId()));
            }
        } else {
            if (Objects.nonNull(video)) {
                cache.put(CachePrefix.VIDEO_THUMBS_UP_NUM.getPrefixWithId(video.getId()),
                        video.getThumbsUpNum() + (add ? 1 : -1),
                        RedisKeyExpireConstant.VIDEO_THUMBS_UP_EXPIRE,
                        RedisKeyExpireConstant.EXPIRE_DAY);
            }
        }
        // 标识该视频需要通过定时任务统计收藏数
        if (Objects.nonNull(video) && ! video.getCollectNumJob()) {
            new LambdaUpdateChainWrapper<>(baseMapper)
                    .eq(Video::getId, video.getId())
                    .set(Video::getThumbsUpNumJob, Boolean.TRUE)
                    .update();
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateThumbsUpNumBatch(List<CollectTypeNumVO> numList) {
        // 按200条数据进行拆分
        List<List<CollectTypeNumVO>> chunks = ListUtils.partition(numList, 200);
        for (List<CollectTypeNumVO> chunk : chunks) {
            baseMapper.updateThumbsUpNumBatch(chunk);
            new LambdaUpdateChainWrapper<>(baseMapper)
                    .in(Video::getId, chunk.stream().map(CollectTypeNumVO::getId).collect(Collectors.toList()))
                    .set(Video::getThumbsUpNumJob, Boolean.FALSE)
                    .update();
        }
    }
}