Особенности выполнения автоопераций

Автор Kulikcha, 05.06.23, 11:15:36

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Kulikcha

Добрый день!

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

Chaa

Цитата: Kulikcha от 05.06.23, 11:15:36Есть как бы главный процесс, а есть тот, который был создан из первого
Создан просто с помощью CreateProcess или это дочерний подпроцесс?

Цитата: Kulikcha от 05.06.23, 11:15:36автооперация перестаёт как бы видеть второй процесс и как бы переносится в контекст первого процесса
А как это проявляется?
+ Благодарностей: 1

Kulikcha

Да, второй процесс создаётся с помощью CreateProcessBy на основе уже созданного типового процесса. Создание производится из первого процесса. А происходит всё таким образом, насколько я могу судить из своих экспериментов.

Сначала выполняется операция ожидания из этого самого первого процесса. Затем сразу же из второго. При повторном выполнении(если такая необходимость есть) операций вторая операция как бы перестаёт видеть свой процесс, в котором она находится. Она начинает видеть "главный" процесс. Вставил туда строчку Route.Stage(1). Она мне выводит компонент главного процесса, хотя запускается всё из второго. Из чего делаю вывод, что ссылка на второй процесс как-то подменяется ссылкой на первый.

Это происходит уже при повторном выполнении. Если операции выполняются впервые, всё работает так, как нужно. И если автооперация из главного процесса не запускается заново(в этом нет необходимости), то автооперация из второго процесса работает правильно.

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

Chaa

Можно попробовать посмотреть, правильные ли данные возвращают метод сервера приложений MonitoringTaskWait (или хранимая процедура prGetActiveOperWaitList, что то же самое).

Потом попробовать посмотреть Route.inID в обоих процессах.

Дальше можно попробовать вызвать Route.RefreshInfo в автооперации.
+ Благодарностей: 1

Kulikcha

Я так понимаю, что метод MonitoringTaskWait позволяет делать то же самое, но без использования Аудитор Сервис?

Chaa

Нет. Его использует аудитор, чтобы получить список операций ожидания. Потом он для найденных процессов выполняет автооперации и производит движение по процессу.
+ Благодарностей: 1

Kulikcha

Да, refheshInfo помогло. Теперь работает, как ожидалось. Большое спасибо за наводку.

Остался только единственный вопрос. Когда я использую для ссылки на блок исполнителя строчку Route.Stage(1), обращение происходит нормально. А вот если использую Route.inLocateStage('имя должности'), всегда возвращается -1, то есть якобы блока с такой должностью нет. Но в том-то и дело, что он есть. Я вывожу список должностей для всего бизнес-процесса, пробовал выводить список всех блоков. Должность распознаётся. Да и просто через stRoleName нормально выводится название. Но система указанным образом не находит её. Предпочтительно в данной ситуации использовать именно этот способ, потому что название должности уникально в рамках процесса(и в дальнейшем это будет так), а чисто по номеру обращаться к блоку - потом могут быть изменения в структуре процесса. При всём при этом остальной код не менялся. 

Кстати, до этого было наоборот. При неизменном коде Route.Stage(1) не работало, а через inLocateStage работало.

Chaa

Вероятно, это ошибки Аудитор сервис (судя по тому, что RefreshInfo их исправляет).

Насколько я помню, у вас версия 2018, она еще поддерживается (https://support.ascon.ru/conditions/available_versions/). Поэтому есть смысл написать в поддержку (sd.ascon.ru), чтобы исправили.

А пока придется написать функцию, которая перебирает все стадии и ищет нужную. Скрипт будет примерно такой:

program Main;

  function LocateStage(Role: String): Integer;
  begin
    Result := -1;
    for i := 0 to Route.inStageCount - 1 do
    begin
      Stage := Route.Stage(i);
      if (Stage.stType = 'Stage') and (Stage.stRoleName = Role) then
      begin
        Result := i;
        break;
      end;
    end;
  end;

begin
  ...
  StageNo := LocateStage('...');
  ...
end

Kulikcha

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

Chaa

Можно сделать плагин для Лоцмана, с пунктом меню, к примеру, "Отправить на согласование". Плагин показывает список, и после выбора создает процесс или включает/отключает определенные стадии.

Можно сделать автооперацию в начале процесса, которая с помощью CallLoodsmanPlugin или ExecPluginFunction вызывает окно с выбором участников. Но в этом варианте вы столкнетесь с рядом проблем:
1. Процесс уже выполняется, добавить или удалить стадию в него нельзя без его остановки. Перезапуск во время выполнения приведет к проблемам.
2. Автооперация выполняется от имени того, кто выполняет движение по процессу. Например, если администратор перезапустит процесс, то и автооперация будет выполнена от его имени, а не от инициатора.
+ Благодарностей: 1