第十篇Flowable中的候选人组

Posted 波波烤鸭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十篇Flowable中的候选人组相关的知识,希望对你有一定的参考价值。

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

候选人组

1. 管理用户和组

1.1 用户管理

  我们需要先单独维护用户信息。后台对应的表结构是ACT_ID_USER.

   /**
     * 维护用户
     */
    @Test
    public void createUser()
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 通过 IdentityService 完成相关的用户和组的管理
        IdentityService identityService = processEngine.getIdentityService();
        User user = identityService.newUser("田佳");
        user.setFirstName("田");
        user.setLastName("jia");
        user.setEmail("tianjia@qq.com");
        identityService.saveUser(user);
    

1.2 Group管理

  维护对应的Group信息,后台对应的表结构是ACT_ID_GROUP

    /**
     * 创建用户组
     */
    @Test
    public void createGroup()
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        IdentityService identityService = processEngine.getIdentityService();
        // 创建Group对象并指定相关的信息
        Group group = identityService.newGroup("group2");
        group.setName("开发部");
        group.setType("type1");
        // 创建Group对应的表结构数据
        identityService.saveGroup(group);

    

1.3 用户分配组

  用户和组是一个多对多的关联关联,我们需要做相关的分配,后台对应的表结构是ACT_ID_MEMBERSHIP

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

2 候选人组应用

  搞清楚了用户和用户组的关系后我们就可以来使用候选人组的应用了

2.1 创建流程图

2.2 流程的部署运行

  然后我们把流程部署和运行,注意对UEL表达式赋值,关联上Group

/**
     * 部署流程
     */
    @Test
    public void deploy()
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();

        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("请假流程-候选人组.bpmn20.xml")
                .name("请求流程-候选人")
                .deploy();
        System.out.println("deploy.getId() = " + deploy.getId());
        System.out.println(deploy.getName());
    

    /**
     * 启动流程实例
     */
    @Test
    public void runProcess()
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        IdentityService identityService = processEngine.getIdentityService();
        Group group = identityService.createGroupQuery().groupId("group1").singleResult();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 给流程定义中的UEL表达式赋值
        Map<String,Object> variables = new HashMap<>();
        // variables.put("g1","group1");
        variables.put("g1",group.getId()); // 给流程定义中的UEL表达式赋值
        runtimeService.startProcessInstanceById("holiday-group:1:17504",variables);
    

对应表结构中就有对应的体现

2.3 任务的拾取和完成

  然后完成任务的查询拾取和处理操作

/**
     * 根据登录的用户查询对应的可以拾取的任务
     *
     */
    @Test
    public void queryTaskCandidateGroup()
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 根据当前登录的用户找到对应的组
        IdentityService identityService = processEngine.getIdentityService();
        // 当前用户所在的组
        Group group = identityService.createGroupQuery().groupMember("邓彪").singleResult();

        TaskService taskService = processEngine.getTaskService();
        List<Task> list = taskService.createTaskQuery()
                //.processInstanceId("2501")
                .processDefinitionId("holiday-group:1:17504")
                .taskCandidateGroup(group.getId())
                .list();
        for (Task task : list) 
            System.out.println("task.getId() = " + task.getId());
            System.out.println("task.getName() = " + task.getName());
        
    

    /**
     * 拾取任务
     *    一个候选人拾取了这个任务之后其他的用户就没有办法拾取这个任务了
     *    所以如果一个用户拾取了任务之后又不想处理了,那么可以退还
     */
    @Test
    public void claimTaskCandidate()
        String userId = "田佳";
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 根据当前登录的用户找到对应的组
        IdentityService identityService = processEngine.getIdentityService();
        // 当前用户所在的组
        Group group = identityService.createGroupQuery().groupMember(userId).singleResult();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                //.processInstanceId("2501")
                .processDefinitionId("holiday-group:1:17504")
                .taskCandidateGroup(group.getId())
                .singleResult();
        if(task != null) 
            // 任务拾取
            taskService.claim(task.getId(),userId);
            System.out.println("任务拾取成功");
        
      
   /**
     * 完成任务
     */
    @Test
    public void completeTask()
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                //.processInstanceId("2501")
                .processDefinitionId("holiday-group:1:17504")
                .taskAssignee("邓彪")
                .singleResult();
        if(task != null)
            // 完成任务
            taskService.complete(task.getId());
            System.out.println("完成Task");
        
    

以上是关于第十篇Flowable中的候选人组的主要内容,如果未能解决你的问题,请参考以下文章

第九篇Flowable中的候选人讲解

第九篇Flowable中的候选人讲解

Flowable 按角色分配任务

Flowable 按角色分配任务

Flowable 任务如何认领,回退?

Flowable 任务如何认领,回退?