From aac2321d1cf5536f7ea03f30d55a4aba30fbf710 Mon Sep 17 00:00:00 2001 From: peng <peng.com> Date: 星期三, 02 七月 2025 10:39:39 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev --- framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java | 325 +++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 261 insertions(+), 64 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 980f329..cdfff28 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 @@ -2,9 +2,11 @@ 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.*; @@ -16,6 +18,9 @@ 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.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; @@ -28,6 +33,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; @@ -65,37 +71,10 @@ private final KitchenTypeService kitchenTypeService; private final Cache cache; - @Qualifier("videoEsServiceImpl") - private final EsService videoEsService; + private final RocketmqCustomProperties rocketmqCustomProperties; + private final RocketMQTemplate rocketMQTemplate; + private final ThumbsUpRecordService thumbsUpRecordService; - - /** - * 娣诲姞 - * @param form - * @return - */ - @Override - public Result add(WxVideoForm form) { - Video entity = WxVideoForm.getEntityByForm(form, null); - baseMapper.insert(entity); - return Result.ok("娣诲姞鎴愬姛"); - } - - /** - * 淇敼 - * @param form - * @return - */ - @Override - public Result update(WxVideoForm form) { - Video entity = baseMapper.selectById(form.getId()); - - // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊 - Assert.notNull(entity, "璁板綍涓嶅瓨鍦�"); - BeanUtils.copyProperties(form, entity); - baseMapper.updateById(entity); - return Result.ok("淇敼鎴愬姛"); - } /** * 鎵归噺鍒犻櫎 @@ -123,7 +102,9 @@ new LambdaUpdateChainWrapper<>(videoTagRefService.getBaseMapper()) .eq(VideoTagRef::getVideoId, id) .remove(); - videoEsService.deleteDocument(EsSuffix.VIDEO_INDEX_NAME, id); + // mq寮傛鍒犻櫎es鏁版嵁 + String destination = rocketmqCustomProperties.getVideoTopic() + ":" + VideoTagsEnum.ES_DOC_DEL.name(); + rocketMQTemplate.asyncSend(destination, id, RocketmqSendCallbackBuilder.commonCallback()); return Result.ok("鍒犻櫎鎴愬姛"); } @@ -185,6 +166,7 @@ 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())); } @@ -234,7 +216,7 @@ } videoGoodsService.saveBatch(videoGoods); } - // 5. 鏋勫缓es涓暟鎹� + // 5. 鏋勫缓es涓暟鎹紝mq寮傛澶勭悊 VideoIndex videoIndex = new VideoIndex(); BeanUtils.copyProperties(video, videoIndex); videoIndex.setCoverFileKey(video.getCoverUrl()); @@ -245,7 +227,8 @@ }).collect(Collectors.toList()); videoIndex.setGoodsList(esGoodsList); videoIndex.setTagList(esTagList); - videoEsService.addOrUpdateDocument(EsSuffix.VIDEO_INDEX_NAME, video.getId(), videoIndex); + String destination = rocketmqCustomProperties.getVideoTopic() + ":" + VideoTagsEnum.ES_DOC_ADD_OR_UPDATE.name(); + rocketMQTemplate.asyncSend(destination, JSON.toJSONString(videoIndex), RocketmqSendCallbackBuilder.commonCallback()); return Result.ok("鍙戝竷鎴愬姛锛岃棰戝鏍镐腑~"); } @@ -316,7 +299,7 @@ } videoGoodsService.saveBatch(videoGoods); } - // 5. 鏇存柊es涓殑鏁版嵁 + // 5. 鏇存柊es涓殑鏁版嵁锛宮q寮傛澶勭悊 VideoIndex videoIndex = new VideoIndex(); BeanUtils.copyProperties(video, videoIndex); videoIndex.setCoverFileKey(video.getCoverUrl()); @@ -327,7 +310,8 @@ }).collect(Collectors.toList()); videoIndex.setGoodsList(esGoodsList); videoIndex.setTagList(esTagList); - videoEsService.addOrUpdateDocument(EsSuffix.VIDEO_INDEX_NAME, video.getId(), videoIndex); + String destination = rocketmqCustomProperties.getVideoTopic() + ":" + VideoTagsEnum.ES_DOC_ADD_OR_UPDATE.name(); + rocketMQTemplate.asyncSend(destination, JSON.toJSONString(videoIndex), RocketmqSendCallbackBuilder.commonCallback()); return Result.ok("鍙戝竷鎴愬姛锛岃棰戝鏍镐腑~"); } @@ -356,9 +340,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()); - videoEsService.updateSomeField(EsSuffix.VIDEO_INDEX_NAME, form.getId(), fields); + 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("璁剧疆鎴愬姛"); } @@ -378,17 +368,24 @@ } videoAuditRecordService.save(auditRecord); // 2. 淇敼瑙嗛鐘舵�� + Map<String, Object> fields = new HashMap<>(2); if (form.getResult()) { video.setStatus(VideoStatusEnum.PUBLISHED.getValue()); video.setAuditPassTime(new Date()); - Map<String, Object> fields = new HashMap<>(2); fields.put("status", VideoStatusEnum.PUBLISHED.getValue()); - videoEsService.updateSomeField(EsSuffix.VIDEO_INDEX_NAME, video.getId(), fields); } 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(); } @@ -400,10 +397,14 @@ .eq(Video::getId, id) .set(Video::getStatus, VideoStatusEnum.PUBLISHED.getValue()) .update(); - // 2. 鏇存柊es + // 2. mq寮傛鏇存柊es Map<String, Object> fields = new HashMap<>(2); fields.put("status", VideoStatusEnum.PUBLISHED.getValue()); - videoEsService.updateSomeField(EsSuffix.VIDEO_INDEX_NAME, id, fields); + 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("涓婃灦鎴愬姛"); } @@ -415,10 +416,14 @@ .eq(Video::getId, form.getId()) .set(Video::getStatus, VideoStatusEnum.DISABLE.getValue()) .update(); - // 2. 鏇存柊es + // 2. mq寮傛鏇存柊es Map<String, Object> fields = new HashMap<>(2); fields.put("status", VideoStatusEnum.DISABLE.getValue()); - videoEsService.updateSomeField(EsSuffix.VIDEO_INDEX_NAME, form.getId(), fields); + 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("涓嬫灦鎴愬姛"); @@ -430,6 +435,14 @@ .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("涓嬫灦鎴愬姛"); } @@ -451,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; } @@ -459,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())); @@ -520,6 +542,23 @@ 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); @@ -560,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) @@ -574,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) @@ -616,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()); } @@ -634,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()); } @@ -883,4 +1003,81 @@ .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(); + } + } } -- Gitblit v1.8.0