From ebe36b26782231d6d6f40a76c6e3cbb23d1b2714 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期三, 02 七月 2025 18:58:29 +0800
Subject: [PATCH] update 修改商品发布支持预售

---
 framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java |   62 ++++++++++++++++++++++++++++++
 1 files changed, 61 insertions(+), 1 deletions(-)

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..79d904b 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,11 +42,16 @@
 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;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -88,7 +97,9 @@
             cache.incrementScore(CachePrefix.HOT_WORD.getPrefix(), searchDTO.getKeyword());
         }
         NativeSearchQueryBuilder searchQueryBuilder = createSearchQueryBuilder(searchDTO, pageVo);
-//        searchQueryBuilder.withCollapseField("goodsId.keyword");
+        if (Objects.nonNull(searchDTO.getCanFilter()) && searchDTO.getCanFilter()) {
+            searchQueryBuilder.withCollapseField("goodsId.keyword");
+        }
         NativeSearchQuery searchQuery = searchQueryBuilder.build();
         searchQuery.setTrackTotalHits(true);
         log.debug("searchGoods DSL:{}", searchQuery.getQuery());
@@ -174,6 +185,38 @@
     @Override
     public EsGoodsIndex getEsGoodsById(String id) {
         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());
     }
 
     /**
@@ -518,6 +561,23 @@
         if (CharSequenceUtil.isNotEmpty(searchDTO.getPromotionsId()) && CharSequenceUtil.isNotEmpty(searchDTO.getPromotionType())) {
             filterBuilder.must(QueryBuilders.wildcardQuery("promotionMapJson", "*" + searchDTO.getPromotionType() + "-" + searchDTO.getPromotionsId() + "*"));
         }
+
+        if (Objects.nonNull(searchDTO.getNeedFilterPre()) && searchDTO.getNeedFilterPre()) {
+            // 杞崲涓哄綋澶� 00:00:00 鐨勬椂闂存埑锛堟绉掞級
+            long time = LocalDate.now().atStartOfDay(ZoneId.systemDefault())
+                    .toInstant()
+                    .toEpochMilli();
+            // 鏉′欢2锛氶鍞粨鏉熸椂闂� >= 褰撳墠鏃堕棿 OR 缁撴潫鏃堕棿涓虹┖
+            filterBuilder.must(QueryBuilders.boolQuery()
+                    .should(QueryBuilders.rangeQuery("preSaleEndDate").gte(time))
+                    .should(QueryBuilders.boolQuery()
+                            .mustNot(QueryBuilders.existsQuery("preSaleEndDate"))));
+            // 鏉′欢1锛氶鍞紑濮嬫椂闂� <= 褰撳墠鏃堕棿 OR 寮�濮嬫椂闂翠负绌�
+            filterBuilder.must(QueryBuilders.boolQuery()
+                    .should(QueryBuilders.rangeQuery("preSaleBeginDate").lte(time))
+                    .should(QueryBuilders.boolQuery()
+                            .mustNot(QueryBuilders.existsQuery("preSaleBeginDate"))));
+        }
         //浠锋牸鍖洪棿鍒ゅ畾
         if (CharSequenceUtil.isNotEmpty(searchDTO.getPrice())) {
             String[] prices = searchDTO.getPrice().split("_");

--
Gitblit v1.8.0