Как получить список элементов созданного бизнес-процесса и их ID?

Автор Black_Walker, 27.12.21, 15:03:04

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

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

Black_Walker

Пишу плагин ЛОЦМАН, который создаёт бизнес-процесс. Проблема следующая: не могу выгрузить идентификатор первой задачи процесса. Идентификатор нужен, чтобы перенести туда текст задания из интерфейса плагина.

Пробовал следующий метод:
IPluginCall pluginCall = new PluginCall();
IDataSet dataSet = pluginCall.GetDataSet([b]"WFGetRouteItems"[/b], new object[] { _processId, inReturnCode, stErrorMessage });
В этом случае dataSet.IsEmpty() даёт true. То есть датасет пустой.

Пробовал так же:
IPluginCall pluginCall = new PluginCall();
IDataSet dataSet = pluginCall.GetDataSet([b]"WFGetFirstItems"[/b], new object[] { _processId, inReturnCode, stErrorMessage });
Тоже выдаёт пустой датасет.

Так же попробовал через библиотеку бизнес логики использовать RunMethod:
wFBusinessLogic.RunMethod("WFGetFirstItems", new object[] { _processId, inReturnCode, stErrorMessage });
Но данный метод возвращает байтовый массив byte[]. Что-то я не пойму как его декодировать в нужные мне свойства задачи процесса?

Может кто-то решал уже подобную задачу?

Chaa


Black_Walker


Chaa

Не совсем понятна эта строка:
IPluginCall pluginCall = new PluginCall();Дело в том, что интерфейс IPluginCall вы должны получить от Лоцман-клиента.

В SDK 2018.3 есть пример плагина на C#, там этот интерфейс называется INetPluginCall и передается в вашу функцию.

Параметры inReturnCode, stErrorMessage тоже передавать в RunMethod/GetDataSet не обязательно, клиент их сам добавит. Но если передаете, то нужно проверять наличие ошибки.

Black_Walker

Цитата: Chaa от 28.12.21, 11:26:53Дело в том, что интерфейс IPluginCall вы должны получить от Лоцман-клиента.
А каким образом это реализуется? Я ещё не совсем разобрался в API. С библиотекой бизнес-логики мне понятна работа, а вот с ЛОЦМАН в целом какие-то трудности возникают.


Цитата: Chaa от 28.12.21, 11:26:53В SDK 2018.3 есть пример плагина на C#, там этот интерфейс называется INetPluginCall и передается в вашу функцию.
Да я видел описание этого интерфейса, но не нашёл именно практический пример его использования. Все что там написано: Интерфейс предназначен для получения информации от модуля «ЛОЦМАН Клиент». И в нём есть свойство, которое предоставляет IPluginCall.

Я правильно понимаю, что для начала нужно создать объект приложения ЛОЦМАН?

Chaa

Общая информация о подключаемом модуле:
https://achechulin.blogspot.com/2012/04/plugin-sample.html

Как сделать на C# для старых версий Лоцмана:
https://achechulin.blogspot.com/2018/10/plugin-c-sharp.html

В 2018.3 клиент поддерживает плагины на C# в новом формате. В LoodsmanClientApi.chm они описаны в разделе "Разработка плагинов на языке C# для платформы .NET Framework". В папке Client\Plugins\C# есть пример плагина.

Цитата: Black_Walker от 28.12.21, 11:49:34Я правильно понимаю, что для начала нужно создать объект приложения ЛОЦМАН?
Нет, Лоцман вызовет вашу функцию с параметром, в котором и будет нужный вам объект INetPluginCall.

private void Command1(INetPluginCall obj) {
   ...
}
+ Благодарностей: 1

Black_Walker

Это мне понятно. Мой плагин по вызову команды меню вызывает окно с интерфейсом. В интерфейсе есть кнопка, обработчик клика по которой реализует метод создания бизнес-процесса. Логика метода выделена в отдельный класс. Сам бизнес-процесс я создаю через объект IWFBusinessLogic. С этим проблем нет. Проблема с получением списка этапов созданного экземпляра бизнес-процесса. По схеме БП первым идёт задание исполнителю, я хочу в это задание передавать его текст из формы плагина (из текстового поля).
Единственный косяк у меня в том, что в свойство MainHandle библиотеки WFBusinessLogic я не смог передать ID главного окна ЛОЦМАН и просто кидаю туда 0, БП в любом случае создаётся. А вот при вызове метода, изменяющего задачу БП мне нужно туда передать ID задачи, вот этот ID я и не понимаю где взять.

Chaa

Посмотрите GetJobsListIntoProcess, GetRoleListIntoProcess или GetRouteTasks. Они возвращают примерно одно и то же (для ваших целей).
Для начала рекомендую примерно так:

private void Command1(INetPluginCall obj) {
  // Взять идентификатор существующего процесса, созданного вами
  int id = 42;
  object[] args = { id };
  DataTable table = obj.GetDataTable("WFGetJobsListIntoProcess", args);
  // Посмотреть содержимое таблицы
}
+ Благодарностей: 1

Black_Walker


Black_Walker

Цитата: Chaa от 28.12.21, 14:02:58Посмотрите GetJobsListIntoProcess, GetRoleListIntoProcess или GetRouteTasks. Они возвращают примерно одно и то же (для ваших целей).
Для начала рекомендую примерно так:

private void Command1(INetPluginCall obj) {
  // Взять идентификатор существующего процесса, созданного вами
  int id = 42;
  object[] args = { id };
  DataTable table = obj.GetDataTable("WFGetJobsListIntoProcess", args);
  // Посмотреть содержимое таблицы
}

И всё же я не пойму как реализовать методы интерфейса INetPluginCall. Не нашёл в API класса, который реализует данный интерфейс.

Пробовал вот так:
wFBusinessLogic.RunMethod("WFGetRouteItems", new object[] { _processId });Библиотека отрабатывает и данные предоставляет в виде массива байт опять же. Как этот массив можно преобразовать в датасет?

Попробовал так же вот так:
PluginCall pluginCall = new PluginCall();
DataSet ds = pluginCall.GetDataSet("WFGetRouteItems", new object[] { _processId });
Датасет снова пустой.

Мне кажется, что я не понимаю какого-то важного принципа работы с API ЛОЦМАН. А вот что я делаю не так не пойму.

Chaa

Цитата: Black_Walker от 29.12.21, 09:16:24И всё же я не пойму как реализовать методы интерфейса INetPluginCall. Не нашёл в API класса, который реализует данный интерфейс.
Вам не нужно его реализовывать, его реализует Лоцман Клиент, и передает в вашу функцию. Вам нужно его использовать.

Цитата: Black_Walker от 28.12.21, 12:34:52Это мне понятно. Мой плагин по вызову команды меню вызывает окно с интерфейсом.
Лоцман Клиент передает в ваш плагин ссылку на интерфейс INetPluginCall/IPluginCall (в примере obj), вам нужно передать ее дальше в окно с интерфейсом и там использовать для вызова методов API сервера.
+ Благодарностей: 1

Black_Walker

Цитата: Chaa от 29.12.21, 10:44:00Лоцман Клиент передает в ваш плагин ссылку на интерфейс INetPluginCall/IPluginCall (в примере obj), вам нужно передать ее дальше в окно с интерфейсом и там использовать для вызова методов API сервера.
Спасибо! Да я как раз о том же и подумал. Пробросил объект в форму, а из формы в класс с бизнес-логикой приложения. Сейчас пробую получать данные. Просто не приходилось ещё работать с COM-объектами, потому и торможу.

Black_Walker

Цитата: Chaa от 29.12.21, 10:44:00Вам не нужно его реализовывать, его реализует Лоцман Клиент, и передает в вашу функцию. Вам нужно его использовать
У меня всё получилось! Спасибо за подсказки.