Ver código fonte

代码提交

SGTY 1 mês atrás
pai
commit
4bb96a5ee4
3 arquivos alterados com 64 adições e 39 exclusões
  1. 2 2
      model/response.py
  2. 12 5
      router/knowledge_saas.py
  3. 50 32
      utils/ObjectToJsonArrayConverter.py

+ 2 - 2
model/response.py

@@ -7,8 +7,8 @@ import json
 
 class StandardResponse(BaseModel):
     success: bool
-    error_code: Optional[int] = None
-    error_msg: Optional[str] = None
+    errorCode: Optional[int] = None
+    errorMsg: Optional[str] = None
     records: Optional[Any] = None
     data: Optional[Any] = None
 

+ 12 - 5
router/knowledge_saas.py

@@ -8,6 +8,7 @@ from sqlalchemy.orm import Session
 from service.kg_node_service import KGNodeService
 from service.trunks_service import TrunksService
 import logging
+from utils.ObjectToJsonArrayConverter import ObjectToJsonArrayConverter
 
 router = APIRouter(prefix="/saas", tags=["SaaS Knowledge Base"])
 
@@ -21,6 +22,7 @@ class PaginatedSearchRequest(BaseModel):
 
 class NodePaginatedSearchRequest(BaseModel):
     name: str
+    appid: str
     category: Optional[str] = None
     pageNo: int = 1
     limit: int = 10  
@@ -76,7 +78,7 @@ async def paginated_search(
             )
         )
 
-@router.post("/nodes/paginated_search", response_model=StandardResponse)
+@router.post("/nodes/query", response_model=StandardResponse)
 async def paginated_search(
     payload: NodePaginatedSearchRequest,
     db: Session = Depends(get_db)
@@ -91,12 +93,17 @@ async def paginated_search(
             'load_props': True
         }
         result = service.paginated_search(search_params)
+        #result[data]的distance属性去掉
+        for item in result['records']:
+            item.pop('distance', None)
+        #result[pagination]去掉
+        result.pop('pagination', None)
+        #result[records]改为result[nodes]
+        result['nodes'] = result['records']
+        result.pop('records', None)   
         return StandardResponse(
             success=True,
-            data={
-                'records': result['records'],
-                'pagination': result['pagination']
-            }
+            data=ObjectToJsonArrayConverter.convert(result)
         )
     except Exception as e:
         logger.error(f"分页查询失败: {str(e)}")

+ 50 - 32
utils/ObjectToJsonArrayConverter.py

@@ -2,45 +2,63 @@ import json
 
 
 class ObjectToJsonArrayConverter:
+    """
+    将Python对象转换为特定结构的JSON数组。
+    """
+
     @staticmethod
     def convert(obj):
-        def process_value(value):
+        """
+        递归转换对象为JSON数组结构。
+
+        Args:
+            obj: 待转换的Python对象(dict/list/其他)
+
+        Returns:
+            list: 转换后的结构,每个元素为 {"key": key, "value": processed_value}
+        """
+        def _process(value, in_list_context):
+            """处理值,根据是否在列表环境中决定包装逻辑"""
             if isinstance(value, dict):
+                # 字典递归转换为列表结构
                 return ObjectToJsonArrayConverter.convert(value)
-            elif not isinstance(value, list):
-                return [value]
-            return value
-
-        result = []
-        for key, value in obj.items():
-            processed_value = process_value(value)
-            result.append({
-                "key": key,
-                "value": processed_value
-            })
-        return result
+            if isinstance(value, list):
+                # 列表递归处理,子元素默认在列表环境中
+                return [_process(item, in_list_context=True) for item in value]
+            # 普通值:列表环境中不包装,否则包装为单元素列表
+            return value if in_list_context else [value]
+
+        # 处理外层对象
+        if isinstance(obj, dict):
+            return [{"key": k, "value": _process(v, False)} for k, v in obj.items()]
+        if isinstance(obj, list):
+            return [{"key": None, "value": _process(item, True)} for item in obj]
+        return []  # 非dict/list返回空(根据原逻辑)
 
     @staticmethod
     def to_json(obj, indent=None):
-        converted = ObjectToJsonArrayConverter.convert(obj)
-        return json.dumps(converted, indent=indent, ensure_ascii=False)
+        """
+        转换为JSON字符串。
 
+        Args:
+            obj: 待转换对象
+            indent: 缩进量(默认无缩进)
 
-# 使用示例
+        Returns:
+            str: JSON字符串
+        """
+        return json.dumps(
+            ObjectToJsonArrayConverter.convert(obj),
+            indent=indent,
+            ensure_ascii=False
+        )
+
+
+# 测试代码
 if __name__ == "__main__":
-    original_obj = {
-        "name": "Test",
-        "hobbies": ["Reading", "Swimming"],
-        "properties": {
-            "desc": "英俊潇洒",
-            "nested": {
-                "age": 25
-            }
-        }
-    }
-
-    # 转换对象
-    converter = ObjectToJsonArrayConverter()
-    converted_json = converter.to_json(original_obj, indent=4)
-
-    print(converted_json)
+    test_obj = [
+            {"name": "Alice"},
+            [{"age": 30}, "直接值"]
+        ]
+
+    print(ObjectToJsonArrayConverter.to_json(test_obj, indent=4))