1. 程式人生 > >Activiti工作流筆記之——分配組任務的三種方式

Activiti工作流筆記之——分配組任務的三種方式

目錄

1.直接指定辦理人

測試程式碼:

package cn.itcast.l_groupTask;

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.history.HistoricIdentityLink;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class TaskTest {

	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	/**部署流程定義(從inputStream)*/
	@Test
	public void deploymentProcessDefinition_zip(){
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream("taskGroup.bpmn");
		InputStream inputStreamPng = this.getClass().getResourceAsStream("taskGroup.png");
		Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署物件相關的Service
							.createDeployment()//建立一個部署物件
							.name("組任務")//新增部署的名稱
							.addInputStream("taskGroup.bpmn", inputStreamBpmn)
							.addInputStream("taskGroup.png", inputStreamPng)
							.deploy();//完成部署
		System.out.println("部署ID:"+deployment.getId());//
		System.out.println("部署名稱:"+deployment.getName());//
	}
	
	/**啟動流程例項*/
	@Test
	public void startProcessInstance(){
		//流程定義的key
		String processDefinitionKey = "taskGroup";
		ProcessInstance pi = processEngine.getRuntimeService()//與正在執行的流程例項和執行物件相關的Service
						.startProcessInstanceByKey(processDefinitionKey);
		System.out.println("流程例項ID:"+pi.getId());//流程例項ID
		System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID 
	}
	
	/**查詢當前人的組任務*/
	@Test
	public void findMyGroupTask(){
		String assignee = "小D";
		List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service
						.createTaskQuery()//建立任務查詢物件
						/**查詢條件(where部分)*/
						.taskCandidateUser(assignee)//組任務的辦理人查詢
						/**排序*/
						.orderByTaskCreateTime().asc()//使用建立時間的升序排列
						/**返回結果集*/
						.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 = "6204";
		//完成任務的同時,設定流程變數,使用流程變數來指定完成任務後,下一個連線。對應sequenceFlow.bpmn  ${meassage=="不重要"}
		processEngine.getTaskService()//與正在執行的任務管理相關的Service
					.complete(taskId);
		System.out.println("完成任務:任務ID:"+taskId);
	}
	
	/**查詢正在執行的任務辦理人表*/
	@Test
	public void findRunPersonTask() {
		//任務ID
		String taskId = "6204";
		List<IdentityLink> list = processEngine.getTaskService()
									.getIdentityLinksForTask(taskId);
		if(list!=null && list.size()>0) {
			for(IdentityLink identityLink : list) {
				System.out.println(identityLink.getTaskId()+"   "+identityLink.getType()+"   "+identityLink.getUserId()+"   "+identityLink.getTaskId()+"   "+identityLink.getProcessInstanceId());
			}
		}
	}
	
	/**查詢歷史任務的辦理人表*/
	@Test
	public void findHistoryPersonTask() {
		//流程例項ID
		String processInstanceId ="6201";
		List<HistoricIdentityLink> list = processEngine.getHistoryService()
					.getHistoricIdentityLinksForProcessInstance(processInstanceId);
		if(list!=null && list.size()>0) {
			for(HistoricIdentityLink identityLink : list) {
				System.out.println(identityLink.getTaskId()+"   "+identityLink.getType()+"   "+identityLink.getUserId()+"   "+identityLink.getTaskId()+"   "+identityLink.getProcessInstanceId());
			}
		}
	}
	
	/**拾取任務,將組任務分給個人任務,指定任務的辦理人欄位*/
	@Test
	public void claim() {
		//將組任務分配給個人
		//任務ID
		String taskId = "6204";
		String assignee = "小A";
		//分配的個人任務(可以時組任務中的成員,也可以是非組任務的成員)
		processEngine.getTaskService()
					.claim(taskId, assignee);
	}
	/**將個人任務回退到組任務,前提,之前一定是個組任務*/
	@Test
	public void setAssignee() {
		//任務ID
		String taskId = "6204";
		processEngine.getTaskService()
					.setAssignee(taskId, null);
	}
	/**向組任務中新增成員*/
	@Test
	public void addGroupUser() {
		//任務ID
		String taskId = "6204";
		//成員辦理人
		String userId = "大H";
		processEngine.getTaskService()
					.addCandidateUser(taskId, userId);
	}
	/**從組任務中刪除成員*/
	@Test
	public void deleteGroupUser() {
		//任務ID
		String taskId = "6204";
		//成員辦理人
		String userId = "小D";
		processEngine.getTaskService()
					.deleteCandidateUser(taskId, userId);
	}
	
	/**流程定義的刪除*/
	@Test
	public void deleteDefinitionTest() {
		String deploymentId = "1701";
		processEngine.getRepositoryService()
					.deleteDeployment(deploymentId, true);//帶級聯刪除
		System.out.println("刪除成功");
		
	}
}

說明:

1) 小A,小B,小C,小D是組任務的辦理人

2) 但是這樣分配組任務的辦理人不夠靈活,因為專案開發中任務的辦理人不要放置XML檔案中。

3) act_ru_identitylink表存放任務的辦理人,包括個人任務和組任務,表示正在執行的任務

4) act_hi_identitylink表存放任務的辦理人,包括個人任務和組任務,表示歷史任務

區別在於:如果是個人任務TYPE的型別表示participant(參與者)

                如果是組任務TYPE的型別表示candidate(候選者)和participant(參與者)

2.使用流程變數

測試程式碼:

package cn.itcast.l_groupTask;

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.history.HistoricIdentityLink;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class TaskTest {

	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	/**部署流程定義(從inputStream)*/
	@Test
	public void deploymentProcessDefinition_zip(){
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream("taskGroup.bpmn");
		InputStream inputStreamPng = this.getClass().getResourceAsStream("taskGroup.png");
		Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署物件相關的Service
							.createDeployment()//建立一個部署物件
							.name("組任務")//新增部署的名稱
							.addInputStream("taskGroup.bpmn", inputStreamBpmn)
							.addInputStream("taskGroup.png", inputStreamPng)
							.deploy();//完成部署
		System.out.println("部署ID:"+deployment.getId());//
		System.out.println("部署名稱:"+deployment.getName());//
	}
	
	/**啟動流程例項*/
	@Test
	public void startProcessInstance(){
		//流程定義的key
		String processDefinitionKey = "taskGroup";
		/**啟動流程例項的同時,設定流程變數,是流程變數哦那個來指定任務的辦理人,對應task.bpmn檔案中#{userIDs}*/
		Map<String,Object> variables = new HashMap<String,Object>();
		variables.put("userIDs", "大大,中中,小小");
		
		ProcessInstance pi = processEngine.getRuntimeService()//與正在執行的流程例項和執行物件相關的Service
						.startProcessInstanceByKey(processDefinitionKey,variables);
		System.out.println("流程例項ID:"+pi.getId());//流程例項ID
		System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID 
	}
	
	/**查詢當前人的組任務*/
	@Test
	public void findMyGroupTask(){
		String assignee = "大大";
		List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service
						.createTaskQuery()//建立任務查詢物件
						/**查詢條件(where部分)*/
						.taskCandidateUser(assignee)//組任務的辦理人查詢
						/**排序*/
						.orderByTaskCreateTime().asc()//使用建立時間的升序排列
						/**返回結果集*/
						.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 = "7005";
		//完成任務的同時,設定流程變數,使用流程變數來指定完成任務後,下一個連線。對應sequenceFlow.bpmn  ${meassage=="不重要"}
		processEngine.getTaskService()//與正在執行的任務管理相關的Service
					.complete(taskId);
		System.out.println("完成任務:任務ID:"+taskId);
	}
	
	/**查詢正在執行的任務辦理人表*/
	@Test
	public void findRunPersonTask() {
		//任務ID
		String taskId = "6204";
		List<IdentityLink> list = processEngine.getTaskService()
									.getIdentityLinksForTask(taskId);
		if(list!=null && list.size()>0) {
			for(IdentityLink identityLink : list) {
				System.out.println(identityLink.getTaskId()+"   "+identityLink.getType()+"   "+identityLink.getUserId()+"   "+identityLink.getTaskId()+"   "+identityLink.getProcessInstanceId());
			}
		}
	}
	
	/**查詢歷史任務的辦理人表*/
	@Test
	public void findHistoryPersonTask() {
		//流程例項ID
		String processInstanceId ="6201";
		List<HistoricIdentityLink> list = processEngine.getHistoryService()
					.getHistoricIdentityLinksForProcessInstance(processInstanceId);
		if(list!=null && list.size()>0) {
			for(HistoricIdentityLink identityLink : list) {
				System.out.println(identityLink.getTaskId()+"   "+identityLink.getType()+"   "+identityLink.getUserId()+"   "+identityLink.getTaskId()+"   "+identityLink.getProcessInstanceId());
			}
		}
	}
	
	/**拾取任務,將組任務分給個人任務,指定任務的辦理人欄位*/
	@Test
	public void claim() {
		//將組任務分配給個人
		//任務ID
		String taskId = "7005";
		String assignee = "大大";
		//分配的個人任務(可以時組任務中的成員,也可以是非組任務的成員)
		processEngine.getTaskService()
					.claim(taskId, assignee);
	}
	/**將個人任務回退到組任務,前提,之前一定是個組任務*/
	@Test
	public void setAssignee() {
		//任務ID
		String taskId = "6204";
		processEngine.getTaskService()
					.setAssignee(taskId, null);
	}
	/**向組任務中新增成員*/
	@Test
	public void addGroupUser() {
		//任務ID
		String taskId = "6204";
		//成員辦理人
		String userId = "大H";
		processEngine.getTaskService()
					.addCandidateUser(taskId, userId);
	}
	/**從組任務中刪除成員*/
	@Test
	public void deleteGroupUser() {
		//任務ID
		String taskId = "6204";
		//成員辦理人
		String userId = "小D";
		processEngine.getTaskService()
					.deleteCandidateUser(taskId, userId);
	}
	
	/**流程定義的刪除*/
	@Test
	public void deleteDefinitionTest() {
		String deploymentId = "1701";
		processEngine.getRepositoryService()
					.deleteDeployment(deploymentId, true);//帶級聯刪除
		System.out.println("刪除成功");
		
	}
}

3.使用監聽類

監聽類:

package cn.itcast.l_groupTask2;

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;

@SuppressWarnings("serial")
public class TaskListenerImpl implements TaskListener {

	/**用來指定任務的辦理人*/
	@Override
	public void notify(DelegateTask delegateTask) {
		//指定個人任務的辦理人,也可以指定組任務的辦理人
		//個人任務:通過類去查資料庫,將下一個任務的辦理人查詢獲取,然後通過setAssignee()的方法指定任務的辦理人
		//delegateTask.setAssignee("滅絕師太");
		//組任務:
		delegateTask.addCandidateUser("郭靖");
		delegateTask.addCandidateUser("黃蓉");
		

	}

}

相關推薦

Activiti工作筆記——分配任務方式

目錄 1.直接指定辦理人 測試程式碼: package cn.itcast.l_groupTask; import java.io.InputStream; import java.util.HashMap; import java.util.Li

Activity工作筆記——根據任務ID獲取當前活動物件的連線名稱集合

/**二:已知任務ID,查詢ProcessDefinitionEntity物件,從而獲取當前任務完成之後的連線名稱,並放置到List<String>集合中*/ @Override public List<String> findOutComeLis

activiti 工作 動態 設定 指定 節點任務人、責任人、 的實現方式

首先給大家看一下我的流程圖: 流程檔案leaveBill.bpmn <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/2

BI筆記--- SSAS部署的幾方式

 SSAS庫的部署有很多種方式,根據環境的不同可以選擇不同的方法,本文列舉幾種最常見的部署方式,以及闡述他們的應用環境。 環境約定:SQL Server 2008 示例庫:Adventure Works DW 方式一:Visual Studio直接Deploy 這

Android——ContentResolver查詢的方式

popu com 耗時 封裝 target 最適 token res 數據庫 轉載請註明出處:http://blog.csdn.net/l1028386804/article/details/47785491 今天做到一個小項目。查詢手機中短信的信息,當然得去系

創建數方式

常用 關系 ray tro 方式 array 長度 輸入 length 1、關鍵字 var 變量名= Array(); 當傳入一個值的時候代表數組的長度 如果輸入2個值的時候代表數組的數據 var arr = Array(30,20); consol

四十一、瀑布佈局(js,jquery,css3方式

一、 簡介 1. 實現瀑布流的方法: JavaScript 原生方法、 jquery 方法、 css3 的多欄佈局 二、js 原生方法實現 -- 思想 1. 瀑布流的特點: 等寬不等高 <

SpringMVC總結異常處理的方式

目錄 1.使用Spring MVC提供的簡單異常處理器SimpleMappingExceptionResolver 2.實現Spring的異常處理介面HandlerExceptionResolver 自定義自己的異常處理器 3.使用@ExceptionHandler註解實現異常處理

java學習產生隨機數的方式

  隨機數在實際中使用很廣泛,比如要隨即生成一個固定長度的字串、數字。或者隨即生成一個不定長度的數字、或者進行一個模擬的隨機選擇等等。Java提供了最基本的工具,可以幫助開發者來實現這一切。   一、Java隨機數的產生方式   在Java中,隨機數的概念從廣義上將,有三種。   1、通過Syste

專案中加入activiti後,使用者許可權管理處理的方式

相信每個涉及到使用者的系統都有一套使用者許可權管理平臺或者模組,用來維護使用者以及在系統內的功能、資料許可權,我們使用的Activiti工作流引擎配套設計了包括User、Group的Identify模組,怎麼和業務資料同步呢,這個問題是每個新人必問的問題之一,下面介紹幾種同步方案,最後總結比較。 方案一:呼

IO-3、檔案分配塊的方式

計算機的記憶體大小有限,而且屬於易失性(就是拔掉電源或者關機,所儲存的資料就消失了)的儲存介質,所以許多檔案是存放在磁碟上,對磁碟的訪問屬於I/O操作,磁碟的訪問速率就對計算機的效能有舉足輕重的影響。在此我只淺談檔案的儲存分配方式以及訪問策略,對硬體的訪問速率不做討論。(磁

Activiti工作--任務分配--

使用者任務分配主要有三種方式 將任務分配個某個人 將任務分配個某群人 將任務分配個某個角色(組) 將任務分配個某個人有三個途徑 在流程設計當中指定處理任務的某個人 在流程設計的時候用流程變數的方式指定任務處理人,然後在前面的流程處理完的時候用流程變數指定某

Activiti工作--任務角色的設定--十二(完結)

將任務分配給某個角色 在流程設計當中指定處理任務的某個角色 (注意:新增處理人員不是在assignee選項 而是 cadidate group) 在流程設計的時候用流程變數的方式指定某個角色作為處理人,然後在前面的流程處理完的時候用流程變數指定某些角色的人傳

Activiti工作任務的執行/查詢/完成

8張表: SELECT * FROM act_re_deployment; -- 一 流程部署表 SELECT * FROM act_ge_bytearray; -- 二 流程二進位制表

Activiti 學習筆記13:分配任務

一、流程圖 二、分配組任務方式一(直接指定辦理人) 1:流程圖中任務節點的配置 2:測試程式碼 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

Activiti工作基礎學習筆記

一、瞭解工作流 工作流(Workflow),就是“業務過程的部分或整體在計算機應用環境下的自動化”,它主要解決的是“使在多個參與者之間按照某種預定義的規則傳遞文件、資訊或任務的過程自動進行,從而實現某個預期的業務目標,或者促使此目標的實現”。 工作流管理系統(Workflow Management Syst

Activiti工作--流程定義--

       由於概念性的東西這裡就不在做更多的介紹了,下面直接對activiti的流程進行介紹,為了方便大家的更快的熟悉流程,在此處我就直接上程式碼介紹,本人技術水平有限,有不正確之處還請大家指出,多謝大家的海涵,在此謝過了!!! 配置資料庫連線 activi

Activiti工作--流程變數的設定與應用--

流程變數 在流程執行或者任務執行過程中,用於設定和獲取變數,工作流引擎通過使用流程變數在溜車鞥的執行過程中傳遞引數。 流程變數的作用域 只對應一個流程例項,也就是各個流程之間的變數是相互不影響的。 流程變數的設定 流程變數可以在流程例項啟動的時候,在任

Activiti工作--流程變數應用之一:選擇連線--

流程的業務描述 財務報賬審批流程: 如果財務主管接到審批任務,發現金額只有500時,自己審批完流程結束 如果財務主管接到審批任務,發現金額是1000時,審批完以後轉給財務經理繼續審批,財務經理審批完流程結束 先獲取連線 private ProcessEngi

Activiti工作--並行閘道器--

流程的業務描述 會議記錄會籤 並行閘道器是不需要設定流程變數的,並行閘道器不在流程變數的範圍內 比如: 在開完某個產品設計會以後,需要對會議約定一些事項進行簽字畫押涉及到兩個部門(產品部/研發部)的主管和經理 確認的順序: a:產品部的主管確認然後產品部的經