(6)Flowable候选人和候选人组

1、候选人

画流程图的时候在“固定值”tab页面指定 候选人。也可以通过“身份存储”tab页面码指定(UI里边的用户)。

在这里插入图片描述

在这里插入图片描述

在启动流程之后,发现task中的分配人是个null,分配人得需要从候选人中选择。

在这里插入图片描述

有如下的是三个候选人。

在这里插入图片描述

查询任务

在启动流程之后,根据登录的用户查询对应可以拾取的任务。

查询张三可以拾取的任务。

拾取任务

张三在拾取任务之后,发现分配人变成了张三。

在这里插入图片描述

一个候选人拾取了任务之后,其他的用户就没有办法拾取这个任务了。
如果一个用户拾取了任务之后又不想处理了,那么可以退还。

退还任务

张三退还任务之后,分配人变成了null,意味着其他用户可以拾取了。

李四拾取任务。

交接任务

如果我获取了任务,但是不想执行,那么我可以把这个任务交接给其他的用户。

李四把任务交接给了王五。

在这里插入图片描述

完成任务

王五进行完成任务。任务到了下一个节点(经理审批)。

在这里插入图片描述

 /**
     * 部署流程
     */
    @Test
    public void TestDeployment() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment  = repositoryService.createDeployment()
                .addClasspathResource("请假流程-候选人.bpmn20.xml")
                .name("请假流程-候选人")
                .deploy();

        System.out.println("deployment.getId()" + deployment.getId());
        System.out.println("deployment.getName()" + deployment.getName());
    }

    /**
     * 删除流程定义
     */
    @Test
    public void TestDeploymentDelete() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 第一个参数是id,如果部署的流程启动了,就不允许删除了
        // repositoryService.deleteDeployment("30001");

        // 第二个参数是级联删除,如果流程启动了,相关的任务一并会被删除
        repositoryService.deleteDeployment("57501", true);
    }


    /**
     * 启动流程实例
     */
    @Test
    public void TestDeploymentRun() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 流程变量
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("candidate1", "张三");
        variables.put("candidate2", "李四");
        variables.put("candidate3", "王五");
        // 启动流程实例
        ProcessInstance processInstance = runtimeService.startProcessInstanceById("holiday-candidate:1:80004", variables);
        System.out.println("processInstance.getProcessDefinitionId() = " + processInstance.getProcessDefinitionId());
        System.out.println("processInstance.getActivityId() = " + processInstance.getActivityId());
        System.out.println("processInstance.getId()" + processInstance.getId());
    }


    /**
     * 根据登录的用户查询对应可以拾取的任务
     */
    @Test
    public void TestQueryTaskCandidate() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        List<Task> list = taskService.createTaskQuery()
                // .processInstanceId("82501") //根据流程实例编号查找
                .processDefinitionId("holiday-candidate:1:80004")
                .taskCandidateUser("李四")
                .list();

        for (Task task : list) {
            System.out.println("task.getId() = " + task.getId());
            System.out.println("task.getName() = " + task.getName());
        }
    }

    /**
     * 拾取任务
     * 一个候选人拾取了任务之后,其他的用户就没有办法拾取这个任务了
     * 如果一个用户拾取了任务之后又不想处理了,那么可以退还
     */
    @Test
    public void TestClaimTaskCandidate() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                // .processInstanceId("82501") //根据流程实例编号查找
                .processDefinitionId("holiday-candidate:1:80004")
                .taskCandidateUser("李四")
                .singleResult();

       if(task != null){
           // 拾取对应的任务
           taskService.claim(task.getId(), "李四");
           System.out.println("拾取任务成功");
       }
    }

    /**
     * 退还任务
     */
    @Test
    public void TestUnClaimTaskCandidate() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                // .processInstanceId("82501") //根据流程实例编号查找
                .processDefinitionId("holiday-candidate:1:80004")
                .taskAssignee("张三")
                .singleResult();

        if(task != null){
            // 退还任务
            taskService.unclaim(task.getId());
            System.out.println("退还任务成功");
        }
    }

    /**
     * 交接任务
     * 如果我获取了任务,但是不想执行,那么我可以把这个任务交接给其他的用户
     */
    @Test
    public void TestJoinTaskCandidate() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                // .processInstanceId("82501") //根据流程实例编号查找
                .processDefinitionId("holiday-candidate:1:80004")
                .taskAssignee("李四")
                .singleResult();

        if(task != null){
            // 交接任务
            taskService.setAssignee(task.getId(), "王五");
            System.out.println("交接任务成功");
        }
    }

    /**
     * 完成任务
     */
    @Test
    public void TestCompleteTask() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                // .processInstanceId("82501") //根据流程实例编号查找
                .processDefinitionId("holiday-candidate:1:80004")
                .taskAssignee("王五")
                .singleResult();

        if(task != null){
            // 完成任务
            taskService.complete(task.getId());
            System.out.println("完成任务成功");
        }
    }

2、候选人组

当候选人很多的情况下,我们可以分组来处理。先创建组,然后把用户分配到这个组中。

这里是用到了flowable的用户相关的表结构,通过代码的方式进行用户的相关操作。

用户与组的维护

创建用户

    @Test
    public void TestCreateUser() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        IdentityService identityService = processEngine.getIdentityService();
        User user = identityService.newUser("田佳");
        user.setFirstName("tian");
        user.setLastName("jia");
        user.setEmail("tianjia@qq.com");
        identityService.saveUser(user);
    }

在这里插入图片描述

创建用户组

	@Test
    public void TestCreateUserGroup() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        IdentityService identityService = processEngine.getIdentityService();
        Group group1 = identityService.newGroup("group2");
        group1.setName("开发部");
        group1.setType("type2");
        identityService.saveGroup(group1);
    }

在这里插入图片描述

将用户分配给对应的组

	@Test
    public void TestUserGroup() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        IdentityService identityService = processEngine.getIdentityService();
        // 找到组
        Group group = identityService.createGroupQuery().groupId("group1").singleResult();
        // 找到用户
        List<User> list = identityService.createUserQuery().list();
        for (User user : list) {
            // 将用户分配给对应的组
            identityService.createMembership(user.getId(), group.getId());
        }
    }

在这里插入图片描述

案例讲解

在画流程的时候,在“身份存储”、“固定值”tab页都可以指定候选人组。

在这里插入图片描述

启动流程实例之后,任务的分配人是null。

在这里插入图片描述

拾取任务

邓超拾取任务。其他人就不能再拾取这个任务了。

在这里插入图片描述

退还任务

邓超退还任务,这个任务的分配人又变成了null。其他人可以再拾取这个任务了。

李飞拾取任务。

在这里插入图片描述

交接任务

李飞把任务交接给田佳。

在这里插入图片描述

完成任务

田佳完成任务。任务走到了下一个节点(总经理审批–lisi)

在这里插入图片描述

    /**
     * 部署流程
     */
    @Test
    public void TestDeployment() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment  = repositoryService.createDeployment()
                .addClasspathResource("请假流程-候选人组.bpmn20.xml")
                .name("请假流程-候选人组")
                .deploy();

        System.out.println("deployment.getId()" + deployment.getId());
        System.out.println("deployment.getName()" + deployment.getName());
    }

    /**
     * 删除流程定义
     */
    @Test
    public void TestDeploymentDelete() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 第一个参数是id,如果部署的流程启动了,就不允许删除了
        // repositoryService.deleteDeployment("30001");

        // 第二个参数是级联删除,如果流程启动了,相关的任务一并会被删除
        repositoryService.deleteDeployment("57501", true);
    }


    /**
     * 启动流程实例
     */
    @Test
    public void TestDeploymentRun() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        IdentityService identityService = processEngine.getIdentityService();
        Group group = identityService.createGroupQuery().groupId("group1").singleResult();
        // 流程变量
        Map<String, Object> variables = new HashMap<String, Object>();
        // variables.put("g1", "group1");
        variables.put("g1", group.getId());
        // 启动流程实例
        ProcessInstance processInstance = runtimeService.startProcessInstanceById("holiday-group:1:102504", variables);
        System.out.println("processInstance.getProcessDefinitionId() = " + processInstance.getProcessDefinitionId());
        System.out.println("processInstance.getActivityId() = " + processInstance.getActivityId());
        System.out.println("processInstance.getId()" + processInstance.getId());
    }


    /**
     * 根据登录的用户找到所属的组,根据组找到相关的任务
     */
    @Test
    public void TestQueryTaskCandidateGroup() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 根据登录的用户找到所属的组
        IdentityService identityService = processEngine.getIdentityService();
        Group group = identityService.createGroupQuery().groupMember("邓超").singleResult();
        System.out.println("group.getId() = " + group.getId());

        TaskService taskService = processEngine.getTaskService();
        List<Task> list = taskService.createTaskQuery()
                // .processInstanceId("82501") //根据流程实例编号查找
                .processDefinitionId("holiday-group:1:102504")
                .taskCandidateGroup("group1")// 根据组找到相关的任务
                .list();

        for (Task task : list) {
            System.out.println("task.getId() = " + task.getId());
            System.out.println("task.getName() = " + task.getName());
        }
    }

    /**
     * 拾取任务
     * 一个候选人拾取了任务之后,其他的用户就没有办法拾取这个任务了
     * 如果一个用户拾取了任务之后又不想处理了,那么可以退还
     */
    @Test
    public void TestClaimTaskCandidate() {
        String userId = "李飞";
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 根据登录的用户找到所属的组
        IdentityService identityService = processEngine.getIdentityService();
        Group group = identityService.createGroupQuery().groupMember(userId).singleResult();
        System.out.println("group.getId() = " + group.getId());

        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                // .processInstanceId("82501") //根据流程实例编号查找
                .processDefinitionId("holiday-group:1:102504")
                .taskCandidateGroup(group.getId())
                .singleResult();

       if(task != null){
           // 拾取对应的任务
           taskService.claim(task.getId(), userId);
           System.out.println("拾取任务成功");
       }
    }

    /**
     * 退还任务
     */
    @Test
    public void TestUnClaimTaskCandidate() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                // .processInstanceId("82501") //根据流程实例编号查找
                .processDefinitionId("holiday-group:1:102504")
                .taskAssignee("邓超")
                .singleResult();

        if(task != null){
            // 退还任务
            taskService.unclaim(task.getId());
            System.out.println("退还任务成功");
        }
    }

    /**
     * 交接任务
     * 如果我获取了任务,但是不想执行,那么我可以把这个任务交接给其他的用户
     */
    @Test
    public void TestJoinTaskCandidate() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                // .processInstanceId("82501") //根据流程实例编号查找
                .processDefinitionId("holiday-group:1:102504")
                .taskAssignee("李飞")
                .singleResult();

        if(task != null){
            // 交接任务
            taskService.setAssignee(task.getId(), "田佳");
            System.out.println("交接任务成功");
        }
    }

    /**
     * 完成任务
     */
    @Test
    public void TestCompleteTask() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                // .processInstanceId("82501") //根据流程实例编号查找
                .processDefinitionId("holiday-group:1:102504")
                .taskAssignee("田佳")
                .singleResult();

        if(task != null){
            // 完成任务
            taskService.complete(task.getId());
            System.out.println("完成任务成功");
        }
    }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值