工作流提供的用户角色
一、设置用户角色
这个【部门经理】相当于一个用户角色,一个角色可以对应多个人,比如有三个人:张三、李四是部门经理,王五是总经理,
那我们可以把这三个人录入的我们自己的用户表中,那么工作流也给我们提供了至少三张表:用户表,角色表,用户角色关联表
那我们就可以把部门经理这个角色与张三、李四关联起来。
具体做法:
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 用户角色关联表
需要说明的是在我们自己项目开发的时候,我们一般都是不用工作流自带的用户表、角色表,用户角色关联表
都是自己来建,因为自带的表提供的字段不全。