【转】activiti用户任务

原文连接:http://jhaij.iteye.com/blog/1882582

用户任务

描述

user task 是一个需要由实际用户操作的节点. 当流程执行到这么一个用户任务节点时,会通过user(用户) 或者组(group) 在task中定义的 assigned 角色来创建一个新的用户任务.

图形

用户任务就是左上角有人员图标的图形

XML 表示

id 必填 ,  name 可选

<userTaskid="theTask"name="Important task"/>                   
                                  

documentation 是描述信息,可选

<userTaskid="theTask"name="Schedule meeting">
  <documentation>
          Schedule an engineering meeting for next week with the new hire.
  </documentation>

通过task获取方式如下:

task.getDescription()

Due 到期日

到期日 必须是java.util.Date 类型, 或者 格式化后的String类型,或者null ,  生成方式可以是表单输入,或者之前的service 任务生成.

<userTask id="theTask" name="Important task" activiti:dueDate="${dateVariable}"/>

也可以通过 TaskService 或者TaskListeners , DelegateTask.改变值

User assignment 审批人

可以分配给一个用户 ,通过 humanPerformer 节点 的 sourceAssignmentExpression 节点 指定人员 . 现在 仅支持 formalExpressions 属性.

<process ... >
  
  ...
  
  <userTask id='theTask' name='important task' >
    <humanPerformer>
      <resourceAssignmentExpression>
        <formalExpression>kermit</formalExpression>
      </resourceAssignmentExpression>
    </humanPerformer>
  </userTask>

 

解释为受让人, 或者审批人,  只有一个审批人的任务. 由其在 代办任务中查看, 其他人是看不到的.

直接分配assignee 的用户任务,可以通过 taskService 检索到其 需要代办的任务列表:

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

 

任务也可以开放给 候选人 列表.那么, potentialOwner 节点就用上了, 用法跟 humanPerformer 节点类似. 要注意的是:候选人必须制定候选人是用户,还是组, 否则无法解析定义的到底是什么东西

<process ... >
  
  ...
  
  <userTask id='theTask' name='important task' >
    <potentialOwner>
      <resourceAssignmentExpression>
        <formalExpression>user(kermit), group(management)</formalExpression>
      </resourceAssignmentExpression>
    </potentialOwner>
  </userTask>

 

列出候选人 所属的task 列表 ,代码如下:

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

如果没有制定 user 或者group 默认以组方式查询 类似: group(accountancy)

<formalExpression>accountancy</formalExpression>

 

Activiti extensions for task assignment 审批人简单扩展

下面是通过activiti 提供的简单的描述方式,来定义审批人.比上面那种xml格式简单多了.

  • assignee attribute: 指定实际用户.

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

    跟 humanPerformer 定义效果一样

  • candidateUsers attribute: 指定候选人

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

    跟 potentialOwner定义效果一样. 不用再像 user(kermit) 这样输入, 因为他本身就是user节点. 直接输入用户代码就行了

  • candidateGroups attribute:指定候选人的组名

    <userTask id="theTask" name="my task" activiti:candidateGroups="management, accountancy" />

    同上, 直接写group name就行了

  • candidateUsers 和 candidateGroups can 在同一个task节点中可以同时存在

验证用户权限,在集成到业务系统中时需要用上监听:

<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");
    ...
  }
  
}

如果你使用了spring,可以使用service 表达式实现, 如下,就定义了 通过 ldapServie 的 findManagerForEmployee 方法或者审批人.

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

获取受让人(候选人) 如出一辙:

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

注意: 方法返回值 必须是 String 或者 List<String> 类型:

            
public class FakeLdapService {
  
  public String findManagerForEmployee(String employee) {
    return "Kermit The Frog";
  }
  
  public List<String> findAllSales() {
    return Arrays.asList("kermit", "gonzo", "fozzie");
  }

}

猜你喜欢

转载自eric-hwp.iteye.com/blog/1967281