1

Remote API: Выполнение отчета по шаблону

(edited by BelC 04/07/2017 12:25:50)

Topic: Remote API: Выполнение отчета по шаблону

Здравствуйте!

Столкнулись с такой проблемой:

Нужно получить моточасы техники (общее время, общие моточасы, моточасы на стоянке) в разрезе водителей.
Пришли к выводу, что одним отчетом эти данные не достать - сделали два шаблона:

Получение общего времени и моточасов по технике, без водителей:

{"id":6,"n":"Сводный по объекту","ct":"avl_unit","p":"{\"bind\":null}","tbl":[{"n":"unit_stops","l":"","c":"","cl":"","s":"[\"chart_stops_regions\"]","sl":"","p":"","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_conn_quality","l":"","c":"","cl":"","s":"[\"chart_conn_quality_regions\"]","sl":"","p":"","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_stays","l":"","c":"","cl":"","s":"[\"chart_stays_regions\"]","sl":"","p":"","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_trips","l":"","c":"","cl":"","s":"[\"chart_trips_regions\"]","sl":"","p":"","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_stats","l":"Статистика","c":"","cl":"","s":"[\"address_format\",\"time_format\",\"us_units\"]","sl":"[\"Address\",\"Time Format\"]","p":"{\"address_format\":\"1255211008_10_5\",\"time_format\":\"%Y-%m-%E_%H:%M:%S\",\"us_units\":0}","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_generic","l":"Сводка","c":"[\"mileage\",\"avg_speed\",\"max_speed\",\"in_motion\",\"eh\",\"sensor_duration\",\"duration_stay\",\"fuel_consumption_fls\",\"avg_fuel_consumption_fls\",\"fuel_level_begin\",\"fuel_level_end\",\"fillings_count\",\"thefts_count\",\"filled\",\"thefted\"]","cl":"[\"Пробег в поездках\",\"Ср. скорость\",\"Макс. скорость\",\"Время в движении\",\"Моточасы\",\"Длительность полезной работы\",\"Стоянки\",\"Потрачено по ДУТ\",\"Ср. расход по ДУТ\",\"Нач. уровень\",\"Конеч. уровень\",\"Всего заправок\",\"Всего сливов\",\"Заправлено\",\"Слито\"]","s":"","sl":"","p":"{\"grouping\":\"{\\\"type\\\":\\\"day\\\"}\",\"fillings_params\":{},\"thefts_params\":{},\"sensors_params\":{},\"custom_interval\":{\"type\":\"0\"}}","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":4369},{"n":"unit_chart","l":"График уровня топлива","c":"[\"voltage_sensors_base\",\"fuel_level\",\"fuel_level_proc_inline\"]","cl":"[\"Напряжение\",\"Уровень топлива\",\"Обработанный уровень топлива\"]","s":"","sl":"","p":"{\"sensor_mask\":\"*\",\"chart_regions\":[{\"id\":\"chart_stops_regions\",\"color\":14413564,\"priority\":5,\"name\":\"Stops\"},{\"id\":\"chart_conn_quality_regions\",\"color\":14474460,\"priority\":3,\"name\":\"Connection loss\"},{\"id\":\"chart_stays_regions\",\"color\":16773056,\"priority\":2,\"name\":\"Parkings\"},{\"id\":\"chart_trips_regions\",\"color\":16766408,\"priority\":1,\"name\":\"Trips\"}]}","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_chart","l":"Графики ДУТ раздельно","c":"[\"custom_sensors_base\",\"custom_sensors_smooth\"]","cl":"[\"Произвольные датчики\",\"Произвольные датчики (сглаж.)\"]","s":"","sl":"","p":"{\"sensor_mask\":\"*\",\"chart_regions\":[{\"id\":\"chart_stops_regions\",\"color\":14413564,\"priority\":5,\"name\":\"Stops\"},{\"id\":\"chart_stays_regions\",\"color\":16773056,\"priority\":2,\"name\":\"Parkings\"},{\"id\":\"chart_trips_regions\",\"color\":16766408,\"priority\":1,\"name\":\"Trips\"}]}","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0}]}

И второй для получения информации по поездкам водителей:

{"id":4,"n":"Комплексный по ТС","ct":"avl_unit","p":"{\"bind\":null}","tbl":[{"n":"unit_fillings","l":"Заправки","c":"","cl":"","s":"[\"render_filling_markers\"]","sl":"[\"Маркеры заправок\"]","p":"","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_stops","l":"Остановки","c":"","cl":"","s":"[\"render_stops_markers\",\"chart_stops_regions\"]","sl":"[\"Маркеры остановок\"]","p":"","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_thefts","l":"Сливы","c":"","cl":"","s":"[\"render_theft_markers\"]","sl":"[\"Маркеры сливов\"]","p":"","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_stays","l":"Стоянки","c":"","cl":"","s":"[\"render_stays_markers\",\"chart_stays_regions\"]","sl":"[\"Маркеры стоянок\"]","p":"","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_trips","l":"Поездки","c":"","cl":"","s":"[\"render_trips\",\"chart_trips_regions\"]","sl":"[\"Треки поездок\"]","p":"","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_stats","l":"Статистика","c":"","cl":"","s":"[\"address_format\",\"time_format\",\"us_units\"]","sl":"[\"Address\",\"Time Format\"]","p":"{\"address_format\":\"1255211008_10_5\",\"time_format\":\"%Y-%m-%E_%H:%M:%S\",\"us_units\":0}","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_stats","l":"Статистика","c":"","cl":"","s":"[\"report_name\",\"unit_name\",\"time_begin\",\"time_end\",\"fuel_consumption_fls\",\"fuel_consumption_all\",\"fuel_level_begin\",\"fuel_level_end\",\"fuel_level_max\",\"fuel_level_min\"]","sl":"[\"Отчет\",\"Объект\",\"Начало интервала\",\"Конец интервала\",\"Потрачено по ДУТ\",\"Потрачено\",\"Нач. уровень\",\"Конеч. уровень\",\"Макс. уровень топлива\",\"Мин. уровень топлива\"]","p":"","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_fillings","l":"Заправки","c":"","cl":"","s":"[\"filled\"]","sl":"[\"Всего заправлено\"]","p":"","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_thefts","l":"Сливы","c":"","cl":"","s":"[\"thefted\"]","sl":"[\"Всего топлива слито\"]","p":"","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_trips","l":"Поездки","c":"[\"time_begin\",\"location_begin\",\"time_end\",\"location_end\",\"driver\",\"duration\",\"mileage\",\"avg_speed\",\"max_speed\",\"trips_count\",\"fuel_consumption_fls\",\"avg_fuel_consumption_fls\",\"fuel_level_begin\",\"fuel_level_end\",\"fuel_level_max\",\"fuel_level_min\",\"trailer\"]","cl":"[\"Начало\",\"Нач. положение\",\"Конец\",\"Конеч. положение\",\"Водитель\",\"Длительность\",\"Пробег\",\"Ср. скорость\",\"Макс. скорость\",\"Количество поездок\",\"Потрачено по ДУТ\",\"Ср. расход по ДУТ\",\"Нач. уровень\",\"Конеч. уровень\",\"Макс. уровень топлива\",\"Мин. уровень топлива\",\"Прицеп\"]","s":"","sl":"","p":"{\"grouping\":\"{\\\"type\\\":\\\"day\\\"}\"}","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":4368},{"n":"unit_stays","l":"Стоянки","c":"[\"time_begin\",\"time_end\",\"duration\",\"location\",\"driver\",\"stays_count\"]","cl":"[\"Начало\",\"Конец\",\"Длительность\",\"Положение\",\"Водитель\",\"Количество\"]","s":"","sl":"","p":"{\"grouping\":\"{\\\"type\\\":\\\"day\\\"}\"}","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":4368},{"n":"unit_fillings","l":"Заправки","c":"[\"time_end\",\"location_end\",\"fuel_level_begin\",\"fuel_level_filled\",\"filled\",\"sensor_name\",\"driver\",\"count\"]","cl":"[\"Время\",\"Положение\",\"Нач. уровень\",\"Конеч. уровень\",\"Заправлено\",\"Имя датчика\",\"Водитель\",\"Количество\"]","s":"","sl":"","p":"{\"grouping\":\"{\\\"type\\\":\\\"day\\\"}\",\"fillings_params\":{},\"thefts_params\":{},\"sensors_params\":{}}","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":4368},{"n":"unit_thefts","l":"Сливы","c":"[\"time_begin\",\"location_begin\",\"time_end\",\"location_end\",\"fuel_level_begin\",\"thefted\",\"fuel_level_thefted\",\"sensor_name\",\"driver\",\"count\"]","cl":"[\"Начало\",\"Нач. положение\",\"Время\",\"Конеч. положение\",\"Нач. уровень\",\"Слито\",\"Конеч. уровень\",\"Имя датчика\",\"Водитель\",\"Количество\"]","s":"","sl":"","p":"{\"grouping\":\"{\\\"type\\\":\\\"day\\\"}\",\"fillings_params\":{},\"thefts_params\":{},\"sensors_params\":{}}","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":4368},{"n":"unit_chart","l":"График уровня топлива","c":"[\"fuel_level\",\"fuel_level_proc_inline\",\"voltage_sensors_smooth\"]","cl":"[\"Уровень топлива\",\"Обработанный уровень топлива\",\"Напряжение (сглаж.)\"]","s":"","sl":"","p":"{\"sensor_mask\":\"*\",\"chart_regions\":[{\"id\":\"chart_stops_regions\",\"color\":14413564,\"priority\":5,\"name\":\"Stops\"},{\"id\":\"chart_stays_regions\",\"color\":16773056,\"priority\":4,\"name\":\"Parkings\"},{\"id\":\"chart_trips_regions\",\"color\":16766408,\"priority\":3,\"name\":\"Trips\"}]}","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_chart","l":"График ДУТ раздельно","c":"[\"custom_sensors_base\",\"custom_sensors_smooth\"]","cl":"[\"Произвольные датчики\",\"Произвольные датчики (сглаж.)\"]","s":"","sl":"","p":"{\"sensor_mask\":\"*\",\"chart_regions\":[{\"id\":\"chart_stops_regions\",\"color\":14413564,\"priority\":5,\"name\":\"Stops\"},{\"id\":\"chart_stays_regions\",\"color\":16773056,\"priority\":2,\"name\":\"Parkings\"},{\"id\":\"chart_trips_regions\",\"color\":16766408,\"priority\":1,\"name\":\"Trips\"}]}","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0}]}

Через интерфейс отчеты отрабатывают.
По идеи, если как-то вручную слепить результаты этих отчетов, то можно получить желаемое..
Значит, их нужно дернуть через RemoteAPI, причем желательно по один раз настроенным отчетам, что бы не волноваться об их изменении или возможном переносе на Local.

Как их можно выполнить имея приведенные шаблоны (были получены через функцию report/get_report_data) ?

Подставляю шаблоны в приведенном виде в параметр reportTemplate метода report/exec_report при reportTemplateId=0 и reportResourceId=user.bact из ответа token/login получаю ошибку 4!
В чем проблема?
Как правильно выполнить отчет по шаблону?

PS
Я видел пример для JavaScript API, но непонятно что не так для Remote API.

2

Remote API: Выполнение отчета по шаблону

Re: Remote API: Выполнение отчета по шаблону

BelC, добрый день.
Приведите код выполнения запросов. Скорее всего неверно передаёте параметры.

Solutions Department
Gurtam
3

Remote API: Выполнение отчета по шаблону

(edited by BelC 04/07/2017 15:41:57)

Re: Remote API: Выполнение отчета по шаблону

Действительно, ещё раз проверил код, взяв за основу тот которым отправляет веб-интерфейс hosting - оказывается лишний раз params засовывал в params.
Вот набросок на JavaScript, того что было:

var request = {
    sid    : online.eid,
    params : {
        reportObjectId   : objectId,
        reportObjectSecId: 0,
        reportResourceId : online.user.bact,
        reportTemplateId : 0,
        interval: {
            from : start,
            to   : end,
            flags: 0
        },
        reportTemplate :  template
    }
};

var params = { svc: 'report/exec_report', params: JSON.stringify( request ), sid: online.eid };

$.ajax( {
        url      :  'https://hst-api.wialon.com/wialon/ajax.html?svc=report/exec_report',
        data     :  params,
        type     :  'POST',
        dataType :  'json',
        cache    :  false
    } )
.done( function ( response ) {
        var result = { ok: !response.error };
        if ( result.ok ) {
            // process
        } else {
            console.warn( response.error );
        }
    } );

Вытащил params из request, и код начал отрабатывать. Видать просто запутался уже. Благодарю.

Осталось пара моментов которые ещё хотелось уточнить:

1) Нужно ли удалять ID из полученного шаблона для его корректного выполнения под другой учетной записью, например, не на Hosting, а уже на Local ?

2) Правильно ли я достаю значение для reportResourceId

    online - это то что я получил после token/login

3) Есть какие-то требования к правам учетной записи из-под которой выполняется произвольный отчет, что бы не словить ошибку отказа в доступе ?

    Подобные ошибки часто выскакивают при выполнении отчета по ID, если не хватило прав на него (если не ошибаюсь).

4

Remote API: Выполнение отчета по шаблону

Re: Remote API: Выполнение отчета по шаблону

BelC, хорошо что сами нашли ошибки. По вашим вопросам:
1. Судя по вашему коду Вы выполняете отчёт передавая содержимое самого шаблона в запрос exec_report. При этом предварительно получаете содержимое этого шаблона отчёта отдельным запросом. В этом случае удалять id шаблона не обязательно.
2. Правильно, если у пользователя есть доступ только на один ресурс (его учётная запись). Но можно указать id другого ресурса, на который имеется доступ.
3. На ресурс должны быть права: 1 (базовый флаг), 268435456 (просмотр шаблонов отчетов),
на объект - 1 (базовый флаг), 512 (запрос сообщений и отчетов)

Solutions Department
Gurtam
5

Remote API: Выполнение отчета по шаблону

(edited by BelC 06/07/2017 16:51:35)

Re: Remote API: Выполнение отчета по шаблону

deal, спасибо за подробный ответ!

1. Шаблон будет настроен один раз и сохранен в системе, наличие его на сервере не обязательно - значит id я удаляю...

3. Если шаблон я не буду запрашивать ( он будет уже у меня ), то нужно ли для ресурса право на просмотр шаблонов отчетов?
Сейчас у меня при авторизации запрашиваются права 0x100 это достаточно для выполнения отчета ( пока тестирую подучеткой с полными правами на все ) ?

*. Добавление флага rawValues: 1 при вызове report/select_result_rows позволяет получить данные таблиц в более удобном для обработке виде но:
а) Есть ли ограничения на объем данных возвращаемые функцией, или все упирается в среду выполнения (ну ограничения браузера или http)?
б) С Водителями и Прицепом все сложнее. Там возвращается структура с внутренним ID (кстати, почему массив?) - как получить код?
Например, структуры для водителя:

{"t":"Водитель МТЗ 82","v":0,"vt":0,"pi":{"t":"driver","ids":[2]}}

В идеале интересует код идентифицирующего устройства (карточки, таблетки и т.д.), или хотя бы тот что видно в карточке водителя через веб-интерфейс.

PS
Дело в том что запрос

svc=resource/get_unit_drivers&params={"unitId":<long>}

Мне возвращает ошибку 7. Я подставлял туда 2 (из примера описания водителя).

6

Remote API: Выполнение отчета по шаблону

Re: Remote API: Выполнение отчета по шаблону

BelC, по поводу ваших вопросов:
- При выполнении отчёта необходимо право для ресурса на просмотр шаблонов отчётов (вне зависимости от того передаёте ли сам шаблон или только его id). Пока так.
- Токена с правами 0x100 достаточно для выполнения отчётов
- Специальных ограничений на объём данных в запросе report/select_result_rows нету, однако если вы выполняете отчёт за большой интервал и в ответе на запрос report/exec_report для какой-то из таблиц значение свойства rows большое - разумно не запрашивать все строки таблицы сразу, а запрашивать данные постранично (indexFrom, indexTo)
- Что касается водителей и прицепов - массив "ids" там потому что их может быть назначено несколько. В массиве передаются id водителей/прицепов. Остальные данные для водителя с id 2 можно получить например при помощи запроса core/search_item (https://sdk.wialon.com/wiki/ru/sidebar/ … les/search). В качестве id нужно передать id ресурса, а во флаги 1 + 256 (водители). В ответе будут все водители этого ресурса, включая водителя с id 2.

Solutions Department
Gurtam