Кастомные Process Form и Task Form. Вопросы и проблемы

В процессе переезда в одном из наших решений на новый аддон Bproc хотелось получить больше гибкости: дать возможность пользователям значительно модифицировать существующие процессы и создавать новые без вмешательства к код приложения, чисто на уровне конструктора моделей. Причем создавать процессы как интегрированные с сущностями приложения, так и “отвлеченные” от основного назначения приложения.
С виду в новом аддоне для этого несравненно больше возможностей:

  1. Можно создавать в конструкторе процессы, интегрированные с сущностями и экранами приложения.
  2. Для процессов прямо в конструкторе создать простые процессные формы и формы для задач.
  3. Можно просто использовать в качестве процессных форм существующие экраны редактирования сальностей, реализованные в приложении. Порой это очень полезно.

И все это очень здорово, но заточено под сценарий использования “пойди на экран запуска процессов, запусти процесс и он на экране запуска заставит ввести тебя все нужные данные, выбрать файлы и сущности и т.п.”
Но такой use-case удобен далеко не всегда.
Есть множество процессов, которые должны стартоваться с уже открытого экрана редактирования сущности и с экрана сущности должны отрабатываться процессные задачи:

  1. Это классические сценарии типа “согласование/разработка документа”
  2. Процессы типа обработки различных заявок
  3. Работа с договорами.

Сущность со значительным обвесом уже есть, в какой-то момент, работая с экраном пользователь должен стартануть процесс.
При этом в инстанс процесса нужно передать ряд атрибутов сущности и часть параметров дать заполнить вручную, возможно, провести стандартные для сущности или типа процесса верификации до старта.

И вот тут есть ряд неприятных моментов…
Я изучил близкие о смыслу старые темы:
Bproc. Переменная типа “Entity list” и параметр формы - Вопросы и проблемы - CUBA.Platform (cuba-platform.ru)
Передача параметра в Бизнес-процесс - Вопросы и проблемы - CUBA.Platform (cuba-platform.ru)
Но до конца картинка так и не сложилась: или реально в аддоне не хватает некоторых возможностей, либо они есть но я их не вижу/не осознаю.

Сценарий работы, который хотелось бы реализовать на примере всем понятного процесса “согласование документа”.
Но тут “Документ” это не просто файл, а сущность (Письмо, Договор, Акт, Ком.предлжение и т.п.) со значительным обвесом в виде Файлов, связанных Документов, обсуждений и т.п.

  1. Процесс должен стартоваться с экрана редактирования сущности.
  2. При этом надо всегда передать в переменные процесса “согласуемую сущность”, приложенные к ней файлы (сопроводив опционально файлы комментарием на стартовом экране).
    Остальные параметры формы запуска нужно определять в конструкторе процессов.
  3. Часть параметров процесса заполнить умолчательными значениями и дать редактировать их на экране запуска (списки исполнителей задач, дедлайн процесса или отдельных задач и т.п.)
  4. В зависимости от класса сущности провести до запуска процесса некие верификации. Например, если согласуемая сущность Договор, то в Договоре обязательно должны быть заполнены поля Сумма и Срок.
  5. Запущенный процесс надо отображать на экране редактирования сущности, для которой он запущен. И там же отображать кнопки активных задач для данного пользователя.
  6. Форма задачи должна давать возможность не только указать outcome, но сопроводить его комментарием (обязательным или опциональным в зависимости от outcome) и опционально приложить свою редакцию фалоа(ов) документов.
    В идеале нужна возможность добавить в конструкторе процессов для конкретной задачи процесса на форму дополнительные параметры, которые пользователь будет заполнять на форме.

С пунктом 1 и 5 проблем нет. Легко накидал фрагмент экрана, который отображает доступные пользователю процессы, дает возможность выбрать процесс, запустить его, а при наличии активного процесса для сущности отображаемой на экране - показывает активные задачи для данного пользователя и позволяет из штатно исполнить.
Хотя, поддержу тут @sergeevms.33 - хорошо бы иметь штатную возможность в Конструкторе определить то, для каких сущностей применим процесс. В своих пожеланиях 2 года назад он писал про нечто вроде справочника, в котором можно было бы определить без хардкода применимость того или иного процесса для той или иной сущности.

А вот с Process Form и Task Form пока не вытанцовывается нормальное решение…
Тип формы Input dialog дает возможность в конструкторе описать практически все варианты параметров формы, но:

  1. UI очень аскетичный
  2. При запуске процесса с такой стартовой формой я не могу передать в нее нужные параметры. Например, согласуемую сущность, файл, типовой список исполнителей задачи и т.п.
    На форме задачи не могу затребовать обязательный комментарий для определённого outcome и т.п.
  3. Верификацию полей сущности до запуска процесса тоже не поучится сделать.
    Но оно и логично, т.к. этот тип экрана для простых типовых случаев.

Тип формы Cuba screen не вариант уже потому, что в этом случае в конструкторе вообще нельзя определить свои специфичные для процесса или задачи параметры. Тут подразумевается, что все определяется кодом со стороны экрана.

Custom process/tasks forms вроде как раз наш случай - когда надо отобразить форму своим нестандартным образом.
Есть API для получения параметров форм, заданных в конструкторе в модели процесса.
Если я запускаю процесс со своего фрагмента на экране редактирования сущности, то могу передать в него нужные мне параметры (согласуемую сущность, файлы и т.п.) и их затрамбовать в переменные процесса. Еще до запуска процесса могу провести стандартные верификации согласуемой сущности.
Т.е. с виду остается сделать кастомные экраны для запуска процесса “Согласование документа” и задачи “outcome согласования”, реализовать в них нужную “железобетонную часть логики процесса”, типа предварительной проверки сущности и передачи в параметры процесса согласуемой сущности и ассоциированных с ней файлов, возможности приложить к файл к outcome и т.п.
И читая заказанные в процессе параметры форм через getStartFormData и getTaskFormData - динамически отрисовывать остальные параметры экрана для Конкретного варианта процесса или Конкретной задачи процесса. Т.е. аналогично Input dialog но с нужной спецификой UI и тонкостями.

Но если для формы типа Input dialog в конструкторе процессов можно очень детально описать параметры процесса, включая тип данных, обязательность заполнения и многое другое, что относится к отображению их на форме, то для Custon form, задавая параметры формы в конструкторе я могу только указать Имя параметра и его значение или источник значения.
Если описания параметров параметров кастомной формы настолько куцые, то получается, что Типы данных- этих параметров, обязательность параметра и т.п. - все это должно быть прибито хардкодом в этой кастомной форме?
И тогда мы опять теряем возможность серьезно модифицировать процессы чисто на уровне конструктора, без изменения кода.
Ведь добавление задачи в процесс - это добавление новых параметров задачи, новых переменных процесса. Но в случае кастомной формы я могу задать только имя параметра, тип и обязательность я задать не могу, и в итоге, на базе этих данных о параметрах формы не смогу отрисовать UI в кастомной форме. Ведь я знаю только имя нового параметра новой задачи, но даже не знаю его тип.

@gorbunkov Почему для кастомной формы так сильно урезаны возможности описания параметров формы относительно того же Input dialog?

Я ожидал увидеть те же возможности описания параметров в конструкторе, что и в Input dialog, а в своем кастомном экране отрисовать UI так, как мне нужно, с нужными верификациями, прописав еще и общую для процесса логику передачи части полей сущности в параметры процесса, дефолтного заполнения некоторых параметров процесса и т.п. тонкости.

И пока не понимаю желаемой реализации, с сохранением возможности значительно модифицировать процессы на уровне конструктора, без изменения кода приложения.

1 симпатия

А Cuba Screen Process Form Parameters вам почему не подошли? Вроде бы как раз то, что вы описываете - в дизайнере процесса вы можете сконфигурировать CUBA screen форму определёнными значениями.

Ещё, кстати, о конфигурировании юзер-тасок - есть панелька Extension properties, где вы можете указать набор key-value пар с произвольными значениями. В некоторых случаях может пригодиться. В BProc доке это не описали, но в документации Jmix можете посмотреть. В BProc то же самое, только сервис называется не BpmModelService, а BProcModelService.

Что касается custom форм, то насколько я помню, это была скорее альтернатива CUBA Screen формам, а не InputDialog формам. Предполагалось, что по заданному id у вас уже есть какой-то дескриптор формы, форма знает какие поля она покажет, и вы просто рисуете свою форму на альтернативных UI-технологиях.

Ещё вы можете попробовать Input Dialog формы отрисовывать по-своему в своих проектах. Определите ProcessFormScreenCreator и зарегистрируйте его для типа формы “input-dialog” по аналогии с тем, как это сделано для кастомной формы.

1 симпатия

Так тут опять же - параметры прописываются в коде экрана, а используются в конструкторе процессов.
А если пользователь хочет к процессу добавить еще 1-2 таски с новыми наборами исполнителей, которых надо задать на экране запуска процесса - опять менять код экрана, добавляя в него новые параметры.

Ещё, кстати, о конфигурировании юзер-тасок - есть панелька Extension properties, где вы можете указать набор key-value пар с произвольными значениями.

Да, это будет полезно, благодарю.

Ещё вы можете попробовать Input Dialog формы отрисовывать по-своему в своих проектах.

По сути - как раз это и требуется. Тогда на стороне конструктора процессов можно менять процесс добавляя таски и параметры, вводимые на экране, но отрисовывать при этом свой UI экрана.
А я же смогу из этого ProcessFormScreenCreator для формы “input-dialog” на свое усмотрение вызывать или стандартную реализацию экрана Input Dialog или собственную?
Противопоказаний нет?

В идеале хочется иметь простенькие стандартные InputDialog для простых абсолютно кастомных процессов, и для части процессов, с более богатой логикой и относящихся к основному функционалу приложения - свою реализацию UI экранов Input Dialog.

Там будет ваш код, который сделает всё, что вы скажете) Насчёт противопоказаний - вариант с переопределением создателя форм для InputDialog форм, не является стандартным вариантом использования аддона. Это всё равно будет немножко “хак”, как и любое переопределение чего-то стандартного. Но ничего сильно страшного на первый взгляд случиться не должно.

Получилось, однако. :slight_smile:
Теперь для части определений процессов, для процессных экранов с типом InputDialog, отрисовывается нужный нам UI с нашими композитными компонентами для отдельных типов параметров экрана.
image

Дальше уже тонкости и косметика.