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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM