天天看點

Activiti 學習筆記12:配置設定個人任務

一、流程圖

Activiti 學習筆記12:配置設定個人任務

二、配置設定個人任務方式一(直接指定辦理人)

1、流程圖中任務節點的配置

Activiti 學習筆記12:配置設定個人任務

2、測試代碼

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//部署流程定義,啟動流程執行個體
    @Test
    public void testTask() throws Exception {

        // 1 釋出流程
        InputStream inputStreamBpmn = this.getClass().getResourceAsStream("taskProcess.bpmn");
        InputStream inputStreamPng = this.getClass().getResourceAsStream("taskProcess.png");
        processEngine.getRepositoryService()//
                        .createDeployment()//
                        .addInputStream("userTask.bpmn", inputStreamBpmn)//
                        .addInputStream("userTask.png", inputStreamPng)//
                        .deploy();

        // 2 啟動流程
        //啟動流程執行個體的同時,設定流程變量
        ProcessInstance pi = processEngine.getRuntimeService()//
                            .startProcessInstanceByKey("taskProcess");
        System.out.println("pid:" + pi.getId());
    }

//查詢我的個人任務清單
    @Test
    public void findMyTaskList(){
        String userId = "張三豐";
        List<Task> list = processEngine.getTaskService()//
                        .createTaskQuery()//
                        .taskAssignee(userId)//指定個人任務查詢
                        .list();
        for(Task task:list ){
            System.out.println("id="+task.getId());
            System.out.println("name="+task.getName());
            System.out.println("assinee="+task.getAssignee());
            System.out.println("createTime="+task.getCreateTime());
            System.out.println("executionId="+task.getExecutionId());

        }
    }

//完成任務
    @Test
    public void completeTask(){
        String taskId = "3209";
        processEngine.getTaskService()//
                    .complete(taskId);//
        System.out.println("完成任務");
    }      

3、說明

1) 張三豐是個人任務的辦理人

2) 但是這樣配置設定任務的辦理人不夠靈活,因為項目開發中任務的辦理人不要放置XML檔案中。

三、配置設定個人任務方式二(使用流程變量)

1、流程圖中任務節點的配置

Activiti 學習筆記12:配置設定個人任務

2、測試代碼

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class TaskTest

    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

    /**部署流程定義(從inputStream)*/
    @Test
    public void deploymentProcessDefinition_inputStream(){
        InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
        InputStream inputStreamPng = this.getClass().getResourceAsStream("task.png");
        Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service
                        .createDeployment()//建立一個部署對象
                        .name("任務")//添加部署的名稱
                        .addInputStream("task.bpmn", inputStreamBpmn)//
                        .addInputStream("task.png", inputStreamPng)//
                        .deploy();//完成部署
        System.out.println("部署ID:"+deployment.getId());//
        System.out.println("部署名稱:"+deployment.getName());//
    }

    /**啟動流程執行個體*/
    @Test
    public void startProcessInstance(){
        //流程定義的key
        String processDefinitionKey = "task";
        /**啟動流程執行個體的同時,設定流程變量,使用流程變量用來指定任務的辦理人,對應task.pbmn檔案中#{userID}*/
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("userID", "周芷若");
        ProcessInstance pi = processEngine.getRuntimeService()//與正在執行的流程執行個體和執行對象相關的Service
                        .startProcessInstanceByKey(processDefinitionKey,variables);//使用流程定義的key啟動流程執行個體,key對應helloworld.bpmn檔案中id的屬性值,使用key值啟動,預設是按照最新版本的流程定義啟動
        System.out.println("流程執行個體ID:"+pi.getId());//流程執行個體ID    101
        System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID   helloworld:1:4
    }

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

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

說明:

1) 周芷若是個人任務的辦理人

2) 在開發中,可以在頁面中指定下一個任務的辦理人,通過流程變量設定下一個任務的辦理人

四、配置設定個人任務方式三(使用類)

1、流程圖中任務節點的配置

Activiti 學習筆記12:配置設定個人任務
Activiti 學習筆記12:配置設定個人任務
Activiti 學習筆記12:配置設定個人任務

此時流程圖的XML檔案,如圖:

Activiti 學習筆記12:配置設定個人任務

2、TaskListenerImpl類,用來設定任務的辦理人

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;

@SuppressWarnings("serial")
public class TaskListenerImpl implements TaskListener

    /**用來指定任務的辦理人*/
    @Override
    public void notify(DelegateTask delegateTask) {
        //指定個人任務的辦理人,也可以指定組任務的辦理人
        //個人任務:通過類去查詢資料庫,将下一個任務的辦理人查詢擷取,然後通過setAssignee()的方法指定任務的辦理人
        delegateTask.setAssignee("滅絕師太");
    }

}      

3、測試代碼

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class TaskTest

    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

    /**部署流程定義(從inputStream)*/
    @Test
    public void deploymentProcessDefinition_inputStream(){
        InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
        InputStream inputStreamPng = this.getClass().getResourceAsStream("task.png");
        Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的Service
                        .createDeployment()//建立一個部署對象
                        .name("任務")//添加部署的名稱
                        .addInputStream("task.bpmn", inputStreamBpmn)//
                        .addInputStream("task.png", inputStreamPng)//
                        .deploy();//完成部署
        System.out.println("部署ID:"+deployment.getId());//
        System.out.println("部署名稱:"+deployment.getName());//
    }

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

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

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

    //可以配置設定個人任務從一個人到另一個人(認領任務)
    @Test
    public void setAssigneeTask(){
        //任務ID
        String taskId = "5804";
        //指定的辦理人
        String userId = "張翠山";
        processEngine.getTaskService()//      

說明:

1) 在類中使用delegateTask.setAssignee(assignee);的方式配置設定個人任務的辦理人,此時滅絕師太是下一個任務的辦理人

2) 通過processEngine.getTaskService().setAssignee(taskId, userId);将個人任務從一個人配置設定給另一個人,此時滅絕師太不再是下一個任務的辦理人,而換成了張翠山

3) 在開發中,可以将每一個任務的辦理人規定好,例如張三的上司是李四,李四的上司是王五,這樣張三送出任務,就可以查詢出張三的上司是李四,通過類的方式設定下一個任務的辦理人

五、小結

個人任務及三種配置設定方式:

  1. 在taskProcess.bpmn中直接寫 assignee=“張三豐”
  2. 使用流程變量指定辦理人

    在taskProcess.bpmn中寫 assignee=“#{userID}”,變量的值要是String的。

  3. 使用TaskListener接口,要使類實作該接口,在類中定義:
delegateTask.setAssignee(assignee);// 指定個人任務的辦理人      

使用任務ID和辦理人重新指定辦理人:

.getTaskService()//
                           .setAssignee(taskId, userId);