JasperReportExample

Материал из RunaWFE

Перейти к: навигация, поиск

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

Версия 4.3.0

© 2015-2019, ООО "Процессные технологии", материалы этого документа распространяются свободно на условиях лицензии GNU FDL. RunaWFE Free является системой с открытым кодом и распространяется в соответствии с LGPL лицензией (http://www.gnu.org/licenses/lgpl.html).

Исходный код проекта был перенесён с https://sourceforge.net/p/runawfe на https://github.com/processtech.


Содержание

# Установка 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

Личные инструменты