Activiti5 学习笔记(五)—— userTask任务分配
个人任务
个人任务指某个任务就只能被一个人查看,前面的学习都是在流程图中指定assignee属性值的。实际开发中,肯定不会是这样的。以下我们来学习如何动态的指定办理人。
1. 通过流程变量指定办理人
启动流程实例
String processDefinitionKey = "personalTask";
Map<String, Object> variables = new HashMap<>();
variables.put("assignee", "张三"); //设置流程变量
ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey,variables);
查询张三的任务
String userId = "张三";
List<Task> list = processEngine.getTaskService()//.createTaskQuery().taskAssignee(userId) //where 办理人字段=张三.orderByTaskCreateTime().desc() //按任务创建时间倒序排列.list();
张三完成任务
String taskId = "2505";
Map<String, Object> variables = new HashMap<>();
variables.put("assignee", "李四"); //设置下一个办理人
processEngine.getTaskService().complete(taskId,variables);
李四完成任务
2. 通过监听器指定办理人
为任务节点添加create事件的监听类,通过delegateTask设置办理人
//监听类,省略部分代码,监听器的使用请查询我前面的例子
public void notify(DelegateTask delegateTask) {delegateTask.setAssignee("张三");}
3. 修改办理人
String taskId = "15004"; //需要知道任务id
String userId = "王五"; //修改任务办理人为王五
TaskService taskService = processEngine.getTaskService();
taskService.setAssignee(taskId, userId); //无须关系原办理人是否存在,调用setAssignee就能修改
多用户任务
多用户任务就是一个任务多个人可以查看,但是最终处理任务的人只有一个。
1. 使用流程变量指定多个办理人
启动流程实例
String processDefinitionKey = "personalTask2";
Map<String, Object> variables = new HashMap<>();
variables.put("users", "张三,李四,王五"); //设置多个任务办理人,以逗号分隔
ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey,variables);
多用户查询自己的任务
String candidateUser = "张三"; //候选人,张三、李四、王五都可以查到任务
List<Task> list = processEngine.getTaskService()//.createTaskQuery()//.taskAssignee(assignee) 这时候不能用Assignee,查不到的.taskCandidateUser(candidateUser) //where 候选人=张三.orderByTaskCreateTime().desc() //按任务创建时间倒序排列.list();for (Task task : list) {System.out.println("任务名称:" + task.getName());System.out.println("办理人:" + task.getAssignee());
}
查询正在执行多用户任务的人员名单
String taskId = "5005"; //使用任务id查候选人列表
List<IdentityLink> list = processEngine.getTaskService().getIdentityLinksForTask(taskId);
//使用实例id查参与者列表
//List<IdentityLink> list = processEngine.getRuntimeService().getIdentityLinksForProcessInstance(instanceId);
for(IdentityLink identityLink:list ){System.out.println("userid="+identityLink.getUserId());
}
查询历史多用户任务的人员名单
String taskId = "5005";
List<HistoricIdentityLink> list = processEngine.getHistoryService().getHistoricIdentityLinksForTask(taskId);
//List<HistoricIdentityLink> list = processEngine.getHistoryService().getHistoricIdentityLinksForProcessInstance(processInstanceId);
for(HistoricIdentityLink identityLink:list ){System.out.println("userId="+identityLink.getUserId());
}
拾取任务,简单的说就是指定真正的办理人,由多用户任务变为个人任务
String taskId = "5005";
String userId = "马龙"; //由马龙处理,这里可以指定任何人处理,并非一定是原名单内的人
processEngine.getTaskService().claim(taskId, userId);
拾取任务后,一旦assignee字段有值后,张三、李四、王五就不会再查到该条任务了
如何恢复多用户任务?
String taskId = "5005";
TaskService taskService = processEngine.getTaskService();
taskService.setAssignee(taskId, null); //将个人任务恢复到多用户任务//这里不再演示了,知道就好
马龙完成任务
String taskId = "5005";
Map<String, Object> variables = new HashMap<>();
variables.put("users", "赵发,陈单"); //设置下一个组办理人
processEngine.getTaskService().complete(taskId,variables);
重复上述步骤直到完成
最终act_ru_task、act_ru_identitylink表无记录,act_hi_identitylink会记录历史
2.使用监听器设置组任务
为任务节点添加create事件的监听类,通过delegateTask设置组候选人
//监听类,省略部分代码,监听器的使用请查询我前面的例子public void notify(DelegateTask delegateTask) {delegateTask.addCandidateUser("张三");delegateTask.addCandidateUser("李四");delegateTask.addCandidateUser("王五");}
组任务(角色)
某一个审批任务节点可以分配一个组,然后属于这个组的任何一个用户都可以去完成这个任务节点的审批。在activiti的数据表中,有4张表结构是为组任务设计的,用户表、用户信息表、用户组表、用户和角色关系表。在实际开发中一般用的是自己的一套用户角色体系,这里以两种不同的场景,演示如何使用组任务。
场景一:使用activiti自带的用户体系创建组任务
1.部署流程定义
Deployment deployment = processEngine.getRepositoryService().createDeployment().name("groupTaskDemo").addClasspathResource("diagrams/groupTask.bpmn").deploy();IdentityService identityService = processEngine.getIdentityService(); //使用用户身份相关的ServiceidentityService.saveGroup(new GroupEntity("部门经理")); //创建组,对应数据表act_id_group//创建用户,对应数据表act_id_user
identityService.saveUser(new UserEntity("张三"));
identityService.saveUser(new UserEntity("李四"));
identityService.saveUser(new UserEntity("王五"));identityService.createMembership("李四", "部门经理"); //创建用户和组的关系,对应数据表act_id_membership
2.启动流程实例
//省略启动代码,启动后的数据表如下
3.查询任务
String candidateUser = "李四"; //候选人
List<Task> list = processEngine.getTaskService().createTaskQuery()//由于我们已经插入了用户与组的关系,所以使用api查询时,会进行任务、组、用户之间的关联查询.taskCandidateUser(candidateUser) .orderByTaskCreateTime().asc().list();
4.拾取任务
String taskId = "2504";
String userId = "李四";
processEngine.getTaskService().claim(taskId, userId); //只要不是个人任务都需要拾取任务
5.完成任务(省略代码)
场景二:使用我们自己的角色创建组任务(还是同一个流程图的设置)
1.部署流程定义
Deployment deployment = processEngine.getRepositoryService().createDeployment().name("groupTaskDemo").addClasspathResource("diagrams/groupTask.bpmn").deploy();//不需要插入act_id_group等表的数据
2.启动流程实例
//省略启动代码
3.查询任务
String processInstanceId = "2501"; //根据实例id查询,这里可以根据应用系统自己的用户角色判断,谁拥有查询权限
Task task = processEngine.getTaskService().createTaskQuery().processInstanceId(processInstanceId).taskCandidateGroup("部门经理") //这里换成按组查询.taskDefinitionKey("usertask1") //对应流程图中节点的id值.active() //这个是状态,对应act_ru_task.SUSPENSION_STATE_,有两个值,活跃或暂停,根据实际情况带不带这个值查询.singleResult();
4.拾取任务、完成任务......(省略代码类同,不再演示)
Activiti5 学习笔记(五)—— userTask任务分配相关推荐
- python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用
本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...
- Ethernet/IP 学习笔记五
Ethernet/IP 学习笔记五 Accessing data within a device using a non-time critical message (an explicit mess ...
- StackExchange.Redis学习笔记(五) 发布和订阅
StackExchange.Redis学习笔记(五) 发布和订阅 原文:StackExchange.Redis学习笔记(五) 发布和订阅 Redis命令中的Pub/Sub Redis在 2.0之后的版 ...
- 吴恩达《机器学习》学习笔记五——逻辑回归
吴恩达<机器学习>学习笔记五--逻辑回归 一. 分类(classification) 1.定义 2.阈值 二. 逻辑(logistic)回归假设函数 1.假设的表达式 2.假设表达式的意义 ...
- 好程序员教程分析Vue学习笔记五
好程序员教程分析Vue学习笔记五,上次我们学习了Vue的组件,这次我们来学习一下路由的使用.在Vue中,所谓的路由其实跟其他的框架中的路由的概念差不多,即指跳转的路径. 注意:在Vue中,要使用路由, ...
- 【AngularJs学习笔记五】AngularJS从构建项目开始
为什么80%的码农都做不了架构师?>>> #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...
- ROS学习笔记五:理解ROS topics
ROS学习笔记五:理解ROS topics 本节主要介绍ROS topics并且使用rostopic和rqt_plot命令行工具. 例子展示 roscore 首先运行roscore系列服务,这是使用R ...
- Spring Boot 框架学习笔记(五)( SpringSecurity安全框架 )
Spring Boot 框架学习笔记(五) SpringSecurity安全框架 概述 作用 开发示例: 1. 新建项目 2. 引入依赖 3. 编写`SecurityConfig`类,实现认证,授权, ...
- Java学习笔记(五):一张图总结完JVM8基础概念
Java学习笔记(五):一张图总结完JVM8基础概念 引文 最近在学习JVM的相关内容,好不容易把基础概念全部都学了一遍,却发现知识网络是零零散散的.迫不得已,只好再来一次总的归纳总结.为了更好的理解 ...
- Python学习笔记五:控制语句
Python学习笔记五:控制语句 Pycharm 开发环境的下载安装配置_项目管理 控制语句 Pycharm 开发环境的使用 Pycharm 下载和安装 激活和选择不同UI 风格 创建项目和初始化配置 ...
最新文章
- evo-评估SLAM轨迹
- Centos6安装SaltStack
- HDU 2079 选课时间(题目已修改,注意读题) 母函数 || 多重背包
- python都学什么啊-你们都是怎么学 Python 的?
- CTF基础理论知识02
- CSS3--5.颜色属性
- 突发!哈佛要求本科生5天内搬走,国际学生恐无家可归
- php怎么给接口里的方法传参,PHP接口中方法的参数和实现类方法中的参数可以不一致的问题...
- rmi反序列化导致rce漏洞修复_企业安全05-Fastjson =1.2.47反序列化RCE漏洞(CNVD-2019-22238)...
- Netty工作笔记0054---EventLoop组件
- 刀片 显卡 排行_沈阳家政连锁公司前十名排行榜
- BSGS-BabyStepGiantStep算法+拓展
- 我的第一次--我与51CTO的故事
- 毕设题目:Matlab心电信号
- CSDN的markdown编辑器详细使用说明、语法快速索引手册
- 基于java的论文查重系统设计
- android后台定时执行任务,后台执行的定时任务
- Android Studio高级使用技巧
- w3c html 检验器,如何在W3C验证器中验证HTML时获取徽章?
- 数据解读为什么流量明星不灵了