Tutorial: Report generation

# Подсистема отчетности

Общая информация

Предназначена для создания отчетов в разных форматах. На данный момент поддерживаются HTML и PDF. В подсистему входят:

  • Реестр отчетов (сущность ubs_report)
  • Визуальный построитель отчетов (форма ubs_report-fm)
  • Генератор отчетов (UBS.UBReport)
  • Просмотрщик отчетов (UBS.ReportViewer)

Генератор отчетов может работать как на сервере так и на клиенте. Это позволяет перенести построение отчетов на сторону сервера. Каждый отчет состоит из файла шаблона (расширение .template) и программного кода (.js). Физически файлы хранятся на сервере в папке public\reports моделей.

В програмном коде можно:

  • Загрузить все необходимые данные для отчета.
  • Задать форму ввода параметров. (только для генерации на клиентской стороне)
  • Задать любые другие преобразования в отчете

Шаблон отчета задается в формате HTML. По сути он является шаблоном для Mustache. При генерации отчета в формате PDF полученный HTML преобразовывается в PDF. Пример отчета с демонстрацией базовых возможностей входит в поставку модели UBS (В реестре код отчета test).

Включение подсистемы

В конфигурационном файле UB: Подключить модель UBS.

      "domainConfigs": {
    "AppName": {
        "models": {
            "UBS":         { "path": "UB\\models\\UBS" }
         }}
    }

Если предпологается выгрузка в PDF то нужно включить модель PDF

Ярлык для реестра отчетов

{"cmdType": "showList",
 "cmdData":{ 
     "params":[{ 
         "entity": "ubs_report", 
          "method": "select", 
          "fieldList": ["ID", "model", "report_code", "name"]         
     }]
 }
      }

Возмжности и ограничения

Каринки задаются только в формате base64.

###HTML

  • Ограничен возможностями языка HTML
  • Нельзя задать колонтитулы
  • Нельзя задать специальную разметку при разрыве страницы. Например не разрывные блоки или строки таблицы

###PDF

  • Ограниченый перечень тегов и атрибутов HTML. Полный перечень можно посмотреть PDF.csPrintToPdf.writeHtml
  • Ограниченные возможности расположения элементов. (нельзя использовать блочные элементы внутри строчного элемента)
  • Поддержка колонтитулов. Задаются в програмном коде.
  • Неразрывные ячейки таблицы. Задается при промощи атрибута стиля disable-split: true.
  • Не поддерживается использование блочных элемнтов внутри строковых (inline)
  • Рядки таблиц должны всегда иметь ширину

Сквозные строки таблицы. Будут выводится на каждой сранице где присутствует таблица. Задается при промощи атрибута стиля top-through-line: true.

   <tr style="disable-split: true; top-through-line: true;">

Не разрывные строки таблицы. Можно указать не разрывать n строк в начале или в конце таблицы.

  <table style="indissoluble-first-rows: 5; indissoluble-end-rows: 6;">

Настройка ПДФ отчетов (колонтитулы, отступы листа, шрифты)

На данный момент колонтитулы, отступы листа и шрифты можно настроить только в коде. Для этого служит конфигурационная функция onTransformConfig.

        onTransformConfig: function(config){
              config.margin = {top: 10, right: 8, bottom: 8, left: 20};  // page padding
              config.topColontitle = {
                    height: 8,
                    font: { size: 10, wide: 0 }
              };
              config.bottomColontitle = {
                height: 28,
                font: { size: 10, wide: 0 }
              };
              config.listeners = {
                initColontitle: function(obj, result) {
                  if(!result.colontitle.isTop) {
                    result.align = PDF.csPrintToPdf.alignType.center;
                    result.text = '<p style="text-align:right">Текст</p><p style="text-align:left"> в верхнем колонтитуле <b>created</b> ' + result.currentDate ;
                    result.isXml = true;
                  } else {
                      result.align = PDF.csPrintToPdf.alignType.center;
                      result.text = 'page ' + result.pageNumber + ' of ' + result.totalPages;
                  }
                }
              };
            return config;
        }

Полный перечень настроек можно посмотреть здесь.

Настройка панели параметров

В коде отчета можно настроить панель для ввода параметров отчета. Эти настройки будет использовать просмотрщик отчетов. Для этого нужно в событии onParamPanelConfig создать нужную панель.

        onParamPanelConfig: function() {
            var paramForm = Ext.create('UBS.ReportParamForm', {
                items: [{
                    xtype: 'textfield',
                    name: 'name',
                    fieldLabel: 'Name'
                }, {
                    xtype: 'datefield',
                    name: 'birthday',
                    fieldLabel: 'Birthday',
                    allowBlank: false,
                    value: new Date()
                },{
                    xtype: 'numberfield',
                    name: 'limitation',
                    fieldLabel: 'Limit to'
                }
                ],
                getParameters: function(owner) {
                    var frm = owner.getForm();
                    return {
                        name: frm.findField('name').getValue(),
                        birthday: frm.findField('birthday').getValue(),
                        limitation: frm.findField('limitation').getValue()
                    };
                }
            });
            return paramForm;
        }

Либо то же самое в упрощенном варианте:

        onParamPanelConfig: function() {
              return  [{
                    xtype: 'textfield',
                    name: 'name',
                    fieldLabel: 'Name'
                }, {
                    xtype: 'datefield',
                    name: 'birthday',
                    fieldLabel: 'Birthday',
                    allowBlank: false,
                    value: new Date()
                },{
                    xtype: 'numberfield',
                    name: 'limitation',
                    fieldLabel: 'Limit to'
                }
                ];
        }

Запуск отчета из ярлыка

Пример:

    {"cmdType": "showReport",
       "cmdData": {
           "reportCode": "test",
           "reportType": "pdf",
           "ReportParams": {"test": 1}
       }
    }

reportCode - код отчета reportType - формат ReportParams - перечень входных параметров

Программный запуск формирования отчета

Пример для запуска на сервере:

      var UBReport = require('models/UBS/public/UBReport.js');
      var report = UBReport.makeReport('test','pdf',{});
       report.done(function(result){
         var fs = require('fs');
         if (result.reportType === 'pdf'){
             toLog(result.reportData.byteLength);
             fs.writeFileSync('d:\\result.pdf', result.reportData );
         } else {
             toLog(result.reportData.length);
             fs.writeFileSync('d:\\result.html', result.reportData );
         }
      });

На клиенте(WEB):

    UBS.UBReport.makeReport('test','pdf',{}).done(function(report){
                   var outputBlob = new Blob(
                    [report.reportData],
                    {type: "application/pdf"}
                );

                window.open( window.URL.createObjectURL(outputBlob), 'blank');
    });