# 项目信息填写工单流程

**工单类型代码**: `project_detail`  
**来源模块**: rmdc-project-management  
**编制日期**: 2026-01-08

---

## 1. 业务场景

超级管理员创建项目元数据后，分配给普通用户填写项目详情信息，填写完成后提交审核。

### 1.1 业务规则

| 规则项 | 说明 |
|-------|------|
| 发起人 | 超级管理员 |
| 填写人 | 被分配的普通用户 |
| 审批人 | 超级管理员 |
| 支持草稿 | 是（可多次保存草稿） |
| 可撤销 | 否（仅超级管理员可取消） |
| 项目状态关联 | 草稿状态绑定唯一工单 |

### 1.2 项目状态对应关系

| 工单状态 | 项目认证状态 |
|---------|------------|
| `assigned` / `in_progress` | `draft` (草稿) |
| `pending_review` | `pending` (待审核) |
| `approved` / `closed` | `official` (正式) |
| `returned` | `draft` (草稿) |

---

## 2. 状态机

### 2.1 状态定义

| 状态代码 | 状态名称 | 说明 |
|---------|---------|------|
| `created` | 已创建 | 项目创建，工单生成 |
| `assigned` | 已分配 | 已分配填写人 |
| `in_progress` | 填写中 | 用户正在填写项目信息 |
| `draft_saved` | 草稿已保存 | 扩展状态：草稿保存成功 |
| `pending_review` | 待审核 | 填写完成，等待审核 |
| `approved` | 已通过 | 审核通过，项目正式上线 |
| `returned` | 已打回 | 审核打回，需重新填写 |
| `closed` | 已关闭 | 工单生命周期结束 |

### 2.2 状态机图

```mermaid
stateDiagram-v2
    [*] --> created: 创建项目
    
    created --> assigned: 分配填写人
    
    assigned --> in_progress: 用户开始填写
    assigned --> assigned: 重新分配
    
    in_progress --> in_progress: 保存草稿
    in_progress --> pending_review: 提交审核
    in_progress --> assigned: 重新分配
    
    pending_review --> approved: 审批通过
    pending_review --> returned: 审批打回
    
    returned --> in_progress: 用户重新填写
    returned --> pending_review: 重新提交
    
    approved --> closed: 关闭工单
    
    closed --> [*]
    
    note right of approved: 项目状态变为official
    note right of in_progress: 支持多次保存草稿
```

---

## 3. 流程图

```mermaid
flowchart TD
    Start([开始]) --> CreateProject[超管创建项目元数据]
    CreateProject --> CreateWorkflow[自动创建项目详情工单]
    CreateWorkflow --> SelectFiller[选择项目信息填写人]
    SelectFiller --> AssignWorkflow[工单分配给填写人]
    
    AssignWorkflow --> NotifyFiller[通知填写人]
    NotifyFiller --> UserAccept[填写人接受任务]
    
    UserAccept --> FillDetail[填写项目详情信息]
    FillDetail --> SaveDraft{保存操作}
    
    SaveDraft -->|保存草稿| DraftSaved[草稿保存成功]
    DraftSaved --> FillDetail
    
    SaveDraft -->|提交审核| ValidateRequired{必填项校验}
    ValidateRequired -->|校验失败| FillDetail
    ValidateRequired -->|校验通过| SubmitReview[提交审核]
    
    SubmitReview --> PendingReview{待审核}
    
    PendingReview -->|审批通过| Approve[审批通过]
    PendingReview -->|审批打回| Return[打回修改]
    PendingReview -->|超管直接修改| AdminModify[超管修改信息]
    
    Approve --> SetOfficial[项目状态设为official]
    SetOfficial --> CloseWorkflow[关闭工单]
    CloseWorkflow --> End([结束])
    
    Return --> BackToFill[回到填写阶段]
    BackToFill --> FillDetail
    
    AdminModify --> SetOfficial
    
    %% 重新分配分支
    AssignWorkflow --> ReassignCheck{需要重新分配?}
    ReassignCheck -->|是| SelectFiller
    ReassignCheck -->|否| NotifyFiller
```

---

## 4. 时序图

```mermaid
sequenceDiagram
    autonumber
    
    participant Admin as 超级管理员
    participant Frontend as 前端
    participant Project as rmdc-project-management
    participant Workflow as rmdc-work-procedure
    participant User as 填写人
    participant Notice as 通知中心
    
    %% 项目创建阶段
    Admin->>Frontend: 创建项目
    Frontend->>Project: POST /api/project/create
    Note over Project: 创建项目元数据<br/>status=draft
    Project->>Workflow: POST /api/workflow/create
    Note over Workflow: 创建project_detail工单<br/>保存detail_filler_id
    Workflow-->>Project: 返回工单ID
    Project->>Project: 关联工单ID
    Project-->>Frontend: 项目创建成功
    
    %% 分配填写人
    Admin->>Frontend: 选择填写人
    Frontend->>Workflow: POST /api/workflow/assign
    Workflow->>Workflow: 设置status=assigned
    Workflow->>Notice: 推送通知
    Notice-->>User: 项目信息填写通知
    
    %% 用户填写阶段
    User->>Frontend: 进入项目详情页
    Frontend->>Project: POST /api/project/detail
    Project-->>Frontend: 返回项目信息+草稿数据
    
    loop 填写并保存草稿
        User->>Frontend: 填写项目信息
        Frontend->>Project: POST /api/project/draft/save
        Project->>Workflow: 更新draft_data
        Project-->>Frontend: 草稿保存成功
    end
    
    %% 提交审核
    User->>Frontend: 点击提交审核
    Frontend->>Project: POST /api/project/submit
    Note over Project: 校验必填项
    Project->>Workflow: POST /api/workflow/transition
    Note over Workflow: event=complete
    Workflow->>Workflow: 设置status=pending_review
    Workflow->>Notice: 推送通知
    Notice-->>Admin: 项目详情审核通知
    
    %% 审批场景
    alt 审批通过
        Admin->>Frontend: 点击通过
        Frontend->>Workflow: POST /api/workflow/transition
        Note over Workflow: event=approve
        Workflow->>Project: 回调更新项目状态
        Project->>Project: 设置status=official
        Workflow->>Workflow: 设置status=approved
        Workflow->>Notice: 推送通知
        Notice-->>User: 项目审核通过
    
    else 审批打回
        Admin->>Frontend: 点击打回
        Frontend->>Workflow: POST /api/workflow/transition
        Note over Workflow: event=return<br/>附带修改意见
        Workflow->>Workflow: 设置status=returned
        Workflow->>Notice: 推送通知
        Notice-->>User: 项目被打回
        
        User->>Frontend: 根据意见修改
        Frontend->>Project: POST /api/project/draft/save
        Frontend->>Workflow: POST /api/workflow/transition
        Note over Workflow: event=resubmit
        Workflow->>Workflow: 设置status=pending_review
    
    else 超管直接修改
        Admin->>Frontend: 直接修改项目信息
        Frontend->>Project: POST /api/project/update
        Project->>Workflow: POST /api/workflow/transition
        Note over Workflow: event=approve<br/>超管直接完成
        Workflow->>Workflow: 设置status=approved
    end
```

---

## 5. 工单步骤定义

| 步骤序号 | 步骤名称 | 步骤类型 | 处理人 | 操作说明 |
|---------|---------|---------|-------|---------|
| 1 | 分配填写人 | `assign` | 超级管理员 | 选择项目信息填写人 |
| 2 | 填写项目信息 | `execute` | 被分配用户 | 填写项目详情，可保存草稿 |
| 3 | 审核项目信息 | `approve` | 超级管理员 | 审批通过/打回 |

---

## 6. 业务扩展字段

存储于 `project_detail_ext` 表：

| 字段 | 类型 | 说明 |
|-----|------|------|
| `project_id` | VARCHAR(64) | 关联项目ID |
| `detail_filler_id` | BIGINT | 填写人ID |
| `detail_filler_name` | VARCHAR(64) | 填写人姓名 |
| `draft_data` | JSON | 草稿数据 |

### 6.1 draft_data 示例

```json
{
  "deploy_business": {
    "deployer_name": "张三",
    "deployer_phone": "13800138000",
    "deploy_start_time": "2026-01-01",
    "system_version": "v3.2.0"
  },
  "deploy_env": {
    "network_type": "internal",
    "main_public_ip": "10.0.0.1",
    "host_count": 3
  },
  "deploy_middleware": {
    "mysql": {
      "internal_ip": "10.0.0.10",
      "internal_port": 3306
    }
  },
  "last_saved_at": "2026-01-08T10:30:00Z"
}
```
