From e9d5414e66da2b2a7b040c2271ba50a6705fe30c Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期一, 24 十一月 2025 08:58:19 +0800
Subject: [PATCH] 处理bug

---
 framework/src/main/java/cn/lili/modules/search/serviceimpl/EsGoodsSearchServiceImpl.java |   90 ++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 84 insertions(+), 6 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 11aa047..d2dc77c 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
@@ -6,12 +6,16 @@
 import cn.lili.base.Result;
 import cn.lili.cache.Cache;
 import cn.lili.cache.CachePrefix;
+import cn.lili.common.enums.PromotionTypeEnum;
 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.promotion.entity.dos.Coupon;
+import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
+import cn.lili.modules.promotion.service.CouponService;
 import cn.lili.modules.search.entity.dos.EsGoodsIndex;
 import cn.lili.modules.search.entity.dos.EsGoodsRelatedInfo;
 import cn.lili.modules.search.entity.dto.EsGoodsSearchDTO;
@@ -20,6 +24,7 @@
 import cn.lili.modules.search.service.EsGoodsSearchService;
 import cn.lili.modules.search.utils.SqlFilter;
 import com.alibaba.druid.util.StringUtils;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.lucene.search.join.ScoreMode;
@@ -48,6 +53,10 @@
 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;
 
@@ -84,6 +93,9 @@
     @Autowired
     private Cache<Object> cache;
 
+    @Autowired
+    private CouponService couponService;
+
     @Override
     public SearchPage<EsGoodsIndex> searchGoods(EsGoodsSearchDTO searchDTO, PageVO pageVo) {
 
@@ -93,16 +105,57 @@
             cache.incrementScore(CachePrefix.HOT_WORD.getPrefix(), searchDTO.getKeyword());
         }
         NativeSearchQueryBuilder searchQueryBuilder = createSearchQueryBuilder(searchDTO, pageVo);
-//        searchQueryBuilder.withCollapseField("goodsId.keyword");
+        if (Objects.nonNull(searchDTO.getCanFilter()) && searchDTO.getCanFilter()) {
+            // 浣跨敤sn瀛楁鎺掑簭骞跺湪鎶樺彔鏃堕�夋嫨sn鏈�灏忕殑璁板綍
+            searchQueryBuilder.withCollapseField("goodsId.keyword");
+            searchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.ASC));
+        }
         NativeSearchQuery searchQuery = searchQueryBuilder.build();
         searchQuery.setTrackTotalHits(true);
-        log.debug("searchGoods DSL:{}", searchQuery.getQuery());
+        log.info("searchGoods DSL:{}", searchQuery.getQuery().toString());
+        log.info("searchGoods sort:{}", searchQuery.getElasticsearchSorts().toString());
         SearchHits<EsGoodsIndex> search = restTemplate.search(searchQuery, EsGoodsIndex.class);
         return SearchHitSupport.searchPageFor(search, searchQuery.getPageable());
     }
 
     @Override
     public Page<EsGoodsIndex> searchGoodsByPage(EsGoodsSearchDTO searchDTO, PageVO pageVo) {
+        if (PromotionTypeEnum.COUPON.name().equals(searchDTO.getPromotionType())) {
+            Coupon coupon = couponService.getById(searchDTO.getPromotionsId());
+            if (coupon != null) {
+                if (PromotionsScopeTypeEnum.ALL.name().equals(coupon.getScopeType())) {
+                    searchDTO.setPromotionType(null);
+                    searchDTO.setPromotionsId(null);
+                } else if (PromotionsScopeTypeEnum.PORTION_GOODS.name().equals(coupon.getScopeType())) {
+                    String promotionsId = coupon.getScopeId();
+                    if (cn.lili.common.utils.StringUtils.isNotBlank(promotionsId)) {
+                        List<String> skuIds = new ArrayList<>(Arrays.asList(promotionsId.split(",")));
+                        Page<EsGoodsIndex> resultPage = new Page<>();
+                        List<EsGoodsIndex> esGoodsBySkuIds = getEsGoodsBySkuIds(skuIds, pageVo);
+                        System.err.println(JSON.toJSONString(esGoodsBySkuIds));
+                        resultPage.setRecords(esGoodsBySkuIds);
+                        resultPage.setPages(1);
+                        resultPage.setCurrent(1);
+                        resultPage.setSize(1);
+                        resultPage.setTotal(esGoodsBySkuIds.size());
+                        return resultPage;
+                    }
+                } else if (PromotionsScopeTypeEnum.PORTION_SHOP_CATEGORY.name().equals(coupon.getScopeType())) {
+                    searchDTO.setPromotionType(null);
+                    searchDTO.setCategoryId(searchDTO.getPromotionsId());
+                    searchDTO.setPromotionsId(null);
+                } else if (PromotionsScopeTypeEnum.PORTION_GOODS_CATEGORY.name().equals(coupon.getScopeType())) {
+                    String promotionsId = searchDTO.getPromotionsId();
+                    if (cn.lili.common.utils.StringUtils.isNotBlank(promotionsId)) {
+                        searchDTO.setPromotionType(null);
+                        searchDTO.setCategoryId(coupon.getScopeId());
+                        searchDTO.setPromotionsId(null);
+                    }
+                }
+
+            }
+
+        }
         // 鍒ゆ柇鍟嗗搧绱㈠紩鏄惁瀛樺湪
         if (!restTemplate.indexOps(EsGoodsIndex.class).exists()) {
             return null;
@@ -448,8 +501,16 @@
                 FunctionScoreQueryBuilder.FilterFunctionBuilder[] builders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[filterFunctionBuilders.size()];
                 filterFunctionBuilders.toArray(builders);
                 FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(QueryBuilders.matchAllQuery(), builders)
-                        .scoreMode(FunctionScoreQuery.ScoreMode.SUM)
-                        .setMinScore(2);
+                        .scoreMode(FunctionScoreQuery.ScoreMode.SUM);
+                functionScoreQueryBuilder.setMinScore(0);
+//                if (CharSequenceUtil.isNotEmpty(searchDTO.getPromotionsId()) && CharSequenceUtil.isNotEmpty(searchDTO.getPromotionType())) {
+//                    functionScoreQueryBuilder.setMinScore(0);
+//                }else if (cn.lili.common.utils.StringUtils.isNotBlank(searchDTO.getCategoryId())){
+//                    functionScoreQueryBuilder.setMinScore(0);
+//                }
+//                else {
+//                    functionScoreQueryBuilder.setMinScore(2);
+//                }
                 //鑱氬悎鎼滅储鍒欏皢缁撴灉鏀惧叆杩囨护鏉′欢
                 filterBuilder.must(functionScoreQueryBuilder);
             } else {
@@ -462,7 +523,7 @@
 
 
             if (pageVo != null && CharSequenceUtil.isNotEmpty(pageVo.getOrder()) && CharSequenceUtil.isNotEmpty(pageVo.getSort())) {
-                nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(pageVo.getSort()).order(SortOrder.valueOf(pageVo.getOrder().toUpperCase())));
+                nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(pageVo.getSort()).order(SortOrder.valueOf(pageVo.getOrder().toUpperCase())).missing("_last"));
             } else {
                 nativeSearchQueryBuilder.withSort(SortBuilders.scoreSort().order(SortOrder.DESC));
             }
@@ -555,6 +616,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("_");
@@ -641,7 +719,7 @@
         filterFunctionBuilders.toArray(builders);
         FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(goodsNameMatchQuery, builders)
                 .scoreMode(FunctionScoreQuery.ScoreMode.SUM)
-                .setMinScore(2);
+                .setMinScore(0);
         //鑱氬悎鎼滅储鍒欏皢缁撴灉鏀惧叆杩囨护鏉′欢
         filterBuilder.must(functionScoreQueryBuilder);
         filterBuilder.should(QueryBuilders.boolQuery().should(QueryBuilders.matchPhraseQuery("goodsName", keyword).boost(10)));

--
Gitblit v1.8.0