1. 程式人生 > >activiti學習--13:組任務分配方式1直接方式+查詢正在執行的任務辦理人表+查詢歷史任務的辦理人表+拾取任務+將個人任務回退到組任務+向組任務中新增/刪除成員

activiti學習--13:組任務分配方式1直接方式+查詢正在執行的任務辦理人表+查詢歷史任務的辦理人表+拾取任務+將個人任務回退到組任務+向組任務中新增/刪除成員

組任務及三種分配方式:
1:在taskProcess.bpmn中直接寫 candidate-users=“a,b,c,d”
2:在taskProcess.bpmn中寫 candidate-users =“#{userIDs}”,變數的值要是String的。
使用流程變數指定辦理人
Map< String, Object> variables = new HashMap< String, Object>();
variables.put(“userIDs”, “a,b,c,d”);
3,使用TaskListener介面,使用類實現該介面,在類中定義:
//新增組任務的使用者
delegateTask.addCandidateUser(userId1);
delegateTask.addCandidateUser(userId2);
組任務分配給個人任務(認領任務):
processEngine.getTaskService().claim(taskId, userId);
個人任務分配給組任務:
processEngine.getTaskService(). setAssignee(taskId, null);
向組任務新增人員:
processEngine.getTaskService().addCandidateUser(taskId, userId);
向組任務刪除人員:
processEngine.getTaskService().deleteCandidateUser(taskId, userId);
個人任務和組任務存放辦理人對應的表:
act_ru_identitylink表存放正在執行任務的辦理人,包括個人任務和組任務
act_hi_identitylink表存放歷史任務的辦理人,包括個人任務和組任務
區別在於:如果是個人任務TYPE的型別表示participant(參與者)
如果是組任務TYPE的型別表示candidate(候選者)和participant(參與者)

流程介紹
1分配組任務(一組代理人)
2每個代理人檢視個人任務看不到資料,因為任務在組中
3每個代理人檢視可以檢視組任務
4每個代理人都可以從組任務中接受任務,一旦接受,組任務中就沒有該任務,該任務只能在對應的代理人的個人任務中存在
5使用者接受組任務,組任務就把相應任務撤銷,使用者撤銷自己的組任務,對應組任務就出現在組任務中,每個代理人都可以拾取任務。

方式1
task.bpmn
這裡寫圖片描述

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema"
expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<process id="task" name="taskProcess" isExecutable="true"> <startEvent id="startevent1" name="Start"></startEvent> <userTask id="usertask1" name="審批" activiti:candidateUsers="a,b,c,d"></userTask> <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow> <endEvent id="endevent1" name="End"></endEvent> <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_task"> <bpmndi:BPMNPlane bpmnElement="task" id="BPMNPlane_task"> <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> <omgdc:Bounds height="35.0" width="35.0" x="390.0" y="50.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"> <omgdc:Bounds height="55.0" width="105.0" x="355.0" y="150.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> <omgdc:Bounds height="35.0" width="35.0" x="390.0" y="270.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> <omgdi:waypoint x="407.0" y="85.0"></omgdi:waypoint> <omgdi:waypoint x="407.0" y="150.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> <omgdi:waypoint x="407.0" y="205.0"></omgdi:waypoint> <omgdi:waypoint x="407.0" y="270.0"></omgdi:waypoint> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>

測試程式碼

    @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());//
//      輸出:
//      部署ID:5201
//      部署名稱:組任務
    }

    /**啟動流程例項*/
    @Test
    public void startProcessInstance(){
        //流程定義的key
        String processDefinitionKey = "task";
//      /**啟動流程例項的同時,設定流程變數,使用流程變數用來指定任務的辦理人,對應task.pbmn檔案中#{userIDs}*/
//      Map<String, Object> variables = new HashMap<String, Object>();
//      variables.put("userids", "a,b,c,d");
//      ProcessInstance pi = processEngine.getRuntimeService()//與正在執行的流程例項和執行物件相關的Service
//                      .startProcessInstanceByKey(processDefinitionKey,variables);//使用流程定義的key啟動流程例項,key對應helloworld.bpmn檔案中id的屬性值,使用key值啟動,預設是按照最新版本的流程定義啟動

        ProcessInstance pi = processEngine.getRuntimeService()//與正在執行的流程例項和執行物件相關的Service
              .startProcessInstanceByKey(processDefinitionKey);
        System.out.println("流程例項ID:"+pi.getId());//流程例項ID  
        System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID   
//      輸出:
//      流程例項ID:5301
//      流程定義ID:task:6:5204
    }

任務出現在組任務中,個人任務不出現

    /**查詢當前人的個人任務*/
    @Test
    public void findMyPersonalTask(){
        String assignee = "a";
        List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service
                        .createTaskQuery()//建立任務查詢物件
                        /**查詢條件(where部分)*/
                        .taskAssignee(assignee)//指定個人任務查詢,指定辦理人
//                      .taskCandidateUser(candidateUser)//組任務的辦理人查詢
                        /**排序*/
                        .orderByTaskCreateTime().asc()//使用建立時間的升序排列
                        /**返回結果集*/
                        .list();//返回列表
        if(list!=null && list.size()>0){
            System.out.println("--關聯表:  ACT_RU_TASK----");
            for(Task task:list){
                   System.out.println("--------"+task.getAssignee()+"任務:"+task.getName()+"-----------------");
                    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());
            }
        }
    }

    /**查詢當前人的組任務*/
    @Test
    public void findMyGroupTask(){
        String candidateUser = "a";
        List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service
                        .createTaskQuery()//建立任務查詢物件
                        /**查詢條件(where部分)*/
                        .taskCandidateUser(candidateUser)//組任務的辦理人查詢
                        /**排序*/
                        .orderByTaskCreateTime().asc()//使用建立時間的升序排列
                        /**返回結果集*/
                        .list();//返回列表
        if(list!=null && list.size()>0){
            System.out.println("--關聯表:  ACT_RU_TASK----");
            for(Task task:list){
                   System.out.println("--------"+task.getAssignee()+"任務:"+task.getName()+"-----------------");
                    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());
//                    --關聯表:  ACT_RU_TASK----
//                    --------null任務:審批-----------------
//                    任務ID:5304
//                    任務名稱:審批
//                    任務的建立時間:Thu Sep 07 15:29:53 CST 2017
//                    任務的辦理人:null
//                    流程例項ID:5301
//                    執行物件ID:5301
//                    流程定義ID:task:6:5204

影響的表
ACT_RU_TASK
這裡寫圖片描述
act_ru_identitylink表存正在執行任務的辦理人
這裡寫圖片描述
act_hi_identitylink表存放歷史任務的辦理人
這裡寫圖片描述

查詢正在執行的任務辦理人表

/**查詢正在執行的任務辦理人表*/
    @Test
    public void findRunPersonTask(){
        //任務ID
        String taskId = "5304";
        List<IdentityLink> list = processEngine.getTaskService()//
                    .getIdentityLinksForTask(taskId);
        if(list!=null && list.size()>0){
            System.out.println("任務ID---------型別---------流程例項id---------使用者id");
            for(IdentityLink identityLink:list){
                System.out.println(identityLink.getTaskId()+
                        "---------"+identityLink.getType()+
                        "---------"+identityLink.getProcessInstanceId()+
                        "---------"+identityLink.getUserId());
//              輸出:
//              任務ID---------型別---------流程例項id---------使用者id
//              5304---------candidate---------null---------c
//              5304---------candidate---------null---------a
//              5304---------candidate---------null---------d
//              5304---------candidate---------null---------b
            }
        }
    }

查詢歷史任務的辦理人表

/**查詢歷史任務的辦理人表*/
    @Test
    public void findHistoryPersonTask(){
        //流程例項ID  
        String processInstanceId = "5301";
        List<HistoricIdentityLink> list = processEngine.getHistoryService()//
                        .getHistoricIdentityLinksForProcessInstance(processInstanceId);
        if(list!=null && list.size()>0){
            System.out.println("任務ID---------型別---------流程例項id---------使用者id");
            for(HistoricIdentityLink identityLink:list){
                System.out.println(identityLink.getTaskId()+
                        "---------"+identityLink.getType()+
                        "---------"+identityLink.getProcessInstanceId()+
                        "---------"+identityLink.getUserId());
//              任務ID---------型別---------流程例項id---------使用者id
//              null---------participant---------5301---------c
//              null---------participant---------5301---------a
//              null---------participant---------5301---------d
//              null---------participant---------5301---------b
                }
        }
    }

a代理人拾取任務

    /**拾取任務,將組任務分給個人任務,指定任務的辦理人欄位*/
    @Test
    public void claim(){
        //將組任務分配給個人任務
        //任務ID
        String taskId = "5304";
        //分配的個人任務(可以是組任務中的成員,也可以是非組任務的成員)
        String userId = "a";
        processEngine.getTaskService()//
                    .claim(taskId, userId);
    }

ACT_RU_TASK;
這裡寫圖片描述
這個時候,代理人在組任務中看不到任務

將個人任務回退到組任務

    /**將個人任務回退到組任務,前提,之前一定是個組任務*/
    @Test
    public void setAssigee(){
        //任務ID
        String taskId = "5304";
        processEngine.getTaskService()//
                    .setAssignee(taskId, null);
    }

ACT_RU_TASK;
這裡寫圖片描述
這個時候,代理人可以檢視到組任務

向組任務中新增成員

/**向組任務中新增成員*/
    @Test
    public void addGroupUser(){
        //任務ID
        String taskId = "5304";
        //成員辦理人
        String userId = "e";
        processEngine.getTaskService()//
                    .addCandidateUser(taskId, userId);
    }

ACT_RU_IDENTITYLINK
這裡寫圖片描述
從組任務中刪除成員

    /**從組任務中刪除成員*/
    @Test
    public void deleteGroupUser(){
        //任務ID
        String taskId = "5304";
        //成員辦理人
        String userId = "e";
        processEngine.getTaskService()//
                    .deleteCandidateUser(taskId, userId);
    }

ACT_RU_IDENTITYLINK
這裡寫圖片描述
這個時候候選者e消失了