Activiti 學習筆記12:分配個人任務

衣舞晨風發表於2016-09-11

一、流程圖

這裡寫圖片描述

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

1、流程圖中任務節點的配置
這裡寫圖片描述
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、流程圖中任務節點的配置
這裡寫圖片描述
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、流程圖中任務節點的配置
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
此時流程圖的XML檔案,如圖:
這裡寫圖片描述
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()//
                    .setAssignee(taskId, userId);
    }

}

說明:
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和辦理人重新指定辦理人:

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

演示程式碼下載:http://download.csdn.net/detail/xunzaosiyecao/9627675

本文部分內容整理自itcast講義,在此表示感謝。
作者:jiankunking 出處:http://blog.csdn.net/jiankunking

相關文章