(七)、Activiti 組任務
(七)、Activiti 組任務
1、簡介
在流程定義中在任務結點的 assignee 固定設置任務負責人,在流程定義時將參與者固定設置在.bpmn 文件中,如果臨時任務負責人變更則需要修改流程定義,系統可擴展性差。針對這種情況可以給任務設置多個候選人,可以從候選人中選擇參與者來完成任務。
二、 設置任務候選人
在流程圖中任務節點的配置中設置 candidate-users(候選人),多個候選人之間用逗號分開。

查看 bpmn 文件:

我們可以看到部門經理的審核人已經設置為 zhangsan,lishi 這樣的一組候選人,可以使用activiti:candiateUsers=”用戶 1,用戶 2,用戶 3”的這種方式來實現設置一組候選人。
用戶組的關系:
- Assignee :直接設置任務執行人
- Candidate-user:設置候選用戶,格式:wangwu,zhangsan,zhaoliu 依然要指定具體的用戶信息
- Candiate-Groups:特點不需要知道具體的用戶信息只需要知道組名就可以
三、辦理組任務
1、根據候選人查詢組任務
/**
*查詢候選用戶的組任務
*/
@Test
public void test2(){
//1.得到ProcessEngine對象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到TaskService對象
TaskService taskService = processEngine.getTaskService();
//3.設置一些參數,流程定義的key,候選用戶
String key = "holiday";
String candidate_users="zhangsan";
//4.執行查詢
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskCandidateUser(candidate_users)//設置候選用戶
.list();
//5.輸出
for(Task task :list){
System.out.println(task.getProcessInstanceId());
System.out.println(task.getId());
System.out.println(task.getName());
System.out.println(task.getAssignee());//為null,說明當前的zhangsan只是一個候選人,并不是任務的執行人
}
}
2、用戶拾取組任務
候選人員拾取組任務后該任務變為自己的個人任務。
/**
* 測試zhangsan用戶,來拾取組任務
* 抽取任務的過程就是將候選用戶轉化為真正任務的負責人(讓任務的assignee有值)
* @param
*/
@Test
public void test3() {
//1.得到ProcessEngine對象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到TaskService對象
TaskService taskService = processEngine.getTaskService();
//3.設置一些參數,流程定義的key,候選用戶
String key = "holiday";
String candidate_users="zhangsan";
//4.執行查詢
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskCandidateUser(candidate_users)//設置候選用戶
.singleResult();
if(task!=null){
taskService.claim(task.getId(),candidate_users);//第一個參數任務ID,第二個參數為具體的候選用戶名
System.out.println("任務拾取完畢!");
}
}
說明:即使該用戶不是候選人也能拾取,建議拾取時校驗是否有資格組任務拾取后,該任務已有負責人,通過候選人將查詢不到該任務
3、用戶查詢個人待辦任務
/**
* 當前的用戶查詢自己的待辦任務
* @param
*/
@Test
public void test4() {
//1.得到ProcessEngine對象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到TaskService對象
TaskService taskService = processEngine.getTaskService();
//3.設置一些參數,流程定義的key,用戶
String key = "holiday";
String assignee="zhangsan";
//4.執行查詢
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(assignee) //設置任務的負責人
.list();
//5.輸出
for(Task task :list){
System.out.println(task.getProcessInstanceId());
System.out.println(task.getId());
System.out.println(task.getName());
System.out.println(task.getAssignee());//任務的執行人
}
}
4、用戶辦理個人任務
/**
* 用戶辦理個人任務,當前用戶完成自己的任務
* @param
*/
@Test
public void test5() {
//1.得到ProcessEngine對象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到TaskService對象
TaskService taskService = processEngine.getTaskService();
//3.設置一些參數,流程定義的key,用戶
String key = "holiday";
String assignee="lisi";
//4.執行查詢
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(assignee) //設置任務的負責人
.singleResult();
//5.執行當前的任務
if(task!=null){
taskService.complete(task.getId());
System.out.println("任務執行完畢!");
}
}
5、歸還組任務
如果個人不想辦理該組任務,可以歸還組任務,歸還后該用戶不再是該任務的負責人
// 歸還組任務,由個人任務變為組任務,還可以進行任務交接
@Test
public void setAssigneeToGroupTask() {
// 查詢任務使用TaskService
TaskService taskService = processEngine.getTaskService();
// 當前待辦任務
String taskId = "6004";
// 任務負責人
String userId = "zhangsan2";
// 校驗userId是否是taskId的負責人,如果是負責人才可以歸還組任務
Task task = taskService.createTaskQuery().taskId(taskId)
.taskAssignee(userId).singleResult();
if (task != null) {
// 如果設置為null,歸還組任務,該 任務沒有負責人
taskService.setAssignee(taskId, null);
}
}
說明:建議歸還任務前校驗該用戶是否是該任務的負責人。也可以通過 setAssignee 方法將任務委托給其它用戶負責,注意被委托的用戶可以不是候選人(建議不要這樣使用)
6、任務交接
任務交接,任務負責人將任務交給其它候選人辦理該任務
/**
*任務交接,前提要保證當前用戶是這個任務的負責人,這時候他才可以有權限去將任務交接給其他候選人
* @param
*/
public void test6() {
//1.得到ProcessEngine對象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到TaskService對象
TaskService taskService = processEngine.getTaskService();
//3.設置一些參數,流程定義的key,用戶
String key = "holiday";
String assignee="zhangsan";
//4.執行查詢
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(assignee) //設置任務的負責人
.singleResult();
//5.判斷是否有這個任務
if(task!=null){
taskService.setAssignee(task.getId(),"lisi");//交接任務為lisi ,交接任務就是一個候選人拾取用戶的過程
System.out.println("交接任務完成~!");
}
}
四、數據庫表操作
# 任務執行表記錄當前執行的任務
SELECT * FROM act_ru_task
# 任務參與者記錄,如果當前 任務設置了候選人,會想該表插入候選人記錄,有幾個候選人就會插入幾個
SELECT * FROM act_ru_identitylink
# 任務參者與歷史記錄表
SELECT * FROM act_hi_identitylink

浙公網安備 33010602011771號