---
name: 数据订单流程优化
overview: 根据新的业务流程需求，对数据订单相关接口进行优化，新增审批状态和onboard状态，实现完整的订单分析-审批-生成-完成流程。
todos:
  - id: model-status
    content: 模型层：新增 STATUS_PENDING_APPROVAL 和 STATUS_ONBOARD 状态常量及标签映射
    status: completed
  - id: service-analyze
    content: 服务层：修改 analyze_order 方法，分析通过后转为 pending_approval 状态
    status: completed
  - id: service-update
    content: 服务层：新增 update_order 方法，支持修改订单描述和提取结果
    status: completed
  - id: service-generate
    content: 服务层：新增 generate_order_resources 方法，实现自动创建 BusinessDomain 和 DataFlow
    status: completed
  - id: service-approve
    content: 服务层：修改 approve_order 方法，集成自动生成逻辑
    status: completed
  - id: service-onboard
    content: 服务层：新增 set_order_onboard 方法，供数据工厂回调
    status: completed
  - id: service-complete
    content: 服务层：修改 complete_order 方法，只允许从 onboard 状态完成
    status: completed
  - id: route-update
    content: 路由层：新增 PUT /orders/{id} 更新订单接口
    status: completed
  - id: route-onboard
    content: 路由层：新增 POST /orders/{id}/onboard 回调接口
    status: completed
  - id: route-modify
    content: 路由层：修改 approve_order 和 complete_order 接口逻辑
    status: completed
---

# 数据订单流程优化计划

## 流程概览

```mermaid
stateDiagram-v2
    [*] --> pending: 新增订单
    pending --> analyzing: 发起分析
    analyzing --> pending_approval: 分析通过
    analyzing --> manual_review: 分析有问题
    manual_review --> analyzing: 修改后重新分析
    pending_approval --> processing: 审批通过
    pending_approval --> rejected: 审批驳回
    processing --> onboard: 数据流程完成回调
    onboard --> completed: 标记完成
    rejected --> [*]
    completed --> [*]
```

## 状态定义变更

| 状态值 | 状态名称 | 说明 |

|--------|----------|------|

| pending | 待处理 | 新增订单初始状态 |

| analyzing | 分析中 | 正在进行 LLM 分析 |

| pending_approval | 待审批 | 分析通过，等待人工审批 |

| manual_review | 待人工处理 | 分析有问题，需人工修改 |

| processing | 加工中 | 审批通过，自动生成资源中 |

| onboard | 数据产品就绪 | 数据流程完成，产品可用 |

| completed | 已完成 | 订单最终完成 |

| rejected | 已驳回 | 审批被驳回 |

## 涉及文件修改

### 1. 模型层 - [app/models/data_product.py](app/models/data_product.py)

**修改内容：**

- 新增状态常量 `STATUS_PENDING_APPROVAL = "pending_approval"` 和 `STATUS_ONBOARD = "onboard"`
- 更新 `STATUS_LABELS` 映射
```python
# 新增状态常量
STATUS_PENDING_APPROVAL = "pending_approval"  # 待审批
STATUS_ONBOARD = "onboard"  # 数据产品就绪
```


### 2. 服务层 - [app/core/data_service/data_product_service.py](app/core/data_service/data_product_service.py)

**修改内容：**

**(A) 修改 `analyze_order` 方法**

- 分析通过时状态改为 `pending_approval` (而非 `processing`)
- 分析有问题时保持 `manual_review`
```python
# 修改第 1530-1535 行的逻辑
if can_connect:
    order.update_status(DataOrder.STATUS_PENDING_APPROVAL)  # 改为待审批
else:
    order.update_status(DataOrder.STATUS_MANUAL_REVIEW)
```


**(B) 修改 `approve_order` 方法**

- 接受来自 `pending_approval` 状态的审批
- 审批通过后调用自动生成逻辑
- 返回生成的 BusinessDomain 和 DataFlow 信息

**(C) 新增 `update_order` 方法**

- 支持修改订单的 title、description
- 支持修改 extracted_domains、extracted_fields、extraction_purpose
- 修改后状态重置为 `pending` 或保持 `manual_review`

**(D) 新增 `generate_order_resources` 方法**

- 根据订单分析结果自动创建 BusinessDomain 节点
- 自动创建 DataFlow 节点
- 建立节点间的关系 (INPUT/OUTPUT)
- 关联到数据订单

**(E) 新增 `set_order_onboard` 方法**

- 供数据工厂回调，将订单状态更新为 `onboard`
- 更新关联的 dataflow_id 和 product_id

**(F) 新增 `mark_order_completed` 方法**

- 从 `onboard` 状态标记为最终完成

### 3. 路由层 - [app/api/data_service/routes.py](app/api/data_service/routes.py)

**修改内容：**

**(A) 修改 `approve_order` 路由**

- 接受 `pending_approval` 状态
- 调用自动生成逻辑

**(B) 新增 `PUT /orders/<order_id>` 更新订单接口**

```python
@bp.route("/orders/<int:order_id>", methods=["PUT"])
def update_order(order_id: int):
    """更新数据订单（支持修改描述和提取结果）"""
```

请求体：

```json
{
    "title": "新标题（可选）",
    "description": "新描述（可选）",
    "extracted_domains": ["域1", "域2"],
    "extracted_fields": ["字段1", "字段2"],
    "extraction_purpose": "用途（可选）"
}
```

**(C) 新增 `POST /orders/<order_id>/onboard` 回调接口**

```python
@bp.route("/orders/<int:order_id>/onboard", methods=["POST"])
def onboard_order(order_id: int):
    """数据工厂回调：设置订单为数据产品就绪状态"""
```

请求体：

```json
{
    "product_id": 123,
    "dataflow_id": 456,
    "processed_by": "n8n-workflow"
}
```

**(D) 修改 `complete_order` 接口逻辑**

- 只允许从 `onboard` 状态标记完成
- 添加状态校验

### 4. 数据库迁移 (可选)

数据库表 `data_orders` 的 `status` 字段已经是 VARCHAR(50)，可以直接存储新的状态值，无需 DDL 变更。但建议更新表注释：

```sql
-- 更新状态字段注释
COMMENT ON COLUMN public.data_orders.status IS 
    '订单状态：pending/analyzing/pending_approval/manual_review/processing/onboard/completed/rejected';
```

## 接口变更汇总

| 操作 | 方法 | 路径 | 变更类型 |

|------|------|------|----------|

| 更新订单 | PUT | /orders/{id} | 新增 |

| 设置onboard | POST | /orders/{id}/onboard | 新增 |

| 审批通过 | POST | /orders/{id}/approve | 修改逻辑 |

| 标记完成 | POST | /orders/{id}/complete | 修改逻辑 |

| 订单分析 | POST | /orders/{id}/analyze | 修改逻辑 |

## 自动生成资源逻辑

审批通过后，`generate_order_resources` 方法将：

1. 根据 `graph_analysis.matched_domains` 确定输入的 BusinessDomain 节点
2. 创建新的目标 BusinessDomain 节点（作为数据产品的承载）
3. 创建 DataFlow 节点，设置 script_requirement 等属性
4. 建立 INPUT 关系（源 BusinessDomain -> DataFlow）
5. 建立 OUTPUT 关系（DataFlow -> 目标 BusinessDomain）
6. 更新订单的 `result_dataflow_id`

## 实施顺序

1. 先修改模型层，新增状态常量
2. 修改服务层，实现核心业务逻辑
3. 修改路由层，暴露新接口
4. 更新数据库注释（可选）
5. 测试完整流程