工作流提供的用戶角色
一、設置用戶角色
這個【部門經理】相當於一個用戶角色,一個角色可以對應多個人,比如有三個人:張三、李四是部門經理,王五是總經理,
那我們可以把這三個人錄入的我們自己的用戶表中,那麼工作流也給我們提供了至少三張表:用戶表,角色表,用戶角色關聯表
那我們就可以把部門經理這個角色與張三、李四關聯起來。
具體做法:
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 用戶角色關聯表
需要說明的是在我們自己項目開發的時候,我們一般都是不用工作流自帶的用戶表、角色表,用戶角色關聯表
都是自己來建,因爲自帶的表提供的字段不全。