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

Материал из Call Office Wiki
Перейти к навигации Перейти к поиску
(Новая страница: « Category:Помощь (версия 3.xx)»)
 
 
(не показаны 4 промежуточные версии этого же участника)
Строка 1: Строка 1:
<syntaxhighlight lang="javascript">
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 InText  = (SMSList[i].Text + '').replace(/'/g, "''");  // Экранируем одинарные кавычки
                        var OutText = '';
                        Script.InLogInfo ('"' + InText + '"');
                        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': InText,
                                                                      'inphone': Phone});
                        Info.All++;                                  // Увеличиваем счетчик принятых звонков в статистике
                        Info.Update (DataSearchSMS.IsSearch ());        // Показываем статистику
                        if (AnswerMode.IsRecord ()) {  // Если запись
                          DataWrite = new CDataWriteSMS ();
                          var Query = Script.GetExpressionValue (DataWrite.Query (),
                                                                  {'ColumnSMS': InText,
                                                                'ColumnPhone': Phone,
                                                                      'intext': InText,
                                                                    '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.WaitForIncoming (Time.TimeOut (), 2)) {      // Ждем входящего СМС заданное время
                  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 ();
}
</syntaxhighlight>


[[Category:Помощь (версия 3.xx)]]
[[Category:Помощь (версия 3.xx)]]

Текущая версия на 07:38, 24 февраля 2014

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 InText  = (SMSList[i].Text + '').replace(/'/g, "''");  // Экранируем одинарные кавычки
                        var OutText = '';

                        Script.InLogInfo ('"' + InText + '"');

                        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': InText,
                                                                      'inphone': Phone});

                        Info.All++;                                  // Увеличиваем счетчик принятых звонков в статистике
                        Info.Update (DataSearchSMS.IsSearch ());        // Показываем статистику

                        if (AnswerMode.IsRecord ()) {  // Если запись

                           DataWrite = new CDataWriteSMS ();

                           var Query = Script.GetExpressionValue (DataWrite.Query (),
                                                                  {'ColumnSMS': InText,
                                                                 'ColumnPhone': Phone,
                                                                      'intext': InText,
                                                                     '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.WaitForIncoming (Time.TimeOut (), 2)) {      // Ждем входящего СМС заданное время

                  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 ();
}