天天看點

【Activiti工作流】Activiti 并行子流程【Activiti工作流】Activiti 并行子流程

【Activiti工作流】Activiti 并行子流程

  1. 業務場景

    流程發起後需要多個部門同時處理,部門數根據業務資料來定。一筆業務申請涉及到多個部門,發起崗送出給各個部門處理人,處理人處理後由各個部門的負責人稽核,等待所有部門處理完送出給彙總崗彙總,最後交給彙總崗負責人确認,流程結束。

  2. 流程圖繪制
    【Activiti工作流】Activiti 并行子流程【Activiti工作流】Activiti 并行子流程
    子流程繪制
    【Activiti工作流】Activiti 并行子流程【Activiti工作流】Activiti 并行子流程
    部門處理人,取傳入的list中的元素
    【Activiti工作流】Activiti 并行子流程【Activiti工作流】Activiti 并行子流程
  3. 部署流程
@Test
    public void deploy() {
        // 擷取倉庫服務 :管理流程定義
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deploy = repositoryService.createDeployment()// 建立一個部署的建構器
                .addClasspathResource("diagrams/WorkPlan.bpmn")// 從類路徑中添加資源,一次隻能添加一個資源
                .name("WorkPlan")// 設定部署的名稱
                .category("辦公類别")// 設定部署的類别
                .deploy();

        System.out.println("部署的id" + deploy.getId());
        System.out.println("部署的名稱" + deploy.getName());
    }
           
  1. 啟動流程

    流程正常啟動,activiti 會根據傳入的集合大小,建立對應個數的子流程。

@Test
    public void startProcess() {
        // 指定執行我們剛才部署的工作流程
        String processDefiKey = "WorkPlan";
        // 業務流水号
        String businessKey = "SQ20191109052000001";
        // 取運作時服務
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 流程變量
        Map<String, Object> variables = new HashMap<>();
        List<String> list = new ArrayList<String>();
        list.add("張三");
        list.add("李四");
        variables.put("userList", list);
        // 取得流程執行個體
        ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefiKey, businessKey, variables);// 通過流程定義的key來執行流程
        System.out.println("流程執行個體id:" + pi.getId());// 流程執行個體id
        System.out.println("流程定義id:" + pi.getProcessDefinitionId());// 輸出流程定義的id
        // 查詢所有的子流程
        List<Task> taskList = processEngine.getTaskService().createTaskQuery()
                .processInstanceId(pi.getProcessInstanceId()).list();
        variables.clear();
        variables.put("approve_status", "111");
        // 完成目前節點
        for (Task task : taskList) {
            // 設定目前辦理人為發起人
            processEngine.getTaskService().setAssignee(task.getId(), "發起人");
            // 完成目前子流程第一個節點
            processEngine.getTaskService().complete(task.getId(), variables);
        }
    }
           

這裡list傳入兩個值,啟動流程後,成功送出到兩個節點。

【Activiti工作流】Activiti 并行子流程【Activiti工作流】Activiti 并行子流程

至此可以正常走流程,等待所有子流程處理完,流程才會送出到彙總崗。

  1. 其他代碼

    流程送出的方法

// 完成任務
    @Test
    public void compileTask() {
        String taskId = "47532";
        Task task = processEngine.getTaskService().createTaskQuery().taskId(taskId).singleResult();
        // taskId:任務id
        Map<String, Object> variables = new HashMap<>();
        variables.put("approve_status", "111");
        processEngine.getTaskService().complete(taskId, variables);
        Task nexttask = processEngine.getTaskService().createTaskQuery()
                .processInstanceBusinessKey("SQ20191109052000001")//業務流水号
                .executionId(task.getExecutionId())//目前執行ID
                .singleResult();
        if (nexttask != null) {
            switch (nexttask.getName()) {
            case "部門負責人":
                processEngine.getTaskService().setAssignee(nexttask.getId(), task.getAssignee() + "負責人");
                break;
            case "發起崗":
                processEngine.getTaskService().setAssignee(nexttask.getId(), task.getAssignee() + "發起崗");
                break;
            }

        }
        System.out.println(nexttask.getId());
        System.out.println("目前任務執行完畢" + taskId);
    }
           

查詢處理人任務的方法

/** 查詢目前的個人任務(實際就是查詢act_ru_task表) */
    @Test
    public void findMyPersonalTask() {
        String assignee = "張三";
        // 擷取事務Service
        TaskService taskService = processEngine.getTaskService();
        List<Task> taskList = taskService.createTaskQuery()// 建立任務查詢對象
                .taskAssignee(assignee)// 指定個人任務查詢,指定辦理人
                .list();// 擷取該辦理人下的事務清單
        if (taskList != null && taskList.size() > 0) {
            for (Task task : taskList) {
                System.out.println("#############################################");
                System.out.println("任務ID:" + task.getId());
                System.out.println("任務名稱:" + task.getName());
                System.out.println("任務的建立時間:" + task.getCreateTime());
                System.out.println("任務辦理人:" + task.getAssignee());
                System.out.println("流程執行個體ID:" + task.getProcessInstanceId());
                System.out.println("執行對象ID:" + task.getExecutionId());
                System.out.println("流程定義ID:" + task.getProcessDefinitionId());
                System.out.println("#############################################");
            }
        } else {
            System.out.println(assignee + "沒有正在處理的任務");
        }
    }

           

yusys

繼續閱讀