activiti 7 + springboot2(十二)組任務


(一)Candidate-users候選人

在流程定義中在任務結點的assignee固定設置任務負責人,在流程定義時將參與者固定設置在.bpmn文件中,如果臨時任務負責人變更則需要修改流程定義,系統可擴展性差。針對這種情況可以給任務設置多個候選人,可以從候選人中選擇參與者來完成任務。

在流程圖中任務節點的配置中設置candidate-users(候選人),多個候選人之間用逗號分開。 

    

(二)辦理組任務

1)啟動任務 

    /**
     * 啟動一個實例
     */
    @Test
    public void startProcessInstance() {
        //啟動流程實例,同時還要設置流程定義的變量值
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1");
        System.out.println("流程實例id:" + processInstance.getProcessInstanceId());
    }

數據庫里生成下一個執行任務

 

 

2)執行填寫請假單任務 

    /**
     * 填請假單任務執行
     */
    @Test
    public void step1(){
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myProcess_1")
                .taskAssignee("張三")
                .singleResult();

        if(task!=null){
            taskService.complete(task.getId());
            System.out.println("用戶任務執行完畢...");
        }
    }

查看下一步任務, 可以看出都還未指定執行人。

 

 

 3)用戶查詢組任務 

    /**
     * 用戶查詢組任務
     */
    @Test
    public void findGroupTaskList() {
        String processDefinitionKey = "myProcess_1";
        String candidateUser = "李四";

        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey(processDefinitionKey)
                .taskCandidateUser(candidateUser)//設置候選用戶
                .list();

        for (Task task : list) {
            System.out.println("---------------------");
            System.out.println("流程實例id:" + task.getProcessInstanceId());
            System.out.println("任務id:" + task.getId());
            System.out.println("任務負責人:" + task.getAssignee());
            System.out.println("任務名稱:" + task.getName());
        }
    }

 

 4)用戶拾取組任務

    /**
     * 用戶拾取組任務,該任務變為自己的個人任務
     */
    @Test
    public void claimTask() {
        String taskId = "61184f94-390e-11ea-af99-30b49ec7161f";
        String userId = "李四";

        //校驗該用戶有沒有拾取任務的資格
        Task task = taskService.createTaskQuery().taskId(taskId)
                .taskCandidateUser(userId).singleResult();//根據候選人查詢

        if (task != null) {
            taskService.claim(taskId, userId);
            System.out.println("任務拾取成功");
        }
    }

查看數據庫,該任務的執行人已經變更為李四

 

 5)處理個人任務 

    /**
     * 部門經理完成審批
     */
    @Test
    public void step2() {
        Task task = taskService.createTaskQuery().processDefinitionKey("myProcess_1")
                .taskAssignee("李四").singleResult();

        if (task != null) {
            Holiday holiday = new Holiday();
            holiday.setDays(4F);
            //初始化一些參數
            Map<String, Object> map = new HashMap<>();
            map.put("holiday", holiday);

            taskService.complete(task.getId(), map);//完成任務時,設置流程變量的值
            System.out.println("用戶任務執行完畢...");
        }
    }

請假天數大於3天,所以任務流轉到總經理審批

 

 6)歸還組任務 

    /**
     * 歸還組任務,由個人任務變為組任務,還可以進行任務交接
     */
    @Test
    public void setAssigneeToGroupTask() {
        String taskId = "61184f94-390e-11ea-af99-30b49ec7161f";
        String userId = "李四";

        //校驗userId是否是taskId的負責人,如果是負責人才可以歸還組任務
        Task task = taskService.createTaskQuery().taskId(taskId)
                .taskAssignee(userId).singleResult();
        if (task != null) {
            //如果設置為null,歸還組任務,該任務沒有負責人
            taskService.setAssignee(taskId, null);
        }
    }

也可以通過 setAssignee 方法將任務委托給其它用戶負責,注意被委托的用戶可以不是候選人(不建議這樣使用)

 

 7)任務交接

 

    /**
     * 任務交接,前提要保證當前用戶是這個任務的負責人,這時候他才可以有權限去將任務交接給其他候選人
     */
    @Test
    public void setAssigneeToCandidateUser() {
        String taskId = "61184f94-390e-11ea-af99-30b49ec7161f";
        String userId = "李四";

        //校驗userId是否是taskId的負責人,如果是負責人才可以歸還組任務
        Task task = taskService.createTaskQuery().taskId(taskId)
                .taskAssignee(userId).singleResult();

        if (task != null) {
            //將此任務交給其它候選人辦理該任務
            String candidateUser = "王五";
            //根據候選人和組任務id查詢,如果有記錄說明該候選人有資格拾取該任務
            Task task1 = taskService.createTaskQuery().taskCandidateUser(candidateUser).singleResult();
            if (task1 != null) {
                taskService.setAssignee(taskId, candidateUser);
            }
        }
    }

 

源碼  https://download.csdn.net/download/zsg88/12109868

 

 

 

 


免責聲明!

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



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