[轉]activiti5使用者任務分配

來源:互聯網
上載者:User

標籤:

使用者任務分配辦理人:
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");  }}

 

[轉]activiti5使用者任務分配

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.