From d4d9ea89dd109cb975eaa3412a15c5ff6e8d11dd Mon Sep 17 00:00:00 2001 From: peng <peng.com> Date: 星期三, 02 七月 2025 18:58:33 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev --- framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java | 925 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 860 insertions(+), 65 deletions(-) diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java index fd8bf5d..ad439e9 100644 --- a/framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java +++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java @@ -1,31 +1,51 @@ package cn.lili.modules.lmk.service.impl; +import cn.lili.cache.Cache; +import cn.lili.cache.CachePrefix; +import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.security.context.UserContext; +import cn.lili.elasticsearch.EsSuffix; +import cn.lili.modules.lmk.constant.RedisKeyExpireConstant; +import cn.lili.modules.lmk.domain.dto.VideoEsUpdateDTO; import cn.lili.modules.lmk.domain.entity.*; +import cn.lili.modules.lmk.domain.es.VideoIndex; import cn.lili.modules.lmk.domain.form.*; -import cn.lili.modules.lmk.domain.query.AuthorVideoQuery; -import cn.lili.modules.lmk.domain.query.ManagerVideoQuery; +import cn.lili.modules.lmk.domain.query.*; import cn.lili.modules.lmk.domain.vo.*; -import cn.lili.modules.lmk.enums.general.TagCreateTypeEnum; -import cn.lili.modules.lmk.enums.general.VideoStatusEnum; -import cn.lili.modules.lmk.enums.general.VideoSupportOpEnum; -import cn.lili.modules.lmk.enums.general.ViewTypeEnum; +import cn.lili.modules.lmk.enums.general.*; import cn.lili.modules.lmk.service.*; import cn.lili.modules.member.entity.dos.FootPrint; 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.search.entity.dos.EsGoodsIndex; +import cn.lili.rocketmq.RocketmqSendCallbackBuilder; +import cn.lili.rocketmq.tags.CommentTagsEnum; +import cn.lili.rocketmq.tags.VideoTagsEnum; import cn.lili.utils.COSUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.metadata.IPage; import cn.lili.modules.lmk.mapper.VideoMapper; import cn.lili.base.Result; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import cn.lili.modules.lmk.domain.query.VideoQuery; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.lucene.search.join.ScoreMode; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.elasticsearch.index.query.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.elasticsearch.core.ElasticsearchOperations; +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.stereotype.Service; import lombok.RequiredArgsConstructor; import cn.lili.utils.PageUtil; @@ -57,35 +77,19 @@ private final MySubscribeService mySubscribeService; private final MemberService memberService; private final VideoAccountService videoAccountService; + private final KitchenVideoTypeRefService kitchenVideoTypeRefService; + private final VideoGoodsService videoGoodsService; + private final KitchenTypeService kitchenTypeService; + private final Cache cache; + private final RocketmqCustomProperties rocketmqCustomProperties; + private final RocketMQTemplate rocketMQTemplate; + private final ThumbsUpRecordService thumbsUpRecordService; + private final ElasticsearchOperations restTemplate; - /** - * 娣诲姞 - * @param form - * @return - */ - @Override - public Result add(VideoForm form) { - Video entity = VideoForm.getEntityByForm(form, null); - baseMapper.insert(entity); - return Result.ok("娣诲姞鎴愬姛"); - } + @Qualifier("videoEsServiceImpl") + private final EsService esService; - /** - * 淇敼 - * @param form - * @return - */ - @Override - public Result update(VideoForm form) { - Video entity = baseMapper.selectById(form.getId()); - - // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊 - Assert.notNull(entity, "璁板綍涓嶅瓨鍦�"); - BeanUtils.copyProperties(form, entity); - baseMapper.updateById(entity); - return Result.ok("淇敼鎴愬姛"); - } /** * 鎵归噺鍒犻櫎 @@ -104,8 +108,18 @@ * @return */ @Override + @Transactional(rollbackFor = Exception.class) public Result removeById(String id) { baseMapper.deleteById(id); + new LambdaUpdateChainWrapper<>(videoGoodsService.getBaseMapper()) + .eq(VideoGoods::getVideoId, id) + .remove(); + new LambdaUpdateChainWrapper<>(videoTagRefService.getBaseMapper()) + .eq(VideoTagRef::getVideoId, id) + .remove(); + // mq寮傛鍒犻櫎es鏁版嵁 + String destination = rocketmqCustomProperties.getVideoTopic() + ":" + VideoTagsEnum.ES_DOC_DEL.name(); + rocketMQTemplate.asyncSend(destination, id, RocketmqSendCallbackBuilder.commonCallback()); return Result.ok("鍒犻櫎鎴愬姛"); } @@ -132,7 +146,16 @@ Assert.notNull(vo, "璁板綍涓嶅瓨鍦�"); List<SimpleVideoTagVO> tags = videoTagRefService.getTagsByVideoIds(Arrays.asList(id)); vo.setTagList(tags); - vo.setVideoUrl(cosUtil.getPreviewUrl(vo.getVideoFileKey())); + if (VideoContentTypeEnum.VIDEO.getValue().equals(vo.getVideoContentType())) { + vo.setVideoUrl(cosUtil.getPreviewUrl(vo.getVideoFileKey())); + } 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(vo.getGoodsList())) { + vo.getGoodsList().stream().forEach(goods -> { + goods.setThumbnail(cosUtil.getPreviewUrl(goods.getThumbnail())); + }); + } return Result.ok().data(vo); } @@ -151,14 +174,20 @@ @Override @Transactional(rollbackFor = Exception.class) - public Result publish(VideoForm form) { + public Result publish(WxVideoForm form) { // 1.淇濆瓨瑙嗛 - Video video = VideoForm.getEntityByForm(form, null); + Video video = WxVideoForm.getEntityByForm(form, null); video.setAuthorId(UserContext.getCurrentUserId()); video.setStatus(VideoStatusEnum.AUDITING.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()); @@ -178,14 +207,132 @@ } 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.淇濆瓨瑙嗛鏂囦欢淇℃伅 + // 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)) { + return Result.error("淇敼瑙嗛涓嶅瓨鍦�"); + } + // 1.淇敼瑙嗛 + WxVideoForm.getEntityByForm(form, video); + video.setAuthorId(UserContext.getCurrentUserId()); + video.setStatus(VideoStatusEnum.AUDITING.getValue()); + video.setCoverUrl(form.getCover()); + video.setVideoType(VideoTypeEnum.VIDEO.getValue()); + if (VideoContentTypeEnum.IMG.getValue().equals(form.getVideoContentType())) { + video.setVideoImgs(JSON.toJSONString(form.getVideoImgs())); + } + baseMapper.updateById(video); + // 2.澶勭悊鏍囩---鍒犻櫎涔嬪墠鐨勮棰戞爣绛惧叧绯伙紝鍐嶆柊澧� + new LambdaUpdateChainWrapper<>(videoTagRefService.getBaseMapper()) + .eq(VideoTagRef::getVideoId, video.getId()) + .remove(); + 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.USER.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. 澶勭悊閫夋嫨鐨勫晢鍝侊紝鍏堝垹闄や箣鍓嶇殑鍐嶆柊澧� + new LambdaUpdateChainWrapper<>(videoGoodsService.getBaseMapper()) + .eq(VideoGoods::getVideoId, video.getId()) + .remove(); + 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); + videoGoods.add(e); + } + videoGoodsService.saveBatch(videoGoods); + } + // 5. 鏇存柊es涓殑鏁版嵁锛宮q寮傛澶勭悊 + 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 managerPage(ManagerVideoQuery query) { @@ -196,7 +343,7 @@ if (page.getTotal() > 0) { Map<String, List<SimpleVideoTagVO>> tagMap = videoTagRefService.getTagsByVideoIds( page.getRecords().stream().map(VideoVO::getId).collect(Collectors.toList()) - ).stream().collect(Collectors.groupingBy(SimpleVideoTagVO::getVideoId));; + ).stream().collect(Collectors.groupingBy(SimpleVideoTagVO::getVideoId)); // 3. 鑾峰彇瑙嗛涓存椂璁块棶鍦板潃銆佽缃棰戞爣绛� page.getRecords().forEach(v -> { v.setTagList(tagMap.get(v.getId())); @@ -212,6 +359,15 @@ .eq(Video::getId, form.getId()) .set(Video::getRecommend, form.getRecommend()) .update(); + + // mq寮傛鏇存柊es + Map<String, Object> fields = new HashMap<>(2); + fields.put("recommend", form.getRecommend()); + VideoEsUpdateDTO dto = new VideoEsUpdateDTO(); + dto.setId(form.getId()); + dto.setFields(fields); + String destination = rocketmqCustomProperties.getVideoTopic() + ":" + VideoTagsEnum.ES_DOC_UPDATE_SOME_FIELD.name(); + rocketMQTemplate.asyncSend(destination, JSON.toJSONString(dto), RocketmqSendCallbackBuilder.commonCallback()); return Result.ok("璁剧疆鎴愬姛"); } @@ -231,34 +387,81 @@ } videoAuditRecordService.save(auditRecord); // 2. 淇敼瑙嗛鐘舵�� + Map<String, Object> fields = new HashMap<>(2); if (form.getResult()) { video.setStatus(VideoStatusEnum.PUBLISHED.getValue()); video.setAuditPassTime(new Date()); + + fields.put("status", VideoStatusEnum.PUBLISHED.getValue()); } else { video.setStatus(VideoStatusEnum.REJECT.getValue()); + fields.put("status", VideoStatusEnum.REJECT.getValue()); } baseMapper.updateById(video); + + // 3. mq寮傛鏇存柊es + VideoEsUpdateDTO dto = new VideoEsUpdateDTO(); + dto.setId(video.getId()); + dto.setFields(fields); + String destination = rocketmqCustomProperties.getVideoTopic() + ":" + VideoTagsEnum.ES_DOC_UPDATE_SOME_FIELD.name(); + rocketMQTemplate.asyncSend(destination, JSON.toJSONString(dto), RocketmqSendCallbackBuilder.commonCallback()); return Result.ok(); } @Override public Result up(String id) { + // 1. 鏇存柊鏁版嵁搴� new LambdaUpdateChainWrapper<>(baseMapper) .eq(Video::getId, id) .set(Video::getStatus, VideoStatusEnum.PUBLISHED.getValue()) .update(); + // 2. mq寮傛鏇存柊es + Map<String, Object> fields = new HashMap<>(2); + fields.put("status", VideoStatusEnum.PUBLISHED.getValue()); + VideoEsUpdateDTO dto = new VideoEsUpdateDTO(); + dto.setId(id); + dto.setFields(fields); + String destination = rocketmqCustomProperties.getVideoTopic() + ":" + VideoTagsEnum.ES_DOC_UPDATE_SOME_FIELD.name(); + rocketMQTemplate.asyncSend(destination, JSON.toJSONString(dto), RocketmqSendCallbackBuilder.commonCallback()); return Result.ok("涓婃灦鎴愬姛"); } @Override public Result down(VideoDownForm form) { + // 1. 鏇存柊鏁版嵁搴� new LambdaUpdateChainWrapper<>(baseMapper) .eq(Video::getId, form.getId()) .set(Video::getStatus, VideoStatusEnum.DISABLE.getValue()) .update(); + // 2. mq寮傛鏇存柊es + Map<String, Object> fields = new HashMap<>(2); + fields.put("status", VideoStatusEnum.DISABLE.getValue()); + VideoEsUpdateDTO dto = new VideoEsUpdateDTO(); + dto.setId(form.getId()); + dto.setFields(fields); + String destination = rocketmqCustomProperties.getVideoTopic() + ":" + VideoTagsEnum.ES_DOC_UPDATE_SOME_FIELD.name(); + rocketMQTemplate.asyncSend(destination, JSON.toJSONString(dto), RocketmqSendCallbackBuilder.commonCallback()); // TODO 灏嗕笅鏋跺師鍥犱互閫氱煡鐨勬柟寮忓憡鐭ョ敤鎴� + + return Result.ok("涓嬫灦鎴愬姛"); + } + + @Override + public Result buyerDownVideo(String id) { + new LambdaUpdateChainWrapper<>(baseMapper) + .eq(Video::getId, id) + .set(Video::getStatus, VideoStatusEnum.DISABLE.getValue()) + .update(); + // 2. mq寮傛鏇存柊es + Map<String, Object> fields = new HashMap<>(2); + fields.put("status", VideoStatusEnum.DISABLE.getValue()); + VideoEsUpdateDTO dto = new VideoEsUpdateDTO(); + dto.setId(id); + dto.setFields(fields); + String destination = rocketmqCustomProperties.getVideoTopic() + ":" + VideoTagsEnum.ES_DOC_UPDATE_SOME_FIELD.name(); + rocketMQTemplate.asyncSend(destination, JSON.toJSONString(dto), RocketmqSendCallbackBuilder.commonCallback()); return Result.ok("涓嬫灦鎴愬姛"); } @@ -267,19 +470,33 @@ // 鎺ㄨ崘绠楁硶锛� 1. 鏍规嵁鐢ㄦ埛鐨勬敹钘忚棰戠殑鏍囩 2. 鏍规嵁鐢ㄦ埛鍏虫敞鐨勪綔鑰呯殑鍏跺畠瑙嗛 3. 鏍规嵁鐢ㄦ埛鐨勮鐪嬭褰曪紙瑙傜湅鏃堕暱杈冮暱鐨勩�侀噸澶嶈鐪嬫鏁拌緝澶氱殑锛� 4. 鍩轰簬鐩镐技鐢ㄦ埛鐨勮鐪嬭涓烘潵缁欒鐢ㄦ埛鎺ㄨ崘 IPage<WxVideoVO> page = PageUtil.getPage(query, WxVideoVO.class); switch (query.getVideoFrom()) { - case "recommend": - baseMapper.recommendVideo(page); + case "recommend":// 鍔犺浇鎺ㄨ崘瑙嗛 + baseMapper.recommendVideo(page, query); break; - case "author": + case "author": // 鍔犺浇瑙嗛涓婚〉鎴戝彂甯冪殑瑙嗛 AuthorVideoQuery query1 = new AuthorVideoQuery(); + BeanUtils.copyProperties(query, query1); query1.setAuthorId(query.getAuthorId()); baseMapper.getAuthorVideoPage(page, query1); break; - case "collect": + case "collect": // 鍔犺浇瑙嗛涓婚〉鏀惰棌瑙嗛 AuthorVideoQuery query2 = new AuthorVideoQuery(); + BeanUtils.copyProperties(query, query2); query2.setAuthorId(query.getAuthorId()); baseMapper.getAuthorCollectVideoPage(page, query2); break; + case "like": // 鍔犺浇瑙嗛涓婚〉鐐硅禐瑙嗛 + AuthorVideoQuery query3 = new AuthorVideoQuery(); + BeanUtils.copyProperties(query, query3); + query3.setAuthorId(query.getAuthorId()); + baseMapper.getAuthorLikeVideoPage(page, query3); + break; + case "search": // 鍔犺浇es鎼滅储瑙嗛 + VideoEsQuery query4 = new VideoEsQuery(); + BeanUtils.copyProperties(query, query4); + query4.setPageNumber((int) query.getPageNumber()); + query4.setPageSize((int) query.getPageSize()); + return this.esSearch(query4); default: break; } @@ -288,41 +505,163 @@ 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.setGoods(new VideoGoodsVO()); v.setTagList(tagMap.get(v.getId())); v.setCollected(CollectionUtils.isNotEmpty(collectMap.get(v.getId()))); - v.setVideoUrl(cosUtil.getPreviewUrl(v.getVideoFileKey())); -// v.setVideoUrl("https://videos.pexels.com/video-files/13602965/13602965-hd_1920_1080_30fps.mp4"); - v.setCoverUrl(cosUtil.getPreviewUrl(v.getCoverFileKey())); + 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())); }); } return Result.ok().data(page.getRecords()); } + /** + * 浠巖edis涓幏鍙栬瘎璁烘暟閲忥紝濡傛灉redis涓病鏈夊垯灏唌ysql涓殑鏁伴噺鍐欏叆鍒皉edis + * + * @param videoId + * @param mysqlNum + * @return + */ + private Integer getCommentNum(String videoId, Integer mysqlNum) { + Object redisNum = cache.get(CachePrefix.VIDEO_COMMENT_NUM.getPrefixWithId(videoId)); + if (Objects.isNull(redisNum)) { + // redis涓病鏈夊氨鎶婃暟鎹簱鐨勫啓鍒皉edis涓� + cache.put(CachePrefix.VIDEO_COMMENT_NUM.getPrefixWithId(videoId), mysqlNum, RedisKeyExpireConstant.COMMENT_NUM_EXPIRE, RedisKeyExpireConstant.EXPIRE_DAY); + return mysqlNum; + } + return (Integer) redisNum; + } + + /** + * 浠巖edis涓幏鍙栨敹钘忔暟閲忥紝濡傛灉redis涓病鏈夊垯灏唌ysql涓殑鏁伴噺鍐欏叆鍒皉edis + * + * @param videoId + * @param mysqlNum + * @return + */ + private Integer getCollectNum(String videoId, Integer mysqlNum) { + Object redisNum = cache.get(CachePrefix.VIDEO_COLLECT_NUM.getPrefixWithId(videoId)); + if (Objects.isNull(redisNum)) { + // redis涓病鏈夊氨鎶婃暟鎹簱鐨勫啓鍒皉edis涓� + cache.put(CachePrefix.VIDEO_COLLECT_NUM.getPrefixWithId(videoId), mysqlNum, RedisKeyExpireConstant.COLLECT_NUM_EXPIRE, RedisKeyExpireConstant.EXPIRE_DAY); + return mysqlNum; + } + return (Integer) redisNum; + } + + /** + * 浠巖edis涓幏鍙栫偣璧炴暟閲忥紝濡傛灉redis涓病鏈夊垯灏唌ysql涓殑鏁伴噺鍐欏叆鍒皉edis + * + * @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涓病鏈夊氨鎶婃暟鎹簱鐨勫啓鍒皉edis涓� + 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); + //鑾峰彇澶у仴搴疯棰戝垪琛� + baseMapper.recommendHealthVideo(page,query); + if (page.getTotal() > 0) { + page.getRecords().forEach(v -> { + 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(cosUtil::getPreviewUrl).collect(Collectors.toList())); + } + }); + } + return Result.ok().data(page.getRecords()); + } + + @Override + public Result kitchenTypeList() { + List<KitchenType> list = kitchenTypeService.list(Wrappers.<KitchenType>lambdaQuery().orderByAsc(KitchenType::getSortNum)); + return Result.ok().data(list); + } + + @Override + public Result kitchenRecommendVideo(WxKitchenVideoQuery query) { + IPage<WxVideoVO> page = PageUtil.getPage(query, WxVideoVO.class); + baseMapper.wxKitchenVideoQuery(page, query); + page.getRecords().forEach(v -> { + if (VideoContentTypeEnum.VIDEO.getValue().equals(v.getVideoContentType())) { + v.setVideoUrl(cosUtil.getPreviewUrl(v.getVideoFileKey())); + v.setCoverUrl(cosUtil.getPreviewUrl(v.getCoverFileKey())); + } + }); + return Result.ok().data(page.getRecords()).total(page.getTotal()); + } + @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) + .in(Video::getId, chunk.stream().map(CollectTypeNumVO::getId).collect(Collectors.toList())) + .set(Video::getCollectNumJob, Boolean.FALSE) + .update(); + // 鏇存柊es鐨勬敹钘忔暟 + for (CollectTypeNumVO vo : chunk) { + Map<String, Object> fields = new HashMap<>(1); + fields.put("collectNum", vo.getCountNum()); + esService.updateSomeField(EsSuffix.VIDEO_INDEX_NAME, vo.getId(), fields); + } } } @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) + .in(Video::getId, chunk.stream().map(CollectTypeNumVO::getId).collect(Collectors.toList())) + .set(Video::getCommentNumJob, Boolean.FALSE) + .update(); + // 鏇存柊es鐨勮瘎璁烘暟 + for (CollectTypeNumVO vo : chunk) { + Map<String, Object> fields = new HashMap<>(1); + fields.put("commentNum", vo.getCountNum()); + esService.updateSomeField(EsSuffix.VIDEO_INDEX_NAME, vo.getId(), fields); + } } } @@ -357,11 +696,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()) { - vo.setCoverUrl(cosUtil.getPreviewUrl(vo.getCoverFileKey())); - vo.setVideoUrl(cosUtil.getPreviewUrl(vo.getVideoFileKey())); -// vo.setVideoUrl("https://videos.pexels.com/video-files/13602965/13602965-hd_1920_1080_30fps.mp4"); - vo.setOptions(VideoSupportOpEnum.getVideoOpByStatus(vo.getStatus())); + 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())); + } } return Result.ok().data(page.getRecords()).total(page.getTotal()); } @@ -370,13 +737,83 @@ public Result getAuthorCollectVideoPage(AuthorVideoQuery query) { IPage<WxVideoVO> page = PageUtil.getPage(query, WxVideoVO.class); baseMapper.getAuthorCollectVideoPage(page, query); - for (WxVideoVO vo : page.getRecords()) { - vo.setCoverUrl(cosUtil.getPreviewUrl(vo.getCoverFileKey())); - vo.setVideoUrl(cosUtil.getPreviewUrl(vo.getVideoFileKey())); -// vo.setVideoUrl("https://videos.pexels.com/video-files/13602965/13602965-hd_1920_1080_30fps.mp4"); - vo.setCollected(Boolean.TRUE); + 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())); + } } 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()); + } + + @Override + public Result getGoodsDetail(String videoId) { + List<VideoGoodsDetailVO> goodsList = baseMapper.getVideoGoods(videoId); + goodsList.stream().forEach(goods -> { + goods.setThumbnail(cosUtil.getPreviewUrl(goods.getThumbnail())); + }); + return Result.ok().data(goodsList); } @Override @@ -400,9 +837,12 @@ if (Objects.isNull(vo)) { return Result.error("瑙嗛涓嶅瓨鍦�"); } - vo.setCoverUrl(cosUtil.getPreviewUrl(vo.getCoverFileKey())); - vo.setVideoUrl(cosUtil.getPreviewUrl(vo.getVideoFileKey())); -// vo.setVideoUrl("https://videos.pexels.com/video-files/13602965/13602965-hd_1920_1080_30fps.mp4"); + 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<WxVideoTagForm> tags = videoTagRefService.getTagsByVideoIds(Arrays.asList(vo.getId())) .stream() .map(i -> { @@ -415,4 +855,359 @@ vo.setTags(tags); return Result.ok().data(vo); } + + @Override + public Result healthVideo(HealthVideoForm form) { + Video video = new Video(); + BeanUtils.copyProperties(form, video); + video.setAuthorId(UserContext.getCurrentUserId()); + video.setVideoType(VideoTypeEnum.HEALTH.getValue()); + //璁剧疆濉厖妯″紡 淇濇寔姣斾緥锛屽畬鏁存樉绀� + video.setVideoFit(form.getVideoFit()); + video.setVideoContentType(VideoContentTypeEnum.VIDEO.getValue()); + video.setStatus(VideoStatusEnum.PUBLISHED.getValue()); + baseMapper.insert(video); + return Result.ok("娣诲姞鎴愬姛"); + } + + @Override + public Result healthPage(HealthVideoQuery query) { + IPage<VideoVO> page = PageUtil.getPage(query, VideoVO.class); + // 1. 鍏堟煡鍑鸿棰戜俊鎭� + baseMapper.healthPage(page, query); + // 2. 鍗曠嫭鏌ュ嚭鏍囩淇℃伅 + if (page.getTotal() > 0) { + Map<String, List<SimpleVideoTagVO>> tagMap = videoTagRefService.getTagsByVideoIds( + page.getRecords().stream().map(VideoVO::getId).collect(Collectors.toList()) + ).stream().collect(Collectors.groupingBy(SimpleVideoTagVO::getVideoId));; + // 3. 鑾峰彇瑙嗛涓存椂璁块棶鍦板潃銆佽缃棰戞爣绛� + page.getRecords().forEach(v -> { + v.setTagList(tagMap.get(v.getId())); + v.setVideoUrl(cosUtil.getPreviewUrl(v.getVideoFileKey())); + v.setCoverShowUrl(cosUtil.getPreviewUrl(v.getCoverUrl())); + }); + } + return Result.ok().data(page.getRecords()).total(page.getTotal()); + } + + @Override + public Result updateHealthVideo(HealthVideoForm form) { + Video entity = baseMapper.selectById(form.getId()); + Assert.notNull(entity, "璁板綍涓嶅瓨鍦�"); + BeanUtils.copyProperties(form, entity); + baseMapper.updateById(entity); + return Result.ok("淇敼鎴愬姛"); + } + + @Override + public Result delHealth(String id) { + Video entity = baseMapper.selectById(id); + Assert.notNull(entity, "璁板綍涓嶅瓨鍦�"); + String videoType = entity.getVideoType(); + if (!VideoTypeEnum.HEALTH.getValue().equals(videoType)) { + log.error("鍒犻櫎闈炲ぇ鍋ュ悍瑙嗛瑙嗛id涓�------->"+id); + return Result.error("鍒犻櫎澶辫触"); + } + baseMapper.deleteById(id); + return Result.ok("鍒犻櫎鎴愬姛"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result addKitchenVideo(KitchenVideoForm form) { + Video video = new Video(); + BeanUtils.copyProperties(form, video); + video.setAuthorId(UserContext.getCurrentUserId()); + video.setVideoType(VideoTypeEnum.COOK.getValue()); + //璁剧疆濉厖妯″紡 淇濇寔姣斾緥锛屽畬鏁存樉绀� + video.setVideoFit(form.getVideoFit()); + video.setVideoContentType(VideoContentTypeEnum.VIDEO.getValue()); + video.setStatus(VideoStatusEnum.PUBLISHED.getValue()); + baseMapper.insert(video); + String id = video.getId(); + List<KitchenVideoTypeRef> collect = form.getCheckKitchenType().stream().map(item -> { + KitchenVideoTypeRef kitchenVideoTypeRef = new KitchenVideoTypeRef(); + //璁剧疆瑙嗛id + kitchenVideoTypeRef.setVideoId(id); + //璁剧疆鏍囩id + kitchenVideoTypeRef.setKitchenTypeId(item); + return kitchenVideoTypeRef; + } + ).collect(Collectors.toList()); + kitchenVideoTypeRefService.saveBatch(collect); + return Result.ok("娣诲姞鎴愬姛"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result updateKitchenVideo(KitchenVideoForm form) { + Video video = baseMapper.selectById(form.getId()); + Assert.notNull(video, "璁板綍涓嶅瓨鍦�"); + BeanUtils.copyProperties(form, video); + baseMapper.updateById(video); + //鍒犻櫎鍘熸潵鐨勭被鍨嬪叧绯� + kitchenVideoTypeRefService.remove(Wrappers.<KitchenVideoTypeRef>lambdaQuery() + .eq(KitchenVideoTypeRef::getVideoId, form.getId())); + String id = video.getId(); + List<KitchenVideoTypeRef> collect = form.getCheckKitchenType().stream().map(item -> { + KitchenVideoTypeRef kitchenVideoTypeRef = new KitchenVideoTypeRef(); + //璁剧疆瑙嗛id + kitchenVideoTypeRef.setVideoId(id); + //璁剧疆鏍囩id + kitchenVideoTypeRef.setKitchenTypeId(item); + return kitchenVideoTypeRef; + } + ).collect(Collectors.toList()); + kitchenVideoTypeRefService.saveBatch(collect); + return Result.ok("淇敼鎴愬姛"); + } + + @Override + public Result KitchenVideoQuery(KitchenVideoQuery query) { + IPage<KitchenVideoVO> page = PageUtil.getPage(query, KitchenVideoVO.class); + // 1. 鍏堟煡鍑鸿棰戜俊鎭� + baseMapper.kitchenPage(page, query); + // 2. 鍗曠嫭鏌ュ嚭鏍囩淇℃伅 + if (page.getTotal() > 0) { + Map<String, List<KitchenVideoTypeVO>> typeMap = kitchenVideoTypeRefService + .getTypeByVideoIds( + page.getRecords() + .stream().map(KitchenVideoVO::getId).collect(Collectors.toList())) + .stream().collect(Collectors.groupingBy(KitchenVideoTypeVO::getVideoId)); + // 3. 鑾峰彇瑙嗛涓存椂璁块棶鍦板潃銆佽缃棰戞爣绛� + page.getRecords().forEach(v -> { + v.setTypeList(typeMap.get(v.getId())); + v.setVideoUrl(cosUtil.getPreviewUrl(v.getVideoFileKey())); + v.setCoverShowUrl(cosUtil.getPreviewUrl(v.getCoverUrl())); + }); + } + return Result.ok().data(page.getRecords()).total(page.getTotal()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result delKitchen(String id) { + Video entity = baseMapper.selectById(id); + Assert.notNull(entity, "璁板綍涓嶅瓨鍦�"); + String videoType = entity.getVideoType(); + if (!VideoTypeEnum.COOK.getValue().equals(videoType)) { + log.error("鍒犻櫎闈炲ぇ绁炲帹瑙嗛瑙嗛id涓�------->"+id); + return Result.error("鍒犻櫎澶辫触"); + } + baseMapper.deleteById(id); + kitchenVideoTypeRefService.remove(Wrappers.<KitchenVideoTypeRef>lambdaQuery() + .eq(KitchenVideoTypeRef::getVideoId, id)); + return Result.ok("鍒犻櫎鎴愬姛"); + } + + /** + * mq鎵ц瑙嗛鐨勬敹钘�/鍙栨秷鏀惰棌 + * + * @param collect + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void mqCollectChange(MyCollect collect) { + MyCollect myCollect = new LambdaQueryChainWrapper<>(myCollectService.getBaseMapper()) + .eq(MyCollect::getCollectType, collect.getCollectType()) + .eq(MyCollect::getRefId, collect.getRefId()) + .eq(MyCollect::getUserId, collect.getUserId()) + .one(); + boolean add = false; + if (Objects.nonNull(myCollect)) { + myCollectService.removeById(myCollect.getId()); + } else { + myCollectService.save(collect); + add = true; + } + // 澶勭悊缂撳瓨 + Video video = baseMapper.selectById(collect.getRefId()); + if (cache.exist(CachePrefix.VIDEO_COLLECT_NUM.getPrefixWithId(collect.getRefId()))) { + if (add) { + cache.incr(CachePrefix.VIDEO_COLLECT_NUM.getPrefixWithId(collect.getRefId())); + } else { + cache.decr(CachePrefix.VIDEO_COLLECT_NUM.getPrefixWithId(collect.getRefId())); + } + } else { + if (Objects.nonNull(video)) { + cache.put(CachePrefix.VIDEO_COLLECT_NUM.getPrefixWithId(video.getId()), + video.getCollectNum() + (add ? 1 : -1), + RedisKeyExpireConstant.COLLECT_NUM_EXPIRE, + RedisKeyExpireConstant.EXPIRE_DAY); + } + } + // 鏍囪瘑璇ヨ棰戦渶瑕侀�氳繃瀹氭椂浠诲姟缁熻鏀惰棌鏁� + if (Objects.nonNull(video) && ! video.getCollectNumJob()) { + new LambdaUpdateChainWrapper<>(baseMapper) + .eq(Video::getId, video.getId()) + .set(Video::getCollectNumJob, Boolean.TRUE) + .update(); + } + } + + @Override + public Result recreateEsIndex() { + String destination = rocketmqCustomProperties.getVideoTopic() + ":" + VideoTagsEnum.ES_RECREATE.name(); + // 娑堟伅浣撲笉鑳戒负绌猴紝闅忎究浼犱竴涓�1 + 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(); + // 鏇存柊es鐨勭偣璧炴暟 + for (CollectTypeNumVO vo : chunk) { + Map<String, Object> fields = new HashMap<>(1); + fields.put("thumbsUpNum", vo.getCountNum()); + esService.updateSomeField(EsSuffix.VIDEO_INDEX_NAME, vo.getId(), fields); + } + } + } + + @Override + public Result esSearch(VideoEsQuery q) { + // 鍒ゆ柇鍟嗗搧绱㈠紩鏄惁瀛樺湪 + if (!restTemplate.indexOps(VideoIndex.class).exists()) { + return Result.ok(); + } + q.setPageNumber(q.getPageNumber() - 1); // 鍓嶇淇濇寔缁熶竴浠庣涓�椤靛紑濮嬶紝浣嗘槸es浠�0椤靛紑濮嬶紝鎵�浠ュ噺涓� + // 鏍规嵁鐐硅禐鏁版帓搴� + Pageable pageable = PageRequest.of(q.getPageNumber(), q.getPageSize(), Sort.by(Sort.Direction.DESC, "thumbsUpNum")); + + NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); + queryBuilder.withPageable(pageable); + + if (StringUtils.isNotBlank(q.getKeyword())) { + // 1. 鏋勫缓涓诲竷灏旀煡璇� + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); + + // 2. 娣诲姞鏍囬鍖归厤锛堥潪宓屽瀛楁锛� + boolQuery.should(QueryBuilders.matchQuery("title", q.getKeyword())); + + // 3. 娣诲姞宓屽鏍囩鍖归厤 + NestedQueryBuilder tagQuery = QueryBuilders.nestedQuery( + "tagList", + QueryBuilders.matchQuery("tagList.tagName", q.getKeyword()), + ScoreMode.Total // 浣跨敤鎬诲垎妯″紡 + ); + boolQuery.should(tagQuery); + + // 4. 娣诲姞宓屽鍟嗗搧鍖归厤 + NestedQueryBuilder goodsQuery = QueryBuilders.nestedQuery( + "goodsList", + QueryBuilders.matchQuery("goodsList.goodsName", q.getKeyword()), + ScoreMode.Total + ); + boolQuery.should(goodsQuery); + + // 5. 璁剧疆鑷冲皯鍖归厤涓�涓潯浠讹紙OR閫昏緫锛� + boolQuery.minimumShouldMatch(1); + + // 6. 鐘舵�佷负宸插彂甯冪殑 + boolQuery.must(QueryBuilders.termQuery("status", VideoStatusEnum.PUBLISHED.getValue())); + queryBuilder.withQuery(boolQuery); + } else { + return Result.ok().data(new ArrayList<>()).total(0); + } + NativeSearchQuery query = queryBuilder.build(); + SearchHits<VideoIndex> searchHits = restTemplate.search(query, VideoIndex.class); + if (CollectionUtils.isEmpty(searchHits.getSearchHits())) { + return Result.ok().data(new ArrayList<>()).total(0); + } + List<VideoIndex> data = searchHits.stream().map(hit -> hit.getContent()).collect(Collectors.toList()); + List<String> videoIds = data.stream().map(VideoIndex::getId).collect(Collectors.toList()); + // 瀵硅薄杞崲 + 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()); + List<WxVideoVO> vos = data.stream().map(videoIndex -> { + WxVideoVO wxVideoVO = new WxVideoVO(); + BeanUtils.copyProperties(videoIndex, wxVideoVO); + // 鍒ゆ柇鏄惁鍏虫敞浣滆�呫�佹槸鍚︾偣璧炪�佹槸鍚︽敹钘� + wxVideoVO.setCollected(CollectionUtils.isNotEmpty(collectMap.get(wxVideoVO.getId()))); + wxVideoVO.setThumbsUp(CollectionUtils.isNotEmpty(thumbsUpMap.get(wxVideoVO.getId()))); + if (UserContext.getCurrentUserId().equals(wxVideoVO.getAuthorId())) { + wxVideoVO.setSubscribeThisAuthor(Boolean.TRUE); + } else { + wxVideoVO.setSubscribeThisAuthor(subscribes.contains(wxVideoVO.getAuthorId())); + } + if (VideoContentTypeEnum.VIDEO.getValue().equals(wxVideoVO.getVideoContentType())) { + wxVideoVO.setCoverUrl(cosUtil.getPreviewUrl(wxVideoVO.getCoverFileKey())); + wxVideoVO.setVideoUrl(cosUtil.getPreviewUrl(wxVideoVO.getVideoFileKey())); + } else if (VideoContentTypeEnum.IMG.getValue().equals(wxVideoVO.getVideoContentType()) && StringUtils.isNotBlank(wxVideoVO.getVideoImgs())) { + wxVideoVO.setImgs(JSON.parseArray(wxVideoVO.getVideoImgs(), String.class).stream().map(fileKey -> cosUtil.getPreviewUrl(fileKey)).collect(Collectors.toList())); + wxVideoVO.setCoverUrl(wxVideoVO.getImgs().get(0)); + } + return wxVideoVO; + }).collect(Collectors.toList()); + return Result.ok().data(vos).total(searchHits.getTotalHits()); + } } -- Gitblit v1.8.0