1. 为什么需要可视化审批系统
在企业日常运营中,审批流程无处不在。想象一下这样的场景:员工提交请假申请后,需要经过直属主管、部门经理、人事部门三级审批。传统方式下,员工需要打印纸质申请表,逐个找领导签字,不仅效率低下,还容易出现申请表丢失、审批进度不透明等问题。
我曾经参与过一个客户项目,他们使用邮件+Excel的方式管理采购审批流程。经常出现审批人漏看邮件、审批意见混乱的情况,平均每个采购申请需要5-7天才能完成审批。引入工作流引擎后,审批时间缩短到1-2天,效率提升明显。
Activiti7作为轻量级工作流引擎,完美解决了这些问题。它提供:
- 可视化流程设计:通过拖拽方式设计审批流程
- 自动流转:根据预设规则自动推动流程
- 实时监控:随时查看审批进度和状态
- 历史追溯:完整记录每个环节的操作和意见
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 开发环境搭建
我推荐使用以下环境配置,经过多个项目验证稳定性较好:
- JDK 1.8(Activiti7对Java11+支持尚不完善)
- Spring Boot 2.5.x(与Activiti7.1.x兼容性最佳)
- MySQL 5.7或PostgreSQL(生产环境建议后者)
xml复制<!-- pom.xml关键依赖 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.2 数据库配置
Activiti7默认会创建28张表,主要分为以下几类:
- ACT_RE_:存储流程定义和部署资源
- ACT_RU_:运行时的流程实例、任务等
- ACT_HI_:历史数据
- ACT_GE_:通用数据
在application.yml中添加配置:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/activiti_db?useSSL=false
username: root
password: 123456
activiti:
database-schema-update: true # 自动更新表结构
history-level: full # 记录完整历史
3. 集成流程设计器
3.1 获取设计器资源
Activiti Modeler是官方提供的Web版设计器,但集成过程有些"坑"需要注意:
- 从GitHub下载activiti-5.22.0.zip
- 解压后找到
activiti-webapp-explorer2中的静态资源:editor-app目录modeler.html文件
- 复制到项目的
resources/static目录下
3.2 解决中文乱码问题
设计器默认是英文界面,汉化需要三个步骤:
- 添加
stencilset.json到static目录 - 创建
zh-CN.json语言包 - 修改
editor-app/app.js中的语言设置:
javascript复制if("zh-CN" == navigator.language){
$translateProvider.preferredLanguage('zh-CN');
}else{
$translateProvider.preferredLanguage('en');
}
3.3 创建模型控制器
java复制@Controller
@RequestMapping("/model")
public class ModelController {
@Autowired
private RepositoryService repositoryService;
@GetMapping("/create")
public void createModel(HttpServletRequest request,
HttpServletResponse response) throws IOException {
Model model = repositoryService.newModel();
// 设置模型基本信息...
repositoryService.saveModel(model);
// 初始化模型JSON结构
ObjectNode editorNode = JsonNodeFactory.instance.objectNode();
// 构建默认元素...
// 重定向到设计器页面
response.sendRedirect(request.getContextPath() +
"/modeler.html?modelId=" + model.getId());
}
}
访问/model/create即可跳转到设计器界面,这里有个小技巧:可以在URL中添加&readOnly=true参数来限制编辑权限。
4. 设计请假审批流程
4.1 BPMN基础元素
设计一个完整的请假流程需要以下元素:
- 开始事件:流程起点
- 用户任务:审批节点
- 排他网关:条件判断(如请假天数>3天需总监审批)
- 结束事件:流程终点

4.2 设置审批人
Activiti支持三种分配方式:
- 固定分配:直接指定用户ID
xml复制<userTask id="leaderAudit" name="主管审批" activiti:assignee="zhangsan"/> - 表达式分配:动态计算
xml复制<userTask id="hrAudit" name="人事审批" activiti:assignee="${applyUserId}"/> - 监听器分配:通过Java代码指定
java复制taskService.addCandidateUser(taskId, "lisi");
4.3 流程变量使用
变量可以在流程中传递和使用:
java复制// 启动流程时设置变量
runtimeService.startProcessInstanceByKey(
"leaveProcess",
variables.put("days", 5)
);
// 审批时更新变量
taskService.complete(taskId,
variables.put("approval", true));
在网关条件中使用变量:
xml复制<sequenceFlow id="flow1" sourceRef="gateway" targetRef="managerAudit">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[${days > 3}]]>
</conditionExpression>
</sequenceFlow>
5. 部署与运行流程
5.1 模型部署
设计好的模型需要部署才能运行:
java复制// 将模型转换为部署资源
Model model = repositoryService.getModel(modelId);
byte[] bpmnBytes = repositoryService.getModelEditorSource(modelId);
// 创建部署
Deployment deployment = repositoryService.createDeployment()
.name(model.getName())
.addBytes(model.getKey() + ".bpmn20.xml", bpmnBytes)
.deploy();
5.2 启动流程实例
java复制// 根据流程定义Key启动
ProcessInstance instance = runtimeService
.startProcessInstanceByKey("leaveProcess");
// 查询待办任务
List<Task> tasks = taskService.createTaskQuery()
.taskAssignee("zhangsan")
.list();
5.3 完成任务审批
java复制// 普通通过
taskService.complete(taskId);
// 带审批意见
taskService.complete(taskId,
variables.put("comment", "同意"));
6. 常见问题解决方案
6.1 设计器加载失败
可能原因及解决:
- 静态资源路径错误:检查
stencilset.json路径 - 跨域问题:确保设计器页面与后端同源
- 接口404:确认Modeler相关Controller已正确配置
6.2 流程无法启动
检查要点:
- 流程定义Key是否正确
- 是否缺少必需的流程变量
- 启动用户是否有权限
6.3 审批人看不到任务
排查步骤:
- 检查
ACT_RU_TASK表中任务是否存在 - 确认assignee或candidate设置正确
- 查看历史记录
ACT_HI_TASKINST
7. 进阶优化建议
7.1 性能调优
对于高并发场景:
- 配置异步执行器:
yaml复制spring: activiti: async-executor-activate: true - 定期清理历史数据:
sql复制DELETE FROM ACT_HI_TASKINST WHERE END_TIME_ < DATE_SUB(NOW(), INTERVAL 3 MONTH);
7.2 与业务系统集成
推荐做法:
- 封装Service层统一入口
- 使用事件监听器处理业务逻辑:
java复制@Component public class MyEventListener implements ExecutionListener { @Override public void notify(DelegateExecution execution) { // 流程事件处理逻辑 } }
7.3 前端整合方案
除了官方Modeler,还可以考虑:
- bpmn-js:更现代的流程设计器
- Camunda Modeler:兼容Activiti的桌面工具
- 自研设计器:基于React/Vue实现
在最近的一个项目中,我们将Activiti7与Vue前端深度整合,实现了这样的效果:审批人直接在业务系统中完成任务审批,无需跳转到独立的工作流页面,用户体验大幅提升。关键是在后端封装了统一的REST API,前端通过WebSocket实时接收任务通知。
