# Printing 模块 API 清理记录

**日期**: 2025年11月15日  
**目的**: 删除 printing 模块中冗余的状态流转接口，统一使用 stateflow 的业务对象接口

---

## 删除的接口

### 1. PrintingJobViewSet (印染任务)

#### 删除的方法：

**1.1 `advance_to_next_state()` 方法**
- **路径**: `POST /api/v1/printing-jobs/{id}/advance-to-next-state/`
- **原位置**: `api_v1/views/printing/views.py` 约第 309-342 行
- **删除原因**: 
  - 功能与 stateflow 统一接口重复
  - 不支持参数传递
  - 调用签名过时（只接收2个返回值，实际返回3个）

**1.2 `step_back_one_state()` 方法**
- **路径**: `POST /api/v1/printing-jobs/{id}/step-back-one-state/`
- **原位置**: `api_v1/views/printing/views.py` 约第 345-380 行
- **删除原因**: 与 stateflow 统一接口重复

---

### 2. PlateOrderViewSet (开版订单)

#### 删除的方法：

**2.1 `advance_to_next_state()` 方法**
- **路径**: `POST /api/v1/plate-orders/{id}/advance-to-next-state/`
- **原位置**: `api_v1/views/printing/views.py` 约第 656-690 行
- **删除原因**: 
  - 功能与 stateflow 统一接口重复
  - 不支持参数传递
  - 调用签名过时（只接收2个返回值，实际返回3个）

**2.2 `step_back_one_state()` 方法**
- **路径**: `POST /api/v1/plate-orders/{id}/step-back-one-state/`
- **原位置**: `api_v1/views/printing/views.py` 约第 693-728 行
- **删除原因**: 与 stateflow 统一接口重复

---

## 保留的接口

### PrintingJobViewSet 保留：
- ✅ `GET /api/v1/printing-jobs/{id}/completed-states/` - 查询已完成的流程列表（便捷方法）

### PlateOrderViewSet 保留：
- ✅ `GET /api/v1/plate-orders/{id}/completed-states/` - 查询已完成的流程列表（便捷方法）

---

## 迁移指南

### 旧接口 → 新接口映射

#### 推进到下一状态

**旧方式（已废弃）**:
```bash
POST /api/v1/printing-jobs/123/advance-to-next-state/
# 或
POST /api/v1/plate-orders/456/advance-to-next-state/
```

**新方式（推荐）**:
```bash
# 1. 先获取 business_object_id
GET /api/v1/printing-jobs/123/
# 或
GET /api/v1/plate-orders/456/

# 响应中包含 business_object_id 或 business_object.id

# 2. 调用 stateflow 统一接口（支持参数传递）
POST /api/v1/stateflow/business-objects/{business_object_id}/advance/
{
  "parameters": {
    "temperature": "25.5",
    "humidity": "60%",
    "operator": "张三"
  }
}
```

#### 回退一步

**旧方式（已废弃）**:
```bash
POST /api/v1/printing-jobs/123/step-back-one-state/
# 或
POST /api/v1/plate-orders/456/step-back-one-state/
```

**新方式（推荐）**:
```bash
POST /api/v1/stateflow/business-objects/{business_object_id}/step_back/
```

---

## 新接口的优势

### 1. 支持参数管理
- ✅ 推进时可传递参数
- ✅ 自动校验必填参数
- ✅ 支持参数历史记录
- ✅ 支持补充参数

### 2. 统一的接口设计
- ✅ 所有业务对象使用相同接口
- ✅ 统一的错误处理
- ✅ 统一的响应格式

### 3. 更强大的功能
- ✅ 查询下一个待执行节点及参数要求
- ✅ 查询状态时间线
- ✅ 查询参数历史
- ✅ 重置进度

---

## 完整的 stateflow 接口列表

### 状态流转控制
- `POST /api/v1/stateflow/business-objects/{id}/advance/` - 推进（支持参数）
- `POST /api/v1/stateflow/business-objects/{id}/step_back/` - 回退
- `POST /api/v1/stateflow/business-objects/{id}/reset/` - 重置进度

### 状态查询
- `GET /api/v1/stateflow/business-objects/{id}/timeline/` - 状态时间线
- `GET /api/v1/stateflow/business-objects/{id}/next_pending_state/` - 下一个待执行节点
- `GET /api/v1/stateflow/business-objects/{id}/pending_states/` - 所有待执行节点
- `GET /api/v1/stateflow/business-objects/{id}/current_state_parameters/` - 当前状态参数

### 参数管理
- `POST /api/v1/stateflow/business-objects/{id}/state-logs/{log_id}/add-parameters/` - 补充参数
- `GET /api/v1/stateflow/business-objects/{id}/state-logs/{log_id}/parameters/` - 查询参数

详见: `stateflow/BusinessObject_API.md`

---

## 模型层修改

**无需修改**

- ✅ `PlateOrder.business_object` 字段保留
- ✅ `PrintingJob.business_object` 字段保留
- ✅ `PlateOrder.status` 属性保留（便捷访问器）
- ✅ `PrintingJob.status` 属性保留（便捷访问器）
- ✅ `PlateOrder.is_completed` 属性保留
- ✅ `PrintingJob.is_completed` 属性保留
- ✅ `PlateOrder.has_started` 属性保留
- ✅ `PrintingJob.has_started` 属性保留

这些模型方法和属性设计正确，无需调整。

---

## 识别的问题（已修复）

### 问题 1: 调用签名不匹配 ❌
**位置**: 
- `api_v1/views/printing/views.py` 第 325、672 行
- `api_v1/views/printing/views.py` 第 360、708 行

**问题代码**:
```python
# ❌ 错误：只接收 2 个返回值
success, message = stateflow_services.advance_to_next_state(
    job.business_object, request.user
)
```

**实际签名**:
```python
# ✅ 正确：返回 3 个值
def advance_to_next_state(...) -> Tuple[bool, str, Optional['models.StateFlowRecord']]:
    return success, message, state_log
```

**解决方案**: 删除这些接口，使用 stateflow 统一接口 ✅

### 问题 2: 缺少参数支持 ❌
- printing 模块的接口不接受 parameters
- 无法传递状态参数
- 不支持必填参数校验

**解决方案**: 使用 stateflow 统一接口（完整支持参数管理）✅

---

## 测试状态

- ❌ printing 模块测试失败（与本次修改无关）
  - 原因: PlateOrder 模型缺少 `plate_code` 字段
  - 建议: 修复 PlateOrder 模型定义或测试用例
  
- ✅ stateflow 模块测试全部通过（55个测试）

---

## 后续建议

### 1. 更新前端代码
- 将所有调用 printing-jobs/advance 的代码改为调用 stateflow API
- 将所有调用 plate-orders/advance 的代码改为调用 stateflow API

### 2. 文档更新
- ✅ 已创建 `stateflow/BusinessObject_API.md`
- 建议: 在 printing 模块文档中添加迁移说明

### 3. 修复 printing 测试
- PlateOrder 模型缺少 `plate_code` 字段定义
- 或者测试用例使用了错误的字段名

### 4. 考虑添加废弃警告（可选）
如果需要渐进式迁移，可以暂时保留旧接口但返回废弃警告：
```python
@action(detail=True, methods=['post'])
def advance_to_next_state(self, request, pk=None):
    return Response({
        'error': 'This endpoint is deprecated. Please use /api/v1/stateflow/business-objects/{id}/advance/'
    }, status=status.HTTP_410_GONE)
```

---

## 影响范围

### 代码变更
- ✅ 删除 4 个 API 方法
- ✅ 文件行数减少约 138 行
- ✅ 无破坏性变更（只要前端同步更新）

### API 变更
- ❌ **破坏性变更**: 删除了 4 个 API 端点
- ✅ 替代方案: stateflow 统一接口功能更强

### 数据库变更
- ✅ 无需数据库迁移
- ✅ 无数据丢失风险

---

**变更完成时间**: 2025-11-15  
**执行人**: AI Assistant  
**审核状态**: 待人工审核
