# 部署记录状态枚举分析
## 状态使用情况统计
### ✅ 需要保留的状态
| 状态 | 使用场景 | 来源 | 是否终态 | 备注 |
|------|---------|------|---------|------|
| **CREATED** | 1. 创建记录时初始状态
2. 工作流状态转换
3. 统计查询(30分钟内视为运行中)
4. isDeploying 判断 | 工作流状态 CREATED | ❌ | 初始状态,30分钟内视为正在部署 |
| **PENDING_APPROVAL** | 1. 审批任务创建时设置 | 审批事件 | ❌ | 审批阶段专用状态 |
| **RUNNING** | 1. 审批通过时设置
2. 工作流状态转换
3. 统计查询
4. isDeploying 判断 | 工作流状态 RUNNING
审批通过事件 | ❌ | 运行中状态 |
| **SUCCESS** | 1. 工作流状态转换(COMPLETED)
2. 统计查询(成功计数) | 工作流状态 COMPLETED | ✅ | 部署成功 |
| **FAILED** | 1. 工作流状态转换
2. 统计查询(失败计数) | 工作流状态 FAILED | ✅ | 部署失败 |
| **PARTIAL_SUCCESS** | 1. 工作流状态转换(COMPLETED_WITH_ERRORS)
2. 统计查询(失败计数) | 工作流状态 COMPLETED_WITH_ERRORS | ✅ | 部分成功(存在失败节点) |
| **CANCELLED** | 1. 审批被拒绝时设置
2. 统计查询(失败计数) | 审批拒绝事件 | ✅ | 已取消(审批被拒) |
| **TERMINATED** | 1. 工作流状态转换
2. 统计查询(失败计数) | 工作流状态 TERMINATED | ✅ | 已终止(手动终止) |
### ❓ 可能不需要的状态
| 状态 | 使用场景 | 来源 | 是否终态 | 问题分析 |
|------|---------|------|---------|---------|
| **SUSPENDED** | 1. 工作流状态转换(但实际未使用) | 工作流状态 SUSPENDED | ❌ | **问题**:
1. ❌ 未在 `isFinalState()` 中(不是终态)
2. ❌ 未在统计查询中使用
3. ❌ 未在 `isDeploying` 判断中使用
4. ❌ 部署场景中可能不需要暂停功能
5. ✅ 工作流层面支持,但部署业务中无用 |
## 详细分析
### SUSPENDED 状态分析
#### 当前实现
- ✅ 在 `fromWorkflowStatus()` 中支持转换:`SUSPENDED -> SUSPENDED`
- ✅ 工作流层面支持:`ProcessEventHandler` 会处理 `PROCESS_SUSPENDED` 事件
#### 未使用的地方
1. **未在 `isFinalState()` 中**:说明它不是终态,可以恢复
2. **未在统计查询中使用**:部署统计不关心暂停状态
3. **未在 `isDeploying` 判断中使用**:暂停状态不视为正在部署
4. **实际业务场景**:部署流程一般不需要暂停功能
#### 建议
**可以考虑移除 SUSPENDED 状态**,原因:
1. 部署是一次性操作,不需要暂停/恢复功能
2. 如果需要停止部署,应该使用 `TERMINATED` 或 `CANCELLED`
3. 暂停功能更适合长流程(如审批流程),不适合部署
### 保留 SUSPENDED 的理由(如果保留)
1. 未来可能支持部署暂停功能
2. 保持与工作流状态枚举的一致性
3. 如果移除,需要在 `fromWorkflowStatus()` 中处理 `SUSPENDED` 状态(可能转换为 `RUNNING` 或其他状态)
## 推荐方案
### 方案A:移除 SUSPENDED(推荐)
**优点**:
- 简化状态模型
- 符合实际业务需求
- 减少不必要的状态转换
**需要修改**:
1. 从枚举中移除 `SUSPENDED`
2. 修改 `fromWorkflowStatus()`,将 `SUSPENDED` 转换为其他状态(如 `RUNNING` 或 `FAILED`)
3. 更新文档
### 方案B:保留 SUSPENDED(保守)
**优点**:
- 保持与工作流状态一致
- 为未来扩展预留空间
**需要完善**:
1. 在 `isFinalState()` 中明确处理(虽然不是终态,但需要明确逻辑)
2. 在统计查询中明确如何处理(计入哪个分类)
3. 在 `isDeploying` 判断中明确处理
## 结论
**推荐移除 `SUSPENDED` 状态**,因为:
1. 部署业务不需要暂停功能
2. 当前完全未使用
3. 简化状态模型,减少维护成本
如果未来需要暂停功能,可以再添加回来。