Определение времени работы внутренних линий — различия между версиями

Материал из Oktell
Перейти к: навигация, поиск
м (Результаты)
 
(не показаны 24 промежуточные версии этого же участника)
Строка 1: Строка 1:
Задача: Мониторинг состояния внутренних линий и определение времены работы внутренних линий.
+
[[Практики|Наверх]]
  
Задача становится актуальной, когда операторы системы не используют клиентских приложений, а установлены как "пользователь по умолчанию" для своего телефона. В базу данных Oktell информация о разрегистрации линии не заносится и проверка работы линий доступна только с помощью клиентского приложения (модуль "'''Мониторинг'''"), что является не очень удобным.  
+
'''Задача:''' Мониторинг состояния внутренних линий и определение времены работы внутренних линий.
 +
 
 +
Задача становится актуальной, когда операторы системы не используют клиентских приложений, а установлены как "'''пользователь по умолчанию'''" для своего телефона. В базу данных '''Oktell''' информация о разрегистрации линии не заносится и проверка работы линий доступна только с помощью клиентского приложения (модуль "'''Мониторинг'''"), что является не очень удобным.  
  
 
Следовательно, необходимо создать сценарий, который будет проверять состояние линий и вести статистику о времени работы каждой линии, а следовательно и пользователя системы. В случае выключенной линии, сценарий оповестит об этом администратора системы. Сценарий выглядит следующим образом:
 
Следовательно, необходимо создать сценарий, который будет проверять состояние линий и вести статистику о времени работы каждой линии, а следовательно и пользователя системы. В случае выключенной линии, сценарий оповестит об этом администратора системы. Сценарий выглядит следующим образом:
 +
  
 
[[Файл:РаботаВнутреннихЛиний-001.png | center]]
 
[[Файл:РаботаВнутреннихЛиний-001.png | center]]
 +
  
 
Структурно сценарий состоит из  
 
Структурно сценарий состоит из  
* Цикла по внутренним SIP линиям. Блок взят из статьи [[Построковая обработка sql выборки в сценарии]] (Вариант 1)
+
* Цикла по внутренним SIP-линиям. Блок взят из статьи [[Построковая обработка sql выборки в сценарии]] (Вариант 1)
* Определения статуса конкретной SIP линии. Блок взят из статьи [[Мониторинг состояния внешних линий]]
+
* Определения статуса конкретной SIP-линии. Блок взят из статьи [[Мониторинг состояния внешних линий]]
 
* Обновление статистики по работе линии
 
* Обновление статистики по работе линии
  
1. Компонент "Начальные параметры". Заданы параметры - начальное значение для поиска внутренних линий и текущая дата.
 
  
2. Компонент "Находим линию". Определяет следующую по порядку внутреннюю SIP линию по столбцу systemnumstr. В качестве выходных параметров запрос выдает res - результат запроса (1- найдена линия, 0 -не найдена), systemnumstr - номер внутренней линии.  
+
=== Описание компонентов ===
 +
 
 +
'''1.''' Компонент "'''Начальные параметры'''". Заданы параметры - начальное значение для поиска внутренних линий и текущая дата.
 +
 
 +
'''2.''' Компонент "'''Находим линию'''". Определяет следующую по порядку внутреннюю '''SIP''' линию по столбцу '''systemnumstr'''. В качестве выходных параметров запрос выдает '''res''' - результат запроса (1- найдена линия, 0 -не найдена), '''systemnumstr''' - номер внутренней линии.  
 
   
 
   
 
  declare @min int
 
  declare @min int
Строка 28: Строка 35:
 
Запрос использует таблицу:  
 
Запрос использует таблицу:  
  
* [oktell_settings].[dbo].[A_ServerSipLines] — столбец SystemNumStr показывает номера внутренних SIP линий, определенных в системе.  
+
* '''[oktell_settings].[dbo].[A_ServerSipLines]''' — столбец '''SystemNumStr''' показывает номера внутренних '''SIP''' линий, определенных в системе.  
  
 
Однако вы также можете использовать таблицы:
 
Однако вы также можете использовать таблицы:
  
* [oktell_settings].[dbo].[A_ServerUSBLines] — столбец SystemNumStr показывает номера внутренних Voip линий (гарнитура или usb телефон).
+
* '''[oktell_settings].[dbo].[A_ServerUSBLines]''' — столбец '''SystemNumStr''' показывает номера внутренних '''Voip''' линий (гарнитура или usb телефон).
  
* [oktell_settings].[dbo].[A_ServerExtLines] — столбец SystemNumStr показывает номера внешних SIP линий
+
* '''[oktell_settings].[dbo].[A_ServerExtLines]''' — столбец '''SystemNumStr''' показывает номера внешних '''SIP''' линий
  
3. Компонент "Проверка на завершение". Определяет конец цикла (был осуществлен перебор всех линий). Сравнение переменной res с нулем.  
+
Также в запросе вы можете объединить эти таблицы и получать информацию по всем линиям.  
  
4. Компонент "id_before = id_after". Переприсваивает переменную для поиска следующей sip линии на следующем цикле.  
+
'''3.''' Компонент "'''Проверка на завершение'''". Определяет конец цикла (был осуществлен перебор всех линий). Сравнение переменной res с нулем.  
  
5. Компонент "Статус линии". Определяет состояние линии по ее номеру и записывает в переменную status.
+
'''4.''' Компонент "'''id_before = id_after'''". Переприсваивает переменную для поиска следующей sip-линии на следующем цикле.  
  
6. Компонент "Идентификатор пользователя". Определяет пользователя, контролирующего линию ("Пользователь по умолчанию" или логически связанный пользователь), и записывает его в переменную user.  
+
'''5.''' Компонент "'''Статус линии'''". Определяет состояние линии по ее номеру и записывает в переменную '''status'''.
 +
 
 +
'''6.''' Компонент "'''Идентификатор пользователя'''". Определяет пользователя, контролирующего линию ("'''Пользователь по умолчанию'''" или логически связанный пользователь), и записывает его в переменную user.  
  
  
Строка 48: Строка 57:
  
  
7. Компонент "Определяем пользователя по умолчанию". Используется SQL запрос, определяющий по идентификатору пользователя его имя.  
+
'''7.''' Компонент "'''Определяем пользователя по умолчанию'''". Используется SQL-запрос, определяющий по идентификатору пользователя его имя.  
  
 
  select @name=name from a_users where ID =@id
 
  select @name=name from a_users where ID =@id
  
8. Компонент "Определяем статус линии". В компоненте определяется состояние линии по ее статусу - включена или выключена. В сценарии, линия считается выключенной если ее статус = 1 ( не подключена) или 1024 (не определена). Более подробно по статусам вы можете прочитать [[Общие_компоненты_сценариев#.D0.A1.D1.82.D0.B0.D1.82.D1.83.D1.81_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D0.B0 | Общие компоненты сценариев]]
+
'''8.''' Компонент "'''Определяем статус линии'''". В компоненте определяется состояние линии по ее статусу - включена или выключена. В сценарии, линия считается выключенной если ее статус = 1 ( не подключена) или 1024 (не определена). Более подробно по статусам вы можете прочитать [[Общие_компоненты_сценариев#.D0.A1.D1.82.D0.B0.D1.82.D1.83.D1.81_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D0.B0 | Общие компоненты сценариев]]
  
9. Компонент "Линия включена". В компоненте происходит запись информации в таблицу работы линий. Если записи о линии нет, она будет создана. Если запись есть, то она будет обновлена.  
+
'''9.''' Компонент "'''Линия включена'''". В компоненте происходит запись информации в таблицу работы линий. Если записи о линии нет, она будет создана. Если запись есть, то она будет обновлена.  
  
Описание таблицы Lines
+
Описание таблицы '''Lines'''
  
 
* '''Line''' [nvarchar] - номер линии  
 
* '''Line''' [nvarchar] - номер линии  
Строка 66: Строка 75:
 
* '''datetime''' [datetime] - время последнего обновления информации
 
* '''datetime''' [datetime] - время последнего обновления информации
  
<span color="red">ВНИМАНИЕ:</span> В запросе делается предположение, что если линия на момент проверки работает, значит она работала все предыдущее время со времени последней проверки.  
+
<FONT color="red">ВНИМАНИЕ: В запросе делается предположение, что если линия на момент проверки работает, значит она работала все предыдущее время со времени последней проверки. </FONT>
  
 
  update Lines  
 
  update Lines  
  set Line=@line,
+
  set status=@status,
status=@status,
+
 
  datetime= getdate(),
 
  datetime= getdate(),
 
  online = online+ getdate()- [datetime]
 
  online = online+ getdate()- [datetime]
Строка 85: Строка 93:
 
  @user)
 
  @user)
  
10. Компонент "Линия выключена". Запрос аналогичен выше описанному SQL запросу, за исключением того, что время суммируется к столбцу offline.  
+
'''10.''' Компонент "'''Линия выключена'''". Запрос аналогичен выше описанному SQL запросу, за исключением того, что время суммируется к столбцу offline.  
  
11. Компонент "Оповещение". Происходит уведомление администратора системы о том, что внутренняя линия выключена.  
+
'''11.''' Компонент "'''Оповещение'''". Происходит уведомление администратора системы о том, что внутренняя линия выключена.  
  
  
----
+
<FONT color="red">ВНИМАНИЕ: </FONT>В работе используется таблица '''Lines''' в [Oktell].[dbo].[Lines]. Запрос для создания таблицы (выполняется в SSMS)
 
+
В работе используется таблица Lines в [Oktell].[dbo].[Lines]. Запрос для создания таблицы (выполняется в SSMS)
+
  
 
  USE [oktell]
 
  USE [oktell]
Строка 116: Строка 122:
 
  GO
 
  GO
  
Ниже показан пример работы. Видно, что линия 17001 работает 1 час 23 минуты, а линия 17002 работала всего 3 минуты, и находится в нерабочем состоянии 1 час 20 минут. Также показан пример уведомления системному администратору о том, что линия 17002 выключена.  
+
 
 +
=== Результаты ===
 +
 
 +
Ниже показан пример работы. Видно, что линия '''17001''' работает 1 час 23 минуты, а линия '''17002''' работала всего 3 минуты, и находится в нерабочем состоянии 1 час 20 минут (время просуммировано). Также показан пример уведомления системному администратору о том, что линия '''17002''' выключена.  
  
 
[[Файл:РаботаВнутреннихЛиний-002.png | center ]]
 
[[Файл:РаботаВнутреннихЛиний-002.png | center ]]
  
Данный сценарий необходимо назначить на служебную задачу. Переходим «Администрирование» - «Общие настройки» - вкладка «Служебные задачи» - «Добавить» - выбираем для запуска данный сценарий и указываем необходимый период запуска - «Сохранить» - активируем служебную задачу.
+
Данный сценарий необходимо назначить на служебную задачу. Переходим «'''Администрирование'''» - «'''Общие настройки'''» - вкладка «'''Служебные задачи'''» - «'''Добавить'''» - выбираем для запуска данный сценарий и указываем необходимый период запуска - «'''Сохранить'''» - активируем служебную задачу. Рекомендуется использоваться период запуска - '''раз в 10 минут'''.
 +
 
 +
 
 +
[[Файл:РаботаВнутреннихЛиний-005.png | center | 600px]]
 +
 
 +
 
 +
'''Файл сценария:''' [[Media:%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B8%D1%85_%D0%BB%D0%B8%D0%BD%D0%B8%D0%B9.zip|Определение времени работы внутренних линий]]
  
 +
<FONT color="red">ВНИМАНИЕ: Во всех компонентах типа "'''уведомление'''" в сценарии необходимо установить '''адресата''', которому будет приходить оповещение. </FONT>
  
[[Файл:РаботаВнутреннихЛиний-005.png | center ]]
+
<u>'''Дополнение:'''</u> Чтобы не перегружать сервер баз данных '''Oktell''' постоянными SQL-запросами, рекомендуется использовать глобальную переменную со списком всех внутренних линий и далее определять состояние, пользуясь полученным результатом. Подобный метод описан [[Перехват звонков из очереди]]

Текущая версия на 11:18, 31 марта 2023

Наверх

Задача: Мониторинг состояния внутренних линий и определение времены работы внутренних линий.

Задача становится актуальной, когда операторы системы не используют клиентских приложений, а установлены как "пользователь по умолчанию" для своего телефона. В базу данных Oktell информация о разрегистрации линии не заносится и проверка работы линий доступна только с помощью клиентского приложения (модуль "Мониторинг"), что является не очень удобным.

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


РаботаВнутреннихЛиний-001.png


Структурно сценарий состоит из


Описание компонентов

1. Компонент "Начальные параметры". Заданы параметры - начальное значение для поиска внутренних линий и текущая дата.

2. Компонент "Находим линию". Определяет следующую по порядку внутреннюю SIP линию по столбцу systemnumstr. В качестве выходных параметров запрос выдает res - результат запроса (1- найдена линия, 0 -не найдена), systemnumstr - номер внутренней линии.

declare @min int
select @min = min(systemnumstr)
from [oktell_settings].[dbo].[A_ServerSipLines]
where systemnumstr>@systemnumstr_before

if (@min is not null)
select @systemnumstr=@min

set @res=@@rowcount

Запрос использует таблицу:

  • [oktell_settings].[dbo].[A_ServerSipLines] — столбец SystemNumStr показывает номера внутренних SIP линий, определенных в системе.

Однако вы также можете использовать таблицы:

  • [oktell_settings].[dbo].[A_ServerUSBLines] — столбец SystemNumStr показывает номера внутренних Voip линий (гарнитура или usb телефон).
  • [oktell_settings].[dbo].[A_ServerExtLines] — столбец SystemNumStr показывает номера внешних SIP линий

Также в запросе вы можете объединить эти таблицы и получать информацию по всем линиям.

3. Компонент "Проверка на завершение". Определяет конец цикла (был осуществлен перебор всех линий). Сравнение переменной res с нулем.

4. Компонент "id_before = id_after". Переприсваивает переменную для поиска следующей sip-линии на следующем цикле.

5. Компонент "Статус линии". Определяет состояние линии по ее номеру и записывает в переменную status.

6. Компонент "Идентификатор пользователя". Определяет пользователя, контролирующего линию ("Пользователь по умолчанию" или логически связанный пользователь), и записывает его в переменную user.


РаботаВнутреннихЛиний-003.png


7. Компонент "Определяем пользователя по умолчанию". Используется SQL-запрос, определяющий по идентификатору пользователя его имя.

select @name=name from a_users where ID =@id

8. Компонент "Определяем статус линии". В компоненте определяется состояние линии по ее статусу - включена или выключена. В сценарии, линия считается выключенной если ее статус = 1 ( не подключена) или 1024 (не определена). Более подробно по статусам вы можете прочитать Общие компоненты сценариев

9. Компонент "Линия включена". В компоненте происходит запись информации в таблицу работы линий. Если записи о линии нет, она будет создана. Если запись есть, то она будет обновлена.

Описание таблицы Lines

  • Line [nvarchar] - номер линии
  • User [nvarchar] - связанный пользователь
  • Status [nvarchar] - текущий статус линии
  • Online [datetime] - время во включенном состоянии
  • Offline [datetime] - время в выключенном состоянии
  • date [datetime] - текущая дата
  • datetime [datetime] - время последнего обновления информации

ВНИМАНИЕ: В запросе делается предположение, что если линия на момент проверки работает, значит она работала все предыдущее время со времени последней проверки.

update Lines 
set status=@status,
datetime= getdate(),
online = online+ getdate()- [datetime]
where date= @date and line=@line

if (@@rowcount=0)
insert into Lines (Line, status, date, online, offline, [datetime], [user]) values
(@line,
@status,
@date,
dateadd(mi, 0, '1990-01-01'),
dateadd(mi, 0, '1990-01-01'),
getdate(),
@user)

10. Компонент "Линия выключена". Запрос аналогичен выше описанному SQL запросу, за исключением того, что время суммируется к столбцу offline.

11. Компонент "Оповещение". Происходит уведомление администратора системы о том, что внутренняя линия выключена.


ВНИМАНИЕ: В работе используется таблица Lines в [Oktell].[dbo].[Lines]. Запрос для создания таблицы (выполняется в SSMS)

USE [oktell]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Lines](
	[Id] [int] IDENTITY(1,1) NOT NULL, 
	[Line] [nvarchar](2000) NULL,
	[User] [nvarchar](2000) NULL,
	[Status] [nvarchar](2000) NULL,
	[Online] [datetime] NULL,
	[Offline] [datetime] NULL,
	[date] [datetime] NULL,
	[datetime] [datetime] NULL,
PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO


Результаты

Ниже показан пример работы. Видно, что линия 17001 работает 1 час 23 минуты, а линия 17002 работала всего 3 минуты, и находится в нерабочем состоянии 1 час 20 минут (время просуммировано). Также показан пример уведомления системному администратору о том, что линия 17002 выключена.

РаботаВнутреннихЛиний-002.png

Данный сценарий необходимо назначить на служебную задачу. Переходим «Администрирование» - «Общие настройки» - вкладка «Служебные задачи» - «Добавить» - выбираем для запуска данный сценарий и указываем необходимый период запуска - «Сохранить» - активируем служебную задачу. Рекомендуется использоваться период запуска - раз в 10 минут.


РаботаВнутреннихЛиний-005.png


Файл сценария: Определение времени работы внутренних линий

ВНИМАНИЕ: Во всех компонентах типа "уведомление" в сценарии необходимо установить адресата, которому будет приходить оповещение.

Дополнение: Чтобы не перегружать сервер баз данных Oktell постоянными SQL-запросами, рекомендуется использовать глобальную переменную со списком всех внутренних линий и далее определять состояние, пользуясь полученным результатом. Подобный метод описан Перехват звонков из очереди