1. 程式人生 > >【Activiti工作流】6.Activiti入門程式HelloWorld演示流程的執行(下)

【Activiti工作流】6.Activiti入門程式HelloWorld演示流程的執行(下)

上一次我們在配置好Activiti的開發環境之後,進行了以下開發:
1.繪製流程圖
2.編寫流程引擎載入類
3.通過流程引擎獲取RepositoryService,載入bpmn檔案進行部署。

我們在上篇中看到,當我們成功部署我們的流程物件之後,資料庫中儲存了
我們的一些流程資訊:




我們部署了流程,為的就是使用這個流程方式去處理我們的業務,就如同
之前例子中的請假流程一樣,當用戶填寫了請假申請之後,點選“申請請假”,
就啟動了之前載入bpmn和png檔案所部署的流程物件:



回顧之前我們編寫的流程類:
package cn.com.helloworld;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.junit.Test;


public class HelloWorld {
	
	//獲取流程引擎物件
	//getDefaultProcessEngine方法內部會自動讀取名為activiti.cfg.xml檔案的配置資訊
	ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
	
	/**部署流程定義*/
	@Test
	public void deploymentProcessDefinition(){
		//與流程定義和部署物件相關的Service
		RepositoryService repositoryService=processEngine.getRepositoryService();
		
		DeploymentBuilder deploymentBuilder=repositoryService.createDeployment();//建立一個部署物件
		deploymentBuilder.name("helloWorld入門程式");//新增部署的名稱
		deploymentBuilder.addClasspathResource("diagrams/MyProcess.bpmn");//從classpath的資源載入,一次只能載入一個檔案
		deploymentBuilder.addClasspathResource("diagrams/MyProcess.png");//從classpath的資源載入,一次只能載入一個檔案
		
		Deployment deployment=deploymentBuilder.deploy();//完成部署
		
		//列印我們的流程資訊
		System.out.println("流程Id:"+deployment.getId());
		System.out.println("流程Name:"+deployment.getName());
	}
}

我們通過getDefaultProcessEngine自載入activiti.cfg.xml檔案,獲得流程引擎
的配置物件,然後通過配置物件獲取流程引擎物件ProcessEngine,然後通過流程
引擎物件獲取部署相關的Service物件,進而載入我們剛剛編寫的流程圖檔案,進行
了流程例項的部署。

接下來我們就要將我們部署的流程例項進行啟動:
/**啟動流程引擎*/
@Test
public void startProcessInstance(){
	//獲取流程啟動Service
	RuntimeService runtimeService=processEngine.getRuntimeService();
	//使用流程定義的key,key對應bpmn檔案對應的id,
	//(也是act_re_procdef表中對應的KEY_欄位),預設是按照最新版本啟動
	String processDefinitionkey="HelloWorld";//流程定義的key就是HelloWorld
	//獲取流程例項物件
	ProcessInstance processInstance=runtimeService.startProcessInstanceByKey(processDefinitionkey);
	System.out.println("流程例項ID:"+processInstance.getId());//流程例項ID
	System.out.println("流程定義ID:"+processInstance.getProcessDefinitionId());//流程定義ID
}
執行之後結果:


我們可以看到流程定義ID為HelloWorld:1:4,與資料庫act_re_procdef表中的ID欄位吻合:



然後我們的例項ID實際上就是我們在程式碼中執行的例項所建立的ID,此ID會在
資料庫中自動生成(預設從101開始),由Ru組表來儲存例項資訊:



可以看到,啟動流程就相當於提交了申請,我們的申請人就是張三同學。


流程一旦啟動了,我們的流程相當於提交成功了,根據我們的流程圖:

那麼第一個看到流程任務的就是我們的“張三”同學。所以張三同學就會
擁有一個新的“個人任務”,所以我們接下來就要“查詢當前的個人任務”:
/**查詢當前的個人任務(實際就是查詢act_ru_task表)*/
@Test
public void findMyPersonalTask(){
	String assignee="張三";
	//獲取事務Service
	TaskService taskService=processEngine.getTaskService();
	List<Task> taskList=taskService.createTaskQuery()//建立任務查詢物件
			   .taskAssignee(assignee)//指定個人任務查詢,指定辦理人
			   .list();//獲取該辦理人下的事務列表
	
	if(taskList!=null&&taskList.size()>0){
		for(Task task:taskList){
			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(){
	String taskId="304";//上一次我們查詢的任務ID就是304
	TaskService taskService=processEngine.getTaskService();
	taskService.complete(taskId);//完成taskId對應的任務
	System.out.println("完成ID為"+taskId+"的任務");
	
}

執行結果:

注意,完成任務之後,該流程的辦理人員就不能再查到任務的相關資訊了:



此時我們的張三的任務已經完成,流程就會走到下一級,也就是李四的任務列表中了:


同理,當李四審批完畢之後,任務完成,流程就會走到王五那裡:


王五審批完畢後,走到結束節點,整個流程結束。我們檢視act_hi_procinst表可以看到
流程具體結束時間:



以上就是我們Activiti的入門工程Helloworld的講解。