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

Для решения задачи мы воспользуемся приложением CDR, которое позволит нам выполнить запрос в базу elasticsearch и получить среднее время ожидания абонентов в очереди main за последний час. Правильный запрос в elasticsearch будет иметь вот такой вид:

elasticsearch
{
    "size": 0,
    "aggs": {
        "waiting": {
            "avg": {
                "field": "queue.wait_duration"
            }
        }
    },
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "queue.name": "main"
                    }
                },
                {
                    "range": {
                        "created_time": {
                            "gte": "now-1h",
                            "lte": "now"
                        }
                    }
                }
            ]
        }
    }
}

Остается оформить все в нашей схеме ACR: получить целую часть из среднего значения ожидания в очереди, текст озвучим с помощью синтеза речи и т.д.

Привожу простой пример такой схемы:

ACR
[
	{
		"cdr": {
			"exportVar": {
				"avg_wait": "aggregations.waiting.value"
			},
			"elastic": {
				"aggs": {
					"waiting": {
						"avg": {
							"field": "queue.wait_duration"
						}
					}
				},
				"index": "cdr-a*",
				"limit": 0,
				"query": "*",
				"filter": {
					"bool": {
						"must": [
							{
								"match": {
									"queue.name": "main"
								}
							},
							{
								"range": {
									"created_time": {
										"gte": "now-1h",
										"lte": "now"
									}
								}
							}
						]
					}
				}
			}
		}
	},
	{
		"math": {
			"data": "${avg_wait}",
			"setVar": "avg_wait",
			"fn": "ceil"
		}
	},
	{
		"log": "avg_wait: ${avg_wait}"
	},
	{
		"queue": {
			"name": "main",
			"timer": {
				"interval": 1,
				"tries": 1,
				"actions": [
					{
						"ccPosition": {
							"var": "ccPosition"
						}
					},
					{
						"if": {
							"expression": "!${avg_wait} || ${avg_wait} < 60",
							"then": [
								{
									"tts": {
										"text": "Расчетное время ожидания до соединения с оператором меньше одной минуты.",
										"voice": "Maxim"
									}
								}
							]
						}
					},
					{
						"if": {
							"expression": "${avg_wait} > 120",
							"then": [
								{
									"tts": {
										"text": "Расчетное время ожидания до соединения с оператором больше двух минут.",
										"voice": "Maxim"
									}
								}
							],
							"else": [
								{
									"tts": {
										"text": "Расчетное время ожидания до соединения с оператором меньше двух минут.",
										"voice": "Maxim"
									}
								}
							]
						}
					}
				]
			}
		}
	}
]