# Easy-Workflow 工作流框架使用指南

## 概述

本项目已集成 easy-workflow 工作流框架，支持可视化的流程编排和灵活的审批流管理。

## 核心概念

### 1. 流程定义 (ProcessDefinition)

流程定义是工作流的模板，描述了一个完整的审批流程结构。

**数据结构：**
```json
{
  "process_name": "员工请假",
  "process_code": "leave_request",
  "source": "办公系统",
  "nodes": [
    {
      "node_id": "Start",
      "node_name": "请假申请",
      "node_type": 0,
      "user_ids": ["$starter"],
      "roles": []
    },
    {
      "node_id": "Manager",
      "node_name": "主管审批",
      "node_type": 1,
      "prev_node_ids": ["Start"],
      "roles": ["主管"],
      "is_cosigned": 0
    }
  ]
}
```

### 2. 节点类型 (NodeType)

- **0 - 开始节点**：流程的起点
- **1 - 审批节点**：需要人工审批的节点
- **2 - 网关节点**：条件分支或并行分支
- **3 - 结束节点**：流程终点

### 3. 流程实例 (ProcessInstance)

每次发起审批时创建的实例，关联具体的业务数据。

### 4. 任务 (Task)

每个审批节点会生成一个或多个待办任务，分配给具体的处理人。

## API 接口

### 流程定义管理

```bash
# 创建流程定义
POST /api/v1/workflow/definitions
Content-Type: application/json

{
  "process_name": "访客预约审批",
  "process_code": "visitor_approval",
  "source": "访客系统",
  "nodes_json": "[...]"
}

# 获取流程定义列表
GET /api/v1/workflow/definitions

# 获取流程定义详情
GET /api/v1/workflow/definitions/:id

# 更新流程定义
PUT /api/v1/workflow/definitions/:id

# 删除流程定义
DELETE /api/v1/workflow/definitions/:id
```

### 流程实例管理

```bash
# 启动流程实例
POST /api/v1/workflow/instances
Content-Type: application/json

{
  "process_code": "visitor_approval",
  "business_type": "appointment",
  "business_id": 123,
  "variables": {
    "days": 3,
    "reason": "商务拜访"
  }
}

# 获取流程实例列表
GET /api/v1/workflow/instances?business_type=appointment&status=0

# 获取流程实例详情
GET /api/v1/workflow/instances/:id
```

### 任务管理

```bash
# 获取待办任务
GET /api/v1/workflow/tasks/pending

# 审批通过
POST /api/v1/workflow/tasks/:id/approve
Content-Type: application/json

{
  "comment": "同意"
}

# 审批拒绝
POST /api/v1/workflow/tasks/:id/reject
Content-Type: application/json

{
  "comment": "拒绝，原因：..."
}
```

## 前端使用

### 1. 流程设计器

访问路径：`/subpackages/admin/workflow-designer`

支持功能：
- 创建/编辑流程定义
- 添加/删除节点
- 配置节点类型和审批人
- 设置网关条件

### 2. 流程管理列表

访问路径：`/subpackages/admin/workflow-list`

支持功能：
- 查看所有流程定义
- 编辑/删除流程
- 查看流程实例

### 3. 我的待办

访问路径：`/subpackages/workflow/my-tasks`

支持功能：
- 查看待审批任务
- 快速审批通过/拒绝

### 4. 流程实例详情

访问路径：`/subpackages/admin/workflow-instance-detail?id={instanceId}`

支持功能：
- 查看审批进度时间线
- 查看每个节点的审批意见
- 执行审批操作

## 代码示例

### 发起审批流程

```typescript
import workflowAPI from '@/api/workflow'

// 发起访客预约审批
const instance = await workflowAPI.startInstance({
  process_code: 'visitor_approval',
  business_type: 'appointment',
  business_id: appointmentId,
  variables: {
    visitDays: 3,
    visitorCount: 5
  }
})
```

### 获取待办任务

```typescript
// 获取我的待办
const tasks = await workflowAPI.getPendingTasks()

// 遍历处理
tasks.forEach(task => {
  console.log(`${task.node_name} - ${task.instance?.process_def?.process_name}`)
})
```

### 审批操作

```typescript
// 审批通过
await workflowAPI.approveTask(taskId, '同意申请')

// 审批拒绝
await workflowAPI.rejectTask(taskId, '拒绝，资料不全')
```

## 高级特性

### 1. 条件网关

```json
{
  "node_id": "GW-Day",
  "node_name": "请假天数判断",
  "node_type": 2,
  "gw_config": {
    "conditions": [
      {
        "expression": "$days >= 3",
        "node_id": "Manager"
      },
      {
        "expression": "$days < 3",
        "node_id": "END"
      }
    ]
  }
}
```

### 2. 并行网关

```json
{
  "node_id": "GW-Parallel",
  "node_name": "并行审批",
  "node_type": 2,
  "gw_config": {
    "inevitable_nodes": ["HR", "DeputyBoss"],
    "wait_for_all_prev_node": 1
  }
}
```

### 3. 会签节点

```json
{
  "node_id": "Board",
  "node_name": "董事会审批",
  "node_type": 1,
  "roles": ["董事 A", "董事 B", "董事 C"],
  "is_cosigned": 1
}
```

## 数据库表结构

### wf_process_definitions
- 存储流程定义模板
- 节点配置以 JSON 格式存储

### wf_process_instances
- 存储流程实例
- 关联业务数据
- 记录当前节点

### wf_tasks
- 存储审批任务
- 记录处理人和审批意见

## 迁移现有审批逻辑

### 步骤 1：创建流程定义

使用流程设计器创建对应的流程模板。

### 步骤 2：修改业务代码

将原有的审批逻辑改为调用工作流引擎：

```go
// 旧代码
approvalHandler.StartInstance(...)

// 新代码
workflowEngine.StartInstance("visitor_approval", "appointment", appointmentID, userID, variables)
```

### 步骤 3：数据迁移

将现有的审批记录迁移到新的工作流表（可选）。

## 注意事项

1. **流程变量**：使用 `$` 前缀引用，如 `$days`
2. **角色解析**：审批人可以是具体用户 ID 或角色编码
3. **会签支持**：设置 `is_cosigned=1` 启用会签
4. **网关等待**：`wait_for_all_prev_node=1` 表示等待所有前置节点完成

## 常见问题

### Q: 如何添加自定义事件？
A: 在节点的 `node_start_events` 或 `node_end_events` 数组中添加事件名称。

### Q: 如何获取审批进度？
A: 调用 `GET /api/v1/workflow/instances/:id` 获取实例详情，包含所有任务记录。

### Q: 支持撤回吗？
A: 当前版本暂不支持，可在流程定义中配置 `revoke_events` 实现。

## 访客预约审批流程示例

### 流程定义（创建时 nodes_json 内容）

```json
[
  {"node_id":"Start","node_name":"发起预约","node_type":0,"user_ids":["$starter"]},
  {"node_id":"Employee","node_name":"公司接待员工","node_type":1,"prev_node_ids":["Start"],"user_ids":["$employee_id"]},
  {"node_id":"DeptApprover","node_name":"部门指定人审批","node_type":1,"prev_node_ids":["Employee"],"user_ids":["$dept_approver_ids"]},
  {"node_id":"VPApproval","node_name":"分管领导审批","node_type":1,"prev_node_ids":["DeptApprover"],"user_ids":["$vp_ids"]},
  {"node_id":"End","node_name":"审批完成","node_type":3,"prev_node_ids":["VPApproval"]}
]
```

### 流程变量说明

| 变量名 | 类型 | 说明 |
|--------|------|------|
| `$starter` | uint | 发起人的用户 ID（引擎自动填入） |
| `$employee_id` | uint | 被访员工用户 ID |
| `$dept_approver_ids` | JSON 数组 | 部门指定审批人 ID 列表，支持多人 |
| `$vp_ids` | JSON 数组 | 分管领导 ID 列表，支持多人，空数组跳过节点 |

### 行为规则

- **`$dept_approver_ids` 为空**：跳过「部门指定人审批」节点
- **`$vp_ids` 为空**：跳过「分管领导审批」节点
- **`$default_approver_ids` 为空**：跳过「兜底审批」节点，流程直接结束
- **多个审批人**：会签模式，需全部通过才流转下一节点

### 兜底审批流程定义（visitor_approval_simple）

当未匹配到员工或部门未配置审批人时使用：

```json
[
  {"node_id":"Start","node_name":"发起预约","node_type":0,"user_ids":["$starter"]},
  {"node_id":"DefaultApproval","node_name":"兜底审批","node_type":1,"prev_node_ids":["Start"],"user_ids":["$default_approver_ids"],"is_cosigned":1},
  {"node_id":"End","node_name":"审批完成","node_type":3,"prev_node_ids":["DefaultApproval"]}
]
```

## 技术支持

如有问题，请联系开发团队或查看示例代码。
