# 生命周期与工单状态映射

> DDS-Section: 3.3-3.6 生命周期与工单状态映射 + 状态同步机制设计
> DDS-Lines: L108-L296

## 工单事件映射表

| 工单事件 | 工单目标状态 | 项目生命周期状态 | 说明 |
|:---|:---|:---|:---|
| create | created | INIT→DRAFTING | 创建填写工单 |
| draft_save | in_progress | DRAFTING/MODIFYING(保持) | 保存草稿 |
| complete | pending_review | REVIEWING | 提交审核 |
| resubmit | pending_review | REVIEWING | 被打回后重新提交 |
| return | returned | DRAFTING | 审核人打回 |
| approve | approved→closed | RELEASED | 审核人通过 |

## 状态同步机制设计

### 设计原则

项目模块与工单模块之间需要双向协作：
1. **项目 → 工单**：项目模块调用工单模块创建/转换工单
2. **工单 → 项目**：工单状态变更后同步更新项目生命周期状态

当前系统采用 **"模块化单体"架构**，采用 **接口注入（依赖注入）** 方式实现模块间回调。

### 接口定义

**项目模块调用工单模块的接口**：

```go
// WorkflowTransitioner 工单状态转换接口
type WorkflowTransitioner interface {
    // TransitionWorkflow 触发工单状态转换
    // @param workflowID string - 工单ID
    // @param event string - 事件类型 (complete/submit/resubmit等)
    // @param operatorID uint64 - 操作人ID
    // @param operatorName string - 操作人姓名
    // @param remark string - 操作备注
    // @return newStatus string - 工单新状态
    TransitionWorkflow(workflowID, event string, operatorID uint64, 
                       operatorName string, remark string) (newStatus string, err error)
}
```

**工单模块回调项目模块的接口**：

```go
// ProjectLifecycleUpdater 项目生命周期状态更新接口
type ProjectLifecycleUpdater interface {
    UpdateLifecycleStatus(projectID, lifecycleStatus string) error
    SetLifecycleToDrafting(projectID string) error
    SetLifecycleToReviewing(projectID string) error
    SetLifecycleToReleased(projectID string) error
    SetLifecycleToModifying(projectID string) error
}
```

## 填写工单 (project_detail) 映射

| 工单事件 | 工单From状态 | 工单To状态 | 项目生命周期状态 | 说明 |
|:---|:---|:---|:---|:---|
| `create` | - | `created` | `INIT→DRAFTING` | 创建填写工单 |
| `accept` | `assigned` | `in_progress` | `DRAFTING` (保持) | 填写人开始填写 |
| `draft_save` | `in_progress` | `in_progress` | `DRAFTING` (保持) | 保存草稿 |
| `submit/complete` | `in_progress` | `pending_review` | `REVIEWING` | 提交审核 |
| `return` | `pending_review` | `returned` | `DRAFTING` | 审核人打回 |
| `resubmit` | `returned` | `pending_review` | `REVIEWING` | 重新提交 |
| `approve` | `pending_review` | `approved` | `RELEASED` | 审核通过 |
| `revoke` | any | `revoked` | `INIT` | 撤销工单 |

## 修改工单 (project_modify) 映射

| 工单事件 | 工单From状态 | 工单To状态 | 项目生命周期状态 | 说明 |
|:---|:---|:---|:---|:---|
| `create` | - | `created` | `RELEASED→MODIFYING` | 发起修改工单 |
| `accept` | `assigned` | `in_progress` | `MODIFYING` (保持) | 开始修改 |
| `draft_save` | `in_progress` | `in_progress` | `MODIFYING` (保持) | 保存草稿 |
| `submit/complete` | `in_progress` | `pending_review` | `REVIEWING` | 提交审核 |
| `return` | `pending_review` | `returned` | `MODIFYING` | 审核人打回 |
| `resubmit` | `returned` | `pending_review` | `REVIEWING` | 重新提交 |
| `approve` | `pending_review` | `approved` | `RELEASED` | 审核通过 |
| `revoke` | any | `revoked` | `RELEASED` | 撤销工单 |

## 回调处理实现

```go
// 工单模块 - 状态转换后触发项目状态更新
func (s *WorkflowService) handleProjectLifecycleCallback(workflow *entity.Workflow, event string) {
    projectID, ok := workflow.BusinessPayload["project_id"].(string)
    if !ok || projectID == "" {
        return
    }
    
    if s.projectLifecycleUpdater != nil {
        switch event {
        case entity.EventApprove:
            s.projectLifecycleUpdater.SetLifecycleToReleased(projectID)
        case entity.EventReturn:
            s.projectLifecycleUpdater.SetLifecycleToDrafting(projectID)
        case entity.EventComplete, entity.EventResubmit:
            s.projectLifecycleUpdater.SetLifecycleToReviewing(projectID)
        }
    }
}
```

## 接口注入优势

| 特性 | 说明 |
|:---|:---|
| **简单高效** | 进程内调用，无网络开销 |
| **类型安全** | 编译期检查接口实现 |
| **事务一致性** | 可在同一数据库事务中执行 |
| **无需重试** | 不涉及网络失败，无需复杂的重试机制 |
| **开发调试** | 调试更简单，堆栈清晰 |
