activiti 5.22 自由流转核心代码(多实例可以用)

package com.act.service.cmd;

import java.util.List;
import java.util.Map;

import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.ExecutionListener;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.interceptor.Command;
import org.activiti.engine.impl.interceptor.CommandContext;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.ExecutionEntityManager;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.pvm.PvmException;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.pvm.process.ScopeImpl;
import org.activiti.engine.impl.pvm.runtime.InterpretableExecution;
import org.apache.commons.lang3.StringUtils;

/**
 * @description: 自由跳转命令
 * @create: 2020年04月20日18:38:23
 * @author wanyy
 **/
public class FreeJumpTaskCmd implements Command<Void> {

    private TaskService taskService;

    /**
     * 任务id
     */
    protected String taskId;
    /**
     * 执行实例id
     */
    protected String executionId;
    /**
     * 流程实例id
     */
    protected String procInsId;
    /**
     * 目标节点
     */
    protected ActivityImpl desActivity;
    /**
     * 变量
     */
    protected Map<String, Object> paramVar;
    /**
     * 当前的节点
     */
    protected ActivityImpl currentActivity;

    @Override
    public Void execute(CommandContext commandContext) {
        ExecutionEntityManager executionEntityManager = Context.getCommandContext().getExecutionEntityManager();
        ExecutionEntity executionEntity = executionEntityManager.findExecutionById(executionId);
        //设置相关变量
        executionEntity.setVariables(paramVar);
        executionEntity.setEventSource(this.currentActivity);
        executionEntity.setActivity(this.currentActivity);
        // 根据executionId 获取Task,
        //删除无用的工作项
        for (TaskEntity taskEntity : Context.getCommandContext().getTaskEntityManager().findTasksByProcessInstanceId(procInsId)) {
            //如果是当前实例,那么完成。
            if (taskId.equals(taskEntity.getId())) {
                // 触发任务监听
                taskEntity.fireEvent("complete");
                //对转向的动作进行设定 仅设定退的动作 其余为提交
                if (paramVar.containsKey("processDiversion") && StringUtils.startsWith(paramVar.get("processDiversion") + "", "退")) {
                    taskService.setVariableLocal(taskId, "processDiversion", paramVar.get("processDiversion"));
                    paramVar.remove("processDiversion");
                }
                taskService.addComment(taskEntity.getId(), taskEntity.getProcessInstanceId(), (String) paramVar.get("currComment"));
                // 删除任务的原因
                Context.getCommandContext().getTaskEntityManager().deleteTask(taskEntity, "completed", false);
                //如果不是当前实例,那么直接删除掉。
            } else {
                // 删除任务的原因
                taskEntity.fireEvent("complete");
                Context.getCommandContext().getTaskEntityManager().deleteTask(taskEntity, "deleted", false);
            }
        }
        //删除相关执行子路径,只保留根执行路径
        List<ExecutionEntity> list = executionEntityManager.findChildExecutionsByParentExecutionId(executionId);
        for (ExecutionEntity executionEntity2 : list) {
            List<ExecutionEntity> parent = executionEntityManager.findChildExecutionsByParentExecutionId(executionEntity2.getId());
            for (ExecutionEntity executionEntity3 : parent) {
                executionEntity3.remove();
                executionEntity3.signal(null, null);
                Context.getCommandContext().getHistoryManager().recordActivityEnd(executionEntity3);
            }
            executionEntity2.remove();
            executionEntity2.signal(null, null);
            Context.getCommandContext().getHistoryManager().recordActivityEnd(executionEntity2);
        }
        commandContext.getIdentityLinkEntityManager().deleteIdentityLinksByProcInstance(procInsId);
        //设置相关变量,
        //要激活交路径
        executionEntity.setActive(true);
        //去掉无用的变量,不去掉,会导致很多莫名奇妙的问题
//        executionEntity.removeVariable("loopCounter");
        //去掉多实例的变量,如果变量不知道是啥,自己从节点定义里查
//        executionEntity.removeVariable("cdp_atuser");
        //触发事件监听器
        this.execute(executionEntity);
        InterpretableExecution propagatingExecution = null;
        if (this.desActivity.isScope()) {
            propagatingExecution = executionEntity.createExecution();
            executionEntity.setTransition(null);
            executionEntity.setActivity(null);
            executionEntity.setActive(false);
            propagatingExecution.initialize();
        } else {
            propagatingExecution = executionEntity;
        }
        propagatingExecution.executeActivity(this.desActivity);
        return null;
    }

    protected ScopeImpl getScope(InterpretableExecution execution) {
        return (ScopeImpl) execution.getActivity();
    }

    /**
      触发事件监听器
     */
    public void execute(InterpretableExecution execution) {
        ScopeImpl scope = getScope(execution);
        List<ExecutionListener> exectionListeners = scope.getExecutionListeners(getEventName());
        for (ExecutionListener listener : exectionListeners) {
            execution.setEventName(getEventName());
            execution.setEventSource(scope);
            try {
                listener.notify(execution);
            } catch (RuntimeException e) {
                throw e;
            } catch (Exception e) {
                throw new PvmException("couldn't execute event listener : " + e.getMessage(), e);
            }

        }
    }

    protected String getEventName() {
        return org.activiti.engine.impl.pvm.PvmEvent.EVENTNAME_END;
    }


    /**
     * 构造参数 可以根据自己的业务需要添加更多的字段
     *
     * @param taskId
     * @param executionId
     * @param desActivity
     * @param paramVar
     * @param currentActivity
     */
    public FreeJumpTaskCmd(String taskId, String executionId, TaskService taskService,String procInsId, ActivityImpl desActivity, Map<String, Object> paramVar,  ActivityImpl currentActivity) {
        this.taskId = taskId;
        this.executionId = executionId;
        this.taskService = taskService;
        this.procInsId = procInsId;
        this.desActivity = desActivity;
        this.paramVar = paramVar;
        this.currentActivity = currentActivity;

    }
}

直接上代码,不说废话

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值