Flowable實戰(七)使用者和組

金楊傑 發表於 2022-01-14

  在流程中,最重要的參與者是使用者。流程定義了任務何時需要使用者參與,什麼使用者可以參與。

  組可以理解為我們常說的角色。

  Flowable中內建了一套簡單的對使用者和組的支援,身份管理(IDM IDentity Management),但從Flowable V6起,該元件從Flowable引擎模組中抽出。這是因為它不是Flowable引擎的核心內容,而且在很多企業應用中,常常需要結合現有應用系統的使用者和組,並不使用或需要Flowable提供的使用者和組。

一、BPMN2.0 指派使用者和組

  使用者和組主要在使用者任務(user task)中使用。當流程執行到達使用者任務時,會為指派至該任務的使用者或組的任務列表新增一個新任務。

1.1 指派使用者

  使用者任務可以直接指派(assign)給使用者。

    <userTask id="theTask" name="重要任務">
        <humanPerformer>
            <resourceAssignmentExpression>
                <formalExpression>jinyangjie</formalExpression>
            </resourceAssignmentExpression>
        </humanPerformer>
    </userTask>

  只能指定一個使用者作為任務的humanPerformer。在Flowable術語中,這個使用者被稱作辦理人(assignee)。擁有辦理人的任務,在其他人的任務列表中不可見,而只能在該辦理人的個人任務列表中看到。

  上面的標準用法比較笨重,使用Flowable自定義擴充套件以減少複雜度。

	<userTask id="theTask" name="重要任務" flowable:assignee="jinyangjie"/>

  通過TaskService獲取指定使用者待辦理的任務

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

1.2 指派潛在使用者

  有時候,我們並不知道任務的具體辦理人是誰,但知道哪些人是潛在的辦理者。比如請假申請時,我們可以向部門經理或者專案經理申請,只要他們中的一個辦理審批即可。

  在流程中,使用potentialOwner(潛在使用者)結構指派使用者的候選任務列表。

    <userTask id='theTask' name='重要任務' >
        <potentialOwner>
            <resourceAssignmentExpression>
                <formalExpression>user(jinyangjie)</formalExpression>
            </resourceAssignmentExpression>
        </potentialOwner>
    </userTask>

  Flowable自定義擴充套件:

	<userTask id="theTask" name="重要任務" flowable:candidateUsers="jinyangjie, zhangsan" />

  獲取潛在任務,或者說候選任務列表的方法:

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

  在候選列表中,當其中一個潛在使用者申領(claim)任務後,即代表該任務已經指定由申領人辦理。

1.3 指派潛在組

    <userTask id='theTask' name='重要任務' >
        <potentialOwner>
            <resourceAssignmentExpression>
                <formalExpression>group(leader)</formalExpression>
            </resourceAssignmentExpression>
        </potentialOwner>
    </userTask>

  Flowable自定義擴充套件:

	<userTask id="theTask" name="重要任務" flowable:candidateGroups="leader, manager" />

  獲取潛在組任務列表方法:

	List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("leader");

1.4 指派潛在使用者和組

    <userTask id='theTask' name='重要任務' >
        <potentialOwner>
            <resourceAssignmentExpression>
                <formalExpression>user(jinyangjie), group(leader)</formalExpression>
            </resourceAssignmentExpression>
        </potentialOwner>
    </userTask>

  如果並未指定給定字串是使用者還是組,引擎預設其為組。

二、IDM

  IDM(身份管理 IDentity Management)是Flowable提供的使用者和組的管理元件。

  預設情況下,IDM引擎在Flowable引擎啟動時初始化並啟動。IDM引擎管理自己的資料庫表結構及下列實體:

  • User與UserEntity,使用者資訊。
  • Group與GroupEntity,組資訊。
  • MembershipEntity,組中的使用者成員。
  • Privilege與PrivilegeEntity,許可權定義(例如在Flowable Modeler與Flowable Task應用中,用於控制應用介面的訪問)。
  • PrivilegeMappingEntity,將使用者及/或組與許可權關聯。
  • Token與TokenEntity,應用介面程式使用的認證令牌。

  歷史與當前進行中的流程例項都在資料庫中儲存歷史實體,因此可以選擇直接查詢歷史表,以減少對執行時流程例項資料的訪問,並提高執行時執行的效能。

三、自定義指派使用者和組

  實際應用中,我們需要自定義指派使用者和組,下面我們通過任務監聽器實現自定義指派。

  在使用者任務上新增建立事件(create event)型別的監聽器,呼叫自定義指派邏輯:

    <userTask id="task1" name="我的任務" >
      <extensionElements>
        <flowable:taskListener event="create" class="org.flowable.MyAssignmentHandler" />
      </extensionElements>
    </userTask>

  傳遞至TaskListener的DelegateTask,可用於設定辦理人與候選使用者/組:

    public class MyAssignmentHandler implements TaskListener {

      public void notify(DelegateTask delegateTask) {
        // 在這裡執行自定義身份查詢

        // 然後呼叫如下命令:
        delegateTask.setAssignee("jinyangjie");
        delegateTask.addCandidateUser("zhangsan");
        delegateTask.addCandidateGroup("leader");
        ...
      }

    }

四、小結

  事實上,Flowable在執行時並不做任何使用者檢查。例如任務可以分派給任何使用者,而引擎並不會驗證系統中是否存在該使用者。這給我們留下了很大自定義使用者和組的空間,這樣當我們將Flowable嵌入應用時,可以與應用已有的使用者和組結合使用,也可以結合LDAP、Active Directory等服務使用。後續篇章中,我們將會介紹Flowable與LDAP的整合。