Как назначить строковые идентификаторы, выбранные в форме, подпроцессам в Flowable 3.6.1? - PullRequest
0 голосов
/ 25 мая 2020

Я проверил этот топи c: https://forum.flowable.org/t/how-to-assign-as-sub-process-initiators-users-groups-that-have-been-selected-in-a-form/1429, но его ответ не был проверен (и я тоже не смог его проверить).

Что я хочу сделать просто создать простой процесс с динамическими c номерами подпроцессов, исполнитель которых будет указываться динамически в соответствии с выбором, сделанным в стартовой форме. Фактически, количество подпроцессов точно такое же, как и выбор в стартовой форме. Например, я выбрал 3 идентификатора пользователя: A, B, C, и будет 3 подпроцесса, один из которых назначен A, один назначен B, а другой назначен C.

Однако после долгих попыток я обнаружил, что строка идентификатора "A" (такая же, как B и c) обрабатывается только как TextNode, а правопреемник - это строковый идентификатор '"A"', а не настоящий идентификатор «А». Когда я отлаживал свою текущую установку, я оценил исходный код JsonIndexVariableType#setValue и построил новый ObjectNode с: {"jsonValue": {"id": "A"} и, наконец, показал мне именно пользователя A в экземпляр подпроцесса.

Мне не терпится узнать практический метод достижения этой цели, любая помощь будет признательна.


enter image description here enter image description here

1 Ответ

0 голосов
/ 26 мая 2020

После множества повторных попыток я наконец нашел решение для достижения этой цели. Решение простое, просто введите ${user.textValue()} вместо ${user}, чтобы извлечь реальный идентификатор правопреемника из TextNode.

ПОМНИТЕ , переменная не является чистым строковым значением, на самом деле это экземпляр TextNode, что означает, что метод toString() вернет ""<id>"" (двойная кавычка приведет к невозможности найти надлежащего правопреемника).


Исходный код находится по адресу:

org.flowable.engine.impl.bpmn.behavior.UserTaskActivityBehavior#handleAssignments( TaskService taskService, String assignee, String owner, List<String> candidateUsers, List<String> candidateGroups, TaskEntity task, ExpressionManager expressionManager, DelegateExecution execution, ProcessEngineConfigurationImpl processEngineConfiguration)


Другой способ сделать это - использовать сценарий Script Task, Groovy, например:

execution.setVariable("user", user.textValue())

Затем вы можете назначить ${user} (user здесь уже чистая строка, это отличается от предыдущего решения).

...