天天看點

Activiti工作流基礎

1. 工作流簡述

1.1工作流是什麼

工作流(Workflow),就是通過計算機對業務流程自動化執行管理。它主要解決的是“使在多個參與者之間按照某種預定義的規則自動進行傳遞文檔、資訊或任務的過程,進而實作某個預期的業務目标,或者促使此目标的實作”。

工作流就是通過計算機技術對業務流程進行自動化管理。實作多個參與者按照預定的流程去自動執行業務流程。

工作流管理系統的目标:管理工作的流程以確定工作在正确的時間被期望的人員所執行——在自動化進行的業務過程中插入人工的執行和幹預。

Activiti工作流基礎

1.2哪些行業需要工作流

消費品行業,制造業,電信服務業,銀證險等金融服務業,物流服務業,物業服務業,物業管理,大中型進出口貿易公司,政府事業機構,研究院所及教育服務業等,特别是大的跨國企業和集團公司。

總結一句話:凡是有組織機構的公司都有可能用到工作流。

2. 工作流系統的使用

  1. 關鍵業務流程:訂單、報價處理、采購處理、合同稽核、客戶電話處理、供應鍊管理等
  2. 行政管理類:出差申請、加班申請、請假申請、用車申請、各種辦公用品申請、購買申請、日報周報等凡是原來手工流轉處理的行政表單。
  3. 人事管理類:員工教育訓練安排、績效考評、職位變動處理、員工檔案資訊管理等。
  4. 财務相關類:付款請求、應收款處理、日常報帳處理、出差報帳、預算和計劃申請等。
  5. 客戶服務類:客戶資訊管理、客戶投訴、請求處理、售後服務管理等。
  6. 特殊服務類:ISO系列對應流程、品質管理對應流程、産品資料資訊管理、貿易公司報關處理、物流公司貨物跟蹤處理等各種通過表單逐漸手工流轉完成的任務均可應用工作流軟體自動規範地實施。

    3.常見的工作流架構

    Activiti5.13、JBPM4.4、OSWorkFlow、WorkFlow…

    工作流架構底層需要有資料庫提供支援,activiti5.13版本,有23張表。JBPM4.4架構底層有資料庫支援,18張表。JBPM底層使用hibernate操作資料庫。Activiti架構底層使用的mybatis操作資料庫。

    4.Activti的曆史簡介

    Activiti項目是一項新的基于Apache許可的開源BPM平台,從基礎開始建構,旨在提供支援新的BPMN 2.0标準,包括支援對象管理組(OMG),面對新技術的機遇,諸如互操作性和雲架構,提供技術實作。

    創始人Tom Baeyens是JBoss jBPM的項目架構師,以及另一位架構師Joram Barrez,一起加入到建立Alfresco這項首次實作Apache開源許可的BPMN 2.0引擎開發中來。

    Activiti前身是jbpm4,Activiti架構和jbpm4基本上是一樣的。

    架構師Tom Baeyens說:“Activiti有非常大的影響力來改變目前BPM的生态。Activiti的Apache授權,完整的功能,将使Activiti到達一個新的水準。Activiti将推動業界的創新,因為BPM技術可以廣泛而自由地被應用。通過實作這些想法以及開源社群的努力,也讓Activiti成為事實上的 BPM和BPMN标準執行“。它的特色是提供了eclipse插件,開發人員可以通過插件直接繪畫出業務流程圖。

    Activiti工作流基礎

5.重要的名詞解釋

5.1工作流引擎

ProcessEngine對象,這是Activiti工作的核心。負責生成流程運作時的各種執行個體及資料、監控和管理流程的運作。

5.2 BPM

BPM,即業務流程管理,是一種以規範化的構造端到端的卓越業務流程為中心,以持續的提高組織業務績效為目的的系統化方法,常見商業管理教育如EMBA、MBA等均将BPM包含在内。

5.3 BPMN

BPMN:業務流程模組化與标注,包括這些圖元如何組合成一個業務流程圖(Business Process Diagram);讨論BPMN的各種的用途,包括以何種精度來影響一個流程圖中的模型;BPMN作為一個标準的價值,以及BPMN未來發展的遠景。

具體發展曆史如下:

Activiti工作流基礎

流對象:一個業務流程圖有三個流對象的核心元素。

事件—一個事件用圓圈來描述,表示一個業務流程期間發生的東西。事件影響流程的流動,一般有一個原因(觸發器)或一個影響(結果)。基于它們對流程的影響,有三種事件:開始,中間以及終止事件

Activiti工作流基礎

活動:用圓角矩形表示,一個流程由一個活動或多個活動組成

Activiti工作流基礎

條件:條件用熟悉的菱形表示,用于控制序列流的分支與合并。另外,它還可以作為傳統的選擇,還包括路徑的分支與合并。其内部的标記會給出控制流的類型。

Activiti工作流基礎

Activiti使用Bpmn2.0标準進行流程定義(流程模組化),bpmn采用xml描述 。

Activiti工作流基礎

如何使用bpmn進行流程模組化:

通常情況下,使用模組化工具進行流程圖繪制,生成一個圖形,通過工具檢視bpmn的xml描述 。

如果熟練,手動編寫pbmn的xml文檔。(對坐标和結點的大小通過工具完成)

建立WEB工程,導入Activiti依賴包

porm依賴

<dependencies>

		<!-- https://mvnrepository.com/artifact/org.activiti/activiti-engine -->
		<dependency>
			<groupId>org.activiti</groupId>
			<artifactId>activiti-engine</artifactId>
			<version>5.22.0</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.activiti/activiti-spring -->
		<dependency>
			<groupId>org.activiti</groupId>
			<artifactId>activiti-spring</artifactId>
			<version>5.22.0</version>
		</dependency>

		<dependency>
			<groupId>org.codehaus.groovy</groupId>
			<artifactId>groovy-all</artifactId>
			<version>2.4.3</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.6</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-jdk14</artifactId>
			<version>1.7.6</version>
		</dependency>

		<!-- 單元測試 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.38</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<configuration>
					<version>3.1</version>
				</configuration>
			</plugin>
			<!-- java編譯插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>

           

使用activiti架構的自動建表功能

架構提供了和hibernate類似的自動建表功能

不使用配置檔案(不建議)

/*
	 * 使用架構提供自動建表(不提供配置檔案)
	 */
	@Test
	public void createTable(){
		//建立一個流程引擎配置對象
		ProcessEngineConfiguration conf = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
		//設定資料源資訊
		conf.setJdbcDriver("com.mysql.jdbc.Driver");
		conf.setJdbcUrl("jdbc:mysql:///activitidb");
		conf.setJdbcUsername("root");
		conf.setJdbcPassword("root");
		//設定自動建表
		conf.setDatabaseSchemaUpdate("true");
		//建立一個流程引擎對象,在建立流程引擎對象過程中會自動建表
		ProcessEngine processEngine = conf.buildProcessEngine();
	}

           

使用配置檔案(推薦)

Activiti工作流基礎

要求配置檔案名稱必須為activiti-context.xml或者activiti.cfg.xml,配置的資訊必須為

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
						http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/context 
						http://www.springframework.org/schema/context/spring-context-2.5.xsd
						http://www.springframework.org/schema/tx 
						http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
	<!-- 配置流程引擎配置對象 -->
	<bean id="processEngineConfiguration"
		class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
		<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUrl" value="jdbc:mysql:///activitidb" />
		<property name="jdbcUsername" value="root" />
		<property name="jdbcPassword" value="123" />
		<property name="databaseSchemaUpdate" value="true" />
	</bean>
	
</beans>

           
@Test
	public void createTable1(){
		ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-context.xml","processEngineConfiguration").buildProcessEngine();
		System.out.println("------processEngine----:" + processEngine); 
	}

           

使用預設配置檔案

通過預設載入activiti.cfg.xml進行擷取

@Description:推薦使用

在前面看到了建立ProcessEngine(流程引擎)的方式,而這裡要簡化很多,調用ProcessEngines的getDefaultProceeEngine方法時會自動加載classpath下名為activiti.cfg.xml檔案。

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
						http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/context 
						http://www.springframework.org/schema/context/spring-context-2.5.xsd
						http://www.springframework.org/schema/tx 
						http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
	<!-- 配置流程引擎配置對象 -->
	<bean id="processEngineConfiguration"
		class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
		<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUrl" value="jdbc:mysql:///activitidb" />
		<property name="jdbcUsername" value="root" />
		<property name="jdbcPassword" value="123" />
		<property name="databaseSchemaUpdate" value="true" />
	</bean>

	<!-- 配置一個流程引擎工廠bean,用于建立流程引擎對象 -->
	<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
		<!-- 通過set方法注入流程引擎配置對象 -->
		<property name="processEngineConfiguration" ref="processEngineConfiguration" />
	</bean>
	
</beans>


           
//    通過預設載入activiti.cfg.xml進行擷取
//    @Description:推薦使用
	public void createTable2(){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		System.out.println(processEngine);
	}
           

然後運作該測試方法,如果運作成功,在資料庫中應該會産生25張Activiti的相關資料表

Activiti工作流基礎

Activiti表說明

下面是概括了幾個常用的資料表

Activiti的背景是有資料庫的支援,所有的表都以ACT_開頭。 第二部分是表示表的用途的兩個字母辨別。 用途也和服務的API對應。

ACT_RE_: 'RE’表示repository。 這個字首的表包含了流程定義和流程靜态資源 (圖檔,規則,等等)。

ACT_RU_: 'RU’表示runtime。 這些運作時的表,包含流程執行個體,任務,變量,異步任務,等運作中的資料。 Activiti隻在流程執行個體執行過程中儲存這些資料, 在流程結束時就會删除這些記錄。 這樣運作時表可以一直很小速度很快。

ACT_ID_: 'ID’表示identity。 這些表包含身份資訊,比如使用者,組等等。

ACT_HI_: 'HI’表示history。 這些表包含曆史資料,比如曆史流程執行個體, 變量,任務等等。

ACT_GE_*: 通用資料, 用于不同場景下。

流程部署相關表

act_re_deployement 部署對象表

act_rep_procdef 流程定義表

act_ge_bytearray 資源檔案表

act_ge_prperty 主鍵生成政策表(對于部署對象表的主鍵ID)

流程執行個體相關表

act_ru_execution 正在執行的執行對象表(包含執行對象ID和流程執行個體ID,如果有多個線程可能流程執行個體ID不一樣)

act_hi_procinst 流程執行個體曆史表

act_hi_actinst 存放曆史所有完成的任務

Task 任務相關表

act_ru_task 代辦任務表 (隻對應節點是UserTask的)

act_hi_taskinst 代辦任務曆史表 (隻對應節點是UserTask的)

act_hi_actinst 所有節點活動曆史表 (對應流程的所有節點的活動曆史,從開始節點一直到結束節點中間的所有節點的活動都會被記錄)

流程變量表

act_ru_variable 正在執行的流程變量表

act_hi_variable 流程變量曆史表

3.核心API

3.1 ProcessEngine對象 流程引擎對象

說明:

  1. 在Activiti中最核心的類,其他的類都是由他而來。
  2. 産生方式

    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

3)可以産生RepositoryService

RepositoryService repositoryService =processEngine.getRepositoryService();

  1. 可以産生 RuntimeService

    RuntimeService runtimeService = processEngine.getRuntimeService();

  2. 可以産生TaskService

    TaskService taskService =processEngine.getTaskService();

各個Service的作用

RepositoryService 管理流程定義
RuntimeService 執行管理,包括啟動,推進,删除流程執行個體等操作
TaskService 任務管理

RepositoryService

Activiti的倉庫服務類。所謂的倉庫指流程定義文檔的兩個檔案:bpmn檔案和流程圖檔

該service可以用來删除部署的流程定義。

RuntimeService

是Activiti的流程執行服務類,可以從這個服務類中擷取很多關于流程執行的相關的資訊。

TaskService

是Activiti的任務服務類。可以從這個類中擷取任務的相關資訊,如目前正在執行的個人待辦和使用者組待辦任務。

HistoryService

是Activiti的查詢曆史資訊的類,在一個流程執行完成後,這個對象為我們提供查詢曆史資訊,可以跟蹤流程執行個體對應所有待辦節點的運作情況。 ProcessDefinition

流程定義類,可以從這裡獲得資源檔案等。

ProcessInstance

代表流程定義的執行執行個體,當一個部署的流程圖啟動後,該流程隻有一條流程執行個體資料,但是它的流程任務可以有多個,每個任務對應流程圖中相應的流程節點。

入門HelloWorld程式

4.1建立流程圖方法

點選ActivitiTest項目,在src/main/java目錄下建立一個diagrams目錄用來存放流程圖

在目前項目右鍵選擇Activiti Diagram流程圖輸入流程圖名稱HelloWorld,然後點選OK

Activiti工作流基礎
Activiti工作流基礎
Activiti工作流基礎

将流程圖部署到Activiti的資料表中(1)

/**
	 * 部署流程定義(操作資料表:act_re_deployment、act_re_procdef、act_ge_bytearray)
	 */
	@Test
	public void test1(){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		RepositoryService service = processEngine.getRepositoryService();
		Deployment deployment = service.createDeployment()
		.name("helloworld入門")
		.addClasspathResource("diagrams/HelloWorld.bpmn")
		.addClasspathResource("diagrams/HelloWorld.png")
		.deploy();
		System.out.println(deployment.getId());
		System.out.println(deployment.getName());
	}

           

查詢流程定義清單

/**
	 * 查詢流程定義清單
	 */
	@Test
	public void test2() {
		// 流程定義查詢對象,用于查詢表act_re_procdef
		ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
		// 添加過濾條件
		query.processDefinitionKey("HelloWorldKsy");
		// 添加排序條件
		query.orderByProcessDefinitionVersion().desc();
		// 添加分頁查詢
		query.listPage(0, 10);
		List<ProcessDefinition> list = query.list();
		for (ProcessDefinition pd : list) {
			System.out.println(pd.getId() + "--" + pd.getName());
		}
	}

           

啟動流程執行個體

其中runtimeService.startProcessInstanceByKey(“HelloWorldKey”);中的HelloWorldKey對應流程圖中的ID值,在資料表中對應act_re_procdef流程定義表中的key字段

@Test
	public void flowStart(){
		String processDefinitionKey = "HelloWorldKsy";
		//擷取正在執行流程執行個體和執行對象相關的service
		RuntimeService runtimeService = processEngine.getRuntimeService();
		//使用流程定義key啟動流程執行個體,key對象是HelloWorld.bpmn檔案中的ID屬性值,對應的是act_re_procdef表中的key
		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
		System.out.println(processInstance.getId()); //流程執行個體ID
	}

           

啟動完流程後在act_ru_execution表中會産生一條資料,這條資料為目前流程正在執行的任務,其中act_id_字段的值對應流程圖節點的ID值

在act_ru_task表中會産生一條任務資料,execution_id_對應act_ru_execution主鍵,proc_inst_id_為流程執行個體ID,name_值為流程節點名稱,assignee_字段為該待辦目前的處理

查詢待辦任務

/**
	 * 查詢個人任務清單
	 */
	@Test
	public void test7() {
		TaskQuery query = processEngine.getTaskService().createTaskQuery();
		String assignee = "張三";
		query.taskAssignee(assignee);
		List<Task> list = query.list();
		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());
		}
	}

           

完成待辦任務

/**
	 * 辦理任務
	 */
	@Test
	public void test8(){
		String taskId= "7504";
		processEngine.getTaskService().complete(taskId);
		System.out.println("辦理完成,任務ID是:"+taskId);
	}

           

其中taskId對應act_ru_task表的主鍵ID,因為目前待辦任務為第一個節點送出申請,當執行完這個待辦後下一條待辦資料将會流轉到審批【部門經理】那,然後以此類推可以将部門經理和總經理的待辦任務全部查詢和執行完成。

小結

Activiti架構提供的Service對象

RepositoryService----操作靜态的資源(流程定義,bpmn、png)

RuntimeService-----操作流程執行個體(啟動流程執行個體、查詢流程執行個體、結束流程執行個體)

TaskService-----操作任務(查詢任務、辦理任務)

HistoryService----操作曆史資料

Activiti架構提供的對象(和表有對應關系)

Deployment-----act_re_deployment

ProcessDefinition----act_re_procdef

ProcessInstance-----act_ru_execution

Task-----act_ru_task

Activiti詳細的API

部署流程定義

/**
	 * 部署流程定義 方式一:讀取單個的流程定義檔案 方式二:讀取zip壓縮檔案
	 */
	@Test
	public void test1() {
		DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();

		// 方式一:讀取單個的流程定義檔案
		/*
		deploymentBuilder.addClasspathResource("test1.bpmn");
		deploymentBuilder.addClasspathResource("test1.png"); 
		Deployment deployment = deploymentBuilder.deploy();
		*/

		// 方式二:讀取zip壓縮檔案
		ZipInputStream zipInputStream = new ZipInputStream(this.getClass().getClassLoader().getResourceAsStream("process.zip"));
		deploymentBuilder.addZipInputStream(zipInputStream);
		deploymentBuilder.name("請假流程部署");
		Deployment deployment = deploymentBuilder.deploy();
	}


           

查詢部署清單

/**
	 * 查詢部署清單
	 */
	@Test
	public void test2() {
		// 部署查詢對象,查詢表act_re_deployment
		DeploymentQuery query = processEngine.getRepositoryService().createDeploymentQuery();
		List<Deployment> list = query.list();
		for (Deployment deployment : list) {
			String id = deployment.getId();
			String name = deployment.getName();
			System.out.println(id+"---"+name);
		}
	}

           

查詢定義清單

/**
	 * 查詢流程定義清單
	 */
	@Test
	public void test3() {
		// 流程定義查詢對象,查詢表act_re_procdef
		ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
		List<ProcessDefinition> list = query.list();
		for (ProcessDefinition pd : list) {
			String deploymentId = pd.getDeploymentId();
			System.out.println(pd.getName() + "" + pd.getId()+"部署ID:"+deploymentId);
		}
	}

           

删除部署資訊

/**
	 * 删除部署資訊
	 */
	@Test
	public void test4() {
		String deploymentId = "1";
		//1.根據流程部署id删除這一次部署的所有流程定義
		//建議一次部署隻部署一個流程,根據流程部署id删除一個流程的定義
		//限制:如果該流程定義沒有啟動流程執行個體可以删除,如果該流程定義以及啟動流程執行個體,不允許删除,如果删除就抛出異常
		// processEngine.getRepositoryService().deleteDeployment(deploymentId);
		//2.級聯删除:不管該流程定義是否啟動流程執行個體(是否使用),通過級聯删除将該流程定義及相關的資訊全部删除
		//一般情況下不适用級聯删除,一般情況下對流程定義執行暫停操作
		//特殊情況下需要删除流程定義及相關的資訊,就要使用級聯删除,删除的功能給超級管		//理員使用
		processEngine.getRepositoryService().deleteDeployment(deploymentId, true); //級聯删除
	}

           

删除流程定義

/**
	 * 删除流程定義(通過删除部署資訊達到删除流程定義的目的)
	 */
	@Test
	public void test5() {
		String deploymentId = "22501";
		// processEngine.getRepositoryService().deleteDeployment(deploymentId);
		processEngine.getRepositoryService().deleteDeployment(deploymentId,true);
	}

           

查詢部署對應的檔案流

/**
	 * 查詢一次部署對應的流程定義檔案名稱和對應的輸入流(bpmn png)
	 */
	@Test
	public void test6() throws Exception {
		String deploymentId = "20001";
		List<String> names = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);
		for (String name : names) {
			System.out.println(name);
			InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, name);
			// 将檔案儲存到本地磁盤
			File file = new File("d:\\" + name);
			File f1=new File( file.getParent());
			if(f1.exists()==false){
				f1.mkdirs();
			}
			OutputStream out = new FileOutputStream(file);
			byte[] b = new byte[1024];
			int len = 0;
			while ((len = in.read(b)) != -1) {
				out.write(b, 0, len);
			}
			out.close();
			in.close();
		}
	}

           
<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>

           
/**
	 * 查詢一次部署對應的流程定義檔案名稱和對應的輸入流(bpmn png)
	 */
	@Test
	public void test6_1() throws Exception {
		String deploymentId = "20001";
		List<String> names = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);
		for (String name : names) {
			System.out.println(name);
			InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, name);
			// 将檔案儲存到本地磁盤
			File file = new File("d:\\" + name);
			File f1=new File( file.getParent());
			if(f1.exists()==false){
				f1.mkdirs();
			}
			FileUtils.copyInputStreamToFile(in, new File("d:\\" + name));
			in.close();
		}
	}

           

擷取PNG檔案輸入流

/**
	 * 獲得png檔案的輸入流
	 */
	@Test
	public void test7() throws Exception {
		String processDefinitionId = "HelloWorldKsy:2:2504";
		InputStream pngInputStream = processEngine.getRepositoryService().getProcessDiagram(processDefinitionId);
		FileUtils.copyInputStreamToFile(pngInputStream, new File("d:\\my.png"));
	}

           

啟動流程定義2種方式

/**
	 * 啟動流程執行個體 方式一:根據流程定義的id啟動 方式二:根據流程定義的key啟動(自動選擇最新版本的流程定義啟動流程執行個體)
	 */
	@Test
	public void test8() {
		
		/*
		 * String processDefinitionId = "HelloWorldKsy:2:2504"; ProcessInstance
		 * processInstance =
		 * processEngine.getRuntimeService().startProcessInstanceById
		 * (processDefinitionId ); System.out.println(processInstance.getId());
		 */

		String processDefinitionKey = "HelloWorldKsy";
		ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey);
		System.out.println(processInstance.getId());
	}

           

根據Key啟動流程,會使用最新的的流程定義的Key。選擇最新的流程定義進行啟動!

查詢流程執行個體清單

/**
	 * 查詢流程執行個體清單,查詢act_ru_execution表
	 */
	@Test
	public void test9(){
		//流程執行個體查詢對象,查詢act_ru_execution表
		ProcessInstanceQuery query = processEngine.getRuntimeService().createProcessInstanceQuery();
		query.processDefinitionKey("HelloWorldKsy");
		query.orderByProcessInstanceId().desc();
		query.listPage(0, 2);
		List<ProcessInstance> list = query.list();
		for (ProcessInstance pi : list) {
			System.out.println(pi.getId() + " " + pi.getActivityId());
		}
	}

           

結束流程執行個體

/**
	 * 結束流程執行個體,操作的表act_ru_execution act_ru_task
	 */
	@Test
	public void test10(){
		String processInstanceId = "10001";
		processEngine.getRuntimeService().deleteProcessInstance(processInstanceId , "我願意");
	}

           

查詢任務清單

/**
	 * 查詢任務清單
	 */
	@Test
	public void test11() {
		// 任務查詢對象,查詢act_ru_task表
		TaskQuery query = processEngine.getTaskService().createTaskQuery();
		String assignee = "張三";
		query.taskAssignee(assignee);
		query.orderByTaskCreateTime().desc();
		List<Task> list = query.list();
		for (Task task : list) {
			System.out.println(task.getId());
		}
	}

           

查詢任務清單

/**
	 * 辦理任務
	 */
	@Test
	public void test12(){
		String taskId = "32504";
		processEngine.getTaskService().complete(taskId);
	}

           

查詢最新版本的流程定義清單

/**
	 * 查詢最新版本的流程定義清單
	 */
	@Test
	public void test14() {
		ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
		query.orderByProcessDefinitionVersion().asc();
		List<ProcessDefinition> list = query.list();
		Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>();
		for (ProcessDefinition pd : list) {
			map.put(pd.getKey(), pd);
		}
		ArrayList<ProcessDefinition> lastList = new ArrayList<>(map.values());
		for (ProcessDefinition processDefinition : lastList) {
			System.out.println(processDefinition.getName() + "  " + processDefinition.getVersion());
		}
	}