activiti學習9:給用戶任務分配權限


activiti學習9:給用戶任務分配權限

大部分的業務流程都會有人的參與,用戶任務是最常用的任務,在流程圖中使用userTask元素定義用戶任務。

當流程到達用戶任務時該任務會被分配到特定用戶或者用戶組,這就是給用戶任務分配權限。這個分配權限指的是分配后可以通過activiti提供的任務查詢api根據用戶或者用戶組來查詢到這個任務。

一、使用JUEL表達式分配權限

1.1給用戶任務分配候選人

這是一個含有一個用戶任務的流程圖

一個任務可以設置多個候選人,候選人在業務上指的是有權對該任務進行操作的群體。在流程圖上使用juel表達式分配候選人的方法如下

 <userTask id="sid-31845D76-A308-4442-AE19-4AA4238DB39A" name="juel表達式分配候選人" activiti:candidateUsers="${candidateUsers}"></userTask>

這里的candidateUsers是一個流程變量,以list的形式存放了候選人列表。

啟動流程時創建這樣一個流程變量,流程啟動后會在任務表中創建一個用戶任務,該任務的候選人就是流程變量中傳遞的這幾個值,注意任務和候選人的關系存儲在act_ru_identitylink表中

//使用juel表達式指定候選人
        List<String> candidateUsers=new ArrayList<>();
        candidateUsers.add("zhangsan");
        candidateUsers.add("lisi");
        Map<String,Object> variableMap=new HashMap<>();
        variableMap.put("candidateUsers",candidateUsers);
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("juel-candidateUser2",variableMap);
        System.out.println(processInstance);

權限分配成功后就可以使用activiti提供的任務查詢api來根據候選人查詢任務

List<Task> list = taskService.createTaskQuery().taskCandidateUser("lisi").list();
        for (Task task : list) {
            System.out.println(task.getName());
        }

注意這里流程變量中放的值activiti會當做用戶id來處理,但這個用戶可以不在activiti的用戶表中存在,所以可以用來關聯自己系統中的用戶id

1.2 給用戶任務分配候選組

候選組的概念和候選人類似,用來把一個群體的人指定為一個任務的權限人,對應的是activiti中的用戶組,分配一個用戶組id到某個任務上,可以指定整個組的人為該任務的候選人,在流程圖上指定候選組的方式和指定候選人類似

 <userTask id="juel-candidateGroup" name="juel表達式指定候選組" activiti:candidateGroups="${candidateGroup}"></userTask>

這里的candidateGroup也是一個流程變量,其中存放了用戶組id的lsit集合

Map<String,Object> map=new HashMap<>();
        List<String> groupList=new ArrayList<>();
        groupList.add("項目經理");
        groupList.add("測試");
        map.put("candidateGroup",groupList);
        runtimeService.startProcessInstanceByKey("juel-candidateGroup2",map);

注意這個用戶組在activiti的群組表中可以不存在。

可以使用任務查詢api查詢群組對應的任務

List<Task> list = taskService.createTaskQuery().taskCandidateGroup("項目經理").list();
        for (Task task : list) {
            System.out.println(task.getName());
        }

1.3 給用戶任務分配代理人

和候選人不同,一個用戶任務只允許有一個代理人。為一個任務分配代理人后act_ru_task表的ASSIGNEE_字段會被設置為響應的值。設置方法和候選人類似,可以在流程文件中用juel表達式配置

<userTask id="sid-9253B2C0-D7CF-49C9-BE00-3B68D87413D4" name="juel表達式分配代理人" activiti:assignee="${assignee}"></userTask>

assignee也是一個流程變量

 //使用juel表達式指定代理人
        Map<String,Object> map=new HashMap<>();
        map.put("assignee","jerry");
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("juel-assignee",map);
        System.out.println(processInstance);

同樣的,流程變量assignee中配置的用戶id也可以不在activiti的用戶表中。

根據用戶任務權限查詢api查詢任務

List<Task> list = taskService.createTaskQuery().taskAssignee("jerry").list();
        for (Task task : list) {
            System.out.println(task.getName());
        }

與候選人和候選組不同的是,代理人會被設置到任務表act_ru_taskASSIGNEE_字段中


上面的juel表達式中放置的都是一個流程變量,流程變量中存的是集合或者字符串,實際上也可以在流程變量中存一個JavaBean對象,然后在juel表達式中調用這個對象的方法和或者屬性,調用屬性時需要提供屬性的get方法,並且屬性要是public的,調用方式如下

${authBean.getAssignee}
${authBean.getCandidateUsers}

二、使用任務監聽器給用戶任務分配權限

在activiti中可以通過編寫自定義的任務監聽器,在監聽器中進行任務權限分配。

public class AuthListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
        delegateTask.setAssignee("岳不群");
        delegateTask.addCandidateUser("林平之");
        delegateTask.addCandidateUser("令狐沖");
        delegateTask.addCandidateGroup("華山派");
    }
}

自定義任務監聽器要實現TaskListener接口,在notify方法中進行權限分配,然后在流程圖中配置監聽器

<userTask id="sid-B6160828-7BF0-4936-B172-5EE48E8B12C8" name="使用監聽器分配權限">
      <extensionElements>
         <activiti:taskListener event="create" class="com.lyy.activiti_listener.AuthListener">            </activiti:taskListener>
      </extensionElements>
</userTask>

其中的event=create表示在創建這個用戶任務時執行這個監聽

這種方式比juel表達式要靈活些,如果要修改某個任務的權限人規則,不需要重新部署流程圖,只需要修改任務監聽就可以了。

public void test17(){
        ProcessInstance processInstance = 		            runtimeService.startProcessInstanceByKey("tasklistener-auth");
       System.out.println(processInstance);
    }

三、使用taskService的api分配

如果想在任務創建號了以后改變任務的權限人,可以使用taskService提供的api完成

	taskService.setAssignee("taskId","userId");
    taskService.addCandidateGroup("taskId","groupId");
    taskService.addCandidateUser("taskId","userId");

類似的,如果要刪除某個任務的權限人,也可以使用taskService中的api


免責聲明!

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



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