浏览代码

feat(search): 添加AI搜索结果转换功能

- 引入了 StoreInfoVo 类型转换逻辑
- 实现了生活服务类别的特殊处理
- 添加了下划线到驼峰命名的转换工具方法
- 优化了AI搜索接口的返回数据格式
- 增加了调试日志用于字段名查看
- 支持不同类别的搜索结果差异化处理
fcw 3 月之前
父节点
当前提交
edc8b54977
共有 1 个文件被更改,包括 72 次插入3 次删除
  1. 72 3
      alien-store/src/main/java/shop/alien/store/controller/AiSearchController.java

+ 72 - 3
alien-store/src/main/java/shop/alien/store/controller/AiSearchController.java

@@ -1,5 +1,7 @@
 package shop.alien.store.controller;
 package shop.alien.store.controller;
 
 
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.alibaba.fastjson2.JSONObject;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
@@ -16,8 +18,11 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.client.RestTemplate;
 import org.springframework.web.client.RestTemplate;
 import shop.alien.entity.result.R;
 import shop.alien.entity.result.R;
+import shop.alien.entity.store.vo.StoreInfoVo;
 
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
 
 
@@ -57,9 +62,17 @@ public class AiSearchController {
             String body = stringResponseEntity.getBody();
             String body = stringResponseEntity.getBody();
             JSONObject jsonObject = JSONObject.parseObject(body);
             JSONObject jsonObject = JSONObject.parseObject(body);
             JSONObject jsonObject1 = new JSONObject();
             JSONObject jsonObject1 = new JSONObject();
-            jsonObject1.put("total",jsonObject.get("total"));
-            jsonObject1.put("records",jsonObject.get("results"));
-            jsonObject1.put("size",map.get("pageSize"));
+            if ("生活服务".equals(requestBody.get("category")) || "休闲娱乐".equals(requestBody.get("category"))) {
+                // 生活服务类别:转换为StoreInfoVo,确保返回的字段名按照StoreInfoVo定义
+                List<StoreInfoVo> result = convertToStoreInfoList(jsonObject.getJSONArray("results"));
+                jsonObject1.put("records", result);
+            } else {
+                // 其他类别:直接返回原始结果
+                jsonObject1.put("records", jsonObject.get("results"));
+            }
+
+            jsonObject1.put("total", jsonObject.get("total"));
+            jsonObject1.put("size", map.get("pageSize"));
             log.info("调用AI搜索接口 接口返回------{}", body);
             log.info("调用AI搜索接口 接口返回------{}", body);
             return R.data(jsonObject1);
             return R.data(jsonObject1);
         } catch (Exception e) {
         } catch (Exception e) {
@@ -68,6 +81,62 @@ public class AiSearchController {
         return  R.fail("请求失败");
         return  R.fail("请求失败");
     }
     }
 
 
+    private List<StoreInfoVo> convertToStoreInfoList(JSONArray results) {
+        List<StoreInfoVo> storeInfoList = new ArrayList<>();
+        if (results != null) {
+            for (int i = 0; i < results.size(); i++) {
+                JSONObject item = results.getJSONObject(i);
+                // 记录第一条数据的字段名和内容,用于调试
+                if (i == 0) {
+                    log.info("AI返回的JSON字段示例: {}", item.keySet());
+                }
+                
+                // 创建新的JSONObject,将下划线命名转换为驼峰命名
+                JSONObject camelCaseItem = new JSONObject();
+                for (String key : item.keySet()) {
+                    String camelKey = underscoreToCamelCase(key);
+                    camelCaseItem.put(camelKey, item.get(key));
+                }
+                
+                // 将"name"字段映射到"storeName"字段
+                if (camelCaseItem.containsKey("name") && !camelCaseItem.containsKey("storeName")) {
+                    camelCaseItem.put("storeName", camelCaseItem.get("name"));
+                }
+
+                // 使用JSON.parseObject方法进行转换
+                StoreInfoVo storeInfo = JSON.parseObject(camelCaseItem.toJSONString(), StoreInfoVo.class);
+                storeInfoList.add(storeInfo);
+            }
+        }
+        return storeInfoList;
+    }
+
+    /**
+     * 将下划线命名转换为驼峰命名
+     * 例如: store_tel -> storeTel, created_time -> createdTime
+     */
+    private String underscoreToCamelCase(String underscore) {
+        if (underscore == null || !underscore.contains("_")) {
+            return underscore;
+        }
+        StringBuilder camelCase = new StringBuilder();
+        boolean nextUpperCase = false;
+        for (char c : underscore.toCharArray()) {
+            if (c == '_') {
+                nextUpperCase = true;
+            } else {
+                if (nextUpperCase) {
+                    camelCase.append(Character.toUpperCase(c));
+                    nextUpperCase = false;
+                } else {
+                    camelCase.append(c);
+                }
+            }
+        }
+        return camelCase.toString();
+    }
+
+