Activiti流程实例管理
- /**
- * 1 启动流程
- * 当流程到达一个节点时,会在act_ru_execution表中产生1条数据
- * 如果当前节点是用户任务节点,这时会在act_ru_task表中产生1条数据(任务的办理人,任务的创建时间)
- */
- @Test
- public void startProcess() throws Exception {
- /**
- * v1 myProcess:2:604
- * v2 myProcess:3:704
- */
- // runtimeService.startProcessInstanceById(processDefinitionId)
- // 通过流程定义的key启动流程,会启动版本最高的流程
- ProcessInstance pi = runtimeService.startProcessInstanceByKey("LeaveFlow");
- System.out.println("pid:" + pi.getId() +",activitiId:" + pi.getActivityId());
- }
2、查看流程状态
- public void queryProcessState() throws Exception {
- String processInstanceId="1401";
- // 通过流程实例ID查询流程实例
- ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
- if(pi!=null){
- System.out.println("当前流程在:" + pi.getActivityId());
- }else{
- System.out.println("流程已结束!!");
- }
- }
3、查看公有任务
对指定用户的可接取的公共任务执行查询。
- public void queryCommonTask() throws Exception {
- // 创建任务查询对象
- TaskQuery taskQuery = taskService.createTaskQuery();
- // 配置查询对象
- String candidateUser="张三";
- taskQuery
- // 过滤条件
- .taskCandidateUser(candidateUser)
- // 分页条件
- // .listPage(firstResult, maxResults)
- // 排序条件
- .orderByTaskCreateTime().desc();
- // 执行查询
- List<Task> tasks = taskQuery.list();
- System.out.println("======================【"+candidateUser+"】的公共任务列表=================");
- for (Task task : tasks) {
- System.out.print("id:"+task.getId()+",");
- System.out.print("name:"+task.getName()+",");
- System.out.print("createTime:"+task.getCreateTime()+",");
- System.out.println("assignee:"+task.getAssignee());
- }
- }
说明:
1.查询任务首先使用TaskService创建TaskQuery对象
2.在查询对象上,添加taskCandidateUser过滤条件,代表过滤任务候 选者为自己的任务
3.调用list方法返回指定用户的可接任务列表
4.所有公共任务的assignee属性为空
4、查看私有任务
对指定用户的未完成的个人任务执行查询。
- public void queryPersonalTask() throws Exception {
- // 创建任务查询对象
- TaskQuery taskQuery = taskService.createTaskQuery();
- // 配置查询对象
- // String assignee="user";
- String assignee="李四";
- taskQuery
- // 过滤条件
- .taskAssignee(assignee)
- // 分页条件
- // .listPage(firstResult, maxResults)
- // 排序条件
- .orderByTaskCreateTime().desc();
- // 执行查询
- List<Task> tasks = taskQuery.list();
- System.out.println("======================【"+assignee+"】的代办任务列表=================");
- for (Task task : tasks) {
- System.out.print("id:"+task.getId()+",");
- System.out.print("name:"+task.getName()+",");
- System.out.print("createTime:"+task.getCreateTime()+",");
- System.out.println("assignee:"+task.getAssignee());
- }
- }
说明:
1) 因为是任务查询,所以从processEngine中应该得到TaskService
2) 使用TaskService获取到任务查询对象TaskQuery
3) 为查询对象添加查询过滤条件,使用taskAssignee指定任务的候选者(即查询指定用户的代办任务),添加分页排序等过滤条件
4) 调用list方法执行查询,返回办理者为指定用户的任务列表
5) 任务ID、名称、办理人、创建时间可以从act_ru_task表中查到。
6) Execution与ProcessInstance见5.6章节的介绍。在这种情况下,ProcessInstance相当于Execution
7) 如果assignee属性为部门经理,结果为空。因为现在流程只到了”填写请假申请”阶段,后面的任务还没有执行,即在数据库中没有部门经理可以办理的任务,所以查询不 到。
8) 一个Task节点和Execution节点是1对1的情况,在task对象中使用Execution_来标示他们之间的关系
9) 任务ID在数据库表act_ru_task中对应“ID_”列
5、认领任务
通常一个任务为公共任务任务都有一个以上的候选者,用户想要办理它应该先进行认领任务操作,即把自己变成任务的拥有者。
- public void takeTask() throws Exception {
- // claim 认领
- String taskId="1404";
- String userId="李四";
- // 让指定userId的用户认领指定taskId的任务
- taskService.claim(taskId, userId);
- System.out.println("认领操作完毕!!");
- }
说明:
1.任务相关操作,首先得到taskService
2.确定被认领的任务ID和认领人ID
3.调用taskService的claim(认领)方法,把公共任务变成指定用户的 私有任务
6、办理任务
- public void complete() throws Exception {
- String taskId = "1602";
- // 完成任务
- taskService.complete(taskId );
- }
说明:
1) 办理任务,从ProcessEngine得到的是TaskService。
2) 当执行完这段代码,再以员工的身份去执行查询的时候,会发现这个时候已经没有数据了。
3) 对于执行完的任务,activiti将从act_ru_task表中删除该任务,下一个任务会被插入进来。
4) 以”部门经理”的身份进行查询,可以查到结果。因为流程执行到部门经理审批这个节点了。
5) 再执行办理任务代码,执行完以后以”部门经理”身份进行查询,没有结果。
6) 重复第3和4步直到流程执行完。
7、验证流程已经结束
在流程执行的过程中,创建的流程实例ID在整个过程中都不会变,当流程结束后,流程实例将会被删除
说明:
1) 因为是查询流程实例,所以先获取runtimeService
2) 创建流程历史查询对象,设置实例ID过滤参数
3) 由于一个流程实例ID只对应一个实例,使用singleResult执行查询返回一个唯一的结果,如果结果数量大于1,则抛出异常
4) 判断指定ID的实例是否存在,如果结果为空,则代表流程结束,实例已被删除
Activiti流程实例管理的更多相关文章
- 工作流学习——Activiti流程实例、任务管理四步曲 (zhuan)
http://blog.csdn.net/zwk626542417/article/details/46646565 ***************************************** ...
- Activiti 流程实例、任务、执行对象及相关的表
一个流程中,流程实例只有一个,执行对象可以有多个(如果存在分支和聚合) SELECT * FROM activiti.act_ru_execution a; #正在执行的执行对象表 SELECT * ...
- 工作流学习——Activiti流程定义管理三步曲 (zhuan)
http://blog.csdn.net/zwk626542417/article/details/46602419 ***************************************** ...
- Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】
上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]- 管理流程定义 管理流程定义主要涉及到以下的4张表: -- 流程部署相关的表 SEL ...
- Activiti的流程实例及挂起激活(七)
1.1什么是流程实例 参与者(可以是用户也可以是程序)按照流程定义内容发起一个流程,这就是一个流程实例.是动态的.流程定义和流程实例的图解: 1.2启动流程实例 流程定义部署在 activiti 后, ...
- Activiti工作流学习(二)流程实例、执行对象、任务
一.前言 前面说明了基本的流程部署.定义,启动流程实例等基本操作,下面我们继续来学习流程实例.执行对象.任务. 二.流程实例.执行对象说明 整个Activiti的生命周期经过了如下的几个步骤: 1.流 ...
- Activiti的流程实例【ProcessInstance】与执行实例【Execution】
最近,我在做流程引擎Activiti相关的东西,刚开始时的一个知识点困扰了我许久,那就是Activiti的ProcessInstance与Execution的区别,这是一个Activiti的难点,能够 ...
- 从零开始学习和改造activiti流程引擎的13天,自己记录一下
day#1(11.13) 尝试通过spring boot 集成最新版activiti 7,但是苦于官方的文档基本为空,无法完成spring boot的配置,最终按照activiti 6的文档,手工初始 ...
- Springboot 整合Activiti流程设计器 完成一个简单的请假流程
目录 1.前言 2.准备 3.下载解压 4.开始整合 mysql + activiti + thymeleaf 2.配置文件 3.复制文件 4.加入控制器 5.修改配置文件 6.剔除启动类里面的安全校 ...
随机推荐
- CF774L Bars
题意:给你一个二进制表示是否可以吃巧克力.一共有k个巧克力,第一天和最后一天必须吃.最小化每两次吃巧克力的最大间隔? 标程: #include<bits/stdc++.h> using n ...
- ERROR 1872
解决 > start slave; ERROR (HY000): Slave failed to initialize relay log info structure from the rep ...
- 如何在VUE项目中使用SCSS
首先要了解什么是CSS 预处理器? SCSS是一种CSS预处理语言 定义了一种新的专门的编程语言,编译后形成正常的css文件,为css增加一些编程特性,无需考虑浏览器的兼容性(完全兼容css3),让c ...
- 一次完整的HTTP请求与响应涉及哪些知识?
Java技术栈 www.javastack.cn 优秀的Java技术公众号 作者:Ruheng 地址:http://www.jianshu.com/p/c1d6a294d3c0 本文以HTTP请求和响 ...
- JS规则 我还有其它用途( +号操作符)例如,算术操作符(+、-、*、/等),比较操作符(<、>、>=、<=等),逻辑操作符(&&、||、!)
我还有其它用途( +号操作符) 操作符是用于在JavaScript中指定一定动作的符号. (1)操作符 看下面这段JavaScript代码. sum = numa + numb; 其中的"= ...
- Qt连接sql server数据库遇到的问题
在QT中使用addDataBase添加一个数据库连接,其中第一个参数应该填入使用数据库驱动的类型,如QMYSQL.QSQLLITE.QSQLPSSQL等. QSqlDatabase QSqlD ...
- ThinkPHP无限分类模块设计
public function catelist(){ $cate=D('Cate'); //var_dump($cate->gettree());exit; $cateres=$cate-&g ...
- HTML-完美解决父子元素的外边距重叠和高度塌陷问题
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- CodeForces-510D
https://vjudge.net/problem/CodeForces-510D题目可以转化为花最小代价选一些数,然后这些数可以经过加减运算得到1或-1,不然1你就凑不出来,一旦凑出来1,其他的都 ...
- 使用log4j实现日志API
添加SLF4J依赖,用于提供日志API, 使用log4j作为实现 1.pom.xml添加SLF4J依赖 <!-- SLF4J --> <dependency> <grou ...