首页 > 解决方案 > 如何在activiti中修改多实例上的集合

问题描述

我们正在为一个项目创建 POC,我们将有 4 个审批阶段。假设这四个阶段是

  1. 会计

  2. 经理

  3. 所有者

  4. 送货头

一个流程已经开始,现在用户任务(即批准)处于会计级别。多实例将在从 Java Service 类返回的集合中循环。当循环针对该特定用户集运行时,我想在其中推送一个新用户。我可以在经理、所有者和交付主管的集合中添加更多用户,因为审批阶段处于会计级别,并且尚未执行对这些审批者的催收电话。

我的流程 XML:

<startEvent id="startEvent1"></startEvent>
    <userTask id="accountantApproval" name="Accountant Approval" activiti:assignee="${accountant}">
      <extensionElements>
        <activiti:formProperty id="accountantApprovalValue" name="Accountant Approval Value" type="enum" required="true"></activiti:formProperty>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
      <multiInstanceLoopCharacteristics isSequential="true" activiti:collection="${myService.fetchEmployeesByRole('Accountant')}" activiti:elementVariable="accountant">
        <completionCondition>${status != 'Submit'}</completionCondition>
      </multiInstanceLoopCharacteristics>
    </userTask>
    <userTask id="managerApproval" name="Manager Approval" activiti:assignee="${manager}">
      <extensionElements>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
      <multiInstanceLoopCharacteristics isSequential="true" activiti:collection="${myService.fetchEmployeesByRole('Manager')}" activiti:elementVariable="manager">
        <completionCondition>${status != 'Submit'}</completionCondition>
      </multiInstanceLoopCharacteristics>
    </userTask>
    <exclusiveGateway id="accountantEXOR" name="Accountant EXOR"></exclusiveGateway>
    <serviceTask id="accountantRejectService" name="Accountant Reject Service" activiti:class="com.example.demo.RejectService"></serviceTask>
    <exclusiveGateway id="managerEXOR" name="Manager EXOR"></exclusiveGateway>
    <serviceTask id="managerRejectService" name="Manager Reject Service" activiti:class="com.example.demo.RejectService"></serviceTask>
    <endEvent id="endProcess" name="End Process">
      <terminateEventDefinition></terminateEventDefinition>
    </endEvent>
    <userTask id="OwnerApproval" name="Owner Approval" activiti:assignee="${accountant}">
      <extensionElements>
        <activiti:formProperty id="sid-52D1F400-4813-4B2F-856D-61FE4C41C6FEValue" name="Accountant Approval Value" type="enum" required="true"></activiti:formProperty>
        <modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
      </extensionElements>
      <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${myService.fetchEmployeesByRole('Owner')}" activiti:elementVariable="owner">
        <completionCondition>${status == 'Submit'}</completionCondition>
      </multiInstanceLoopCharacteristics>
    </userTask>

现在,假设一个流程已经启动并且它处于会计级别。多实例将从服务类中获取员工并将其推送到集合中,它将开始循环遍历它。假设它获取了 2 名员工 David 和 Sam。David 批准了该任务,然后它继续进行下一个批准,即 Sam。Sam 想在循环中添加另一位会计师。

有没有办法在当前运行循环集合中添加新用户,即会计集合?如果是,请提出一种方法,最好使用Java。

如果我们无法在集合中添加用户,有没有办法可以创建一个新的用户任务并将其分配给正在进行的流程?因此,一旦会计循环完成,在进入下一个审批阶段之前,它应该完成新创建的用户任务。

标签: collectionsactiviti

解决方案


您需要详细说明您的问题,以便我们为您提供帮助。您能否提供流程图图像或其他内容来阐明您的流程是什么样的?如果您想添加更多用户,您可以为您在那里拥有的每一组人使用组。因此,您可以使用组并动态地将更多人添加到该组,而不是让会计作为用户。

当您使用多实例节点时,所有实例都会在执行到达 BPMN 元素时创建,并且此时使用集合的内容,一旦创建它们就无法更改。您可以做的是循环回 BPMN 元素并再次创建实例,但这会促使您确保清理之前的任务。

如果您提供更多详细信息,我们可能会为您提供更详细的答案。

希望这可以帮助 。


推荐阅读