我正在使用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
答案 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(或不等于)的序列流 有一个条件集,从概念上讲, 选择序列流)以继续该过程。
以及相应的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);