Импорт и экспорт отчетов

Дополнение Jmix Reports предоставляет функции для обработки экспорта и импорта определений отчетов непосредственно из пользовательского интерфейса и программно.

Вручную

Дополнение Reports позволяет вручную импортировать и экспортировать отчеты непосредственно из экрана Reports с помощью кнопок Import и Export. Для получения дополнительной информации смотрите Экран списка отчетов.

Использование ReportImportExport

Дополнение Jmix Reports предоставляет API ReportImportExport, который позволяет импортировать ZIP-файлы с экспортированными отчетами.

Рассмотрим пример автоматизированного развертывания отчетов в рамках проекта Jmix. Отчеты были вручную экспортированы и сохранены как ZIP-архивы в директорию ресурсов проекта.

@Component
public class DemoDataInitializer { (1)

    @Autowired
    private DataManager dataManager;

    @Autowired
    private Resources resources;

    @Autowired
    protected ReportImportExport reportImportExport;

    private final static String REPORT_LOCATION = "com/company/library/reports/";

    @EventListener
    @Authenticated
    public void onApplicationStarted(ApplicationStartedEvent event) { (2)
        importReport();
    }

    private void importReport(){
        InitFlags initFlags = dataManager.load(InitFlags.class) (3)
                .id(1)
                .lockMode(LockModeType.PESSIMISTIC_WRITE)
                .optional()
                .orElseGet(() -> {
                    InitFlags entity = dataManager.create(InitFlags.class);
                    entity.setId(1);
                    return entity;
                });

        if (!Boolean.TRUE.equals(initFlags.getReportsInitialized())) {
            importReport("Book Items location.zip");
            importReport("Book Record.zip");
            importReport("Publication details.zip");
            importReport("Publications grouped by types and books.zip");
            importReport("Recently added book items.zip");

            initFlags.setReportsInitialized(true);
            dataManager.save(initFlags);
        }
    }

    private void importReport(String reportFileName) {
        String location = REPORT_LOCATION + reportFileName;
        log.info("Initializing report from " + location);
        try (InputStream stream = resources.getResourceAsStream(location)) {
            if (stream != null) {
                reportImportExport.importReports(IOUtils.toByteArray(stream)); (4)
            } else {
                log.info("Not found: " + location);
            }
        } catch (IOException e) {
            log.error("Unable to initialize reports", e);
        }
    }
}
1 Бин DemoDataInitializer отвечает за запуск импорта отчетов при старте приложения.
2 Этот метод автоматически вызывается при публикации события ApplicationStartedEvent. Мы поместим нашу логику инициализации сюда. ApplicationStartedEvent - это событие Spring, которое публикуется после полной инициализации приложения и его готовности обрабатывать запросы. Оно сигнализирует об успешном запуске вашего Jmix приложения.
3 DemoDataInitializer использует сущность InitFlags для сохранения флага, который устанавливается в true после первоначального импорта. Этот флаг использует пессимистическую блокировку базы данных, чтобы избежать параллельного выполнения при запуске нескольких серверов в кластере. Более того, у вас есть гибкость в определении альтернативных условий для создания/обновления отчетов или даже запуска ReportImportExport с помощью ручной команды в пользовательском интерфейсе приложения.
4 Бин ReportImportExport обрабатывает фактический импорт отчетов.