|
|
@@ -3,6 +3,7 @@ package shop.alien.store.controller;
|
|
|
import com.alibaba.fastjson2.JSON;
|
|
|
import com.alibaba.fastjson2.JSONArray;
|
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import io.swagger.annotations.Api;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
@@ -20,8 +21,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
import org.springframework.web.client.RestTemplate;
|
|
|
import shop.alien.entity.result.R;
|
|
|
-import shop.alien.entity.store.*;
|
|
|
+import shop.alien.entity.store.CommonRating;
|
|
|
+import shop.alien.entity.store.LifeBlacklist;
|
|
|
+import shop.alien.entity.store.StoreImg;
|
|
|
+import shop.alien.entity.store.StoreUser;
|
|
|
import shop.alien.entity.store.vo.StoreBannerVo;
|
|
|
+import shop.alien.entity.store.vo.StoreBusinessStatusVo;
|
|
|
import shop.alien.entity.store.vo.StoreInfoVo;
|
|
|
import shop.alien.mapper.CommonRatingMapper;
|
|
|
import shop.alien.mapper.LifeBlacklistMapper;
|
|
|
@@ -32,15 +37,12 @@ import shop.alien.store.service.CommonRatingService;
|
|
|
import shop.alien.store.service.StoreBannerService;
|
|
|
import shop.alien.store.service.StoreImgService;
|
|
|
import shop.alien.store.service.StoreInfoService;
|
|
|
-import shop.alien.entity.store.vo.StoreBusinessStatusVo;
|
|
|
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
|
|
import java.time.Instant;
|
|
|
import java.time.ZoneId;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
-import java.util.concurrent.Executor;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
@@ -136,7 +138,7 @@ public class AiSearchController {
|
|
|
|
|
|
jsonObject1.put("total", jsonObject.get("total"));
|
|
|
jsonObject1.put("size", map.get("pageSize"));
|
|
|
- log.info("调用AI搜索店铺列表最上面根据店铺名查询 后端处理后数据接口返回------{}", body);
|
|
|
+ log.info("调用AI搜索店铺列表最上面根据店铺名查询 后端处理后数据接口返回------{}", jsonObject1);
|
|
|
return R.data(jsonObject1);
|
|
|
} catch (Exception e) {
|
|
|
log.error("调用AI搜索接口 接口异常------", e);
|
|
|
@@ -167,27 +169,33 @@ public class AiSearchController {
|
|
|
log.info("调用AI首页店铺列表搜索接口 AI接口返回------{} AI结束时间: {}", body, formatter.format(Instant.now()));
|
|
|
JSONObject jsonObject = JSONObject.parseObject(body);
|
|
|
JSONObject jsonObject1 = new JSONObject();
|
|
|
- // 模糊搜索:从related_results和matched_results字段获取数据
|
|
|
- List<StoreInfoVo> result = convertToStoreInfoList(jsonObject.getJSONArray("results"),map.get("userId"));
|
|
|
+ // 模糊搜索:从 results 字段获取数据(AI 服务返回格式)
|
|
|
+ List<StoreInfoVo> result = convertToStoreInfoList(jsonObject.getJSONArray("results"), map.get("userId"));
|
|
|
|
|
|
// 并发处理图片、评论数据和营业时间,提升性能
|
|
|
CompletableFuture<Void> imageFuture = CompletableFuture.runAsync(() -> fillStoreImages(result, 1));
|
|
|
CompletableFuture<Void> ratingFuture = CompletableFuture.runAsync(() -> fillRatingCountBatch(result));
|
|
|
CompletableFuture<Void> businessHoursFuture = CompletableFuture.runAsync(() -> fillBusinessHours(result));
|
|
|
|
|
|
- // 等待所有任务完成
|
|
|
CompletableFuture.allOf(imageFuture, ratingFuture, businessHoursFuture).join();
|
|
|
|
|
|
jsonObject1.put("records", result);
|
|
|
-
|
|
|
jsonObject1.put("total", jsonObject.get("total"));
|
|
|
jsonObject1.put("size", map.get("pageSize"));
|
|
|
- log.info("调用AI首页店铺列表搜索 Java数据处理后接口返回------{} 最终时间: {}", body, formatter.format(Instant.now()));
|
|
|
+ log.info("调用AI首页店铺列表搜索 Java数据处理后接口返回------{} 最终时间: {}", jsonObject1, formatter.format(Instant.now()));
|
|
|
return R.data(jsonObject1);
|
|
|
+ } catch (org.springframework.web.client.HttpServerErrorException e) {
|
|
|
+ String responseBody = e.getResponseBodyAsString();
|
|
|
+ log.error("调用AI模糊搜索接口 上游返回5xx------ status={}, body={}", e.getStatusCode(), responseBody, e);
|
|
|
+ // Meilisearch 报 store_application_status is not filterable 时,需在 AI 搜索服务或 Meilisearch 索引中将 store_application_status 加入 filterableAttributes,或去掉该过滤条件
|
|
|
+ if (responseBody != null && responseBody.contains("store_application_status") && responseBody.contains("not filterable")) {
|
|
|
+ log.error("Meilisearch 不可用 store_application_status 筛选:请在第三方 AI 搜索服务或 Meilisearch 索引配置中将 store_application_status 加入 filterableAttributes,或移除该过滤条件。参见 docs/ai-search-meilisearch-filterable.md");
|
|
|
+ }
|
|
|
+ return R.fail("搜索服务暂时不可用,请稍后重试");
|
|
|
} catch (Exception e) {
|
|
|
log.error("调用AI模糊搜索接口 接口异常------", e);
|
|
|
}
|
|
|
- return R.fail("请求失败");
|
|
|
+ return R.fail("请求失败");
|
|
|
}
|
|
|
|
|
|
private List<StoreInfoVo> convertToStoreInfoList(JSONArray results, String userId) {
|