返回流程实例的自定义命令(执行)

时间:2018-02-21 14:58:09

标签: back activiti

我有一个流程,我有3个连续的用户任务(类似于任务1 - >任务2 - >任务3)。因此,为了验证任务3,我必须验证任务1,然后验证任务2。

我的目标是通过此link中建议的命令,实施一种解决方法,以返回执行流程实例。问题是我开始实现命令它不能按我的意愿工作。算法应该是这样的:

  • 使用传递的ID
  • 检索任务
  • 获取此任务的流程实例
  • 获取流程实例的历史任务
  • 从历史任务列表中推断出前一个
  • 从上一个历史任务创建新任务
  • 使执行指向此新任务
  • 也许清理更新前指出的任务

所以,我的命令代码是这样的:

public class MoveTokenCmd implements Command<Void> {

    protected String fromTaskId = "20918";

    public MoveTokenCmd() {
    }

    public Void execute(CommandContext commandContext) {
        HistoricTaskInstanceEntity currentUserTaskEntity = commandContext.getHistoricTaskInstanceEntityManager()
                .findHistoricTaskInstanceById(fromTaskId);
        ExecutionEntity currentExecution = commandContext.getExecutionEntityManager()
                .findExecutionById(currentUserTaskEntity.getExecutionId());

        // Get process Instance
        HistoricProcessInstanceEntity historicProcessInstanceEntity = commandContext
                .getHistoricProcessInstanceEntityManager()
                .findHistoricProcessInstance(currentUserTaskEntity.getProcessInstanceId());

        HistoricTaskInstanceQueryImpl historicTaskInstanceQuery = new HistoricTaskInstanceQueryImpl();
        historicTaskInstanceQuery.processInstanceId(historicProcessInstanceEntity.getId()).orderByExecutionId().desc();
        List<HistoricTaskInstance> historicTaskInstances = commandContext.getHistoricTaskInstanceEntityManager()
                .findHistoricTaskInstancesByQueryCriteria(historicTaskInstanceQuery);

        int index = 0;
        for (HistoricTaskInstance historicTaskInstance : historicTaskInstances) {
            if (historicTaskInstance.getId().equals(currentUserTaskEntity.getId())) {
                break;
            }
            index++;
        }

        if (index > 0) {
            HistoricTaskInstance previousTask = historicTaskInstances.get(index - 1);

            TaskEntity newTaskEntity = createTaskFromHistoricTask(previousTask, commandContext);
            currentExecution.addTask(newTaskEntity);

            commandContext.getTaskEntityManager().insert(newTaskEntity);

           AtomicOperation.TRANSITION_CREATE_SCOPE.execute(currentExecution);
        } else {
            // TODO: find the last task of the previous process instance
        }

        // To overcome the "Task cannot be deleted because is part of a running
        // process"
        TaskEntity currentUserTask = commandContext.getTaskEntityManager().findTaskById(fromTaskId);
         if (currentUserTask != null) {
         currentUserTask.setExecutionId(null);
         commandContext.getTaskEntityManager().deleteTask(currentUserTask, "jumped to another task", true);
         }

        return null;
    }

    private TaskEntity createTaskFromHistoricTask(HistoricTaskInstance historicTaskInstance,
            CommandContext commandContext) {

        TaskEntity newTaskEntity = new TaskEntity();

        newTaskEntity.setProcessDefinitionId(historicTaskInstance.getProcessDefinitionId());
        newTaskEntity.setName(historicTaskInstance.getName());
        newTaskEntity.setTaskDefinitionKey(historicTaskInstance.getTaskDefinitionKey());
        newTaskEntity.setProcessInstanceId(historicTaskInstance.getExecutionId());
        newTaskEntity.setExecutionId(historicTaskInstance.getExecutionId());

        return newTaskEntity;
    }

}

但问题是我可以看到我的任务已创建,但执行并未指向它,而是指向当前的任务。

我有想法使用活动(通过对象ActivityImpl)将其设置为执行但我不知道如何检索新任务的活动。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

除非引擎中的某些东西发生了显着变化,否则您引用的链接中的代码仍然可以工作(我在许多项目中使用过它)。 也就是说,在扫描代码时,我看不到最重要的命令。

执行当前执行后,您可以通过设置当前活动来移动令牌。

就像我说的那样,引用文章中的代码曾经工作过但仍然应该。 格雷格

答案 1 :(得分:0)

在您的问题中引用相同的链接,我个人建议您使用您的流程设计。使用专用网关来决定进程是应该结束还是应该返回到上一个任务。如果任务的生成是动态的,则可以指向同一任务并删除局部变量。 Activiti有一些结构可以节省您实施相同的时间:)。