Activiti 学习笔记12:分配个人任务

article/2025/9/28 15:35:58

一、流程图

这里写图片描述

二、分配个人任务方式一(直接指定办理人)

1、流程图中任务节点的配置
这里写图片描述
2、测试代码

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//部署流程定义,启动流程实例@Testpublic void testTask() throws Exception {// 1 发布流程InputStream inputStreamBpmn = this.getClass().getResourceAsStream("taskProcess.bpmn");InputStream inputStreamPng = this.getClass().getResourceAsStream("taskProcess.png");processEngine.getRepositoryService()//.createDeployment()//.addInputStream("userTask.bpmn", inputStreamBpmn)//.addInputStream("userTask.png", inputStreamPng)//.deploy();// 2 启动流程//启动流程实例的同时,设置流程变量ProcessInstance pi = processEngine.getRuntimeService()//.startProcessInstanceByKey("taskProcess");System.out.println("pid:" + pi.getId());}//查询我的个人任务列表@Testpublic void findMyTaskList(){String userId = "张三丰";List<Task> list = processEngine.getTaskService()//.createTaskQuery()//.taskAssignee(userId)//指定个人任务查询.list();for(Task task:list ){System.out.println("id="+task.getId());System.out.println("name="+task.getName());System.out.println("assinee="+task.getAssignee());System.out.println("createTime="+task.getCreateTime());System.out.println("executionId="+task.getExecutionId());}}//完成任务@Testpublic void completeTask(){String taskId = "3209";processEngine.getTaskService()//.complete(taskId);//System.out.println("完成任务");}

3、说明
1) 张三丰是个人任务的办理人
2) 但是这样分配任务的办理人不够灵活,因为项目开发中任务的办理人不要放置XML文件中。

三、分配个人任务方式二(使用流程变量)

1、流程图中任务节点的配置
这里写图片描述
2、测试代码

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;public class TaskTest {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();/**部署流程定义(从inputStream)*/@Testpublic void deploymentProcessDefinition_inputStream(){InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");InputStream inputStreamPng = this.getClass().getResourceAsStream("task.png");Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service.createDeployment()//创建一个部署对象.name("任务")//添加部署的名称.addInputStream("task.bpmn", inputStreamBpmn)//.addInputStream("task.png", inputStreamPng)//.deploy();//完成部署System.out.println("部署ID:"+deployment.getId());//System.out.println("部署名称:"+deployment.getName());//}/**启动流程实例*/@Testpublic void startProcessInstance(){//流程定义的keyString processDefinitionKey = "task";/**启动流程实例的同时,设置流程变量,使用流程变量用来指定任务的办理人,对应task.pbmn文件中#{userID}*/Map<String, Object> variables = new HashMap<String, Object>();variables.put("userID", "周芷若");ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey,variables);//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动System.out.println("流程实例ID:"+pi.getId());//流程实例ID    101System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID   helloworld:1:4}/**查询当前人的个人任务*/@Testpublic void findMyPersonalTask(){String assignee = "周芷若";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("########################################################");}}}/**完成我的任务*/@Testpublic void completeMyPersonalTask(){//任务IDString taskId = "5505";processEngine.getTaskService()//与正在执行的任务管理相关的Service.complete(taskId);System.out.println("完成任务:任务ID:"+taskId);}
}

说明:
1) 周芷若是个人任务的办理人
2) 在开发中,可以在页面中指定下一个任务的办理人,通过流程变量设置下一个任务的办理人

四、分配个人任务方式三(使用类)

1、流程图中任务节点的配置
这里写图片描述
这里写图片描述
这里写图片描述
此时流程图的XML文件,如图:
这里写图片描述
2、TaskListenerImpl类,用来设置任务的办理人

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;@SuppressWarnings("serial")
public class TaskListenerImpl implements TaskListener {/**用来指定任务的办理人*/@Overridepublic void notify(DelegateTask delegateTask) {//指定个人任务的办理人,也可以指定组任务的办理人//个人任务:通过类去查询数据库,将下一个任务的办理人查询获取,然后通过setAssignee()的方法指定任务的办理人delegateTask.setAssignee("灭绝师太");}}

3、测试代码

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;public class TaskTest {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();/**部署流程定义(从inputStream)*/@Testpublic void deploymentProcessDefinition_inputStream(){InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");InputStream inputStreamPng = this.getClass().getResourceAsStream("task.png");Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service.createDeployment()//创建一个部署对象.name("任务")//添加部署的名称.addInputStream("task.bpmn", inputStreamBpmn)//.addInputStream("task.png", inputStreamPng)//.deploy();//完成部署System.out.println("部署ID:"+deployment.getId());//System.out.println("部署名称:"+deployment.getName());//}/**启动流程实例*/@Testpublic void startProcessInstance(){//流程定义的keyString processDefinitionKey = "task";ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service.startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动System.out.println("流程实例ID:"+pi.getId());//流程实例ID    101System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID   helloworld:1:4}/**查询当前人的个人任务*/@Testpublic void findMyPersonalTask(){String assignee = "张翠山";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("########################################################");}}}/**完成我的任务*/@Testpublic void completeMyPersonalTask(){//任务IDString taskId = "5804";processEngine.getTaskService()//与正在执行的任务管理相关的Service.complete(taskId);System.out.println("完成任务:任务ID:"+taskId);}//可以分配个人任务从一个人到另一个人(认领任务)@Testpublic void setAssigneeTask(){//任务IDString taskId = "5804";//指定的办理人String userId = "张翠山";processEngine.getTaskService()//.setAssignee(taskId, userId);}}

说明:
1) 在类中使用delegateTask.setAssignee(assignee);的方式分配个人任务的办理人,此时灭绝师太是下一个任务的办理人
2) 通过processEngine.getTaskService().setAssignee(taskId, userId);将个人任务从一个人分配给另一个人,此时灭绝师太不再是下一个任务的办理人,而换成了张翠山
3) 在开发中,可以将每一个任务的办理人规定好,例如张三的领导是李四,李四的领导是王五,这样张三提交任务,就可以查询出张三的领导是李四,通过类的方式设置下一个任务的办理人

五、小结

个人任务及三种分配方式:

  1. 在taskProcess.bpmn中直接写 assignee=“张三丰”
  2. 使用流程变量指定办理人
    在taskProcess.bpmn中写 assignee=“#{userID}”,变量的值要是String的。
  3. 使用TaskListener接口,要使类实现该接口,在类中定义:
delegateTask.setAssignee(assignee);// 指定个人任务的办理人

使用任务ID和办理人重新指定办理人:

 processEngine.getTaskService()//.setAssignee(taskId, userId);

演示代码下载:http://download.csdn.net/detail/xunzaosiyecao/9627675

本文部分内容整理自itcast讲义,在此表示感谢。
作者:jiankunking 出处:http://blog.csdn.net/jiankunking


http://chatgpt.dhexx.cn/article/1qpHVPNl.shtml

相关文章

分布式定时任务开源方案

目录 1、quartz1.1 架构1.2 优缺点 2、elastic-job2.1 架构2.2 优缺点 3、xxl-job3.1 架构3.2 优缺点 4、Saturn4.1 架构4.2 优缺点 5、antares5.1 架构5.2 优缺点 6、opencron6.1 优缺点 方案对比 1、quartz quartz的集群方案是使用数据库来实现的。通过在数据库中配置定时器…

做好目标管理和任务管理,提高办公协同效率

工作一段时间后&#xff0c;或者参与一个项目后&#xff0c;你会发现团队里每个人都非常优秀&#xff0c;工作也充满热情&#xff0c;但是整体的效率就是上不去&#xff1f;因为&#xff0c;一个团队的整体效率&#xff0c;并不是每个人效率的相加。因为这里面有协作成本。 如…

基于javaweb个人记账管理系统设计与实现(项目源码+论文+毕业设计任务书)

摘 要 随着互联网的快速发展&#xff0c;人们生活节奏日益加快&#xff0c;关于过度消费是大多数人头疼问题&#xff0c;导致出现不少的月光族&#xff0c;如我们定期花点时间去记录生活中的主要消费记录&#xff0c;掌握自己的收入和支出情况&#xff0c;这样你就会发现一些规…

计算机的任务管理器在哪,怎么打开任务管理器 多种方法详细教学

我们在使用电脑的过程中&#xff0c;任务管理器是我们经常会使用到的程序&#xff0c;可以在任务管理器里面查看所有正在服务的程序&#xff0c;还可以在任务管理器里面知道正在运行的有哪些服务于应用程序&#xff0c;同时我们也可以通过任务管理器来结束一些进程&#xff0c;…

《印象笔记留给你的空间》第5章 建立个人任务管理系统 / 第6章 记录你的人生轨迹

学习笔记内容来自&#xff1a; 《印象笔记留给你的空间-李参》 《用印象笔记做个人知识管理-李参个人成长课堂 》 第5章 建立个人任务管理系统 5.1关于任务管理 5.1.1任务的定义 5.1.2任务的组成 1.行动清单 2.参考资料 5.1.3任务管理的三个关注层面 工作流、经验库、…

12款适合小团队协作、任务管理和进度跟踪的在线任务管理的工具推荐?

国内外12款主流任务管理软件测评: 1.开发任务管理PingCode; 2.多合一项目任务管理Worktile;3.个人和小团队项目任务管理Notion; 4.企业任务管理平台SmartTask; 5.小团队任务管理Teambition;6.IT任务追踪管理Jira等。 无论是做好工作任务管理还是个人任务管理&#xff0c;从来都…

国内外最好用的9大工作任务管理软件

由于使用人群和需求的不同&#xff0c;对任务管理的功能要求也会有所差异&#xff0c;就比如个人任务管理和团队任务管理中&#xff0c;团队任务管理更注重协作功的打造&#xff0c;而这在个人任务管理中又很鸡肋。 再比如通用型项目的任务管理和软件项目的管理&#xff0c;通…

[工具]ToDoList-简单有效的个人任务管理器

原文地址为&#xff1a; [工具]ToDoList&#xff0d;简单有效的个人任务管理器 是否觉得日常工作很无序&#xff0c;经常工作杂乱无章&#xff0c;丢三落四&#xff0c;不能很好地控制每样工作的进度&#xff1f; (点击放大下图) 我一直在关注 ToDoList这个开源项目&#xf…

效率提升:用 Notion 实现个人任务管理监控

最近一直在找一款个人任务管理&#xff0c;并且可以进行任务完成情况实时监控统计的软件&#xff0c;但试了又试&#xff0c;一直没找到满意的&#xff0c;无意间在B站发现了别人用 Notion 做的仪表盘&#xff0c;很是满意心动&#xff0c;所以就打算先仿照着也弄一个。废话不多…

个人任务管理系统总结

1、数据库、三层架构相对熟练没有卡壳 2、UI层遇到问题如下&#xff1a; 单词记得不熟悉&#xff0c;系统没有提示就会有很多的卡&#xff08;style样式属性text-align: center冒号一直写成等于&#xff09; 优先级设置后台代码前台调用不会 //任务优先级后台代码 public st…

【Revit二次开发】单位转换

单位转换 Revit内部基本单位是英尺&#xff0c;我们需要进行单位转换 Revit2021和2020相比 单位的表示&#xff0c;由DisplayUnitType枚举字段表示&#xff0c;变成了UnitTypeId静态类的只读属性。 DisplayUnitType(int)——>UnitTypeId(ForgeTypeId) UnitUtils类&#xff…

【Revit二次开发】元素(Element)

图元与图元类型 元素 元素 元素(Element)也称图元 图元作为revit建模的基础&#xff0c;数量庞大&#xff0c;关系千丝万缕。先了解图元的分类&#xff0c;将会帮助我们整理思路&#xff0c;找到功能开发的关键点。 每一个人都可以按照自己的思路将图元进行分类。建模人员可以…

Revit二次开发——HelloRevitApp

HelloRevitApp 环境C#revit HelloRevitApp调试 环境 语言为C#&#xff0c;项目模板应为.Net Framework 类库&#xff0c;框架平台以Revit API 中的说明为准&#xff0c;Revit 2021 的要求选择.Net Framework 4.8。 C# Visual Studio 2019集成开发环境&#xff0c;框架版本.N…

【Revit二次开发】添加菜单和按钮

添加菜单和按钮 Ribbon实例 Ribbon菜单的创建以及各种不同的button Ribbon 这个类是PushButton和PulldownButton的基类。 按钮放在panel内&#xff0c;panel放在tab页内 在Revit API中&#xff0c;可以使用ExternalApplication类和ExternalCommand类来创建自定义菜单和按钮。…

【Revit二次开发】楼板、天花板、屋顶和洞口

介绍代码 介绍 Creates a slab within the project with the given horizontal profile using the default floor style. public Floor NewSlab(CurveArray profile,Level level,Line slopedArrow,double slope,bool isStructural )在Revit二次开发中&#xff0c;楼板、天花板…

Revit二次开发——选集

选集 选集用户选集过滤的用户选集 选集 选择图元后运行外部命令获取选择的内容 Revit API中定义了单选、多选、框选等方式的用户选集&#xff0c;用户可以十分方便的使用鼠标和键盘完成这三种方式的图元选择。Revit API根据三种用户选集各自的特点&#xff0c;封装了多种实现…

Revit二次开发——族的基础

族 族族编辑族实例 族 Revit将族分为系统族、内建族、标准构件族。 系统族&#xff1a;系统族是在 Autodesk Revit 中预定义的族&#xff0c;包含基本建筑构件&#xff0c;例如墙、窗和门。例如&#xff1a;基本墙系统族包含定义内墙、外墙、基础墙、常规墙和隔断墙样式的墙类…

Revit二次开发-CurveLoop的闭合处理

在Revit二次开发中&#xff0c;生成solid体块的时候&#xff0c;截面一般使用的CurveLoop这个数据结构。 笔者在使用CurveLoop的使用&#xff0c;给它Append某个几何的时候&#xff0c;老出异常捕获&#xff1a; XXXXXX. 英文不打了&#xff0c;就是不连续的意思。 查阅api发…

【Revit二次开发】族

族 族族实例族文档Revit API中族文档相关类族参数和族类型 族 Revit将族分为系统族、内建族、标准构件族。 Autodesk revit中的所有图元都是基于族的。 系统族&#xff1a;系统族是在 Autodesk Revit 中预定义的族&#xff0c;包含基本建筑构件&#xff0c;例如墙、窗和门。例…

Revit二次开发放样融合CreateSweptBlendGeometry

生成solid的放样融合接口为CreateSweptBlendGeometry&#xff0c;参数描述如下&#xff1a; 1&#xff09;Curve pathCurve&#xff1a;路径只要一个线 2&#xff09; IList<double> pathParams&#xff1a;数组大小和截面数组一样&#xff0c;作用是定位截面数组每个截…