第五章 activiti流程 “权限与部署指挥部”
一、用户与组——流程世界的“工牌与部门”
1. 用户管理(工牌颁发)
- 核心表:
ACT_ID_USER
(存储用户信息) - 代码操作:
IdentityService identityService = engine.getIdentityService(); // 创建用户 User user = identityService.newUser("zhangsan"); user.setFirstName("三"); user.setLastName("张"); user.setEmail("zhangsan@company.com"); identityService.saveUser(user); // 查询用户 User dbUser = identityService.createUserQuery().userId("zhangsan").singleResult();
避坑指南:用户ID必须唯一,建议用工号或用户名!
2. 组管理(部门划分)
- 核心表:
ACT_ID_GROUP
(部门/角色信息) - 代码操作:
// 创建组(如部门或角色) Group group = identityService.newGroup("hr"); group.setName("人力资源部"); group.setType("department"); // 类型:department/role等 identityService.saveGroup(group); // 查询组 Group hrGroup = identityService.createGroupQuery().groupId("hr").singleResult();
二、用户与组的关系——分配“部门工牌”
1. 用户加入组
identityService.createMembership("zhangsan", "hr"); // 用户zhangsan加入hr组
2. 查询组内成员
List<User> hrMembers = identityService.createUserQuery()
.memberOfGroup("hr")
.list(); // 获取人力资源部所有成员
趣味测试❓:
如果用户同时属于多个组(如hr
和manager
),如何查询他所有任务?
答案:用.memberOfGroup("hr").memberOfGroup("manager")
链式调用!
三、流程部署——发布“作战计划”
1. 部署方式三连击
方式 | 代码示例 | 适用场景 |
---|---|---|
Classpath资源部署 | .addClasspathResource("processes/leave.bpmn") | 开发环境快速测试 |
ZIP压缩包部署 | .addZipInputStream(zipStream) | 批量部署流程图+表单 |
数据库直接部署 | .addBytes("leave.bpmn", bpmnBytes) | 动态生成流程文件的场景 |
2. 代码实战
RepositoryService repositoryService = engine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.name("请假流程V2.0")
.addClasspathResource("processes/leave.bpmn")
.addClasspathResource("forms/leave-form.xml")
.deploy(); // 执行部署!
System.out.println("部署ID:" + deployment.getId());
3. 部署验证
// 查询流程定义
ProcessDefinition processDef = repositoryService.createProcessDefinitionQuery()
.deploymentId(deployment.getId())
.singleResult();
// 验证结果
assert processDef != null : "流程部署失败!";
四、高级权限控制——动态任务分配
1. 任务候选人设置
在BPMN中配置用户组为任务候选人:
<userTask id="hrApprove" name="HR审批">
<extensionElements>
<activiti:candidateGroups>hr</activiti:candidateGroups>
</extensionElements>
</userTask>
2. 代码中认领任务
Task task = taskService.createTaskQuery().taskCandidateGroup("hr").singleResult();
taskService.claim(task.getId(), "zhangsan"); // 张三认领HR审批任务
五、避坑指南——权限与部署的“暗雷”
1. 用户组未绑定任务
症状:任务查询为空,但流程已启动。
检查项:
- BPMN中是否配置了
activiti:candidateUsers
或activiti:candidateGroups
。
2. 部署资源冲突
症状:重复部署同名流程导致版本混乱。
解法:
- 查询已部署流程,先删除旧版本:
repositoryService.deleteDeployment(oldDeploymentId, true); // true表示级联删除
六、课后挑战——巩固你的“管理权杖”
-
选择题:删除用户时,如果用户已关联任务,会发生什么?
A. 自动解除关联
B. 抛出异常
C. 任务被删除 -
实战题:创建一个“财务部”组,将用户“lisi”加入,并部署一个报销流程,任务候选人设为财务部。