# 数据订单 API 前端开发指南
> **模块说明**: 数据订单 API 提供数据需求订单的创建、分析、审批、驳回、完成等全生命周期管理功能。当用户在数据服务列表中找不到所需数据时,可以发起数据订单,系统会通过 LLM 提取实体并检测业务领域图谱的连通性。
>
> **基础路径**: `/api/dataservice`
>
> **版本**: 2.1.0 (更新于 2026-01-09)
---
## 目录
- [功能概述](#功能概述)
- [业务流程](#业务流程)
- [通用说明](#通用说明)
- [响应格式](#响应格式)
- [错误码说明](#错误码说明)
- [订单状态说明](#订单状态说明)
- [Axios 配置](#axios-配置)
- [接口列表](#接口列表)
1. [获取数据订单列表](#1-获取数据订单列表)
2. [获取数据订单详情](#2-获取数据订单详情)
3. [创建数据订单](#3-创建数据订单)
4. [更新数据订单](#4-更新数据订单)
5. [分析数据订单](#5-分析数据订单)
6. [审批通过订单](#6-审批通过订单)
7. [驳回订单](#7-驳回订单)
8. [设置数据产品就绪](#8-设置数据产品就绪onboard)
9. [完成订单](#9-完成订单)
10. [删除订单](#10-删除订单)
- [API 模块封装](#api-模块封装)
- [完整页面示例](#完整页面示例)
- [常见问题](#常见问题)
- [更新日志](#更新日志)
---
## 功能概述
数据订单功能允许用户:
1. **提交数据需求**: 描述需要什么样的数据
2. **智能分析**: 系统通过 LLM 自动提取业务领域和数据字段
3. **连通性检测**: 在业务领域图谱中检测实体间的关联关系
4. **审批流程**: 支持人工审批、驳回和补充信息
5. **自动资源生成**: 审批通过后自动创建 BusinessDomain 和 DataFlow 节点
6. **数据产品关联**: 数据流程完成后关联生成的数据产品
---
## 业务流程
### 状态流转图
```
┌─────────────────┐
│ 新增订单 │
│ (pending) │
└────────┬────────┘
│ 发起分析
▼
┌─────────────────┐
│ 分析中 │
│ (analyzing) │
└────────┬────────┘
│
┌───────────────────┼───────────────────┐
│ 分析通过 │ │ 分析有问题
▼ │ ▼
┌─────────────────┐ │ ┌─────────────────┐
│ 待审批 │ │ │ 待人工处理 │
│(pending_approval)│ │ │ (manual_review) │
└────────┬────────┘ │ └────────┬────────┘
│ │ │
┌───────────┴───────────┐ │ │ 修改后
│ 审批通过 │审批驳回│ │ 重新分析
▼ ▼ │ │
┌─────────────────┐ ┌─────────────────┐ │
│ 加工中 │ │ 已驳回 │ │
│ (processing) │ │ (rejected) │◄─────────────────┘
└────────┬────────┘ └─────────────────┘
│ 数据工厂回调
▼
┌─────────────────┐
│ 数据产品就绪 │
│ (onboard) │
└────────┬────────┘
│ 标记完成
▼
┌─────────────────┐
│ 已完成 │
│ (completed) │
└─────────────────┘
```
### 典型流程
| 步骤 | 操作 | 状态变化 | 说明 |
|------|------|----------|------|
| 1 | 用户创建订单 | → `pending` | 订单初始状态 |
| 2 | 发起分析 | `pending` → `analyzing` | 调用 LLM 提取实体 |
| 3a | 分析通过 | `analyzing` → `pending_approval` | 等待人工审批确认 |
| 3b | 分析有问题 | `analyzing` → `manual_review` | 需要人工修改 |
| 4 | 人工修改订单 | 保持 `manual_review` | 修改描述或提取结果 |
| 5 | 重新分析 | `manual_review` → `analyzing` | 再次进行分析 |
| 6a | 审批通过 | `pending_approval` → `processing` | 自动生成资源 |
| 6b | 审批驳回 | `pending_approval` → `rejected` | 订单被驳回 |
| 7 | 数据工厂回调 | `processing` → `onboard` | 数据产品生产完成 |
| 8 | 标记完成 | `onboard` → `completed` | 订单最终完成 |
---
## 通用说明
### 响应格式
所有接口返回统一的 JSON 格式:
```json
{
"code": 200,
"message": "操作成功",
"data": { ... }
}
```
| 字段 | 类型 | 说明 |
|------|------|------|
| `code` | number | 状态码,200 表示成功,其他表示失败 |
| `message` | string | 操作结果描述信息 |
| `data` | object \| array \| null | 返回的数据内容 |
### 错误码说明
| 状态码 | 说明 | 常见场景 |
|--------|------|----------|
| 200 | 成功 | 操作成功完成 |
| 400 | 请求参数错误 | 缺少必填字段、状态不允许操作、驳回原因为空 |
| 404 | 资源不存在 | 数据订单 ID 不存在 |
| 500 | 服务器内部错误 | 数据库连接失败、LLM 调用失败、图谱查询异常 |
### 订单状态说明
| 状态值 | 中文标签 | 说明 | 可执行操作 |
|--------|----------|------|------------|
| `pending` | 待处理 | 订单刚创建,等待分析 | 分析、更新、删除 |
| `analyzing` | 分析中 | 正在进行 LLM 提取和图谱分析 | - |
| `pending_approval` | 待审批 | 分析通过,等待人工审批 | 审批通过、驳回 |
| `processing` | 加工中 | 审批通过,正在生成数据流/数据产品 | - |
| `onboard` | 数据产品就绪 | 数据流程完成,产品可用 | 完成 |
| `completed` | 已完成 | 订单处理完成 | 删除 |
| `rejected` | 已驳回 | 订单被驳回 | 删除 |
| `need_supplement` | 待补充 | 需要用户补充信息 | 更新、分析 |
| `manual_review` | 待人工处理 | 需要人工修改 | 更新、分析、审批、驳回 |
### Axios 配置
建议的 Axios 全局配置:
```javascript
// src/utils/request.js
import axios from 'axios'
import { ElMessage } from 'element-plus'
const request = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:5050',
timeout: 60000, // 分析接口可能需要较长时间
headers: {
'Content-Type': 'application/json'
}
})
// 响应拦截器
request.interceptors.response.use(
response => {
const res = response.data
if (res.code !== 200) {
ElMessage.error(res.message || '请求失败')
return Promise.reject(new Error(res.message || 'Error'))
}
return res
},
error => {
ElMessage.error(error.message || '网络错误')
return Promise.reject(error)
}
)
export default request
```
---
## 接口列表
---
### 1. 获取数据订单列表
分页获取数据订单列表,支持搜索和状态过滤。
#### 请求信息
| 项目 | 说明 |
|------|------|
| **URL** | `GET /api/dataservice/orderlist` |
| **Method** | GET |
| **Content-Type** | - |
#### 请求参数 (Query String)
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| `page` | integer | 否 | 1 | 页码 |
| `page_size` | integer | 否 | 20 | 每页数量 |
| `search` | string | 否 | "" | 搜索关键词(匹配订单编号、标题、描述) |
| `status` | string | 否 | - | 状态过滤,见[订单状态说明](#订单状态说明) |
#### 响应数据
```json
{
"code": 200,
"message": "获取数据订单列表成功",
"data": {
"list": [
{
"id": 1,
"order_no": "DO202601090001",
"title": "员工与部门关联数据",
"description": "需要获取员工信息和所属部门的关联数据",
"extracted_domains": ["员工", "部门"],
"extracted_fields": ["员工ID", "姓名", "部门ID", "部门名称"],
"extraction_purpose": "用于人力资源分析报表",
"graph_analysis": {
"matched_domains": [...],
"matched_fields": [...],
"connection_analysis": {...}
},
"can_connect": true,
"connection_path": {...},
"status": "pending_approval",
"status_label": "待审批",
"reject_reason": null,
"result_product_id": null,
"result_dataflow_id": null,
"created_by": "张三",
"created_at": "2026-01-09T09:00:00",
"updated_at": "2026-01-09T09:15:00",
"processed_by": null,
"processed_at": null
}
],
"pagination": {
"page": 1,
"page_size": 20,
"total": 45,
"total_pages": 3
}
}
}
```
#### 数据订单字段说明
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | integer | 订单唯一 ID |
| `order_no` | string | 订单编号,格式: DO + YYYYMMDD + 4位序列号 |
| `title` | string | 订单标题 |
| `description` | string | 需求描述 |
| `extracted_domains` | array \| null | LLM 提取的业务领域列表 |
| `extracted_fields` | array \| null | LLM 提取的数据字段列表 |
| `extraction_purpose` | string \| null | LLM 提取的数据用途 |
| `graph_analysis` | object \| null | 图谱连通性分析结果 |
| `can_connect` | boolean \| null | 是否可在图谱中连通 |
| `connection_path` | object \| null | 连通路径详情 |
| `status` | string | 订单状态 |
| `status_label` | string | 状态中文标签 |
| `reject_reason` | string \| null | 驳回原因(仅状态为 rejected 时有值) |
| `result_product_id` | integer \| null | 生成的数据产品 ID |
| `result_dataflow_id` | integer \| null | 生成的数据流 ID |
| `created_by` | string | 创建人 |
| `created_at` | string | 创建时间(ISO 8601 格式) |
| `updated_at` | string | 更新时间 |
| `processed_by` | string \| null | 处理人 |
| `processed_at` | string \| null | 处理时间 |
#### Vue 接入示例
```javascript
import request from '@/utils/request'
// 获取订单列表
const fetchOrders = async (params) => {
const res = await request.get('/api/dataservice/orderlist', { params })
return res.data
}
// 使用示例
const { list, pagination } = await fetchOrders({
page: 1,
page_size: 20,
status: 'pending_approval'
})
```
---
### 2. 获取数据订单详情
根据 ID 获取单个数据订单的详细信息。
#### 请求信息
| 项目 | 说明 |
|------|------|
| **URL** | `GET /api/dataservice/orders/{order_id}/detail` |
| **Method** | GET |
| **Content-Type** | - |
#### 路径参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `order_id` | integer | 是 | 数据订单 ID |
#### 响应数据
```json
{
"code": 200,
"message": "获取数据订单详情成功",
"data": {
"id": 1,
"order_no": "DO202601090001",
"title": "员工与部门关联数据",
"description": "需要获取员工信息和所属部门的关联数据...",
"extracted_domains": ["员工", "部门"],
"extracted_fields": ["员工ID", "姓名", "部门ID", "部门名称"],
"extraction_purpose": "用于人力资源分析报表",
"graph_analysis": {...},
"can_connect": true,
"connection_path": {...},
"status": "pending_approval",
"status_label": "待审批",
...
}
}
```
#### Vue 接入示例
```javascript
const fetchOrderDetail = async (orderId) => {
const res = await request.get(`/api/dataservice/orders/${orderId}/detail`)
return res.data
}
```
---
### 3. 创建数据订单
创建新的数据需求订单。
#### 请求信息
| 项目 | 说明 |
|------|------|
| **URL** | `POST /api/dataservice/neworder` |
| **Method** | POST |
| **Content-Type** | application/json |
#### 请求体参数
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| `title` | string | 是 | - | 订单标题,最大 200 字符 |
| `description` | string | 是 | - | 需求描述,详细说明需要什么数据 |
| `created_by` | string | 否 | "user" | 创建人标识 |
#### 请求示例
```json
{
"title": "员工与部门关联数据",
"description": "需要获取员工信息和所属部门的关联数据,包括:\n1. 员工基本信息(ID、姓名、入职日期)\n2. 部门信息(部门ID、部门名称)\n3. 部门层级关系\n\n用途:生成人力资源分析报表",
"created_by": "张三"
}
```
#### 响应数据
```json
{
"code": 200,
"message": "创建数据订单成功",
"data": {
"id": 1,
"order_no": "DO202601090001",
"title": "员工与部门关联数据",
"description": "...",
"status": "pending",
"status_label": "待处理",
...
}
}
```
#### Vue 接入示例
```javascript
const createOrder = async (data) => {
const res = await request.post('/api/dataservice/neworder', data)
return res.data
}
// 使用示例
const newOrder = await createOrder({
title: '员工与部门关联数据',
description: '需要获取员工信息...'
})
```
---
### 4. 更新数据订单
更新数据订单信息,支持修改标题、描述和 LLM 提取结果。
> **注意**: 只允许在 `pending`、`manual_review`、`need_supplement` 状态下修改订单。
#### 请求信息
| 项目 | 说明 |
|------|------|
| **URL** | `PUT /api/dataservice/orders/{order_id}/update` |
| **Method** | PUT |
| **Content-Type** | application/json |
#### 路径参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `order_id` | integer | 是 | 数据订单 ID |
#### 请求体参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `title` | string | 否 | 订单标题 |
| `description` | string | 否 | 需求描述 |
| `extracted_domains` | array | 否 | 提取的业务领域列表 |
| `extracted_fields` | array | 否 | 提取的数据字段列表 |
| `extraction_purpose` | string | 否 | 数据用途 |
#### 请求示例
```json
{
"title": "员工与部门关联数据(更新)",
"description": "需要获取员工信息和所属部门的关联数据,补充:需要包含员工的岗位信息",
"extracted_domains": ["员工", "部门", "岗位"],
"extracted_fields": ["员工ID", "姓名", "部门ID", "部门名称", "岗位名称"]
}
```
#### 响应数据
```json
{
"code": 200,
"message": "更新数据订单成功",
"data": {
"id": 1,
"order_no": "DO202601090001",
"title": "员工与部门关联数据(更新)",
"description": "...",
"extracted_domains": ["员工", "部门", "岗位"],
"extracted_fields": ["员工ID", "姓名", "部门ID", "部门名称", "岗位名称"],
"status": "manual_review",
"status_label": "待人工处理",
...
}
}
```
#### 错误响应
**状态不允许修改 (400):**
```json
{
"code": 400,
"message": "订单状态 processing 不允许修改,只有 ['pending', 'manual_review', 'need_supplement'] 状态可以修改",
"data": null
}
```
#### Vue 接入示例
```vue
取消
保存修改
```
---
### 5. 分析数据订单
触发 LLM 实体提取和业务领域图谱连通性分析。
#### 请求信息
| 项目 | 说明 |
|------|------|
| **URL** | `POST /api/dataservice/orders/{order_id}/analyze` |
| **Method** | POST |
| **Content-Type** | - |
#### 路径参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `order_id` | integer | 是 | 数据订单 ID |
#### 请求体
无需请求体。
#### 响应数据
分析成功后返回更新后的订单数据:
```json
{
"code": 200,
"message": "数据订单分析完成",
"data": {
"id": 1,
"order_no": "DO202601090001",
"title": "员工与部门关联数据",
"extracted_domains": ["员工", "部门"],
"extracted_fields": ["员工ID", "姓名", "部门ID", "部门名称"],
"extraction_purpose": "用于人力资源分析报表",
"graph_analysis": {
"matched_domains": [
{ "id": 101, "name_zh": "员工信息", "name_en": "employee" },
{ "id": 102, "name_zh": "部门信息", "name_en": "department" }
],
"matched_fields": [...],
"connection_analysis": {
"can_connect": true,
"common_fields": [...]
}
},
"can_connect": true,
"connection_path": {...},
"status": "pending_approval",
"status_label": "待审批"
}
}
```
**分析结果说明:**
| 结果 | 说明 | 后续状态 |
|------|------|----------|
| `can_connect: true` | 所有实体都能在图谱中连通 | `pending_approval` (待人工审批) |
| `can_connect: false` | 存在无法连通的实体 | `manual_review` (待人工处理) |
#### Vue 接入示例
```javascript
const analyzeOrder = async (orderId) => {
const loadingInstance = ElLoading.service({
text: '正在分析订单,可能需要几秒钟...',
background: 'rgba(0, 0, 0, 0.7)'
})
try {
const res = await request.post(`/api/dataservice/orders/${orderId}/analyze`)
loadingInstance.close()
if (res.data.can_connect) {
ElMessage.success('分析完成,实体可连通,请进行审批确认!')
} else {
ElMessage.warning('分析完成,部分实体无法连通,请修改后重新分析')
}
return res.data
} catch (error) {
loadingInstance.close()
ElMessage.error(error.message || '分析失败')
throw error
}
}
```
---
### 6. 审批通过订单
审批通过数据订单,系统将自动生成 BusinessDomain 和 DataFlow 资源。
> **注意**: 只允许从 `pending_approval` 或 `manual_review` 状态审批。
#### 请求信息
| 项目 | 说明 |
|------|------|
| **URL** | `POST /api/dataservice/orders/{order_id}/approve` |
| **Method** | POST |
| **Content-Type** | application/json |
#### 路径参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `order_id` | integer | 是 | 数据订单 ID |
#### 请求体参数
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| `processed_by` | string | 否 | "admin" | 处理人标识 |
#### 请求示例
```json
{
"processed_by": "管理员A"
}
```
#### 响应数据
```json
{
"code": 200,
"message": "数据订单审批通过,资源已生成",
"data": {
"order": {
"id": 1,
"order_no": "DO202601090001",
"status": "processing",
"status_label": "加工中",
"result_dataflow_id": 156,
"processed_by": "管理员A",
"processed_at": "2026-01-09T10:00:00",
...
},
"generated_resources": {
"target_business_domain_id": 201,
"dataflow_id": 156,
"input_domain_ids": [101, 102]
}
}
}
```
#### 生成资源说明
| 字段 | 类型 | 说明 |
|------|------|------|
| `target_business_domain_id` | integer | 新创建的目标 BusinessDomain 节点 ID |
| `dataflow_id` | integer | 新创建的 DataFlow 节点 ID |
| `input_domain_ids` | array | 输入的 BusinessDomain 节点 ID 列表 |
#### 错误响应
**状态不允许审批 (400):**
```json
{
"code": 400,
"message": "订单状态 pending 不允许审批,只有 ['pending_approval', 'manual_review'] 状态可以审批",
"data": null
}
```
#### Vue 接入示例
```javascript
const approveOrder = async (orderId, processedBy = 'admin') => {
try {
await ElMessageBox.confirm(
'确定要审批通过该订单吗?通过后将自动生成数据流程资源。',
'审批确认',
{ type: 'warning' }
)
const res = await request.post(`/api/dataservice/orders/${orderId}/approve`, {
processed_by: processedBy
})
ElMessage.success('审批通过,资源已生成')
// 可以显示生成的资源信息
console.log('生成的 DataFlow ID:', res.data.generated_resources.dataflow_id)
return res.data
} catch (error) {
if (error !== 'cancel') {
ElMessage.error(error.message || '审批失败')
}
}
}
```
---
### 7. 驳回订单
驳回数据订单,需要提供驳回原因。
#### 请求信息
| 项目 | 说明 |
|------|------|
| **URL** | `POST /api/dataservice/orders/{order_id}/reject` |
| **Method** | POST |
| **Content-Type** | application/json |
#### 路径参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `order_id` | integer | 是 | 数据订单 ID |
#### 请求体参数
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| `reason` | string | 是 | - | 驳回原因 |
| `processed_by` | string | 否 | "admin" | 处理人标识 |
#### 请求示例
```json
{
"reason": "需求描述不够清晰,请补充具体需要的数据字段和业务场景",
"processed_by": "管理员A"
}
```
#### 响应数据
```json
{
"code": 200,
"message": "数据订单已驳回",
"data": {
"id": 1,
"order_no": "DO202601090001",
"status": "rejected",
"status_label": "已驳回",
"reject_reason": "需求描述不够清晰,请补充具体需要的数据字段和业务场景",
"processed_by": "管理员A",
"processed_at": "2026-01-09T10:00:00",
...
}
}
```
#### Vue 接入示例
```vue
取消
确认驳回
```
---
### 8. 设置数据产品就绪(onboard)
数据工厂回调接口:当数据流程执行完成后,调用此接口将订单状态更新为"数据产品就绪"。
> **注意**: 只允许从 `processing` 状态转换为 `onboard` 状态。此接口通常由数据工厂(n8n 工作流)自动调用。
#### 请求信息
| 项目 | 说明 |
|------|------|
| **URL** | `POST /api/dataservice/orders/{order_id}/onboard` |
| **Method** | POST |
| **Content-Type** | application/json |
#### 路径参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `order_id` | integer | 是 | 数据订单 ID |
#### 请求体参数
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| `product_id` | integer | 否 | null | 生成的数据产品 ID |
| `dataflow_id` | integer | 否 | null | 数据流 ID |
| `processed_by` | string | 否 | "n8n-workflow" | 处理人标识 |
#### 请求示例
```json
{
"product_id": 15,
"dataflow_id": 156,
"processed_by": "n8n-workflow-001"
}
```
#### 响应数据
```json
{
"code": 200,
"message": "数据订单已设置为数据产品就绪状态",
"data": {
"id": 1,
"order_no": "DO202601090001",
"status": "onboard",
"status_label": "数据产品就绪",
"result_product_id": 15,
"result_dataflow_id": 156,
"processed_by": "n8n-workflow-001",
"processed_at": "2026-01-09T14:30:00",
...
}
}
```
#### 错误响应
**状态不允许操作 (400):**
```json
{
"code": 400,
"message": "订单状态 pending_approval 不允许设置为 onboard,只有 processing 状态可以转换",
"data": null
}
```
#### Vue 接入示例
```javascript
// 此接口通常由后端/数据工厂调用,前端一般不直接调用
// 如需手动触发,可使用以下代码:
const setOrderOnboard = async (orderId, productId, dataflowId) => {
const res = await request.post(`/api/dataservice/orders/${orderId}/onboard`, {
product_id: productId,
dataflow_id: dataflowId,
processed_by: 'manual'
})
return res.data
}
```
---
### 9. 完成订单
将订单标记为最终完成状态。
> **注意**: 只允许从 `onboard`(数据产品就绪)状态标记完成。
#### 请求信息
| 项目 | 说明 |
|------|------|
| **URL** | `POST /api/dataservice/orders/{order_id}/complete` |
| **Method** | POST |
| **Content-Type** | application/json |
#### 路径参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `order_id` | integer | 是 | 数据订单 ID |
#### 请求体参数
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| `processed_by` | string | 否 | "user" | 处理人标识 |
#### 请求示例
```json
{
"processed_by": "张三"
}
```
#### 响应数据
```json
{
"code": 200,
"message": "数据订单已完成",
"data": {
"id": 1,
"order_no": "DO202601090001",
"status": "completed",
"status_label": "已完成",
"result_product_id": 15,
"result_dataflow_id": 156,
"processed_by": "张三",
"processed_at": "2026-01-09T15:00:00",
...
}
}
```
#### 错误响应
**状态不允许完成 (400):**
```json
{
"code": 400,
"message": "订单状态 processing 不允许标记完成,只有 onboard 状态可以标记完成",
"data": null
}
```
#### Vue 接入示例
```javascript
const completeOrder = async (orderId) => {
try {
await ElMessageBox.confirm(
'确定要标记该订单为完成吗?',
'完成确认',
{ type: 'info' }
)
const res = await request.post(`/api/dataservice/orders/${orderId}/complete`, {
processed_by: currentUser.value.name
})
ElMessage.success('订单已完成')
return res.data
} catch (error) {
if (error !== 'cancel') {
ElMessage.error(error.message || '操作失败')
}
}
}
```
---
### 10. 删除订单
删除数据订单记录(软删除)。
#### 请求信息
| 项目 | 说明 |
|------|------|
| **URL** | `PUT /api/dataservice/orders/{order_id}/delete` |
| **Method** | PUT |
| **Content-Type** | - |
#### 路径参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| `order_id` | integer | 是 | 数据订单 ID |
#### 响应数据
```json
{
"code": 200,
"message": "删除数据订单成功",
"data": {}
}
```
#### Vue 接入示例
```javascript
const deleteOrder = async (orderId) => {
try {
await ElMessageBox.confirm(
'确定要删除该订单吗?此操作不可恢复。',
'删除确认',
{ type: 'warning', confirmButtonClass: 'el-button--danger' }
)
await request.put(`/api/dataservice/orders/${orderId}/delete`)
ElMessage.success('删除成功')
} catch (error) {
if (error !== 'cancel') {
ElMessage.error(error.message || '删除失败')
}
}
}
```
---
## API 模块封装
建议将所有数据订单 API 封装到独立模块:
```javascript
// src/api/dataOrder.js
import request from '@/utils/request'
const BASE_URL = '/api/dataservice'
export const dataOrderApi = {
/**
* 获取数据订单列表
*/
getOrders(params) {
return request.get(`${BASE_URL}/orderlist`, { params })
},
/**
* 获取数据订单详情
*/
getOrderDetail(orderId) {
return request.get(`${BASE_URL}/orders/${orderId}/detail`)
},
/**
* 创建数据订单
*/
createOrder(data) {
return request.post(`${BASE_URL}/neworder`, data)
},
/**
* 更新数据订单
*/
updateOrder(orderId, data) {
return request.put(`${BASE_URL}/orders/${orderId}/update`, data)
},
/**
* 分析数据订单
*/
analyzeOrder(orderId) {
return request.post(`${BASE_URL}/orders/${orderId}/analyze`)
},
/**
* 审批通过订单
*/
approveOrder(orderId, processedBy = 'admin') {
return request.post(`${BASE_URL}/orders/${orderId}/approve`, {
processed_by: processedBy
})
},
/**
* 驳回订单
*/
rejectOrder(orderId, reason, processedBy = 'admin') {
return request.post(`${BASE_URL}/orders/${orderId}/reject`, {
reason,
processed_by: processedBy
})
},
/**
* 设置数据产品就绪状态(数据工厂回调)
*/
setOrderOnboard(orderId, options = {}) {
return request.post(`${BASE_URL}/orders/${orderId}/onboard`, {
product_id: options.productId,
dataflow_id: options.dataflowId,
processed_by: options.processedBy || 'n8n-workflow'
})
},
/**
* 完成订单
*/
completeOrder(orderId, processedBy = 'user') {
return request.post(`${BASE_URL}/orders/${orderId}/complete`, {
processed_by: processedBy
})
},
/**
* 删除订单
*/
deleteOrder(orderId) {
return request.put(`${BASE_URL}/orders/${orderId}/delete`)
}
}
export default dataOrderApi
```
---
## 完整页面示例
以下是一个完整的数据订单管理页面示例,包含完整的状态流转操作:
```vue
查询
重置
新建订单
{{ row.status_label }}
-
{{ formatDate(row.created_at) }}
详情
编辑
分析
审批
驳回
完成
删除
```
---
## 常见问题
### Q1: 分析接口超时怎么办?
**A**: 分析接口涉及 LLM 调用,可能需要较长时间。建议:
1. 设置较长的 `timeout`(如 60 秒)
2. 显示 loading 状态给用户
3. 如果持续超时,检查 LLM 服务配置
### Q2: 什么情况下订单会变成 `manual_review`?
**A**: 当分析结果显示 `can_connect: false` 时,表示 LLM 提取的实体在业务领域图谱中无法完全连通,订单会变成 `manual_review` 状态,需要人工修改后重新分析。
### Q3: 审批通过后会发生什么?
**A**: 审批通过后系统会:
1. 自动创建目标 BusinessDomain 节点
2. 自动创建 DataFlow 节点
3. 建立输入 BusinessDomain 与 DataFlow 的 INPUT 关系
4. 建立 DataFlow 与目标 BusinessDomain 的 OUTPUT 关系
5. 订单状态更新为 `processing`
6. 返回生成的资源 ID
### Q4: 什么情况下可以修改订单?
**A**: 只有以下状态的订单可以修改:
- `pending` (待处理)
- `manual_review` (待人工处理)
- `need_supplement` (待补充)
### Q5: `onboard` 状态是如何触发的?
**A**: `onboard` 状态通常由数据工厂(n8n 工作流)在数据流程执行完成后调用 `/orders/{id}/onboard` 接口触发。这表示数据产品已生产完成,可供使用。
### Q6: 订单编号的格式是什么?
**A**: 格式为 `DO` + `YYYYMMDD` + `4位序列号`,例如 `DO202601090001`。每天的序列号从 `0001` 开始递增。
---
## 更新日志
| 版本 | 日期 | 说明 |
|------|------|------|
| 2.1.0 | 2026-01-09 | 接口路径规范化:获取订单详情改为 `/orders/{id}/detail`;更新订单改为 `/orders/{id}/update`;删除订单改为 `PUT /orders/{id}/delete`(软删除) |
| 2.0.0 | 2026-01-09 | 重构订单流程:新增 `pending_approval`、`onboard` 状态;新增更新订单、onboard 回调接口;审批接口新增自动资源生成功能 |
| 1.0.0 | 2024-12-29 | 初始版本,包含完整的数据订单 API 文档 |