История выполнения отчетов

Дополнение Reports предоставляет механизм управления историей выполнения отчетов со следующими возможностями:

  1. Сохранение истории выполнения для каждого отчета. Системный администратор может использовать историю выполнения отчетов, чтобы узнать, как часто выполняется отчет, сколько времени обработки тратится на отчет, каким пользователем и когда был запущен отчет, какие ошибки произошли во время выполнения.

  2. Очистка устаревшей истории выполнения отчетов.

История выполнения отчетов отключена по умолчанию и может быть включена путем установки свойства приложения jmix.reports.history-recording-enabled в значение true.

Экран истории выполнения считается административным и не добавлен в главное меню. Чтобы просмотреть историю выполнения, перейдите в экран списка отчетов (пункт меню Reports → Reports), выберите какой-либо отчет и нажмите кнопку Execution history.

Действие истории выполнения

Вы можете открыть историю выполнения в любом экране, используя ShowExecutionReportHistoryAction и связанную с ним кнопку или пункт контекстного меню компонента.

io.jmix.reportsflowui.action.ShowExecutionReportHistoryAction - стандартное действие для отображения истории выполнения отчетов. Оно должно быть определено для Button или компонента списка (DataGrid, TreeDataGrid).

Ниже приведен пример использования декларативного действия для DataGrid:

<hbox id="buttonsPanel" classNames="buttons-panel">
    <!-- ... -->
    <button id="historyBtn" action="literatureTypesDataGrid.showHistory"/> (1)
</hbox>
<dataGrid id="literatureTypesDataGrid"
          width="100%"
          minHeight="20em"
          dataContainer="literatureTypesDc">
    <actions>
        <!-- ... -->
        <action id="showHistory" type="report_showExecutionReportHistory"/> (2)
    </actions>
</dataGrid>
1 Добавляет кнопку с действием истории отчетов.
2 Атрибут type определяет конкретный тип действия report_showExecutionReportHistory, предоставляемый фреймворком.

Пример программного создания действия вместе с кнопкой, объявленной в XML-дескрипторе экрана:

@ViewComponent
private JmixButton historyBtn;

@Autowired
private Actions actions;

@Subscribe
public void onInit(final InitEvent event) {
    ShowExecutionReportHistoryAction<LiteratureType> action =
            actions.create(ShowExecutionReportHistoryAction.ID);
    historyBtn.setAction(action);
}

При выполнении действия откроется модальное диалоговое окно Execution history, в котором будут отображены отчеты, связанные с текущим экраном. После нажатия кнопки Execution History будет отображена история выполнения для выбранных отчетов.

Флаг "Cancelled" означает, что пользователь запустил отчет как фоновую задачу, а затем отменил ее.

История выполнения также записывается даже для отчетов, которые еще не сохранены в базе данных, но запущены из экрана деталей отчета (нажатием кнопки Run).

Выходные документы

Механизм предоставляет возможность сохранять выходные документы - файлы результатов отчетов - в файловом хранилище. Эта функция потребляет дисковое пространство файлового хранилища; она настраивается отдельно и отключена по умолчанию. Чтобы включить ее, определите свойство приложения jmix.reports.save-output-documents-to-history как true:

jmix.reports.save-output-documents-to-history = true

Теперь, если вы выберете элемент в таблице истории выполнения, кнопка Download document станет доступной. Нажмите кнопку, чтобы загрузить документ, который является файлом результата отчета.

Отчеты с типом вывода table не имеют файлов результатов, поэтому история выполнения таких отчетов не сохраняет никаких выходных документов.

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

Очистка истории

Вы можете использовать Планировщик заданий Quartz для периодической очистки истории выполнения отчетов.

  1. Включите дополнение Quartz в ваш проект, как описано в разделе Quartz / Установка.

  2. Создайте класс задачи и вызовите ReportExecutionHistoryRecorder.cleanupHistory():

    @Component("ReportHistoryCleaner")
    public class ReportHistoryCleanJob implements Job {
        @Autowired
        private ReportExecutionHistoryRecorder reportExecutionHistoryRecorder;
    
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            reportExecutionHistoryRecorder.cleanupHistory();
        }
    }
  3. В работающем приложении откройте экран Quartz → Quartz jobs и настройте задачу для класса ReportHistoryCleanJob.

  4. Альтернативно, если вы хотите настроить задачу во время разработки, добавьте следующие бины в главный класс приложения:

    @Bean
    JobDetail reportHistoryCleanJob() {
        return JobBuilder.newJob()
                .ofType(ReportHistoryCleanJob.class)
                .storeDurably()
                .withIdentity("reportHistoryClean")
                .build();
    }
    
    @Bean
    Trigger reportHistoryCleanTrigger() {
        return TriggerBuilder.newTrigger()
                .forJob(reportHistoryCleanJob())
                .startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule("0 0 1 * * ?")) (1)
                .build();
    }
    1 Расписание, например, для ежедневного выполнения в час ночи: 0 0 1 * * ?
  5. Настройте свойства конфигурации очистки истории отчетов:

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