侧边栏壁纸
  • 累计撰写 2,058 篇文章
  • 累计创建 73 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

(8)Activiti 组任务---Activiti入门教程学习笔记

大猿本猿
2022-01-03 / 762 阅读 / 0 字

一、需求

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

二、 设置任务候选人

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

image

查看 bpmn 文件:

image

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

用户组的关系:

Assignee :直接设置任务执行人

Candidate-user:设置候选用户,格式:wangwu,zhangsan,zhaoliu

依然要指定具体的用户信息

Candiate-Groups:特点不需要知道具体的用户信息

只需要知道组名就可以

三、办理组任务

3.1 组任务查询流程

第一步:查询组任务

指定候选人,查询该候选人当前的待办任务。

候选人不能办理任务。

第二步:拾取(claim)任务

该组任务的所有候选人都能拾取。

将候选人的组任务,变成个人任务。原来候选人就变成了该任务的负责人。

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

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

第三步:查询个人任务

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

第四步:办理个人任务

3.2 用户查询组任务

根据候选人查询组任务

 /**
     *查询候选用户的组任务
     */
    @Test
    public  void test2(){
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();

        //3.设置一些参数,流程定义的key,候选用户
        String key = "holiday";
        String candidate_users="zhangsan";

        //4.执行查询
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskCandidateUser(candidate_users)//设置候选用户
                .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只是一个候选人,并不是任务的执行人
        }
    }

3.3 用户拾取组任务

候选人员拾取组任务后该任务变为自己的个人任务。

 /**
     * 测试zhangsan用户,来拾取组任务
     * 抽取任务的过程就是将候选用户转化为真正任务的负责人(让任务的assignee有值)
     * @param
     */
    @Test
   public void test3() {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();

        //3.设置一些参数,流程定义的key,候选用户
        String key = "holiday";
        String candidate_users="zhangsan";

        //4.执行查询
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskCandidateUser(candidate_users)//设置候选用户
                .singleResult();
        if(task!=null){
            taskService.claim(task.getId(),candidate_users);//第一个参数任务ID,第二个参数为具体的候选用户名
            System.out.println("任务拾取完毕!");
        }
    }
说明:即使该用户不是候选人也能拾取,建议拾取时校验是否有资格组任务拾取后,该任务已有负责人,通过候选人将查询不到该任务

3.4 用户查询个人待办任务

查询方式同个人任务查询

/**
     * 当前的用户查询自己的待办任务
     * @param
     */
    @Test
    public  void test4() {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();

        //3.设置一些参数,流程定义的key,用户
        String key = "holiday";
        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());//任务的执行人
        }
    }

3.5 用户办理个人任务

同个人任务办理

/**
 * 用户办理个人任务,当前用户完成自己的任务
 * @param
 */
@Test
public void test5() {
    //1.得到ProcessEngine对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

    //2.得到TaskService对象
    TaskService taskService = processEngine.getTaskService();

    //3.设置一些参数,流程定义的key,用户
    String key = "holiday";
    String assignee="lisi";

    //4.执行查询
    Task task = taskService.createTaskQuery()
            .processDefinitionKey(key)
            .taskAssignee(assignee)  //设置任务的负责人
            .singleResult();
    //5.执行当前的任务
    if(task!=null){
        taskService.complete(task.getId());
        System.out.println("任务执行完毕!");
    }

}
说明:建议完成任务前校验该用户是否是该任务的负责人。

3.6 归还组任务

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

// 归还组任务,由个人任务变为组任务,还可以进行任务交接
@Test
public void setAssigneeToGroupTask() {
// 查询任务使用TaskService
TaskService taskService = processEngine.getTaskService();
// 当前待办任务
String taskId = "6004";
// 任务负责人
String userId = "zhangsan2";
// 校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
Task task = taskService.createTaskQuery().taskId(taskId)
.taskAssignee(userId).singleResult();
if (task != null) {
// 如果设置为null,归还组任务,该 任务没有负责人
taskService.setAssignee(taskId, null);
}
}
说明:建议归还任务前校验该用户是否是该任务的负责人

也可以通过 setAssignee 方法将任务委托给其它用户负责,注意被委托的用户可以不是候选人(建议不要这样使用)

3.7 任务交接

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

/**
     *任务交接,前提要保证当前用户是这个任务的负责人,这时候他才可以有权限去将任务交接给其他候选人
     * @param
     */
    public void test6() {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();

        //3.设置一些参数,流程定义的key,用户
        String key = "holiday";
        String assignee="zhangsan";

        //4.执行查询
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(assignee)  //设置任务的负责人
                .singleResult();
        //5.判断是否有这个任务
        if(task!=null){
            taskService.setAssignee(task.getId(),"lisi");//交接任务为lisi  ,交接任务就是一个候选人拾取用户的过程
            System.out.println("交接任务完成~!");
        }
    }
交接任务就是一个候选人拾取用户的过程。

四、数据库表操作

image