From c13e4a322e3d58183882478703fe919a88759cb4 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期日, 15 六月 2025 19:27:58 +0800
Subject: [PATCH] 视频发布支持多个商品
---
framework/src/main/java/cn/lili/modules/lmk/domain/entity/VideoGoods.java | 45 +++++++++++
buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java | 8 ++
framework/src/main/java/cn/lili/modules/lmk/domain/query/VideoGoodsEsQuery.java | 28 +++++++
framework/src/main/java/cn/lili/modules/lmk/service/VideoGoodsService.java | 14 +++
framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoGoodsServiceImpl.java | 22 +++++
framework/src/main/java/cn/lili/modules/lmk/domain/form/WxVideoForm.java | 6 +
framework/src/main/java/cn/lili/modules/lmk/domain/vo/VideoGoodsPublishVO.java | 21 +++++
framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java | 37 +++++++++
framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java | 16 +++
framework/src/main/java/cn/lili/modules/lmk/mapper/VideoGoodsMapper.java | 17 ++++
framework/src/main/java/cn/lili/modules/search/service/EsGoodsSearchService.java | 10 ++
framework/src/main/resources/mapper/lmk/VideoGoodsMapper.xml | 7 +
12 files changed, 228 insertions(+), 3 deletions(-)
diff --git a/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java
index 087404b..c5d3d25 100644
--- a/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java
+++ b/buyer-api/src/main/java/cn/lili/controller/goods/GoodsBuyerController.java
@@ -1,5 +1,6 @@
package cn.lili.controller.goods;
+import cn.lili.base.Result;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
@@ -11,6 +12,7 @@
import cn.lili.modules.goods.entity.vos.GoodsVO;
import cn.lili.modules.goods.service.GoodsService;
import cn.lili.modules.goods.service.GoodsSkuService;
+import cn.lili.modules.lmk.domain.query.VideoGoodsEsQuery;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.modules.search.entity.dos.EsGoodsRelatedInfo;
import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO;
@@ -115,6 +117,12 @@
return ResultUtil.data(goodsSearchService.searchGoodsByPage(goodsSearchParams, pageVO));
}
+ @ApiOperation(value = "鍟嗗搧鍒嗛〉-鍙戝竷瑙嗛鏃跺叧鑱斿晢鍝�")
+ @GetMapping("/video/es")
+ public Result videoGoodsEsPage(VideoGoodsEsQuery query) {
+ return goodsSearchService.videoGoodsEsPage(query);
+ }
+
@ApiOperation(value = "浠嶦S涓幏鍙栫浉鍏冲晢鍝佸搧鐗屽悕绉帮紝鍒嗙被鍚嶇О鍙婂睘鎬�")
@GetMapping("/es/related")
public ResultMessage<EsGoodsRelatedInfo> getGoodsRelatedByPageFromEs(EsGoodsSearchDTO goodsSearchParams, PageVO pageVO) {
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/entity/VideoGoods.java b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/VideoGoods.java
new file mode 100644
index 0000000..1993606
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/VideoGoods.java
@@ -0,0 +1,45 @@
+package cn.lili.modules.lmk.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 瑙嗛鍟嗗搧涓棿琛�
+ *
+ * @author xp
+ * @since 2025-06-15
+ */
+@Data
+@TableName("lmk_video_goods")
+public class VideoGoods {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId
+ @ApiModelProperty(value = "鍞竴鏍囪瘑", hidden = true)
+ private String id;
+
+ @TableField("video_id")
+ /** 瑙嗛id */
+ private String videoId;
+
+ @TableField("goods_id")
+ /** 鍟嗗搧id */
+ private String goodsId;
+
+ @TableField("order_num")
+ /** 鎺掑簭 */
+ private Integer orderNum;
+
+ @TableField("goods_num")
+ /** 鍟嗗搧鏁伴噺 */
+ private Integer goodsNum;
+
+ @TableField(fill = FieldFill.INSERT)
+ @ApiModelProperty(value = "鍒犻櫎鏍囧織 true/false 鍒犻櫎/鏈垹闄�", hidden = true)
+ private Boolean deleteFlag;
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/form/WxVideoForm.java b/framework/src/main/java/cn/lili/modules/lmk/domain/form/WxVideoForm.java
index ab5fce0..4a884ca 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/domain/form/WxVideoForm.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/form/WxVideoForm.java
@@ -4,6 +4,8 @@
import cn.lili.group.Add;
import cn.lili.base.AbsForm;
import cn.lili.modules.lmk.domain.entity.Video;
+import cn.lili.modules.lmk.domain.vo.VideoGoodsPublishVO;
+import cn.lili.modules.lmk.domain.vo.VideoGoodsVO;
import org.hibernate.validator.constraints.Length;
import org.springframework.beans.BeanUtils;
@@ -53,8 +55,8 @@
private List<WxVideoTagForm> tags = new ArrayList<>(2);
// @NotBlank(message = "鍟嗗搧id涓嶈兘涓虹┖", groups = {Add.class, Update.class})
- @ApiModelProperty("鍟嗗搧id")
- private String goodsId;
+ @ApiModelProperty("鍟嗗搧鍒楄〃")
+ private List<VideoGoodsPublishVO> goodsList;
@ApiModelProperty("瑙嗛濉厖妯″紡")
private String videoFit;
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/query/VideoGoodsEsQuery.java b/framework/src/main/java/cn/lili/modules/lmk/domain/query/VideoGoodsEsQuery.java
new file mode 100644
index 0000000..96d18e9
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/query/VideoGoodsEsQuery.java
@@ -0,0 +1,28 @@
+package cn.lili.modules.lmk.domain.query;
+
+import cn.lili.base.AbsQuery;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鍙戝竷瑙嗛鏃讹紝鍏宠仈鍟嗗搧鐨勬煡璇�
+ *
+ * @author锛歺p
+ * @date锛�2025/6/13 10:04
+ */
+@Data
+@ApiModel("鍙戝竷瑙嗛鏃讹紝鍏宠仈鍟嗗搧鐨勬煡璇�")
+public class VideoGoodsEsQuery {
+
+ @ApiModelProperty("鎼滅储鍏抽敭璇�")
+ private String keyword;
+
+ @ApiModelProperty("鏌ヨ嚜瀹跺簵閾虹殑鍟嗗搧")
+ private Boolean searchFromSelfStore;
+
+
+ private int pageNumber;
+
+ private int pageSize;
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/vo/VideoGoodsPublishVO.java b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/VideoGoodsPublishVO.java
new file mode 100644
index 0000000..3d970f2
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/VideoGoodsPublishVO.java
@@ -0,0 +1,21 @@
+package cn.lili.modules.lmk.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author锛歺p
+ * @date锛�2025/6/15 19:10
+ */
+@Data
+@ApiModel("鍙戝竷瑙嗛-鍟嗗搧淇℃伅")
+public class VideoGoodsPublishVO {
+
+ @ApiModelProperty("鍟嗗搧id")
+ private String goodsId;
+
+ @ApiModelProperty("鍟嗗搧鏁伴噺")
+ private Integer goodsNum;
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/mapper/VideoGoodsMapper.java b/framework/src/main/java/cn/lili/modules/lmk/mapper/VideoGoodsMapper.java
new file mode 100644
index 0000000..8143ad6
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/mapper/VideoGoodsMapper.java
@@ -0,0 +1,17 @@
+package cn.lili.modules.lmk.mapper;
+
+import cn.lili.modules.lmk.domain.entity.VideoGoods;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 瑙嗛鍟嗗搧涓棿琛� Mapper 鎺ュ彛
+ *
+ * @author xp
+ * @since 2025-06-15
+ */
+@Mapper
+public interface VideoGoodsMapper extends BaseMapper<VideoGoods> {
+
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/VideoGoodsService.java b/framework/src/main/java/cn/lili/modules/lmk/service/VideoGoodsService.java
new file mode 100644
index 0000000..e2363c0
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/VideoGoodsService.java
@@ -0,0 +1,14 @@
+package cn.lili.modules.lmk.service;
+
+import cn.lili.modules.lmk.domain.entity.VideoGoods;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 瑙嗛鍟嗗搧涓棿琛� 鏈嶅姟绫�
+ *
+ * @author xp
+ * @since 2025-06-15
+ */
+public interface VideoGoodsService extends IService<VideoGoods> {
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoGoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoGoodsServiceImpl.java
new file mode 100644
index 0000000..dff92fa
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoGoodsServiceImpl.java
@@ -0,0 +1,22 @@
+package cn.lili.modules.lmk.service.impl;
+
+import cn.lili.modules.lmk.domain.entity.VideoGoods;
+import cn.lili.modules.lmk.mapper.VideoGoodsMapper;
+import cn.lili.modules.lmk.service.VideoGoodsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * 瑙嗛鍟嗗搧涓棿琛� 鏈嶅姟瀹炵幇绫�
+ *
+ * @author xp
+ * @since 2025-06-15
+ */
+@Service
+@RequiredArgsConstructor
+public class VideoGoodsServiceImpl extends ServiceImpl<VideoGoodsMapper, VideoGoods> implements VideoGoodsService {
+
+ private final VideoGoodsMapper videoGoodsMapper;
+
+}
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 74b939e..4a4448c 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
@@ -55,6 +55,7 @@
private final MySubscribeService mySubscribeService;
private final MemberService memberService;
private final VideoAccountService videoAccountService;
+ private final VideoGoodsService videoGoodsService;
/**
@@ -187,8 +188,21 @@
return videoTagRef;
}).collect(Collectors.toList());
videoTagRefService.saveBatch(videoTagRefs);
- // 3.淇濆瓨瑙嗛鏂囦欢淇℃伅
+ // 3. 淇濆瓨瑙嗛鏂囦欢淇℃伅
lmkFileService.addByForm(form.getFileInfo());
+ // 4. 澶勭悊閫夋嫨鐨勫晢鍝�
+ if (CollectionUtils.isNotEmpty(form.getGoodsList())) {
+ List<VideoGoods> videoGoods = new ArrayList<>(2);
+ 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.setGoodsNum(form.getGoodsList().get(i).getGoodsNum());
+ e.setOrderNum(i);
+ videoGoods.add(e);
+ }
+ videoGoodsService.saveBatch(videoGoods);
+ }
return Result.ok("鍙戝竷鎴愬姛锛岃棰戝鏍镐腑~");
}
diff --git a/framework/src/main/java/cn/lili/modules/search/service/EsGoodsSearchService.java b/framework/src/main/java/cn/lili/modules/search/service/EsGoodsSearchService.java
index 61930be..76b8d7b 100644
--- a/framework/src/main/java/cn/lili/modules/search/service/EsGoodsSearchService.java
+++ b/framework/src/main/java/cn/lili/modules/search/service/EsGoodsSearchService.java
@@ -1,6 +1,8 @@
package cn.lili.modules.search.service;
+import cn.lili.base.Result;
import cn.lili.common.vo.PageVO;
+import cn.lili.modules.lmk.domain.query.VideoGoodsEsQuery;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.modules.search.entity.dos.EsGoodsRelatedInfo;
import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO;
@@ -59,4 +61,12 @@
* @return 鍟嗗搧绱㈠紩
*/
EsGoodsIndex getEsGoodsById(String id);
+
+ /**
+ * 鍟嗗搧鍒嗛〉锛屽彂甯冭棰戞椂鍏宠仈鍟嗗搧鐨勬煡璇�
+ *
+ * @param query
+ * @return
+ */
+ Result videoGoodsEsPage(VideoGoodsEsQuery query);
}
diff --git a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java
index f752e4c..11aa047 100644
--- a/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java
@@ -3,12 +3,15 @@
import cn.hutool.core.convert.Convert;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ArrayUtil;
+import cn.lili.base.Result;
import cn.lili.cache.Cache;
import cn.lili.cache.CachePrefix;
import cn.lili.common.exception.ServiceException;
+import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.goods.entity.enums.GoodsAuthEnum;
import cn.lili.modules.goods.entity.enums.GoodsStatusEnum;
+import cn.lili.modules.lmk.domain.query.VideoGoodsEsQuery;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.modules.search.entity.dos.EsGoodsRelatedInfo;
import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO;
@@ -29,6 +32,7 @@
import org.elasticsearch.index.query.functionscore.FieldValueFactorFunctionBuilder;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
+import org.elasticsearch.index.search.MultiMatchQuery;
import org.elasticsearch.search.aggregations.*;
import org.elasticsearch.search.aggregations.bucket.nested.ParsedNested;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedStringTerms;
@@ -38,6 +42,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.*;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
@@ -176,6 +181,38 @@
return this.restTemplate.get(id, EsGoodsIndex.class);
}
+ @Override
+ public Result videoGoodsEsPage(VideoGoodsEsQuery q) {
+ // 鍒ゆ柇鍟嗗搧绱㈠紩鏄惁瀛樺湪
+ if (!restTemplate.indexOps(EsGoodsIndex.class).exists()) {
+ return Result.ok();
+ }
+ // 鏍规嵁閿�閲忓�掑簭鎺掑垪
+ Pageable pageable = PageRequest.of(q.getPageNumber(), q.getPageSize(), Sort.by("buyCount").descending());
+
+ NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
+ queryBuilder.withPageable(pageable);
+
+ BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
+
+ // 鍏抽敭璇嶅尮閰嶅晢鍝佸悕绉般�佸晢鍝佺紪鍙�
+ if (!StringUtils.isEmpty(q.getKeyword())) {
+ boolQuery.must(QueryBuilders.multiMatchQuery(q.getKeyword(), "goodsName", "sn"));
+ }
+
+ if (q.getSearchFromSelfStore()) {
+ // 濡傛灉鍙煡鑷搴楅摵鍟嗗搧
+ boolQuery.must(QueryBuilders.termQuery("storeId", UserContext.getCurrentUser().getStoreId()));
+ }
+
+ queryBuilder.withQuery(boolQuery);
+
+ NativeSearchQuery query = queryBuilder.build();
+ SearchHits<EsGoodsIndex> searchHits = restTemplate.search(query, EsGoodsIndex.class);
+ List<EsGoodsIndex> data = searchHits.stream().map(hit -> hit.getContent()).collect(Collectors.toList());
+ return Result.ok().data(data).total(searchHits.getTotalHits());
+ }
+
/**
* 杞崲鎼滅储缁撴灉涓鸿仛鍚堝晢鍝佸睍绀轰俊鎭�
*
diff --git a/framework/src/main/resources/mapper/lmk/VideoGoodsMapper.xml b/framework/src/main/resources/mapper/lmk/VideoGoodsMapper.xml
new file mode 100644
index 0000000..ed34fd8
--- /dev/null
+++ b/framework/src/main/resources/mapper/lmk/VideoGoodsMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.lili.modules.lmk.mapper.VideoGoodsMapper">
+
+
+
+</mapper>
--
Gitblit v1.8.0