转自:http://profound-accumulation.iteye.com/blog/2244881

一、流程图


  二、部署流程定义

/**部署请假流程(从zip)*/  @Test  public void deploymentProcessDefinition_zip(){  InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/leave.zip");  ZipInputStream zipInputStream = new ZipInputStream(in);  Deployment deployment = processEngine.getRepositoryService()/**与请假流程和部署对象相关的Service*/  .createDeployment()/**创建一个部署对象*/  .name("请假流程")/**添加部署的名称*/  .addZipInputStream(zipInputStream)/**指定zip格式的文件完成部署*/  .deploy();/**完成部署*/  /** * 部署ID:1 * 部署名称:请假流程 */  System.out.println("部署ID:"+deployment.getId());//  System.out.println("部署名称:"+deployment.getName());//  }  

三、启动流程实例

/**启动流程实例*/  @Test  public void startProcessInstance(){  /**请假流程的key*/  String processDefinitionKey = "leave";  ProcessInstance pi = processEngine.getRuntimeService()/**与正在执行的流程实例和执行对象相关的Service*/  .startProcessInstanceByKey(processDefinitionKey);/**使用请假流程的key启动流程实例,key对应leave.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的请假流程启动*/  /** * 流程实例ID:101 * 请假流程ID:leave:1:4 */  System.out.println("流程实例ID:"+pi.getId());  System.out.println("请假流程ID:"+pi.getProcessDefinitionId());  }  

说明:
1)操作数据库的act_ru_execution表,如果是用户任务节点,同时也会在act_ru_task添加一条记录

四、查询我的个人任务

  /**查询当前人的个人任务:查询act_ru_task表信息*/  @Test  public void findMyPersonalTask(){  /** * 任务ID:104 * 任务名称:提交申请 */  //String assignee = "张三";  /** * 任务ID:202 * 任务名称:审批【部门经理】 */  //String assignee = "李四";  /** * 任务ID:302 * 任务名称:审批【总经理】 */  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("########################################################");  }  }  }  

说明:
1)因为是任务查询,所以从processEngine中应该得到TaskService
2)使用TaskService获取到任务查询对象TaskQuery
3)为查询对象添加查询过滤条件,使用taskAssignee指定任务的办理者(即查询指定用户的代办任务),同时可以添加分页排序等过滤条件
4)调用list方法执行查询,返回办理者为指定用户的任务列表
5)任务ID、名称、办理人、创建时间可以从act_ru_task表中查到。
6)Execution与ProcessInstance稍后详细讲,在这种情况下,ProcessInstance相当于Execution
7)如果assignee属性为部门经理,结果为空。因为现在流程只到了”填写请假申请”阶段,后面的任务还没有执行,即在数据库中没有部门经理可以办理的任务,所以查询不到。
8)一个Task节点和Execution节点是1对1的情况,在task对象中使用Execution_来表示他们之间的关系
9)任务ID在数据库表act_ru_task中对应“ID_”列

附加:
在activiti任务中,主要分为两大类查询任务(个人任务和组任务):
1.确切指定了办理者的任务,这个任务将成为指定者的私有任务,即个人任务。
2.无法指定具体的某一个人来办理的任务,可以把任务分配给几个人或者一到 多个小组,让这个范围内的用户可以选择性(如有空余时间时)来办理这类任务,即组任务。
先知道个人任务的查询和办理,组任务的操作后面讲

五、办理任务

/**办理任务:完成我的任务*/  @Test  public void completeMyPersonalTask(){  /**任务ID*/  //String taskId = "104";  //String taskId = "202";  String taskId = "302";  processEngine.getTaskService()/**与正在执行的任务管理相关的Service*/  .complete(taskId);  System.out.println("完成任务:任务ID:"+taskId);  }  

说明:
1)是办理任务,所以从ProcessEngine得到的是TaskService。
2)当执行完这段代码,再以员工的身份去执行查询的时候,会发现这个时候已经没有数据了,因为正在执行的任务中没有数据。
3)对于执行完的任务,activiti将从act_ru_task表中删除该任务,下一个任务会被插入进来。
4)以”部门经理”的身份进行查询,可以查到结果。因为流程执行到部门经理审批这个节点了。
5)再执行办理任务代码,执行完以后以”部门经理”身份进行查询,没有结果。
6)重复第3和4步直到流程执行完。

六、查询流程状态(判断流程正在执行,还是结束)

/**查询流程状态(判断流程正在执行,还是结束)*/  @Test  public void isProcessEnd(){  String processInstanceId = "101";  ProcessInstance pi = processEngine.getRuntimeService()/**表示正在执行的流程实例和执行对象*/  .createProcessInstanceQuery()/**创建流程实例查询*/  .processInstanceId(processInstanceId)/**使用流程实例ID查询*/  .singleResult();  if(pi==null){  System.out.println("流程已经结束");  }  else{  System.out.println("流程没有结束");  }  }  

在流程执行的过程中,创建的流程实例ID在整个过程中都不会变,当流程结束后,流程实例将会在正在执行的执行对象表中(act_ru_execution)被删除
 说明:
1)因为是查询流程实例,所以先获取runtimeService
2)创建流程实例查询对象,设置实例ID过滤参数
3)由于一个流程实例ID只对应一个实例,使用singleResult执行查询返回一个唯一的结果,如果结果数量大于1,则抛出异常
4)判断指定ID的实例是否存在,如果结果为空,则代表流程结束,实例在正在执行的执行对象表中已被删除,转换成历史数据。

七、查询历史任务

/**查询历史任务(查询act_hi_task表信息)*/  @Test  public void findHistoryTask(){  String taskAssignee = "张三";  List<HistoricTaskInstance> list = processEngine.getHistoryService()/**与历史数据(历史表)相关的Service*/  .createHistoricTaskInstanceQuery()/**创建历史任务实例查询*/  .taskAssignee(taskAssignee)/**指定历史任务的办理人*/  .list();  if(list!=null && list.size()>0){  for(HistoricTaskInstance hti:list){  System.out.println(hti.getId()+"    "+hti.getName()+"    "+hti.getProcessInstanceId()+"   "+hti.getStartTime()+"   "+hti.getEndTime()+"   "+hti.getDurationInMillis());  System.out.println("################################");  }  }  }  

八、查询历史流程实例

**查询历史流程实例(查询act_hi_actinst表信息)*/  @Test  public void findHistoryProcessInstance(){  String processInstanceId = "101";  HistoricProcessInstance hpi = processEngine.getHistoryService()/**与历史数据(历史表)相关的Service*/  .createHistoricProcessInstanceQuery()/**创建历史流程实例查询*/  .processInstanceId(processInstanceId)/**使用流程实例ID查询*/  .singleResult();  System.out.println(hpi.getId()+"    "+hpi.getProcessDefinitionId()+"    "+hpi.getStartTime()+"    "+hpi.getEndTime()+"     "+hpi.getDurationInMillis());  }  

九、总结
Execution   执行对象
 按流程定义的规则执行一次的过程.
 对应的表:
  act_ru_execution: 正在执行的信息
  act_hi_procinst:已经执行完的历史流程实例信息
  act_hi_actinst:存放历史所有完成的活动
ProcessInstance  流程实例
 特指流程从开始到结束的那个最大的执行分支,一个执行的流程中,流程实例只有1个。

注意
    (1)如果是单例流程,执行对象ID就是流程实例ID
    (2)如果一个流程有分支和聚合,那么执行对象ID和流程实例ID就不相同
    (3)一个流程中,流程实例只有1个,执行对象可以存在多个。

Task 任务
 执行到某任务环节时生成的任务信息。
 对应的表:
  act_ru_task:正在执行的任务信息
  act_hi_taskinst:已经执行完的历史任务信息

Activiti——工作流之流程实例、任务的执行(五)相关推荐

  1. 《Activiti/Flowable 深入BPM工作流》-流程实例怎么实现挂起?

    <Activiti/Flowable  深入BPM工作流>-流程实例怎么实现挂起? 一. 问题 1. 什么情况要进行流程的挂起? 2. 具体怎么将流程挂起? 二. 详情   1. 什么情况 ...

  2. Activiti工作流之流程变量

    1.什么是流程变量 流程变量在 activiti 中是一个非常重要的角色,流程运转有时需要靠流程变量,业务系统和 activiti 结合时少不了流程变量,流程变量就是 activiti 在管理工作流时 ...

  3. Activiti工作流之流程分支

    回顾: Activiti工作流之简介与环境搭建 Activiti工作流之流程部署和相关操作 Activiti工作流之任务的运行/查询/完成 Activiti工作流之流程变量 Activiti工作流之历 ...

  4. Activiti工作流从入门到入土:完整Hello World大比拼(Activiti工作流 API结合实例讲解)

    文章源码托管:https://github.com/OUYANGSIHAI/Activiti-learninig 欢迎 star !!! 本来想着闲来无事,前面在项目中刚刚用到了工作流 Activit ...

  5. Activiti工作流从入门到入土:完整Hello World大比拼(Activiti工作流 API结合实例讲解)...

    文章源码托管:github.com/OUYANGSIHAI- 欢迎 star !!! 本来想着闲来无事,前面在项目中刚刚用到了工作流 Activiti 框架,写写博客的,但是,事情总是纷纷杂杂,一直拖 ...

  6. springmvc SSM Activiti 工作流引擎 流程审批 后台框架 源码 shiro权

    工作流模块----------------------------------------------------------------------------------------------- ...

  7. Java Activiti 工作流引擎 流程审批 后台框架源码 springmvc SSM

    博文来源:http://www.fhadmin.org/webnewsdetail1.html 工作流模块----------------------------------------------- ...

  8. (经验总结)flowable工作流_01_流程实例管理

    文章目录 一.流程定义管理功能有哪些? 二.删除流程实例会删除哪些表中的数据? 三.流程实例做什么用? 四.流程定义涉及的表 一.流程定义管理功能有哪些? 类名:ApiFlowableProcessI ...

  9. Activiti第二篇【管理流程定义、执行任务和流程实例、流程变量】

    tags: Activiti 上篇Activiti只是一个快速入门案例,这篇就讲定义.部署.查看任务等等的一些细节[涉及到的数据库表.对象等等]... 管理流程定义 管理流程定义主要涉及到以下的4张表 ...

最新文章

  1. Subscriber class xxx ,xx already registered to event
  2. OCP读书笔记(5) - 使用RMAN创建备份
  3. int p 与int p 的不同
  4. 今日运势 酷q_一言及每日运势API开源
  5. Linux安装gcc、gcc-c++等环境
  6. 阿里docker安装mysql_docker安装mysql
  7. Micropython 如何用Turnipbit做一个自动浇水装置
  8. html加了文档声明之后页面错乱,为登陆页面扩展和配置设计导入程序
  9. python 点击按钮回去entry值_python中tkinter入门之Checkbutton,Radiobutton和Entry
  10. 毕业论文的编辑与排版大学计算机,大学毕业论文排版技巧
  11. 计算机英语背诵发音,联想法巧记英语单词5000发音记忆法背单词
  12. 如何生成支付宝小程序链接,点击直接打开并进入某个页面
  13. 转行IT行业,月薪过万需要多久?
  14. 多文件自平衡云传输(二)资源接收 断点续传篇 —————— 开开开山怪
  15. 什么是实人认证?需要用到哪些api接口
  16. 【上课课件整理复习】第六章 网页数据的采集(1)
  17. 如何将Windows8系统的磁盘格式(GPT格式)转换成Windows 7系统的磁盘格式(MBR格式)
  18. SQL_TRACE的作用
  19. Go语言使用golang-jwt/jwt/v4进行JWT鉴权
  20. SpringBoot之事务处理:隔离级别与传播行为

热门文章

  1. 10任务栏全屏时老是弹出_Deepin 15.10 发布,深度操作系统
  2. 常用的高性能 KV 存储 Redis、Memcached、etcd、Zookeeper 区别
  3. c语言中struct和c++中class实例对比
  4. python对文件的读写正确操作方式
  5. Flask学习之路(一)--初识flask
  6. debian10 简单的CA使用
  7. is not a supported wheel on this platform pip安装报错
  8. 在Relay中注册新TVM算子
  9. 快手推荐系统及 Redis 升级存储
  10. 克服汽车摄像头连接挑战