activiti工作流,建立一個簡單的工作流和審批
上一篇文章中,我們介紹了Activiti最簡單的流程,但是,我們知道,一般來講,審批一定有同意和不同意的區別,我們在這篇部落格中做一個簡單的Demo.
程式碼:
當然上一篇部落格中已經配置了基本的Activiti.cfg.xml和log4j.properties檔案,這次,我們都不說這些了。
先看目錄:
一、suquenceFlow.bpmn
節點審批【部門經理】中設定,跟上一篇部落格中沒有什麼區別,我們給它的Assignee為“趙六”,第二個幾點審批【總經理】,我們給它的Assignee為“田七”。
然後,我們看圖中的兩條線:
我們看連線1設定:首先寫上“不重要”,這裡面的連線1:
這個並不重要,就是寫不寫都沒有關係,主要是這一步:
我們在寫的時候,一定要注意格式不能錯。
同樣的連線二:
最後,我們要給它的process起名字,點選空白處:
二、SequenceFlowTest.java類
這樣,圖畫好了,我們就看一下我們SequenceFlowTest.java類:
-
<span style="font-size:18px;">package cn.itcast.f_sequenceFlow;
-
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 SequenceFlowTest {
-
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
-
/**部署流程定義(從inputStream)*/
-
@Test
-
public void deploymentProcessDefinition_inputStream(){
-
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("sequenceFlow.bpmn");
-
InputStream inputStreamPng = this.getClass().getResourceAsStream("sequenceFlow.png");
-
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署物件相關的Service
-
.createDeployment()//建立一個部署物件
-
.name("連線")//新增部署的名稱
-
.addInputStream("sequenceFlow.bpmn", inputStreamBpmn)//
-
.addInputStream("sequenceFlow.png", inputStreamPng)//
-
.deploy();//完成部署
-
System.out.println("部署ID:"+deployment.getId());//
-
System.out.println("部署名稱:"+deployment.getName());//
-
}
-
/**啟動流程例項*/
-
@Test
-
public void startProcessInstance(){
-
//流程定義的key
-
String processDefinitionKey = "sequenceFlow";
-
ProcessInstance pi = processEngine.getRuntimeService()//與正在執行的流程例項和執行物件相關的Service
-
.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動流程例項,key對應helloworld.bpmn檔案中id的屬性值,使用key值啟動,預設是按照最新版本的流程定義啟動
-
System.out.println("流程例項ID:"+pi.getId());//流程例項ID 101
-
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
-
}
-
/**查詢當前人的個人任務*/
-
@Test
-
public 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("########################################################");
-
}
-
}
-
}
-
/**完成我的任務*/
-
@Test
-
public void completeMyPersonalTask(){
-
//任務ID
-
String taskId = "3103";
-
//完成任務的同時,設定流程變數,使用流程變數用來指定完成任務後,下一個連線,對應sequenceFlow.bpmn檔案中${message=='不重要'}
-
Map<String, Object> variables = new HashMap<String, Object>();
-
variables.put("message", "重要");
-
processEngine.getTaskService()//與正在執行的任務管理相關的Service
-
.complete(taskId,variables);
-
System.out.println("完成任務:任務ID:"+taskId);
-
}
-
}
-
</span>
注:
第一個方法、第二個方法、第三個方法,如果大家看了上一篇部落格,應該不用說,我們看最後一個方法:completeMyPersonalTask()
這個方法中,我們processEngine.getTaskService()啟動了task之後,我們給了它一個map,map中放入了“message”,這個一定要跟,我們連線1或者連線2中的${message=='不重要'}裡面的message一樣,網址後,給message賦值,這裡其實大家都能猜到了,如果是,“重要”那將會發送給審批【總經理】,如果為“不重要”將會直接結束。