Scripts (версия 3.xx)/Приём SMS

Материал из Call Office Wiki
Версия от 07:38, 24 февраля 2014; McBurns (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску
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 ();
}