天天看點

Activiti工作流(6):流程執行個體、任務的執行

啟動流程執行個體

<span style="font-size:12px;">	/**啟動流程執行個體*/
	@Test
	public void startProcessInstance(){
		//流程定義的key
		String processDefinitionKey = "helloworld";
		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
	}</span>
           

代碼說明:

操作資料庫的act_ru_execution表,如果是使用者任務節點,同時也會在act_ru_task添加一條記錄

查詢我的個人任務

/**查詢目前人的個人任務*/
	@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("########################################################");
			}
		}
	}
           

代碼說明:

1)       因為是任務查詢,是以從processEngine中應該得到TaskService

2)       使用TaskService擷取到任務查詢對象TaskQuery

3)       為查詢對象添加查詢過濾條件,使用taskAssignee指定任務的辦理者(即查詢指定使用者的代辦任務),同時可以添加分頁排序等過濾條件

4)       調用list方法執行查詢,傳回辦理者為指定使用者的任務清單

5)       任務ID、名稱、辦理人、建立時間可以從act_ru_task表中查到。

6)       Execution與ProcessInstance見5.6和5.7章節的介紹。在這種情況下,ProcessInstance相當于Execution

7)       如果assignee屬性為部門經理,結果為空。因為現在流程隻到了”填寫請假申請”階段,後面的任務還沒有執行,即在資料庫中沒有部門經理可以辦理的任務,是以查詢不到。

8)       一個Task節點和Execution節點是1對1的情況,在task對象中使用Execution_來表示他們之間的關系

9)       任務ID在資料庫表act_ru_task中對應“ID_”列

附加:

在activiti任務中,主要分為兩大類查詢任務(個人任務群組任務):

1.确切指定了辦理者的任務,這個任務将成為指定者的私有任務,即個人任務。

2.無法指定具體的某一個人來辦理的任務,可以把任務配置設定給幾個人或者一到 多個小組,讓這個範圍内的使用者可以選擇性(如有空餘時間時)來辦理這類任務,即組任務。

辦理任務

/**辦理我的任務*/
	@Test
	public void completeMyPersonalTask(){
		//任務ID
		String taskId = "1202";
		processEngine.getTaskService()//與正在執行的任務管理相關的Service
					.complete(taskId);
		System.out.println("完成任務:任務ID:"+taskId);
	}
           

說明:

1)     是辦理任務,是以從ProcessEngine得到的是TaskService。

2)     當執行完這段代碼,再以員工的身份去執行查詢的時候,會發現這個時候已經沒有資料了,因為正在執行的任務中沒有資料。

3)     對于執行完的任務,activiti将從act_ru_task表中删除該任務,下一個任務會被插入進來。

4)     以”部門經理”的身份進行查詢,可以查到結果。因為流程執行到部門經理審批這個節點了。

5)     再執行辦理任務代碼,執行完以後以”部門經理”身份進行查詢,沒有結果。

重複第3和4步直到流程執行完。

查詢流程狀态

/**查詢流程狀态*/
	@Test
	public void isProcessEnd(){
		String processInstanceId = "1001";
		ProcessInstance pi = processEngine.getRuntimeService()//表示正在執行的流程執行個體和執行對象
						.createProcessInstanceQuery()//建立流程執行個體查詢
						.processInstanceId(processInstanceId)//使用流程執行個體ID查詢
						.singleResult();
		if(pi==null){
			System.out.println("流程已經結束");
		}
		else{
			System.out.println("流程沒有結束");
		}
	}
           

在流程執行的過程中,建立的流程執行個體ID在整個過程中都不會變,當流程結束後,流程執行個體将會在正在執行的執行對象表中(act_ru_execution)被删除

       說明:

1)       因為是查詢流程執行個體,是以先擷取runtimeService

2)       建立流程執行個體查詢對象,設定執行個體ID過濾參數

3)       由于一個流程執行個體ID隻對應一個執行個體,使用singleResult執行查詢傳回一個唯一的結果,如果結果數量大于1,則抛出異常

4)       判斷指定ID的執行個體是否存在,如果結果為空,則代表流程結束,執行個體在正在執行的執行對象表中已被删除,轉換成曆史資料。

查詢曆史任務

@Test
	public void findHistoryTask(){
		String taskAssignee = "張三";
		List<HistoricTaskInstance> list = processEngine.getHistoryService()//與曆史資料(曆史表)相關的Service
						.createHistoricTaskInstanceQuery()//建立曆史任務執行個體查詢
						.taskAssignee(taskAssignee)//指定曆史任務的辦理人
						.list();
		if(list!=null && list.size()>0){
			for(HistoricTaskInstance hti:list){
				System.out.println(hti.getId()+"    "+hti.getName()+"    "+hti.getProcessInstanceId()+"   "+hti.getStartTime()+"   "+hti.getEndTime()+"   "+hti.getDurationInMillis());
				System.out.println("################################");
			}
		}
	}
           

查詢曆史流程執行個體

@Test
	public void findHistoryProcessInstance(){
		String processInstanceId = "1001";
		HistoricProcessInstance hpi = processEngine.getHistoryService()//與曆史資料(曆史表)相關的Service
						.createHistoricProcessInstanceQuery()//建立曆史流程執行個體查詢
						.processInstanceId(processInstanceId)//使用流程執行個體ID查詢
						.singleResult();
		System.out.println(hpi.getId()+"    "+hpi.getProcessDefinitionId()+"    "+hpi.getStartTime()+"    "+hpi.getEndTime()+"     "+hpi.getDurationInMillis());
	}
           

繼續閱讀