日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Activiti——工作流之流程实例、任务的执行(五)

發布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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——工作流之流程实例、任务的执行(五)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。