Activiti工作流之设置任务候选人

1.需求

在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn 文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。 针对这种情况可以给任务设置多个候选人,可以从候选人中选择参与者来完成任务。

2.设置任务候选人

在流程图中任务节点的配置中设置 candidate-users(候选人),多个候选人之间用逗号分开

查看bpmn的xml文件:

    <userTask activiti:assignee="xiaozhang" activiti:exclusive="true" id="_3" name="申请请假单"/>
    <userTask activiti:candidateUsers="zhangsan,lisi" activiti:exclusive="true" id="_4" name="部门经理审批"/>
    <userTask activiti:assignee="xiaowang" activiti:exclusive="true" id="_5" name="总经理审批"/>

我们可以看到部门经理的审核人已经设置为 zhangsan,lisi 这样的一组候选人,可以使用activiti:candiateUsers=”用户 1,用户 2,用户 3”的这种方式来实现设置一组候选人。

3.办理组任务

(1)流程

第一步:查询组任务 指定候选人,查询该候选人当前的待办任务。 候选人不能办理任务。

第二步:拾取(claim)任务

该组任务的所有候选人都能拾取。 将候选人的组任务,变成个人任务。原来候选人就变成了该任务的负责人。

如果拾取后不想办理该任务?

需要将已经拾取的个人任务归还到组里边,将个人任务变成了组任务。

第三步:查询个人任务

查询方式同个人任务部分,根据 assignee 查询用户负责的个人任务。

第四步:办理个人任务

(2)部署流程定义

    public static void main(String[] args) {
        //1.创建ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2.得到RepositoryService实例
        RepositoryService repositoryService = processEngine.getRepositoryService();
​
        //3.进行部署
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("diagram/holiday5.bpmn")  //添加bpmn资源
                .name("请假申请单流程")
                .deploy();
​
        //4.输出部署的一些信息
        System.out.println(deployment.getName());
        System.out.println(deployment.getId());
    }

(3)启动流程实例

    public static void main(String[] args) {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2.得到RunService对象
        RuntimeService runtimeService = processEngine.getRuntimeService();
​
        //3.创建流程实例  流程定义的key需要知道 holiday
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday5");
​
        //4.输出实例的相关信息
        System.out.println("流程定义ID" + processInstance.getProcessDefinitionId());//holiday:1:4
        System.out.println("流程实例ID" + processInstance.getId());//2501
    }

(4)执行任务

先由之前固定写好的xiaozhang去申请请假单

    public static void main(String[] args) {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
​
        //3.查询当前用户的任务
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("holiday5")
                .taskAssignee("xiaozhang")
                .singleResult();
​
        //4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId()
        if (task != null) {
            taskService.complete(task.getId());
            System.out.println("用户任务执行完毕...");
        }
​
        //5.输出任务的id
        System.out.println(task.getId());
    }

(5)查询用户的组任务

    public static void main(String[] args) {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
​
        //3.设置一些参数,流程定义的key,候选用户
        String key = "holiday5";
        String candidateUsers = "zhangsan";
​
        //4.执行查询
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskCandidateUser(candidateUsers)//设置候选用户
                .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只是一个候选人,并不是任务的执行人
        }
    }

(6)拾取任务

    public static void main(String[] args) {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
​
        //3.设置一些参数,流程定义的key,候选用户
        String key = "holiday5";
        String candidateUsers = "zhangsan";
​
        //4.执行查询
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskCandidateUser(candidateUsers)//设置候选用户
                .singleResult();
        if (task != null) {
            taskService.claim(task.getId(), candidateUsers);//第一个参数任务ID,第二个参数为具体的候选用户名
            System.out.println("任务拾取完毕!");
        }
    }

(7)查询当前的任务

    public static void main(String[] args) {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
​
        //3.设置一些参数,流程定义的key,用户
        String key = "holiday5";
        String assignee = "zhangsan";
​
        //4.执行查询
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(assignee)  //设置任务的负责人
                .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());//任务的执行人
        }
    }

(8)执行任务

    public static void main(String[] args) {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
​
        //3.设置一些参数,流程定义的key,用户
        String key = "holiday5";
        String assignee = "zhangsan";
​
        //4.执行查询
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(assignee)  //设置任务的负责人
                .singleResult();
        
        //5.执行当前的任务
        if (task != null) {
            taskService.complete(task.getId());
            System.out.println("任务执行完毕!");
        }
​
    }

(9)归还组任务/任务交接

归还:如果个人不想办理该组任务,可以归还组任务,归还后该用户不再是该任务的负责人

交接:任务负责人将任务交给其它候选人办理该任务

我们可以重新依次执行上面的流程,然后在zhangsan拾取完任务后,可以去选择归还任务或者交接任务。

归还任务后,回到拾取任务之前的状态,zhangsan和lisi都可以去重新拾取这一工单。

交接可以交接给该流程的其它候选人,该实例中这一流程的候选人为zhangsan和lisi,所以可以选择交接给lisi。交接给lisi后,lisi可以去直接执行任务而不需要去拾取。

    public static void main(String[] args) {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
​
        //3.设置一些参数,流程定义的key,用户
        String key = "holiday5";
        String assignee = "zhangsan";
​
        //4.执行查询
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(assignee)  //设置任务的负责人
                .singleResult();
        
        //5.判断是否有这个任务
        if (task != null) {
            //如果设置为null,归还组任务,该任务没有负责人
//            taskService.setAssignee(task.getId(), null);
            //交接任务为lisi  ,交接任务就是一个候选人拾取用户的过程
            taskService.setAssignee(task.getId(), "lisi");
            System.out.println("交接任务完成~!");
        }
    }

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值