Пример разработки отчета по данным экземпляра БП

# Установка Jaspersoft Studio

Загрузите программное обеспечение Jaspersoft Studio. Для этого перейдите по ссылке и выберите инсталлятор соответствующий вашей операционной системе http://community.jaspersoft.com/project/jaspersoft-studio/releases

# Шаблон отчета. Описание секций

Создадим отчет, соответствующий странице свойств запущенного экземпляра процесса

Jr 1.png

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

Откройте установленный Jaspersoft Studio и создайте новый отчет

Jr 2.png

Выберите шаблон “Blank A4” и нажмите Далее

Jr 3.png

Введите название отчета, например “processVariables” и нажмите Finish

Jr 4.png

Откроется рабочая область Jaspersoft Studio

Jr 5.png

Выбранный ранее шаблон “Blank A4” содержит следующие секции

  • “Title” – заголовок отчета, отображается только на первой странице
  • “Page Header” – секция, которая отображается на каждой странице
  • “Column Header” – отображение в начале столбца отчета. Не будем использовать данную секцию, кликните по ней левой клавишей мыши и нажмите клавишу Delete.
  • “Detail” – отображается для каждой записи в источнике данных.
  • “Column Footer” – секция для отображения данных в конце столбца отчета. Не будет использоваться, удалите ее.
  • “Page Footer” – секция для отображения данных внизу каждой страницы.

Добавьте в отчет еще две секции Detail. Для этого кликните правой клавишей мыши по разделу Detail и выберите пункт “Add detail band”

Jr 6.png

Jr 7.png

Сохраните отчет (используйте комбинацию клавиш Ctrl+S или соответствующую иконку панели инструментов)

# Работа над заголовком отчета

В качестве входного параметра для формирования отчета будет использоваться Id экземпляра БП.

Перейдите в раздел “Parameters” и создайте новый параметр

Jr 8.png

В “Properties” введите название параметра – “ProcessId”

Id экземпляра БП это целочисленное значение, поэтому в качестве типа задайте “java.lang.Long”

Jr 9.png

Перейдите в палитру элементов и перетащите “Text field” в секцию заголовка (Title)

Jr 10.png

“Text field” – элемент для отображения строки формирующейся динамически

# Источник данных

Отобразим в заголовке: ID экземпляра процесса и имя его определения.

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

Кликните по корневому элементу “processVariables” в панели “Outline”, справа отобразится панель с настройками.

Нажмите кнопку “Edit query, filter and sort”

Jr 11.png

SQL запрос для получения имени определения процесса по id экземпляра БП выглядит следующим образом:

SELECT
    "BPM_PROCESS_DEFINITION"."NAME"
FROM  
    "BPM_PROCESS"
INNER JOIN
   "BPM_PROCESS_DEFINITION"
ON "BPM_PROCESS"."DEFINITION_ID" =  "BPM_PROCESS_DEFINITION"."ID"
WHERE
    "BPM_PROCESS"."ID"= $P{ProcessId}

Добавьте этот запрос в окно “Texts”

Jr 12.png

Запрос возвращает название определения БП. Нажмите “Add” и добавьте новое поле. Введите имя – NAME, тип “java.lang.String”

Jr 13.png

Перейдите на вкладку Parameters и определите входной параметр ProcessId типа java.lang.Long

Jr 14.png

Нажмите ОК.

# Выражение для заголовка

Теперь можно использовать полученное в результате запроса поле Name в ранее добавленном элементе “Text Field” секции Title

Дважды кликните по нему мышью, откроется окно редактора выражений.

В Fields и Parameters должны присутствовать добавленные ранее поле Name и параметр ProcessId, которые можно использовать в выражении.

Jr 15.png

Введите выражение:

"Report on the process '"+ $F{NAME} + "' (id=" + $P{ProcessId}.toString() + ")"

Для добавления в выражение поля или параметра, выделите его в соответствующем списке и дважды кликните по нему мышью.

Для преобразования параметра ProcessId (типа Long) в его строковое представление, используйте метод toString()

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

Jr 16.png

Jr 17.png

# Настройка стиля отображения заголовка

Выделите “Text field” зголовка и перейдите в панель Properties. Здесь можно настроить внешний вид элемента или применить стиль.

В разделе Color задайте цвет текста (Forecolor) и цвет фона (Backcolor)

Jr 18.png

Используйте шрифт “DejaVu Sans”. Это даст возможность корректно отображать кириллицу в отчетах формата pdf.

Задайте выравнивание текста и его размер.

Jr 19.png

Сохраните отчет.

# Секция детальной информации по экземпляру процесса

В секции Detail1 отобразим id, имя, дату запуска, дату завершения, версию и статус процесса.

# Источник данных

Для получения этих значений необходимо создать новый источник данных.

Перейдите в окно “Outline”, вызовите контекстное меню на корневом элементе и выберите “Create DataSet”

Jr 20.png

Дайте имя источнику – “processInfo”, создаем пустой источник (опция empty dataset)

Перейдите в настройки processInfo и нажмите “Edit query, filter and sort options”.

В секцию “Texts” добавьте следующий sql запрос на получение информации о процессе по его id

SELECT "BPM_PROCESS"."ID",  "BPM_PROCESS_DEFINITION"."NAME",
       "BPM_PROCESS"."START_DATE","BPM_PROCESS"."END_DATE",
       "BPM_PROCESS"."VERSION","BPM_PROCESS"."EXECUTION_STATUS"
FROM  
       "BPM_PROCESS"
INNER JOIN
       "BPM_PROCESS_DEFINITION"
ON "BPM_PROCESS"."DEFINITION_ID" =  "BPM_PROCESS_DEFINITION"."ID"
WHERE
       "BPM_PROCESS"."ID"= $P{ProcessId}

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

Jr 21.png

# Элемент List

Отобразим информацию о процессе с помощью элемента List.

Для этого перейдите в палитру графических элементов, выделите List и перетащите его в секцию Detail1.

Будет предложено выбрать источник данных.

Выберите ранее созданный processInfo

Jr 22.png

Jr 23.png

Дважды кликните по добавленному List, будет открыта форма для редактирования.

Расположите на форме уже известные элементы “Static text” и “Text Field” как показано на рисунке ниже.

Jr 24.png

Дважды кликните по каждому добавленному “Static Text” и введите названия параметров процесса,

Jr 25.png

Jr 26.png

В элементы “Text Field” добавьте поля, соответствующие возвращаемым полям запроса “processInfo”

Jr 27.png

Обратите внимание на конструкции вида

$F{EXECUTION_STATUS} == null ? "" :$F{EXECUTION_STATUS}

В приведенном выше примере, выполняется проверка статуса (EXECUTION_STATUS), если значение не задано (равно NULL) то будет отображаться пустая строка “”, иначе значение статуса.

Используйте такие конструкции в полях, которые могут быть не заполнены. В данном случае это “Статус” и “Дата завершения процесса’.

В запросе processInfo присутствует входной параметр processId, его требуется передать в элемент List

Выделите List, перейдите в его параметры на вкладку DataSet и нажмите кнопку Parameters

Jr 28.png

В появившемся окне нажмите Add и выберите из списка параметр processId.

Задайте для него выражение вида

Jr 29.png

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

Кликните на элементе Styles, окна “Outline”, и выберите “Create Style”

Jr 30.png

Создайте два стиля:

1). PropertyName – для элементов с названиями параметров

2). PropertyValue – для элементов, отображающих значения параметров

Jr 31.png

Выделите созданный стиль и перейдите в настройки (Окно Properties).

Задайте цвет фона, выберите шрифт (используйте Deja Vu Sans) и его размер

Jr 32.png

Jr 33.png

Также можно задать отступы, выравнивание текста, границы элементов и т.д.

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

Выделите элемент, перейдите в его свойства, и на вкладке “Appearance” в выпадающем списке Style выберите соответствующий стиль

Jr 34.png

Элемент List примет вид:

Jr 35.png

# Активные задачи

Выведем информацию по активным задачам процесса в виде таблицы с колонками:

  • Состояние
  • Роль
  • Исполнитель
  • Время создания
  • Срок окончания
  • Фактическая длительность
  • Осталось до окончания
  • Время взятия на исполнение

# Источник данных

Создайте новый источник данных “processTasks”

Jr 36.png

Используйте следующий sql запрос для получения данных об активных задачах:

SELECT
       "BPM_TASK"."NAME" as "TASK_NAME", "BPM_TASK"."CREATE_DATE", "BPM_TASK"."DEADLINE_DATE", "EXECUTOR"."NAME" as "EXECUTOR_NAME",  "BPM_SWIMLANE"."NAME" as "SWIMLANE_NAME", q."ASSIGNMENT_DATE"
FROM  
       "BPM_TASK"
INNER JOIN
       "EXECUTOR"
ON "BPM_TASK"."EXECUTOR_ID" =  "EXECUTOR"."ID"
INNER JOIN
       "BPM_SWIMLANE"
ON "BPM_TASK"."SWIMLANE_ID" =  "BPM_SWIMLANE"."ID"
INNER JOIN
(
       SELECT a."ASSIGNMENT_OBJECT_ID", a."NEW_EXECUTOR_NAME", a."ASSIGNMENT_DATE" 
       FROM (
       SELECT "ASSIGNMENT_OBJECT_ID", MAX("IDX") as "IDX_MAX"
       FROM "BPM_AGGLOG_ASSIGNMENTS"
       GROUP BY "ASSIGNMENT_OBJECT_ID"
)r
INNER JOIN "BPM_AGGLOG_ASSIGNMENTS" a
ON a."ASSIGNMENT_OBJECT_ID" = r."ASSIGNMENT_OBJECT_ID" AND a."IDX" = r."IDX_MAX"
)q
ON "BPM_TASK"."ID" = q."ASSIGNMENT_OBJECT_ID"
WHERE
      "BPM_TASK"."PROCESS_ID"= $P{ProcessId}

Добавьте возвращаемые поля «TASK_NAME» , «CREATE_DATE», «DEADLINE_DATE», «EXECUTOR_NAME», «SWIMLANE_NAME», «ASSIGNMENT_DATE» а также параметр ProcessId

Jr 37.png

Jr 38.png

Как видно из запроса и состава возвращаемых полей, здесь отсутствуют такие данные как фактическая длительность задачи и оставшееся время до ее окончания. Эти данные являются вычисляемые исходя из текущего времени и значений полей “Дата создания задачи” (CREATE_DATE), “Срок окончания” (DEADLINE_DATE).

“Фактическая длительность” = CREATE_DATE – “Текущее время”
“Осталось до окончания” = “Текущее время” – DEADLINE_DATE

Создайте новый параметр — DTNow, который будет содержать текущее время

Используйте тип “java.util.Date”

Кликните на иконке напротив строки “Default Value Expression”

Jr 39.png

Введите код:

new Date()

Опция “Is For Prompting” не должна быть установлена, т.к. данный параметр не используется в качестве входного параметра запроса

Jr 40.png

Кроме того, для вычисления интервалов между датами, а также приведения дат к единому (с отображением в RunaWFE) формату, потребуется использование еще одного параметра DataFormatter класса ru.runa.wfe.report.ReportFormatter

Для использования класса ReportFormatter, в проект необходимо добавить библиотеку Файл:Wfe-core-4.3.0-SNAPSHOT.jar

Откройте настройки проекта

Jr 41.png

Выделите “Java Build Path” и перейдите на вкладку “Libraries”

Jr 42.png

Нажмите “Add External JARs” и выберите jar файл

Jr 43.png

Jr 44.png

Jr 45.png

Теперь создайте новый параметр с именем DataFormatter, класса ru.runa.wfe.report.ReportFormatter

Jr 46.png

Значение по умолчанию задайте в виде строки

new ru.runa.wfe.report.ReportFormatterImpl()

Вернитесь к источнику processTasks, откройте вкладку параметров, добавьте DTNow и DataFormatter

Jr 47.png

# Таблица «Активные задачи»

Добавьте из палитры графических элементов таблицу (элемент Table)

Jr 48.png

Используйте ранее созданный источник “processTasks”

Jr 49.png

Дважды кликните по таблице для переход в режим редактирования.

Jr 50.png

Поочередно выделите и удалите“Column Footer” и “Table Footer”

Jr 51.png

Создайте 8 колонок

Jr 52.png

Сгруппируйте колонки в заголовке и растяните полученную таблицу на всю область

Jr 53.png

Расположите элементы “Static text” и введите названия колонок

Jr 54.png

В колонках для значений расположите элементы “Text Field”

Jr 55.png

Используйте следующие выражения для полей:

  • Состояние
$F{TASK_NAME}
  • Роль
$F{SWIMLANE_NAME}
  • Исполнитель
$F{EXECUTOR_NAME}
  • Время создания
$P{DataFormatter}.timeMultilineFormat().dateTime($F{CREATE_DATE})
  • Срок окончания
$P{DataFormatter}.timeMultilineFormat().dateTime($F{DEADLINE_DATE})
  • Фактическая длительность
$P{DataFormatter}.timeMultilineFormat().interval($F{CREATE_DATE},$P{DTNow})
  • Осталось до окончания
$P{DataFormatter}.timeMultilineFormat().interval($P{DTNow},$F{DEADLINE_DATE})
  • Время взятия на исполнение
$P{DataFormatter}.timeMultilineFormat().dateTime($F{ASSIGNMENT_DATE})

Jr 56.png

Для полей формата Timestamp используется DataFormatter, позволяющий преобразовать значение в единый с RunaWFE формат отображения.
С помощью метода interval(StartDate, EndDate) расчитывается интервал между двумя заданными датами.

Параметры DTNow, DataFormatter и ProcessId должны быть переданы в DataSet таблицы активных заданий.

Jr 57.png

# Стили таблицы

Вместе с таблицей автоматически создаются стили:

Jr 58.png

Отредактируйте их и примените к заголовку, ячейкам с названиями параметров, ячейкам значений:

Jr 59.png

# Секция информации о ролях

Создайте новый источник данных processExecutors

Для получения ролей экземпляра БП используйте следующий sql запрос\

SELECT
       "BPM_SWIMLANE"."NAME" as "SWIMLANE_NAME",  "EXECUTOR"."NAME" as "EXECUTOR_NAME"
FROM  
       "BPM_SWIMLANE"
INNER JOIN
       "EXECUTOR"
ON "BPM_SWIMLANE"."EXECUTOR_ID" =  "EXECUTOR"."ID"
WHERE
       "BPM_SWIMLANE"."PROCESS_ID"= $P{ProcessId}

Jr 60.png

Расположите в секции Detail2 таблицу для отображения ролей экземпляра БП, в качестве источника данных используйте processExecutors

Добавьте следующие выражения для полей Роль и Исполнитель:

$F{SWIMLANE_NAME}
$F{EXECUTOR_NAME} == null ? "" : $F{EXECUTOR_NAME}

Примените для таблицы стили

Jr 61.png

# Таблица переменных процесса

Создайте новый источник данных для получения значений переменных экземпляра БП

SELECT 
       "BPM_VARIABLE"."NAME", "BPM_VARIABLE"."STRINGVALUE"
FROM  
       "BPM_VARIABLE"
WHERE
        PROCESS_ID= $P{ProcessId}

Jr 62.png

Создайте таблицу для отображения значений переменных экземпляра БП, аналогично таблицы ролей и расположите ее в секции Detail3

Jr 63.png

Используйте выражения для полей “Variable Name” и “Value”

$F{NAME}
$F{STRINGVALUE} == null ? "" : $F{STRINGVALUE}

# Область Page Footer

Расположите в “подвале” отчета два элемента “Text Field” с выражениями вида:

"Page " + $V{PAGE_NUMBER}
" of " + $V{PAGE_COUNT}

где

  • PAGE_NUMBER – номер текущей страницы
  • PAGE_COUNT – количество страниц в отчете

Jr 64.png

# Компиляция отчета

Выделите файл отчета (расширение jrxml), вызовите контекстное меню и выберите пункт “Compile Report”

Jr 65.png

Если отчет не содержит ошибок, то будет сгенерирован файл с расширением jasper, который можно загрузить на сервер RunaWFE.

# Загрузка и выполнение отчета

Откройте “Отчеты”, нажмите Загрузить.

Выберите файл отчета (расширение .jasper) и заполните обязательные поля.

Нажмите “Проанализировать”

Jr 66.png

Введите название выводимое пользователю для параметра ProcessId

Jr 67.png

Выберите тип Integer, установите опцию обязательности параметра.

Нажмите “Загрузить”, отчет появится в списке

Jr 68.png

Выполните отчет:

Jr 69.png

Введите id экземпляра БП, данные которого хотим получить в отчете и выберите Тип отчета

Нажмите “Построить”

Ниже приведены примеры сформированных отчетов:

Jr 70.png

Jr 71.png

# Файлы отчета по данным экземпляра БП

Пример разработанного по данному руководству отчета доступен по следующим ссылкам

Файл:ProcessVariables.jrxml

Файл:ProcessVariables.jasper