1

Выполнение отчета на основе шаблона

Тема: Выполнение отчета на основе шаблона

Здравствуйте. Возник вопрос по отчету.
Пытаюсь выполнить отчет, передавая шаблон по запросу. Шаблон был получен при помощи запроса

report/get_report_data

.
Пытался подставить его целиком и убирая поля "id" и "n", как в примере ниже. Результат один error:4. Подскажите, пожалуйста, как правильно передать шаблон в запрос.

svc=report/exec_report&params={"reportResourceId":*****,"reportTemplateId":0,"reportObjectId":*****,"reportObjectSecId":0,"interval":{"from":1503176400,"to":1503262799,"flags":0},"reportTemplate":{"ct":"avl_unit","p":"","tbl":[{"n":"unit_stats","l":"Статистика","c":"","cl":"","s":"[\"address_format\",\"time_format\",\"us_units\"]","sl":"[\"Address\",\"Time Format\"]","p":"{\"address_format\":\"0_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_trips","l":"Поездки","c":"[\"time_begin\",\"time_end\",\"mileage\"]","cl":"[\"Начало\",\"Конец\",\"Пробег\"]","s":"","sl":"","p":"{\"grouping\":\"{\\\"type\\\":\\\"total\\\",\\\"sortColumn\\\":0}\"}","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":16}]}}

2

Выполнение отчета на основе шаблона

Re: Выполнение отчета на основе шаблона

jasont, здравствуйте.
Где-то уже обсуждалась именно эта проблема. Не забывайте энкодить данные. В частности строки с % нужно кодировать.
Для данной строки должно получиться вот что %25Y-%25m-%25E_%25H%3A%25M%3A%25S

Solutions Department
Gurtam
3

Выполнение отчета на основе шаблона

(23/08/2017 10:50:10 отредактировано jasont)

Re: Выполнение отчета на основе шаблона

Да, я действительно забыл, что нужно кодировать строки. Правда, это все-равно не помогло. Запрос с шаблоном возвращает error:4. Без него(но с параметром "reportTemplateId" не 0) выдает результат.
+++
Я уже посмотрел все темы в поиске использовал "шаблон запрос". Но предыдущие советы, увы, не помогли.

4

Выполнение отчета на основе шаблона

Re: Выполнение отчета на основе шаблона

jasont, ещё нужно добавить название темплейта - поле "n" и тогда заработает.
Пример есть тут:
https://sdk.wialon.com/playground/demo/ … tom_report

Solutions Department
Gurtam
5

Выполнение отчета на основе шаблона

Re: Выполнение отчета на основе шаблона

Итак. Добавил кодирование строк и добавил имя пока без результата. Привожу ниже пример запроса:

+ открыть спойлер

svc=report/exec_report&params={"reportResourceId":*****,"reportTemplateId":0,"reportObjectId":*****,"reportObjectSecId":0,"interval":{"from":1503176400,"to":1503262799,"flags":0},"reportTemplate":{"n":"%D0%A2%D0%B5%D1%81%D1%82","ct":"avl_unit","p":"%7B%5C%22bind%5C%22%3Anull%7D","tbl":[{"n":"unit_stats","l":"%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0","c":"","cl":"","s":"%5B%5C%22address_format%5C%22%2C%5C%22time_format%5C%22%2C%5C%22us_units%5C%22%5D","sl":"%5B%5C%22Address%5C%22%2C%5C%22Time%20Format%5C%22%5D","p":"%7B%5C%22address_format%5C%22%3A%5C%220_10_5%5C%22%2C%5C%22time_format%5C%22%3A%5C%22%25Y-%25m-%25E_%25H%3A%25M%3A%25S%5C%22%2C%5C%22us_units%5C%22%3A0%7D","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_trips","l":"%D0%9F%D0%BE%D0%B5%D0%B7%D0%B4%D0%BA%D0%B8","c":"%5B%5C%22time_begin%5C%22%2C%5C%22time_end%5C%22%2C%5C%22mileage%5C%22%5D","cl":"%5B%5C%22%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D0%BE%5C%22%2C%5C%22%D0%9A%D0%BE%D0%BD%D0%B5%D1%86%5C%22%2C%5C%22%D0%9F%D1%80%D0%BE%D0%B1%D0%B5%D0%B3%5C%22%5D","s":"","sl":"","p":"%7B%5C%22grouping%5C%22%3A%5C%22%7B%5C%5C%5C%22type%5C%5C%5C%22%3A%5C%5C%5C%22total%5C%5C%5C%22%2C%5C%5C%5C%22sortColumn%5C%5C%5C%22%3A0%7D%5C%22%7D","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":16}]}&sid=02a9dedae4de46bf16e1786b5b27fa29

Так же попробовал шаблону добавить "id":0(как в примере). Результат тот же. То же самое, если кодировать только % или все параметры. К сожалению, пока не могу понять, как нужно поправить шаблон.

6

Выполнение отчета на основе шаблона

Re: Выполнение отчета на основе шаблона

Добрый день!

Есть вопросик по выполнению отчета, табличка статистика. Я хотел бы вывести клиенту в статистику не только расход топлива, но и расход AdBlue. Соответственно у меня будет создано два датчика:
- Уровень топлива
- Уровень AdBlue
Оба датчика  с типом "Датчик уровня топлива". Вот тут и возникает затык: если есть два датчика с типом "датчик уровня топлива", то в статистику выводит суммарный расход по двум датчикам.  Фильтрация по датчикам в статистике не предусмотрена, поэтому вывести отдельно расход по ДУТ и по AdBlue не предоставляется возможным. Использовать сводку тоже не вариант, т.к. клиенту придется менять все шаблоны, а у него их ох как много.
Вопрос, что можно в моем случае сделать с отчетом? Как можно вывести в статистику расход по отдельным датчикам?
Можно ли в будущем добавить в статистику фильтр по датчикам? Мне кажется фильтр в статистике был бы очень удобен.

7

Выполнение отчета на основе шаблона

Re: Выполнение отчета на основе шаблона

jasont, в данном случае кодировать нужно только содержимое time_format.
У вас всё заработает если ещё в конце добавите недостающую фигурную скобку.
Пользуйтесь например онлайн инструментами для валидации json.

Solutions Department
Gurtam
8

Выполнение отчета на основе шаблона

Re: Выполнение отчета на основе шаблона

Спасибо. Действительно заработало.
P.S. Честно говоря, не заметил, как лишнюю скобку удалил.

9

Выполнение отчета на основе шаблона

Re: Выполнение отчета на основе шаблона

lodm, возможно проще окажется сделать второй датчик произвольным?

Solutions Department
Gurtam
10

Выполнение отчета на основе шаблона

Re: Выполнение отчета на основе шаблона

deal пишет:

lodm, возможно проще окажется сделать второй датчик произвольным?

Тогда я не смогу вывести расход AdBlue по этому датчику, если он будет произвольным. Расход топлива считается системой только для типов датчиков ДУТ, ДМРТ, ДАРТ, ДИРТ....

11

Выполнение отчета на основе шаблона

Re: Выполнение отчета на основе шаблона

и наоборот, если ДУТ сделать произвольным, то для топлива мы не получим расчет расхода.

12

Выполнение отчета на основе шаблона

Re: Выполнение отчета на основе шаблона

lodm статистика - это агрегированные данные по всему объекту на всем интервале отчета.

То, что вы предлагаете поднимали уже миллион раз и каждый раз предлагается аж два варианта решения такого вопроса - "сделайте флаг - разделять ДУТы" и "добавьте уже фильтры в статистику". Я думаю, если поискать, то на форуме найдется не одна тема по данному вопросу.

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

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

13

Выполнение отчета на основе шаблона

Re: Выполнение отчета на основе шаблона

Я понял Вас. Спасибо за подробное объяснение.

14

Выполнение отчета на основе шаблона

Re: Выполнение отчета на основе шаблона

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

У меня так же возникла трудность с формированием запроса - Подскажите, пожалуйста, как правильно передать шаблон в запрос?

Я использую https://github.com/wialon/php-wialon :

+ открыть спойлер
$wialon_api->report_exec_report('{"reportResourceId":********,"reportTemplateId":0,"reportObjectId":********,"reportObjectSecId":0,"interval":{"flags":16777216,"from":1522530000,"to":1525121999},"reportObjectIdList":[],"reportTemplate":[{"n":"my test","ct":"avl_unit_group","p":"{\"bind\":{\"avl_unit_group\":[]}}","tbl":[{"n":"unit_group_stats","l":"Статистика","c":"","cl":"","cp":"","s":"[\"address_format\",\"time_format\",\"us_units\"]","sl":"[\"Address\",\"Time Format\",\"Measure\"]","p":"{\"address_format\":\"1255211008_10_5\",\"time_format\":\"_\",\"us_units\":0}","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0},{"n":"unit_group_trips","l":"Поездки","c":"[\"correct_mileage\"]","cl":"[\"Пробег (скорректированный)\"]","cp":"[{}]","s":"","sl":"","p":"","sch":{"f1":0,"f2":0,"t1":0,"t2":0,"m":0,"y":0,"w":0,"fl":0},"f":0}]}]
}');

Для удобства восприятия вот содержимое reportTemplate:

+ открыть спойлер
[
  {
    "n": "my test",
    "ct": "avl_unit_group",
    "p": "{\"bind\":{\"avl_unit_group\":[]}}",
    "tbl": [
      {
        "n": "unit_group_stats",
        "l": "Статистика",
        "c": "",
        "cl": "",
        "cp": "",
        "s": "[\"address_format\",\"time_format\",\"us_units\"]",
        "sl": "[\"Address\",\"Time Format\",\"Measure\"]",
        "p": "{\"address_format\":\"1255211008_10_5\",\"time_format\":\"_\",\"us_units\":0}",
        "sch": {
          "f1": 0,
          "f2": 0,
          "t1": 0,
          "t2": 0,
          "m": 0,
          "y": 0,
          "w": 0,
          "fl": 0
        },
        "f": 0
      },
      {
        "n": "unit_group_trips",
        "l": "Поездки",
        "c": "[\"correct_mileage\"]",
        "cl": "[\"Пробег (скорректированный)\"]",
        "cp": "[{}]",
        "s": "",
        "sl": "",
        "p": "",
        "sch": {
          "f1": 0,
          "f2": 0,
          "t1": 0,
          "t2": 0,
          "m": 0,
          "y": 0,
          "w": 0,
          "fl": 0
        },
        "f": 0
      }
    ]
  }
]

Содержимое reportTemplate получил через report/get_report_data и просто вставляю в запрос, но результат один - error:4 . Если reportTemplateId:4 (Существующий отчет) то запрос отрабатывает. Понимаю что-то нужно делать с JSON-ом в reportTemplate, но не пойму что. В валидаторе он валидный. Прочитал тут выше "..Не забывайте энкодить данные..." но как я понял в этой библиотеке все энкодится перед отправкой через cUrl.

Заранее, Всем спасибо за любую подсказку.

15

Выполнение отчета на основе шаблона

Re: Выполнение отчета на основе шаблона

Добрый день

Рабочий пример с вашим запросом (токен и itemid подставьте свой)

<?php

error_reporting(E_ALL);
ini_set("display_errors", 1);

include('wialon/wialon.php');

$TOKEN = 'TOKEN';
$itemId = 123123123;

$wialon_api = new Wialon();

$response = $wialon_api->login($TOKEN);

$json = json_decode($response, true);
if (!isset($json['error'])) {

    $resourceId = $json['user']['bact'];

    $params = [
        "reportResourceId" => $resourceId,
        "reportTemplateId" => 0,
        "reportObjectId" => $itemId,
        "reportObjectSecId" => 0,
        "interval" => [
            "flags" => 16777216,
            "from" => 1522530000,
            "to" => 1525121999
        ],
        "reportTemplate" => [
            "n" => "my test",
            "ct" => "avl_unit_group",
            "p" => json_encode(["bind" => ["avl_unit_group" => []]]),
            "tbl" => [[
                "n" => "unit_group_stats",
                "l" => "Статистика",
                "c" => "",
                "cl" => "",
                "cp" => "",
                "s" => json_encode(["address_format", "time_format", "us_units"]),
                "sl" => json_encode(["Address", "Time Format", "Measure"]),
                "p" => json_encode(["address_format" => "1255211008_10_5", "time_format" => "_", "us_units" => 0]),
                "sch" => ["f1" => 0,"f2" => 0,"t1" => 0,"t2" => 0,"m" => 0,"y" => 0,"w" => 0,"fl" => 0],
                "f" => 0
            ],[
                "n" => "unit_group_trips",
                "l" => "Поездки",
                "c" => json_encode(["correct_mileage"]),
                "cl" => json_encode(["Пробег (скорректированный)"]),
                "cp" => "[{}]",
                "s" => "",
                "sl" => "",
                "p" => "",
                "sch" => ["f1" => 0,"f2" => 0,"t1" => 0,"t2" => 0,"m" => 0,"y" => 0,"w" => 0,"fl" => 0],
                "f" => 0
            ]]
        ]
    ];
    $params = json_encode($params);

    echo "<p>$params</p>";

    print_r(json_decode($wialon_api->report_exec_report($params), true));

    } else {
        echo WialonError::error($json['error']);
        $wialon_api->logout();
    }
?>
16

Выполнение отчета на основе шаблона

Re: Выполнение отчета на основе шаблона

shmi пишет:

Рабочий пример с вашим запросом (токен и itemid подставьте свой)

Огромное спасибо за реальный код под мой случай. Да действительно все заработало.