peng
2 天以前 6d95ff17f7d0de0b3efafe033ba1e3b4487d4f2e
framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java
@@ -4,6 +4,7 @@
import cn.lili.cache.CachePrefix;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.utils.CommonUtil;
import cn.lili.elasticsearch.EsSuffix;
import cn.lili.modules.lmk.constant.RedisKeyExpireConstant;
import cn.lili.modules.lmk.domain.dto.VideoEsUpdateDTO;
@@ -18,6 +19,8 @@
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.FootprintService;
import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.permission.entity.dos.AdminUser;
import cn.lili.modules.permission.service.AdminUserService;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.CommentTagsEnum;
@@ -46,6 +49,7 @@
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import cn.lili.utils.PageUtil;
@@ -54,6 +58,8 @@
import org.springframework.util.Assert;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -81,7 +87,7 @@
    private final VideoGoodsService videoGoodsService;
    private final KitchenTypeService kitchenTypeService;
    private final Cache cache;
    private final AdminUserService adminUserService;
    private final RocketmqCustomProperties rocketmqCustomProperties;
    private final RocketMQTemplate rocketMQTemplate;
    private final ThumbsUpRecordService thumbsUpRecordService;
@@ -250,6 +256,83 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result systemPublish(WxVideoForm form) {
        // 1.保存视频
        Video video = WxVideoForm.getEntityByForm(form, null);
        video.setAuthorId(UserContext.getCurrentUserId());
        video.setStatus(VideoStatusEnum.PUBLISHED.getValue());
        video.setCoverUrl(form.getCover());
        video.setVideoType(VideoTypeEnum.VIDEO.getValue());
        video.setRecommend(Boolean.FALSE);
        if (VideoContentTypeEnum.IMG.getValue().equals(form.getVideoContentType())) {
            video.setVideoImgs(JSON.toJSONString(form.getVideoImgs()));
        }
        baseMapper.insert(video);
        // 2.处理标签
        List<SimpleVideoTagVO> esTagList = new ArrayList<>(2);
        List<VideoTagRef> videoTagRefs = form.getTags().stream().map(tag -> {
            VideoTagRef videoTagRef = new VideoTagRef();
            videoTagRef.setVideoId(video.getId());
            if (StringUtils.isBlank(tag.getId())) {
                VideoTag videoTag = new LambdaQueryChainWrapper<>(videoTagService.getBaseMapper())
                        .eq(VideoTag::getTagName, tag.getTagName())
                        .one();
                if (Objects.nonNull(videoTag)) {
                    videoTagRef.setVideoTagId(videoTag.getId());
                } else {
                    videoTag = new VideoTag();
                    videoTag.setTagName(tag.getTagName());
                    videoTag.setCreateType(TagCreateTypeEnum.SYSTEM.getValue());
                    videoTagService.save(videoTag);
                    videoTagRef.setVideoTagId(videoTag.getId());
                }
            } else {
                videoTagRef.setVideoTagId(tag.getId());
            }
            SimpleVideoTagVO esTag = new SimpleVideoTagVO();
            esTag.setVideoId(video.getId());
            esTag.setTagName(tag.getTagName());
            esTag.setId(tag.getId());
            esTagList.add(esTag);
            return videoTagRef;
        }).collect(Collectors.toList());
        videoTagRefService.saveBatch(videoTagRefs);
        // 3. 保存视频文件信息
        lmkFileService.addByForm(form.getFileInfo());
        // 4. 处理选择的商品
        List<VideoGoods> videoGoods = new ArrayList<>(2);
        if (CollectionUtils.isNotEmpty(form.getGoodsList())) {
            for (int i = 0; i < form.getGoodsList().size(); i++) {
                VideoGoods e = new VideoGoods();
                e.setVideoId(video.getId());
                e.setGoodsId(form.getGoodsList().get(i).getGoodsId());
                e.setGoodsSkuId(form.getGoodsList().get(i).getGoodsSkuId());
                e.setGoodsNum(form.getGoodsList().get(i).getGoodsNum());
                e.setOrderNum(i);
                videoGoodsService.save(e);
            }
            videoGoodsService.saveBatch(videoGoods);
        }
        // 5. 构建es中数据,mq异步处理
        VideoIndex videoIndex = new VideoIndex();
        BeanUtils.copyProperties(video, videoIndex);
        videoIndex.setAuthorName(UserContext.getCurrentUser().getNickName());
        videoIndex.setAuthorAvatar(UserContext.getCurrentUser().getFace());
        videoIndex.setCoverFileKey(video.getCoverUrl());
        List<VideoGoodsDetailVO> esGoodsList = videoGoods.stream().map(goods -> {
            VideoGoodsDetailVO vo = new VideoGoodsDetailVO();
            BeanUtils.copyProperties(goods, vo);
            return vo;
        }).collect(Collectors.toList());
        videoIndex.setGoodsList(esGoodsList);
        videoIndex.setTagList(esTagList);
        String destination = rocketmqCustomProperties.getVideoTopic() + ":" + VideoTagsEnum.ES_DOC_ADD_OR_UPDATE.name();
        rocketMQTemplate.asyncSend(destination, JSON.toJSONString(videoIndex), RocketmqSendCallbackBuilder.commonCallback());
        return Result.ok("发布成功,视频审核中~");
    }
    @Override
    public Result updatePublish(WxVideoForm form) {
        Video video = baseMapper.selectById(form.getId());
        if (Objects.isNull(video)) {
@@ -347,7 +430,16 @@
            // 3. 获取视频临时访问地址、设置视频标签
            page.getRecords().forEach(v -> {
                v.setTagList(tagMap.get(v.getId()));
                v.setCoverUrl(cosUtil.getPreviewUrl(v.getCoverUrl()));
                String coverUrl = v.getCoverUrl();
                if (StringUtils.isNotBlank(coverUrl)&&!coverUrl.contains("http")) {
                    v.setCoverUrl(cosUtil.getPreviewUrl(v.getCoverUrl()));
                }
                v.getGoodsList().forEach(goods ->{
                    if (StringUtils.isNotBlank(goods.getThumbnail())&&!goods.getThumbnail().contains("http")) {
                        goods.setThumbnail(cosUtil.getPreviewUrl(goods.getThumbnail()));
                    }
                });
            });
        }
        return Result.ok().data(page.getRecords()).total(page.getTotal());
@@ -472,6 +564,17 @@
        switch (query.getVideoFrom()) {
            case "recommend":// 加载推荐视频
                baseMapper.recommendVideo(page, query);
                //推荐视频重新排序
                buildRecommendVideoList(page, query.getVideoId());
//                WxVideoVO wxVideoVO = null;
//                if (StringUtils.isNotBlank(query.getVideoId())) {
//                    wxVideoVO  = baseMapper.recommendVideoByVideoId(query);
//                }
//                List<WxVideoVO> records = page.getRecords();
//                Collections.shuffle(records);
//                if (wxVideoVO!=null) {
//                    records.set(0, wxVideoVO);
//                }
                break;
            case "author":  // 加载视频主页我发布的视频
                AuthorVideoQuery query1 = new AuthorVideoQuery();
@@ -531,7 +634,10 @@
                v.setCommentNum(this.getCommentNum(v.getId(), v.getCommentNum()));
                v.setCollectNum(this.getCollectNum(v.getId(), v.getCollectNum()));
                v.setThumbsUpNum(this.getThumbsUpNum(v.getId(), v.getThumbsUpNum()));
                v.setAuthorAvatar(cosUtil.getPreviewUrl(v.getAuthorAvatar()));
                String authorAvatar = v.getAuthorAvatar();
                if (StringUtils.isNotBlank(authorAvatar)&&!authorAvatar.contains("http")) {
                    v.setAuthorAvatar(cosUtil.getPreviewUrl(v.getAuthorAvatar()));
                }
                if (VideoContentTypeEnum.VIDEO.getValue().equals(v.getVideoContentType())) {
                    v.setVideoUrl(cosUtil.getPreviewUrl(v.getVideoFileKey()));
                    v.setCoverUrl(cosUtil.getPreviewUrl(v.getCoverFileKey()));
@@ -556,7 +662,7 @@
     * @param mysqlNum
     * @return
     */
    private Integer getCommentNum(String videoId, Integer mysqlNum) {
    public Integer getCommentNum(String videoId, Integer mysqlNum) {
        Object redisNum = cache.get(CachePrefix.VIDEO_COMMENT_NUM.getPrefixWithId(videoId));
        if (Objects.isNull(redisNum)) {
            // redis中没有就把数据库的写到redis中
@@ -573,7 +679,7 @@
     * @param mysqlNum
     * @return
     */
    private Integer getCollectNum(String videoId, Integer mysqlNum) {
    public Integer getCollectNum(String videoId, Integer mysqlNum) {
        Object redisNum = cache.get(CachePrefix.VIDEO_COLLECT_NUM.getPrefixWithId(videoId));
        if (Objects.isNull(redisNum)) {
            // redis中没有就把数据库的写到redis中
@@ -590,7 +696,7 @@
     * @param mysqlNum
     * @return
     */
    private Integer getThumbsUpNum(String videoId, Integer mysqlNum) {
    public Integer getThumbsUpNum(String videoId, Integer mysqlNum) {
        Object redisNum = cache.get(CachePrefix.VIDEO_THUMBS_UP_NUM.getPrefixWithId(videoId));
        if (Objects.isNull(redisNum)) {
            // redis中没有就把数据库的写到redis中
@@ -604,7 +710,10 @@
    public Result healthRecommendVideo(WxHealthVideoQuery query) {
        IPage<WxVideoVO> page = PageUtil.getPage(query, WxVideoVO.class);
        //获取大健康视频列表
        baseMapper.recommendHealthVideo(page,query);
        buildRecommendVideoList(page, query.getVideoId());
        if (page.getTotal() > 0) {
            page.getRecords().forEach(v -> {
                v.setAuthorAvatar(cosUtil.getPreviewUrl(v.getAuthorAvatar()));
@@ -628,8 +737,11 @@
    @Override
    public Result kitchenRecommendVideo(WxKitchenVideoQuery query) {
        IPage<WxVideoVO> page = PageUtil.getPage(query, WxVideoVO.class);
         baseMapper.wxKitchenVideoQuery(page, query);
         page.getRecords().forEach(v -> {
        baseMapper.wxKitchenVideoQuery(page, query);
        buildRecommendVideoList(page, query.getVideoId());
        page.getRecords().forEach(v -> {
             v.setAuthorAvatar(cosUtil.getPreviewUrl(v.getAuthorAvatar()));
             if (VideoContentTypeEnum.VIDEO.getValue().equals(v.getVideoContentType())) {
                 v.setVideoUrl(cosUtil.getPreviewUrl(v.getVideoFileKey()));
@@ -637,6 +749,51 @@
             }
         });
        return Result.ok().data(page.getRecords()).total(page.getTotal());
    }
    /**
     *
     * @param page
     * @param videoId videoId推荐的视频id
     */
    private void buildRecommendVideoList(IPage<WxVideoVO> page, String videoId) {
        //查询到有视频列表
        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(page.getRecords())){
            //现将视频顺序打乱
            Collections.shuffle(page.getRecords());
            WxVideoVO wxVideoVO = null;
            if (StringUtils.isNotBlank(videoId)){
                VideoQuery videoQuery = new VideoQuery();
                videoQuery.setVideoId(videoId);
                wxVideoVO  = baseMapper.recommendVideoByVideoId(videoQuery);
                boolean found = false;
                int foundIndex = -1;
                List<WxVideoVO> records = page.getRecords();
                //判断二维码过来的videoId是否存在与page.getRecords重复 记录下标
                for (int i = 0; i < records.size(); i++) {
                    if (wxVideoVO.getId().equals(records.get(i).getId())) {
                        found = true;
                        foundIndex = i;
                        break;
                    }
                }
                if (found){
                    WxVideoVO matchedRecord = records.remove(foundIndex);
                    records.add(0, matchedRecord);
                }else {
                    // 如果没找到,替换首位
                    records.set(0, wxVideoVO);
                }
            }
        }
    }
    @Override
@@ -704,7 +861,13 @@
    @Override
    public Result getAuthorInfo(String authorId) {
        VideoAccountVO vo = baseMapper.getAuthorInfo(authorId, UserContext.getCurrentUserId());
        AdminUser adminUser = adminUserService.getById(authorId);
        VideoAccountVO vo;
        if (Objects.isNull(adminUser)) {
            vo  = baseMapper.getAuthorInfo(authorId, UserContext.getCurrentUserId());
        }else {
            vo = baseMapper.getAuthorInfoAdmin(authorId, UserContext.getCurrentUserId());
        }
        vo.setSelf(authorId.equals(UserContext.getCurrentUserId()));
        // 查询获赞数
        List<String> videoIds = baseMapper.getVideoIdsByAuthor(authorId);