A-A+

Activiti6.0 – 多实例节点跳转

2019年07月21日 技术, 默认 评论 4 条 阅读 5,174 次

最近都在试验Activiti6.0的节点跳转,其它的文章见索引

本次就试验一下在Activiti6.0的一个流程内,由多实例节点跳转至其它的用户节点。

首先,仍旧是先上流程图:

上图中,用户任务1和用户任务3是普通的用户节点,用户任务2是多实例节点。

当流程处于节点“用户任务1”时,数据表中的记录如下图:


act_ru_task

act_ru_execution

act_ru_variable

对比一下,当流程处于节点“用户任务2”时,数据库表中的记录如下图:


act_ru_task

act_ru_execution

act_ru_variable

同样的思路,当从多实例节点向普通用户节点跳转时,只需要清除Task记录、Execution记录和相关的Variable记录。

这里需要注意,与子流程节点跳转不同,act_ru_execution中的字段SUPER_EXEC_并没有值,所以只需要删除掉Task所属的Execution即可,即表中的ID_ IN ('160014', '160015', '160016')。

还需要注意,因为进入多实例节点后,有一些特殊的参数产生,如:nrOfInstances、nrOfCompletedInstances、nrOfActiveInstances,这些参数也需要删除掉,以避免流程的后续操作产生异常。

具体的代码如下:

/**
 * 移出多实例节点至父流程
 */

public class MoveMutiOutCommand implements Command<Object{

    private String currentTaskId;

    private String targetNodeId;

    public MoveMutiOutCommand(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) {
        //获得用到的Manager
        ExecutionEntityManager executionEntityManager = commandContext.getExecutionEntityManager();
        TaskEntityManager taskEntityManager = commandContext.getTaskEntityManager();
        IdentityLinkEntityManager identityLinkEntityManager = commandContext.getIdentityLinkEntityManager();
        VariableInstanceEntityManager variableInstanceEntityManager = commandContext.getVariableInstanceEntityManager();
        //获得当前流程处于的Task信息
        TaskEntity taskEntity = taskEntityManager.findById(this.currentTaskId);
        //获得流程实例信息
        ExecutionEntity executionEntity = executionEntityManager.findById(taskEntity.getExecutionId());
        ExecutionEntity parentExecutionEntity = executionEntityManager.findById(executionEntity.getParentId());
        List<ExecutionEntity> childExecutionEntities = executionEntityManager.findChildExecutionsByParentExecutionId(parentExecutionEntity.getId());
        //设置需要删除参数的流程实例
        Set<String> executionIds = new HashSet<>();
        executionIds.add(parentExecutionEntity.getId());
        for (ExecutionEntity childExecutionEntity : childExecutionEntities) {
            executionIds.add(childExecutionEntity.getId());
        }
        //获得流程定义信息
        Process process = ProcessDefinitionUtil.getProcess(executionEntity.getProcessDefinitionId());
        //删相关的办理人
        identityLinkEntityManager.deleteIdentityLink(executionEntity, nullnullnull);
        identityLinkEntityManager.deleteIdentityLink(parentExecutionEntity, nullnullnull);
        //删相关的参数
        List<VariableInstanceEntity> variableInstanceEntities = variableInstanceEntityManager.findVariableInstancesByExecutionIds(executionIds);
        for (VariableInstanceEntity variableInstanceEntity : variableInstanceEntities) {
            variableInstanceEntityManager.delete(variableInstanceEntity, true);
        }
        //删Task
        taskEntityManager.deleteTasksByProcessInstanceId(taskEntity.getProcessInstanceId(), "测试删除子节点"true);
        //删子流程的流程实例
        executionEntityManager.deleteChildExecutions(parentExecutionEntity, ""true);
        //移动节点
        FlowElement targetFlowElement = process.getFlowElement(targetNodeId);
        parentExecutionEntity.setCurrentFlowElement(targetFlowElement);
        ActivitiEngineAgenda agenda = commandContext.getAgenda();
        agenda.planContinueProcessInCompensation(parentExecutionEntity);

        return null;
    }
}

请求一下地址,触发此命令:

http://localhost:8080/activiti/flow/moveMutiOut/160021/UserTask1

查询一下数据库,可以确认节点已经完成跳转:


act_ru_task

act_ru_execution

至此,关于Activiti6.0节点跳转的试验已经全部完成,如果有遗漏的,以后用到或者想到的时候再补充。

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

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

  1. 睡你的椒

    赞一个,加油

  2. 为中华之崛起而敲代码

    要是流转到另外一个多实例节点呢?我试的跳转到了,但是没有自动创建当前的任务。

    • 哼哼的泰迪熊

      应该也可以吧,本质是一样的。不过我已经不用Activiti了,所以没有那么多的测试,如果不行的话,只能自己尝试修改一下了。

      • 为中华之崛起而敲代码

        虽然没解决,还是很感谢

给我留言

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

用户登录

分享到: