Открыть меню
Toggle preferences menu
Открыть персональное меню
Вы не представились системе
Your IP address will be publicly visible if you make any edits.

9. Отчётность: различия между версиями

Материал из Платформа Эра. Документации
Нет описания правки
Нет описания правки
 
Строка 934: Строка 934:


Значения параметра по-умолчанию также указано в приложении Администратор платформы - Параметры системы callcenter.monitoring.acd.serviceNorm = 20
Значения параметра по-умолчанию также указано в приложении Администратор платформы - Параметры системы callcenter.monitoring.acd.serviceNorm = 20
[[Категория:Курс контакт-центр]]

Текущая версия от 16:22, 9 декабря 2024

Введение и определения

Отчеты позволяют получить исчерпывающую информацию о работе системы в трех разрезах:

  • мониторинг — текущее состояние,
  • динамика — изменение показателей за последнее время (минуту, час, сутки, месяц),
  • архив — завершенные события за любой период времени.

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

При запуске приложения "Отчеты" открывается сводная панель по разговорам, очередям и операторам. Из этой панели кликом мыши можно переходить к детализированным отчетам.

Разговор (Connection) — это взаимодействие двух абонентов по телефону. Как правило, разговор начинается с набора номера телефона: сторона А набирает номер и ожидает ответа стороны Б. Если разговор был записан, его можно прослушать из табличного отчета «Завершенные разговоры».

Направления разговоров:

  • входящий — внешний (городской или мобильный) абонент разговаривает с внутренним абонентом (сотрудником),
  • исходящий — сотрудник разговаривает с внешним абонентом,
  • внутренний — разговор двух сотрудников,
  • внешний — разговор двух внешних абонентов,
  • в другое подразделение — наш сотрудник разговаривает с сотрудником другого подразделения (домена),
  • из другого подразделения — сотрудник другого подразделения разговаривает с нашим сотрудником,
  • конференция — разговор нескольких абонентов,
  • голосовое меню — абонент находится в голосовом меню IVR,
  • очередь — абонент ожидает освобождения оператора в очереди ACD,
  • смешанный — все остальные варианты.

Продолжительности разговоров:

  • ожидание — интервал времени между набором номера и ответом стороны Б,
  • разговор — основная часть (с момента ответа до завершения, за исключением удержания),
  • удержание — суммарная продолжительность удержания HOLD одним абонентом другого.

Звонок (Seance) — это цепочка связанных разговоров, возникшая в результате переключений (переводов). Звонок может содержать нескольких абонентов А и Б и позволяет по одной строке определить схему его обработки. В таблице завершенных звонков доступна детализация — это список относящихся к звонку разговоров.

Направление звонка определяется направлением первого разговора. Возможны следующие варианты:

  • входящий,
  • исходящий,
  • внутренний,
  • в другое подразделение,
  • из другого подразделения.

Результаты входящих звонков (здесь под оператором может подразумеваться как оператор, так и сотрудник):

  • обработан в голосовом меню — звонок был завершен во время автоматической обработки в IVR, без попыток переключения на операторов,
  • обработан первым оператором — звонок был обработан одним оператором, без последующих переключений,
  • обработан операторами — звонок был обработан несколькими операторами,
  • переведен в другое подразделение — звонок был переведен сотруднику другого подразделения,
  • переведен на внешний номер — звонок был переведен внешнему (городскому или мобильному) абоненту,
  • потерян — звонящий абонент положил трубку, не дождавшись ответа.

Результаты звонков остальных направлений:

  • да (разговор состоялся),
  • нет (не дозвонились).

Продолжительности звонков:

  • меню — продолжительность автоматической обработки звонка в голосовом меню,
  • очередь — продолжительность нахождения звонка в очереди (во время ожидания свободного оператора),
  • ожидание, разговор, удержание — суммарная продолжительность соответствующих показателей всех разговоров звонка.

Сотрудник — это внутренний абонент компании. Как правило, сотрудник использует IP-телефон или софтфон (программный телефон на компьютере).

Оператор — это сотрудник компании, работающий в приложении "Оператор контакт-центра". Как правило, операторы обрабатывают вызовы, поступающие в очереди ожидания. Оператор может управлять своим статусом (готов, не готов). Вызовы очередей поступают операторам в статусе "Готов" со свободной телефонной линией.

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

Результаты вызовов очередей:

  • обработан — вызов был успешно переведен на оператора,
  • не обработан — вызов был возвращен в голосовое меню (например, по истечении максимального времени ожидания),
  • потерян — звонящий абонент положил трубку, не дождавшись ответа.

Продолжительности вызовов очередей:

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

Уровень обслуживания (SL) — это процент вызовов очередей, обработанных с ожиданием, не превышающем заданное время (называемое нормой обслуживания). Классический критерий качества работы контакт-центра: 80% вызовов обработаны с ожиданием не более 20 секунд. Так выглядит расшифровка уровня обслуживания 80 при норме 20.

Нагрузка — это количество одновременно занятых телефонных линий. Один разговор, как правило, занимает две линии.

Объектная модель

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

https://{ERAURL}/app/builder_model/#/ui/callcenter/Help

Принципы построения отчетов

Для того чтобы найти управляющий элемент (control) в приложении Builder, необходимо открыть отчёт в приложении Отчеты и разобрать URL.

Разберем на примере отчет Разговоры очереди и Операторы в папке Сводка https://{ERA_URL}/app/callcenter_reports/#/ui/callcenter/dashboards/MainDashboard, где

  • callcenter_report - имя приложения (application),
  • callcenter - имя пакета (package),
  • dashboards/MainDashboard - имя управляющего элемента в этом приложении (control).

Для того чтобы открыть отчет, необходимо в приложении Builder в меню Controls выбрать пакет callcenter и в строке поиска ввести dashboards/MainDashboard. В примере управляющий элемент (типа dashboard) содержит 12 других элементов (в таблице 4 на 3), которые, в свою очередь, являются самостоятельными отчетами.

  • "controlName": "callcenter/indicators/CurrentSeances"
  • "controlName": "callcenter/indicators/CurrentACDCalls"
  • "controlName": "callcenter/indicators/CurrentOperators"
  • "controlName": "callcenter/indicators/SeancesPerHour"
  • "controlName": "callcenter/indicators/ACDCallsPerHour"
  • "controlName": "callcenter/indicators/OperatorsPerHour"
  • "controlName": "callcenter/indicators/SeancesPerDay"
  • "controlName": "callcenter/indicators/ACDCallsPerDay"
  • "controlName": "callcenter/indicators/OperatorsPerDay"
  • "controlName": "callcenter/indicators/SeancesPerMonth"
  • "controlName": "callcenter/indicators/ACDCallsPerMonth"
  • "controlName": "callcenter/indicators/OperatorsPerMonth"

Разберем управляющий элемент "controlName": "callcenter/indicators/CurrentACDCalls". Для этого в приложении Builder в папке Controls найдите в пакете callcenter элемент indicators/CurrentACDCalls.

Управляющий элемент основан на таблице (class) "className": "callcenter/acd/CurrentACDCalls". В приложении Builder, в папке Classes, в пакете callcenter найдите класс callcenter/acd/CurrentACDCalls. Данный класс содержит перечень активных звонков платформы. Класс хранится в ОЗУ и содержит необходимые поля для обработки.

Как правило, отчет основан на элементе control (типа layout или dashboard), на котором собраны элементы типа таблицы, графики, диаграммы и т. д.

Управляющие элементы таблиц и графиков опираются на классы (class).

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

Исторические отчёты опираются на классы, которые хранятся в СУБД.

Табличный отчет с фильтром

Выведем в виде отчета таблицу (встроенный класс callcenter/outbound/SimpleContragent). Обратите внимание, для работы с классом необходимо обращаться к классу во множественном числе. Например, с классом callcenter/outbound/SimpleContragent необходимо работать как с callcenter/outbound/SimpleContragents.

В приложении Builder создайте управляющий элемент (control) и выведите в нем необходимую таблицу (class).

В поле data (JSON) укажите

{  "className": "callcenter/outbound/SimpleContragents",  "defaultFilter": ["==",["property","tryCount"],["const",2]] }

Отчет отобразит таблицу с числом попыток = 2.

Тот же самый результат в виде JSON можно получить запросив следующий URL

https://{ERAURL}/rest/v1/model/callcenter/outbound/SimpleContragents?filter=["==",["property","tryCount"],["const",2]]

Синтаксис параметра – массив, представляющий собой польскую запись выражений. Первый элемент массива – оператор, последующие – его аргументы. Примеры:

  • http://localhost/rest/v1/model/demo/Customers?filter=["==",["property","name"],["const","Михаил Иванович"]]
  • http://localhost/rest/v1/model/demo/Customers?filter=["like",["property","name"],["const","*е*"]]
  • http://localhost/rest/v1/model/demo/Customers?filter=["and",["like",["property","name"],["const","*е*"]],["isnotnull",["property","address"]]

Поддерживаются следующие операторы (после слеша указано количество аргументов, в

скобках – синонимы):

  • isnull/1
  • isnotnull/1
  • not/1 ('!')
  • bool/1
  • integer/1
  • float/1
  • string/1
  • uuid/1
  • const/1
  • lower/1
  • upper/1
  • year/1 ('toYYYY','toYear')
  • quarter/1
  • month/1
  • day/1
  • hour/1
  • minute/1
  • second/1
  • weekday/1
  • toYYYYMM/1
  • toYYYYMMDD/1
  • concat/any ('.')
  • join/any ('..')
  • list/any
  • null/0
  • +/any ('add')
  • -/2 ('sub')
  • */2 ('mul')
  • //2 ('div')
  • ///2 ('ddiv')
  • %/2 ('rem')
  • &&/any ('and')
  • ||/any ('or')
  • ==/2 ('equal','equals')
  • !=/2 ('notequal','notequals','<>')
  • >/2 ('greater')
  • >=/2 ('notless','greaterorequal')
  • </2 ('less')
  • <=/2 ('notgreater','lessorequal','=<')
  • in/2
  • contains/2
  • like/2
  • interval_in_minutes/2
  • dateadd/2
  • datediff/2
  • between/3

Табличный отчет с сортировкой

Отсортируйте данные из предыдущего (5.3) примера. Добавьте параметр defaultOrder в поле data (JSON).

{"className": "callcenter/outbound/SimpleContragents","defaultFilter": ["==",["property","tryCount"],["const",2]],"defaultOrder": ["fio","asc"]}

где fio - имя поля, asc - сортировка по-возрастанию (desc - по-убыванию).

Тот же результат можно получить, выполнив запрос.

https://{ERAURL}/rest/v1/model/callcenter/outbound/SimpleContragents?order=[{"fio":"asc"}]

Исторические отчеты

Платформа ЭРА сохраняет данные типа (history) в PostgreSQL и использует метод партиционирования (partitioning). По умолчанию — это месяц. Иными словами, каждый месяц создается новая таблица для хранения исторических данных для этого месяца. Метод повышает удобство администрирования больших объемов данных. Это накладывает требования обязательного указания интервала (interval) (from и to) для составления исторических отчетов. Платформа использует ISO 8601. Например, 2024-06-24T18:52:38.413Z. Литеральное значение Z, обозначающее, что значение времени выражается как время в формате UTC.

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

Разберем отчет на примере callcenter/seances/ArchiveSeances. Управляющий элемент (control) типа table.

Поле data (JSON) содержит ссылку на основной класс, условия отображения и порядок сортировки.

{
  "allowActions": true,
  "allowDelete": false,
  "allowInsert": false,
  "allowModify": false,
  "autoCalcProperties": false,
  "className": "callcenter/seances/ArchiveSeances",
  "defaultFilter": [
    "and",
    [
      "or",
      [
        "isnull",
        [
          "parameter",
          "direction"
        ]
      ],
      [
        "==",
        [
          "property",
          "direction"
        ],
        [
          "parameter",
          "direction"
        ]
      ]
    ],
    [
      "or",
      [
        "isnull",
        [
          "parameter",
          "result"
        ]
      ],
      [
        "==",
        [
          "property",
          "result"
        ],
        [
          "parameter",
          "result"
        ]
      ]
    ],
    [
      "or",
      [
        "isnull",
        [
          "parameter",
          "abonent"
        ]
      ],
      [
        "contains",
        [
          "property",
          "searchContext"
        ],
        [
          "parameter",
          "abonent"
        ]
      ]
    ],
    [
      "or",
      [
        "isnull",
        [
          "parameter",
          "user_id"
        ]
      ],
      [
        "==",
        [
          "property",
          "sidesA",
          0,
          "user_id"
        ],
        [
          "parameter",
          "user_id"
        ]
      ],
      [
        "==",
        [
          "property",
          "sidesA",
          1,
          "user_id"
        ],
        [
          "parameter",
          "user_id"
        ]
      ],
      [
        "==",
        [
          "property",
          "sidesA",
          2,
          "user_id"
        ],
        [
          "parameter",
          "user_id"
        ]
      ],
      [
        "==",
        [
          "property",
          "sidesB",
          0,
          "user_id"
        ],
        [
          "parameter",
          "user_id"
        ]
      ],
      [
        "==",
        [
          "property",
          "sidesB",
          1,
          "user_id"
        ],
        [
          "parameter",
          "user_id"
        ]
      ],
      [
        "==",
        [
          "property",
          "sidesB",
          2,
          "user_id"
        ],
        [
          "parameter",
          "user_id"
        ]
      ],
      [
        "==",
        [
          "property",
          "sidesB",
          3,
          "user_id"
        ],
        [
          "parameter",
          "user_id"
        ]
      ],
      [
        "==",
        [
          "property",
          "sidesB",
          4,
          "user_id"
        ],
        [
          "parameter",
          "user_id"
        ]
      ],
      [
        "==",
        [
          "property",
          "sidesB",
          5,
          "user_id"
        ],
        [
          "parameter",
          "user_id"
        ]
      ]
    ],
    [
      "or",
      [
        "isnull",
        [
          "parameter",
          "domainName"
        ]
      ],
      [
        "==",
        [
          "property",
          "domainName"
        ],
        [
          "parameter",
          "domainName"
        ]
      ]
    ]
  ],
  "defaultInterval": [
    [
      "parameter",
      "timeStartFrom"
    ],
    [
      "parameter",
      "timeStartTo"
    ]
  ],
  "defaultOrder": [
    {
      "timeStart": "$setting.callcenter.client.archiveCollections.sortOrder"
    }
  ]
}

Поле filter (JSON) содержит код для работы фильтра

{
  "controlName": "platform/HistoryFilterToday",
  "controlOptions": {
    "fields": [
      {
        "caption": "$const.base.Direction",
        "editor_fullName": "callcenter/seances/SeanceDirection",
        "name": "direction"
      },
      {
        "caption": "$const.base.Result",
        "editor_fullName": "callcenter/seances/SeanceResult",
        "name": "result"
      },
      {
        "caption": "$const.base.User",
        "editor_fullName": "root/iam/RootUser",
        "name": "user_id"
      },
      {
        "caption": "$const.base.Abonent",
        "editor_fullName": "base/Text",
        "name": "abonent"
      }
    ]
  }
}

Поле customButtons (JSON) содержит код для кнопки Детализация, которая отображает связанные разговоры (Connection) со звонками (Seance).

[
  {
    "buttonKind": "code",
    "caption": "$const.base.Detailing",
    "kind": "button",
    "name": "connections",
    "onClickCode": "control_.showControlInPopup({ controlName: 'callcenter/connections/ArchiveConnections', search: 'interval='+Converter.toDateTimeString(this.timeStart)+'&filter={\"seance_link.id\":\"'+this.id+'\"}&controlOptions={\"caption\":\"$const.base.Detailing\",\"filter\":false,\"showFilterRow\":false}' });"
  }
]

Обратите внимание, что для получения исторических “сырых” данных из класса Seances при помощи REST API можно воспользоваться запросом для обращению непосредственно к классу:

https://{ERAURL}/rest/v1/model/callcenter/seances/ArchiveSeances?interval=["2024-01-01","2024-03-01"]

Для получения аналогичных данных из класса Connections выполните:

https://{ERAURL}/rest/v1/model/callcenter/connections/ArchiveConnections?interval=["2024-01-01","2024-03-01"]

Средства по работе с интервалами

При работе с коллекциями history из продуктового слоя в качестве интервала можно указывать одну из следующих констант, которые будут автоматически конвертированы в массив из двух элементов с учетом текущего времени:

  • now
  • hour
  • day
  • week
  • month
  • year
  • currentHour
  • currentDay = today
  • currentWeek
  • currentMonth
  • currentYear
  • full – интервал с 01.01.1900 по 01.01.2100

Для использования в отчетах, календарях и других элементах управления на базе классов history предусмотрены стандартные фильтры с полями timeStartFrom и timeStartTo:

  • platform/HistoryInputToday
  • platform/HistoryInputWeek
  • platform/HistoryInputMonth
  • platform/HistoryInputYear
  • platform/HistoryInputFutureWeek

Составной отчет (layout)

Для отображения не одном пространстве нескольких управляющих элементов (control) необходимо использовать тип layout.

Разберем отчет на примере Control callcenter/reports/connections/ArchiveConnectionsByHourReport

В управляющих элементах типа layout основным является поле items JSON

[
  {
    "items": 
    [
      {
        "controlName": "callcenter/reports/connections/ArchiveConnectionsByHourTable","kind": "control","name": "table"
      },
      {
        "controlName": "callcenter/reports/connections/ArchiveConnectionsByHourChart","kind": "control","name": "chart"
      }
    ],"kind": "row"
  }
]

Как видно из пример, отчет состоит из двух самостоятельных управляющих элементов (таблица и график). Расположены в строку. Для расположения по вертикали используйте "kind":"column", а для отображения во вкладах используйте "kind":"tabs"

Если для layout указан filter, его значения будут применяться ко всем вложенным элементам.

Отчет с использованием SQL

Элементарный SQL-запрос

Создайте управляющий элемент (control) типа table и в поле datasource (JSON) укажите:

{"kind":"sqlquery", "code":"select 123 as a union all select 234 as a" }

Для отображения необходимых нам столбцов воспользуйтесь полей customColumns (JSON) и укажите там

[{"propertyName":"a","caption":"Колонка А"}]

Обратите внимание, что платформа самостоятельно добавляет колонку номер по-порядку если установлен флаг showRowNumbers

Выполните реальный запрос к СУБД

select "direction", count("id") as cnt from datamodel."callcenter/connections/ArchiveConnections$" where "timeStart" between '2024-01-01' and '2024-05-01' group by "direction"

Для этого поместим запрос (с обрамленными кавычками) в поле datasource (JSON)

{  "code": "select \"direction\", count(\"id\") as cnt from datamodel.\"callcenter/connections/ArchiveConnections$\" where \"timeStart\" between '2024-01-01' and '2024-05-01' group by \"direction\"",  "kind": "sqlquery" }

и исправим поле customColumns (JSON)

[  {"caption": "Направление","propertyName": "direction"},{"caption": "Количество","propertyName": "cnt"} ]

Обращаем внимание, что регистр важен в запросах.

Для отладки запросов удобно использовать консоль браузера (F12). В консоли браузера будет видно момент отправки запроса и возможные ошибки.

Платформа сохраняет логирование процесса в коллекции dms.

Украсим отчет на базе SQL-запроса

Для исправления служебных данных из СУБД удобными для пользователя понятиями воспользуемся Редактором (Editor) builder/editors/Editors.

В платформе уже предусмотрены редакторы для многих служебных данных. Воспользуемся редактором callcenter/connections/ConnectionDirection. Для этого в поле customColumns (JSON) допишем имя редактора

[   {"caption":"Направление","editor_fullName": "callcenter/connections/ConnectionDirection","propertyName": "direction"},{"caption": "Количество","propertyName": "cnt"} ]

Добавим фильтр в отчет на базе SQL-запроса

В системе уже есть необходимое количество управляющих элементов (control) для фильтрации данных. Найдем управляющий элемент platform/HistoryFilterMonth. Укажем его в нашем отчете в поле filter (JSON)

{"controlName":"platform/HistoryFilterMonth"}

Отредактируем SQL-запрос и изменим временной интервал из фильтра.

{  "code": "select \"direction\", count(\"id\") as cnt from datamodel.\"callcenter/connections/ArchiveConnections$\" where \"timeStart\" between :timeStartFrom and :timeStartTo group by \"direction\"",  "kind": "sqlquery" }

Повторимся, что платформа отображает процесс выполнения SQL-запроса в консоли браузера (F12).

❓️ Вопрос: Почему время в фильтре и в SQL-запросе в консоли браузера может отличается?

Отчеты в виде графиков

WIP

Отчет с группировкой

Разберем отчет Уровень обслуживания (SL) по часам

callcenter/reports/acd/ArchiveACDCallsServiceLevelByHourReport

Уровень обслуживания — это процент вызовов очередей, обработанных с ожиданием, не превышающем заданное время (называемое нормой обслуживания). Классический критерий качества работы контакт-центра: 80% вызовов обработаны с ожиданием не более 20 секунд. Так выглядит расшифровка уровня обслуживания 80 при норме 20. В отчете значения от 0 до 50 подкрашены красным цветом (неудовлетворительно), от 50 до 80 желтым (удовлетворительно), больше 80 зеленым (отлично)

Отчет представляет собой составной управляющий элемент (layout), который в свою очередь состоит из двух управляющих элементов (control). Элементы перечислены в поле items (JSON) и отображены как вкладки (tabs). Оба элемента подчиняются общему фильтру.

[
  {
    "items": [
      {
        "caption": "$const.base.Table",
        "controlName": "callcenter/reports/acd/ArchiveACDCallsServiceLevelByHourTable",
        "kind": "control",
        "name": "table"
      },
      {
        "caption": "$const.base.Diagram",
        "controlName": "callcenter/reports/acd/ArchiveACDCallsServiceLevelByHourChart",
        "kind": "control",
        "name": "chart"
      }
    ],
    "kind": "tabs"
  }
]

Разберем первый control с именем callcenter/reports/acd/ArchiveACDCallsServiceLevelByHourTable

Управляющий элемент опирается на таблицу (class) callcenter/acd/ArchiveACDCalls

{
  "allowActions": false,
  "allowDelete": false,
  "allowInsert": false,
  "allowModify": false,
  "autoCalcProperties": false,
  "className": "callcenter/acd/ArchiveACDCalls",
  "defaultAggr": {
    "aht": [
      "avg",
      [
        "mul",
        [
          "integer",
          [
            "==",
            [
              "property",
              "result"
            ],
            "processed"
          ]
        ],
        [
          "add",
          [
            "property",
            "durationProcess"
          ],
          [
            "property",
            "durationPostprocess"
          ]
        ]
      ]
    ],
    "awt": [
      "avg",
      [
        "mul",
        [
          "integer",
          [
            "==",
            [
              "property",
              "result"
            ],
            "processed"
          ]
        ],
        [
          "property",
          "durationWait"
        ]
      ]
    ],
    "countFAP": [
      "sum",
      [
        "integer",
        [
          "&&",
          [
            "==",
            [
              "property",
              "result"
            ],
            "processed"
          ],
          [
            "==",
            [
              "property",
              "operatorsCount"
            ],
            1
          ]
        ]
      ]
    ],
    "countLost": [
      "sum",
      [
        "integer",
        [
          "==",
          [
            "property",
            "result"
          ],
          "lost"
        ]
      ]
    ],
    "countNotProcessed": [
      "sum",
      [
        "integer",
        [
          "==",
          [
            "property",
            "result"
          ],
          "notprocessed"
        ]
      ]
    ],
    "countOK": [
      "sum",
      [
        "integer",
        [
          "&&",
          [
            "==",
            [
              "property",
              "result"
            ],
            "processed"
          ],
          [
            "<=",
            [
              "property",
              "durationWait"
            ],
            [
              "parameter",
              "serviceNorm"
            ]
          ]
        ]
      ]
    ],
    "countProcessed": [
      "sum",
      [
        "integer",
        [
          "==",
          [
            "property",
            "result"
          ],
          "processed"
        ]
      ]
    ],
    "countTotal": [
      "count",
      "id"
    ]
  },
  "defaultFilter": [
    "and",
    [
      "or",
      [
        "isnull",
        [
          "parameter",
          "acdQueue_ids"
        ]
      ],
      [
        "in",
        [
          "property",
          "acdQueue_id"
        ],
        [
          "parameter",
          "acdQueue_ids"
        ]
      ]
    ],
    [
      "or",
      [
        "isnull",
        [
          "parameter",
          "domainName"
        ]
      ],
      [
        "==",
        [
          "property",
          "domainName"
        ],
        [
          "parameter",
          "domainName"
        ]
      ]
    ]
  ],
  "defaultGroupby": {
    "hour": [
      "hour",
      [
        "dateadd",
        [
          "property",
          "timeStart"
        ],
        "$$$TimeZoneSecondsShift$$$"
      ]
    ]
  },
  "defaultInterval": [
    [
      "parameter",
      "timeStartFrom"
    ],
    [
      "parameter",
      "timeStartTo"
    ]
  ],
  "defaultOrder": [
    {
      "hour": "asc"
    }
  ],
  "fillEmptyGroups": true,
  "postProcessCode": "this.forEach(item_ => {\nitem_.serviceLevel = item_.countTotal ? Converter.round(100 * (item_.countOK ?? 0) / Math.max(1, (item_.countTotal ?? 1)), 1) : undefined;\nitem_.percentLost = item_.countTotal ? Converter.round(100 * (item_.countLost ?? 0) / Math.max(1, (item_.countTotal ?? 1)), 1) : undefined;\nitem_.percentNotProcessed = item_.countTotal ? Converter.round(100 * (item_.countNotProcessed ?? 0) / Math.max(1, (item_.countTotal ?? 1)), 1) : undefined;\nitem_.fap = item_.countTotal ? Converter.round(100 * (item_.countFAP ?? 0) / Math.max(1, (item_.countTotal ?? 1)), 1) : undefined;\n});"
}

Группировка по часам реализуется параметром defaultGroupby : hour

Для отображения колонок используется поле column (JSON)

[
  {
    "caption": "$const.base.Hour",
    "editor_fullName": "platform/HourInterval",
    "propertyName": "hour"
  },
  {
    "caption": "$const.base.Total",
    "editor_fullName": "base/Integer",
    "propertyName": "countTotal"
  },
  {
    "caption": "$const.callcenter.CurrentCampaignLaunchDashboard.Processed",
    "editor_fullName": "base/Integer",
    "propertyName": "countProcessed"
  },
  {
    "caption": "$const.callcenter.CountProcessedBySL",
    "editor_fullName": "base/Integer",
    "propertyName": "countOK"
  },
  {
    "caption": "$const.callcenter.CountNotProcessed",
    "editor_fullName": "base/Integer",
    "propertyName": "countNotProcessed"
  },
  {
    "caption": "$const.callcenter.CurrentCampaignLaunchDashboard.Lost",
    "editor_fullName": "base/Integer",
    "propertyName": "countLost"
  },
  {
    "caption": "$const.callcenter.SL_ServiceLevel",
    "formatConditions": [
      {
        "code": "!Converter.isNull(this.serviceLevel) && this.serviceLevel >= PlatformServices.settings.getSettingByName('callcenter.indicators.acdcalls.servicelevel.green')",
        "color": "green"
      },
      {
        "code": "!Converter.isNull(this.serviceLevel) && this.serviceLevel >= PlatformServices.settings.getSettingByName('callcenter.indicators.acdcalls.servicelevel.yellow')",
        "color": "yellow"
      },
      {
        "code": "!Converter.isNull(this.serviceLevel) && this.serviceLevel >= PlatformServices.settings.getSettingByName('callcenter.indicators.acdcalls.servicelevel.red')",
        "color": "red"
      }
    ],
    "propertyName": "serviceLevel"
  },
  {
    "caption": "$const.callcenter.NotProcessedPercent",
    "propertyName": "percentNotProcessed"
  },
  {
    "caption": "$const.callcenter.LostPercent",
    "formatConditions": [
      {
        "code": "!Converter.isNull(this.percentLost) && this.percentLost >= PlatformServices.settings.getSettingByName('callcenter.indicators.acdcalls.percentlost.red')",
        "color": "red"
      },
      {
        "code": "!Converter.isNull(this.percentLost) && this.percentLost >= PlatformServices.settings.getSettingByName('callcenter.indicators.acdcalls.percentlost.yellow')",
        "color": "yellow"
      },
      {
        "code": "!Converter.isNull(this.percentLost) && this.percentLost >= PlatformServices.settings.getSettingByName('callcenter.indicators.acdcalls.percentlost.green')",
        "color": "green"
      }
    ],
    "propertyName": "percentLost"
  },
  {
    "caption": "$const.callcenter.FAP_FirstAgentProcessed",
    "propertyName": "fap"
  },
  {
    "caption": "$const.callcenter.AWT_Waiting",
    "editor_fullName": "base/Duration",
    "propertyName": "awt"
  },
  {
    "caption": "$const.callcenter.AHT_Processing",
    "editor_fullName": "base/Duration",
    "propertyName": "aht"
  }
]

Как видно из описания колонок, в коде указан цвет и пороговые значения. При необходимости пороговые системные значения можно отредактировать или добавить новые в приложении Администратор Платформы - Параметры системы. Значения:

  • callcenter.indicators.acdcalls.servicelevel.green
  • callcenter.indicators.acdcalls.servicelevel.yellow
  • callcenter.indicators.acdcalls.servicelevel.red

Обратите внимание на колонку “Обслужено в норме”. Имеется в виду количество вызовов, которые были приняты быстрее порогового значения (в секундах).

Значения параметра по-умолчанию также указано в приложении Администратор платформы - Параметры системы callcenter.monitoring.acd.serviceNorm = 20