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


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

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

Activiti工作流进阶(十二)————工作流提供的用户角色_第1张图片

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

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

3、表 act_id_group          角色表


4、表 act_id_user           用户表


5、act_id_membership    用户角色关联表


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

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

你可能感兴趣的:(Activiti工作流进阶(十二)————工作流提供的用户角色)