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