报表执行历史

报表扩展组件提供报表执行历史管理的几个功能:

  1. 存储每个报表的执行历史。系统管理员可以使用报表执行历史查找每个报表的执行频率、每次的执行时间、执行人以及报表运行时发生了什么错误。

  2. 清除过期的报表执行历史。

报表执行历史默认不启用,可以设置 jmix.reports.historyRecordingEnabled 应用程序属性为 true 启用。

报表执行历史视图是管理性质的视图,所以没有添加到主菜单。要查看执行记录,切换到报表列表视图(Reports →Reports 菜单项),选择一些报表,然后点击 Execution history(执行历史) 按钮。

ExecutionHistoryAction

可以在任何视图通过 ShowExecutionReportHistoryAction 操作关联的按钮或右键菜单打开报表执行历史。

io.jmix.reportsflowui.action.ShowExecutionReportHistoryAction - 是一个 标准操作,用于展示报表执行历史。需要关联一个 button 或列表组件(dataGridtreeDataGrid 等)。

下面是 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.saveOutputDocumentsToHistory 应用程序属性为 true

jmix.reports.saveOutputDocumentsToHistory = true

现在,如果在执行历史表选中一项,Download document(下载文档) 按钮可点击。点击即可下载报表结果文件。

使用 表格 类型的报表不会有结果文件,所以这些类型的报表执行结果不会保存任何的输出文档。

如果是使用编程的方式调用 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(Quartz 任务) 视图,并为 ReportHistoryCleanJob 类配置一个任务。

  4. 或者,如需在开发阶段配置任务,可以在主应用程序类中添加下列 bean:

    @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. 设置报表历史清理的应用程序属性:

当报表执行历史记录被清理后,相关联的报表输出文档也从文件存储中删除了。