Activiti: перезапустить процесс с определенного шага - PullRequest
0 голосов
/ 21 декабря 2018

Я использую activiti 6 для разработки бизнес-процесса для одного из наших проектов.Процесс довольно прост, он состоит из нескольких «пользовательских задач» или «служебных задач» с назначениями на основе ролей.Однако наш Клиент хочет, чтобы пользователь-администратор мог в любой момент повторно выполнить любую из предыдущих «Задач пользователя» или «Задачи обслуживания».

Например, мой процесс следующий:

Пуск -> Сервис-задача1 -> Пользователь-задача2 -> Сервис-задача3 -> Пользователь-задача4 -> Сервис-задача5 -> Пользователь-задача6 -> Сервис-задача7 -> Пользователь-задача8 -> Конец

Клиент хочет, чтобы в любой момент времени во время выполнения процесса пользователь с правами администратора мог изменять выполнение рабочего процесса с: например, состояния «Пользователь-Задача8» на любое из Service-Task1 или User-Task2 или Service-Task3 илиUser-Task4 или Service-Task5 или User-Task6 или Service-Task7.

Согласно потоку сообщества Alfresco: откат пользовательской задачи

Я создал пользовательскую команду как

public class RestartInstanceActivitiCommand implements Command<Void> { 
   private final String executionId;
   private final FlowElement flowElement;

   public RestartInstanceActivitiCommand(String executionId, FlowElement flowElement) {
      this.executionId = executionId;
      this.flowElement = flowElement;
   }

   public Void execute(CommandContext commandContext) {
      ExecutionEntity execution = commandContext.getExecutionEntityManager().findById(this.executionId); 
      execution.setCurrentFlowElement(flowElement); 
      return null;
   }
}

И выполнил это с помощью:

BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
FlowElement flowElement = bpmnModel.getFlowElement("Service-Task1");
commandExecutor.execute(new RestartInstanceActivitiCommand(processInstanceId, flowElement));
runtimeService.trigger(processInstanceId);

При этом текущая задача устанавливается Service-Task1, но она не выполняется автоматически, как обычно делает обычный поток.Также я вижу, что User-Task8 также активен и назначен пользователю, которого я не хочу, потому что я хочу отменить текущее задание и повторно запустить его с нужного шага.

Оцените вашу помощь с примером кода.

С уважением, Сандип

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Я написал простой командный метод, который должен достичь того, что вы хотите сделать.Вы можете найти ответ в следующей теме на форуме Alfresco:

https://community.alfresco.com/thread/224300-user-task-rollback

0 голосов
/ 21 декабря 2018

Если Return to Step A является частью процесса рабочего процесса, возможно, лучше включить его в дерево рабочего процесса.

Таким образом, Review Filter - это ваш шаг проверки, после которого вы будете внедрять Эксклюзивный шлюз .

Эксклюзивный шлюз позволит вам создать if-else условия вваш рабочий процесс.

Эксклюзивный шлюз (также называемый шлюзом XOR или, если быть более техническим, эксклюзивным шлюзом на основе данных), используется для моделирования решения в процессе.Когда выполнение прибывает в этот шлюз, весь поток исходящей последовательности оценивается в порядке, в котором они определены.Поток последовательности, условие которого оценивается как истинное (или у которого нет установленного условия, концептуально имеющего «истину», определенную в потоке последовательности), выбирается для продолжения процесса.

enter image description here

и соответствующее представление XML:

<exclusiveGateway id="exclusiveGw" name="Exclusive Gateway" />

<sequenceFlow id="flow2" sourceRef="exclusiveGw" targetRef="theTask1">
  <conditionExpression xsi:type="tFormalExpression">${input == 1}</conditionExpression>
</sequenceFlow>

<sequenceFlow id="flow3" sourceRef="exclusiveGw" targetRef="theTask2">
  <conditionExpression xsi:type="tFormalExpression">${input == 2}</conditionExpression>
</sequenceFlow>

<sequenceFlow id="flow4" sourceRef="exclusiveGw" targetRef="theTask3">
  <conditionExpression xsi:type="tFormalExpression">${input == 3}</conditionExpression>
</sequenceFlow>

В вашем случае:

Start -> Service Task (Calls some python script for filtering) -> Review Filter -> Exclusive Gateway:

if approved -> Review Categories -> end

else GOTO: -> Service Task (Calls some python script for filtering)

Вы можете передать условную переменную вActiviti процесс при выполнении задачи в виде пары ключ-значение (Map):

boolean approved = true;
variableMap.put("input", approved);
taskService.complete(task.getId(), variableMap);

Вопрос об эксклюзивном шлюзе, который может быть полезен .

...