Мета отчёта

Описание

Мета отчёта - предназначена для построения шахты данных, содержащей аналитическую информацию по данным из меты системы, организованную в виде таблиц. В мете модуля отчетов указываются источники данных, на основе которых формируется информация для построения отчета, и в дальнейшем формирование колонок таблицы отчета, с указанием ресурса на данные из метаклассов системы.

Мета модуля отчетов находится в папке bi проекта в формате YML.

NB: Определение «Шахта данных»

Шахта данных - (смежный термин от англ. Data Mining - глубинный анализ данных)
это некое хранилище, которое содержит глубинную аналитическую информацию
обо всех источниках данных и информацию для построения отчетов,
организованную в виде таблиц.

Пример YML

name: reportTest
caption: Тестовые данные
sources:
  - name: dataSource
    caption: Источник данных
    load:
      - className: sourceClass
        results:
          - field: id
            expr: $id
          - field: date
            expr: $dateCreate
          - field: name
            expr: $nameObject
    index:
      - id
  - name: test
    caption: Отчет тестовый
    load:
      - source: dataTest
        joins:
          - table: date
            alias: da
            left: id
            right: id
        results:
          - field: id
            expr: $id
          - field: date
            expr: $date
          - field: name
            expr: $name
reports:
  - name: reportTest
    caption: Отчет тестовый
    sheets:
      - name: reportTest
        caption: Отчет тестовый
        type: aggregation
        source: test
        fetch:
          date: $date
        rangeFilters:
          date:
            caption: За период с|по
            format: date
            inclusive: both
        columns:
          - field: date
            caption: Дата создания
          - field: name
            caption: Наименование

Описание примера

Отчет тестовый содержит в себе данные из класса «sourceClass». Источник данных «dataSource» извлекает данные из меты соответствующего класса, которые указаны в свойстве results: . Далее подраздел «test» на основе данных, полученных из источника, указанного в свойстве source: формирует и преобразовывает данные для корректного отображения в таблицах отчета. Свойство joins: задает атрибут, который является идентификатором для построения отчета (в данном случае id объекта).

Далее система формирует таблицы отчета, на основе преобразованных данных из источника, в разделе reports:. Свойство rangeFilters: содержит информацию о фильтрах, настраиваемых для отчета (в данном случае необходимо указать диапазон дат, в соответствии с данными из класса). В модуле фильтр по диапазону задается через параметры запроса: ?rangeFld[]=0&rangeFld[]=5, где rangeFld - это поле по которому ищем. Если идет поиск по датам - дату передавать в формате локали, которая передается в http-заголовке 'accept-language', либо в формате ISO8601. Свойство columns: позволяет формировать колонки таблицы (порядковые номера фактические).

Результат: таблица из двух колонок (Дата и Наименование), в которой будут выводится объекты класса из источника _»dataSource»_ , в соответствии с фильтром по датам, настроенном в rangeFilters:, а количество объектов в таблице будет равно количеству значений идентификатора, настроенном в свойстве joins:.

Пример простого полного отчета можно посмотреть здесь.

Настройка строгости сравнения

Настройка строгости сравнения на границах интервала rangeFilters в отчете:

"rangeFilters": {
         "regDate": {
           "caption": "За период с|по",
           "format": "date",
           "inclusive": "both" | "left" | "right"
         }
       }

both - обе границы могут быть равны искомым значениям

left - левая граница (меньшая) может быть равна искомым значениям

right - правая граница (большая) может быть равна искомым значениям

Если inclusive не указан - сравнение строгое на обоих границах.

Иерархическая сборка

Настройка иерархической сборки необходима для обработки исходных данных при сборке шахты:

  • Чтобы сделать в одном источнике данных выгрузку данных по всей иерархии в базе
  • Чтобы вывести данные по первому столбцу с отступами в зависимости от глубины вложенности

Настройка иерархической сборки в шахте данных:

В конфигурации источника настройка "hierarchyBy" представляет собой объект с набором свойств: id, parent, level, order.

hierarchyBy:
       id: guidProj
       parent: basicobj1.guidObj
       level: objLevel
       order: objOrder

где id - атрибут в данных, идентифицирующий элемент иерархии

parent - атрибут в данных, содержащий идентификатор родительского элемента

level - атрибут в результирующем источнике, куда будет записан уровень вложенности элемента

order - атрибут в результирующем источнике, куда будет записано значение для упорядочивания иерархии при отображении.

Поля objLevel и objOrder это поля для записи значения (их не надо считать, агрегировать и т.д.)

Пример YML

reports:
  - name: roadmap
    caption: Дорожная карта
    sheets:
      - name: roadmap
        caption: >-
          Дорожная карта
        type: aggregation
        needFilterSet: true
        needFilterMessage: Выберите проект
        styles:
          objLevel:
            1: text-indent-1
            2: text-indent-2
            3: text-indent-3
          nameObjIndex:
            "3": level2
            "2": level1
            "1": level0
            "0": level0
        source: roadmapSource
        fetch:
          objLevel: $objLevel
          guidObj: $guidObj
          numLevelObj: $numLevelObj
...

NB: Иерархическая сборка возможна только на основе источника и невозможна на основе класса.

Алгоритм сборки:

  1. Создаем результирующий источник.
  2. Делаем выборку корневых элементов, у которых пустое поле parent.
  3. Перебираем и записываем элементы в результирующий источник (при этом в спецатрибут element_id - идентификатор (id) обьекта, в level - значение 0, в order - приведенный к строке порядковый номер элемента в выборке, дополненный до длины 6 символов лидирующими нолями).
  4. Итеративно делаем выборки следующих уровней вложенности (начиная с 0), до тех пор пока на очередной итерации не будет извлечено 0 объектов. Выборки делаются путем объединения исходного источника с результирующим по связи parent = element_id и ограничению level=текущий уровень вложенности.
  5. На каждой итерации перебираем и записываем элементы в результирующий сорс, при этом:
    • в спецатрибут element_id пишем идентфикатор (id) обьекта,
    • в level пишем текущий уровень вложенности,
    • в order пишем конкатенацию order родительского элемента и приведенного к строке порядкового номера элемента в выборке, дополненного до длины 6 символов лидирующими нолями.

Настройка скрытия объектов

Настройка скрытия всех объектов, если табличные фильтры не заданы. Чтобы при открытии отчета все объекты скрывались, пока не будет выбрано значение из списка в фильтре необходимо для него применить настройку "needFilterSet: true".

Отображение в заголовке отчета параметров выборки посредством паттернов

Пример YML

...
          byPeriod:
            sum:
              - if:
                  - and:
                      - gte:
                          - $date
                          - ':since' # берем из params->since
                      - lte:
                          - $date
                          - ':till' # берем из params->till
                  - $amount
                  - 0
          byMonth:
            sum:
              - if:
                  - and:
                      - eq:
                          - month:
                              - dateAdd:
                                  - $date
                                  - 10
                                  - h
                          - ':month' # берем из params->month
                      - eq:
                          - year:
                              - dateAdd:
                                  - $date
                                  - 10
                                  - h
                          - ':year' # берем из params->year
                  - $amount
                  - 0
          byYear:
            sum:
              - if:
                  - eq:
                      - year:
                          - dateAdd:
                              - $date
                              - 10
                              - h
                      - ':year' # берем из params->year
                  - $amount
                  - 0
...
        params:
          year:
            caption: Год
            format: int
          month:
            caption: Месяц
            format: int
            select: # выпадающий список
              '1': январь
              '2': февраль
              '3': март
              '4': апрель
              '5': май
              '6': июнь
              '7': июль
              '8': август
              '9': сентябрь
              '10': октябрь
              '11': ноябрь
              '12': декабрь
          since:
            caption: с
            format: date
          till:
            caption: по
            format: date
...
        columns:
          - field: title
            caption: Показатель
          - field: dimension
            align: center # наименование заголовка в шапке по центру ячейки
            caption: Единица измерения
          - caption: '{$year}' # наименование заголовка в шапке из параметра year
            align: center
            columns: # колонка в шапке - группа вложенных колонок
              - field: byPeriod
                # наименование заголовка в шапке из параметров since и till
                caption: 'c {$since} по {$till}'
                align: center
                format: number
              - field: byMonth
                # наименование заголовка в шапке из параметра month
                caption: 'За {$month}'
                align: center
                format: number
              - field: byYear
                caption: За год
                align: center
                format: number

Стилизация строк отчета на основании данных

Пример YML

...
        fetch:
          category: $category
          title:
            case:
              - eq:
                  - $category
                  - AA4
              - 'Выдано заключений, всего в т.ч.:'
              - eq:
                  - $category
                  - AB5
              - '1. Государственная экспертиза, всего в т.ч.:'
              - eq:
                  - $category
                  - AC6
              - '- положительных'
              - eq:
                  - $category
                  - AD7
              - '- отрицательных'
...
          dimension:
            case:
              - eq:
                  - $category
                  - AA4
              - штук
              - eq:
                  - $category
                  - AB5
              - штук
...
        styles:
          category:
            AA4: level0
            AB5: level1
            AC6: level2
            AD7: level2

Возможность использования комбобоксов в параметрах и фильтрах

Пример YML

...
        params:
          year:
            caption: Год
            format: int
          month:
            caption: Месяц
            format: int
            select: # выпадающий список
              '1': январь
              '2': февраль
              '3': март
              '4': апрель
              '5': май
              '6': июнь
              '7': июль
              '8': август
              '9': сентябрь
              '10': октябрь
              '11': ноябрь
              '12': декабрь
          since:
            caption: с
            format: date
          till:
            caption: по
            format: date
...

Настройка обработки параметров в фильтре на странице отчета

Пример YML

reports:
   ...
   filter:
          eq:
            - $yearStart
            - year:
              - ':dateSelect'
  ...

Значение года в атрибуте $yearStart равно значению года из даты в атрибуте :dateSelect.

Настройка пагинатора "pageSize"

NB: Применяется для отчетов с типом type: list.

Для случаев, когда отчет содержит в себе много объектов и на страницах нужно выводить строки постранично, чтобы не нагружать браузер тяжелой обработкой данных.

Пример YML

reports:
 - name: test
    caption: Тестовый отчет
    sheets:
      - name: main
        caption: Тестовый отчет
        type: list
        pageSize: 100

Настройка вывода построчно

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

Пример YML

...
reports:
  - name: testReport
  ...
      columns:
        - caption: Группирующее поле
          columns: // поля для группировки
            - field: columns1
              caption: Поле1
              format: string
            - field: columns2
              caption: Поле2
              format: string
    ...

Настройка инкрементальной загрузки

Для настройки инкрементальной загрузки данных в источник при сборке шахты необходимо выставить параметр:

append: true

Он необходим для подгрузки статистики за день в шахту, чтоб не пересчитывать весь объем исходных данных и иметь историю по периодам.

Особенности сортировки объектов

Учитывая функционал агрегации MongoDB - сортировка возможна только по результирующим полям. Это значит, что для обратной совместимости поля результата, по которым сортируем, необходимо называть так же, как и поля в источнике данных.

Пример сортировки (свойство sort):

reports:
  - name: sors
    caption: Источник
    sheets:
      ...
        rangeFilters:
          ...
        sort:
          regDateOrder: asc
        columns:
          ...