Activiti工作流进阶(十二)————工作流提供的用户角色

时间:2021-02-26 04:12:33

工作流提供的用户角色

一、设置用户角色

Activiti工作流进阶(十二)————工作流提供的用户角色

这个【部门经理】相当于一个用户角色,一个角色可以对应多个人,比如有三个人:张三、李四是部门经理,王五是总经理,

那我们可以把这三个人录入的我们自己的用户表中,那么工作流也给我们提供了至少三张表:用户表,角色表,用户角色关联表

那我们就可以把部门经理这个角色与张三、李四关联起来。

具体做法:

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

Activiti工作流进阶(十二)————工作流提供的用户角色

可以看见任务办理人的字段值为null,所以可能有两种情况可能没有办理人或者可能这个任务是组任务

2、表act_ru_identitylink   正在执行的任务办理人表

Activiti工作流进阶(十二)————工作流提供的用户角色

在这个表可以看见Task_ID 的值为167504就是正在执行的任务ID,流程实例字段为空,所以这个任务是组任务,处理这个组任务的角色ID为部门经理

而张三和李四都是这个角色的用户,所以张三李四都可以查到这个任务,也可以进行任务的拾取,分配等操作。

3、表 act_id_group          角色表

Activiti工作流进阶(十二)————工作流提供的用户角色
4、表 act_id_user           用户表

Activiti工作流进阶(十二)————工作流提供的用户角色

5、act_id_membership    用户角色关联表

Activiti工作流进阶(十二)————工作流提供的用户角色

需要说明的是在我们自己项目开发的时候,我们一般都是不用工作流自带的用户表、角色表,用户角色关联表

都是自己来建,因为自带的表提供的字段不全。