Alfresco Activiti - 创建同一子流程的多个实例

Mas*_*oda 7 groovy alfresco bpmn activiti alfresco-enterprise

对于一个我开始质疑甚至可能的过程来说,这似乎是一个相当简单的要求.

下图显示了我当前的流程.我想要实现两件事:

  1. 用户创建用于添加注释的初始用户任务,他们应该能够根据需要添加任意数量的注释,每个注释一个用户任务

  2. 为用户创建的每个新笔记(用户任务)生成一个新的子流程.

示例过程

上述过程存在以下问题:

  • 应该为每个任务生成一个子流程,但它们似乎互相覆盖

  • 我不确定子流程是否需要为每个生成的新子流程提供唯一的ID

Mas*_*oda 1

所以事实证明,这个问题的解决方案需要使用一些脚本groovy

下面是更新的流程模型图,在其中我使用Complete Task脚本任务启动流程的新实例,然后如果用户希望添加更多任务,独占网关可以将用户返回到创建任务(用户任务)完成流程。

在将范围传回用户任务之前,我会清除脚本任务中用户任务中保存的字段中的所有值。

更新流程

下图显示了我的完整任务流程,该流程由主流程使用脚本调用

完成任务

在这里,我避免parallel gateways优先使用通过脚本创建“创建任务”(用户任务)的新实例和“完成任务流程”(不是子流程)的新实例。

要启动完整任务流程的新实例,我们必须使用流程实例startProcessInstanceByKeyAndTenantId()下的函数来启动流程runtimeService,尽管我也可以使用startProcessInstanceByIdAndTenantId()

//Import required libraries
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;

//instantiate RunTimeService instance
RuntimeService runtimeService = execution.getEngineServices().getRuntimeService();

//get tenant id
String tenantId = execution.getTenantId(); 

//variables Map
Map<String, Object> variables = runtimeService.getVariablesLocal(execution.getProcessInstanceId());

//start process (processId, variables, tenantId)
ProcessInstance completeTask = runtimeService.startProcessInstanceByKeyAndTenantId("CompleteTask", variables, tenantId);

//Clear variables to create a fresh task
execution.setVariable("title", "");
execution.setVariable("details", "");
Run Code Online (Sandbox Code Playgroud)

使用这种方法,我避免从父进程创建多个子进程,而是创建与父进程分开运行的多个进程。这对我有利,就好像父进程完成了其他进程继续运行一样。