springboot + activiti6常用流程實戰(順序流程,排他網關)

一.基本流程實現

流程測試我這用的是swagger,也可以用postman進行流程的運行,

       (1)先來了解什麼是並行網關  圖標爲+

  並行網關允許將流程分成多條分支,也可以把多條分支匯聚到一起,並行網關的功能是基於進入和外出順序流的:

  fork 分支:

    並行後的所有外出順序流,爲每個順序流都創建一個併發分支。

  join 匯聚:

    所有到達並行網關,在此等待的進入分支, 直到所有進入順序流的分支都到達以後,  流程就會通過匯聚網關。

  注意:

    如果同一個並行網關有多個進入和多個外出順序流, 它就同時具有分支和匯聚功能。 這時, 網關會先匯聚所有進入的順序流,然後再切分成多個並行分支。

      (2)什麼是排他網關  圖標爲 -

           排他網關是用來控制流程的流向.

  並行與其他網關的主要區別:

    並行網關不會解析條件。 即使順序流中定義了條件,也會被忽略。

流程圖對應一個流程id和多個任務.每個任務對應每個人來操作.

1.普通流程,先用idea插件畫BPMN流程圖.這個插件畫相對eclipse插件,或者activiti-app相對噁心點,不好畫.如果不習慣這個插件,也可以用其他軟件畫好,複製過來.

2.發起流程,此流程很簡單,先是主管審覈,主管審完然後人事審覈,流程結束,接下來開始操作

上一節config初始化配置拿到的流程相關接口注入.

   啓動流程

   /**
     * 啓動流程
     * @param perid
     * @param tempName
     * @param map
     * @return
     */
    @Override
    public ProcessInstance getTask(String perid, String tempName, Map<String, Object> map){
        identityService.setAuthenticatedUserId(perid);
        // 開始流程  map內容set對應的審覈用戶
        ProcessInstance pi = runtimeService.startProcessInstanceByKey(tempName, map);
        // 查詢當前任務
        return pi;
    }

map裏面對應的key可以set用戶,也可以在流程圖寫死,一般是根據業務來進行set對應的用戶(assignee屬性配置)

perid 發起流程的用戶

tempName 此流程的名稱

3.流程啓動然後到主管,用主管查詢待審覈的流程

    @Override
    public List<ActivitiTask> myApproval(String userName) {
        List<Task> taskList = taskService.createTaskQuery().taskAssignee(userName)
                .orderByTaskCreateTime().desc().list();
        // 多此一舉 taskList中包含了以下內容(用戶的任務中包含了所在用戶組的任務)
        //        Group group = identityService.createGroupQuery().groupMember(userName).singleResult();
        //        List<Task> list = taskService.createTaskQuery().taskCandidateGroup(group.getId()).list();
        //        taskList.addAll(list);
        List<ActivitiTask> activitiTaskList = new ArrayList<>();
        for (Task task : taskList) {
            ActivitiTask activitiTask = new ActivitiTask();
            activitiTask.setId(task.getId());
            activitiTask.setName(task.getName());
            activitiTask.setCreateTime(task.getCreateTime());
            String instanceId = task.getProcessInstanceId();
            ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceId(instanceId).singleResult();
            Activiti activiti = getActiviti(instance);
            activitiTask.setActiviti(activiti);
            activitiTask.setProcessInstanceId(instanceId);
            activitiTaskList.add(activitiTask);
        }
        return activitiTaskList;

4,查詢到待審覈的任務,根據任務id和當前用戶進行審覈

  審覈操作(審覈操作可能會牽扯到是否同意,原因等字段,可以自定義進行傳參)

    @Override
    public Boolean passApproval(String userName, ActivitiTask activitiTask) {
        String taskId = activitiTask.getId();
        Map<String, Object> vars = new HashMap<>();
        vars.put("result", activitiTask.getActiviti().getResult());
        vars.put("auditor", activitiTask.getActiviti().getAuditor());
        vars.put("auditTime", new Date());
        vars.put("ifPass", activitiTask.getActiviti().getIfPass());
        //taskService.claim(taskId, userName);
        taskService.setAssignee(taskId, userName);
        taskService.complete(taskId, vars);
        return true;
    }

5,審覈成功之後進入人事審覈,人事審覈同樣上述操作,審覈完成,流程結束.

6.想要查看當前流程進度,查看流程圖(根據流程的id獲取流程圖)

    /**
     * 生成流程圖片
     *
     * @param processDefinitionId
     * @param outputStream
     * @return
     */
    @Override
    public void tracePhoto(String processDefinitionId, OutputStream outputStream) {
        ActUtils.getFlowImgByInstanceId(processDefinitionId, outputStream);
    }

以上基本流程代碼已經可以實現流程的步驟,

二 .排他網關的流程實現

排他網關在業務流程中可能有兩種或者多種選擇,選擇不同結果會進入的下一步流程就會不同,所以在他的後面用表達式進行區分,在實現審覈的時候根據你審覈的參數他會進入不同的審覈狀態

 用戶申報流程,申報成功結轉到審覈,審覈有兩種情況,在condition屬性下配置表達式,同意流程結束,不同意,退回重新申報,接下來開始操作

1.此方法操作跟上面接口一直,在審覈的時候,你只需要給參數ifPass進行寫入數據,同意爲1,不同意爲0,,如果沒有滿足的值會拋出異常,流程審覈會根據你的條件退回去還是結束.

後面還有對應的多人順序或者並列審覈,持續學習,持續更新.

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