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