activiti工作流,创建一个简单的工作流和审批

时间:2024-03-25 20:31:31

上一篇文章中,我们介绍了Activiti最简单的流程,但是,我们知道,一般来讲,审批一定有同意和不同意的区别,我们在这篇博客中做一个简单的Demo.

 

代码:

 

当然上一篇博客中已经配置了基本的Activiti.cfg.xml和log4j.properties文件,这次,我们都不说这些了。

 

先看目录:

 

activiti工作流,创建一个简单的工作流和审批

 

一、suquenceFlow.bpmn

 

activiti工作流,创建一个简单的工作流和审批

 

节点审批【部门经理】中设置,跟上一篇博客中没有什么区别,我们给它的Assignee为“赵六”,第二个几点审批【总经理】,我们给它的Assignee为“田七”。

 

然后,我们看图中的两条线:

 

activiti工作流,创建一个简单的工作流和审批

 

我们看连线1设置:首先写上“不重要”,这里面的连线1:

 

activiti工作流,创建一个简单的工作流和审批

 

这个并不重要,就是写不写都没有关系,主要是这一步:

 

activiti工作流,创建一个简单的工作流和审批

 

我们在写的时候,一定要注意格式不能错。

 

同样的连线二:

 

activiti工作流,创建一个简单的工作流和审批

 

 

最后,我们要给它的process起名字,点击空白处:

 

activiti工作流,创建一个简单的工作流和审批

 

二、SequenceFlowTest.java类

 

这样,图画好了,我们就看一下我们SequenceFlowTest.java类:

 

 

 
  1. <span style="font-size:18px;">package cn.itcast.f_sequenceFlow;

  2.  
  3. import java.io.InputStream;

  4. import java.util.HashMap;

  5. import java.util.List;

  6. import java.util.Map;

  7.  
  8. import org.activiti.engine.ProcessEngine;

  9. import org.activiti.engine.ProcessEngines;

  10. import org.activiti.engine.repository.Deployment;

  11. import org.activiti.engine.runtime.ProcessInstance;

  12. import org.activiti.engine.task.Task;

  13. import org.junit.Test;

  14.  
  15. public class SequenceFlowTest {

  16.  
  17. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

  18.  
  19. /**部署流程定义(从inputStream)*/

  20. @Test

  21. public void deploymentProcessDefinition_inputStream(){

  22. InputStream inputStreamBpmn = this.getClass().getResourceAsStream("sequenceFlow.bpmn");

  23. InputStream inputStreamPng = this.getClass().getResourceAsStream("sequenceFlow.png");

  24. Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service

  25. .createDeployment()//创建一个部署对象

  26. .name("连线")//添加部署的名称

  27. .addInputStream("sequenceFlow.bpmn", inputStreamBpmn)//

  28. .addInputStream("sequenceFlow.png", inputStreamPng)//

  29. .deploy();//完成部署

  30. System.out.println("部署ID:"+deployment.getId());//

  31. System.out.println("部署名称:"+deployment.getName());//

  32. }

  33.  
  34. /**启动流程实例*/

  35. @Test

  36. public void startProcessInstance(){

  37. //流程定义的key

  38. String processDefinitionKey = "sequenceFlow";

  39. ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service

  40. .startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动

  41. System.out.println("流程实例ID:"+pi.getId());//流程实例ID 101

  42. System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID helloworld:1:4

  43. }

  44.  
  45. /**查询当前人的个人任务*/

  46. @Test

  47. public void findMyPersonalTask(){

  48. String assignee = "赵六";

  49. List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service

  50. .createTaskQuery()//创建任务查询对象

  51. /**查询条件(where部分)*/

  52. .taskAssignee(assignee)//指定个人任务查询,指定办理人

  53. // .taskCandidateUser(candidateUser)//组任务的办理人查询

  54. // .processDefinitionId(processDefinitionId)//使用流程定义ID查询

  55. // .processInstanceId(processInstanceId)//使用流程实例ID查询

  56. // .executionId(executionId)//使用执行对象ID查询

  57. /**排序*/

  58. .orderByTaskCreateTime().asc()//使用创建时间的升序排列

  59. /**返回结果集*/

  60. // .singleResult()//返回惟一结果集

  61. // .count()//返回结果集的数量

  62. // .listPage(firstResult, maxResults);//分页查询

  63. .list();//返回列表

  64. if(list!=null && list.size()>0){

  65. for(Task task:list){

  66. System.out.println("任务ID:"+task.getId());

  67. System.out.println("任务名称:"+task.getName());

  68. System.out.println("任务的创建时间:"+task.getCreateTime());

  69. System.out.println("任务的办理人:"+task.getAssignee());

  70. System.out.println("流程实例ID:"+task.getProcessInstanceId());

  71. System.out.println("执行对象ID:"+task.getExecutionId());

  72. System.out.println("流程定义ID:"+task.getProcessDefinitionId());

  73. System.out.println("########################################################");

  74. }

  75. }

  76. }

  77.  
  78. /**完成我的任务*/

  79. @Test

  80. public void completeMyPersonalTask(){

  81. //任务ID

  82. String taskId = "3103";

  83. //完成任务的同时,设置流程变量,使用流程变量用来指定完成任务后,下一个连线,对应sequenceFlow.bpmn文件中${message=='不重要'}

  84. Map<String, Object> variables = new HashMap<String, Object>();

  85. variables.put("message", "重要");

  86. processEngine.getTaskService()//与正在执行的任务管理相关的Service

  87. .complete(taskId,variables);

  88. System.out.println("完成任务:任务ID:"+taskId);

  89. }

  90. }

  91. </span>


注:

 

第一个方法、第二个方法、第三个方法,如果大家看了上一篇博客,应该不用说,我们看最后一个方法:completeMyPersonalTask()

 

这个方法中,我们processEngine.getTaskService()启动了task之后,我们给了它一个map,map中放入了“message”,这个一定要跟,我们连线1或者连线2中的${message=='不重要'}里面的message一样,网址后,给message赋值,这里其实大家都能猜到了,如果是,“重要”那将会发送给审批【总经理】,如果为“不重要”将会直接结束。