Activiti——工作流之流程实例、任务的执行(五)
轉(zhuǎn)自:http://profound-accumulation.iteye.com/blog/2244881
一、流程圖
??二、部署流程定義
/**部署請(qǐng)假流程(從zip)*/ @Test public void deploymentProcessDefinition_zip(){ InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/leave.zip"); ZipInputStream zipInputStream = new ZipInputStream(in); Deployment deployment = processEngine.getRepositoryService()/**與請(qǐng)假流程和部署對(duì)象相關(guān)的Service*/ .createDeployment()/**創(chuàng)建一個(gè)部署對(duì)象*/ .name("請(qǐng)假流程")/**添加部署的名稱*/ .addZipInputStream(zipInputStream)/**指定zip格式的文件完成部署*/ .deploy();/**完成部署*/ /** * 部署ID:1 * 部署名稱:請(qǐng)假流程 */ System.out.println("部署ID:"+deployment.getId());// System.out.println("部署名稱:"+deployment.getName());// }
三、啟動(dòng)流程實(shí)例
/**啟動(dòng)流程實(shí)例*/ @Test public void startProcessInstance(){ /**請(qǐng)假流程的key*/ String processDefinitionKey = "leave"; ProcessInstance pi = processEngine.getRuntimeService()/**與正在執(zhí)行的流程實(shí)例和執(zhí)行對(duì)象相關(guān)的Service*/ .startProcessInstanceByKey(processDefinitionKey);/**使用請(qǐng)假流程的key啟動(dòng)流程實(shí)例,key對(duì)應(yīng)leave.bpmn文件中id的屬性值,使用key值啟動(dòng),默認(rèn)是按照最新版本的請(qǐng)假流程啟動(dòng)*/ /** * 流程實(shí)例ID:101 * 請(qǐng)假流程ID:leave:1:4 */ System.out.println("流程實(shí)例ID:"+pi.getId()); System.out.println("請(qǐng)假流程ID:"+pi.getProcessDefinitionId()); }
說(shuō)明:
1)操作數(shù)據(jù)庫(kù)的act_ru_execution表,如果是用戶任務(wù)節(jié)點(diǎn),同時(shí)也會(huì)在act_ru_task添加一條記錄
四、查詢我的個(gè)人任務(wù)
/**查詢當(dāng)前人的個(gè)人任務(wù):查詢act_ru_task表信息*/ @Test public void findMyPersonalTask(){ /** * 任務(wù)ID:104 * 任務(wù)名稱:提交申請(qǐng) */ //String assignee = "張三"; /** * 任務(wù)ID:202 * 任務(wù)名稱:審批【部門經(jīng)理】 */ //String assignee = "李四"; /** * 任務(wù)ID:302 * 任務(wù)名稱:審批【總經(jīng)理】 */ String assignee = "王五"; List<Task> list = processEngine.getTaskService()/**與正在執(zhí)行的任務(wù)管理相關(guān)的Service*/ .createTaskQuery()/**創(chuàng)建任務(wù)查詢對(duì)象*/ /**查詢條件(where部分)*/ .taskAssignee(assignee)/**指定個(gè)人任務(wù)查詢,指定辦理人*/
// .taskCandidateUser(candidateUser)/**組任務(wù)的辦理人查詢*/
// .processDefinitionId(processDefinitionId)/**使用請(qǐng)假流程ID查詢*/
// .processInstanceId(processInstanceId)/**使用流程實(shí)例ID查詢*/
// .executionId(executionId)/**使用執(zhí)行對(duì)象ID查詢*/ /**排序*/ .orderByTaskCreateTime().asc()/**使用創(chuàng)建時(shí)間的升序排列*/ /**返回結(jié)果集*/
// .singleResult()/**返回惟一結(jié)果集*/
// .count()/**返回結(jié)果集的數(shù)量*/
// .listPage(firstResult, maxResults);/**分頁(yè)查詢*/ .list();/**返回列表*/ if(list!=null && list.size()>0){ for(Task task:list){ System.out.println("任務(wù)ID:"+task.getId()); System.out.println("任務(wù)名稱:"+task.getName()); System.out.println("任務(wù)的創(chuàng)建時(shí)間:"+task.getCreateTime()); System.out.println("任務(wù)的辦理人:"+task.getAssignee()); System.out.println("流程實(shí)例ID:"+task.getProcessInstanceId()); System.out.println("執(zhí)行對(duì)象ID:"+task.getExecutionId()); System.out.println("請(qǐng)假流程ID:"+task.getProcessDefinitionId()); System.out.println("########################################################"); } } } ?說(shuō)明:
1)因?yàn)槭侨蝿?wù)查詢,所以從processEngine中應(yīng)該得到TaskService
2)使用TaskService獲取到任務(wù)查詢對(duì)象TaskQuery
3)為查詢對(duì)象添加查詢過(guò)濾條件,使用taskAssignee指定任務(wù)的辦理者(即查詢指定用戶的代辦任務(wù)),同時(shí)可以添加分頁(yè)排序等過(guò)濾條件
4)調(diào)用list方法執(zhí)行查詢,返回辦理者為指定用戶的任務(wù)列表
5)任務(wù)ID、名稱、辦理人、創(chuàng)建時(shí)間可以從act_ru_task表中查到。
6)Execution與ProcessInstance稍后詳細(xì)講,在這種情況下,ProcessInstance相當(dāng)于Execution
7)如果assignee屬性為部門經(jīng)理,結(jié)果為空。因?yàn)楝F(xiàn)在流程只到了”填寫請(qǐng)假申請(qǐng)”階段,后面的任務(wù)還沒(méi)有執(zhí)行,即在數(shù)據(jù)庫(kù)中沒(méi)有部門經(jīng)理可以辦理的任務(wù),所以查詢不到。
8)一個(gè)Task節(jié)點(diǎn)和Execution節(jié)點(diǎn)是1對(duì)1的情況,在task對(duì)象中使用Execution_來(lái)表示他們之間的關(guān)系
9)任務(wù)ID在數(shù)據(jù)庫(kù)表act_ru_task中對(duì)應(yīng)“ID_”列
附加:
在activiti任務(wù)中,主要分為兩大類查詢?nèi)蝿?wù)(個(gè)人任務(wù)和組任務(wù)):
1.確切指定了辦理者的任務(wù),這個(gè)任務(wù)將成為指定者的私有任務(wù),即個(gè)人任務(wù)。
2.無(wú)法指定具體的某一個(gè)人來(lái)辦理的任務(wù),可以把任務(wù)分配給幾個(gè)人或者一到?多個(gè)小組,讓這個(gè)范圍內(nèi)的用戶可以選擇性(如有空余時(shí)間時(shí))來(lái)辦理這類任務(wù),即組任務(wù)。
先知道個(gè)人任務(wù)的查詢和辦理,組任務(wù)的操作后面講
五、辦理任務(wù)
/**辦理任務(wù):完成我的任務(wù)*/ @Test public void completeMyPersonalTask(){ /**任務(wù)ID*/ //String taskId = "104"; //String taskId = "202"; String taskId = "302"; processEngine.getTaskService()/**與正在執(zhí)行的任務(wù)管理相關(guān)的Service*/ .complete(taskId); System.out.println("完成任務(wù):任務(wù)ID:"+taskId); }
?說(shuō)明:
1)是辦理任務(wù),所以從ProcessEngine得到的是TaskService。
2)當(dāng)執(zhí)行完這段代碼,再以員工的身份去執(zhí)行查詢的時(shí)候,會(huì)發(fā)現(xiàn)這個(gè)時(shí)候已經(jīng)沒(méi)有數(shù)據(jù)了,因?yàn)檎趫?zhí)行的任務(wù)中沒(méi)有數(shù)據(jù)。
3)對(duì)于執(zhí)行完的任務(wù),activiti將從act_ru_task表中刪除該任務(wù),下一個(gè)任務(wù)會(huì)被插入進(jìn)來(lái)。
4)以”部門經(jīng)理”的身份進(jìn)行查詢,可以查到結(jié)果。因?yàn)榱鞒虉?zhí)行到部門經(jīng)理審批這個(gè)節(jié)點(diǎn)了。
5)再執(zhí)行辦理任務(wù)代碼,執(zhí)行完以后以”部門經(jīng)理”身份進(jìn)行查詢,沒(méi)有結(jié)果。
6)重復(fù)第3和4步直到流程執(zhí)行完。
六、查詢流程狀態(tài)(判斷流程正在執(zhí)行,還是結(jié)束)
/**查詢流程狀態(tài)(判斷流程正在執(zhí)行,還是結(jié)束)*/ @Test public void isProcessEnd(){ String processInstanceId = "101"; ProcessInstance pi = processEngine.getRuntimeService()/**表示正在執(zhí)行的流程實(shí)例和執(zhí)行對(duì)象*/ .createProcessInstanceQuery()/**創(chuàng)建流程實(shí)例查詢*/ .processInstanceId(processInstanceId)/**使用流程實(shí)例ID查詢*/ .singleResult(); if(pi==null){ System.out.println("流程已經(jīng)結(jié)束"); } else{ System.out.println("流程沒(méi)有結(jié)束"); } } ?在流程執(zhí)行的過(guò)程中,創(chuàng)建的流程實(shí)例ID在整個(gè)過(guò)程中都不會(huì)變,當(dāng)流程結(jié)束后,流程實(shí)例將會(huì)在正在執(zhí)行的執(zhí)行對(duì)象表中(act_ru_execution)被刪除
?說(shuō)明:
1)因?yàn)槭遣樵兞鞒虒?shí)例,所以先獲取runtimeService
2)創(chuàng)建流程實(shí)例查詢對(duì)象,設(shè)置實(shí)例ID過(guò)濾參數(shù)
3)由于一個(gè)流程實(shí)例ID只對(duì)應(yīng)一個(gè)實(shí)例,使用singleResult執(zhí)行查詢返回一個(gè)唯一的結(jié)果,如果結(jié)果數(shù)量大于1,則拋出異常
4)判斷指定ID的實(shí)例是否存在,如果結(jié)果為空,則代表流程結(jié)束,實(shí)例在正在執(zhí)行的執(zhí)行對(duì)象表中已被刪除,轉(zhuǎn)換成歷史數(shù)據(jù)。
七、查詢歷史任務(wù)
/**查詢歷史任務(wù)(查詢act_hi_task表信息)*/ @Test public void findHistoryTask(){ String taskAssignee = "張三"; List<HistoricTaskInstance> list = processEngine.getHistoryService()/**與歷史數(shù)據(jù)(歷史表)相關(guān)的Service*/ .createHistoricTaskInstanceQuery()/**創(chuàng)建歷史任務(wù)實(shí)例查詢*/ .taskAssignee(taskAssignee)/**指定歷史任務(wù)的辦理人*/ .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("################################"); } } } 八、查詢歷史流程實(shí)例
**查詢歷史流程實(shí)例(查詢act_hi_actinst表信息)*/ @Test public void findHistoryProcessInstance(){ String processInstanceId = "101"; HistoricProcessInstance hpi = processEngine.getHistoryService()/**與歷史數(shù)據(jù)(歷史表)相關(guān)的Service*/ .createHistoricProcessInstanceQuery()/**創(chuàng)建歷史流程實(shí)例查詢*/ .processInstanceId(processInstanceId)/**使用流程實(shí)例ID查詢*/ .singleResult(); System.out.println(hpi.getId()+" "+hpi.getProcessDefinitionId()+" "+hpi.getStartTime()+" "+hpi.getEndTime()+" "+hpi.getDurationInMillis()); } 九、總結(jié)
Execution?? 執(zhí)行對(duì)象
?按流程定義的規(guī)則執(zhí)行一次的過(guò)程.
?對(duì)應(yīng)的表:
? act_ru_execution: 正在執(zhí)行的信息
? act_hi_procinst:已經(jīng)執(zhí)行完的歷史流程實(shí)例信息
? act_hi_actinst:存放歷史所有完成的活動(dòng)
ProcessInstance? 流程實(shí)例
?特指流程從開(kāi)始到結(jié)束的那個(gè)最大的執(zhí)行分支,一個(gè)執(zhí)行的流程中,流程實(shí)例只有1個(gè)。
注意
??? (1)如果是單例流程,執(zhí)行對(duì)象ID就是流程實(shí)例ID
??? (2)如果一個(gè)流程有分支和聚合,那么執(zhí)行對(duì)象ID和流程實(shí)例ID就不相同
??? (3)一個(gè)流程中,流程實(shí)例只有1個(gè),執(zhí)行對(duì)象可以存在多個(gè)。
Task 任務(wù)
?執(zhí)行到某任務(wù)環(huán)節(jié)時(shí)生成的任務(wù)信息。
?對(duì)應(yīng)的表:
? act_ru_task:正在執(zhí)行的任務(wù)信息
? act_hi_taskinst:已經(jīng)執(zhí)行完的歷史任務(wù)信息
總結(jié)
以上是生活随笔為你收集整理的Activiti——工作流之流程实例、任务的执行(五)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: cc霜多少钱啊?
- 下一篇: 去泰国需要多少钱啊?