Scripts (версия 3.xx)/Приём SMS: различия между версиями

Материал из Call Office Wiki
Перейти к навигации Перейти к поиску
(Новая страница: « Category:Помощь (версия 3.xx)»)
 
Строка 1: Строка 1:
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\\SMS.js'));                        // Работа с сообщениями
eval (Script.GetFileContent ('Common\\Classes\\Device.js'));                    // Устройство
eval (Script.GetFileContent ('Common\\Classes\\DataSearch.js'));                // Поиск данных


[[Category:Помощь (версия 3.xx)]]
// локальные модули для конкретного решения
eval (Script.GetFileContent ('Solutions\\Basic\\ReceiveSMS\\Info.js'));          // Информация и статистика
eval (Script.GetFileContent ('Solutions\\Basic\\ReceiveSMS\\CAnswerMode.js'));
eval (Script.GetFileContent ('Solutions\\Basic\\ReceiveSMS\\CDataWriteSMS.js')); // Запись данных
 
// =================== Начало работы сценария ===================
 
Script.InLogInfo ('Старт');
 
try {
 
  var Info  = new CInfo ();
  var Device = new CDevice ();
 
  if (Device.Open ()) {
 
      var Time = new CTime ();
 
      if (!Time.CheckTime ()) Device.Wait (1000);        // Ждём наступления времени обзвона
 
      while (Time.CheckTime ()) {                        // Выполняем, пока совпадает время обзвона
 
        var AnswerMode = new CAnswerMode ();
 
        AnswerMode.Purge ();                            // Проверка на необходимость удаления имеющихся сообщений
 
        var Database = new CDatabase ();
 
        if (Database.Open ()) {
 
            while (!Script.IsStop ()) {                  // Основной цикл ожидания входящих SMS
 
              Script.WaitPause ();                      // Ожидание, если нажали на Паузу
 
              var SMSList = Device.SMSList ();
 
              if (SMSList.length) {
 
                  Script.InLogInfo ('Количество входящих SMS сообщений: ' + SMSList.length);
 
                  for (var i in SMSList) {
 
                    if (Script.IsStop ()) break;
 
                    try {
 
                        var Phone = SMSList[i].Phone;
 
                        if (Phone) Script.InLogInfo ('Входящее сообщение от %s поступило', Phone);
                        else      Script.InLogInfo ('Входящее сообщение поступило');
 
                        var SMS;
                        var OutText = (SMSList[i].Text + '').replace(/'/g, "''");  // Экранируем одинарные кавычки
 
                        var DataSearchSMS = new CDataSearch ();
 
                        if (AnswerMode.IsAnswer ()) {            // Ответное сообщение требуется
 
                          if (AnswerMode.IsSearch ()) {          // Есть поиск в БД
 
                              var Record = DataSearchSMS.GetRecord (Database, Phone);
 
                              if (Record.Fetch () && Phone) {        // Нашли телефон в БД
 
                                SMS = Script.GetConfig ('SMS', 'Found');
                                OutText = Record.GetExpressionValue (SMS.Text);
                                Info.Ok++;                          // добавляем найденный телефон в статистику
                              }
                              else {                                // НЕ нашли
 
                                SMS = Script.GetConfig ('SMS', 'NotFound');
                                OutText = Record.GetExpressionValue (SMS.Text);
                                Info.Fail++;                        // добавляем неизвестный телефон в статистику
                              }
 
                              Record.Close ();
                          }
                          else {                                    // Общее сообщение без поиска в БД
                              SMS = Script.GetConfig ('SMS', 'ForAll');
                          }
                        }
 
                        OutText = Script.GetExpressionValue (OutText, {'intext': OutText,
                                                                      'inphone': Phone});
 
                        Info.All++;                                  // Увеличиваем счетчик принятых звонков в статистике
                        Info.Update (DataSearchSMS.IsSearch ());        // Показываем статистику
 
                        if (AnswerMode.IsRecord ()) {  // Если запись
 
                          DataWrite = new CDataWriteSMS ();
 
                          var Query = Script.GetExpressionValue (DataWrite.Query (),
                                                                  {'ColumnSMS': OutText,
                                                                'ColumnPhone': Phone,
                                                                      'intext': OutText,
                                                                    'inphone': Phone});
 
                          try {
 
                              Script.InLogInfo ('Сохранение входящего SMS');
                              Database.Query (Query);
                              Script.InLogInfo ('Сохранение входящего SMS завершено');
                          }
                          catch (Err) {
                              Script.InLogError ('Ошибка в SQL запросе для записи входящего SMS: %s. %s. Код ошибки: %s',
                                                  Query,  Err.description, Err.number);
                              Script.StopError ();
                          }
                        }
 
                        if (AnswerMode.IsAnswer ()) {  // Если требуется ответ
 
                          if (Script.IsStop ()) break;
 
                          try {
 
                              if (/^[\+0-9]+$/.test (Phone)) {
 
                                Script.InLogInfo ('Отправка ответного сообщения <i>%s</i> по номеру %s', OutText, Phone);
 
                                var ResultSend = Device.SendSMS (SMSList[i].Phone, OutText, SMS.Sender);
 
                                switch (ResultSend) {
                                    case  0: Script.InLogInfo ('Ответное сообщение отправлено успешно'); break;
                                    case  4: Script.InLogError ('Отправка ответного сообщения прервана пользователем'); break;
                                    case  5: Script.InLogError ('Время ожидания отправки ответного сообщения истекло'); break;
                                    default: Script.InLogError ('Неизвестная ошибка отправки ответного сообщения: ' + ResultSend); break;
                                }
                              }
                              else {
                                Script.InLogError ('Номер телефона %s не цифровой. Ответное сообщене не отправлено.', Phone);
                              }
 
 
                          }
                          catch (Err) {
                              Script.InLogError ('Ошибка отправки ответного SMS: ' + Err.description);
                          }
                        }
 
                        Script.InLogInfo ('Удаление входящего SMS (Id = %s)', SMSList[i].Id);
 
                        Device.DeleteSMS (SMSList[i].Id);
 
                        Script.InLogInfo ('Удаление входящего SMS (Id = %s) завершено', SMSList[i].Id);
 
                        Script.InLogInfo ('Входящее SMS № %s обработано', Info.All);
                    }
                    catch (Err) {
                        Script.InLogError ('Ошибка обработки входящего сообщения. %s. Код ошибки: %s',
                                          Err.description, Err.number);
                        if (Script.StopError ()) break;
                    }
                  }
              }
 
              Script.InLogInfo ('Поступившие SMS обработаны');
 
              Script.InLogInfo ('Ожидание входящего сообщения...');
 
              switch (Device.WaitForSMS (Time.TimeOut ())) {  // Ждем входящего СМС заданное время
 
                  case 0: // СМС поступило
                    break;
 
                  default:
                    Script.Stop ();
              }
            }
        }
 
        Database.Close ();
 
        if (Script.IsStop ()) break;
      }
 
      Device.Close ();
  }
 
  Script.InLogInfo ('Стоп');
}
catch (Err) {
  Script.InLogError ('Ошибка при работe сценария. %s. Код ошибки: %s', Err.description, Err.number);
  if (Database) Database.Close ();
  if (Device  ) Device.Close ();
}

Версия 09:28, 18 октября 2013

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\\SMS.js')); // Работа с сообщениями eval (Script.GetFileContent ('Common\\Classes\\Device.js')); // Устройство eval (Script.GetFileContent ('Common\\Classes\\DataSearch.js')); // Поиск данных

// локальные модули для конкретного решения eval (Script.GetFileContent ('Solutions\\Basic\\ReceiveSMS\\Info.js')); // Информация и статистика eval (Script.GetFileContent ('Solutions\\Basic\\ReceiveSMS\\CAnswerMode.js')); eval (Script.GetFileContent ('Solutions\\Basic\\ReceiveSMS\\CDataWriteSMS.js')); // Запись данных

// =================== Начало работы сценария ===================

Script.InLogInfo ('Старт');

try {

  var Info   = new CInfo ();
  var Device = new CDevice ();
  if (Device.Open ()) {
     var Time = new CTime ();
     if (!Time.CheckTime ()) Device.Wait (1000);        // Ждём наступления времени обзвона
     while (Time.CheckTime ()) {                        // Выполняем, пока совпадает время обзвона
        var AnswerMode = new CAnswerMode ();
        AnswerMode.Purge ();                            // Проверка на необходимость удаления имеющихся сообщений
        var Database = new CDatabase ();
        if (Database.Open ()) {
           while (!Script.IsStop ()) {                  // Основной цикл ожидания входящих SMS
              Script.WaitPause ();                      // Ожидание, если нажали на Паузу
              var SMSList = Device.SMSList ();
              if (SMSList.length) {
                 Script.InLogInfo ('Количество входящих SMS сообщений: ' + SMSList.length);
                 for (var i in SMSList) {
                    if (Script.IsStop ()) break;
                    try {
                       var Phone = SMSList[i].Phone;
                       if (Phone) Script.InLogInfo ('Входящее сообщение от %s поступило', Phone);
                       else       Script.InLogInfo ('Входящее сообщение поступило');
                       var SMS;
                       var OutText = (SMSList[i].Text + ).replace(/'/g, "");  // Экранируем одинарные кавычки
                       var DataSearchSMS = new CDataSearch ();
                       if (AnswerMode.IsAnswer ()) {             // Ответное сообщение требуется
                          if (AnswerMode.IsSearch ()) {          // Есть поиск в БД
                             var Record = DataSearchSMS.GetRecord (Database, Phone);
                             if (Record.Fetch () && Phone) {        // Нашли телефон в БД
                                SMS = Script.GetConfig ('SMS', 'Found');
                                OutText = Record.GetExpressionValue (SMS.Text);
                                Info.Ok++;                          // добавляем найденный телефон в статистику
                             }
                             else {                                 // НЕ нашли
                                SMS = Script.GetConfig ('SMS', 'NotFound');
                                OutText = Record.GetExpressionValue (SMS.Text);
                                Info.Fail++;                        // добавляем неизвестный телефон в статистику
                             }
                             Record.Close ();
                          }
                          else {                                    // Общее сообщение без поиска в БД
                             SMS = Script.GetConfig ('SMS', 'ForAll');
                          }
                       }
                       OutText = Script.GetExpressionValue (OutText, {'intext': OutText,
                                                                     'inphone': Phone});
                       Info.All++;                                  // Увеличиваем счетчик принятых звонков в статистике
                       Info.Update (DataSearchSMS.IsSearch ());        // Показываем статистику
                       if (AnswerMode.IsRecord ()) {  // Если запись
                          DataWrite = new CDataWriteSMS ();
                          var Query = Script.GetExpressionValue (DataWrite.Query (),
                                                                 {'ColumnSMS': OutText,
                                                                'ColumnPhone': Phone,
                                                                     'intext': OutText,
                                                                    'inphone': Phone});
                          try {
                             Script.InLogInfo ('Сохранение входящего SMS');
                             Database.Query (Query);
                             Script.InLogInfo ('Сохранение входящего SMS завершено');
                          }
                          catch (Err) {
                             Script.InLogError ('Ошибка в SQL запросе для записи входящего SMS: %s. %s. Код ошибки: %s',
                                                 Query,  Err.description, Err.number);
                             Script.StopError ();
                          }
                       }
                       if (AnswerMode.IsAnswer ()) {  // Если требуется ответ
                          if (Script.IsStop ()) break;
                          try {
                             if (/^[\+0-9]+$/.test (Phone)) {
                                Script.InLogInfo ('Отправка ответного сообщения %s по номеру %s', OutText, Phone);
                                var ResultSend = Device.SendSMS (SMSList[i].Phone, OutText, SMS.Sender);
                                switch (ResultSend) {
                                   case  0: Script.InLogInfo ('Ответное сообщение отправлено успешно'); break;
                                   case  4: Script.InLogError ('Отправка ответного сообщения прервана пользователем'); break;
                                   case  5: Script.InLogError ('Время ожидания отправки ответного сообщения истекло'); break;
                                   default: Script.InLogError ('Неизвестная ошибка отправки ответного сообщения: ' + ResultSend); break;
                                }
                             }
                             else {
                                Script.InLogError ('Номер телефона %s не цифровой. Ответное сообщене не отправлено.', Phone);
                             }


                          }
                          catch (Err) {
                             Script.InLogError ('Ошибка отправки ответного SMS: ' + Err.description);
                          }
                       }
                       Script.InLogInfo ('Удаление входящего SMS (Id = %s)', SMSList[i].Id);
                       Device.DeleteSMS (SMSList[i].Id);
                       Script.InLogInfo ('Удаление входящего SMS (Id = %s) завершено', SMSList[i].Id);
                       Script.InLogInfo ('Входящее SMS № %s обработано', Info.All);
                    }
                    catch (Err) {
                       Script.InLogError ('Ошибка обработки входящего сообщения. %s. Код ошибки: %s',
                                          Err.description, Err.number);
                       if (Script.StopError ()) break;
                    }
                 }
              }
              Script.InLogInfo ('Поступившие SMS обработаны');
              Script.InLogInfo ('Ожидание входящего сообщения...');
              switch (Device.WaitForSMS (Time.TimeOut ())) {   // Ждем входящего СМС заданное время
                 case 0: // СМС поступило
                    break;
                 default:
                    Script.Stop ();
              }
           }
        }
        Database.Close ();
        if (Script.IsStop ()) break;
     }
     Device.Close ();
  }
  Script.InLogInfo ('Стоп');

} catch (Err) {

  Script.InLogError ('Ошибка при работe сценария. %s. Код ошибки: %s', Err.description, Err.number);
  if (Database) Database.Close ();
  if (Device  ) Device.Close ();

}