# Warm-Flow 工作流开发规范
## 🎯 概述
本规范基于 **warm-flow** 工作流框架,适用于所有工作流相关的开发任务。warm-flow 是 dromara 社区开源的轻量级工作流引擎,与 Spring Boot 和若依框架无缝集成。
---
## 🔧 技术栈与配置
### 核心依赖
```xml
org.dromara.warm
warm-flow-mybatis-plus-sb3-starter
org.dromara.warm
warm-flow-plugin-ui-sb-web
```
### 配置开关
```yaml
# application.yml
warm-flow:
enabled: true # 设置为 true 时,启用工作流功能
```
### 条件开启注解
```java
// 所有工作流相关类必须添加此注解
@ConditionalOnEnable
@Service / @Controller / @Component
public class WorkflowRelatedClass {
// 实现逻辑
}
```
---
## 🏗️ 后端开发规范
### 1. 实体类规范
#### 1.1 BO 类规范
```java
@Data
@EqualsAndHashCode(callSuper = true)
public class TestLeaveBo extends BaseEntity {
private Long id;
private String leaveType;
private String startDate;
private String endDate;
private Integer leaveDays;
private String remark;
private String status; // 工作流状态字段(必需)
}
```
#### 1.2 VO 类规范(🔴 强制性)
```java
@Data
@ExcelIgnoreUnannotated
public class TestLeaveVo {
// 业务字段
private Long id;
private String leaveType;
private String startDate;
private String endDate;
private Integer leaveDays;
private String remark;
private String status;
// 🔴 基础字段(必须包含,避免MyBatis映射错误)
private Long createBy;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
private Long updateBy;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}
```
**⚠️ 重要提醒**: 所有工作流业务 VO 类必须包含四个基础字段,否则会出现 `Could not set property 'createBy'` 错误。
### 2. Controller 规范
```java
@ConditionalOnEnable // 🔴 必须添加
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/workflow/业务模块")
public class WorkflowController extends BaseController {
private final IWorkflowService workflowService;
// 🔴 所有接口必须添加权限注解
@SaCheckPermission("workflow:业务模块:list")
@GetMapping("/list")
public TableDataInfo list(WorkflowBo bo, PageQuery pageQuery) {
return workflowService.queryPageList(bo, pageQuery);
}
@SaCheckPermission("workflow:业务模块:add")
@PostMapping()
public R add(@Validated(AddGroup.class) @RequestBody WorkflowBo bo) {
return R.ok(workflowService.insertByBo(bo));
}
@SaCheckPermission("workflow:业务模块:edit")
@PutMapping()
public R edit(@Validated(EditGroup.class) @RequestBody WorkflowBo bo) {
return R.ok(workflowService.updateByBo(bo));
}
@SaCheckPermission("workflow:业务模块:remove")
@DeleteMapping("/{ids}")
public R remove(@PathVariable Long[] ids) {
return toAjax(workflowService.deleteWithValidByIds(List.of(ids)));
}
}
```
### 3. Service 规范
```java
@ConditionalOnEnable // 🔴 必须添加
@Service
@RequiredArgsConstructor
public class WorkflowServiceImpl implements IWorkflowService {
private final WorkflowMapper baseMapper;
@Override
@Transactional(rollbackFor = Exception.class) // 🔴 重要操作需要事务
public WorkflowVo insertByBo(WorkflowBo bo) {
Workflow entity = BeanUtil.toBean(bo, Workflow.class);
// 🔴 新建时必须设置状态为草稿
entity.setStatus("draft");
validEntityBeforeSave(entity);
boolean flag = baseMapper.insert(entity) > 0;
if (flag) {
bo.setId(entity.getId());
return BeanUtil.toBean(entity, WorkflowVo.class);
}
return null;
}
// 其他CRUD方法...
}
```
### 4. 数据库规范
#### 4.1 业务表必需字段
```sql
-- 所有工作流业务表必须包含以下字段
CREATE TABLE workflow_business (
id BIGINT(20) NOT NULL PRIMARY KEY COMMENT '主键ID',
-- 业务字段
-- ...
-- 🔴 工作流状态字段(必需)
status VARCHAR(20) DEFAULT 'draft' COMMENT '流程状态',
-- 🔴 标准基础字段(必需)
tenant_id VARCHAR(20) DEFAULT '000000' COMMENT '租户编号',
create_dept BIGINT(20) DEFAULT NULL COMMENT '创建部门',
create_by BIGINT(20) DEFAULT NULL COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by BIGINT(20) DEFAULT NULL COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT(1) DEFAULT 0 COMMENT '删除标志'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工作流业务表';
```
#### 4.2 工作流状态值规范
| 状态值 | 状态名称 | 说明 | 可用操作 |
| --------- | -------- | ------------ | -------------------- |
| draft | 草稿 | 新建但未提交 | 编辑、删除、提交 |
| waiting | 待审批 | 流程进行中 | 查看、撤销 |
| complete | 已完成 | 流程正常结束 | 查看 |
| cancel | 已取消 | 申请人撤销 | 编辑、删除、重新提交 |
| back | 已退回 | 审批人退回 | 编辑、删除、重新提交 |
| invalid | 已作废 | 管理员作废 | 查看 |
| terminate | 已终止 | 流程异常终止 | 查看 |
---
## 🎨 前端开发规范
### 1. 页面结构规范
#### 1.1 列表页面结构
```vue
```
#### 1.2 编辑页面结构(🔴 标准模板)
```vue
```
### 2. API 接口规范
#### 2.1 类型定义
```typescript
// api/workflow/业务模块/types.ts
export interface WorkflowForm extends BaseEntity {
id?: string | number;
// 业务字段
status?: string; // 🔴 工作流状态字段
}
export interface WorkflowVO extends BaseEntity {
id?: string | number;
// 业务字段
status?: string; // 🔴 工作流状态字段
}
export interface WorkflowQuery extends PageQuery {
// 查询字段
status?: string;
}
```
#### 2.2 接口定义
```typescript
// api/workflow/业务模块/index.ts
import request from '@/utils/request';
import { WorkflowQuery, WorkflowForm, WorkflowVO } from './types';
export const list业务 = (query: WorkflowQuery): AxiosPromise => {
return request({
url: '/workflow/业务模块/list',
method: 'get',
params: query,
});
};
export const get业务 = (id: string | number): AxiosPromise => {
return request({
url: `/workflow/业务模块/${id}`,
method: 'get',
});
};
export const add业务 = (data: WorkflowForm): AxiosPromise => {
return request({
url: '/workflow/业务模块',
method: 'post',
data: data,
});
};
export const update业务 = (data: WorkflowForm): AxiosPromise => {
return request({
url: '/workflow/业务模块',
method: 'put',
data: data,
});
};
export const del业务 = (id: string | number | Array): AxiosPromise => {
return request({
url: `/workflow/业务模块/${id}`,
method: 'delete',
});
};
```
### 3. 路由配置规范
```typescript
// router配置
{
path: '/workflow/业务模块',
component: Layout,
redirect: '/workflow/业务模块/index',
name: 'Workflow业务模块',
meta: {
title: '业务模块管理',
icon: 'workflow'
},
children: [
{
path: 'index',
component: () => import('@/views/workflow/业务模块/index.vue'),
name: 'Workflow业务模块List',
meta: { title: '业务模块列表', activeMenu: '/workflow/业务模块/index' }
},
{
path: 'edit',
component: () => import('@/views/workflow/业务模块/edit.vue'),
name: 'Workflow业务模块Edit',
hidden: true,
meta: { title: '业务模块编辑', activeMenu: '/workflow/业务模块/index' }
}
]
}
```
---
## 🔍 工作流核心功能
### 1. 流程启动
```typescript
// 启动工作流标准代码
const handleStartWorkFlow = async (businessData: any) => {
const submitFormData = {
flowCode: 'your_flow_code', // 🔴 流程定义编码
businessId: businessData.id, // 🔴 业务数据ID
variables: {
// 🔴 流程变量
// 条件判断变量
amount: businessData.amount,
// 会签用户列表
userList: ['1', '3', '4'],
// 其他业务变量
...otherVariables,
},
};
try {
const resp = await startWorkFlow(submitFormData);
// 打开提交确认对话框
submitVerifyRef.value.openDialog(resp.data.taskId);
} catch (error) {
console.error('启动工作流失败:', error);
}
};
```
### 2. 任务办理
```typescript
// 在 submitVerify 组件中自动处理
// 支持的操作:
// - 提交审批
// - 委托 (delegateTask)
// - 转办 (transferTask)
// - 加签 (addSignature)
// - 减签 (reductionSignature)
// - 终止 (terminationTask)
// - 退回 (backProcess)
```
### 3. 流程撤销
```typescript
// 申请人撤销流程
const handleCancelProcessApply = async (businessId: string) => {
await proxy?.$modal.confirm('是否确认撤销当前单据?');
const data = {
businessId: businessId,
message: '申请人撤销流程!',
};
await cancelProcessApply(data);
proxy?.$modal.msgSuccess('撤销成功');
getList(); // 刷新列表
};
```
---
## 📊 常用工作流模式
### 1. 普通线性流程
```typescript
// 流程编码:simple_approval
// 特点:线性审批,一步一步进行
const taskVariables = {
// 基本业务数据即可
businessData: formData,
};
```
### 2. 排他网关流程
```typescript
// 流程编码:exclusive_gateway
// 特点:根据条件选择不同审批分支
const taskVariables = {
amount: formData.amount, // 金额条件
urgentLevel: formData.urgent, // 紧急程度
applicantLevel: currentUser.level, // 申请人级别
};
```
### 3. 并行网关流程
```typescript
// 流程编码:parallel_gateway
// 特点:多个分支并行执行
const taskVariables = {
parallelBranches: ['finance', 'hr', 'legal'], // 并行分支
businessData: formData,
};
```
### 4. 会签流程
```typescript
// 流程编码:countersign
// 特点:多人会签,所有人都需要审批
const taskVariables = {
userList: ['1', '3', '4', '5'], // 会签用户列表
signType: 'all', // all-全部同意 any-任一同意
businessData: formData,
};
```
---
## 🔒 权限配置规范
### 1. 菜单权限配置
在系统管理 → 菜单管理中配置:
```
父菜单:工作流管理
├── 业务模块管理
├── 菜单权限:workflow:业务模块:list
├── 按钮权限:
├── 新增:workflow:业务模块:add
├── 修改:workflow:业务模块:edit
├── 删除:workflow:业务模块:remove
├── 查询:workflow:业务模块:query
└── 导出:workflow:业务模块:export
```
### 2. 工作流权限配置
```
工作流通用权限:
├── 任务管理:workflow:task:list
├── 实例管理:workflow:instance:list
├── 定义管理:workflow:definition:list
└── 审批权限:workflow:approval:handle
```
---
## ⚠️ 常见问题与解决方案
### 1. MyBatis 映射错误
**问题**: `Could not set property 'createBy'`
**解决**: 确保 VO 类包含完整的基础字段:
```java
// 🔴 必须包含的四个基础字段
private Long createBy;
private Date createTime;
private Long updateBy;
private Date updateTime;
```
### 2. 工作流功能不显示
**问题**: 工作流相关功能无法使用
**检查清单**:
- [ ] 配置文件:`warm-flow.enabled=true`
- [ ] 类注解:`@ConditionalOnEnable`
- [ ] 权限注解:`@SaCheckPermission`
- [ ] 组件引入路径正确
### 3. 流程启动失败
**常见原因**:
- 流程定义未发布
- flowCode 不存在
- 业务数据状态非 'draft'
- 权限不足
### 4. 日期格式问题
**解决**: 统一使用标准格式
```vue
```
---
## 📝 代码生成模板
### 快速生成工作流业务模块
1. **数据库表**: 按照规范创建业务表
2. **后端代码**: 使用代码生成器,添加工作流注解
3. **前端代码**: 复制标准模板,修改业务字段
4. **权限配置**: 在菜单管理中配置权限
5. **流程定义**: 在流程设计器中创建流程
---
## 📚 参考文档
- [Warm-Flow 工作流框架开发指南](../开发文档/warm-flow工作流框架开发指南.md)
- [API 开发最佳实践总结](../开发文档/API开发最佳实践总结.md)
- [请假工作流示例](../开发文档/API/请假工作流API.md)
---
**规范版本**: v1.0
**最后更新**: 2025-01-09
**适用范围**: 所有基于 warm-flow 的工作流开发任务