Scripts (версия 3.xx)/Приём звонков: различия между версиями
Перейти к навигации
Перейти к поиску
McBurns (обсуждение | вклад) |
McBurns (обсуждение | вклад) |
||
Строка 48: | Строка 48: | ||
var AnswerMode = new CAnswerMode (); | var AnswerMode = new CAnswerMode (); | ||
var Time = new CTime (); | var Time = new CTime (); | ||
</syntaxhighlight> | |||
:Блок, выполняемый, если есть поиск в базе данных или запись звонков в базу данных. | |||
<syntaxhighlight lang="javascript"> | |||
if (AnswerMode.IsDatabase ()) { // Если есть запись или поиск телефона в базе | |||
</syntaxhighlight> | |||
:Определяется переменная '''Database''' класса '''CDatabase''', отвечающая за работу с источником данных. Проверяется соединение с базой данных. | |||
<syntaxhighlight lang="javascript"> | |||
var Database = new CDatabase (); | var Database = new CDatabase (); | ||
if (Database.Open ()) { | if (Database.Open ()) { // Если соединение с базой данных успешное | ||
</syntaxhighlight> | |||
:Проверяется время наступления работы, если определено расписание. | |||
<syntaxhighlight lang="javascript"> | |||
while (Time.WaitTime ()) { // Выполняем, пока совпадает время работы | |||
</syntaxhighlight> | |||
:При нажатии кнопки «Пауза» ожидается действие пользователя. Если пауза не нажата, выводится в журнал текст «Ожидание входящего звонка...». Если указано расписание работы, то время ожидания звонка определяется функцией '''Time.TimeOut ()''', если расписание не включено, то ожидание бесконечное. При входящем звонке (метод [[Объект_Device/Методы/WaitForIncoming|WaitForIncoming]] возвращает ноль) обрабатывается входящий звонок. | |||
Script.WaitPause (); | <syntaxhighlight lang="javascript"> | ||
Script.WaitPause (); // Ожидание, если нажали на Паузу | |||
Script.InLogInfo ('Ожидание входящего звонка...'); | Script.InLogInfo ('Ожидание входящего звонка...'); | ||
switch (Device. | switch (Device.WaitForIncoming (Time.TimeOut (), 1)) { // Ждем звонка заданное время | ||
case 0: // Звонок поступил | case 0: // Звонок поступил | ||
</syntaxhighlight> | |||
:В переменную '''Phone''' заносится номер, с которого поступил входящий звонок (только цифры). Если номер определился, выводим в журнал сообщение о входящем звонке с указанием номера, если не определился, то просто о входящем звонке. Добавляется глобальная переменная сценария '''Phone''', содержащая полученный номер телефона. | |||
<syntaxhighlight lang="javascript"> | |||
var Phone = ('' + Device.GetCallerId ()).replace (new RegExp (/[^0-9]*/g), ''); | var Phone = ('' + Device.GetCallerId ()).replace (new RegExp (/[^0-9]*/g), ''); | ||
if (Phone) Script.InLogInfo ('Входящий звонок от %s поступил', Phone); | if (!empty (Phone)) Script.InLogInfo ('Входящий звонок от %s поступил', Phone); | ||
else | else Script.InLogInfo ('Входящий звонок поступил'); | ||
Script.AddVariable ('Phone', Phone); | Script.AddVariable ('Phone', Phone); | ||
Строка 74: | Строка 95: | ||
if (Script.IsStop ()) break; | if (Script.IsStop ()) break; | ||
var StartTime = new Date (); | var StartTime = new Date (); // Время начала разговора | ||
var Recording = new CRecording (); | var Recording = new CRecording (); | ||
Recording.Start (Device); | Recording.Start (Device); // проверка на включение записи разговора перед сообщением | ||
var DataSearch = new CDataSearch (); | var DataSearch = new CDataSearch (); | ||
if (DataSearch.IsSearch ()) { | if (DataSearch.IsSearch ()) { // если есть поиск в базе данных | ||
var Record = DataSearch.GetRecord (Database, Phone); // выбираем записи в БД | var Record = DataSearch.GetRecord (Database, Phone); // выбираем записи в БД | ||
Строка 94: | Строка 115: | ||
Sound.Say (Device, Record); | Sound.Say (Device, Record); | ||
Info.Ok++; | Info.Ok++; // добавляем найденный телефон в статистику | ||
} | } | ||
else { | else { // Не нашли, произносим общее для не найденных | ||
var Sound = new CSound ('NotFound'); | var Sound = new CSound ('NotFound'); | ||
Строка 104: | Строка 125: | ||
Sound.Say (Device, Record); | Sound.Say (Device, Record); | ||
Info.Fail++; | Info.Fail++; // добавляем неизвестный телефон в статистику | ||
} | } | ||
Recording.Stop (Device, Record); | Recording.Stop (Device, Record); // Завершаем запись разговора, если была включена | ||
Record.Close (); | Record.Close (); | ||
} | } | ||
else { | else { // Поиск не включен, произноcим общее сообщение для всех | ||
var Sound = new CSound ('ForAll'); | var Sound = new CSound ('ForAll'); | ||
Строка 120: | Строка 141: | ||
Sound.Say (Device, Record); | Sound.Say (Device, Record); | ||
Recording.Stop (Device); | Recording.Stop (Device); // Завершаем запись разговора, если была включена | ||
} | } | ||
Device.HangUp (); | Device.HangUp (); // Кладём трубку | ||
Info.All++; | Info.All++; // Увеличиваем счетчик принятых звонков в статистике | ||
Info.Update (DataSearch.IsSearch ()); | Info.Update (DataSearch.IsSearch ()); // Показываем статистику | ||
var DataWrite = new CDataWrite (); | var DataWrite = new CDataWrite (); |
Версия 07:19, 29 октября 2013
- Первая часть скрипта подготавливает классы и объекты, необходимые для работы скрипта. Описание дано в комментариях к каждой строке за исключением класса Script, который отвечает за непосредственное выполнение скрипта.
eval (GetFileContent ('Common\\Classes\\Script.js'));
var Script = new Script (); // Основной класс сценария
// =================== Подключение модулей ===================
eval (Script.GetFileContent ('Common\\Classes\\Database.js')); // База данных
eval (Script.GetFileContent ('Common\\Classes\\Time.js')); // Расписание
eval (Script.GetFileContent ('Common\\Classes\\Sound.js')); // Воспроизведение звуков
eval (Script.GetFileContent ('Common\\Classes\\Device.js')); // Устройство
eval (Script.GetFileContent ('Common\\Classes\\Recording.js')); // Запись разговора
eval (Script.GetFileContent ('Common\\Classes\\DataSearch.js')); // Поиск данных
eval (Script.GetFileContent ('Solutions\\Basic\\IncomingCall\\Info.js')); // Информация и статистика
eval (Script.GetFileContent ('Solutions\\Basic\\IncomingCall\\CDataWrite.js')); // Запись данных
eval (Script.GetFileContent ('Solutions\\Basic\\IncomingCall\\CAnswerMode.js')); // Режим обработки входящего звонка
// =================== Начало работы сценария ===================
- Командой Script.SetDebug включается/отключается режим вывода дополнительных отладочных сообщений во время работы сценария. Как правило, это излишняя информация. Включать данный параметр рекомендуется только в случае, если сценарий выполняется некорректно и надо отправить разработчикам журнал с большим количеством информации. Без передачи параметра (true/false) функция включает режим отображения так, как установлено в конфигурации.
Script.SetDebug ();
- Команда Script.InLogInfo позволяет выводить информацию в журнал в интерфейсе программы и одновременно записывать её в системный журнал. В данном случае будет отметка о том, что сценарий загрузил все необходимые данные и запустился.
Script.InLogInfo ('Старт');
try {
- Далее определяется переменная Device класса CDevice, отвечающая за управление нашим устройством приёма звонков (модем, SIP и т.д.). Используется метод Open для устройства с проверкой успешности.
- Определяется переменная Info класса CInfo, отвечающая за отображение статистики во вкладке «Журнал». Проводится первый подсчёт статистики на основе выбранных в конфигурации параметров.
var Device = new CDevice ();
var Info = new CInfo ();
if (Device.Open ()) { // Если устройство открыто успешно
- Далее определяются переменные: AnswerMode класса CAnswerMode, отвечающая за режим обработки входящих звонков, Time класса CTime, отвечающая за работу с временем и расписание.
var AnswerMode = new CAnswerMode ();
var Time = new CTime ();
- Блок, выполняемый, если есть поиск в базе данных или запись звонков в базу данных.
if (AnswerMode.IsDatabase ()) { // Если есть запись или поиск телефона в базе
- Определяется переменная Database класса CDatabase, отвечающая за работу с источником данных. Проверяется соединение с базой данных.
var Database = new CDatabase ();
if (Database.Open ()) { // Если соединение с базой данных успешное
- Проверяется время наступления работы, если определено расписание.
while (Time.WaitTime ()) { // Выполняем, пока совпадает время работы
- При нажатии кнопки «Пауза» ожидается действие пользователя. Если пауза не нажата, выводится в журнал текст «Ожидание входящего звонка...». Если указано расписание работы, то время ожидания звонка определяется функцией Time.TimeOut (), если расписание не включено, то ожидание бесконечное. При входящем звонке (метод WaitForIncoming возвращает ноль) обрабатывается входящий звонок.
Script.WaitPause (); // Ожидание, если нажали на Паузу
Script.InLogInfo ('Ожидание входящего звонка...');
switch (Device.WaitForIncoming (Time.TimeOut (), 1)) { // Ждем звонка заданное время
case 0: // Звонок поступил
- В переменную Phone заносится номер, с которого поступил входящий звонок (только цифры). Если номер определился, выводим в журнал сообщение о входящем звонке с указанием номера, если не определился, то просто о входящем звонке. Добавляется глобальная переменная сценария Phone, содержащая полученный номер телефона.
var Phone = ('' + Device.GetCallerId ()).replace (new RegExp (/[^0-9]*/g), '');
if (!empty (Phone)) Script.InLogInfo ('Входящий звонок от %s поступил', Phone);
else Script.InLogInfo ('Входящий звонок поступил');
Script.AddVariable ('Phone', Phone);
if (Script.IsStop ()) break;
var StartTime = new Date (); // Время начала разговора
var Recording = new CRecording ();
Recording.Start (Device); // проверка на включение записи разговора перед сообщением
var DataSearch = new CDataSearch ();
if (DataSearch.IsSearch ()) { // если есть поиск в базе данных
var Record = DataSearch.GetRecord (Database, Phone); // выбираем записи в БД
if (Record.Fetch () && Phone) { // Нашли телефон, произносим для него сообщение
var Sound = new CSound ('Found');
Script.InLogInfo ('Номер абонента найден в базе данных');
Script.InLogInfo ('Начало передачи сообщения');
Sound.Say (Device, Record);
Info.Ok++; // добавляем найденный телефон в статистику
}
else { // Не нашли, произносим общее для не найденных
var Sound = new CSound ('NotFound');
Script.InLogInfo ('Номер абонента не найден в базе данных');
Script.InLogInfo ('Начало передачи сообщения');
Sound.Say (Device, Record);
Info.Fail++; // добавляем неизвестный телефон в статистику
}
Recording.Stop (Device, Record); // Завершаем запись разговора, если была включена
Record.Close ();
}
else { // Поиск не включен, произноcим общее сообщение для всех
var Sound = new CSound ('ForAll');
Script.InLogInfo ('Начало передачи сообщения');
Sound.Say (Device, Record);
Recording.Stop (Device); // Завершаем запись разговора, если была включена
}
Device.HangUp (); // Кладём трубку
Info.All++; // Увеличиваем счетчик принятых звонков в статистике
Info.Update (DataSearch.IsSearch ()); // Показываем статистику
var DataWrite = new CDataWrite ();
DataWrite.WriteResult (Database, Phone); // Записываем звонок, если необходимо
if (Phone) Script.InLogInfo ('Входящий звонок от %s обработан.', Phone);
else Script.InLogInfo ('Входящий звонок обработан.');
break;
case 4:
break;
}
if (Script.IsStop ()) break;
}
Database.Close (); // Закрываем БД
}
}
else { // Без записи и поиска в БД
while (Time.WaitTime ()) { // Выполняем, пока совпадает время работы
Script.InLogInfo ('Ожидание входящего звонка...');
switch (Device.WaitForCall (Time.TimeOut (), 1)) { // Ждем звонка заданное время
case 0: // Звонок поступил
var Phone = Device.GetCallerId ();
if (Phone) Script.InLogInfo ('Входящий звонок от %s поступил', Phone);
else Script.InLogInfo ('Входящий звонок поступил');
Script.AddVariable ('Phone', Phone);
if (Script.IsStop ()) break;
var StartTime = new Date (); // Время начала разговора
var Recording = new CRecording ();
Recording.Start (Device); // проверка на включение записи разговора перед сообщением
var Sound = new CSound ('ForAll');
Sound.Say (Device);
Recording.Stop (Device); // Завершаем запись разговора, если была включена
Device.HangUp (); // Кладём трубку
Info.All++; // Увеличиваем счетчик принятых звонков в статистике
Info.Update (false); // Показываем статистику
if (Phone) Script.InLogInfo ('Входящий звонок от %s обработан.', Phone);
else Script.InLogInfo ('Входящий звонок обработан.');
break;
case 4:
break;
}
if (Script.IsStop ()) break;
}
}
Device.Close (); // Закрываем устройство
}
}
catch (Err) {
Script.InLogError ('Ошибка при работe сценария. %s. Код ошибки: %s', Err.description, Err.number);
if (Database) Database.Close ();
if (Device ) Device.Close ();
}
Script.InLogInfo ('Стоп');