05.07.2022, 09:09 | #1 |
Участник
|
Workflow Алгоритмы одобрения Можно ли изменить/добавить
Возник вопрос по workfow. Хотим доработать алгоритм одобрения для каких то случаев. Может кто-то копал возможно ли это? Куда смотреть?
|
|
05.07.2022, 09:39 | #2 |
Administrator
|
А в чём проблема? Есть элементы WF в АОТе, они ссылаются на классы - там логика. Фантазии можно разные реализовать
__________________
Возможно сделать все. Вопрос времени |
|
05.07.2022, 10:01 | #3 |
Участник
|
Цитата:
Сценарий из разряда есть WF с параллельными заданиями например условно ищут потерянные вещи сотрудники А Б (параллельно ищут вещь 1) и С с D (ищут другую вещь 2)) при одобрении сотрудниками AA или ББ знающими как выглядит вещь 1 факта что сотрудник А нашел нужную вещь отпускаем с чистой совестью и А и Б но С и D продолжает трудиться для них ободрить могут ББ и CC. |
|
05.07.2022, 10:15 | #4 |
Banned
|
Назначить один шаг одобрения сразу и одновременно нескольким лицам, причем установить в одном случае условие "Any one approver", а в другом "All approvers".
|
|
05.07.2022, 10:33 | #5 |
Участник
|
|
|
05.07.2022, 10:43 | #6 |
программист
|
Цитата:
Т.е. есть документ с кучей вещей, которые надо найти. Вы можете написать свой "провайдер", который подберет для каждой вещи по любому алгоритму кто именно должен искать. Дальше уже собственно WF создается как описал EVGL. Когда любой исполнитель из группы 1 допустим найдет Вещь 1 - в строке меняется статус Найдено. На заказе на продажу (или покупки, не помню) и на заявках на закупку реализовано построчное согласование документа. Правда сам не пробовал как это работает. Последний раз редактировалось gudzon; 05.07.2022 в 10:48. |
|
05.07.2022, 10:51 | #7 |
Участник
|
Цитата:
Сообщение от gudzon
Вещь 1 или вещь 2 это по идеи строки должны быть документа. WF чисто про подбор исполнителей и последовательность их назначения. И только.
Т.е. есть документ с кучей вещей, которые надо найти. Вы можете написать свой "провайдер", который подберет для каждой вещи по любому алгоритму кто именно должен искать. Дальше уже собственно WF создается как описал EVGL. Когда любой исполнитель из группы 1 допустим найдет Вещь 1 - в строке меняется статус Найдено. На заказе на продажу (или покупки, не помню) и на заявках на закупку реализовано построчное согласование документа. Правда сам не пробовал как это работает. А точно провайдер может это? |
|
05.07.2022, 11:00 | #8 |
Banned
|
Нет. Провайдер только выдает список лиц. Запрограммировать "дальнодействие" между открытыми заданиями в Workflow сложно до невозможности, они каждый в своем контексте, и не проверяют статусы по таймеру или любому другому событию, а реагируют только на кнопки, чтобы двигаться дальше.
|
|
05.07.2022, 11:14 | #9 |
программист
|
Цитата:
Основном посыл - не надо бизнес-логику тащить в WF. Он это не понимает. Там нет сложной генерации задач и управления ими из кода. Задания создаются только по настройкам и на одну "запись в таблице". Если у вас какой то сложная генерация заданий, лучше сделать промежуточную таблицу на документ - Задания на поиск, и на нее уже WF натравить. По каждому заданию из этой таблицы можно делать одно задание WF и назначать параллельных исполнителей. Статус менять уже у этой таблицы - а она из кода уже может менять у связанных строк (вещей). |
|
05.07.2022, 15:56 | #10 |
Administrator
|
Цитата:
Сообщение от axm2017
например условно ищут потерянные вещи сотрудники А Б (параллельно ищут вещь 1)
и С с D (ищут другую вещь 2)) при одобрении сотрудниками AA или ББ знающими как выглядит вещь 1 факта что сотрудник А нашел нужную вещь отпускаем с чистой совестью и А и Б но С и D продолжает трудиться для них ободрить могут ББ и CC. Т.е. WF не задумывался в роли алгоритма поиска потерянных вещей, т.е. ситуация, когда А нашел чего-то, а C и D ещё ищут - неприменима для WF (понятно, что "натянуть" функционал с некоторыми ограничениями можно всегда)
__________________
Возможно сделать все. Вопрос времени |
|
07.07.2022, 11:00 | #11 |
Участник
|
Цитата:
Типичное в коде SysWorkflowWorkItem метод completeWorkItems X++: while select forupdate * from workItemTable where // BP deviation documented workItemTable.CorrelationId == _correlationId && workItemTable.StepId == _stepId { if (workItemTable.Status != WorkflowWorkItemStatus::Completed) { if (_isClaimed && workItemTable.ActivityId == _claimedActivityId) { if (workItemTable.Queue) { SysWorkflowWorkItem::completeNotification(workItemTable.CompanyId, workItemTable.NotificationId); workItemTable.NotificationId = 0; workItemTable.UserId = _user; workItemTable.Subject = _subject; workItemTable.Description = _instructions; } workItemTable.IsClaimed = NoYes::Yes; } else { workItemTable.Status = WorkflowWorkItemStatus::Completed; SysWorkflowWorkItem::completeNotification(workItemTable.CompanyId, workItemTable.NotificationId); workItemTable.NotificationId = 0; } workItemTable.update(); } |
|
07.07.2022, 11:19 | #12 |
Administrator
|
Здесь могут быть 2 идеи:
1. Очереди задач. Есть какое-то количество задач (элемент АОТа Task) в пуле (очереди) задач. Кто из пользователей, кто полномочен эти задачи решать - жмет кнопку принять (аналог того, что человек, обслуживающий посетителей жмет кнопку "следующий по электронной очереди"). Ему попадает какая-то задача. Он ее на себя берет, выполняет и по ее завершению - жмет кнопку Выполнить. Также он может эту задачу вернуть обратно в очередь задач. 2. Как глобально работает WF: Когда пользователь нажал кнопку, то система не кинулась прямо сразу выполнять действия, которые заложены в WF. Крутится независимый пакетник, который (условно раз в минуту) проверяет все элементы WF (и Task и Approval) на предмет изменения их статуса. Ну и скопом их обрабатывает. Поэтому Ваш пример может быть просто примером "оптовой" обработки элементов WF (потому что это просто пакетник). Но Вы могли также видеть и функционал работы с очередями
__________________
Возможно сделать все. Вопрос времени |
|
07.07.2022, 13:20 | #13 |
Участник
|
там идея именно в том что выполнение одной задачи закрывает и другие.
Сделано своеобразно но работает именно так завершил свою задачу закрылись параллельные по той же теме |
|
08.07.2022, 14:13 | #14 |
Участник
|
Правильно ли я понял, что есть некий документ, по которому запущен WF. В рамках этого документа может быть осуществлен поиск рандомного количества предметов разными группами лиц. При этом по каждой вещи должно быть хотя бы одно выполнение для завершения этапа?
|
|
08.07.2022, 14:27 | #15 |
Участник
|
Цитата:
"Идет параллельный поиск то есть ищут все вещи (вещь 1 вещь 2 вещь 3..) одновременно. Нахождение одной вещи закрывает сразу часть параллельных заданий тех кто ищет вещь" Распараллеливание и ко решается силами WF вопрос был о том как менять механизм для подобного согласования. Было интересно узнать чужой опыт. Кусок как меняют нашел в коде в итоге (см. выше) |
|
08.07.2022, 14:43 | #16 |
Участник
|
Главное не забыть из этого метода delete_from messageTable, иначе может получиться многократное обновление
|
|
|
За это сообщение автора поблагодарили: axm2017 (1). |
|
|