我正在使用activiti 6为我们的一个项目设计业务流程。这个过程非常简单,它由许多“用户标签”或“服务任务”和基于角色的分配组成。然而,我们的客户希望管理员用户应该能够在任何时间点重新运行之前的任何“用户任务”或“服务任务”。
例如,以下是我的流程:
启动->服务-任务1 ->用户-任务2 ->服务-任务3->用户-任务4->服务-任务5->用户-任务6->服务-任务7->用户-任务8 ->End
客户端希望在流程执行期间的任何时间点,管理员用户应该能够将工作流执行从状态" 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也是活动的,并且分配给了我不想要的用户,因为我想取消当前任务并从所需的步骤重新运行它。
感谢您在代码示例方面的帮助。
你好,桑迪普
发布于 2018-12-22 01:03:57
我写了一个简单的命令方法,应该可以实现你想要做的事情。你可以在下面的帖子中找到答案:
https://community.alfresco.com/thread/224300-user-task-rollback
发布于 2018-12-21 19:47:18
如果Return to Step A是工作流过程的一部分,那么最好将其包含在工作流树中。
因此,Review Filter是您的验证步骤,之后您将实现Exclusive Gateway。
Exclusive gateway将允许您在工作流程中构建类似if-else的条件。
是一种专用网关(也称为异或网关或更专业的基于数据的专用网关),用于对过程中的决策进行建模。当执行到达此网关时,将按照定义的顺序对所有传出序列流进行评估。选择条件评估为真(或者没有设置条件,概念上在序列流上定义了' true‘)的序列流来继续该过程。

和相应的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)
在完成任务时,您可以将条件变量作为键值对(Map)传递给Activiti进程:
boolean approved = true;
variableMap.put("input", approved);
taskService.complete(task.getId(), variableMap);https://stackoverflow.com/questions/53883917
复制相似问题