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