Activiti6自学之路(七)——个人任务和组任务
Activiti6 任务有个人任务和组任务之分,理解两者的区别并且知道如何操作对应的任务是学习activiti重要一步。
本章承接上文章节,这里就不详细描述了
一、个人任务与组任务区别
个人任务:流程中的某个任务由指定的user来执行
组任务:流程中的某个任务由指定的group来完成,其中group由多个user组成
实例分析
1、填写请假申请任务:个人任务,比如张三提交请假申请
2、总监审批任务:组任务,这里我简单将总监理解为另一组权限的用户,不和实际意义相关;如 张三提交了请假申请后,总监一、和总监二都具有审批的权限,并且组任务中只要有一人审批了申请,组任务代表完成了,进入了下一个节点
3、经理审批:同2;
4、人力资源审核:同2
二、创建个人任务的三种方式
分配个人任务的三种方式
1、直接指定办理人
选择Main config 可以配置Assignee,可以指定一个用户来执行该任务,但是一般实际项目开发不会这么做,这样分配任务的办理人不够灵活,因为项目开发中任务的办理人不要放置XML文件中。
直接启动流程实例即可
//9、启动流程实例@RequestMapping("/startProcessInstance") public void startProcessInstance() {// 流程定义的KeyString processDefinitionKey = "myProcess";ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 }
启动程序,执行启动流程实例方法startProcessInstance()
流程启动后,会操作如下表
act_ru_execution:执行流程实例表,核心,启动后会生成一个流程实例和待执行的任务节点
act_ru_task:用户任务表,待执行的任务
act_ru_identitylink:用户身份关系表,存储待执行任务的用户关系
act_hi_taskinst:历史用户任务表,存储所有已执行或待执行的用户任务历史
act_hi_procinst:历史流程实例表,存储流程实例
act_hi_actinst:历史活动节点表,存储所有已执行的节点(各类节点)
act_hi_identitylink:历史用户身份关系表,历史用户任务的关系表
2、使用流程变量
使用动态的流程变量${userId} 来代替静态指定用户。
//10、启动流程实例--使用流程变量 userId@RequestMapping("/startProcessInstance2") public void startProcessInstance2() {// 流程定义的KeyString processDefinitionKey = "myProcess";Map<String, Object> variables = new HashMap<String, Object>();variables.put("userId", "user1");//这里传入id为user1的用户ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey,variables);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 }
3、使用监听类
流程图中任务节点的配置
Main config不作任何配置
选择Listeners ,选择TaskListenerImp监听类
package com.springboot.activiti.eimm.leave.controller;import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;public class TaskListenerImpl implements TaskListener {private static final long serialVersionUID = 1L;/*** 用来指定任务的办理人*/@Overridepublic void notify(DelegateTask delegateTask) {//指定个人任务的办理人,也可以指定组任务的办理人//通过类去查询数据库,将下一个任务的办理人查询获取,然后通过setAssignee()的方法指定任务办理人delegateTask.setAssignee("user1");}}
//11、启动流程实例--使用监听类@RequestMapping("/startProcessInstance3") public void startProcessInstance3() {// 流程定义的KeyString processDefinitionKey = "myProcess";ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 }
执行程序即可
三、查询当前人的个人任务
@RequestMapping("/findMyPersonalTask") public void findMyPersonalTask(){String assignee = "user1";List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service.createTaskQuery()//创建任务查询对象/**查询条件(where部分)*/.taskAssignee(assignee)//指定个人任务查询,指定办理人
// .taskCandidateUser(candidateUser)//组任务的办理人查询
// .processDefinitionId(processDefinitionId)//使用流程定义ID查询
// .processInstanceId(processInstanceId)//使用流程实例ID查询
// .executionId(executionId)//使用执行对象ID查询/**排序*/.orderByTaskCreateTime().asc()//使用创建时间的升序排列/**返回结果集*/
// .singleResult()//返回惟一结果集
// .count()//返回结果集的数量
// .listPage(firstResult, maxResults);//分页查询.list();//返回列表if(list!=null && list.size()>0){for(Task task:list){System.out.println("任务ID:"+task.getId());System.out.println("任务名称:"+task.getName());System.out.println("任务的创建时间:"+task.getCreateTime());System.out.println("任务的办理人:"+task.getAssignee());System.out.println("流程实例ID:"+task.getProcessInstanceId());System.out.println("执行对象ID:"+task.getExecutionId());System.out.println("流程定义ID:"+task.getProcessDefinitionId());System.out.println("########################################################");}}}
四、完成个人任务
上面我们创建了个人任务,所有需要完成当前节点的任务,流程才会自动进入下一节点
前面我们已经启动了流程实例,并且设置了所让人Assignee为user1用户,
查看act_ru_task 代运行的任务中发现任务id为15,
//13、完成我的任务@RequestMapping("/completeMyPersonalTask")public void completeMyPersonalTask() {// 任务IDString taskId = "15";//完成任务的同时,设置流程变量,根据流程变量的结果来节点进入哪一个节点任务Map<String, Object> args = new HashMap<>();args.put("time", 2);processEngine.getTaskService()// 与正在执行的任务管理相关的Service.complete(taskId,args);System.out.println("完成任务:任务ID:" + taskId);
这里设置表单变量submitTime=2,根据流程图分支条件知,流程会自动到经理审批任务节点处。
执行程序后,控制台输出
数据表数据更新
act_ru_execution 所标识的数据更新为usertask3,也就是经理审批任务
act_ru_task 待执行任务也变为经理审批
五、创建组任务
创建组任务有多种方式
1、静态配置候选人成员,可以配置一个或多个,多个用户用逗号分隔即可
@RequestMapping("/startProcessInstance1") public void startProcessInstance1() {// 流程定义的KeyString processDefinitionKey = "myProcess";ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 }
启动程序即可
2、使用动态变量配置候选人成员
//10、启动流程实例--使用流程变量 userId和userId3@RequestMapping("/startProcessInstance4") public void startProcessInstance4() {// 流程定义的KeyString processDefinitionKey = "myProcess";Map<String, Object> variables = new HashMap<String, Object>();variables.put("userId", "user1");//这里传入id为user1的用户variables.put("userId3", "user2,user3");//这里可以传入多个用户ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey,variables);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 }
3、使用监听类来实现
方法和创建个人任务监听类是一个道理,只是可以添加一个或多个用户
4、配置候选人组来实现
创建候选人中 group3, 对应act_id_group中经理组,表示经理组中的用户都具有【经理审批】任务权限
//10、启动流程实例--使用流程变量 userId@RequestMapping("/startProcessInstance2") public void startProcessInstance2() {// 流程定义的KeyString processDefinitionKey = "myProcess";Map<String, Object> variables = new HashMap<String, Object>();variables.put("userId", "user1");//这里传入id为user1的用户ProcessInstance processInstance = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey,variables);// 使用流程定义的key启动流程实例,key对应leave.bpmn文件中id的属性System.out.println("流程实例ID:" + processInstance.getId());// 流程实例ID: System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());// 流 }
其它步骤一样。
六、查询当前人的组任务
//14、查询当前人的组任务@RequestMapping("/findMyGroupTask") public void findMyGroupTask() {String candidateUser = "user2";List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的Service.createTaskQuery()// 创建任务查询对象/** 查询条件(where部分) */.taskCandidateUser(candidateUser)// 组任务的办理人查询/** 排序 */.orderByTaskCreateTime().asc()// 使用创建时间的升序排列/** 返回结果集 */.list();// 返回列表if (list != null && list.size() > 0) {for (Task task : list) {System.out.println("任务ID:" + task.getId());System.out.println("任务名称:" + task.getName());System.out.println("任务的创建时间:" + task.getCreateTime());System.out.println("任务的办理人:" + task.getAssignee());System.out.println("流程实例ID:" + task.getProcessInstanceId());System.out.println("执行对象ID:" + task.getExecutionId());System.out.println("流程定义ID:" + task.getProcessDefinitionId());System.out.println("########################################################");}}}
七、查询组用户的任务
@RequestMapping("/findPersonalTask") public void findPersonalTask(){String candidateUser = "user2";List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service.createTaskQuery()//创建任务查询对象/**查询条件(where部分)*///.taskAssignee(assignee)//指定个人任务查询,指定办理人.taskCandidateUser(candidateUser)//组任务的办理人查询
// .processDefinitionId(processDefinitionId)//使用流程定义ID查询
// .processInstanceId(processInstanceId)//使用流程实例ID查询
// .executionId(executionId)//使用执行对象ID查询/**排序*/.orderByTaskCreateTime().asc()//使用创建时间的升序排列/**返回结果集*/
// .singleResult()//返回惟一结果集
// .count()//返回结果集的数量
// .listPage(firstResult, maxResults);//分页查询.list();//返回列表if(list!=null && list.size()>0){for(Task task:list){System.out.println("任务ID:"+task.getId());System.out.println("任务名称:"+task.getName());System.out.println("任务的创建时间:"+task.getCreateTime());System.out.println("任务的办理人:"+task.getAssignee());System.out.println("流程实例ID:"+task.getProcessInstanceId());System.out.println("执行对象ID:"+task.getExecutionId());System.out.println("流程定义ID:"+task.getProcessDefinitionId());System.out.println("########################################################");}}}
如果你觉得本篇文章对你有所帮助的话,麻烦请点击头像右边的关注按钮,谢谢!
技术在交流中进步,知识在分享中传播
Activiti6自学之路(七)——个人任务和组任务相关推荐
- JAVA自学之路 七:路线图明细
[原创 - 尚学堂科技 - 马士兵老师] JAVA自学之路 七:路线图明细 [转载请注明出处:http://www.bjsxt.com/zixue/zixuezhilu_7.html] 下面给出第二节 ...
- 自学之路——七年之痒 ----------BY小生我怕怕前辈
呵呵!都凌晨了,一夜没睡!看了一夜小甲鱼的视频!突然内心有一些话,想和大家分享下,都是自己走过的路,自己的心理话,希望能给予大家一些启示! <七年之痒--之引子前序> ...
- 自学之路——七年之痒 ----------BY小生我怕怕前辈
呵呵!都凌晨了,一夜没睡!看了一夜小甲鱼的视频!突然内心有一些话,想和大家分享下,都是自己走过的路,自己的心理话,希望能给予大家一些启示! <七年之痒--之引子前序> ...
- C语言自学之路七(函数(重点)详解)
本文所结合图书及视频 <C语言程序设计(第四版)谭浩强.pdf> <C语言入门到精通-鹏哥带你C语言从入门到精通> <郝斌老师的C语言自学视频> 这些在B站上都能找 ...
- Activiti6自学之路(六)——Activiti中用户与用户组
Activiti中内置了一套用户.用户组关系,以及对它们的操作API.关于用户和用户组表工业四张,如下图 一.用户与用户组表的介绍 1.ACT_ID_USER(用户信息表) 2.ACT_ID_INFO ...
- Activiti6自学之路(十)——编码实现请假审批流程(完整过程)
前面章节我们已经了解了Activiti6的用法和功能,做了与springboot的整合工作, 根据我们前面创建了流程图,现在我们通过实际编码来实现整个过程! 以下是请假审批流程图 一.启动spring ...
- Activiti6自学之路(八)——查看流程图
前面章节我们已经设计了流程图和执行了流程图任务.比如张三填写了请假申请后,如果想要知道现在流程已经到哪里了,处理进度怎么样,哪怎么实现了.Activiti提供了查看流程图功能,可以看到指定流程进度 / ...
- Activiti6自学之路(五)—— 部署流程资源的四种方式及数据库表更新情况
创建了流程图资源后, 一般我们需要对创建的资源如(leave.bpmn.leave.png)进行部署,部署方式我这里列出四种方式,前三种为单个流程资源的部署,第四种方式可以同时部署多个流程资源. 一. ...
- Activiti6自学之路(九)——请假申请和请假审批数据库表设计
一.请假申请流程图回顾 前面我们设计了请流程审批的流程图,并且完成了流程图任务分配等功能, 上述的流程图具有四个任务节点 1.填写请假申请 2.经理审批 3.总监审批 4.人力资源审批 二.Activ ...
最新文章
- 2021年两院增选149名院士:最小45岁,浙大5人入选
- Instruments of Xcode
- 某都计算机考研计算机组成原理,东北大学2000年考研真题-计算机组成原理
- 【Android架构师java原理详解】二;反射原理及动态代理模式
- Laravel API记录
- SHE PWM的simulink仿真谐波分析
- jQuery Mobile页面返回无需重新get
- QEMU/KVM原理概述
- [转]C#利用委托跨线程更新UI数据
- 差分隐私 机器学习_微软发布多个建置可信AI的问责机器学习工具
- 文件夹的最小化时,上面的名字。
- JavaScript getBoundingClientRect()
- 使用Jenkins的任务自动跑脚本后发现,服务没有起来
- android 按钮换行_自定义Android自动换行的布局
- 将Excel数据批量导入到数据库(项目案例)
- 详述 PROCEDURES_ICD 患者手术情况表 (七)
- 聚合物/硅胶色谱填粒径1.7μm到50μm
- 没有稿酬,混了这么多年-文艺it工程师自白(写于2014年)
- 利用CK11N改标准价格需要注意的地方
- 怎样批量查询顺心捷达单号信息并分析是否延误