组任务及三种分配方式:
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消失了

posted on 2017-09-07 15:56  2637282556  阅读(648)  评论(0编辑  收藏  举报