工作流提供的用户角色
一、设置用户角色
这个【部门经理】相当于一个用户角色,一个角色可以对应多个人,比如有三个人:张三、李四是部门经理,王五是总经理,
那我们可以把这三个人录入的我们自己的用户表中,那么工作流也给我们提供了至少三张表:用户表,角色表,用户角色关联表
那我们就可以把部门经理这个角色与张三、李四关联起来。
具体做法:
1、添加用户角色组
2、创建角色
3、创建用户
4、创建角色用户关联关系
测试代码如下:
/**部署流程定义*/
@Test
public void deployementProcessDefinition(){
String resourceNamebpmn = "group.bpmn";
String resourceNamepng = "group.png";
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("group.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("group.png");
/**1、部署流程定义*/
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()//创建部署对象
.name("组任务")
.addInputStream(resourceNamebpmn, inputStreamBpmn)//部署加载资源文件
.addInputStream(resourceNamepng, inputStreamPng)
.deploy();
System.out.println("部署ID:"+deployment.getId());
/**2、添加用户角色组*/
IdentityService identityService = processEngine.getIdentityService();//与组织机构管理相关的servive
//创建角色(两个角色)
identityService.saveGroup(new GroupEntity("部门经理"));
identityService.saveGroup(new GroupEntity("总经理"));
//创建用户(三个用户)
identityService.saveUser(new UserEntity("张三"));
identityService.saveUser(new UserEntity("李四"));
identityService.saveUser(new UserEntity("王五"));
//创建用户角色关联关系
identityService.createMembership("张三", "部门经理");
identityService.createMembership("李四", "部门经理");
identityService.createMembership("王五", "总经理");
System.out.println("添加组织机构成功");
}
/**
* 启动流程实例
*/
@Test
public void startProcessInstance() {
//启动流程实例
String processDefinitionKey ="group";
//启动流程实例
ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key的最新版本启动流程
System.out.println("流程实例ID:"+pi.getId());
System.out.println("流程定义的ID:"+pi.getProcessDefinitionId());
}
/**查询张三或者李四的任务*/
@Test
public void findGroupTask(){
String candidateUser = "张三";
List<Task> list =processEngine.getTaskService()
.createTaskQuery()
.taskCandidateUser(candidateUser)
.list();
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任务ID:"+task.getId());
System.out.println("任务的办理人:"+task.getAssignee());
System.out.println("任务名称:"+task.getName());
System.out.println("任务的创建时间:"+task.getCreateTime());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("#######################################");
}
}
/**
* 任务ID:167504
任务的办理人:null
任务名称:审核
任务的创建时间:Thu Jul 07 10:21:27 GMT+08:00 2016
流程实例ID:167501
* */
}
/**候选者不一定真正的参与任务的办理,所以我们需要拾取任务,将组任务分配给个人任务,即指定任务办理人字段*/
@Test
public void cliam(){
//将组任务分配给个人任务
//任务ID
String taskId ="167504";
//分配的个人任务(可以是组任务中的成员,也可以是非组任务的成员)
String userId ="张三";
processEngine.getTaskService()
.claim(taskId, userId);
//当执行完之后查询正在执行的任务表(act_ru_task)可以发现ASSIGNEE_字段(指定任务办理人字段)值为'大F'
//此时任务就指定给了大F,在用小A或者下B等在去查个人组任务的话,就查询不出来任何任务【组任务最终也是需要指定一个人办理的,所以需要拾取任务】
}
/**张三完成任务*/
@Test
public void completeTask(){
String taskId ="167504";
processEngine.getTaskService()
.complete(taskId);
}
}
当我们部署完流程定义,启动流程实例之后,我们可以查看您一下几张数据表:
1、表act_ru_task
可以看见任务办理人的字段值为null,所以可能有两种情况可能没有办理人或者可能这个任务是组任务
2、表act_ru_identitylink 正在执行的任务办理人表
在这个表可以看见Task_ID 的值为167504就是正在执行的任务ID,流程实例字段为空,所以这个任务是组任务,处理这个组任务的角色ID为部门经理
而张三和李四都是这个角色的用户,所以张三李四都可以查到这个任务,也可以进行任务的拾取,分配等操作。
3、表 act_id_group 角色表
4、表 act_id_user 用户表
5、act_id_membership 用户角色关联表
需要说明的是在我们自己项目开发的时候,我们一般都是不用工作流自带的用户表、角色表,用户角色关联表
都是自己来建,因为自带的表提供的字段不全。