- PVSM.RU - https://www.pvsm.ru -
Часто в аналитических приложениях пользователям нужно периодически формировать и рассылать PDF-отчёты, состоящие из элементов аналитической панели. В разработках на технологиях InterSystems эту задачу решает проект DSW Reports [1], который является расширением DeepSeeWeb. В этой статье будет описано как пользоваться DSW Reports для генерации PDF-отчетов и рассылки их по электронной почте.
Составной частью InterSystems IRIS Data Platform [2] является технология для разработки аналитических приложений InterSystems IRIS Business Intelligence [3] (ранее известная как DeepSee). Существует отдельный проект DeepSeeWeb [4], который использует более современный web-интерфейс (AngularJS) для визуализации аналитических панелей InterSystems IRIS BI. Для общения с серверной частью DeepSeeWeb использует MDX2JSON](https://github.com/intersystems-ru/Cache-MDX2JSON [5]) – проект, который предоставляет REST API доступ к InterSystems IRIS BI.
Про DeepSeeWeb и MDX2JSON мы уже писали в статьях один [6] и два [7].
DSW Reports [1] — это расширение DSW, написанное на AngularJS, которое реализует основной функционал для автоматической генерации отчётов. DSW Reports использует DeepSeeWeb [4] для отрисовки виджетов и MDX2JSON [5] для обработки MDX-запросов.

Для формирования отчёта в DSW Reports достаточно создать как минимум 2 файла:
В файле конфигурации отчёта должна обязательно содержаться функция getConfiguration.
// Общие настройки отчёта
function getConfiguration(params){...}
Функция getConfiguration принимает обьект params, который содержит в себе параметры из строки URL и дополнительный параметр "server", являющийся адресом сервера. Параметр "server" имеет вид: protocol://host:port.
Благодаря объекту params можно передавать в отчёт любые данные через URL-строку. Например, если требуется изменять фильтры виджетов по желанию, тогда передаём с URL-параметр "filter" и он будет доступен через объект params.
//<protocol://host:port>/dsw/reports/report_dir/index.html?filter=NOW
function getConfiguration(params){
var filter = params["filter"]; // filter = "NOW"
}
Функция getConfiguration возвращает объект, содержащий 3 свойства:
Рассмотрим подробнее массив блоков BLOCKS. Блок — объект с настройками виджета, настройками вычисляемых полей и т.д.
{
"title": String, //Заголовок блока
"note": String, //Замечания под блоком. Могут содержать HTML код
"widget": { //Настройки iframe виджета:
"url": String, //URL источника для iframe
"height": Number, //Высота iframe
"width": Number //Ширина iframe
},
"totals":[{ //Настройки значений вычисляемых с помощью MDX
"mdx": String //MDX-запрос
"strings": [{ //Строки значений из запроса
"title": String, //Заголовок строки. Может использовать HTML.
"value": String, //Значение строки по умолчанию
"value_append": String, //Суффикс для значения.
//Может использоваться для знаков %, $ и т.д.
//% преобразует значение в процентное (x * 100).
//Может использовать HTML.
"row": Number //Номер строки MDX-запроса,
//из которой берётся значение.
//По умолчанию 0.
},{...}]
},{...}]}
Все поля обязательны, если поле не нужно лучше выставить его пустой строкой.
{
title: "Persons",
note: "",
widget: {
url: server + "/dsw/index.html#!/d/KHAB/Khabarovsk%20Map.dashboard" +
"?widget=1&height=420&ns=" + namespace,
width: 700,
height: 420
}
}
{
title: "Khabarovsky krai",
note: "Something note (only static)",
widget: {
url: server + "/dsw/index.html#!/d/KHAB/Khabarovsk%20Map.dashboard" +
"?widget=0&height=420&isLegend=true&ns=" + namespace,
width: 495,
height: 420
},
totals: [{
mdx: "SELECT NON EMPTY " +
"[Region].[H1].[Region].CurrentMember.Properties("Population") ON 0,"+
"NON EMPTY {[Region].[H1].[Region].&[Хабаровск]," +
"[Region].[H1].[Region].&[Комсомольск-на-Амуре],"+
"[Region].[H1].[Region].&[Комсомольский район]} ON 1 FROM [KHABCUBE]",
strings: [{
title: "Khabarovsk: ",
value: "None",
value_append: " чел."
}, {
title: "Komsomolsk-on-Amur: <br />",
value: "None",
value_append: " чел.",
row: 1
}, {
title: "Komsomolsky district: <br />",
value: "None",
value_append: " чел.",
row: 2
}]
}]
}
Основные поля для заполнения в блоке — это url для настроек виджета и mdx для настроек вычисляемых значений.


Вместе с библиотеками отчёта поставляется файл style.css позволяющий редактировать внешний вид отчёта. В нем содержится стандартный набор классов, управляющий всеми элементами отчёта. Также можно добавлять свои классы стилей и использовать их в файле index.html.
Допустим отчёт уже готов и размещён в папке отчетов в DeepSeeWeb. Т.е. интерактивный HTML-отчет теперь доступен по ссылке. Что нужно сделать, чтобы конвертировать его в PDF и разослать по почте? Это автоматически сделают pthantomjs [9] и встроенный SMTP-клиент. Как установить и настроить phantomjs можно посмотреть здесь (windows [10], ubuntu [11]). Далее нужно настроить SMTP-клиент и создать задание в Менеджере задач [12].
Все настройки производятся в терминале.
// Функция для настройки SMTP
do ##class(DSW.Report.EmailSender).setConfig(server, port, username,
password, sender, SSLConfig)
// Функция для добавления пользователя
do ##class(DSW.Report.EmailSender).addRecipient(email)
// Функция для удаления пользователя
do ##class(DSW.Report.EmailSender).deleteRecipient(email)
// Функция запускающая рассылку
do ##class(DSW.Report.Task).Run(url, reportname)
Для автоматизации рассылки воспользуемся Менеджером задач [12]. Создадим новую задачу со следующими параметрами:


Всё, после всех этих манипуляций у нас получился автогенерируемый отчёт, состоящий из виджетов DeepSeeWeb, который в заданное время рассылается по почте в виде PDF.
Пример готового отчёта можно посмотреть здесь [14].
Файл конфигурации этого отчёта посмотреть здесь [15].
А здесь [16] можно подписаться на еженедельную доставку отчетов.
Ссылка [1] на репозиторий.
Автор: Sennin
Источник [17]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/293817
Ссылки в тексте:
[1] DSW Reports: https://github.com/intersystems-community/dsw-reports
[2] InterSystems IRIS Data Platform: https://www.intersystems.com/resources/detail/intersystems-iris-data-platform/
[3] InterSystems IRIS Business Intelligence: https://www.intersystems.com/products/intersystems-iris/analytics/
[4] DeepSeeWeb: https://github.com/intersystems-ru/DeepSeeWeb
[5] https://github.com/intersystems-ru/Cache-MDX2JSON: https://github.com/intersystems-ru/Cache-MDX2JSON
[6] один: https://habr.com/company/intersystems/blog/335586/
[7] два: https://habr.com/company/intersystems/blog/351992/
[8] Analyzer: https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=D2ANLY_ch_intro
[9] pthantomjs: http://phantomjs.org/
[10] windows: https://youtu.be/L8Lw53MjDdY
[11] ubuntu: https://www.vultr.com/docs/how-to-install-phantomjs-on-ubuntu-16-04
[12] Менеджере задач: https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GSA_manage_taskmgr
[13] SSL-конфигурации: https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GCAS_ssltls
[14] здесь: https://bit.ly/2MhMLfh
[15] здесь: https://github.com/intersystems-community/dc-analytics/blob/master/src/reports/week/config.js
[16] здесь: https://community.intersystems.com/post/analysing-developer-community-activity-using-intersystems-analytics-technology-deepsee
[17] Источник: https://habr.com/post/419433/?utm_campaign=419433
Нажмите здесь для печати.