activiti工作流工作专题java学习

activiti之UserTask任务分配方式

2019-03-12  本文已影响56人  我有一只喵喵

前言


一、分配给用户个人方式(即指定用户任务的assignee)

- 1、在流程图中对任务节点进行配置,直接指定接收任务用户
直接在bpmn文件中显式指定

启动流程查看userTask任务的指定人为张三丰

act_ru_task表

缺点:硬式编码,将任务分配的用户写死了


- 2、在流程图中对任务节点进行配置,通过流程变量方式指定接收任务的用户
通过流程变量方式.jpg

可以在流程启动或者其他时候指定该任务的处理用户

        //启动流程
        ProcessEngine processEngine = getProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();

        //流程启动时设置流程变量
        Map<String,Object> variables = new HashMap<String, Object>();
        variables.put("userId","周芷若");
        runtimeService.startProcessInstanceByKey("testUserAssignee",variables);

查看数据库中任务节点的assignee

act_ru_task.png
- 3、可以在流程定义文件中,userTask节点的assignee什么也不配,通过指定一个任务监听器,在监听器中动态指定

bpmn流程配置

   <userTask ![act_ru_task.png](https://img.haomeiwen.com/i6922386/f6e429856f82bf82.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
 activiti:exclusive="true" id="userTask" name="审批">
      <extensionElements>
        <activiti:taskListener class="cn.cf.activiti.atguigu.AssigneeTaskUser" event="create"/>
      </extensionElements>
    </userTask>

监听类

public class AssigneeTaskUser implements TaskListener {

    public void notify(DelegateTask delegateTask) {
        delegateTask.setAssignee("金毛狮王");
    }
}

启动流程,查看数据库中任务节点的处理人

act_ru_task.png

可以在任务已经分配给指定用户的情况下,通过taskService.setAssignee(taskId,userId);重新指定办理人


二、组任务分配方式(即通过为UserTask指定cadidateUser or cadidateGroup)

所谓组任务,也就是任务的候选人,候选人中的用户有权认领该任务并且完成该任务,当任务被领取之后,其他候选人即无法再看到此任务。
当用户认领任务时,就算该用户不在候选人列表中,依然可以认领任务

涉及的数据库表有:

通过表中的TYPE_字段进行区分用户是办理人还是候选人。在个人任务中(即通过assignee指定),该字段的值为participant(参与者),如果是组任务(即通过candidateUser or candidateGroup指定),TYPE_可以是participant也可以是candidate(候选人)

1、在bpmn流程定义文件中直接写 candidate-users=“小A,小B,小C,小D"
2、在bpmn流程定义文件中写 candidate-users =“#{userIDs}”,变量的值要是String的。使用流程变量指定办理人

 Map<String, Object> variables = new HashMap<String, Object>();
 variables.put("userIDs", "大大,小小,中中");

3、使用TaskListener接口,使用类实现该接口

//为用户任务添加候选人(可以连续添加多个)
delegateTask.addCandidateUser(userId1);
delegateTask.addCandidateUser(userId2);
组任务分配给个人任务(认领任务):
processEngine.getTaskService().claim(taskId, userId);
个人任务分配给组任务:
processEngine.getTaskService(). setAssignee(taskId, null);
向组任务添加人员:
processEngine.getTaskService().addCandidateUser(taskId, userId);
向组任务删除人员:
  processEngine.getTaskService().deleteCandidateUser(taskId, userId);

上一篇下一篇

猜你喜欢

热点阅读