Activiti 7 工作流技术文档

文章目录

一、项目环境

技术 版本
Activiti 7.1.0.M6
Spring Boot 2.5.0
MyBatis-Plus 3.4.2
数据库 MySQL
画图工具 Camunda Modeler 5.46.1

二、依赖配置

pom.xml

clike 复制代码
<!-- 必须 activiti7 整合 spring boot -->
<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
    <version>7.1.0.M6</version>
</dependency>
<!--非必须 -->
<dependency>
    <groupId>org.activiti.dependencies</groupId>
    <artifactId>activiti-dependencies</artifactId>
    <version>7.1.0.M6</version>
    <type>pom</type>
</dependency>

三、配置文件

application-test.yml(测试环境)

clike 复制代码
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/trade?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
  activiti:
    # 首次启动设为 true,建表后可注释
    database-schema-update: true
    # 开启历史记录
    db-history-used: true
    history-level: full
    # 关闭自动部署(手动部署)
    check-process-definitions: false
    async-executor-activate: false

application-prod.yml(生产环境)

clike 复制代码
spring:
  datasource:
    # 生产环境数据库配置(略)
    hikari:
      maximum-pool-size: 40
      minimum-idle: 10
  activiti:
    # 生产环境建议关闭自动建表
    # database-schema-update: true
    db-history-used: true
    history-level: full
    check-process-definitions: false
    async-executor-activate: false

四、数据库表

4.1 自动生成的表(共 25 张)

表组 数量 核心表
act_ge_*通用数据 2 act_ge_bytearray
act_hi_* 历史数据 8 act_hi_procinst, act_hi_taskinst
act_id_* 身份信息 4 act_id_user
act_re_* 流程定义 3 act_re_deployment, act_re_procdef
act_ru_* 运行时数据 8 act_ru_task, act_ru_execution, act_ru_variable

4.2 业务表

tb_flow 表(手动创建,存储流程配置):

clike 复制代码
CREATE TABLE tb_flow (
    id INT PRIMARY KEY AUTO_INCREMENT,
    flowname VARCHAR(100),      -- 流程名称
    flowkey VARCHAR(100),       -- 流程标识(对应 bpmn 文件 process id)
    filepath VARCHAR(200),      -- bpmn 文件路径
    state INT DEFAULT 1,        -- 0:已部署, 1:未部署, 2:部署失败
    createtime DATETIME
);

五、创建 BPMN 流程图

5.1 标准流程结构

clike 复制代码
开始 → 提交申请 → 网关1 → 审核 → 网关2 → 结束(通过)
                ↓                 ↓
             结束(取消)      提交申请(打回)

5.2 节点属性

元素 属性
流程 id loanApplication
task1 activiti:assignee ${assignee0}
task2 activiti:candidateUsers ${Auditor}
连线 (提交/通过) 条件 ${type==1}
连线(取消/拒绝) 条件 ${type==2}

5.3 使用 Camunda Modeler 画图

  1. 打开 Camunda Modeler → Camunda 7 → BPMN diagram

  2. 拖节点到画布,设置属性

  3. 保存为 .bpmn 文件

  4. 全部替换 camunda:activiti:

  5. 将流程 id 改成对应值(如 loanApplication

5.4 检查清单

检查项 搜索关键字
流程 ID 正确 <process id="loanApplication"
无 camunda 前缀 搜索 camunda:(应该没有)
执行人变量 ${assignee0}
候选人变量 ${Auditor}
流程条件 ${type==1}, ${type==2}

六、部署步骤

6.1 首次部署

clike 复制代码
1. pom.xml 中加入 Activiti 依赖
2. 配置文件中设置 database-schema-update: true
3. 启动项目 → Activiti 自动建 25 张表 
4. 将 .bpmn 文件放到 resources/bpmn/ 目录
5. 在 tb_flow 表中插入流程配置记录
6. 调接口部署流程 PUT /f/flow/deployment/{id}
7. 表建好后可注释掉 database-schema-update

6.2 新增流程

clike 复制代码
1. 画图生成 .bpmn 文件
2. 放到 resources/bpmn/
3. tb_flow 表插入一条新记录
4. 调接口部署 PUT /f/flow/deployment/{id}

6.3 更新流程

clike 复制代码
1. 修改 .bpmn 文件
2. 覆盖 resources/bpmn/ 中的旧文件
3. 调接口重新部署 PUT /f/flow/deployment/{id}
4. 新版本部署后,新启动的流程用新版,旧流程继续用旧版

七、核心代码

7.1 三大服务

clike 复制代码
@Resource
private RuntimeService runtimeService;   // 管理运行中的流程实例

@Resource
private TaskService taskService;         // 管理待办任务

@Resource
private HistoryService historyService;   // 管理历史记录

7.2 启动流程实例

clike 复制代码
public ProcessInstance startProcess(String formKey, String beanName, 
                                     String businessKey, Integer applyFormId) {
    IActFlowCustomService service = SpringContextUtil.getBean(beanName);
    Map<String, Object> variables = service.setvariables(applyFormId);
    variables.put("bussinessKey", businessKey);
    
    return runtimeService.startProcessInstanceByKey(
        formKey, businessKey, variables
    );
}

7.3 完成任务

clike 复制代码
public void completeProcess(String taskId, String username, Integer type, String remark) {
    // 1. 查询任务
    Task task = taskService.createTaskQuery().taskId(taskId)
        .taskAssignee(username).singleResult();
    if (task == null) {
        task = taskService.createTaskQuery().taskId(taskId)
            .taskCandidateUser(username).singleResult();
    }
    if (task == null) {
        taskService.claim(taskId, username);
    }
    
    // 2. 根据 state 和 type 更新业务状态
    // state=0/4/6 + type=1 → 提交申请(state→1)
    // state=0/4/6 + type=2 → 取消申请(删除流程)
    // state=1 + type=1 → 审核通过(state→3)
    // state=1 + type=2 → 审核拒绝(state→4)
    
    // 3. 设置变量并完成任务
    Map<String, Object> variables = new HashMap<>();
    variables.put("type", type);
    taskService.setVariables(taskId, variables);
    taskService.complete(taskId);
}

7.4 设置流程变量

clike 复制代码
@Override
public Map<String, Object> setvariables(Integer applyFormId) {
    String username = WebUtils.getUsername();
    List<String> auditors = getUsersByRoleId(9);  // 角色 ID=9 的用户
    
    Map<String, Object> variables = new HashMap<>();
    variables.put("assignee0", username);   // 提交人
    variables.put("Auditor", auditors);     // 审核人列表
    return variables;
}

7.5 查询待办任务

clike 复制代码
List<Task> tasks = taskService.createTaskQuery()
    .processDefinitionKey("loanApplication")
    .taskAssignee(username)
    .active()
    .list();

if (tasks.isEmpty()) {
    tasks = taskService.createTaskQuery()
        .processDefinitionKey("loanApplication")
        .taskCandidateUser(username)
        .active()
        .list();
}

八、状态流转

state 含义 说明
0 待提交 新建草稿
1 待审核 已提交,等待审核
3 审核通过 最终状态
4 审核不通过 可修改后重新提交
clike 复制代码
state=0 → type=1 → state=1 → type=1 → state=3(通过)
                            → type=2 → state=4 → type=1 → state=1(重新提交)

九、流程变量

变量名 用途 BPMN 引用
assignee0 提交人 ${assignee0}
Auditor 审核人列表 ${Auditor}
type 流程走向(1/2) ${type==1}, ${type==2}

注意:代码中variables.put("键名", 值)键名 必须与 BPMN 文件中 ${} 内的变量名完全一致。

十、注意事项

10.1 部署相关

问题 解决方案
首次启动没建表 确认 database-schema-update: true
部署失败 检查 bpmn 文件是否有 camunda: 前缀,需要改成activiti:
流程找不到 确认formKey与 bpmn 文件 process id 一致

10.2 开发相关

问题 解决方案
审核拒绝后无法重新提交 去掉历史流程检查,只检查活跃流程
状态显示不对 状态更新放在流程操作成功后
分页总数不对 先过滤再分页,total/pages 用过滤后的数据

10.3 生产环境

注意点 说明
database-schema-update: false 表建好后关闭,避免意外修改
check-process-definitions: false 手动部署,不影响正在运行的流程
部署新版本 旧流程实例继续用旧版,新启动的用新版

十一、完整工作流使用流程

clike 复制代码
1. pom.xml 加依赖
2. 配置数据库连接 + Activiti 配置
3. 首次启动 → 自动建 25 张表
4. 用 Camunda Modeler 画图
5. 替换 camunda: → activiti:
6. bpmn 文件放 resources/bpmn/
7. tb_flow 表插入记录
8. 调接口 PUT /f/flow/deployment/{id}
9. 流程可用,代码通过 formKey 启动

十二、关键文件一览

文件 作用
pom.xml Activiti 依赖
application-*.yml Activiti 配置
*.bpmn 流程图定义
tb_flow 流程配置表
ApplyFormCommService 核心流程服务
LoanApplicationServiceImpl 业务实现(含 setvariables)
FlowController 部署和任务接口
act_ru_task 运行时任务表
act_ru_execution 运行时流程实例表
act_hi_procinst 历史流程实例表
相关推荐
Treh UNFO3 小时前
nginx的重定向
大数据·数据库·nginx
jvvz afqh3 小时前
mysql用户名怎么看
数据库·mysql
eDEs OLDE3 小时前
CC++链接数据库(MySQL)超级详细指南
c语言·数据库·c++
EXnf1SbYK3 小时前
Redis分布式锁进阶第八篇:锁超时乱序深度踩坑 + 看门狗失效真实溯源 + 业务长耗时标准化兜底方案
数据库·redis·分布式
dvjr cloi3 小时前
Spring Framework 中文官方文档
java·后端·spring
研究点啥好呢3 小时前
滴滴Go后端开发工程师面试题精选:10道高频考题+答案解析
java·开发语言·golang
EXnf1SbYK3 小时前
Redis分布式锁进阶第十一篇
数据库·redis·分布式
xiaohe073 小时前
C#数据库操作系列---SqlSugar完结篇
网络·数据库·c#
ictI CABL3 小时前
SpringBoot3.3.0集成Knife4j4.5.0实战
java