springboot整合activity6_Activiti之多用户任务分配(无废话版)--------------------------------------------(十五)

1.源码地址:https://github.com/heidaodageshiwo/springbootactivity

 

Activiti之多用户任务分配

 

我们在开发的时候,有一种情况是这样的,

我们有一个任务,可以让多个用户中的任何一个人办理即可,比如某个审批任务,

张三,李四,王五他们中的任何一人办理下都行,这时候,我们用到多用户任务分配。

 

 

方式一,直接流程图配置中写死

这里我们分配三个人 中间用逗号隔开。

 

1,任务查询的时候 ,我们用 taskCandidateUser 候选人查询方法,不能用taskAssignee 

2,启动流程实例后,我们在act_ru_identitylink表

我们用张三,李四,王五中的任何一人,都能查询到任务,最后任何一人完整任务即可;

 

 

 

 

 

 

 

 @Autowired
    RepositoryService repositoryService;
    @Autowired
    RuntimeService runtimeService;
    @Autowired
    TaskService taskService;


//    Activiti之多用户任务分配

    @RequestMapping("/duoyonghufenpei")
    public String deploy() {
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("StudentLeaveProcess/StudentLeaveProcess6/multiuser1.bpmn") // 加载资源文件
                .name("学生请假流程8") // 流程名称
                .deploy();
        System.out.println("流程部署ID:" + deployment.getId());
        System.out.println("流程部署Name:" + deployment.getName());
        return "duoyonghufenpei";
    }


    @RequestMapping("/Assignee_start_duoyonghufenpei")
    public String start() {

        ProcessInstance processInstance = runtimeService.
                startProcessInstanceByKey("multiuser1");
        System.out.println("流程实例ID:" + processInstance.getId());
        System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());
        return "Assignee_start_duoyonghufenpei";
    }


    /**
     * 查看任务
     */
    @RequestMapping("/Assignee_findTask_duoyonghufenpei")
    public String findTask() {
       /* List<Task> taskList=taskService // 任务相关Service
                .createTaskQuery() // 创建任务查询
//                .taskAssignee("李四") // 指定某个人
                .taskCandidateUser("李四") // 候选人查询
                .list();
        for(Task task:taskList){
            System.out.println("任务ID:"+task.getId());
            System.out.println("任务名称:"+task.getName());
            System.out.println("任务创建时间:"+task.getCreateTime());

            //为null,说明当前的zhangsan只是一个候选人,并不是任务的执行人
            System.out.println("任务委派人:"+task.getAssignee());

            System.out.println("流程实例ID:"+task.getProcessInstanceId());
        }*/
        //4.执行查询
        List<Task> list = taskService.createTaskQuery()
                //.processDefinitionKey("StudentLevaeProcess8")
                .taskCandidateUser("张三")//设置候选用户
                .list();
        //5.输出
        for (Task task : list) {
            System.out.println(task.getProcessInstanceId());
            System.out.println(task.getId());
            System.out.println(task.getName());
            System.out.println(task.getAssignee());//为null,说明当前的zhangsan只是一个候选人,并不是任务的执行人
        }
        return "Assignee_findTask_duoyonghufenpei";
    }

    //5.测试zhangsan用户,来拾取组任务
    @RequestMapping("/Assignee_shiqurenwu")
    public String Assignee_shiqurenwu() {
        //4.执行查询
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("StudentLevaeProcess8")
                .taskCandidateUser("张三")//设置候选用户
                .singleResult();
        if (task != null) {
            taskService.claim(task.getId(), "张三");//第一个参数任务ID,第二个参数为具体的候选用户名
            System.out.println("任务拾取完毕!");
        }

        return "Assignee_shiqurenwu";
    }
    /**
     * 查看任务   6.当前的用户查询自己的任务
     */
    @RequestMapping("/Assignee_shiquwan_zaichaxun")
    public String Assignee_shiquwan_zaichaxun() {
        List<Task> taskList=taskService // 任务相关Service
                .createTaskQuery() // 创建任务查询
                .taskAssignee("张三") // 指定某个人
                .list();
        for(Task task:taskList){
            System.out.println("任务ID:"+task.getId());
            System.out.println("任务名称:"+task.getName());
            System.out.println("任务创建时间:"+task.getCreateTime());

            //为null,说明当前的zhangsan只是一个候选人,并不是任务的执行人
            System.out.println("任务委派人:"+task.getAssignee());

            System.out.println("流程实例ID:"+task.getProcessInstanceId());
        }

        return "Assignee_shiquwan_zaichaxun";
    }

    /**
     7.当前用户完成自己的任务
     */
    @RequestMapping("/Assignee_completeTask_duoyonghufenpei")
    public String completeTask() {
        //4.执行查询
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("StudentLevaeProcess8")
                .taskAssignee("lisi")  //设置任务的负责人
                .singleResult();
        //5.执行当前的任务
        if(task!=null){
            taskService.complete(task.getId());
            System.out.println("任务执行完毕!");
        }
        return "Assignee_completeTask_duoyonghufenpei";
    }

    /**
     8.任务交接,前提要保证当前用户是这个任务的负责人,这时候他才可以有权限去将任务交接给其他候选人
     */
    @RequestMapping("/Assignee_renwujiaojie")
    public String Assignee_renwujiaojie() {
        //4.执行查询
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("StudentLevaeProcess8")
                .taskAssignee("张三")  //设置任务的负责人
                .singleResult();
        //5.判断是否有这个任务
        if(task!=null){
            taskService.setAssignee(task.getId(),"lisi");//交接任务为lisi  ,交接任务就是一个候选人拾取用户的过程
            System.out.println("交接任务完成~!");
        }
        return "Assignee_renwujiaojie";
    }

 

 

方式二:使用流程变量

QQé´îæµ20160830153631.jpg

 

在启动的时候设置:

public void start(){
        Map<String,Object> variables=new HashMap<String,Object>();
        variables.put("userIds", "张三,李四,王五");
        ProcessInstance pi=processEngine.getRuntimeService() // 运行时Service
            .startProcessInstanceByKey("multiUserProcess2",variables); // 流程定义表的KEY字段值
        System.out.println("流程实例ID:"+pi.getId());
        System.out.println("流程定义ID:"+pi.getProcessDefinitionId()); 
    }

 

分配方式三 TaskListener监听实现

我们定义一个监听类 MyTaskListener 实现 TaskListener接口:

 

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
 
public class MyTaskListener implements TaskListener{
 
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
 
    public void notify(DelegateTask delegateTask) {
        // TODO Auto-generated method stub
        delegateTask.addCandidateUser("张三");
        delegateTask.addCandidateUser("李四");
        delegateTask.addCandidateUser("王五");
    }
 
}

 

测试一下即可代码已上传

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值