264 lines
4.6 KiB
Markdown
264 lines
4.6 KiB
Markdown
|
|
# 数据转换节点功能说明
|
|||
|
|
|
|||
|
|
## ✅ 已完成
|
|||
|
|
|
|||
|
|
已实现完整的数据转换节点功能,支持字段映射、数据过滤、数据计算等多种转换模式。
|
|||
|
|
|
|||
|
|
## 功能特性
|
|||
|
|
|
|||
|
|
### 1. 数据转换服务 (`backend/app/services/data_transformer.py`)
|
|||
|
|
|
|||
|
|
- 字段映射:支持简单和嵌套字段映射
|
|||
|
|
- 数据过滤:支持多种过滤规则
|
|||
|
|
- 数据计算:支持表达式计算
|
|||
|
|
- 嵌套路径访问:支持 `user.name`、`items[0].price` 等
|
|||
|
|
|
|||
|
|
### 2. 支持的转换模式
|
|||
|
|
|
|||
|
|
#### 字段映射 (mapping)
|
|||
|
|
将源字段映射到目标字段
|
|||
|
|
|
|||
|
|
#### 数据过滤 (filter)
|
|||
|
|
根据条件过滤数据
|
|||
|
|
|
|||
|
|
#### 数据计算 (compute)
|
|||
|
|
使用表达式计算新字段
|
|||
|
|
|
|||
|
|
#### 全部 (all)
|
|||
|
|
同时应用所有转换模式
|
|||
|
|
|
|||
|
|
## 使用方法
|
|||
|
|
|
|||
|
|
### 1. 在工作流中添加转换节点
|
|||
|
|
|
|||
|
|
1. 打开工作流设计器
|
|||
|
|
2. 从节点工具箱拖拽"转换"节点到画布
|
|||
|
|
3. 配置转换规则
|
|||
|
|
|
|||
|
|
### 2. 配置转换节点
|
|||
|
|
|
|||
|
|
#### 字段映射模式
|
|||
|
|
|
|||
|
|
**配置示例**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"mode": "mapping",
|
|||
|
|
"mapping": {
|
|||
|
|
"new_name": "old_name",
|
|||
|
|
"new_age": "old_age",
|
|||
|
|
"user_email": "email"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输入**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"old_name": "张三",
|
|||
|
|
"old_age": 25,
|
|||
|
|
"email": "zhangsan@example.com"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输出**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"new_name": "张三",
|
|||
|
|
"new_age": 25,
|
|||
|
|
"user_email": "zhangsan@example.com"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 嵌套字段映射
|
|||
|
|
|
|||
|
|
**配置示例**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"mode": "mapping",
|
|||
|
|
"mapping": {
|
|||
|
|
"user_name": "user.name",
|
|||
|
|
"user_age": "user.profile.age",
|
|||
|
|
"first_item_price": "items[0].price"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输入**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"user": {
|
|||
|
|
"name": "李四",
|
|||
|
|
"profile": {
|
|||
|
|
"age": 30
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"items": [
|
|||
|
|
{"id": 1, "price": 100},
|
|||
|
|
{"id": 2, "price": 200}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输出**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"user_name": "李四",
|
|||
|
|
"user_age": 30,
|
|||
|
|
"first_item_price": 100
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 数据过滤模式
|
|||
|
|
|
|||
|
|
**配置示例**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"mode": "filter",
|
|||
|
|
"filter_rules": [
|
|||
|
|
{"field": "status", "operator": "==", "value": "active"},
|
|||
|
|
{"field": "count", "operator": ">", "value": 10}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**支持的运算符**:
|
|||
|
|
- `==`: 等于
|
|||
|
|
- `!=`: 不等于
|
|||
|
|
- `>`: 大于
|
|||
|
|
- `>=`: 大于等于
|
|||
|
|
- `<`: 小于
|
|||
|
|
- `<=`: 小于等于
|
|||
|
|
- `in`: 包含
|
|||
|
|
- `not in`: 不包含
|
|||
|
|
|
|||
|
|
#### 数据计算模式
|
|||
|
|
|
|||
|
|
**配置示例**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"mode": "compute",
|
|||
|
|
"compute_rules": {
|
|||
|
|
"subtotal": "{price} * {quantity}",
|
|||
|
|
"total": "({price} * {quantity}) * (1 - {discount})"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输入**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"price": 100,
|
|||
|
|
"quantity": 3,
|
|||
|
|
"discount": 0.1
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**输出**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"price": 100,
|
|||
|
|
"quantity": 3,
|
|||
|
|
"discount": 0.1,
|
|||
|
|
"subtotal": 300,
|
|||
|
|
"total": 270.0
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 前端配置
|
|||
|
|
|
|||
|
|
在节点配置面板中:
|
|||
|
|
|
|||
|
|
1. **选择转换模式**:字段映射、数据过滤、数据计算或全部
|
|||
|
|
2. **配置映射规则**:JSON格式的字段映射
|
|||
|
|
3. **配置过滤规则**:JSON数组格式的过滤规则
|
|||
|
|
4. **配置计算规则**:JSON格式的计算表达式
|
|||
|
|
|
|||
|
|
## 测试结果
|
|||
|
|
|
|||
|
|
### 测试覆盖
|
|||
|
|
|
|||
|
|
- ✅ 字段映射 (通过)
|
|||
|
|
- ✅ 嵌套字段映射 (通过)
|
|||
|
|
- ✅ 数据过滤 (通过)
|
|||
|
|
- ✅ 数据计算 (通过)
|
|||
|
|
- ✅ 工作流中的转换节点 (通过)
|
|||
|
|
|
|||
|
|
### 测试用例
|
|||
|
|
|
|||
|
|
1. **简单字段映射**: `{"username": "name"}` ✅
|
|||
|
|
2. **嵌套字段映射**: `{"user_name": "user.name"}` ✅
|
|||
|
|
3. **数组索引访问**: `{"first_item_price": "items[0].price"}` ✅
|
|||
|
|
4. **数据过滤**: 多条件过滤 ✅
|
|||
|
|
5. **数据计算**: 复杂表达式计算 ✅
|
|||
|
|
|
|||
|
|
## 工作流示例
|
|||
|
|
|
|||
|
|
### 示例1: 数据格式转换
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
开始 → 转换节点(字段映射) → LLM节点 → 结束
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
转换节点配置:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"mode": "mapping",
|
|||
|
|
"mapping": {
|
|||
|
|
"input_text": "raw_input",
|
|||
|
|
"user_id": "id"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 示例2: 数据预处理
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
开始 → 转换节点(过滤) → 条件节点 → [True] → LLM节点 → 结束
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
转换节点配置:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"mode": "filter",
|
|||
|
|
"filter_rules": [
|
|||
|
|
{"field": "status", "operator": "==", "value": "active"}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 示例3: 数据计算
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
开始 → 转换节点(计算) → 输出节点 → 结束
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
转换节点配置:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"mode": "compute",
|
|||
|
|
"compute_rules": {
|
|||
|
|
"total": "{price} * {quantity}",
|
|||
|
|
"discounted_price": "{total} * (1 - {discount})"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
1. **JSON格式**: 配置规则必须是有效的JSON格式
|
|||
|
|
2. **字段路径**: 嵌套路径使用点号分隔,数组使用方括号
|
|||
|
|
3. **表达式安全**: 计算表达式只支持安全的数学运算
|
|||
|
|
4. **错误处理**: 如果转换失败,节点会返回错误信息
|
|||
|
|
|
|||
|
|
## 后续计划
|
|||
|
|
|
|||
|
|
- [ ] 支持更多转换函数(字符串处理、日期格式化等)
|
|||
|
|
- [ ] 支持数组操作(map、filter、reduce)
|
|||
|
|
- [ ] 可视化配置界面
|
|||
|
|
- [ ] 转换规则模板
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**状态**: ✅ 已完成
|
|||
|
|
**时间**: 2024年
|