Activiti:从特定步骤重新启动流程

时间:2018-12-21 11:20:05

标签: java activiti

我正在使用activiti 6为我们的一个项目设计业务流程。这个过程非常简单,它由多个“用户任务”或“服务任务”以及基于角色的分配组成。但是,我们的客户希望管理员用户应该能够在任何时间重新运行以前的“用户任务”或“服务任务”中的任何一个。

例如,以下是我的过程:

开始–>服务任务1 –>用户任务2 –>服务任务3 –>用户任务4 –>服务任务5->用户任务6->服务任务7->用户任务8->结束

客户端希望在流程执行过程中的任何时间点,管理员用户都应该能够将工作流执行方式从:例如,状态“ User-Task8”更改为Service-Task1或User-Task2或Service-Task3中的任何一个或User-Task4或Service-Task5或User-Task6或Service-Task7。

根据Alfresco社区线程:用户任务回滚

我创建了一个自定义命令

public class RestartInstanceActivitiCommand implements Command<Void> { 
   private final String executionId;
   private final FlowElement flowElement;

   public RestartInstanceActivitiCommand(String executionId, FlowElement flowElement) {
      this.executionId = executionId;
      this.flowElement = flowElement;
   }

   public Void execute(CommandContext commandContext) {
      ExecutionEntity execution = commandContext.getExecutionEntityManager().findById(this.executionId); 
      execution.setCurrentFlowElement(flowElement); 
      return null;
   }
}

并使用:

执行它
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
FlowElement flowElement = bpmnModel.getFlowElement("Service-Task1");
commandExecutor.execute(new RestartInstanceActivitiCommand(processInstanceId, flowElement));
runtimeService.trigger(processInstanceId);

通过此操作,当前任务被设置为Service-Task1,但是它不会像通常的流程那样自动执行。另外,我可以看到User-Task8也处于活动状态并分配给了我不希望的用户,因为我想取消当前任务并从所需步骤中重新运行它。

通过代码示例感谢您的帮助。

关于, Sandip

2 个答案:

答案 0 :(得分:2)

我写了一个简单的命令方法,应该可以实现您想要的操作。 您可以在Alfresco论坛上找到以下主题的答案:

https://community.alfresco.com/thread/224300-user-task-rollback

答案 1 :(得分:1)

如果Return to Step A是工作流程过程的一部分,最好将其包含在工作流程树中。

因此Review Filter是您的验证步骤,之后您将实现Exclusive Gateway

专有网关将允许您在工作流程中构造if-else类似条件。

  

专用网关(也称为XOR网关或更高级的网关   专用的基于数据的网关),用于在   处理。当执行到达此网关时,所有传出   顺序流按定义顺序进行评估。   条件条件评估为true(或不等于)的序列流   有一个条件集,从概念上讲,   选择序列流)以继续该过程。

enter image description here

以及相应的XML表示形式:

<exclusiveGateway id="exclusiveGw" name="Exclusive Gateway" />

<sequenceFlow id="flow2" sourceRef="exclusiveGw" targetRef="theTask1">
  <conditionExpression xsi:type="tFormalExpression">${input == 1}</conditionExpression>
</sequenceFlow>

<sequenceFlow id="flow3" sourceRef="exclusiveGw" targetRef="theTask2">
  <conditionExpression xsi:type="tFormalExpression">${input == 2}</conditionExpression>
</sequenceFlow>

<sequenceFlow id="flow4" sourceRef="exclusiveGw" targetRef="theTask3">
  <conditionExpression xsi:type="tFormalExpression">${input == 3}</conditionExpression>
</sequenceFlow>

在您的情况下:

Start-> Service Task (Calls some python script for filtering)-> Review Filter-> Exclusive Gateway

if approved-> Review Categories-> end

else GOTO:-> Service Task (Calls some python script for filtering)

完成任务时,可以将条件变量作为键值对(Activiti)传递给Map进程:

boolean approved = true;
variableMap.put("input", approved);
taskService.complete(task.getId(), variableMap);

Question about exclusive gateway that may be useful