Handlers: различия между версиями

Материал из RunaWFE
Перейти к навигации Перейти к поиску
 
(не показано 56 промежуточных версий этого же участника)
Строка 58: Строка 58:
Помимо переменных могут использоваться непосредственные значения форматов Long, Double, Boolean, String, Date и функции.
Помимо переменных могут использоваться непосредственные значения форматов Long, Double, Boolean, String, Date и функции.


===Функции общего применения===
Например, функции могут быть такими:  
Например, функции могут быть такими:  


Строка 64: Строка 65:
* hours_round_up(число) округляет время, заданное в минутах, до часов в верхнюю сторону  
* hours_round_up(число) округляет время, заданное в минутах, до часов в верхнюю сторону  
* round(число) или round(число, количество знаков после запятой) округляет число в ближайшую сторону, оставляя фиксированное количество знаков после запятой  
* round(число) или round(число, количество знаков после запятой) округляет число в ближайшую сторону, оставляя фиксированное количество знаков после запятой  
* round_up(число) или round_up(число, количество знаков после запятой) округляет число в верхнюю сторону  
* round_up(число) или round_up(число, количество знаков после запятой) округляет число в большую сторону  
* round_down(число) или round_down(число, количество знаков после запятой) округляет число в нижнюю сторону  
* round_down(число) или round_down(число, количество знаков после запятой) округляет число в меньшую сторону  
* number_to_string_ru(число) переводит число в строку на русском языке  
* number_to_string_ru(число) переводит число в строку на русском языке  
* number_to_string_ru(число, п2, п3, п4, п5) переводит число с зависимым словом в строку на русском языке  
* number_to_string_ru(число, п2, п3, п4, п5) переводит число с зависимым словом в строку на русском языке  
Строка 92: Строка 93:




Функция для работы с ФИО:
===Функция для работы с ФИО===
* FIO_case_ru(String fio, int caseNumber, String mode)
* FIO_case_ru(String fio, int caseNumber, String mode)
Где:
Где:
  fio - фамилия, имя и отчество в именительно падеже через пробел
  fio - фамилия, имя и отчество в именительном падеже через пробел
  caseNumber - номер падежа (от 1 до 6)
  caseNumber - номер падежа (от 1 до 6)
  mode - строка форматирования.  
  mode - строка форматирования.  
Строка 106: Строка 107:


Примеры использования:  
Примеры использования:  
  FIO_case_ru("Иванов Иван Иванович", 1, "F I O :)") Иванов Иван Иванович :)  
  FIO_case_ru("Иванов Иван Иванович", 1, "F I O :)")   //Иванов Иван Иванович :)  
  FIO_case_ru("Иванова Ира Ивановна", 2, "F I o") Ивановой Иры И.  
  FIO_case_ru("Иванова Ира Ивановна", 2, "F I o")       //Ивановой Иры И.  
  FIO_case_ru("Иванов Иван Иванович", 3, "F i O") Иванову И. Ивановичу  
  FIO_case_ru("Иванов Иван Иванович", 3, "F i O")       //Иванову И. Ивановичу  
  FIO_case_ru("Иванова Ира Ивановна", 4, "F i o") Иванову И. И.  
  FIO_case_ru("Иванова Ира Ивановна", 4, "F i o")       //Иванову И. И.  
  FIO_case_ru("Иванов Иван Иванович", 5, "f I O") И. Иваном Ивановичем  
  FIO_case_ru("Иванов Иван Иванович", 5, "f I O")       //И. Иваном Ивановичем  
  FIO_case_ru("Иванова Ира Ивановна", 6, "о I o") о Ире И.  
  FIO_case_ru("Иванова Ира Ивановна", 6, "о I o")       //о Ире И.  
  FIO_case_ru("Апырвапыркина Фыва Няковна", 5, "F I O") Апырвапыркиной Фывой Няковной.  
  FIO_case_ru("Апырвапыркина Фыва Няковна", 5, "F I O") //Апырвапыркиной Фывой Няковной.  




Строка 133: Строка 134:
       …
       …
   </name>
   </name>
   <name value = “отчество в именительном падеже”>
   <parent value = “отчество в именительном падеже”>
     <rule case = “номер падежа”>правильный вариант отчества</rule>
     <rule case = “номер падежа”>правильный вариант отчества</rule>
       …
       …
Строка 174: Строка 175:
  some_variable = mapping("Бухгалтер", "должность в дательном падеже")
  some_variable = mapping("Бухгалтер", "должность в дательном падеже")


Функции для работы со списками:
===Функции для работы со списками===
* ListToString(list) соединяет список в одну строку. Можно указать опциональный 2-й аргумент - разделитель строк
* ListToString(list1) соединяет список в одну строку. Можно указать опциональный 2-й аргумент - разделитель строк. Если разделитель строк не задан, то разделителем по умолчанию буде пробел
* GetListMatchedIndexes(Список, Аргумент2) возвращает список СписокПозиций, содержащий целые числа, представляющие собой номера позиций в Список1 таких, что для каждого элемента из Список1, позиция которого содержится в списке СписокПозиций, во втором аргументе (может быть списком или объектом другого простого формата) существует совпадающий с ним элемент  
* GetListMatchedIndexes(Список1, Аргумент2) возвращает список СписокПозиций, содержащий целые числа, представляющие собой номера позиций в Список1 таких, что для каждого элемента из Список1, позиция которого содержится в списке СписокПозиций, во втором аргументе (может быть списком или объектом другого простого формата) существует совпадающий с ним элемент в любой позиции
* GetListMismatchedIndexes(Список1, Список2) возвращает список СписокПозиций, содержащий целые числа, представляющие собой номера позиций в Список1 таких, что для каждого элемента из Список1, позиция которого содержится в списке СписокПозиций, в списке Список2 не существует совпадающего с ним элемента  
* GetListMismatchedIndexes(Список1, Список2) возвращает список СписокПозиций, содержащий целые числа, представляющие собой номера позиций в Список1 таких, что для каждого элемента из Список1, позиция которого содержится в списке СписокПозиций, в списке Список2 не существует совпадающего с ним элемента  
* CreateSubListByIndexes(Список, СписокПозиций) возвращает список СписокПоПозициям, содержащий элементы списка Список, позиции которых содержатся в списке СписокПозиций
* CreateSubListByIndexes(Список1, СписокПозиций2) возвращает список СписокПоПозициям, содержащий элементы списка Список1, позиции которых содержатся в списке СписокПозиций2
* DeleteListElementsByIndexes(Список, СписокПозиций) удаляет в списке Список элементы, номера позиций которых содержатся в списке СписокПозиций и возвращает его
* DeleteListElementsByIndexes(Список1, СписокПозиций2) возвращает копию списка Список1 с удалёнными из неё элементами, номера позиций которых содержатся в списке СписокПозиций2
* ToList(аргументы...) возвращает список из аргументов  
* ToList(аргументы...) возвращает список из аргументов  
* GetSize(container) возвращает целое число, соответствующее количеству элементов в списке или карте.
* GetSize(container) возвращает целое число, соответствующее количеству элементов в списке или карте.
Строка 187: Строка 188:
Используется для взаимодействия с БД.
Используется для взаимодействия с БД.


С помощью него можно создать запрос, выполняющий чтение из БД в переменные БП, или, наоборот, запись в БД значений переменных БП. В одном обработчике возможно выполнить несколько запросов.
С помощью этого обработчика можно создать запрос, выполняющий чтение из БД в переменные БП, или, наоборот, запись в БД значений переменных БП. В одном обработчике возможно выполнить несколько запросов.


=== Формирование SQL-запроса ===  
=== Формирование SQL-запроса ===  
Строка 196: Строка 197:




В версии RunaWFE 4.4.1 была добавлена возможность использования не только JNDI источника данных:  
В версии RunaWFE 4.4.1 была добавлена возможность использования не только JNDI-источника данных:  


* "Источник данных (JNDI Name)" – имя источника данных зарегистрированного на сервере (для WildFly как правило используется с префиксом java:/)
* "Источник данных (JNDI Name)" – имя источника данных, зарегистрированного на сервере (для WildFly, как правило, используется с префиксом java:/)
* "Переменная с JNDI именем" - переменная содержащая JNDI имя источника зарегистрированного на сервере
* "Переменная с JNDI-именем" переменная, содержащая JNDI-имя источника, зарегистрированного на сервере
* "Имя источника данных" - здесь доступен выбор из определенных в DevStudio источников данных (см. [[DatasourcesGuide|"Источники данных"]])
* "Имя источника данных" здесь доступен выбор из определенных в DevStudio источников данных (см. [[DatasourcesGuide|"Источники данных"]])
* "Переменная с именем" - переменная содержащая имя источника данных.  
* "Переменная с именем" переменная, содержащая имя источника данных.  


SQL запрос собственно сам запрос (в формате java.sql.PreparedStatement).
SQL-запрос собственно сам запрос (в формате java.sql.PreparedStatement).
{{Note|В версии RunaWFE 4.4.1 писать SQL запрос стало значительно удобнее - запрос теперь может располагаться не на одной строке, также была введена подсветка синтаксиса SQL}}
{{Note|В версии RunaWFE 4.4.1 писать SQL запрос стало значительно удобнее запрос теперь может занимать более одной строки; также была введена подсветка синтаксиса SQL}}


Синтаксис запроса включает текст запроса, в котором места параметров отмечаются знаками "?", количество и порядок которых должно соответствовать числу и порядку следования параметров в секции "Параметры запроса". Если это запрос типа SELECT, то он должен явно перечислять столбцы, значения которых будут присвоены переменным, перечисленным в секции "Результаты запроса".
Синтаксис запроса включает текст запроса, в котором места параметров отмечаются знаками "?", количество и порядок которых должно соответствовать числу и порядку следования параметров в секции "Параметры запроса". Если это запрос типа SELECT, то он должен явно перечислять столбцы, значения которых будут присвоены переменным, перечисленным в секции "Результаты запроса".


{{Note|Можно использовать запрос как значение переменной, для этого нужно указать строку запроса в конфигураторе в виде ${query}, где query - переменная формата "Строка", содержащая сформированный в процессе запрос}}
{{Note|Можно использовать запрос как значение переменной. Для этого нужно указать строку запроса в конфигураторе в виде ${query}, где query переменная формата "Строка", содержащая сформированный в процессе запрос}}


=== {{Title|SQLActionHandlerExecuteStoredProcedure|Выполнение хранимой процедуры MSSQL}} ===
=== {{Title|SQLActionHandlerExecuteStoredProcedure|Выполнение хранимой процедуры MSSQL}} ===


Создание таблицы и заполнение её данными:  
Пример создания таблицы и заполнение её данными:  


  CREATE TABLE dbo.tests (session_id INT NOT NULL, group_id INT NOT NULL) ON [PRIMARY]
  CREATE TABLE dbo.tests (session_id INT NOT NULL, group_id INT NOT NULL) ON [PRIMARY]
Строка 221: Строка 222:
  GO
  GO


Создание хранимой процедуры:  
Пример создания хранимой процедуры:  


  CREATE PROCEDURE dbo.test @session_id INT, @group_id INT OUTPUT
  CREATE PROCEDURE dbo.test @session_id INT, @group_id INT OUTPUT
Строка 240: Строка 241:
  SELECT @resultCode, @groupId
  SELECT @resultCode, @groupId


Задание конфигурации в процессе [[Файл:sqlProcedureTest.par]]
Пример задания конфигурации в процессе [[Файл:sqlProcedureTest.par]]:


[[Файл:sqlExecuteStoredProcedure.png]]
[[Файл:sqlExecuteStoredProcedure.png]]
Строка 255: Строка 256:
<BR>
<BR>


== {{Title|SendEmail|SendEmailActionHandler}} ==
== {{Title|SendEmailActionHandler|SendEmailActionHandler}} ==


Позволяет послать сообщение по e-mail. Сообщением может быть форма задания, если обработчик установлен на узле, а не на переходе. Альтернативным вариантом отправки сообщения является использование бота '''SendEmailTaskHandler'''. Формат файла конфигурации для него не отличается от формата конфигурации для '''SendEmailActionHandler''' (за исключением контекстной мета-информации).
Позволяет послать сообщение по e-mail. Сообщением может быть форма задания, если обработчик установлен на узле, а не на переходе. Альтернативным вариантом отправки сообщения является использование бота '''SendEmailTaskHandler'''. Формат файла конфигурации для него не отличается от формата конфигурации для '''SendEmailActionHandler''' (за исключением контекстной мета-информации).


Для создании конфигурации '''SendEmailActionHandler''' используется специальный конфигуратор. Для того, чтобы открыть конфигуратор необходимо создать обработчик, выбрав класс '''ru.runa.wfe.extension.handler.SendEmailActionHandler''' из списка доступных обработчиков и начать редактирование конфигурации. Текст файла конфигурации в формате xml можно посмотреть на вкладке "XML" диалогового окна конфигуратора. Для отправки сообщения используется [http://javamail.kenai.com/nonav/javadocs/ JavaMail], таблицы параметров внутри API пакетов по ссылке).
Для создании конфигурации '''SendEmailActionHandler''' используется специальный конфигуратор. Для того, чтобы открыть конфигуратор, необходимо создать обработчик, выбрав класс '''ru.runa.wfe.extension.handler.SendEmailActionHandler''' из списка доступных обработчиков, и начать редактирование конфигурации. Текст файла конфигурации в формате xml можно посмотреть на вкладке "XML" диалогового окна конфигуратора. Для отправки сообщения используется [http://javamail.kenai.com/nonav/javadocs/ JavaMail], таблицы параметров внутри API пакетов по ссылке.


Начиная с версии 4.2 осуществляется гарантированная доставка сообщений с помощью JMS.
Начиная с версии 4.2 осуществляется гарантированная доставка сообщений с помощью JMS.
<BR>


=== Общие настройки ===
=== Общие настройки ===


* '''Не продолжать выполнение процесса при ошибке отправки''': при ошибке обработки конфигурации выполнение процесса не проходит дальше (транзакция откатывается к предыдущей точке).
* '''Не продолжать выполнение процесса при ошибке отправки'''. При ошибке обработки конфигурации выполнение процесса не проходит дальше (транзакция откатывается к предыдущей точке).
* '''Файл базовых настроек, расположенный на сервере'''. Здесь можно указать путь к файлу (относительно ''jboss/standalone/wfe.custom/''),который содержит базовые настройки (вкладок '''Соединение с сервером''' и '''Реквизиты сообщения''') в таком же формате. Это облегчает конфигурирование нескольких обработчиков (общие параметры). Эти параметры имеют меньший приоритет перед заданными в конфигураторе (если заданы).
* '''Файл базовых настроек, расположенный на сервере'''. Здесь можно указать путь к файлу (относительно ''jboss/standalone/wfe.custom/''), который содержит базовые настройки (расположенные на вкладках '''Соединение с сервером''' и '''Реквизиты сообщения''') в таком же формате. Это облегчает конфигурирование нескольких обработчиков (общие параметры). Эти параметры имеют меньший приоритет перед заданными в конфигураторе (если заданы).


[[Image:GpdActionHandler_ru6.png]]
[[Image:GpdActionHandler_ru6.png]]
<BR>


=== Настройки соединения с сервером ===
=== Настройки соединения с сервером ===


В этой вкладке допускается использование переменных в полях формы в виде ${скриптовоеНазваниеПеременной}.
На этой вкладке допускается использование переменных в полях формы в виде ${скриптовоеНазваниеПеременной}:


* '''Протокол отправки''': протокол работы с сервером
* '''Протокол отправки''': протокол работы с сервером
Строка 279: Строка 284:
* '''Использовать аутентификацию''': Исходящий почтовый сервер требует проверки подлинности пользователя
* '''Использовать аутентификацию''': Исходящий почтовый сервер требует проверки подлинности пользователя
* '''Режим трассировки''': если включить - в логи пишется информация о взаимодействии с почтовым сервером
* '''Режим трассировки''': если включить - в логи пишется информация о взаимодействии с почтовым сервером
* '''Дополнительные параметры соединения''' можно задать исходя из всех возможных в javamail.
* '''Дополнительные параметры соединения''' можно задать, исходя из всех возможных в javamail.


[[Image:GpdActionHandler_ru7.png]]
[[Image:GpdActionHandler_ru7.png]]
<BR>


=== Настройки реквизитов сообщения ===
=== Настройки реквизитов сообщения ===


В этой вкладке допускается использование переменных в полях формы в виде ${скриптовоеНазваниеПеременной}.
На этой вкладке допускается использование переменных в полях формы в виде ${скриптовоеНазваниеПеременной}.


Также можно указать email исполнителя с помощью метода: ${GetExecutorEmails(Согласователь)}, где Согласователь может быть пользователем или группой, в т.ч. ролью.
Также можно указать email исполнителя с помощью метода: ${GetExecutorEmails(Согласователь)}, где Согласователь может быть пользователем или группой, в т.ч. ролью.
Строка 293: Строка 300:
* '''Копия''': email-адрес для отправки копии.  
* '''Копия''': email-адрес для отправки копии.  


Дополнительные параметры сообщения можно задать исходя из всех возможных в javamail.
Дополнительные параметры сообщения можно задать, исходя из всех возможных в javamail.


[[Image:GpdActionHandler_ru8.png]]
[[Image:GpdActionHandler_ru8.png]]
<BR>


=== Настройки тела сообщения ===
=== Настройки тела сообщения ===
Строка 311: Строка 320:
===== В теле сообщения обработчика также доступны контекстные переменные =====
===== В теле сообщения обработчика также доступны контекстные переменные =====


'''Интерактивная форма''' (${interaction}, ru.runa.wfe.form.Interaction) - только если обработчик помещён на узле-действии
'''Интерактивная форма''' (${interaction}, ru.runa.wfe.form.Interaction) - только если обработчик помещён на узле-действии:


  Использовать проверку в браузере ${interaction.useJSValidation?string("да", "нет")}
  Использовать проверку в браузере ${interaction.useJSValidation?string("да", "нет")}
Строка 317: Строка 326:
  Код формы ${interaction.formData} (byte[])
  Код формы ${interaction.formData} (byte[])


'''Задание''' (${task}, ru.runa.wfe.task.Task) - только если обработчик помещён на узле-действии
'''Задание''' (${task}, ru.runa.wfe.task.Task) - только если обработчик помещён на узле-действии:


  ID ${task.id}
  ID ${task.id}
Строка 327: Строка 336:
  Дата создания     ${task.createDate?datetime}
  Дата создания     ${task.createDate?datetime}
  Срок выполнения (deadline)    ${task.deadlineDate?datetime}
  Срок выполнения (deadline)    ${task.deadlineDate?datetime}
 
'''Экземпляр процесса''' (${process}, ru.runa.wfe.execution.Process)
'''Экземпляр процесса''' (${process}, ru.runa.wfe.execution.Process):


  ID ${process.id}
  ID ${process.id}
Строка 335: Строка 344:
  Иерархия подпроцессов ${process.hierarchyIds}
  Иерархия подпроцессов ${process.hierarchyIds}


'''Определение процесса''' (${process.deployment}, ru.runa.wfe.definition.Deployment)
'''Определение процесса''' (${process.deployment}, ru.runa.wfe.definition.Deployment):


  ID ${process.deployment.id}
  ID ${process.deployment.id}
Строка 346: Строка 355:
===== В теле сообщения бота также доступны контекстные переменные =====
===== В теле сообщения бота также доступны контекстные переменные =====


'''Интерактивная форма''' (${interaction}, ru.runa.wfe.form.Interaction)
'''Интерактивная форма''' (${interaction}, ru.runa.wfe.form.Interaction):


  Использовать проверку в браузере ${interaction.useJSValidation?string("да", "нет")}
  Использовать проверку в браузере ${interaction.useJSValidation?string("да", "нет")}
Строка 352: Строка 361:
  Код формы ${interaction.formData} (byte[])
  Код формы ${interaction.formData} (byte[])


'''Задание''' (${task}, ru.runa.wfe.task.dto.WfTask)
'''Задание''' (${task}, ru.runa.wfe.task.dto.WfTask):


  ID ${task.id}
  ID ${task.id}
  ID задания ${task.nodeId}
  ID задания ${task.nodeId}
  ID процесса ${task.processId}
  ID процесса ${task.processId}
  ID определение процесса ${task.deploymentId}
  ID определение процесса ${task.deploymentId}
  Название определение процесса ${task.definitionName}
  Название определение процесса ${task.definitionName}
  Название ${task.name}
  Название ${task.name}
Строка 365: Строка 374:
  Дата создания     ${task.creationDate?datetime}
  Дата создания     ${task.creationDate?datetime}
  Срок выполнения (deadline)    ${task.deadlineDate?datetime}
  Срок выполнения (deadline)    ${task.deadlineDate?datetime}
  Срок выполнения на исходе (90%) ${task.deadlineWarningDate?datetime}
  Срок выполнения на исходе (90%) ${task.deadlineWarningDate?datetime}


=== Настройки в XML ===
=== Настройки в XML ===
Строка 372: Строка 381:


[[Image:GpdActionHandler_ru10.png]]
[[Image:GpdActionHandler_ru10.png]]
<BR>


=== Кнопки ===
=== Кнопки ===
Строка 378: Строка 389:
* '''Копировать''': копирование конфигурации в буфер обмена (как Ctrl-C)
* '''Копировать''': копирование конфигурации в буфер обмена (как Ctrl-C)
* '''Ок''':  сохранение конфигурации
* '''Ок''':  сохранение конфигурации
* '''Отмена''' редактирования
* '''Отмена''' редактирования.
 


<BR>


=== {{Title|SendEmailGmailExample|Пример использования smtp.gmail.com в качестве сервера исходящей почты}} ===
=== {{Title|SendEmailGmailExample|Пример использования smtp.gmail.com в качестве сервера исходящей почты}} ===
Строка 399: Строка 410:
     <param name="mail.smtps.ssl.trust" value="smtp.gmail.com"/>
     <param name="mail.smtps.ssl.trust" value="smtp.gmail.com"/>


{{Note|Если название компьютера содержит неподдерживаемые символы (например кириллицу) для отправки команд SMTP HELO, EHLO, может помочь параметр}}
{{Note|Если название компьютера содержит неподдерживаемые символы (например, кириллицу), то для отправки команд SMTP HELO, EHLO может помочь параметр}}


  <param name="mail.smtp.localhost" value="localhost"/>
  <param name="mail.smtp.localhost" value="localhost"/>
Строка 418: Строка 429:




Откройте сформированный '''mail-smtp.cer''' и удалите все что до -----BEGIN CERTIFICATE----- и после -----END CERTIFICATE----- , сохраните изменения.
Откройте сформированный '''mail-smtp.cer''' и удалите всё, что до -----BEGIN CERTIFICATE----- и после -----END CERTIFICATE-----, сохраните изменения.




[[Image:EmailActionHandler_openssl2.png]]
[[Image:EmailActionHandler_openssl2.png]]


Скопируйте полученный сертификат в JAVA_HOME


Перейти в JAVA_HOME и выполните
Скопируйте полученный сертификат в JAVA_HOME.
 
Перейдите в JAVA_HOME и выполните


  C:\Program Files (x86)\Java\jdk1.7.0_01>keytool -import -alias smtp.gmail.com -file mail-smtp.cer -keystore .\jre\lib\security\jssecacerts
  C:\Program Files (x86)\Java\jdk1.7.0_01>keytool -import -alias smtp.gmail.com -file mail-smtp.cer -keystore .\jre\lib\security\jssecacerts
Строка 433: Строка 445:




Будет выполнен импорт сертификата в хранилище ключей, требуется перезапуск приложения.
Будет выполнен импорт сертификата в хранилище ключей, потребуется перезапуск приложения.
 
<BR>


=={{Title|ActorNameActionHandler|ActorNameActionHandler (не рекомендуется к использованию {{Since|4.0.0}}, используйте GetExecutorInfoHandler)}}==
=={{Title|ActorNameActionHandler|ActorNameActionHandler (не рекомендуется к использованию {{Since|4.0.0}}, используйте GetExecutorInfoHandler)}}==
Строка 447: Строка 461:
* name - логин сотрудника
* name - логин сотрудника


* full name - полное имя сотрудника
* full name - полное имя сотрудника.


И указать название переменной, в которую будет записан результат работы обработчика.
И указать название переменной, в которую будет записан результат работы обработчика.
<BR>


== {{Title|BotInvoker|BotInvokerActionHandler}} ==
== {{Title|BotInvoker|BotInvokerActionHandler}} ==
Строка 475: Строка 491:
== {{Title|ExcelWordHandlers|Обработчики Excel/Word}} ==  
== {{Title|ExcelWordHandlers|Обработчики Excel/Word}} ==  


Сюда входят обработчики, предназначенные для работы с xlsx и docx файлами. Данные обработчики построены на основе библиотеки Apache POI.  
Сюда входят обработчики, предназначенные для работы с '''XLSX''' и '''DOCX''' файлами. Данные обработчики построены на основе библиотеки Apache POI.  
 
Apache POI — это библиотека на языке Java для чтения и записи документов,таких как Excel, PowerPoint и Word.
 
Для чтения данных из xlsx файлов используется обработчик office.excel.handler.ExcelReadHandler, для  записи -  office.excel.handler.ExcelSaveHandler. Для работы с файлами DOCX используется обработчик office.doc.DocxHandler


Apache POI — это библиотека на языке Java для чтения и записи документов,таких как '''Excel''', '''PowerPoint''' и '''Word'''.


Для чтения данных из '''XLSX'''-файлов используется обработчик '''office.excel.handler.ExcelReadHandler''', для  записи -  '''office.excel.handler.ExcelSaveHandler'''. Для работы с файлами '''DOCX''' используется обработчик '''office.doc.DocxHandler'''.


=== excel.handler.ExcelReadHandler ===
=== excel.handler.ExcelReadHandler ===


Позволяет выполнять чтение данных из xlsx файлов.
Позволяет выполнять чтение данных из '''XLSX''' файлов.
Для настройки параметров обработчика используется следующая форма:
Для настройки параметров обработчика используется следующая форма:


[[Image:excel_read_pic1_1.png]]
[[Image:excel_read_pic1_1.png]]


“Входной файл” – здесь задается полный путь к файлу, либо файловая переменная, указывающая на данный файл, например:
'''“Входной файл”''' – здесь задается полный путь к файлу либо файловая переменная, указывающая на данный файл, например:


[[Image:excel_read_pic2.png]]
[[Image:excel_read_pic2.png]]
Строка 497: Строка 511:




“Добавить ячейку” – добавляет параметры для чтения данных из отдельной ячейки:
'''“Добавить ячейку”''' – добавляет параметры для чтения данных из отдельной ячейки:


1) “Переменная” – в которую будет считано значение из ячейки  
1) “Переменная” – в которую будет считано значение из ячейки  
Строка 506: Строка 520:




“Добавить горизонтально”/ “Добавить вертикально” – добавляет параметры для чтения массивов данных по горизонтали и вертикали соответственно:
'''“Добавить горизонтально”/ “Добавить вертикально”''' – добавляет параметры для чтения массивов данных по горизонтали и вертикали соответственно:


1) “Переменная” – переменная массив формата "Список", в который будет считаны данные
1) “Переменная” – переменная массив формата "Список", в который будет считаны данные
Строка 538: Строка 552:
=== excel.handler.ExcelSaveHandler ===
=== excel.handler.ExcelSaveHandler ===


Используется для записи данных в файл xlsx,имеет форму для конфигурирования параметров:
Используется для записи данных в файл '''XLSX''', имеет форму для конфигурирования параметров:


[[Image:excel_save_pic1.png]]
[[Image:excel_save_pic1.png]]
Строка 544: Строка 558:
Описание параметров:
Описание параметров:


“Входной файл” – представляет собой шаблон документа, на основе которого будет создан выходной файл. Данный параметр можно задать как с помощью файловой переменной или полного пути к файлу, так и создать шаблон непосредственно в бизнес-процессе или импортировать шаблон в бизнес-процесс.
'''“Входной файл”''' – представляет собой шаблон документа, на основе которого будет создан выходной файл. Данный параметр можно задать как с помощью файловой переменной или полного пути к файлу, так и создать шаблон непосредственно в бизнес-процессе или же импортировать шаблон в бизнес-процесс.


Например, если шаблон имеет следующий вид:
Например, если шаблон имеет следующий вид:
Строка 554: Строка 568:
[[Image:excel_save_pic3.png]]
[[Image:excel_save_pic3.png]]


“Выходной файл” – результирующий файл, в который будут записаны данные. Здесь отдельно задается имя файла и путь, но можно также использовать файловую переменную, например:
'''“Выходной файл”''' – результирующий файл, в который будут записаны данные. Здесь отдельно задается имя файла и путь, но можно также использовать файловую переменную, например:


[[Image:excel_save_pic4.png]]
[[Image:excel_save_pic4.png]]


“Добавить ячейку”, “Добавить горизонтально”, “Добавить вертикально” – добавляет параметры для записи переменной в отдельную ячейку, массива в область по горизонтали и массива по вертикали соответственно. Параметры и возможные значения, такие же как и в конфигураторе для обработчика excel.handlers.ReadHandler.  
Ссылки '''“Добавить ячейку”''', '''“Добавить горизонтально”''', '''“Добавить вертикально”''' добавляют параметры для записи переменной в отдельную ячейку, массива в область по горизонтали и массива в область по вертикали соответственно. Параметры и возможные значения такие же как и в конфигураторе для обработчика excel.handlers.ReadHandler.  


Например:
Например:
Строка 566: Строка 580:
[[Image:excel_save_pic6_1.png]]
[[Image:excel_save_pic6_1.png]]


В качестве входного файла (шаблона) задан файл c:/in/sample.xls, на основе его будет создан файл c:/out/Result.xls, на страницу Sheet1 запишутся:
В качестве входного файла (шаблона) задан файл c:/in/sample.xls, на основе его будет создан выходной файл c:/out/Result.xls, на страницу Sheet1 которого запишутся:


* переменная “Ячейка1” по адресу столбец 1: строка 1
* переменная “Ячейка1” по адресу столбец 1: строка 1
Строка 583: Строка 597:
=== doc.DocxHandler ===
=== doc.DocxHandler ===


Данный обработчик предназначен для работы с файлами docx на основе шаблона.
Данный обработчик предназначен для работы с файлами '''DOCX''' на основе шаблона (подробнее смотрите [[DocxTemplateHandler|'''Описание синтаксиса шаблонов''']]).
 
[[DocxTemplateHandler|'''Описание синтаксиса шаблонов''']]


Конфигуратор обработчика имеет следующий вид:
Конфигуратор обработчика имеет следующий вид:
Строка 591: Строка 603:
[[Image:docx_descr_pic1_1.png]]
[[Image:docx_descr_pic1_1.png]]


* “Входной файл” – файл шаблона, на основе которого формируется выходной docx файл. Задается с помощью файловой переменной или полного пути к файлу. Также существует возможность создать/импортировать файл шаблона непосредственно в бизнес-процесс  
* '''“Входной файл”''' – файл шаблона, на основе которого формируется выходной '''DOCX'''-файл. Задается с помощью файловой переменной или полного пути к файлу. Также существует возможность создать/импортировать файл шаблона непосредственно в бизнес-процесс  


* “Выходной файл” – здесь вводится “Имя файла”, и “Каталог” в котором необходимо создать docx файл. Но также как и в случае входного файла, можно использовать и файловую переменную  
* '''“Выходной файл”''' – здесь вводится “Имя файла” и “Каталог”, в котором необходимо создать '''DOCX'''-файл. Но также, как и в случае входного файла, можно использовать и файловую переменную  


* “Выдавать ошибку в случае несоответствия шаблона” – при установке данного параметра, будет производится проверка входного файла (шаблона) на соответствие с конфигурацией, в случае отсутствия каких либо переменных или несоответствия имен, в ходе выполнения данного обработчика – будет выдаваться ошибка, и выходной файл сформирован не будет.
* '''“Выдавать ошибку в случае несоответствия шаблона”''' – при установке данного параметра будет производится проверка входного файла (шаблона) на соответствие с конфигурацией. В случае отсутствия каких-либо переменных или несоответствия имен в ходе выполнения данного обработчика – будет выдаваться ошибка и выходной файл сформирован не будет.
 
<BR>


== {{Title|CreateCalendarHandler|Создать переменную даты}} ==  
== {{Title|CreateCalendarHandler|Создать переменную даты}} ==  
Класс: '''ru.runa.wfe.extension.handler.var.CreateCalendarHandler'''
Класс: '''ru.runa.wfe.extension.handler.var.CreateCalendarHandler'''


Проводит операции с переменной даты: установление или добавление времени.
Проводит операции с переменной формата Дата и Время: установление или добавление времени.
В конфигурации в качестве числа можно указать целочисленную переменную в формате ${переменная}.
В конфигурации в качестве числа можно указать целочисленную переменную в формате ${переменная}.
Для операции добавления разрешается использовать рабочее время с учетом [[BusinessCalendar|бизнес-календаря]].
Для операции добавления разрешается использовать рабочее время с учетом [[BusinessCalendar|бизнес-календаря]].
<BR>


== {{Title|AddReadProcessPermissionsHandler|Добавить права на чтение процесса}} ==
== {{Title|AddReadProcessPermissionsHandler|Добавить права на чтение процесса}} ==
Класс: '''ru.runa.wfe.extension.handler.process.AddReadProcessPermissionsHandler'''
Класс: '''ru.runa.wfe.extension.handler.process.AddReadProcessPermissionsHandler''' .


Добавляет полномочия на чтение текущего экземпляра процесса указанным исполнителям.  
Добавляет полномочия на чтение текущего экземпляра процесса указанным исполнителям.  
Строка 612: Строка 628:


{| class="prettytable" border="1"  
{| class="prettytable" border="1"  
| '''название'''
| '''Название'''
| '''тип'''
| '''Тип'''
| '''примечание'''
| '''Примечание'''


|-
|-
| Исполнители
| Исполнители
| Один или несколько исполнителей (организованные в списке)
| Один или несколько исполнителей (организованные в списке)
| В случае если полномочия уже имеются - ничего не происходит.
| В случае, если полномочия уже имеются - ничего не происходит.
В случае если переменная не проинициализирована - ничего не происходит.
В случае, если переменная не проинициализирована - ничего не происходит.


|}
|}
<BR>


[[Категория:Документация]]
[[Категория:Документация]]


== Замечания (Николай Васильев) ==
== Замечания (Николай Васильев) ==
# По обработчику GroovyActionHandler: <BR> 1) Из описания не понятно, как использовать этот обработчик <BR> 2) Замечание и последний абзац двусмысленны и не понятно, какой смысл они несут <BR> 3) Я создал простейший процесс с узлом-сценарием, поместил в обработчик приведённый в разделе скрипт, запустил процесс в Симуляторе. Выдана ошибка. Мб, лучше предоставить обучаемому работающий скрипт? Пусть человек увидит один из вариантов исправной работы. Иначе как он разберётся с его использованием? <BR> 4) Необходимо снабдить раздел подробным описанием работы обработчика на приведённом примере. Иначе в данном объёме описание почти бесполезно. Раздел ExecuteFormulaActionHandler имеет пространное описание неплохого качества. Пректрасный пример для подражания! <BR> 5) Необходима ссылка на документ, объясняющий как отыскать и интерпретировать ошибку при выполнении.  
# По обработчику GroovyActionHandler: <BR> 1) Из описания не понятно, как использовать этот обработчик <BR> 2) Замечание и последний абзац двусмысленны и не понятно, какой смысл они несут <BR> 3) Я создал простейший процесс с узлом-сценарием, поместил в обработчик приведённый в разделе скрипт, запустил процесс в Симуляторе. Выдана ошибка. Мб, лучше предоставить обучаемому работающий скрипт? Пусть человек увидит один из вариантов исправной работы. Иначе как он разберётся с его использованием? <BR> 4) Необходимо снабдить раздел подробным описанием работы обработчика на приведённом примере. Иначе в данном объёме описание почти бесполезно. Раздел ExecuteFormulaActionHandler имеет пространное описание неплохого качества. Пректрасный пример для подражания! <BR> 5) Необходима ссылка на документ, объясняющий как отыскать и интерпретировать ошибку при выполнении.  
# Для обработчика ExecuteFormulaActionHandler после фразы "Например, функции могут быть такими:" желательно также дать ссылку на документ с каталогом используемых функций.
# Для обработчика ExecuteFormulaActionHandler после фразы "Например, функции могут быть такими:" желательно также дать ссылку на документ с каталогом используемых функций.
# Для обработчика SQLActionHandler необходимо все примеры прогнать на реальном SQL-сервере.

Текущая версия на 20:43, 12 ноября 2024

Руководство по работе с обработчиками

Версия 4.6.0

© 2015-2023, ООО "Процессные технологии"


# GroovyActionHandler

Данный action handler используется для пересчета значений переменных бизнес процесса.

Пример конфигурации:

My_date = new java.util.Date();
My_rnd = new java.util.Random(1000).nextInt();
My_time = java.lang.System.currentTimeMillis();
int n = Integer.parseInt(multNumber);
String[] array = new String[n];
for (int i=0; i < n; i++) {
    array[i] = "book "+i;
};
multArray = array;

Измененные в процессе исполнения скрипта переменные изменят свое значение в БП. Будут изменены лишь переменные, определенные в процессе!

Конфигурацией является корректный код Groovy (подробнее), который по синтаксису идентичен Java.

Замечание: В версии RunaWFE 4.3.0 в обработчике Groovy была добавлена возможность присваивания роли переменных формата Список(Исполнитель), Список(Пользователь), Список(Группа). В этом случае роль инициализируется временной группой, содержащей исполнителей из переменной соответствующего списка.

Роль1 = list;

Удаление временных групп выполняется с учетом значений параметров timertask.period.millis.remove.temp.groups, timertask.start.millis.remove.temp.groups.

Также доступна возможность копирования списка исполнителей и в переменную формата "Исполнитель".


# ExecuteFormulaActionHandler

ExecuteFormula – универсальный ActionHandler, предназначенный для изменения значений переменных бизнес процесса. Для показа работы данного обработчика был разработан демо процесс ExecuteFormulaDemo. Обработчики располагаются в узлах-сценария. При наведении курсора мыши на узел-сценария будет показан обработчик, используемый в его конфигурации. Для редактирования формул необходимо выбрать пункт «Конфигурация» в свойствах обработчика:

GpdActionHandler ru4.png


Появится окно, в котором надо задать формулы вида : 'имя модифицируемой переменной' = выражение:

GpdActionHandler ru5.png


В выражении могут использоваться операции: +, -, *, /, <, <=, ==, !=, >, >=, &, |, ^.

Наибольший приоритет (4) у умножения и деления. Приоритет 3 у операций сложения и вычитания. Приоритет 2 у операций сравнения. Наименьшим приоритетом обладают булевы операции «&» (and), «|» (or) и «^» (xor).


Если имя используемой в выражении переменной содержит пробелы, то его нужно заключить в одинарные кавычки (апострофы).


Помимо переменных могут использоваться непосредственные значения форматов Long, Double, Boolean, String, Date и функции.

Функции общего применения

Например, функции могут быть такими:

  • date(дата) округляет дату до целого числа дней, отбрасывая время
  • time(дата) отбрасывает дни, оставляя только время
  • hours_round_up(число) округляет время, заданное в минутах, до часов в верхнюю сторону
  • round(число) или round(число, количество знаков после запятой) округляет число в ближайшую сторону, оставляя фиксированное количество знаков после запятой
  • round_up(число) или round_up(число, количество знаков после запятой) округляет число в большую сторону
  • round_down(число) или round_down(число, количество знаков после запятой) округляет число в меньшую сторону
  • number_to_string_ru(число) переводит число в строку на русском языке
  • number_to_string_ru(число, п2, п3, п4, п5) переводит число с зависимым словом в строку на русском языке
  • number_to_short_string_ru(число, п2, п3, п4, п5) выбирает соответствующую числу форму зависимого слова
  • get_process_id() возвращает номер текущего экземпляра процесса
  • random() возвращает случайное вещественное число от 0 до 1.

Где:

п2 — 'M' или 'F' — мужской/женский род зависимого слова
п3, п4, п5 — зависимое слово в трех формах (например:день, дня, дней).


Пример присваивания значений переменным:

variable1 = 2
variable2 = 3.1415926535
variable3 = true
variable4 = «string»
variable5 = « \» » (для использования символа кавычки требуется поставить перед ней '\' )
variable6 = 01.09.2008
variable7 = '01.09.08 18:00' (здесь требуется заключить дату в одинарные кавычки, так как она содержит пробелы)
variable8 = round_up(2.564367, 3) (variable8 = 2.565)
variable9 = number_to_string_ru(102, «F», «спичка», «спички», «спичек») (variable9 = «сто две спички»)
"текущая дата" = current_date()
"время" = current_time()
"дата и время" = current_date_time()


Функция для работы с ФИО

  • FIO_case_ru(String fio, int caseNumber, String mode)

Где:

fio - фамилия, имя и отчество в именительном падеже через пробел
caseNumber - номер падежа (от 1 до 6)
mode - строка форматирования. 

Правила использования символов форматирования:

  • Символы F, I и O заменяются на фамилию, имя или отчество в соответствующем падеже
  • Символы f, i и o заменяются на первую букву фамилии, имени или отчества
  • Все другие символы транслируются в выходную строку без изменений.


Примеры использования:

FIO_case_ru("Иванов Иван Иванович", 1, "F I O :)")    //Иванов Иван Иванович :) 
FIO_case_ru("Иванова Ира Ивановна", 2, "F I o")       //Ивановой Иры И. 
FIO_case_ru("Иванов Иван Иванович", 3, "F i O")       //Иванову И. Ивановичу 
FIO_case_ru("Иванова Ира Ивановна", 4, "F i o")       //Иванову И. И. 
FIO_case_ru("Иванов Иван Иванович", 5, "f I O")       //И. Иваном Ивановичем 
FIO_case_ru("Иванова Ира Ивановна", 6, "о I o")       //о Ире И. 
FIO_case_ru("Апырвапыркина Фыва Няковна", 5, "F I O") //Апырвапыркиной Фывой Няковной. 


Если функция неправильно склоняет какие-либо имена и фамилии, можно добавить исключение. Для этого воспользуйтесь механизмом расширения - создайте конфигурационный файл nameCaseConf.xml и расположите его в директории ..\standalone\wfe.custom (если директория wfe.custom не существует, то создать). Например, для Windows версии RunaWFE, файл должен быть помещен в C:\Program Files\RunaWFE\Simulation\standalone\wfe.custom\.


Формат файла:

<?xml version=”1.0”>
<nameCaseConf>
 <family value = “фамилия в именительном падеже”>
   <rule case = “номер падежа”>правильный вариант фамилии</rule>
   <rule case = “номер падежа”>правильный вариант фамилии</rule>
     …
 </family>
 <family value = “фамилия в именительном падеже”>
   …
 </family>
 <name value = “имя в именительном падеже”>
   <rule case = “номер падежа”>правильный вариант имени</rule>
     …
 </name>
 <parent value = “отчество в именительном падеже”>
   <rule case = “номер падежа”>правильный вариант отчества</rule>
     …
 </name>
 …
</nameCaseConf>


Пример файла конфигурации:

<?xml version="1.0" encoding="UTF-8"?>
<nameCaseConf>
  <!-- <name value="Николай">
  </name> -->
  <family value="Кримза">
    <rule case="2">Кримзы</rule>
    <rule case="3">Кримзе</rule>
    <rule case="4">Кримзу</rule>
    <rule case="5">Кримзой</rule>
    <rule case="6">Кримзе</rule>
  </family>
  <!-- <parent value="Петрович">
  </parent> -->
</nameCaseConf>


В версии RunaWFE 4.3.0 в обработчик ExecuteFormula была добавлена возможность склонения на основе файла с данными. Создайте файл mappingConf.xml и расположите его в директории ..\standalone\wfe.custom (если директория wfe.custom не существует, то создать). Например, для Windows версии RunaWFE, файл должен быть помещен в C:\Program Files\RunaWFE\Simulation\standalone\wfe.custom\}.

Формат файла mappingConf.xml:

<?xml version="1.0" encoding="UTF-8"?>
<mappingConf>
  <rule title="должность в дательном падеже">
    <item input="Бухгалтер" output="Бухгалтеру" />
    <item input="Ведущий геофизик" output="Ведущему геофизику" />
    <item input="Геодезист 1 категории" output="Геодезисту 1 категории" />
    <item input="Главный специалист по геологии" output="Главному специалисту по геологии" />
  </rule>
</mappingConf>

После этого в конфигурации обработчика можно будет использовать следующую конструкцию для склонения:

some_variable = mapping("Бухгалтер", "должность в дательном падеже")

Функции для работы со списками

  • ListToString(list1) соединяет список в одну строку. Можно указать опциональный 2-й аргумент - разделитель строк. Если разделитель строк не задан, то разделителем по умолчанию буде пробел
  • GetListMatchedIndexes(Список1, Аргумент2) возвращает список СписокПозиций, содержащий целые числа, представляющие собой номера позиций в Список1 таких, что для каждого элемента из Список1, позиция которого содержится в списке СписокПозиций, во втором аргументе (может быть списком или объектом другого простого формата) существует совпадающий с ним элемент в любой позиции
  • GetListMismatchedIndexes(Список1, Список2) возвращает список СписокПозиций, содержащий целые числа, представляющие собой номера позиций в Список1 таких, что для каждого элемента из Список1, позиция которого содержится в списке СписокПозиций, в списке Список2 не существует совпадающего с ним элемента
  • CreateSubListByIndexes(Список1, СписокПозиций2) возвращает список СписокПоПозициям, содержащий элементы списка Список1, позиции которых содержатся в списке СписокПозиций2
  • DeleteListElementsByIndexes(Список1, СписокПозиций2) возвращает копию списка Список1 с удалёнными из неё элементами, номера позиций которых содержатся в списке СписокПозиций2
  • ToList(аргументы...) возвращает список из аргументов
  • GetSize(container) возвращает целое число, соответствующее количеству элементов в списке или карте.


# SQLActionHandler

Используется для взаимодействия с БД.

С помощью этого обработчика можно создать запрос, выполняющий чтение из БД в переменные БП, или, наоборот, запись в БД значений переменных БП. В одном обработчике возможно выполнить несколько запросов.

Формирование SQL-запроса

Диалог конфигурации для данного обработчика выглядит следующим образом:

Process-editor User guide ru 49d2.png


В версии RunaWFE 4.4.1 была добавлена возможность использования не только JNDI-источника данных:

  • "Источник данных (JNDI Name)" – имя источника данных, зарегистрированного на сервере (для WildFly, как правило, используется с префиксом java:/)
  • "Переменная с JNDI-именем" – переменная, содержащая JNDI-имя источника, зарегистрированного на сервере
  • "Имя источника данных" – здесь доступен выбор из определенных в DevStudio источников данных (см. "Источники данных")
  • "Переменная с именем" – переменная, содержащая имя источника данных.

SQL-запрос – собственно сам запрос (в формате java.sql.PreparedStatement).

В версии RunaWFE 4.4.1 писать SQL запрос стало значительно удобнее – запрос теперь может занимать более одной строки; также была введена подсветка синтаксиса SQL.

Синтаксис запроса включает текст запроса, в котором места параметров отмечаются знаками "?", количество и порядок которых должно соответствовать числу и порядку следования параметров в секции "Параметры запроса". Если это запрос типа SELECT, то он должен явно перечислять столбцы, значения которых будут присвоены переменным, перечисленным в секции "Результаты запроса".

Можно использовать запрос как значение переменной. Для этого нужно указать строку запроса в конфигураторе в виде ${query}, где query – переменная формата "Строка", содержащая сформированный в процессе запрос.

# Выполнение хранимой процедуры MSSQL

Пример создания таблицы и заполнение её данными:

CREATE TABLE dbo.tests (session_id INT NOT NULL, group_id INT NOT NULL) ON [PRIMARY]
GO
INSERT INTO dbo.tests VALUES (1, 10)
INSERT INTO dbo.tests VALUES (2, 20)
INSERT INTO dbo.tests VALUES (3, 30)
GO

Пример создания хранимой процедуры:

CREATE PROCEDURE dbo.test @session_id INT, @group_id INT OUTPUT
AS
SET NOCOUNT ON
SELECT TOP 1 @group_id = group_id FROM dbo.tests WHERE session_id = @session_id
IF(@@ROWCOUNT != 1)
BEGIN
 RETURN -1
END
RETURN 1
GO

Пример вызова процедуры из Management Studio:

DECLARE @resultCode INT, @groupId INT
EXEC @resultCode = dbo.test @session_id = 1, @group_id = @groupId OUTPUT
SELECT @resultCode, @groupId

Пример задания конфигурации в процессе Файл:SqlProcedureTest.par:

SqlExecuteStoredProcedure.png


# AssignSwimlaneActionHandler

Позволяет (пере)определить роль в любом месте процесса по заданной конфигурации. Значение инициализатора имеет такой же синтаксис, как и на вкладке редактирования ролей.


# SendEmailActionHandler

Позволяет послать сообщение по e-mail. Сообщением может быть форма задания, если обработчик установлен на узле, а не на переходе. Альтернативным вариантом отправки сообщения является использование бота SendEmailTaskHandler. Формат файла конфигурации для него не отличается от формата конфигурации для SendEmailActionHandler (за исключением контекстной мета-информации).

Для создании конфигурации SendEmailActionHandler используется специальный конфигуратор. Для того, чтобы открыть конфигуратор, необходимо создать обработчик, выбрав класс ru.runa.wfe.extension.handler.SendEmailActionHandler из списка доступных обработчиков, и начать редактирование конфигурации. Текст файла конфигурации в формате xml можно посмотреть на вкладке "XML" диалогового окна конфигуратора. Для отправки сообщения используется JavaMail, таблицы параметров внутри API пакетов по ссылке.

Начиная с версии 4.2 осуществляется гарантированная доставка сообщений с помощью JMS.


Общие настройки

  • Не продолжать выполнение процесса при ошибке отправки. При ошибке обработки конфигурации выполнение процесса не проходит дальше (транзакция откатывается к предыдущей точке).
  • Файл базовых настроек, расположенный на сервере. Здесь можно указать путь к файлу (относительно jboss/standalone/wfe.custom/), который содержит базовые настройки (расположенные на вкладках Соединение с сервером и Реквизиты сообщения) в таком же формате. Это облегчает конфигурирование нескольких обработчиков (общие параметры). Эти параметры имеют меньший приоритет перед заданными в конфигураторе (если заданы).

GpdActionHandler ru6.png


Настройки соединения с сервером

На этой вкладке допускается использование переменных в полях формы в виде ${скриптовоеНазваниеПеременной}:

  • Протокол отправки: протокол работы с сервером
  • Адрес сервера: IP адрес или название узла почтового сервера
  • Порт сервера: Порт почтового сервера
  • Использовать аутентификацию: Исходящий почтовый сервер требует проверки подлинности пользователя
  • Режим трассировки: если включить - в логи пишется информация о взаимодействии с почтовым сервером
  • Дополнительные параметры соединения можно задать, исходя из всех возможных в javamail.

GpdActionHandler ru7.png


Настройки реквизитов сообщения

На этой вкладке допускается использование переменных в полях формы в виде ${скриптовоеНазваниеПеременной}.

Также можно указать email исполнителя с помощью метода: ${GetExecutorEmails(Согласователь)}, где Согласователь может быть пользователем или группой, в т.ч. ролью.

  • Заголовок: заголовок сообщения
  • Кому: email-адрес для отправки сообщения
  • Копия: email-адрес для отправки копии.

Дополнительные параметры сообщения можно задать, исходя из всех возможных в javamail.

GpdActionHandler ru8.png


Настройки тела сообщения

  • Использовать форму узла-действия: Чек-бокс доступен, если обработчик находится в узле, в этом узле определена форма и эта форма имеет тип FTL (freemarker)
  • Вставить переменную: Ссылка для облегчения вставки значения переменной в текст сообщения. В тексте формы можно использовать полноценный синтаксис freemarker (можно его скопировать из FTL-формы), можно делать inline-вложения рисунков в письме
  • Прикрепленные файлы: позволяет добавлять аттачменты к письму из переменных формата Файл.

GpdActionHandler ru9.png

# Что можно использовать в теле сообщения

В теле сообщения можно использовать все переменные БП по скриптовому названию.

В теле сообщения обработчика также доступны контекстные переменные

Интерактивная форма (${interaction}, ru.runa.wfe.form.Interaction) - только если обработчик помещён на узле-действии:

Использовать проверку в браузере	${interaction.useJSValidation?string("да", "нет")}
Список обязательных переменных		${interaction.requiredVariableNames}
Код формы	 			${interaction.formData} (byte[])

Задание (${task}, ru.runa.wfe.task.Task) - только если обработчик помещён на узле-действии:

ID					${task.id}
ID задания				${task.nodeId}
Название 				${task.name}
Описание 				${task.description}
Название роли    			${task.swimlane.name}
Исполнитель				${task.executor.label}
Дата создания		    		${task.createDate?datetime}
Срок выполнения (deadline)    		${task.deadlineDate?datetime}

Экземпляр процесса (${process}, ru.runa.wfe.execution.Process):

ID					${process.id}
Дата запуска				${process.startDate?datetime}
Дата завершения 			${process.endDate?datetime} (только для асинхронных заданий)
Иерархия подпроцессов			${process.hierarchyIds}

Определение процесса (${process.deployment}, ru.runa.wfe.definition.Deployment):

ID					${process.deployment.id}
Версия					${process.deployment.version}
Название				${process.deployment.name}
Описание				${process.deployment.description}
Категория				${process.deployment.category}
Загружено в систему			${process.deployment.createDate?datetime}
В теле сообщения бота также доступны контекстные переменные

Интерактивная форма (${interaction}, ru.runa.wfe.form.Interaction):

Использовать проверку в браузере	${interaction.useJSValidation?string("да", "нет")}
Список обязательных переменных		${interaction.requiredVariableNames}
Код формы	 			${interaction.formData} (byte[])

Задание (${task}, ru.runa.wfe.task.dto.WfTask):

ID					${task.id}
ID задания				${task.nodeId}
ID процесса				${task.processId}
ID определение процесса			${task.deploymentId}
Название определение процесса		${task.definitionName}
Название 				${task.name}
Описание 				${task.description}
Название роли    			${task.swimlaneName}
Исполнитель				${task.owner.label}
Дата создания		    		${task.creationDate?datetime}
Срок выполнения (deadline)    		${task.deadlineDate?datetime}
Срок выполнения на исходе (90%)		${task.deadlineWarningDate?datetime}

Настройки в XML

Здесь отображается конфигурация как она есть в реальности.

GpdActionHandler ru10.png


Кнопки

  • Отправить тестовое письмо: отправка письма в соответствии с указанными параметрами, непосредственно из Среды разработки. Обратите внимание, что при задании настроек соединения в Файле базовых настроек тестовое сообщение отправлено не будет.
  • Копировать: копирование конфигурации в буфер обмена (как Ctrl-C)
  • Ок: сохранение конфигурации
  • Отмена редактирования.


# Пример использования smtp.gmail.com в качестве сервера исходящей почты

Заполните параметры обработчика как показано на рисунке ниже:

EmailActionHandler gmail.png


Использование smtp.gmail.com:465 требует других настроек.

   <param name="mail.transport.protocol" value="smtps"/>
   <param name="mail.host" value="smtp.gmail.com"/>
   <param name="mail.smtps.port" value="465"/>
   <param name="mail.smtps.auth" value="true"/>
   <param name="mail.user" value="***@gmail.com"/>
   <param name="mail.password" value="***"/>
   <param name="mail.smtps.ssl.trust" value="smtp.gmail.com"/>

Если название компьютера содержит неподдерживаемые символы (например, кириллицу), то для отправки команд SMTP HELO, EHLO может помочь параметр.

<param name="mail.smtp.localhost" value="localhost"/>
<param name="mail.smtps.localhost" value="localhost"/>

# Установка сертификата в хранилище

Если вы не используете настройку {mail.smtp.ssl.trust, mail.smtps.ssl.trust} - то необходимо импортировать сертификат сервера в хранилище ключей для устранения ошибки

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Для получения сертификата используйте пакет OpenSSL:

openssl s_client -connect smtp.gmail.com:587 -starttls smtp > mail-smtp.cer


EmailActionHandler openssl1.png


Откройте сформированный mail-smtp.cer и удалите всё, что до -----BEGIN CERTIFICATE----- и после -----END CERTIFICATE-----, сохраните изменения.


EmailActionHandler openssl2.png


Скопируйте полученный сертификат в JAVA_HOME.

Перейдите в JAVA_HOME и выполните

C:\Program Files (x86)\Java\jdk1.7.0_01>keytool -import -alias smtp.gmail.com -file mail-smtp.cer -keystore .\jre\lib\security\jssecacerts


EmailActionHandler cert.png


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


# ActorNameActionHandler (не рекомендуется к использованию 4.0.0+, используйте GetExecutorInfoHandler)

Позволяет добавить в переменные процесса логин или полное имя сотрудника по коду или по логину. Для настройки параметров обработчика используется форма.

Process-editor User guide ru 49e.png

Необходимо указать переменную с кодом сотрудника или переменную с логином сотрудника в качестве входящих данных для обработчика. Затем выбрать формат исходящих данных:

  • name - логин сотрудника
  • full name - полное имя сотрудника.

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


# BotInvokerActionHandler

Осуществляет одноразовую активацию бот-станции. Конфигурация содержит адрес сервера бот-станции. В случае не указания конфигурации делается вызов на локальной машине.

# EscalationActionHandler

Выполняет эскалацию (расширение круга исполнителей задачи). Конфигурация содержит полное название класса орг. функции, которая будет использоваться для получения новых исполнителей задачи.

# AddObjectToListActionHandler

Добавляет переменную в список.

# RemoveObjectFromListActionHandler

Удаляет переменную из списка.

# CreateOptionActionHandler

Создает опцию (ru.runa.wf.web.Option) (может быть использована в элементе формы множественный выбор).

# Обработчики Excel/Word

Сюда входят обработчики, предназначенные для работы с XLSX и DOCX файлами. Данные обработчики построены на основе библиотеки Apache POI.

Apache POI — это библиотека на языке Java для чтения и записи документов,таких как Excel, PowerPoint и Word.

Для чтения данных из XLSX-файлов используется обработчик office.excel.handler.ExcelReadHandler, для записи - office.excel.handler.ExcelSaveHandler. Для работы с файлами DOCX используется обработчик office.doc.DocxHandler.

excel.handler.ExcelReadHandler

Позволяет выполнять чтение данных из XLSX файлов. Для настройки параметров обработчика используется следующая форма:

Excel read pic1 1.png

“Входной файл” – здесь задается полный путь к файлу либо файловая переменная, указывающая на данный файл, например:

Excel read pic2.png

Excel read pic3.png


“Добавить ячейку” – добавляет параметры для чтения данных из отдельной ячейки:

1) “Переменная” – в которую будет считано значение из ячейки

2) “Страница” – имя или номер страницы, на которой расположена ячейка

3) “Столбец/Строка” – адрес ячейки (нумерация с 1 до 999999999).


“Добавить горизонтально”/ “Добавить вертикально” – добавляет параметры для чтения массивов данных по горизонтали и вертикали соответственно:

1) “Переменная” – переменная массив формата "Список", в который будет считаны данные

2) “Страница” – так же как и в случае отдельной ячейки, данный параметр задает имя или номер (нумерация с 1) страницы, на которой расположены считываемые данные

3) “Начальный столбец”/“Строка”, “Столбец/Начальная строка” – адрес ячейки, начиная с которой необходимо считывать массив данных (по горизонтали – строка, по вертикали - столбец), нумерация также начинается с “1”.

Например:

Excel read pic4 1.png

Обработчик будет выполнять чтение файла “ввод.xls”, находящегося по адресу \\SRV\nfsshared\ .

Будет считано значение в переменную “Ячейка1” из отдельной ячейки, находящейся на странице с именем “Лист5” по адресу столбец 2, строка 1.

Excel read pic5.png

Будет считан массив “список1”, в который попадут значения из строки 3, начиная со столбца 1. Страница задана по номеру – 1.

Excel read pic6.png

Будет считан массив “список2”, в который попадут значения из столбца 7, начиная со строки 4. Страница – “Sheet1”.

Excel read pic7.png

Также конфигурацию обработчика можно задать и в виде xml, например:

Excel read pic8 1.png

excel.handler.ExcelSaveHandler

Используется для записи данных в файл XLSX, имеет форму для конфигурирования параметров:

Excel save pic1.png

Описание параметров:

“Входной файл” – представляет собой шаблон документа, на основе которого будет создан выходной файл. Данный параметр можно задать как с помощью файловой переменной или полного пути к файлу, так и создать шаблон непосредственно в бизнес-процессе или же импортировать шаблон в бизнес-процесс.

Например, если шаблон имеет следующий вид:

Excel save pic2.png

то результат будет содержать:

Excel save pic3.png

“Выходной файл” – результирующий файл, в который будут записаны данные. Здесь отдельно задается имя файла и путь, но можно также использовать файловую переменную, например:

Excel save pic4.png

Ссылки “Добавить ячейку”, “Добавить горизонтально”, “Добавить вертикально” – добавляют параметры для записи переменной в отдельную ячейку, массива в область по горизонтали и массива в область по вертикали соответственно. Параметры и возможные значения такие же как и в конфигураторе для обработчика excel.handlers.ReadHandler.

Например:

Excel save pic5 1.png

Excel save pic6 1.png

В качестве входного файла (шаблона) задан файл c:/in/sample.xls, на основе его будет создан выходной файл c:/out/Result.xls, на страницу Sheet1 которого запишутся:

  • переменная “Ячейка1” по адресу столбец 1: строка 1

Excel save pic7.png

  • массив “список1” (столбец 2: начальная строка 1):

Excel save pic8.png


  • массив “список2” (начальный столбец 3: строка 1)

Excel save pic9.png

doc.DocxHandler

Данный обработчик предназначен для работы с файлами DOCX на основе шаблона (подробнее смотрите Описание синтаксиса шаблонов).

Конфигуратор обработчика имеет следующий вид:

Docx descr pic1 1.png

  • “Входной файл” – файл шаблона, на основе которого формируется выходной DOCX-файл. Задается с помощью файловой переменной или полного пути к файлу. Также существует возможность создать/импортировать файл шаблона непосредственно в бизнес-процесс
  • “Выходной файл” – здесь вводится “Имя файла” и “Каталог”, в котором необходимо создать DOCX-файл. Но также, как и в случае входного файла, можно использовать и файловую переменную
  • “Выдавать ошибку в случае несоответствия шаблона” – при установке данного параметра будет производится проверка входного файла (шаблона) на соответствие с конфигурацией. В случае отсутствия каких-либо переменных или несоответствия имен в ходе выполнения данного обработчика – будет выдаваться ошибка и выходной файл сформирован не будет.


# Создать переменную даты

Класс: ru.runa.wfe.extension.handler.var.CreateCalendarHandler

Проводит операции с переменной формата Дата и Время: установление или добавление времени. В конфигурации в качестве числа можно указать целочисленную переменную в формате ${переменная}. Для операции добавления разрешается использовать рабочее время с учетом бизнес-календаря.


# Добавить права на чтение процесса

Класс: ru.runa.wfe.extension.handler.process.AddReadProcessPermissionsHandler .

Добавляет полномочия на чтение текущего экземпляра процесса указанным исполнителям.

Параметры

Название Тип Примечание
Исполнители Один или несколько исполнителей (организованные в списке) В случае, если полномочия уже имеются - ничего не происходит.

В случае, если переменная не проинициализирована - ничего не происходит.


Замечания (Николай Васильев)

  1. По обработчику GroovyActionHandler:
    1) Из описания не понятно, как использовать этот обработчик
    2) Замечание и последний абзац двусмысленны и не понятно, какой смысл они несут
    3) Я создал простейший процесс с узлом-сценарием, поместил в обработчик приведённый в разделе скрипт, запустил процесс в Симуляторе. Выдана ошибка. Мб, лучше предоставить обучаемому работающий скрипт? Пусть человек увидит один из вариантов исправной работы. Иначе как он разберётся с его использованием?
    4) Необходимо снабдить раздел подробным описанием работы обработчика на приведённом примере. Иначе в данном объёме описание почти бесполезно. Раздел ExecuteFormulaActionHandler имеет пространное описание неплохого качества. Пректрасный пример для подражания!
    5) Необходима ссылка на документ, объясняющий как отыскать и интерпретировать ошибку при выполнении.
  2. Для обработчика ExecuteFormulaActionHandler после фразы "Например, функции могут быть такими:" желательно также дать ссылку на документ с каталогом используемых функций.
  3. Для обработчика SQLActionHandler необходимо все примеры прогнать на реальном SQL-сервере.