A-A+

Activiti6.0 – 节点跳转

2019年07月09日 技术 评论 2 条 阅读 6,714 次

之前一直在试验Flowable的节点跳转,可以参见以下文章:

Flowable6.4节点跳转初探

Flowable6.4子流程节点跳转

Flowable6.4多实例流程节点跳转

但是,Activiti并没有这些API接口,那么应该如何实现呢?接下来就实现一下简单流程节点的跳转。

首先,本文是基于Command接口实现,关于Activiti中的Command会在之后的文章中详解一下,本篇文章就暂时只是说明如何实现、使用。

先上流程图,如下:

非常简单的一个流程,只包含开始、结束和三个用户节点。这样的流程在正常流转时,会在表act_ru_execution内生成两条数据:

在表act_ru_task内生成一条数据:

并且,在流程的流转过程中,基本保持不变:


D_没有变化,只有ACT_ID_有所变化

​ID_和TASK_DEF_KEY_有变化,所属EXECUTION_ID_无变化

所以,只需要删除掉act_ru_task表中的数据,然后让流程向指定节点流转即可。

此时,就需要利用Command接口实现,具体的代码如下:

/**
 * 移动节点命令
 */

public class MoveSingleCommand implements Command<Object{

    /**
     * 当前TaskId
     */

    private String currentTaskId;

    /**
     * 目标流程定义节点Id
     */

    private String targetNodeId;

    public MoveSingleCommand(String currentTaskId, String targetNodeId) {
        this.currentTaskId = currentTaskId;
        this.targetNodeId = targetNodeId;
    }

    public String getCurrentTaskId() {
        return currentTaskId;
    }

    public void setCurrentTaskId(String currentTaskId) {
        this.currentTaskId = currentTaskId;
    }

    public String getTargetNodeId() {
        return targetNodeId;
    }

    public void setTargetNodeId(String targetNodeId) {
        this.targetNodeId = targetNodeId;
    }

    @Override
    public Object execute(CommandContext commandContext) {
        ExecutionEntityManager executionEntityManager = commandContext.getExecutionEntityManager();
        TaskEntityManager taskEntityManager = commandContext.getTaskEntityManager();
        TaskEntity taskEntity = taskEntityManager.findById(this.currentTaskId);
        ExecutionEntity executionEntity = executionEntityManager.findById(taskEntity.getExecutionId());
        Process process = ProcessDefinitionUtil.getProcess(executionEntity.getProcessDefinitionId());
        taskEntityManager.deleteTask(taskEntity, "移动节点"truetrue);
        FlowElement targetFlowElement = process.getFlowElement(targetNodeId);
        executionEntity.setCurrentFlowElement(targetFlowElement);
        ActivitiEngineAgenda agenda = commandContext.getAgenda();
        agenda.planContinueProcessInCompensation(executionEntity);
        return null;
    }
}

然后开放一个Url地址执行此Command即可,代码如下:

 /**
     * 移动节点
     */

    @RequestMapping(value = "move/{taskId}/{toNodeId}")
    public void move(@PathVariable("taskId") String taskId,
                     @PathVariable("toNodeId") String toNodeId) 
{
        managementService.executeCommand(new MoveSingleCommand(taskId, toNodeId));
    }

链接地址示例:

http://localhost:8080/activiti/flow/move/150085/UserTask1

可以看到节点由UserTask2回退至UserTask1:

觉的不错?可以关注我的公众号↑↑↑

2 条留言  访客:0 条  博主:0 条

  1. zxc220099

    targetNodeId这个节点是最终需要跳转的节点,那我怎么知道这个节点的ID是啥?假如我现在有三个节点A,B,C,A审批完了之后到B审批的时候我要跳过,不走B,直接到C,那我应该如何获取C节点的节点ID?

    • 哼哼的泰迪熊

      自行分析Bpmn模型

给我留言

Copyright © 字痕随行 保留所有权利.   Theme  Ality

用户登录

分享到: