Activiti——工作流之流程实例、任务的执行(五)
轉自:http://profound-accumulation.iteye.com/blog/2244881
一、流程圖
??二、部署流程定義
/**部署請假流程(從zip)*/ @Test public void deploymentProcessDefinition_zip(){ InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/leave.zip"); ZipInputStream zipInputStream = new ZipInputStream(in); Deployment deployment = processEngine.getRepositoryService()/**與請假流程和部署對象相關的Service*/ .createDeployment()/**創建一個部署對象*/ .name("請假流程")/**添加部署的名稱*/ .addZipInputStream(zipInputStream)/**指定zip格式的文件完成部署*/ .deploy();/**完成部署*/ /** * 部署ID:1 * 部署名稱:請假流程 */ System.out.println("部署ID:"+deployment.getId());// System.out.println("部署名稱:"+deployment.getName());// }
三、啟動流程實例
/**啟動流程實例*/ @Test public void startProcessInstance(){ /**請假流程的key*/ String processDefinitionKey = "leave"; ProcessInstance pi = processEngine.getRuntimeService()/**與正在執行的流程實例和執行對象相關的Service*/ .startProcessInstanceByKey(processDefinitionKey);/**使用請假流程的key啟動流程實例,key對應leave.bpmn文件中id的屬性值,使用key值啟動,默認是按照最新版本的請假流程啟動*/ /** * 流程實例ID:101 * 請假流程ID:leave:1:4 */ System.out.println("流程實例ID:"+pi.getId()); System.out.println("請假流程ID:"+pi.getProcessDefinitionId()); }
說明:
1)操作數據庫的act_ru_execution表,如果是用戶任務節點,同時也會在act_ru_task添加一條記錄
四、查詢我的個人任務
/**查詢當前人的個人任務:查詢act_ru_task表信息*/ @Test public void findMyPersonalTask(){ /** * 任務ID:104 * 任務名稱:提交申請 */ //String assignee = "張三"; /** * 任務ID:202 * 任務名稱:審批【部門經理】 */ //String assignee = "李四"; /** * 任務ID:302 * 任務名稱:審批【總經理】 */ 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稍后詳細講,在這種情況下,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 = "104"; //String taskId = "202"; String taskId = "302"; processEngine.getTaskService()/**與正在執行的任務管理相關的Service*/ .complete(taskId); System.out.println("完成任務:任務ID:"+taskId); }
?說明:
1)是辦理任務,所以從ProcessEngine得到的是TaskService。
2)當執行完這段代碼,再以員工的身份去執行查詢的時候,會發現這個時候已經沒有數據了,因為正在執行的任務中沒有數據。
3)對于執行完的任務,activiti將從act_ru_task表中刪除該任務,下一個任務會被插入進來。
4)以”部門經理”的身份進行查詢,可以查到結果。因為流程執行到部門經理審批這個節點了。
5)再執行辦理任務代碼,執行完以后以”部門經理”身份進行查詢,沒有結果。
6)重復第3和4步直到流程執行完。
六、查詢流程狀態(判斷流程正在執行,還是結束)
/**查詢流程狀態(判斷流程正在執行,還是結束)*/ @Test public void isProcessEnd(){ String processInstanceId = "101"; 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的實例是否存在,如果結果為空,則代表流程結束,實例在正在執行的執行對象表中已被刪除,轉換成歷史數據。
七、查詢歷史任務
/**查詢歷史任務(查詢act_hi_task表信息)*/ @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("################################"); } } } 八、查詢歷史流程實例
**查詢歷史流程實例(查詢act_hi_actinst表信息)*/ @Test public void findHistoryProcessInstance(){ String processInstanceId = "101"; HistoricProcessInstance hpi = processEngine.getHistoryService()/**與歷史數據(歷史表)相關的Service*/ .createHistoricProcessInstanceQuery()/**創建歷史流程實例查詢*/ .processInstanceId(processInstanceId)/**使用流程實例ID查詢*/ .singleResult(); System.out.println(hpi.getId()+" "+hpi.getProcessDefinitionId()+" "+hpi.getStartTime()+" "+hpi.getEndTime()+" "+hpi.getDurationInMillis()); } 九、總結
Execution?? 執行對象
?按流程定義的規則執行一次的過程.
?對應的表:
? act_ru_execution: 正在執行的信息
? act_hi_procinst:已經執行完的歷史流程實例信息
? act_hi_actinst:存放歷史所有完成的活動
ProcessInstance? 流程實例
?特指流程從開始到結束的那個最大的執行分支,一個執行的流程中,流程實例只有1個。
注意
??? (1)如果是單例流程,執行對象ID就是流程實例ID
??? (2)如果一個流程有分支和聚合,那么執行對象ID和流程實例ID就不相同
??? (3)一個流程中,流程實例只有1個,執行對象可以存在多個。
Task 任務
?執行到某任務環節時生成的任務信息。
?對應的表:
? act_ru_task:正在執行的任務信息
? act_hi_taskinst:已經執行完的歷史任務信息
總結
以上是生活随笔為你收集整理的Activiti——工作流之流程实例、任务的执行(五)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cc霜多少钱啊?
- 下一篇: 计算机网络实验报告建立校园网,计算机网络