Мета отчёта¶
Description¶
Мета отчёта - предназначена для построения шахты данных, содержащей аналитическую информацию по данным из меты системы, организованную в виде таблиц. В мете модуля отчетов указываются источники данных, на основе которых формируется информация для построения отчета, и в дальнейшем формирование колонок таблицы отчета, с указанием ресурса на данные из метаклассов системы.
Мета модуля отчетов находится в папке 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: Иерархическая сборка возможна только на основе источника и невозможна на основе класса.
Алгоритм сборки:¶
- Создаем результирующий источник.
- Делаем выборку корневых элементов, у которых пустое поле
parent
. - Перебираем и записываем элементы в результирующий источник (при этом в спецатрибут
element_id
- идентификатор (id) обьекта, вlevel
- значение 0, вorder
- приведенный к строке порядковый номер элемента в выборке, дополненный до длины 6 символов лидирующими нолями). - Итеративно делаем выборки следующих уровней вложенности (начиная с 0), до тех пор пока на очередной итерации не будет извлечено 0 объектов. Выборки делаются путем объединения исходного источника с результирующим по связи
parent = element_id
и ограничениюlevel=текущий уровень
вложенности. - На каждой итерации перебираем и записываем элементы в результирующий сорс, при этом:
- в спецатрибут
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:
...