如何在活动中修改多实例上的集合

时间:2019-02-11 10:45:32

标签: collections activiti

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

  1. 会计

  2. 经理

  3. 所有者

  4. 送货头

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

My Process 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希望在循环中添加另一位会计师。

是否有一种方法可以在当前的运行循环集合(即Accountant集合)中添加新用户?如果是,请提出一种方法,最好使用Java。

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

2 个答案:

答案 0 :(得分:0)

您需要为我们详细说明您的问题,以便他能够为您提供帮助。您能否提供流程图或图像来阐明流程的外观? 如果要添加更多用户,则可以为那里的每个人使用组。.而不是将Accountant作为用户,您可以使用一个组并向该组动态添加更多人。

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

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

希望这会有所帮助。

答案 1 :(得分:0)

您可以在多实例使用任务/子流程上使用边界信号事件,这将取消所有当前正在运行的任务并为更新的集合创建新任务。

下面的图表可能有帮助

enter image description here

注意:使用runtimeService.signalEventReceived("yourSignalId", "yourProcessInstanceID");

更新了收藏集后,您将不得不从信号中调用信号。