《Activiti/Flowable  深入BPM工作流》-組任務的辦理流程是什麼?

 

 

 

    《Activiti/Flowable  深入BPM工作流》-組任務的辦理流程是什麼?

 

 

一. 問題

         組任務的辦理流程是什麼?

 

 

二. 詳情

第一步:查詢組任務

指定候選人,查詢該候選人當前的待辦任務。

候選人不能辦理任務。

第二步:讓候選人去拾取(claim)任務

該組任務的所有候選人都能拾取。

將候選人的組任務,變成個人任務。原來候選人就變成了該任務的負責人。

問題:  如果拾取後不想辦理該任務怎麼辦?

解答: 需要將已經拾取的個人任務歸還到組裏邊,將個人任務變成了組任務。

第三步:查詢個人任務

         查詢方式同個人任務部分,根據 assignee 查詢用戶負責的個人任務。

第四步:辦理個人任務

 

 

1. 部署流程定義

 // 新的請假流程定義的部署
    public static void main(String[] args) {
        // 1. 得到 processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 得到 RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();

        // 部署
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("holiday.bpmn")
//                .addClasspathResource("studentHoliday.png")
                .name("請假流程2020-5-20")
                .deploy();

        System.out.println(deploy.getId());
        System.out.println(deploy.getName());
        System.out.println(deploy.getKey());
    }

 

2. 啓動流程定義

// 啓動流程實例,同時還要設置流程變量的值
    public static void main(String[] args) {
        // 1. 得到 processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 2.得到 RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();

        // 3.流程定義的key問題並進行啓動
        String processDefinitionKey = "myProcess_1";
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1");

        // 4.輸出實例信息;
        System.out.println(processInstance.getName());
        System.out.println(processInstance.getProcessDefinitionId());
        System.out.println(processInstance.getId());
    }

 

3. 處理任務,到下一步,部門經理

 // 處理任務: 任務查詢是否存在再執行
    public static void main(String[] args) {
        // 1. 得到 processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        // 2.得到 TaskService
        TaskService taskService = processEngine.getTaskService();

        // 3. 查詢當前用戶是否有任務
        String key = "myProcess_1";
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .singleResult();

        // 4. 判斷task!=null,說明當前用戶有任務
        if (task != null) {
            taskService.complete(task.getId());
            System.out.println("用戶任務執行完成");
            System.out.println(task.getId());
        }
    }

 

任務成功執行完畢如下:

 

4. 查詢候選用戶的組任務

// 4.根據候選人查詢組任務
    public  void findGroupTaskList() {
        // 流程定義key
        String key = "myProcess_1";
        // 任務候選人
        String candidateUser = "zhangsan";
        // 創建 TaskService
        TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
        // 查詢任務
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskCandidateUser(candidateUser)
                .list();

        // 流程信息的輸出展示
        if (!list.isEmpty()) {
            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());
            }
        }
    }

成功運行結果如下:

 

5. 讓候選人去拾取(claim)任務

// 5. 讓候選人去拾取(claim)任務
    public static void claimTask() {

        TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
        String key = "myProcess_1";
        String candidateUsers = "zhangsan";

        // 先查詢是否有任務,校驗用戶是否有資格
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskCandidateUser(candidateUsers)
                .singleResult();

        if (task != null) {
            // 拾取主任務
            taskService.claim(task.getId(), candidateUsers);
            System.out.println("該任務拾取成功!");
        }
    }

如果任務拾取成功顯示如下:

 

查看部門經理的assignee,之前是空, 目前已經確認,給 "zhansan" 了. "zhansan"由候選人變成了執行人.

任務拾取的核心:    TaskService.claim(taskId, candidateUser); 目的就是將候選人轉化爲執行人, 讓assignee有值.

 

 

6.  用戶查詢個人代辦任務(候選人查詢自己的任務,候選人已經轉換成執行人了.)

    這裏的核心是用taskAssignee(userId);進行查詢, userId還是candidateUser, 但是candidateUser實際已經編程執行人了, 所以查詢的時候方法是用taskAssignee()來進行查詢.

// 6. 用戶查詢個人代辦任務
    public static void findPersonalTaskList(){
        // 流程定義key
        String key = "myProcess_1";
        // 任務候選人
        String candidateUser = "zhangsan";
        // 創建 TaskService
        TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
        // 查詢任務
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(candidateUser)
                .list();

        // 流程信息的輸出展示
        if (!list.isEmpty()) {
            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());
            }
        }
    }

 

7. 用戶辦理個人任務.

// 7.用戶辦理個人任務
    public static void completeTask() {
        // 任務Id
        String taskId = "";
        ProcessEngines.getDefaultProcessEngine().getTaskService()
                .complete(taskId);
        System.out.println("完成任務:" + taskId);
    }

 

優化--(判斷有沒有權限)

 // 7. 當前用戶完成自己的任務 
    public static void completeTask() {
        TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
        String key = "myProcess_1";
        String candidateUsers = "zhangsan";

        // 先查詢是否有任務,校驗用戶是否有資格
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(candidateUsers)
                .singleResult();

        if (task != null) {
            // 完成任務
            taskService.complete(task.getId());
            System.out.println("完成任務:" + task.getId());
        }

 

小結:   

組任務的辦理流程和任務的交接流程如下:

   第一步:查詢組任務

指定候選人,查詢該候選人當前的待辦任務。

 

   第二步:讓候選人去拾取(claim)任務

 

   第三步:查詢個人任務

       

  第四步:辦理個人任務

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章