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   正在執行的任務辦理人表


在這個表可以看見Task_ID 的值爲167504就是正在執行的任務ID,流程實例字段爲空,所以這個任務是組任務,處理這個組任務的角色ID爲部門經理

而張三和李四都是這個角色的用戶,所以張三李四都可以查到這個任務,也可以進行任務的拾取,分配等操作。

3、表 act_id_group          角色表


4、表 act_id_user           用戶表


5、act_id_membership    用戶角色關聯表


需要說明的是在我們自己項目開發的時候,我們一般都是不用工作流自帶的用戶表、角色表,用戶角色關聯表

都是自己來建,因爲自帶的表提供的字段不全。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章