Как изменить коллекцию на нескольких экземплярах в activiti - PullRequest
0 голосов
/ 11 февраля 2019

Мы создаем POC для проекта, где у нас будет 4 этапа утверждения.Допустим, 4 этапа:

  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.Дэвид утверждает задачу, и она переходит к следующему утверждению, то есть Сэму.Сэм хочет добавить еще одного бухгалтера в цикл.

Есть ли способ добавить новых пользователей в текущую коллекцию циклов выполнения, т. Е. В коллекцию бухгалтеров?Если да, пожалуйста, предложите способ, желательно с использованием Java.

Если мы не можем добавить пользователя в коллекцию, есть ли способ, которым мы можем создать новое пользовательское задание и назначить его текущему процессу?Поэтому, как только цикл бухгалтера завершен, прежде чем он перейдет к следующему этапу утверждения, он должен завершить вновь созданную пользовательскую задачу.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вы можете использовать событие пограничного сигнала в задании / подпроцессе использования нескольких экземпляров, что отменит все запущенные в данный момент задачи и создаст новые задачи для обновленной коллекции.

Диаграмма ниже может помочь

enter image description here

Примечание : вам нужно будет вызвать сигнал (из вашего кода) после того, как вы обновите свою коллекцию с помощью runtimeService.signalEventReceived("yourSignalId", "yourProcessInstanceID");

0 голосов
/ 12 февраля 2019

вам нужно будет более подробно проработать ваш вопрос, чтобы он смог вам помочь.Можете ли вы предоставить изображение диаграммы процесса или что-то, чтобы уточнить, как выглядит ваш процесс?Если вы хотите добавить больше пользователей, вы можете использовать группы для каждой группы людей, которая у вас там есть ... поэтому вместо того, чтобы иметь бухгалтера в качестве пользователя, вы можете использовать группу и динамически добавлять больше людей в эту группу.

Когда вы используете узлы с несколькими экземплярами, все экземпляры создаются, когда выполнение поступает в элемент BPMN, и в этот момент используется содержимое коллекции, после того как они созданы, вы не можете это изменить.Что вы можете сделать, это вернуться к элементу BPMN и снова создать экземпляры, но это подтолкнет вас к тому, чтобы вы очистили предыдущие задачи.

Если вы предоставите более подробную информацию, мы, возможно, поможем вам с более подробным ответом.

Надеюсь, это поможет.

...