activiti工作流程子流程设计

现在有一个这样的工作流程业务,公司管理员提交设备申请单,审核通过后,进入任务分配,任务分配成功后,员工领用设备申请单里面的任务进行任务的领用。任务领用后进入检测流程。
我的认识是,设备任务领用后进入检测流程,这个检测流程是一个多实例子流程,是根据设备的个数生成多少个流程实例。这些子流程完成后汇入主流程,最后完成主流程。
我的流程设计如图:

img

参数设置有没有问题?
这个检测流程是一个根据设备个数的多实例子流程,怎么根据equipmentList的个数生成多个子流程?是不是流程启动的时候把equipmentList设置在流程变量里面,然后流程会不会根据这个equipmentList的个数生成多个子流程实例?
我的代码如下,这样写对不对?

List<String> equipmentList = new ArrayList<>();
equipmentList.add("1122697329074466816");
equipmentList.add("1122697142327275520");
businessKey="1122697328990580736";

Map<String, Object> vars = new HashMap<>();
vars.put("equipmentList", equipmentList);
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, businessKey,vars);

能否通过ProcessService ,taskService,runtimeService等API简述一下整个流程过程?

参考 https://blog.csdn.net/qq_39517116/article/details/121790510

您好!感谢您的解答!
您理解的流程设计没错!和我们现在的业务工作流程一致!
我要搞明白的是:1,我设计的并行多实例参数是不是设置的正确,不正确应该怎么设置。

 Map<String, Object> vars = new HashMap<>();
        vars.put("equipmentList", equipmentList);
        vars.put("nrOfInstances",equipmentList.size());
        vars.put("nrOfCompletedInstances",0);
        ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId,businessKey,vars);
       2,上面代码会不会根据"equipmentList"的大小生成对应数量的多实例子流程实例

根据我的测试,这种设置和代码并不能生成多实例。如图所示并没生成子流程记录

img

【工作流Activiti7】5、Activiti7 多实例子流程
可以借鉴下
https://blog.csdn.net/wufaqidong1/article/details/128427291

activiti学习之子流程_activiti 子流程_wang0907的博客-CSDN博客 写在前面子流程作为主流程的一部分存在,拥有独立的开始节点和结束节点,即可以单独作为一个完整的流程来使用,当一个流程比较复杂时,可以考虑使用子流程来进行包裹,下面来一起看下。1:测试1.1:流程设计效果图说明子流程使用了错误结束节点,错误结束节点也是一种结束节点,只不过我们使用最多的是普通的结束节点,结束时静默结束,而错误结束节点是在结束时会抛出一个错误编码,如下时我们设置的要抛出的错误编码:然后在子流程边界定义了一个 错误边界事件 ,来捕获错误编码,让流程流转到主流程继续处理,如下_activiti 子流程 https://blog.csdn.net/wang0907/article/details/120891306

这问题不难,需要清晰的思路来写代码,主要原理就是根据equipmentList的个数生成多个子流程实例,将equipmentList作为流程变量,在主流程中使用循环结构迭代equipmentList,并启动子流程实例来处理每个设备的操作。

你的流程设计和代码基本上是正确的。
关于第二个问题:
ProcessService用于启动和查询流程实例。
taskService用于管理和操作流程任务。
runtimeService用于查询和操作运行时的流程实例和任务。通过runtimeService,可以获取正在运行的流程实例的详细信息,如流程实例ID、流程定义名称、执行状态等。

基于new bing部分指引作答:
根据你的描述和代码,你的理解和实现是基本正确的。以下是对你提出的问题的解答和建议:

参数设置是否正确?
从你的代码中可以看出,你将设备列表(equipmentList)作为流程变量传递给流程实例。这是一个合理的做法,因为流程变量可以在整个工作流程中传递和使用。因此,参数设置的部分是正确的。

多实例子流程如何根据设备个数生成多个子流程实例?
你的理解是正确的。在Activiti中,你可以使用多实例任务来实现一个流程的多个实例。在你的情况下,设备检测流程可以作为一个多实例子流程,根据设备个数生成多个子流程实例。

为了实现这一点,你需要在流程定义中使用多实例任务。你可以在BPMN图中创建一个包含多实例任务的子流程,并将其设置为基于流程变量的循环。在你的情况下,设备列表(equipmentList)将被用作循环的集合。

你可以在BPMN图中的子流程中设置循环属性,例如:

<subProcess id="deviceDetection" name="Device Detection">
  <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${equipmentList}" activiti:elementVariable="equipment">
    <!-- 子流程的内容 -->
  </multiInstanceLoopCharacteristics>
</subProcess>

在这个例子中,equipmentList 是设备列表的流程变量,equipment 是循环的当前元素。

通过这样的设置,流程引擎将根据设备列表中的元素数,生成对应数量的子流程实例。每个子流程实例都会独立执行,并在完成后汇入主流程。

请注意,上述示例是基于BPMN的XML表示形式,你需要相应地修改你的流程定义文件以包含多实例子流程。

你的代码是否正确?
根据你的描述和代码片段,你似乎正确地设置了设备列表作为流程变量并将其传递给流程实例。代码中的 runtimeService.startProcessInstanceById() 方法是用来启动流程实例的,假设你已经获取了正确的 processDefinitionId。
因此,从你提供的代码来看,它是正确的,可以生成根据设备个数生成的多个子流程实例。

希望以上解答对你有帮助!

根据你提供的描述和代码,你的流程设计如下:

  1. 公司管理员提交设备申请单。
  2. 设备申请单被审核通过后,进入任务分配阶段。
  3. 成功分配任务后,员工领用设备申请单中的任务。
  4. 领用后,任务进入检测流程。

根据你的理解,检测流程是一个多实例子流程,其实例数量与设备数量相关。你的设想是,根据"equipmentList"中的设备数量生成相应数量的子流程实例,并在每个实例中完成对应的设备检测任务,并最终将结果合并到主流程中。

从你提供的代码来看,你将设备列表存储在名为"equipmentList"的流程变量中。然后,你使用流程定义ID、业务键和流程变量启动了一个流程实例。根据你的代码,流程实例启动时会自动根据"equipmentList"的大小生成对应数量的多实例子流程实例。这意味着,对于每个设备,会生成一个子流程实例并进行相应的检测任务。

至于你的参数设置是否正确,需要根据你的具体业务需求和流程定义来确定。请确保"equipmentList"中的设备ID或标识与你的流程定义和任务分配等环节相匹配。

总的来说,根据你提供的代码,流程设计方面没有明显的问题。但是,仅凭代码无法确定整个流程的正确性,还需要进一步了解你的业务需求和流程定义。建议你进行代码测试,并根据实际情况进行调整和优化。

以下答案参考newbing,回答由博主波罗歌编写:
根据你提供的流程设计图,我可以看出你的理解是正确的。检测流程是一个根据设备个数的多实例子流程,根据你提供的代码,将设备列表equipmentList存储在流程变量vars中,可以确保在流程启动时,子流程的数量与设备个数一致。

整个流程的步骤如下:

  1. 提交设备申请单:公司管理员提交设备申请单,此时设备会经过审核。
  2. 任务分配:审核通过后,任务进行分配,员工领用设备申请单里的任务。
  3. 领用设备任务:员工领用设备申请单里的任务后,进入检测流程。
  4. 检测流程:检测流程是一个多实例子流程,针对每个设备分别进行检测。
  5. 汇入主流程:当所有子流程(每个设备的检测流程)完成后,汇入主流程。
  6. 完成主流程:主流程执行完成。

关于API的使用,下面是一些基本的示例代码:

使用ProcessService启动流程实例:

ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, businessKey, vars);

使用TaskService查询任务:

List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();

使用TaskService完成任务:

for (Task task : tasks) {
    taskService.complete(task.getId());
}

以上是一些基本的代码示例,实际使用时需要根据具体的业务进行适当调整。

需要注意的是,你的代码中使用了ProcessService的startProcessInstanceById方法来启动流程实例,确保ProcessDefinitionId参数正确,并且检查相关的流程定义是否已部署。另外,根据业务需求,你可能需要在设置流程变量时添加其他相关信息。

希望这些信息能帮助到你,如果还有其他问题,请随时提问。
如果我的回答解决了您的问题,请采纳!