美文网首页
Flowable 实现节点跳过

Flowable 实现节点跳过

作者: 爱_别离 | 来源:发表于2019-05-17 01:45 被阅读0次

    在Flowable开发中可能会遇到当前节点由于某种原因直接跳过 此时可以用到基于flowable命令类实现跳过当前流程,也可配合之前所写Flowable全局监听效果更好 直接上代码!

    package com.tlsq.service.workflow.command;
    
    
    import org.flowable.bpmn.model.FlowElement;
    import org.flowable.bpmn.model.Process;
    import org.flowable.common.engine.impl.interceptor.Command;
    import org.flowable.common.engine.impl.interceptor.CommandContext;
    import org.flowable.engine.FlowableEngineAgenda;
    import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
    import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager;
    import org.flowable.engine.impl.util.CommandContextUtil;
    import org.flowable.engine.impl.util.ProcessDefinitionUtil;
    import org.flowable.task.service.impl.persistence.entity.TaskEntity;
    import org.flowable.task.service.impl.persistence.entity.TaskEntityManager;
    
    /**
     * @explain: 自定义节点跳转命令
     * @author: Lu Yang
     * @data: 2019-04-23 14:35
     */
    public class TaskJumpCmd implements Command<Void> {
    
        // 任务ID
        private String taskId;
    
        // 目标节点ID
        private String targetNodeId;
    
        public TaskJumpCmd(String taskId, String targetNodeId) {
            this.taskId = taskId;
            this.targetNodeId = targetNodeId;
        }
    
        @Override
        public Void execute(CommandContext commandContext) {
            // 获取命令执行实体管理器
            ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager();
            // 获取任务对象管理器
            TaskEntityManager taskEntityManager = CommandContextUtil.getTaskServiceConfiguration().getTaskEntityManager();
            // 根据任务ID获取任务对象
            TaskEntity taskEntity = taskEntityManager.findById(taskId);
            // 根据任务对象属性excutionId获取流程实例对象
            ExecutionEntity executionEntity = executionEntityManager.findById(taskEntity.getExecutionId());
            // 根据流程执行实例中的流程模板定义ID属性获取流程对象
            Process process = ProcessDefinitionUtil.getProcess(executionEntity.getProcessDefinitionId());
            // 根据目标节点ID获取对应节点
            FlowElement targetFlowElement = process.getFlowElement(targetNodeId);
            // 在上一流程实例对象中改变当前节点
            executionEntity.setCurrentFlowElement(targetFlowElement);
            // 获取流程计划 注: 翻译可能不对
            FlowableEngineAgenda agenda = CommandContextUtil.getAgenda();
            // 更新流程实例对象 注: 翻译可能不对
            agenda.planContinueProcessInCompensation(executionEntity);
            // 根据在任务对象中删除之前任务
            taskEntityManager.delete(taskId);
            return null;
        }
    }
    
    
    // 改方法的调用
    managementService.executeCommand(new TaskJumpCmd(taskId, nextNodeId));
    

    相关文章

      网友评论

          本文标题:Flowable 实现节点跳过

          本文链接:https://www.haomeiwen.com/subject/ltpgaqtx.html