# GET /api/dataflow/get-BD-list 接口说明

## 接口概述

获取 Neo4j 图数据库中所有 BusinessDomain（业务域）节点的列表。

## 接口信息

- **路径**: `/api/dataflow/get-BD-list`
- **方法**: `GET`
- **认证**: 需要（根据项目配置）

## 请求参数

无需请求参数

## 响应格式

### 成功响应

**HTTP状态码**: 200

**响应体**:

```json
{
  "code": 200,
  "data": [
    {
      "id": 276,
      "name_zh": "科室对照表",
      "name_en": "TB_JC_KSDZB",
      "tag": "数据资源"
    },
    {
      "id": 277,
      "name_zh": "科室对照表",
      "name_en": "departments",
      "tag": "数据模型"
    }
  ],
  "message": "操作成功"
}
```

### 响应字段说明

| 字段 | 类型 | 说明 |
|------|------|------|
| code | Integer | 响应状态码，200表示成功 |
| data | Array | BusinessDomain节点列表 |
| data[].id | Integer | 节点ID（Neo4j内部ID） |
| data[].name_zh | String | 业务域中文名称 |
| data[].name_en | String | 业务域英文名称 |
| data[].tag | String | 标签名称，通过BELONGS_TO关系获取的DataLabel节点的中文名称 |
| message | String | 响应消息 |

### 错误响应

**HTTP状态码**: 500

**响应体**:

```json
{
  "code": 500,
  "message": "获取BusinessDomain列表失败: {错误详情}",
  "data": {}
}
```

## 实现逻辑

### 1. 路由层（app/api/data_flow/routes.py）

```python
@bp.route('/get-BD-list', methods=['GET'])
def get_business_domain_list():
    """获取BusinessDomain节点列表"""
    try:
        logger.info("接收到获取BusinessDomain列表请求")
        
        # 调用服务层函数获取BusinessDomain列表
        bd_list = DataFlowService.get_business_domain_list()
        
        res = success(bd_list, "操作成功")
        return json.dumps(res, ensure_ascii=False, cls=MyEncoder)
    except Exception as e:
        logger.error(f"获取BusinessDomain列表失败: {str(e)}")
        res = failed(f'获取BusinessDomain列表失败: {str(e)}', 500, {})
        return json.dumps(res, ensure_ascii=False, cls=MyEncoder)
```

### 2. 服务层（app/core/data_flow/dataflows.py）

```python
@staticmethod
def get_business_domain_list() -> List[Dict[str, Any]]:
    """
    获取BusinessDomain节点列表
    
    Returns:
        BusinessDomain节点列表，每个节点包含 id, name_zh, name_en, tag
    """
    try:
        logger.info("开始查询BusinessDomain节点列表")
        
        with connect_graph().session() as session:
            # 查询所有BusinessDomain节点及其BELONGS_TO关系指向的标签
            query = """
            MATCH (bd:BusinessDomain)
            OPTIONAL MATCH (bd)-[:BELONGS_TO]->(label:DataLabel)
            RETURN id(bd) as id, 
                   bd.name_zh as name_zh, 
                   bd.name_en as name_en,
                   label.name_zh as tag
            ORDER BY bd.create_time DESC
            """
            
            result = session.run(query)
            
            bd_list = []
            for record in result:
                bd_item = {
                    "id": record["id"],
                    "name_zh": record["name_zh"] if record["name_zh"] else "",
                    "name_en": record["name_en"] if record["name_en"] else "",
                    "tag": record["tag"] if record["tag"] else ""
                }
                bd_list.append(bd_item)
            
            logger.info(f"成功查询到 {len(bd_list)} 个BusinessDomain节点")
            return bd_list
            
    except Exception as e:
        logger.error(f"查询BusinessDomain节点列表失败: {str(e)}")
        raise e
```

### 3. Cypher 查询说明

```cypher
MATCH (bd:BusinessDomain)
OPTIONAL MATCH (bd)-[:BELONGS_TO]->(label:DataLabel)
RETURN id(bd) as id, 
       bd.name_zh as name_zh, 
       bd.name_en as name_en,
       label.name_zh as tag
ORDER BY bd.create_time DESC
```

**查询逻辑**：
1. 匹配所有 `BusinessDomain` 节点
2. 可选匹配其通过 `BELONGS_TO` 关系指向的 `DataLabel` 节点
3. 返回 BusinessDomain 的 id、中文名、英文名
4. 返回 DataLabel 的中文名作为 tag
5. 按创建时间降序排列

## 使用示例

### cURL 示例

```bash
curl -X GET http://localhost:5000/api/dataflow/get-BD-list \
  -H "Content-Type: application/json"
```

### JavaScript 示例

```javascript
fetch('http://localhost:5000/api/dataflow/get-BD-list', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json'
  }
})
.then(response => response.json())
.then(data => {
  console.log('BusinessDomain列表:', data.data);
  data.data.forEach(bd => {
    console.log(`ID: ${bd.id}, 名称: ${bd.name_zh} (${bd.name_en}), 标签: ${bd.tag}`);
  });
})
.catch(error => console.error('Error:', error));
```

### Python 示例

```python
import requests

url = "http://localhost:5000/api/dataflow/get-BD-list"
response = requests.get(url)

if response.status_code == 200:
    result = response.json()
    bd_list = result['data']
    
    for bd in bd_list:
        print(f"ID: {bd['id']}, 名称: {bd['name_zh']} ({bd['name_en']}), 标签: {bd['tag']}")
else:
    print(f"请求失败: {response.text}")
```

## 注意事项

1. **标签字段（tag）**：
   - tag 字段通过查询 BusinessDomain 节点的 BELONGS_TO 关系获取
   - 如果节点没有 BELONGS_TO 关系，tag 字段为空字符串
   - 标签的值来自 DataLabel 节点的 name_zh 属性

2. **排序规则**：
   - 结果按 BusinessDomain 节点的 create_time 降序排列
   - 最新创建的节点排在前面

3. **空值处理**：
   - 如果 name_zh、name_en 或 tag 为 null，会转换为空字符串 ""
   - 保证前端不会收到 null 值

4. **性能考虑**：
   - 该接口返回所有 BusinessDomain 节点，不支持分页
   - 如果节点数量很大，建议后续添加分页功能

## 相关接口

- `POST /api/model/data/save` - 创建数据模型时会自动创建 BusinessDomain 节点
- 其他数据流相关接口参见 `/api/dataflow/` 路径下的接口

## 更新历史

- **2024-11-28**: 初始版本，实现基本的 BusinessDomain 节点列表查询功能

