flowable 新的駁回方式 ChangeActivityStateBuilder 多實例駁回 並行網關駁回 普通節點駁回


6.4.0 新增加了駁回的方式,真是對中國式流程的一種福音呀,感謝flowable創始人。

再也不為開發駁回流程發愁了,網上那些視頻和修改源碼真的是demo級別的,不能商業用。

只有心如流水的學習才是永遠的發電機,不要幻想別人能給把系統都給你做好了。

任何節點都可以跳轉

runtimeService.createChangeActivityStateBuilder()
                .processInstanceId(processInstanceId)
                .moveActivityIdsToSingleActivityId("當前的任務的節點id", "需要跳轉的目標節點")
                .changeState();

當然有很多方法,大家可以去找一下ChangeActivityStateBuilder這里類。

1. 直接上代碼吧,從來都是干貨,不隱藏,哈哈。

public ReturnVo<String> backToStep(BackVo backVo) throws Exception {
        ReturnVo<String> returnVo = new ReturnVo<>(FlowConstant.SUCCESS, "OK");
        Task task = taskService.createTaskQuery().taskId(backVo.getTaskId()).singleResult();
        String processInstanceId = task.getProcessInstanceId();
        FlowElement distActivity = processDefinitionUtils.findFlowElementById(task.getProcessDefinitionId(), backVo.getDistFlowElementId());
        //1. 保存任務信息
        task.setAssignee(backVo.getUserCode());
        taskService.saveTask(task);
        //2. 如果上一個節點是提交者的話要處理一下
        if (FlowConstant.FLOW_SUBMITTER.equals(distActivity.getName())) {
            //查找發起人 設置到變量中,以便駁回到提起人的時候能留在提交人這個節點
            ExtendProcinst extendProcinst = this.extendProcinstService.findExtendProcinstByProcessInstanceId(processInstanceId);
            String creator = null;
            if (extendProcinst != null) {
                creator = extendProcinst.getCreator();
                if (StringUtils.isBlank(creator)) {
                    creator = extendProcinst.getCurrentUserCode();
                }
            } else {
                ExtendHisprocinst extendHisprocinst = extendHisprocinstService.getExtendHisprocinstByProcessInstanceId(processInstanceId);
                creator = extendHisprocinst.getCreator();
                if (StringUtils.isBlank(creator)) {
                    creator = extendHisprocinst.getCurrentUserCode();
                }
            }
            if (StringUtils.isNotBlank(creator)) {
                runtimeService.setVariable(processInstanceId, FlowConstant.FLOW_SUBMITTER_VAR, creator);
            }
        }
        List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstanceId).list();
        List<String> currentActivityIds = new ArrayList<>();
        tasks.forEach(t -> currentActivityIds.add(t.getTaskDefinitionKey()));
        //3. 刪除節點信息
        if (!(distActivity instanceof EndEvent)) {
            this.deleteHisActivities((Activity) distActivity, processInstanceId);
        }
        //4. 添加審批意見和修改流程狀態
        this.addCommentAndUpdateProcessStatus(backVo, processInstanceId);
        //5.執行駁回操作
        runtimeService.createChangeActivityStateBuilder()
                .processInstanceId(processInstanceId)
                .moveActivityIdsToSingleActivityId(currentActivityIds, backVo.getDistFlowElementId())
                .changeState();
        return returnVo;
    }

2. 經測試  多實例節點,並行網關,判斷網關都沒有問題,甚至是子流程的一種節點跳轉都有相應的方法

具體怎么使用可以去看官方的測試用例

 


免責聲明!

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



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