# Stateflow 业务对象 API 文档

## 概述

业务对象（BusinessObject）是流程的实例，支持状态流转、参数管理和进度控制。

**基础路径**: `/api/v1/stateflow/business-objects/`

---

## 1. 查询下一步节点（可选带参数）

### 获取下一个待执行节点

**接口**: `GET /api/v1/stateflow/business-objects/{id}/next_pending_state/`

**描述**: 获取业务对象的下一个待执行状态节点，默认包含该状态的参数定义列表。

**查询参数**:
- `include_parameters` (可选): 是否包含参数列表，默认 `true`
  - `true`: 返回参数定义列表
  - `false`: 只返回状态信息

**成功响应** (200):
```json
{
  "state": {
    "id": 5,
    "name": "质量检验",
    "description": "对产品进行质量检查"
  },
  "order": 3,
  "parameters": [
    {
      "id": 1,
      "name": "temperature",
      "display_name": "温度",
      "is_required": true,
      "is_image_path": false
    },
    {
      "id": 2,
      "name": "humidity",
      "display_name": "湿度",
      "is_required": false,
      "is_image_path": false
    }
  ]
}
```

**无待执行节点** (200):
```json
{
  "next_state": null,
  "message": "没有待执行节点（未开始或已完成）"
}
```

**示例**:
```bash
# 获取下一个节点及参数
GET /api/v1/stateflow/business-objects/123/next_pending_state/

# 只获取下一个节点，不要参数
GET /api/v1/stateflow/business-objects/123/next_pending_state/?include_parameters=false
```

---

## 2. 查询已存在的参数（可选仅包括必填）

### 2.1 获取当前状态的参数定义

**接口**: `GET /api/v1/stateflow/business-objects/{id}/current_state_parameters/`

**描述**: 获取当前状态（最后完成的状态）的参数定义列表。

**查询参数**:
- `required_only` (可选): 是否只返回必填参数，默认 `false`
  - `true`: 只返回必填参数
  - `false`: 返回所有参数

**成功响应** (200):
```json
{
  "state": {
    "id": 4,
    "name": "生产加工",
    "description": "进行生产加工"
  },
  "parameters": [
    {
      "id": 3,
      "name": "machine_number",
      "display_name": "机器编号",
      "is_required": true,
      "is_image_path": false
    },
    {
      "id": 4,
      "name": "operator",
      "display_name": "操作员",
      "is_required": true,
      "is_image_path": false
    }
  ],
  "count": 2
}
```

**未完成任何状态** (200):
```json
{
  "parameters": [],
  "message": "尚未完成任何状态"
}
```

**示例**:
```bash
# 获取当前状态的所有参数定义
GET /api/v1/stateflow/business-objects/123/current_state_parameters/

# 只获取必填参数
GET /api/v1/stateflow/business-objects/123/current_state_parameters/?required_only=true
```

### 2.2 获取状态记录的实际参数值

**接口**: `GET /api/v1/stateflow/business-objects/{id}/state-logs/{log_id}/parameters/`

**描述**: 获取指定状态流转记录的实际参数值（用户填写的数据）。

**查询参数**:
- `key` (可选): 指定参数键，返回该参数的历史记录
- `include_cancelled` (可选): 是否包含已撤销状态的参数，默认 `false`

**成功响应 - 所有参数** (200):
```json
{
  "state_log_id": 456,
  "is_cancelled": false,
  "count": 2,
  "summary": {
    "temperature": "25.5",
    "humidity": "60%",
    "operator": "张三"
  },
  "records": [
    {
      "id": 1,
      "state_log": 456,
      "parameters": {
        "temperature": "25.5",
        "humidity": "60%"
      },
      "remark": "",
      "created_at": "2025-11-15T10:30:00Z",
      "created_by": 1
    },
    {
      "id": 2,
      "state_log": 456,
      "parameters": {
        "operator": "张三"
      },
      "remark": "补充操作员信息",
      "created_at": "2025-11-15T11:00:00Z",
      "created_by": 2
    }
  ]
}
```

**成功响应 - 指定参数历史** (200):
```json
{
  "state_log_id": 456,
  "key": "temperature",
  "is_cancelled": false,
  "history": [
    {
      "value": "25.5",
      "created_at": "2025-11-15T10:30:00Z",
      "created_by": 1,
      "remark": ""
    }
  ]
}
```

**状态记录不存在** (404):
```json
{
  "success": false,
  "message": "状态流转记录不存在"
}
```

**示例**:
```bash
# 获取状态记录的所有参数
GET /api/v1/stateflow/business-objects/123/state-logs/456/parameters/

# 获取特定参数的历史
GET /api/v1/stateflow/business-objects/123/state-logs/456/parameters/?key=temperature

# 包含已撤销状态的参数
GET /api/v1/stateflow/business-objects/123/state-logs/456/parameters/?include_cancelled=true
```

---

## 3. 推进到下一步（校验必填参数）

**接口**: `POST /api/v1/stateflow/business-objects/{id}/advance/`

**描述**: 推进业务对象到下一个状态，自动校验必填参数。

**请求体**:
```json
{
  "parameters": {
    "temperature": "25.5",
    "humidity": "60%",
    "operator": "张三"
  }
}
```

**参数说明**:
- `parameters` (可选): 参数字典
  - 如果下一个状态有必填参数，则必须提供所有必填参数
  - 可以包含可选参数
  - 参数值以字符串形式存储

**成功响应** (200):
```json
{
  "success": true,
  "message": "已推进到状态: 质量检验",
  "state_log": {
    "id": 456,
    "state": {
      "id": 5,
      "name": "质量检验"
    },
    "completed_at": "2025-11-15T10:30:00Z",
    "completed_by": {
      "id": 1,
      "username": "zhangsan"
    },
    "is_cancelled": false,
    "parameters_summary": {
      "temperature": "25.5",
      "humidity": "60%"
    }
  },
  "business_object": {
    "id": 123,
    "name": "订单-001",
    "process": {...},
    "overall_status": "in_progress",
    "current_state": {...}
  }
}
```

**校验失败 - 缺少必填参数** (400):
```json
{
  "success": false,
  "message": "缺少必填参数: temperature, operator"
}
```

**其他失败情况** (400):
```json
{
  "success": false,
  "message": "已经完成所有状态"
}
```

**示例**:
```bash
# 推进到下一状态（带参数）
curl -X POST /api/v1/stateflow/business-objects/123/advance/ \
  -H "Content-Type: application/json" \
  -d '{"parameters": {"temperature": "25.5", "humidity": "60%"}}'

# 推进到下一状态（无参数）
curl -X POST /api/v1/stateflow/business-objects/123/advance/ \
  -H "Content-Type: application/json" \
  -d '{}'
```

---

## 4. 回退

**接口**: `POST /api/v1/stateflow/business-objects/{id}/step_back/`

**描述**: 回退一步，撤销最后一次完成的状态（标记为已撤销，不删除记录）。

**请求体**: 无需请求体

**成功响应** (200):
```json
{
  "success": true,
  "message": "已回退到状态: 生产加工",
  "business_object": {
    "id": 123,
    "name": "订单-001",
    "process": {...},
    "overall_status": "in_progress",
    "current_state": {...}
  }
}
```

**失败响应** (400):
```json
{
  "success": false,
  "message": "没有可回退的状态"
}
```

**示例**:
```bash
curl -X POST /api/v1/stateflow/business-objects/123/step_back/
```

---

## 5. 针对已完成的状态节点添加新的参数集

**接口**: `POST /api/v1/stateflow/business-objects/{id}/state-logs/{log_id}/add-parameters/`

**描述**: 为已完成的状态流转记录补充参数（追加新的参数记录）。

**请求体**:
```json
{
  "parameters": {
    "additional_note": "发现轻微瑕疵",
    "inspector": "李四"
  },
  "remark": "质检员补充信息"
}
```

**参数说明**:
- `parameters` (必填): 参数字典，不能为空
- `remark` (可选): 备注说明

**成功响应** (200):
```json
{
  "success": true,
  "parameter_record": {
    "id": 789,
    "state_log": 456,
    "parameters": {
      "additional_note": "发现轻微瑕疵",
      "inspector": "李四"
    },
    "remark": "质检员补充信息",
    "created_at": "2025-11-15T14:30:00Z",
    "created_by": 2
  }
}
```

**失败响应 - 状态记录不存在** (404):
```json
{
  "success": false,
  "message": "状态流转记录不存在"
}
```

**失败响应 - 参数为空** (400):
```json
{
  "success": false,
  "message": "参数不能为空"
}
```

**示例**:
```bash
curl -X POST /api/v1/stateflow/business-objects/123/state-logs/456/add-parameters/ \
  -H "Content-Type: application/json" \
  -d '{
    "parameters": {
      "additional_note": "发现轻微瑕疵",
      "inspector": "李四"
    },
    "remark": "质检员补充信息"
  }'
```

---

## 6. 其他相关接口

### 6.1 获取状态时间线

**接口**: `GET /api/v1/stateflow/business-objects/{id}/timeline/`

**描述**: 获取业务对象的完整状态时间线。

**成功响应** (200):
```json
[
  {
    "state": {
      "id": 1,
      "name": "接单"
    },
    "status": "completed",
    "order": 1,
    "completed_at": "2025-11-15T09:00:00Z",
    "completed_by": "zhangsan",
    "cancelled_at": null,
    "is_cancelled": false
  },
  {
    "state": {
      "id": 2,
      "name": "生产加工"
    },
    "status": "completed",
    "order": 2,
    "completed_at": "2025-11-15T10:00:00Z",
    "completed_by": "lisi",
    "cancelled_at": null,
    "is_cancelled": false
  },
  {
    "state": {
      "id": 3,
      "name": "质量检验"
    },
    "status": "pending",
    "order": 3,
    "completed_at": null,
    "completed_by": null,
    "cancelled_at": null,
    "is_cancelled": false
  }
]
```

### 6.2 获取所有待执行节点

**接口**: `GET /api/v1/stateflow/business-objects/{id}/pending_states/`

**描述**: 获取所有待执行的状态节点列表（不包含参数）。

**成功响应** (200):
```json
{
  "count": 2,
  "pending_states": [
    {
      "state": {
        "id": 3,
        "name": "质量检验"
      },
      "order": 3
    },
    {
      "state": {
        "id": 4,
        "name": "打包发货"
      },
      "order": 4
    }
  ]
}
```

### 6.3 重置进度

**接口**: `POST /api/v1/stateflow/business-objects/{id}/reset/`

**描述**: 重置业务对象的进度（删除所有状态记录）。

**成功响应** (200):
```json
{
  "success": true,
  "message": "进度已重置",
  "business_object": {...}
}
```

---

## 完整性检查清单

根据您的需求，所有接口都已齐全：

- ✅ **查询下一步节点（可选带参数）**: `GET next_pending_state/` (支持 `include_parameters` 参数)
- ✅ **查询已存在的参数（可选仅包括必填）**: 
  - `GET current_state_parameters/` (支持 `required_only` 参数) - 参数定义
  - `GET state-logs/{log_id}/parameters/` - 实际参数值
- ✅ **回退**: `POST step_back/`
- ✅ **推进到下一步（校验必填参数）**: `POST advance/` (自动校验必填参数)
- ✅ **针对已完成的状态节点添加新的参数集**: `POST state-logs/{log_id}/add-parameters/`

---

## 典型使用流程

### 场景 1: 推进到下一状态

```bash
# 1. 查询下一个待执行节点及参数要求
GET /api/v1/stateflow/business-objects/123/next_pending_state/

# 响应显示需要 temperature (必填) 和 humidity (可选)

# 2. 推进到下一状态（提供必填参数）
POST /api/v1/stateflow/business-objects/123/advance/
{
  "parameters": {
    "temperature": "25.5",
    "humidity": "60%"
  }
}
```

### 场景 2: 补充参数

```bash
# 1. 从时间线获取已完成状态的 state_log_id
GET /api/v1/stateflow/business-objects/123/timeline/

# 2. 为指定状态记录补充参数
POST /api/v1/stateflow/business-objects/123/state-logs/456/add-parameters/
{
  "parameters": {
    "inspector": "李四",
    "note": "补充检验员信息"
  },
  "remark": "质检后补充"
}
```

### 场景 3: 查询参数

```bash
# 1. 查询当前状态的必填参数定义
GET /api/v1/stateflow/business-objects/123/current_state_parameters/?required_only=true

# 2. 查询某个状态记录的实际参数值
GET /api/v1/stateflow/business-objects/123/state-logs/456/parameters/

# 3. 查询某个参数的修改历史
GET /api/v1/stateflow/business-objects/123/state-logs/456/parameters/?key=temperature
```

---

## 重要说明

1. **参数存储**: 所有参数值以字符串形式存储在 JSONField 中，支持灵活的数据结构
2. **参数校验**: 仅校验必填参数是否提供，不校验参数值的格式或类型
3. **撤销状态**: 回退操作不删除记录，而是标记为已撤销（`is_cancelled=True`）
4. **参数可见性**: 默认情况下，已撤销状态的参数不会返回，需要显式传递 `include_cancelled=true`
5. **参数追加**: 可以多次为同一个状态记录添加参数，所有记录都会保留
6. **参数历史**: 支持查询单个参数的修改历史，按时间顺序返回

---

**文档版本**: 2025-11-15  
**测试覆盖**: 55 个测试用例全部通过
