forked from erp-dev/erp
391 lines
6.1 KiB
Markdown
391 lines
6.1 KiB
Markdown
# Stateflow API 文档
|
||
|
||
## 概述
|
||
|
||
Stateflow API 提供了状态节点和流程的 CRUD 操作接口。
|
||
|
||
## 基础 URL
|
||
|
||
```
|
||
/api/v1/
|
||
```
|
||
|
||
## 认证
|
||
|
||
所有 API 都需要 JWT 认证。在请求头中添加:
|
||
|
||
```
|
||
Authorization: Bearer <access_token>
|
||
```
|
||
|
||
## 分页
|
||
|
||
使用 LimitOffset 分页:
|
||
|
||
- `limit`: 返回结果数量(默认无限制)
|
||
- `offset`: 偏移量(默认0)
|
||
|
||
示例:
|
||
```
|
||
GET /api/v1/states/?limit=10&offset=0
|
||
```
|
||
|
||
响应格式:
|
||
```json
|
||
{
|
||
"count": 100,
|
||
"next": "http://example.com/api/v1/states/?limit=10&offset=10",
|
||
"previous": null,
|
||
"results": [...]
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## State API (状态节点)
|
||
|
||
### 1. 列表查询
|
||
|
||
**GET** `/api/v1/states/`
|
||
|
||
查询参数:
|
||
- `limit`: 分页限制
|
||
- `offset`: 分页偏移
|
||
- `name`: 按名称精确查询
|
||
- `search`: 全文搜索(名称和描述)
|
||
- `ordering`: 排序字段(id, name, created_at, updated_at)
|
||
|
||
示例:
|
||
```bash
|
||
curl -X GET "http://localhost:8000/api/v1/states/?search=审核&limit=10&offset=0" \
|
||
-H "Authorization: Bearer <token>"
|
||
```
|
||
|
||
响应:
|
||
```json
|
||
{
|
||
"count": 1,
|
||
"next": null,
|
||
"previous": null,
|
||
"results": [
|
||
{
|
||
"id": 1,
|
||
"name": "待审核",
|
||
"description": "等待审核",
|
||
"created_at": "2025-01-01T00:00:00Z",
|
||
"updated_at": "2025-01-01T00:00:00Z"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### 2. 详情查询
|
||
|
||
**GET** `/api/v1/states/{id}/`
|
||
|
||
响应:
|
||
```json
|
||
{
|
||
"id": 1,
|
||
"name": "待审核",
|
||
"description": "等待审核",
|
||
"parameters": [
|
||
{
|
||
"id": 1,
|
||
"key": "timeout",
|
||
"value": "24h",
|
||
"description": "超时时间"
|
||
}
|
||
],
|
||
"created_at": "2025-01-01T00:00:00Z",
|
||
"updated_at": "2025-01-01T00:00:00Z"
|
||
}
|
||
```
|
||
|
||
### 3. 创建状态
|
||
|
||
**POST** `/api/v1/states/`
|
||
|
||
请求体:
|
||
```json
|
||
{
|
||
"name": "待审核",
|
||
"description": "等待审核",
|
||
"parameters": [
|
||
{
|
||
"key": "timeout",
|
||
"value": "24h",
|
||
"description": "超时时间"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
响应:`201 Created`
|
||
```json
|
||
{
|
||
"name": "待审核",
|
||
"description": "等待审核",
|
||
"parameters": [...]
|
||
}
|
||
```
|
||
|
||
### 4. 更新状态
|
||
|
||
**PUT** `/api/v1/states/{id}/`
|
||
|
||
请求体:
|
||
```json
|
||
{
|
||
"name": "已审核",
|
||
"description": "审核通过",
|
||
"parameters": [
|
||
{
|
||
"key": "approver",
|
||
"value": "admin",
|
||
"description": "审核人"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
注意:`parameters` 数组会完全替换原有参数。
|
||
|
||
**PATCH** `/api/v1/states/{id}/`
|
||
|
||
部分更新,可以只更新某些字段:
|
||
```json
|
||
{
|
||
"description": "新的描述"
|
||
}
|
||
```
|
||
|
||
### 5. 删除状态
|
||
|
||
**DELETE** `/api/v1/states/{id}/`
|
||
|
||
响应:`204 No Content`
|
||
|
||
---
|
||
|
||
## Process API (流程)
|
||
|
||
### 1. 列表查询
|
||
|
||
**GET** `/api/v1/processes/`
|
||
|
||
查询参数:
|
||
- `limit`: 分页限制
|
||
- `offset`: 分页偏移
|
||
- `name`: 按名称精确查询
|
||
- `search`: 全文搜索(名称和描述)
|
||
- `ordering`: 排序字段(id, name, node_count, created_at, updated_at)
|
||
|
||
响应:
|
||
```json
|
||
{
|
||
"count": 2,
|
||
"next": null,
|
||
"previous": null,
|
||
"results": [
|
||
{
|
||
"id": 1,
|
||
"name": "订单流程",
|
||
"description": "标准订单处理流程",
|
||
"node_count": 3,
|
||
"created_at": "2025-01-01T00:00:00Z",
|
||
"updated_at": "2025-01-01T00:00:00Z"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### 2. 详情查询
|
||
|
||
**GET** `/api/v1/processes/{id}/`
|
||
|
||
响应:
|
||
```json
|
||
{
|
||
"id": 1,
|
||
"name": "订单流程",
|
||
"description": "标准订单处理流程",
|
||
"nodes": [
|
||
{
|
||
"id": 1,
|
||
"state_id": 1,
|
||
"state_name": "待审核",
|
||
"order": 0
|
||
},
|
||
{
|
||
"id": 2,
|
||
"state_id": 2,
|
||
"state_name": "已审核",
|
||
"order": 1
|
||
},
|
||
{
|
||
"id": 3,
|
||
"state_id": 3,
|
||
"state_name": "已发货",
|
||
"order": 2
|
||
}
|
||
],
|
||
"created_at": "2025-01-01T00:00:00Z",
|
||
"updated_at": "2025-01-01T00:00:00Z"
|
||
}
|
||
```
|
||
|
||
### 3. 创建流程
|
||
|
||
**POST** `/api/v1/processes/`
|
||
|
||
请求体:
|
||
```json
|
||
{
|
||
"name": "订单流程",
|
||
"description": "标准订单处理流程",
|
||
"nodes": [
|
||
{
|
||
"state_id": 1,
|
||
"order": 0
|
||
},
|
||
{
|
||
"state_id": 2,
|
||
"order": 1
|
||
},
|
||
{
|
||
"state_id": 3,
|
||
"order": 2
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
响应:`201 Created`
|
||
|
||
### 4. 更新流程
|
||
|
||
**PUT** `/api/v1/processes/{id}/`
|
||
|
||
请求体:
|
||
```json
|
||
{
|
||
"name": "更新后的流程",
|
||
"description": "新的描述",
|
||
"nodes": [
|
||
{
|
||
"state_id": 2,
|
||
"order": 0
|
||
},
|
||
{
|
||
"state_id": 3,
|
||
"order": 1
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
注意:`nodes` 数组会完全替换原有节点。
|
||
|
||
**PATCH** `/api/v1/processes/{id}/`
|
||
|
||
部分更新。
|
||
|
||
### 5. 删除流程
|
||
|
||
**DELETE** `/api/v1/processes/{id}/`
|
||
|
||
响应:`204 No Content`
|
||
|
||
---
|
||
|
||
## 错误响应
|
||
|
||
所有 API 遵循统一的错误响应格式:
|
||
|
||
```json
|
||
{
|
||
"detail": "错误描述"
|
||
}
|
||
```
|
||
|
||
或字段级错误:
|
||
|
||
```json
|
||
{
|
||
"name": ["该字段不能为空"],
|
||
"nodes": [
|
||
{
|
||
"state_id": ["状态ID 999 不存在"]
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
常见状态码:
|
||
- `200 OK`: 成功
|
||
- `201 Created`: 创建成功
|
||
- `204 No Content`: 删除成功
|
||
- `400 Bad Request`: 请求参数错误
|
||
- `401 Unauthorized`: 未认证
|
||
- `403 Forbidden`: 无权限
|
||
- `404 Not Found`: 资源不存在
|
||
- `500 Internal Server Error`: 服务器错误
|
||
|
||
## 示例代码
|
||
|
||
### Python (requests)
|
||
|
||
```python
|
||
import requests
|
||
|
||
# 获取 token
|
||
response = requests.post('http://localhost:8000/api/token/', {
|
||
'username': 'admin',
|
||
'password': 'password'
|
||
})
|
||
token = response.json()['access']
|
||
|
||
# 创建状态
|
||
headers = {'Authorization': f'Bearer {token}'}
|
||
response = requests.post(
|
||
'http://localhost:8000/api/v1/states/',
|
||
json={
|
||
'name': '待审核',
|
||
'description': '等待审核'
|
||
},
|
||
headers=headers
|
||
)
|
||
state = response.json()
|
||
```
|
||
|
||
### JavaScript (fetch)
|
||
|
||
```javascript
|
||
// 获取状态列表
|
||
const response = await fetch('/api/v1/states/?limit=10&offset=0', {
|
||
headers: {
|
||
'Authorization': `Bearer ${token}`
|
||
}
|
||
});
|
||
const data = await response.json();
|
||
console.log(data.results);
|
||
```
|
||
|
||
### curl
|
||
|
||
```bash
|
||
# 创建流程
|
||
curl -X POST "http://localhost:8000/api/v1/processes/" \
|
||
-H "Authorization: Bearer <token>" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"name": "订单流程",
|
||
"description": "标准订单处理流程",
|
||
"nodes": [
|
||
{"state_id": 1, "order": 0},
|
||
{"state_id": 2, "order": 1}
|
||
]
|
||
}'
|
||
```
|