zoukankan      html  css  js  c++  java
  • activiti5用户任务分配

    用户任务分配办理人:
    1.用户任务可以直接分配给一个用户,这可以通过humanPerformer元素定义。 humanPerformer定义需要一个 resourceAssignmentExpression
    来实际定义用户
    eg: <userTask id='theTask' name='important task' >
        <humanPerformer>
          <resourceAssignmentExpression>
            <formalExpression>kermit</formalExpression>
          </resourceAssignmentExpression>
        </humanPerformer>
      </userTask>
       任务只有一个用户的时候在activiti中,用户叫做执行者。 拥有执行者的task不会出现在其他人的任务列表中, 只能出现执行者的个人任务列表中。

    直接分配给用户的任务可以通过TaskService像下面这样获取:

    List<Task> tasks = taskService.createTaskQuery().taskAssignee("kermit").list();

    2.任务也可以加入到人员的候选人员列表中。需要使用potentialOwner元素。 用法和humanPerformer元素类似,注意它需要指定表达式中的每个
    项目是人员还是群组 (引擎猜不出来)。
    eg:
      <userTask id='theTask' name='important task' >
        <potentialOwner>
          <resourceAssignmentExpression>
            <formalExpression>user(kermit), group(management)</formalExpression>
          </resourceAssignmentExpression>
        </potentialOwner>
      </userTask>
      分配给候选用户列表或组的任务可以通过TaskService像下面这样获取:
       List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("kermit").list();
       //List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("kermit").list();
    此时对应办理人必须拾取任务,方能办理成功,任务被其中一个人拾取后,其他人不可见此任务

    任务拾取方法: processEngine.getTaskService().claim(taskId, userId);
    ps: 如果没有显示指定设置的是用户还是群组, 引擎会默认当做群组处理。所以下面的设置与使用group(accountancy)效果一样。
    <formalExpression>accountancy</formalExpression>

    3.Activiti对任务分配的扩展

    当分配不复杂时,用户和组的设置非常麻烦。 为避免复杂性,可以使用用户任务的自定义扩展。

        assignee属性:这个自定义扩展可以直接把用户任务分配给指定用户。

        <userTask id="theTask" name="my task" activiti:assignee="kermit" />

        它和使用上面定义的humanPerformer 效果完全一样。

        candidateUsers属性:这个自定义扩展可以为任务设置候选人。

        <userTask id="theTask" name="my task" activiti:candidateUsers="kermit, gonzo" />

        它和使用上面定义的potentialOwner 效果完全一样。 注意它不需要像使用potentialOwner通过user(kermit)声明, 因为这个属性只能用于人员。

        candidateGroups属性:这个自定义扩展可以为任务设置候选组。

        <userTask id="theTask" name="my task" activiti:candidateGroups="management, accountancy" />
     ps:这三个属性都可以通过流程变量动态指定值,多值需要用逗号隔开
     
     
     4. 如果上面的方式还不满足需求,还可以使用创建事件的任务监听器 来实现自定义的分配逻辑:

    <userTask id="task1" name="My task" >
      <extensionElements>
        <activiti:taskListener event="create" class="org.activiti.MyAssignmentHandler" />
      </extensionElements>
    </userTask>

    DelegateTask会传递给TaskListener的实现, 通过它可以设置执行人,候选人和候选组:

    public class MyAssignmentHandler implements TaskListener {

      public void notify(DelegateTask delegateTask) {
        // Execute custom identity lookups here

        // and then for example call following methods:
        delegateTask.setAssignee("kermit");
        delegateTask.addCandidateUser("fozzie");
        delegateTask.addCandidateGroup("management");
        ...
      }

    }

    5. 使用spring时,可以使用表达式 把任务监听器设置为spring代理的bean, 让这个监听器监听任务的创建事件。
     下面的例子中,执行者会通过调用ldapService这个spring bean的findManagerOfEmployee方法获得。 
     流程变量emp会作为参数传递给bean。

    <userTask id="task" name="My Task" activiti:assignee="${ldapService.findManagerForEmployee(emp)}"/>

    也可以用来设置候选人和候选组:

    <userTask id="task" name="My Task" activiti:candidateUsers="${ldapService.findAllSales()}"/>

    ps:注意方法返回类型只能为String或Collection<String> (对应候选人和候选组):

    public class FakeLdapService {

      public String findManagerForEmployee(String employee) {
        return "Kermit The Frog";
      }

      public List<String> findAllSales() {
        return Arrays.asList("kermit", "gonzo", "fozzie");
      }

    }

    转自:http://zhc3191012.blog.163.com/blog/static/1855533762013823113116720/

  • 相关阅读:
    [小技巧] micropython 如何执行 *.mpy 文件
    从零开始深入 Linux 底层(软件工程)
    从嵌套结构中取值时如何编写兜底逻辑
    学习JUC源码(2)——自定义同步组件
    学习JUC源码(1)——AQS同步队列(源码分析结合图文理解)
    Java多线程中的wait/notify通信模式
    详解Java锁的升级与对比(1)——锁的分类与细节(结合部分源码)
    认识Redis集群——Redis Cluster
    工作三年多的感慨与总结(二)
    工作三年多的感慨与总结(一)
  • 原文地址:https://www.cnblogs.com/lengzhijun/p/5856631.html
Copyright © 2011-2022 走看看