1. 程式人生 > >activiti工作流,建立一個簡單的工作流和審批

activiti工作流,建立一個簡單的工作流和審批

上一篇文章中,我們介紹了Activiti最簡單的流程,但是,我們知道,一般來講,審批一定有同意和不同意的區別,我們在這篇部落格中做一個簡單的Demo.

程式碼:

當然上一篇部落格中已經配置了基本的Activiti.cfg.xml和log4j.properties檔案,這次,我們都不說這些了。

先看目錄:

一、suquenceFlow.bpmn

節點審批【部門經理】中設定,跟上一篇部落格中沒有什麼區別,我們給它的Assignee為“趙六”,第二個幾點審批【總經理】,我們給它的Assignee為“田七”。

然後,我們看圖中的兩條線:

我們看連線1設定:首先寫上“不重要”,這裡面的連線1:

這個並不重要,就是寫不寫都沒有關係,主要是這一步:

我們在寫的時候,一定要注意格式不能錯。

同樣的連線二:

最後,我們要給它的process起名字,點選空白處:

二、SequenceFlowTest.java類

這樣,圖畫好了,我們就看一下我們SequenceFlowTest.java類:

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

  2. import java.io.InputStream;

  3. import java.util.HashMap;

  4. import java.util.List;

  5. import java.util.Map;

  6. import org.activiti.engine.ProcessEngine;

  7. import org.activiti.engine.ProcessEngines;

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

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

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

  11. import org.junit.Test;

  12. public class SequenceFlowTest {

  13. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

  14. /**部署流程定義(從inputStream)*/

  15. @Test

  16. public void deploymentProcessDefinition_inputStream(){

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

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

  19. Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署物件相關的Service

  20. .createDeployment()//建立一個部署物件

  21. .name("連線")//新增部署的名稱

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

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

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

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

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

  27. }

  28. /**啟動流程例項*/

  29. @Test

  30. public void startProcessInstance(){

  31. //流程定義的key

  32. String processDefinitionKey = "sequenceFlow";

  33. ProcessInstance pi = processEngine.getRuntimeService()//與正在執行的流程例項和執行物件相關的Service

  34. .startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動流程例項,key對應helloworld.bpmn檔案中id的屬性值,使用key值啟動,預設是按照最新版本的流程定義啟動

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

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

  37. }

  38. /**查詢當前人的個人任務*/

  39. @Test

  40. public void findMyPersonalTask(){

  41. String assignee = "趙六";

  42. List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service

  43. .createTaskQuery()//建立任務查詢物件

  44. /**查詢條件(where部分)*/

  45. .taskAssignee(assignee)//指定個人任務查詢,指定辦理人

  46. // .taskCandidateUser(candidateUser)//組任務的辦理人查詢

  47. // .processDefinitionId(processDefinitionId)//使用流程定義ID查詢

  48. // .processInstanceId(processInstanceId)//使用流程例項ID查詢

  49. // .executionId(executionId)//使用執行物件ID查詢

  50. /**排序*/

  51. .orderByTaskCreateTime().asc()//使用建立時間的升序排列

  52. /**返回結果集*/

  53. // .singleResult()//返回惟一結果集

  54. // .count()//返回結果集的數量

  55. // .listPage(firstResult, maxResults);//分頁查詢

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

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

  58. for(Task task:list){

  59. System.out.println("任務ID:"+task.getId());

  60. System.out.println("任務名稱:"+task.getName());

  61. System.out.println("任務的建立時間:"+task.getCreateTime());

  62. System.out.println("任務的辦理人:"+task.getAssignee());

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

  64. System.out.println("執行物件ID:"+task.getExecutionId());

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

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

  67. }

  68. }

  69. }

  70. /**完成我的任務*/

  71. @Test

  72. public void completeMyPersonalTask(){

  73. //任務ID

  74. String taskId = "3103";

  75. //完成任務的同時,設定流程變數,使用流程變數用來指定完成任務後,下一個連線,對應sequenceFlow.bpmn檔案中${message=='不重要'}

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

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

  78. processEngine.getTaskService()//與正在執行的任務管理相關的Service

  79. .complete(taskId,variables);

  80. System.out.println("完成任務:任務ID:"+taskId);

  81. }

  82. }

  83. </span>


注:

第一個方法、第二個方法、第三個方法,如果大家看了上一篇部落格,應該不用說,我們看最後一個方法:completeMyPersonalTask()

這個方法中,我們processEngine.getTaskService()啟動了task之後,我們給了它一個map,map中放入了“message”,這個一定要跟,我們連線1或者連線2中的${message=='不重要'}裡面的message一樣,網址後,給message賦值,這裡其實大家都能猜到了,如果是,“重要”那將會發送給審批【總經理】,如果為“不重要”將會直接結束。