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自学之路(七)——个人任务和组任务相关推荐

  1. JAVA自学之路 七:路线图明细

    [原创 - 尚学堂科技 - 马士兵老师] JAVA自学之路 七:路线图明细 [转载请注明出处:http://www.bjsxt.com/zixue/zixuezhilu_7.html] 下面给出第二节 ...

  2. 自学之路——七年之痒 ----------BY小生我怕怕前辈

    呵呵!都凌晨了,一夜没睡!看了一夜小甲鱼的视频!突然内心有一些话,想和大家分享下,都是自己走过的路,自己的心理话,希望能给予大家一些启示!          <七年之痒--之引子前序>   ...

  3. 自学之路——七年之痒 ----------BY小生我怕怕前辈

    呵呵!都凌晨了,一夜没睡!看了一夜小甲鱼的视频!突然内心有一些话,想和大家分享下,都是自己走过的路,自己的心理话,希望能给予大家一些启示!          <七年之痒--之引子前序>   ...

  4. C语言自学之路七(函数(重点)详解)

    本文所结合图书及视频 <C语言程序设计(第四版)谭浩强.pdf> <C语言入门到精通-鹏哥带你C语言从入门到精通> <郝斌老师的C语言自学视频> 这些在B站上都能找 ...

  5. Activiti6自学之路(六)——Activiti中用户与用户组

    Activiti中内置了一套用户.用户组关系,以及对它们的操作API.关于用户和用户组表工业四张,如下图 一.用户与用户组表的介绍 1.ACT_ID_USER(用户信息表) 2.ACT_ID_INFO ...

  6. Activiti6自学之路(十)——编码实现请假审批流程(完整过程)

    前面章节我们已经了解了Activiti6的用法和功能,做了与springboot的整合工作, 根据我们前面创建了流程图,现在我们通过实际编码来实现整个过程! 以下是请假审批流程图 一.启动spring ...

  7. Activiti6自学之路(八)——查看流程图

    前面章节我们已经设计了流程图和执行了流程图任务.比如张三填写了请假申请后,如果想要知道现在流程已经到哪里了,处理进度怎么样,哪怎么实现了.Activiti提供了查看流程图功能,可以看到指定流程进度 / ...

  8. Activiti6自学之路(五)—— 部署流程资源的四种方式及数据库表更新情况

    创建了流程图资源后, 一般我们需要对创建的资源如(leave.bpmn.leave.png)进行部署,部署方式我这里列出四种方式,前三种为单个流程资源的部署,第四种方式可以同时部署多个流程资源. 一. ...

  9. Activiti6自学之路(九)——请假申请和请假审批数据库表设计

    一.请假申请流程图回顾 前面我们设计了请流程审批的流程图,并且完成了流程图任务分配等功能, 上述的流程图具有四个任务节点 1.填写请假申请 2.经理审批 3.总监审批 4.人力资源审批 二.Activ ...

最新文章

  1. 2021年两院增选149名院士:最小45岁,浙大5人入选
  2. Instruments of Xcode
  3. 某都计算机考研计算机组成原理,东北大学2000年考研真题-计算机组成原理
  4. 【Android架构师java原理详解】二;反射原理及动态代理模式
  5. Laravel API记录
  6. SHE PWM的simulink仿真谐波分析
  7. jQuery Mobile页面返回无需重新get
  8. QEMU/KVM原理概述
  9. [转]C#利用委托跨线程更新UI数据
  10. 差分隐私 机器学习_微软发布多个建置可信AI的问责机器学习工具
  11. 文件夹的最小化时,上面的名字。
  12. JavaScript getBoundingClientRect()
  13. 使用Jenkins的任务自动跑脚本后发现,服务没有起来
  14. android 按钮换行_自定义Android自动换行的布局
  15. 将Excel数据批量导入到数据库(项目案例)
  16. 详述 PROCEDURES_ICD 患者手术情况表 (七)
  17. 聚合物/硅胶色谱填粒径1.7μm到50μm
  18. 没有稿酬,混了这么多年-文艺it工程师自白(写于2014年)
  19. 利用CK11N改标准价格需要注意的地方
  20. 怎样批量查询顺心捷达单号信息并分析是否延误

热门文章

  1. 记2019GMA广州魔术交流会
  2. 物镜PHP,LUCPLFLN20X奥林巴斯物镜
  3. 新思科技助力奥林巴斯业务部门改进开源治理
  4. 【软件推荐】第1节:Micorsoft To Do
  5. ffmpeg常用滤镜命令
  6. STM32传感器外设集 -- 蓝牙(HC-05)+超声波(hc-sr04)
  7. 完整解密授权,全模块
  8. Spring Cloud在中小型项目中的应用
  9. 为什么选择微服务架构? 微服务架构的10个核心优势 总结
  10. 比微信小程序早出发的PWA