JasperReportExample
Пример разработки отчета по данным экземпляра БП
Версия 4.6.0
© 2015-2023, ООО "Процессные технологии"
# Установка Jaspersoft Studio
Загрузите программное обеспечение Jaspersoft Studio (! версия 6.4.0). Для этого перейдите по ссылке и выберите инсталлятор соответствующий вашей операционной системе https://sourceforge.net/projects/jasperstudio/files/JaspersoftStudio-6.4.0/
# Шаблон отчета. Описание секций
Создадим отчет, соответствующий странице свойств запущенного экземпляра процесса
Отчет будет содержать общую информацию о процессе (имя определения, номер экземпляра, версия, когда запущен, статус), раздел активных заданий, ролей и переменных.
Откройте установленный Jaspersoft Studio и создайте новый отчет
Выберите шаблон “Blank A4” и нажмите Далее
Введите название отчета, например “processVariables” и нажмите Finish
Откроется рабочая область Jaspersoft Studio
Выбранный ранее шаблон “Blank A4” содержит следующие секции
- “Title” – заголовок отчета, отображается только на первой странице
- “Page Header” – секция, которая отображается на каждой странице
- “Column Header” – отображение в начале столбца отчета. Не будем использовать данную секцию, кликните по ней левой клавишей мыши и нажмите клавишу Delete.
- “Detail” – отображается для каждой записи в источнике данных.
- “Column Footer” – секция для отображения данных в конце столбца отчета. Не будет использоваться, удалите ее.
- “Page Footer” – секция для отображения данных внизу каждой страницы.
Добавьте в отчет еще две секции Detail. Для этого кликните правой клавишей мыши по разделу Detail и выберите пункт “Add detail band”
Сохраните отчет (используйте комбинацию клавиш Ctrl+S или соответствующую иконку панели инструментов)
# Работа над заголовком отчета
В качестве входного параметра для формирования отчета будет использоваться Id экземпляра БП.
Перейдите в раздел “Parameters” и создайте новый параметр
В “Properties” введите название параметра – “ProcessId”
Id экземпляра БП это целочисленное значение, поэтому в качестве типа задайте “java.lang.Long”
Перейдите в палитру элементов и перетащите “Text field” в секцию заголовка (Title)
“Text field” – элемент для отображения строки формирующейся динамически
# Источник данных
Отобразим в заголовке: ID экземпляра процесса и имя его определения.
Для получения этой информации необходимо настроить источник данных.
Кликните по корневому элементу “processVariables” в панели “Outline”, справа отобразится панель с настройками.
Нажмите кнопку “Edit query, filter and sort”
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”
Запрос возвращает название определения БП. Нажмите “Add” и добавьте новое поле. Введите имя – NAME, тип “java.lang.String”
Перейдите на вкладку Parameters и определите входной параметр ProcessId типа java.lang.Long
Нажмите ОК.
# Выражение для заголовка
Теперь можно использовать полученное в результате запроса поле Name в ранее добавленном элементе “Text Field” секции Title
Дважды кликните по нему мышью, откроется окно редактора выражений.
В Fields и Parameters должны присутствовать добавленные ранее поле Name и параметр ProcessId, которые можно использовать в выражении.
Введите выражение:
"Report on the process '"+ $F{NAME} + "' (id=" + $P{ProcessId}.toString() + ")"
Для добавления в выражение поля или параметра, выделите его в соответствующем списке и дважды кликните по нему мышью.
Для преобразования параметра ProcessId (типа Long) в его строковое представление, используйте метод toString()
Таким образом в заголовке отчета будет отображаться динамически сформированная строка, содержащая id процесса и имя его определения.
# Настройка стиля отображения заголовка
Выделите “Text field” зголовка и перейдите в панель Properties. Здесь можно настроить внешний вид элемента или применить стиль.
В разделе Color задайте цвет текста (Forecolor) и цвет фона (Backcolor)
Используйте шрифт “DejaVu Sans”. Это даст возможность корректно отображать кириллицу в отчетах формата pdf.
Задайте выравнивание текста и его размер.
Сохраните отчет.
# Секция детальной информации по экземпляру процесса
В секции Detail1 отобразим id, имя, дату запуска, дату завершения, версию и статус процесса.
# Источник данных
Для получения этих значений необходимо создать новый источник данных.
Перейдите в окно “Outline”, вызовите контекстное меню на корневом элементе и выберите “Create DataSet”
Дайте имя источнику – “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}
Добавьте возвращаемые поля, установите их тип как показано на рисунке ниже.
# Элемент List
Отобразим информацию о процессе с помощью элемента List.
Для этого перейдите в палитру графических элементов, выделите List и перетащите его в секцию Detail1.
Будет предложено выбрать источник данных.
Выберите ранее созданный processInfo
Дважды кликните по добавленному List, будет открыта форма для редактирования.
Расположите на форме уже известные элементы “Static text” и “Text Field” как показано на рисунке ниже.
Дважды кликните по каждому добавленному “Static Text” и введите названия параметров процесса,
В элементы “Text Field” добавьте поля, соответствующие возвращаемым полям запроса “processInfo”
Обратите внимание на конструкции вида
$F{EXECUTION_STATUS} == null ? "" :$F{EXECUTION_STATUS}
В приведенном выше примере, выполняется проверка статуса (EXECUTION_STATUS), если значение не задано (равно NULL) то будет отображаться пустая строка “”, иначе значение статуса.
Используйте такие конструкции в полях, которые могут быть не заполнены. В данном случае это “Статус” и “Дата завершения процесса’.
В запросе processInfo присутствует входной параметр processId, его требуется передать в элемент List
Выделите List, перейдите в его параметры на вкладку DataSet и нажмите кнопку Parameters
В появившемся окне нажмите Add и выберите из списка параметр processId.
Задайте для него выражение вида
# Настройка стиля отображения
Кликните на элементе Styles, окна “Outline”, и выберите “Create Style”
Создайте два стиля:
1). PropertyName – для элементов с названиями параметров
2). PropertyValue – для элементов, отображающих значения параметров
Выделите созданный стиль и перейдите в настройки (Окно Properties).
Задайте цвет фона, выберите шрифт (используйте Deja Vu Sans) и его размер
Также можно задать отступы, выравнивание текста, границы элементов и т.д.
Далее необходимо применить созданный стиль к элементам отвечающим за вывод названия параметра и его значения в List.
Выделите элемент, перейдите в его свойства, и на вкладке “Appearance” в выпадающем списке Style выберите соответствующий стиль
Элемент List примет вид:
# Активные задачи
Выведем информацию по активным задачам процесса в виде таблицы с колонками:
- Состояние
- Роль
- Исполнитель
- Время создания
- Срок окончания
- Фактическая длительность
- Осталось до окончания
- Время взятия на исполнение
# Источник данных
Создайте новый источник данных “processTasks”
Используйте следующий 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
Как видно из запроса и состава возвращаемых полей, здесь отсутствуют такие данные как фактическая длительность задачи и оставшееся время до ее окончания. Эти данные являются вычисляемые исходя из текущего времени и значений полей “Дата создания задачи” (CREATE_DATE), “Срок окончания” (DEADLINE_DATE).
“Фактическая длительность” = CREATE_DATE – “Текущее время”
“Осталось до окончания” = “Текущее время” – DEADLINE_DATE
Создайте новый параметр - DTNow, который будет содержать текущее время
Используйте тип “java.util.Date”
Кликните на иконке напротив строки “Default Value Expression”
Введите код:
new Date()
Опция “Is For Prompting” не должна быть установлена, т.к. данный параметр не используется в качестве входного параметра запроса
Кроме того, для вычисления интервалов между датами, а также приведения дат к единому (с отображением в RunaWFE) формату, потребуется использование еще одного параметра DataFormatter класса ru.runa.wfe.report.ReportFormatter
Для использования класса ReportFormatter, в проект необходимо добавить библиотеку Файл:Wfe-core-4.3.0-SNAPSHOT.jar
Откройте настройки проекта
Выделите “Java Build Path” и перейдите на вкладку “Libraries”
Нажмите “Add External JARs” и выберите jar файл
Теперь создайте новый параметр с именем DataFormatter, класса ru.runa.wfe.report.ReportFormatter
Значение по умолчанию задайте в виде строки
new ru.runa.wfe.report.ReportFormatterImpl()
Вернитесь к источнику processTasks, откройте вкладку параметров, добавьте DTNow и DataFormatter
# Таблица "Активные задачи"
Добавьте из палитры графических элементов таблицу (элемент Table)
Используйте ранее созданный источник “processTasks”
Дважды кликните по таблице для переход в режим редактирования.
Поочередно выделите и удалите“Column Footer” и “Table Footer”
Создайте 8 колонок
Сгруппируйте колонки в заголовке и растяните полученную таблицу на всю область
Расположите элементы “Static text” и введите названия колонок
В колонках для значений расположите элементы “Text Field”
Используйте следующие выражения для полей:
- Состояние
$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})
Для полей формата Timestamp используется DataFormatter, позволяющий преобразовать значение в единый с RunaWFE формат отображения. С помощью метода interval(StartDate, EndDate) расчитывается интервал между двумя заданными датами.
Параметры DTNow, DataFormatter и ProcessId должны быть переданы в DataSet таблицы активных заданий.
# Стили таблицы
Вместе с таблицей автоматически создаются стили:
Отредактируйте их и примените к заголовку, ячейкам с названиями параметров, ячейкам значений:
# Секция информации о ролях
Создайте новый источник данных 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}
Расположите в секции Detail2 таблицу для отображения ролей экземпляра БП, в качестве источника данных используйте processExecutors
Добавьте следующие выражения для полей Роль и Исполнитель:
$F{SWIMLANE_NAME}
$F{EXECUTOR_NAME} == null ? "" : $F{EXECUTOR_NAME}
Примените для таблицы стили
# Таблица переменных процесса
Создайте новый источник данных для получения значений переменных экземпляра БП
SELECT "BPM_VARIABLE"."NAME", "BPM_VARIABLE"."STRINGVALUE" FROM "BPM_VARIABLE" WHERE PROCESS_ID= $P{ProcessId}
Создайте таблицу для отображения значений переменных экземпляра БП, аналогично таблицы ролей и расположите ее в секции Detail3
Используйте выражения для полей “Variable Name” и “Value”
$F{NAME}
$F{STRINGVALUE} == null ? "" : $F{STRINGVALUE}
Расположите в “подвале” отчета два элемента “Text Field” с выражениями вида:
"Page " + $V{PAGE_NUMBER}
" of " + $V{PAGE_COUNT}
где
- PAGE_NUMBER – номер текущей страницы
- PAGE_COUNT – количество страниц в отчете
# Компиляция отчета
Выделите файл отчета (расширение jrxml), вызовите контекстное меню и выберите пункт “Compile Report”
Если отчет не содержит ошибок, то будет сгенерирован файл с расширением jasper, который можно загрузить на сервер RunaWFE.
# Загрузка и выполнение отчета
Откройте “Отчеты”, нажмите Загрузить.
Выберите файл отчета (расширение .jasper) и заполните обязательные поля.
Нажмите “Проанализировать”
Введите название выводимое пользователю для параметра ProcessId
Выберите тип Integer, установите опцию обязательности параметра.
Нажмите “Загрузить”, отчет появится в списке
Выполните отчет:
Введите id экземпляра БП, данные которого хотим получить в отчете и выберите Тип отчета
Нажмите “Построить”
Ниже приведены примеры сформированных отчетов:
# Файлы отчета по данным экземпляра БП
Пример разработанного по данному руководству отчета доступен по следующим ссылкам