From 3a70f3fc25076a702f4fc8d192badec0d6febb13 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=97=AD?= <2795210596@qq.com>
Date: Sun, 13 Apr 2025 17:41:07 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0app=E7=AB=AF=E6=90=9C?=
=?UTF-8?q?=E7=B4=A2=E7=90=83=E6=9D=86=E5=95=86=E5=93=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
tmerclub-search/pom.xml | 5 +
.../LocalCueProductSearchRequestBuilder.java | 99 +++++++++++++++++++
.../LocalCueProductSearchResponseBuilder.java | 64 ++++++++++++
.../cloud/search/constant/EsConstant.java | 5 +
.../cloud/search/constant/EsIndexEnum.java | 17 ++--
.../app/LocalCueProductSearchController.java | 44 +++++++++
.../manager/LocalCueProductSearchManager.java | 63 ++++++++++++
.../src/main/resources/bootstrap.yml | 2 +-
8 files changed, 292 insertions(+), 7 deletions(-)
create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchRequestBuilder.java
create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchResponseBuilder.java
create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/app/LocalCueProductSearchController.java
create mode 100644 tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/LocalCueProductSearchManager.java
diff --git a/tmerclub-search/pom.xml b/tmerclub-search/pom.xml
index 3332b49..24699e3 100644
--- a/tmerclub-search/pom.xml
+++ b/tmerclub-search/pom.xml
@@ -29,6 +29,11 @@
tmerclub-common-rocketmq
${project.version}
+
+ com.moyuer.cloud
+ tmerclub-common-loacl
+ ${project.version}
+
com.moyuer.cloud
tmerclub-api-product
diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchRequestBuilder.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchRequestBuilder.java
new file mode 100644
index 0000000..b2b7128
--- /dev/null
+++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchRequestBuilder.java
@@ -0,0 +1,99 @@
+package com.tmerclub.cloud.search.builder;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.tmerclub.cloud.api.dto.EsPageDTO;
+import com.tmerclub.cloud.api.vo.EsPageVO;
+import com.tmerclub.cloud.common.constant.Constant;
+import com.tmerclub.cloud.common.i18n.I18nMessage;
+import com.tmerclub.cloud.common.local.dto.CueProductSearchDTO;
+import com.tmerclub.cloud.common.local.vo.CueProductSearchVO;
+import com.tmerclub.cloud.common.product.vo.search.SpuSearchVO;
+import com.tmerclub.cloud.common.util.Json;
+import com.tmerclub.cloud.search.constant.EsConstant;
+import com.tmerclub.cloud.search.constant.EsIndexEnum;
+import com.tmerclub.cloud.search.util.EsSearchUtil;
+import org.elasticsearch.action.search.SearchRequest;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.index.query.BoolQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.SearchHits;
+import org.elasticsearch.search.aggregations.Aggregations;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 本地生活-球杆商品搜索请求构建
+ *
+ * @author: frank
+ * @create: 2025-04-13
+ **/
+@Component
+public class LocalCueProductSearchRequestBuilder {
+
+ private static final Logger log = LoggerFactory.getLogger(LocalCueProductSearchRequestBuilder.class);
+
+ /**
+ * 通过搜索信息分页搜索es数据的信息
+ *
+ * @param pageDTO 分页数据
+ * @param cueProductSearchDTO 商品搜索条件
+ * @return 搜索结果
+ */
+ public SearchResponse pageSearchResult(EsPageDTO pageDTO, CueProductSearchDTO cueProductSearchDTO) {
+ //1、准备检索请求
+ SearchRequest searchRequest = buildSearchRequest(pageDTO, cueProductSearchDTO);
+ return EsSearchUtil.search(searchRequest);
+ }
+
+ /**
+ * 准备检索请求
+ *
+ * @param pageDTO 分页参数
+ * @param param 搜索参数
+ * @return 搜索结果
+ */
+ private SearchRequest buildSearchRequest(EsPageDTO pageDTO, CueProductSearchDTO param) {
+
+ SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
+ Integer lang = I18nMessage.getLang();
+
+ // 构建bool-query
+ BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
+
+ // 关键字搜索
+ keywordSearch(param, boolQueryBuilder, lang);
+
+ searchSourceBuilder.query(boolQueryBuilder);
+
+ // 分页
+ if (Objects.nonNull(pageDTO)) {
+ searchSourceBuilder.from((pageDTO.getPageNum() - 1) * pageDTO.getPageSize());
+ searchSourceBuilder.size(pageDTO.getPageSize());
+ }
+
+ log.info("构建的DSL语句 {}", searchSourceBuilder);
+
+ return new SearchRequest(new String[]{EsIndexEnum.CUE_PRODUCT.value()}, searchSourceBuilder);
+ }
+
+ /**
+ * 关键字搜索
+ */
+ private void keywordSearch(CueProductSearchDTO param, BoolQueryBuilder boolQueryBuilder, Integer lang) {
+ if (ObjectUtil.isEmpty(param.getProductName())) {
+ return;
+ }
+ log.error("---------------------{}", param.getProductName());
+ // 创建查询语句 ES中must和should不能同时使用 同时使用should失效 嵌套多个must 将should条件拼接在一个must中即可
+ BoolQueryBuilder keywordShouldQuery = QueryBuilders.boolQuery();
+ keywordShouldQuery.should(QueryBuilders.wildcardQuery(EsConstant.CUE_PRODUCT_NAME, "*" + param.getProductName() + "*"));
+ boolQueryBuilder.must(keywordShouldQuery);
+ }
+}
diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchResponseBuilder.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchResponseBuilder.java
new file mode 100644
index 0000000..fcf065b
--- /dev/null
+++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/builder/LocalCueProductSearchResponseBuilder.java
@@ -0,0 +1,64 @@
+package com.tmerclub.cloud.search.builder;
+
+import com.tmerclub.cloud.api.dto.EsPageDTO;
+import com.tmerclub.cloud.api.vo.EsPageVO;
+import com.tmerclub.cloud.common.local.vo.CueProductSearchVO;
+import com.tmerclub.cloud.common.util.Json;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.SearchHits;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 本地生活-球杆商品搜索结果构建
+ *
+ * @author: frank
+ * @create: 2025-04-13
+ **/
+@Component
+public class LocalCueProductSearchResponseBuilder {
+ private static final Logger log = LoggerFactory.getLogger(LocalCueProductSearchResponseBuilder.class);
+
+
+ /**
+ * 获取搜索结果列表
+ *
+ * @param response 搜索结果
+ * @return 搜索结果列表
+ */
+ public List getProductSearchList(SearchResponse response) {
+
+ // 1、返回的所有查询到的商品
+ List cueProductSearchVOList = new ArrayList<>();
+ //===============列表信息====================//
+ SearchHits hits = response.getHits();
+ for (SearchHit hit : hits) {
+ String json = hit.getSourceAsString();
+ CueProductSearchVO cueProductSearchVO = Json.parseObject(json, CueProductSearchVO.class);
+ cueProductSearchVOList.add(cueProductSearchVO);
+ }
+ return cueProductSearchVOList;
+ }
+
+ /**
+ * 构建分页数据
+ *
+ * @param pageDTO 分页参数
+ * @param esPageVO 分页返回对象
+ * @param response 搜索结果
+ */
+ public void buildSearchPage(EsPageDTO pageDTO, EsPageVO> esPageVO, SearchResponse response) {
+ //总记录数
+ long total = response.getHits().getTotalHits().value;
+ esPageVO.setTotal(total);
+ // 总页码
+ int totalPages = (int) total % pageDTO.getPageSize() == 0 ?
+ (int) total / pageDTO.getPageSize() : ((int) total / pageDTO.getPageSize() + 1);
+ esPageVO.setPages(totalPages);
+ }
+}
\ No newline at end of file
diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsConstant.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsConstant.java
index 6a4cab9..cc2f27c 100644
--- a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsConstant.java
+++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsConstant.java
@@ -168,6 +168,11 @@ public interface EsConstant {
String SUPPLIER_NAME = "supplierName";
String SUPPLIER_ID = "supplierId";
+ /**
+ * 球杆商品
+ */
+ String CUE_PRODUCT_NAME = "productName";
+
/**
* 商品指定返回字段
*/
diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsIndexEnum.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsIndexEnum.java
index c8a4e3f..5a04f57 100644
--- a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsIndexEnum.java
+++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/constant/EsIndexEnum.java
@@ -1,10 +1,10 @@
-
package com.tmerclub.cloud.search.constant;
import com.tmerclub.cloud.common.constant.Constant;
/**
* es当中的index
+ *
* @author tmerclub
* @date 2020/11/12
*/
@@ -38,16 +38,21 @@ public enum EsIndexEnum {
/**
* 调拨订单
*/
- ALLOT_ORDER(Constant.NAME_SPACE + "allot-order")
+ ALLOT_ORDER(Constant.NAME_SPACE + "allot-order"),
+
+ /**
+ * 球杆商品
+ */
+ CUE_PRODUCT(Constant.NAME_SPACE + "cue_product"),
;
private final String value;
- public String value() {
- return value;
- }
-
EsIndexEnum(String value) {
this.value = value;
}
+
+ public String value() {
+ return value;
+ }
}
diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/app/LocalCueProductSearchController.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/app/LocalCueProductSearchController.java
new file mode 100644
index 0000000..b5ab752
--- /dev/null
+++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/controller/app/LocalCueProductSearchController.java
@@ -0,0 +1,44 @@
+package com.tmerclub.cloud.search.controller.app;
+
+import com.tmerclub.cloud.api.dto.EsPageDTO;
+import com.tmerclub.cloud.api.vo.EsPageVO;
+import com.tmerclub.cloud.common.local.dto.CueProductSearchDTO;
+import com.tmerclub.cloud.common.local.vo.CueProductSearchVO;
+import com.tmerclub.cloud.common.response.ServerResponseEntity;
+import com.tmerclub.cloud.search.manager.LocalCueProductSearchManager;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 本地生活-球杆商品搜索
+ *
+ * @author: frank
+ * @create: 2025-04-12
+ **/
+@Tag(name = "本地生活-球杆商品搜索")
+@RestController("localCueProductSearchController")
+@RequestMapping("/ua/cueProductSearch")
+public class LocalCueProductSearchController {
+
+ @Resource
+ LocalCueProductSearchManager localCueProductSearchManager;
+
+ /**
+ * APP端搜索球杆商品接口
+ *
+ * @param pageDTO 分页参数
+ * @param cueProductSearchDTO 搜索参数
+ * @return 分页结果集
+ */
+ @GetMapping("/searchCueProductPage")
+ @Operation(summary = "APP端搜索球杆商品接口", description = "APP端搜索球杆商品接口")
+ public ServerResponseEntity> searchCueProductPage(@Valid EsPageDTO pageDTO, CueProductSearchDTO cueProductSearchDTO) {
+ EsPageVO page = localCueProductSearchManager.page(pageDTO, cueProductSearchDTO);
+ return ServerResponseEntity.success(page);
+ }
+}
\ No newline at end of file
diff --git a/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/LocalCueProductSearchManager.java b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/LocalCueProductSearchManager.java
new file mode 100644
index 0000000..47ae41d
--- /dev/null
+++ b/tmerclub-search/src/main/java/com/tmerclub/cloud/search/manager/LocalCueProductSearchManager.java
@@ -0,0 +1,63 @@
+package com.tmerclub.cloud.search.manager;
+
+import com.tmerclub.cloud.api.dto.EsPageDTO;
+import com.tmerclub.cloud.api.vo.EsPageVO;
+import com.tmerclub.cloud.common.local.dto.CueProductSearchDTO;
+import com.tmerclub.cloud.common.local.vo.CueProductSearchVO;
+import com.tmerclub.cloud.search.builder.LocalCueProductSearchRequestBuilder;
+import com.tmerclub.cloud.search.builder.LocalCueProductSearchResponseBuilder;
+import jakarta.annotation.Resource;
+import org.elasticsearch.action.search.SearchResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 本地生活-球杆商品搜索
+ *
+ * @author: frank
+ * @create: 2025-04-13
+ **/
+@Component
+public class LocalCueProductSearchManager {
+ private static final Logger log = LoggerFactory.getLogger(LocalCueProductSearchManager.class);
+
+ @Resource
+ LocalCueProductSearchRequestBuilder localCueProductSearchRequestBuilder;
+ @Resource
+ LocalCueProductSearchResponseBuilder localCueProductSearchResponseBuilder;
+
+ /**
+ * 分页搜索
+ *
+ * @param pageDTO 分页信息
+ * @param cueProductSearchDTO 搜索条件
+ * @return EsPageVO
+ */
+ public EsPageVO page(EsPageDTO pageDTO, CueProductSearchDTO cueProductSearchDTO) {
+ SearchResponse response = localCueProductSearchRequestBuilder.pageSearchResult(pageDTO, cueProductSearchDTO);
+ return buildSearchResult(pageDTO, response);
+ }
+
+
+ /**
+ * 构建搜索结果数据
+ *
+ * @param pageDTO 分页信息
+ * @param response 搜索结果
+ * @return EsPageVO
+ */
+ private EsPageVO buildSearchResult(EsPageDTO pageDTO, SearchResponse response) {
+ EsPageVO esPageVO = new EsPageVO<>();
+
+ // 1、返回的所有查询到的商品
+ List cueProductSearchVOS = localCueProductSearchResponseBuilder.getProductSearchList(response);
+ esPageVO.setList(cueProductSearchVOS);
+
+ // 2、分页信息
+ localCueProductSearchResponseBuilder.buildSearchPage(pageDTO, esPageVO, response);
+ return esPageVO;
+ }
+}
diff --git a/tmerclub-search/src/main/resources/bootstrap.yml b/tmerclub-search/src/main/resources/bootstrap.yml
index 13527b8..396c345 100644
--- a/tmerclub-search/src/main/resources/bootstrap.yml
+++ b/tmerclub-search/src/main/resources/bootstrap.yml
@@ -30,4 +30,4 @@ dubbo:
consumer:
loadbalance: dev
registry:
- group: dubbo-default
+ group: dubbo-yang