Activiti进阶(十)——分配个人任务的三种方式

 用户任务(UserTask)即用户操作的任务, 个人任务是用户任务的一种,这篇博文将简单地介绍下分配个人任务的三种方式。

     一、流程图

                                            

                                               图一   分配用户任务流程图

     二、方式一:直接指定办理人


     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("完成任务");
    }


     说明:在上面的例子中,周江霄是个人任务的办理人;但是这样分配任务的办理人不够灵活,因为项目开发中任

务的办理人不要放置XML文件中。
    

     三、方式二:直接指定办理人(动态指定)


     1.流程图中配置任务节点变量

                              

                                           图三   配置任务节点变量

     2.测试代码

package cn.gome.k_personTask;
 
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();
    
    /**部署流程定义+启动流程实例*/
    @Test
    public void deployementAndStartProcess(){
        InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
        InputStream inputStreampng = this.getClass().getResourceAsStream("task.png");
        
        //部署流程定义
        Deployment deployment = processEngine.getRepositoryService()//
                        .createDeployment()//创建部署对象
                        .addInputStream("task.bpmn", inputStreamBpmn)//部署加载资源文件
                        .addInputStream("task.png", inputStreampng)
                        .name("个人任务演示")
                        .deploy();
        System.out.println("部署ID:"+deployment.getId());
        
        //启动流程实例
        /**
         * 启动流程实例的同时,设置流程变量,使用流程变量的方式设置下一个任务的办理人
         *     流程变量的名称,就是在task.bpmn中定义#{userID}的userID
         *     流程变量的值,就是任务的办理人
         */
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("userID", "周江霄");
        ProcessInstance pi = processEngine.getRuntimeService()//
                .startProcessInstanceByKey("task",variables);//使用流程定义的key的最新版本启动流程
        System.out.println("流程实例ID:"+pi.getId());
        System.out.println("流程定义的ID:"+pi.getProcessDefinitionId());
    }
    
    /**查询我的个人任务*/
    @Test
    public void findPersonalTaskList(){
        //任务办理人
        String assignee = "周江霄";
        List<Task> list = processEngine.getTaskService()
                    .createTaskQuery()
                    .taskAssignee(assignee)//个人任务的查询
                    .list();
        if(list!=null && list.size()>0){
            for(Task task:list){
                System.out.println("任务ID:"+task.getId());
                System.out.println("任务的办理人:"+task.getAssignee());
                System.out.println("任务名称:"+task.getName());
                System.out.println("任务的创建时间:"+task.getCreateTime());
                System.out.println("流程实例ID:"+task.getProcessInstanceId());
                System.out.println("#######################################");
            }
        }
    }
    
    /**完成任务*/
    @Test
    public void completeTask(){
        //任务ID
        String taskId = "5209";
        processEngine.getTaskService()
                        .complete(taskId);
        System.out.println("完成任务:"+taskId);
    }
}

     四、方式三:使用类


     1.TaskListenerImpl类,用来设置任务的办理人

package cn.gome.l_personTask;
 
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
 
public class TaskListenerImpl implements TaskListener{
 
    /**设置任务的办理人(个人任务和组任务)*/
    @Override
    public void notify(DelegateTask delegateTask) {
        //指定个人任务
        delegateTask.setAssignee("郭靖");
    }
    
}

     2.流程图中配置任务节点监听


        

                                           图四  流程图中配置任务节点监听

     3.测试代码

package cn.gome.l_personTask;
 
import java.io.InputStream;
import java.util.List;
 
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();
    
    /**部署流程定义+启动流程实例*/
    @Test
    public void deployementAndStartProcess(){
        InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
        InputStream inputStreampng = this.getClass().getResourceAsStream("task.png");
        //部署流程定义
        Deployment deployment = processEngine.getRepositoryService()//
                        .createDeployment()//创建部署对象
                        .addInputStream("task.bpmn", inputStreamBpmn)//部署加载资源文件
                        .addInputStream("task.png", inputStreampng)//
                        .deploy();
        System.out.println("部署ID:"+deployment.getId());
        //启动流程实例
        ProcessInstance pi = processEngine.getRuntimeService()//
                    .startProcessInstanceByKey("task");//使用流程定义的key的最新版本启动流程
        System.out.println("流程实例ID:"+pi.getId());
        System.out.println("流程定义的ID:"+pi.getProcessDefinitionId());
    }
    
    /**查询我的个人任务*/
    @Test
    public void findPersonalTaskList(){
        //任务办理人
        String assignee = "郭靖";
        List<Task> list = processEngine.getTaskService()//
                    .createTaskQuery()//
                    .taskAssignee(assignee)//个人任务的查询
                        .list();
        if(list!=null && list.size()>0){
            for(Task task:list){
                System.out.println("任务ID:"+task.getId());
                System.out.println("任务的办理人:"+task.getAssignee());
                System.out.println("任务名称:"+task.getName());
                System.out.println("任务的创建时间:"+task.getCreateTime());
                System.out.println("流程实例ID:"+task.getProcessInstanceId());
                System.out.println("#######################################");
            }
        }
    }
    
    /**完成任务*/
    @Test
    public void completeTask(){
        //任务ID
        String taskId = "5408";
        processEngine.getTaskService().complete(taskId);
        System.out.println("完成任务:"+taskId);
    }
    
    /**将个人任务从一个人分配给另一个人*/
    @Test
    public void setAssignee(){
        //指定任务的办理人
        String userId = "黄蓉";
        //任务ID
        String taskId = "5408";
        processEngine.getTaskService()//
                .setAssignee(taskId, userId);
    }
    
}

           总结:
     通过对比,我们发现,分配个人任务的三种方式中,第一种欠灵活,后面两种都还是不错的,可以在项目中灵活的分配个人任务。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值