Scripts (версия 3.xx)/Отправка SMS: различия между версиями
Перейти к навигации
Перейти к поиску
McBurns (обсуждение | вклад) (Новая страница: « Category:Помощь (версия 3.xx)») |
McBurns (обсуждение | вклад) |
||
(не показано 8 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
:Первая часть скрипта подготавливает классы и объекты, необходимые для работы скрипта. Описание дано в комментариях к каждой строке за исключением класса Script, который отвечает за непосредственное выполнение скрипта. | |||
<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\\Device.js')); // Устройство | |||
eval (Script.GetFileContent ('Common\\Classes\\SMS.js')); // Обработка SMS | |||
eval (Script.GetFileContent ('Common\\Classes\\DataRead.js')); // Чтение данных | |||
// локальные модули для конкретного решения | |||
eval (Script.GetFileContent ('Solutions\\Basic\\SendSMS\\Info.js')); // Информация и статистика | |||
eval (Script.GetFileContent ('Solutions\\Basic\\SendSMS\\CDataWriteSMS.js')); // Запись данных | |||
eval (Script.GetFileContent ('Solutions\\Basic\\SendSMS\\COptions.js')); // Расширенные настройки | |||
// =================== Начало работы сценария =================== | |||
</syntaxhighlight> | |||
:Командой '''Script.SetDebug''' включается/отключается режим вывода дополнительных отладочных сообщений во время работы сценария. Как правило, это излишняя информация. Включать данный параметр рекомендуется только в случае, если сценарий выполняется некорректно и надо отправить разработчикам журнал с большим количеством информации. Без передачи параметра (true/false) функция включает режим отображения так, как установлено в конфигурации. | |||
<syntaxhighlight lang="javascript"> | |||
Script.SetDebug (); | |||
</syntaxhighlight> | |||
:Команда '''Script.InLogInfo''' позволяет выводить информацию в журнал в интерфейсе программы и одновременно записывать её в системный журнал. В данном случае будет отметка о том, что сценарий загрузил все необходимые данные и запустился. | |||
<syntaxhighlight lang="javascript"> | |||
Script.InLogInfo ('Старт'); | |||
try { | |||
</syntaxhighlight> | |||
:Далее определяется переменная '''Device''' класса '''CDevice''', отвечающая за управление нашим устройством рассылки сообщений (модем, SMS-шлюз). Используется метод [[Объект_Device/Методы/Open|Open]] для устройства с проверкой успешности. | |||
<syntaxhighlight lang="javascript"> | |||
var Device = new CDevice (); | |||
if (Device.Open ()) { // Если устройство открыто успешно | |||
Script.InLogDebug ('Устройство открыто успешно'); | |||
</syntaxhighlight> | |||
:Определяется переменная '''Options''' класса '''COptions''', отвечающая за управление нашим устройством рассылки сообщений (модем, SMS-шлюз). Используется метод [[Объект_Device/Методы/Open|Open]] для устройства с проверкой успешности. | |||
:Устанавливается в единицу переменная '''CycleCount''', отвечающая за количество сеансов обзвона. | |||
<syntaxhighlight lang="javascript"> | |||
var Options = new COptions (); | |||
var CycleCount = 1; | |||
</syntaxhighlight> | |||
:Определяется переменная '''DataRead''' класса '''CDataRead''', отвечающая за получение данных из базы данных, проверяется переменная '''CycleCount''' на превышение значения. Если переменная не превышает значения, записанного в конфигурации, пишется сообщение в журнал о порядковом номере цикла рассылки в текущем сеансе. | |||
<syntaxhighlight lang="javascript"> | |||
var DataRead = new CDataRead (); | |||
while (DataRead.CheckCycle (CycleCount)) { // Проверка количества попыток обзвона в сеансе | |||
Script.InLogInfo ('Цикл рассылки <b>%s</b>', CycleCount); | |||
</syntaxhighlight> | |||
:Определяется переменная '''Database''' класса '''CDatabase''', отвечающая за работу с источником данных. Проверяется соединение с базой данных. | |||
<syntaxhighlight lang="javascript"> | |||
var Database = new CDatabase (); | |||
if (Database.Open ()) { // Если соединение с базой данных успешное | |||
</syntaxhighlight> | |||
:Определяется переменная '''Info''' класса '''CInfo''', отвечающая за отображение статистики во вкладке [[Запуск конфигурации_(версия_3.xx)|«Журнал»]]. Проводится первый подсчёт статистики на основе выбранных в конфигурации параметров (учитывать/не учитывать отправку сообщений ранее, количество попыток отправки и т.д.) | |||
<syntaxhighlight lang="javascript"> | |||
var Info = new CInfo (); | |||
if (Info.Count (Database, DataRead)) { | |||
</syntaxhighlight> | |||
:Определяется переменная '''Record''', содержащая набор методов и свойств работы с выборкой запроса, делается проверка на её корректность. | |||
<syntaxhighlight lang="javascript"> | |||
var Record = Database.Query (DataRead.Query ()); // Выбор записей в базе данных | |||
if (Record) { | |||
</syntaxhighlight> | |||
:Определяется переменная '''DataWriteSMS''' класса '''CDataWritSMSe''', отвечающая за запись результатов в базу данных. Проверяется наличие полей в источнике данных, необходимых для чтения и/или записи данных во время выполнения сценария. | |||
<syntaxhighlight lang="javascript"> | |||
var DataWriteSMS = new CDataWriteSMS (); | |||
if (DataRead.CheckFields (Record) && | |||
DataWriteSMS.CheckFields (Record)) { | |||
</syntaxhighlight> | |||
:Запускается цикл рассылки для выбранных записей базы данных. | |||
<syntaxhighlight lang="javascript"> | |||
while (Record.Fetch ()) { | |||
Script.WaitPause (); // Ожидание, если нажали на Паузу | |||
Info.DataShow (Record); // Показываем текущую запись в информационном окне | |||
</syntaxhighlight> | |||
:Определяется переменная '''Time''' класса '''CTime''', отвечающая за работу с временем и расписание. | |||
:Устанавливается пустое значение для переменной '''Status''', в которую записывается результат отправления сообщения. | |||
<syntaxhighlight lang="javascript"> | |||
var Time = new CTime (); | |||
if (Time.CheckTime ()) { // Проверка расписания | |||
var Status = ''; | |||
</syntaxhighlight> | |||
:Определяется массив '''Phone''', содержащий номера очередных телефонов из базы данных. Даже если не указан параметр «Несколько номеров в ячейке», всё равно приходит в виде массива. | |||
<syntaxhighlight lang="javascript"> | |||
var Phone = DataRead.GetPhone (Record); | |||
if (!empty (Phone)) { // Если номер телефона не пуст | |||
if (!DataRead.CheckIsOK (Record)) { // Если статус - не прозвонен | |||
// и не достигнут предел количества попыток | |||
try { | |||
</syntaxhighlight> | |||
:Запускается цикл внутри массива '''Phone'''. | |||
:Проверяется и выполняется, если задано, ожидание перед отправкой очередного сообщения. | |||
<syntaxhighlight lang="javascript"> | |||
for (var i in Phone) { | |||
if (DataRead.WaitBeforeCall ()) { // Ожидание перед звонком | |||
</syntaxhighlight> | |||
:Определяется переменная '''SMS''' класса '''CSMS''', отвечающая за с сообщениями. В переменную '''TextSMS''' заносится текст сообщения для текущего абонента. При условии, что текст сообщения не пуст, запускается процесс рассылки. | |||
<syntaxhighlight lang="javascript"> | |||
var SMS = new CSMS (); | |||
var TextSMS = SMS.GetText (Record); | |||
if (!empty (TextSMS)) { | |||
</syntaxhighlight> | |||
:Устанавливается статус текущей рассылки в переменной '''PhoneStatus'''. | |||
<syntaxhighlight lang="javascript"> | |||
var PhoneStatus = 'OK'; | |||
</syntaxhighlight> | |||
:Происходит отправка сообщения и вывод в журнал результата, который вернул метод [[Объект_Device/Методы/SendSMS|'''SendSMS''']]. | |||
<syntaxhighlight lang="javascript"> | |||
switch (Device.SendSMS (Phone[i], TextSMS, SMS.GetSender ())) { | |||
case 0: Script.InLogInfo ('Сообщение по номеру %s отправлено успешно', Phone[i]); break; | |||
case 4: PhoneStatus = 'Отправка сообщения прервана пользователем'; break; | |||
case 5: PhoneStatus = 'Истекло время ожидания отправки сообщения абоненту ' + Phone[i]; break; | |||
default: PhoneStatus = 'Ошибка отправки сообщения'; break; | |||
} | |||
</syntaxhighlight> | |||
:Вносится, если необходимо, результат текущей рассылки в переменную '''Status'''. | |||
:Проверяется необходимость при успешной рассылке рассылать сообщения по оставшимся номерам в ячеке. | |||
:Проверяется остановка скрипта пользователем. | |||
<syntaxhighlight lang="javascript"> | |||
if (Status != 'OK') Status = PhoneStatus; // Статус записи | |||
if (DataRead.IsRemaining (PhoneStatus)) break; // Если удачный дозвон | |||
// и не включен параметр звонить | |||
// по оставшимся номерам в ячейке | |||
if (Script.IsStop ()) break; | |||
</syntaxhighlight> | |||
:В случае, если пустой текст сообщения, выводится соответствующее сообщение в журнал и останавливается выполнение сценария. | |||
<syntaxhighlight lang="javascript"> | |||
} else Script.StopError ('Отсутствует текст сообщения. Выполнение сценария прервано.'); | |||
if (!DataWriteSMS.SetStatus (Record, Phone[i],Status)) break; | |||
} | |||
if (Script.IsStop ()) break; | |||
} | |||
if (Script.IsStop ()) break; | |||
} | |||
</syntaxhighlight> | |||
:При возникновении ошибки в выполнении сценария выводится в журнал сообщение об ошибке и останавливается выполнение сценария. | |||
<syntaxhighlight lang="javascript"> | |||
catch (Err) { | |||
Status = Err.description; | |||
Script.StopError ('Ошибка в процессе отправки сообщений. ' + Err.description); | |||
} | |||
</syntaxhighlight> | |||
:Записывается при необходимости статус рассылки в базу данных, обновляется информация в окне статистики. | |||
<syntaxhighlight lang="javascript"> | |||
DataWriteSMS.SetStatus (Record, DataRead.GetPhone (Record, true), Status); // Запись результата звонка | |||
Info.Update (Status); | |||
} | |||
</syntaxhighlight> | |||
:Останавливается скрипт, если пуст номер телефона. Выводится соответствующее сообщение в журнал. | |||
<syntaxhighlight lang="javascript"> | |||
} else Script.StopError ('Номер телефона пуст.'); | |||
</syntaxhighlight> | |||
:Если устройство не готово, ожидание в течение 1 секунды, затем проверка на остановку | |||
<syntaxhighlight lang="javascript"> | |||
} else Device.Wait (1000); | |||
if (Script.IsStop ()) break; | |||
</syntaxhighlight> | |||
:Переход к следующей записи в базе данных. | |||
<syntaxhighlight lang="javascript"> | |||
Record.Next (); | |||
} | |||
if (Script.IsStop ()) break; | |||
</syntaxhighlight> | |||
:Если проверка на наличие необходимых полей в базе данных не прошла, закрывается выборка. Если нужна остановка, завершается цикл. | |||
<syntaxhighlight lang="javascript"> | |||
} // Отсутствуют необходимые поля базы данных | |||
Record.Close (); | |||
if (Script.IsStop ()) break; | |||
</syntaxhighlight> | |||
:Не получены записи из базы данных. Выполнение сценария остановлено, соответствующее сообщение записывается в журнал. | |||
<syntaxhighlight lang="javascript"> | |||
} else Script.InLogError ('Ошибка получения данных для отправки сообщения'); | |||
</syntaxhighlight> | |||
:Ни одна запись в базе данных не соответствует условиям выполнения. Соответствующее сообщение записывается в журнал, закрывается соединение с базой данных. | |||
<syntaxhighlight lang="javascript"> | |||
} else Script.InLogInfo ('Отсутствуют кандидаты на отправку SMS'); | |||
Database.Close (); | |||
} | |||
</syntaxhighlight> | |||
:Увеличивается значение счетчика циклов '''CycleCount'''. Проводится проверка на остановку сценария. | |||
<syntaxhighlight lang="javascript"> | |||
CycleCount++; | |||
if (Script.IsStop ()) break; | |||
} | |||
</syntaxhighlight> | |||
:Соединение с устройством закрывается. Конец цикла. | |||
<syntaxhighlight lang="javascript"> | |||
Device.Close (); | |||
} | |||
} | |||
</syntaxhighlight> | |||
:Обработка ошибки выполнения сценария. Запись соответствующего сообщения в журнал. Закрытие соединения с базой данных. Закрытие устройства. | |||
<syntaxhighlight lang="javascript"> | |||
catch (Err) { | |||
Script.InLogError ('Ошибка при работe сценария. %s. Код ошибки: %s', Err.description, Err.number); | |||
if (Database) Database.Close (); | |||
if (Device ) Device.Close (); | |||
} | |||
</syntaxhighlight> | |||
:Выводится в журнал метка остановки выполнения сценария. | |||
<syntaxhighlight lang="javascript"> | |||
Script.InLogInfo ('Стоп'); | |||
</syntaxhighlight> | |||
[[Category:Помощь (версия 3.xx)]] | [[Category:Помощь (версия 3.xx)]] |
Текущая версия на 10:04, 5 февраля 2014
- Первая часть скрипта подготавливает классы и объекты, необходимые для работы скрипта. Описание дано в комментариях к каждой строке за исключением класса 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\\Device.js')); // Устройство
eval (Script.GetFileContent ('Common\\Classes\\SMS.js')); // Обработка SMS
eval (Script.GetFileContent ('Common\\Classes\\DataRead.js')); // Чтение данных
// локальные модули для конкретного решения
eval (Script.GetFileContent ('Solutions\\Basic\\SendSMS\\Info.js')); // Информация и статистика
eval (Script.GetFileContent ('Solutions\\Basic\\SendSMS\\CDataWriteSMS.js')); // Запись данных
eval (Script.GetFileContent ('Solutions\\Basic\\SendSMS\\COptions.js')); // Расширенные настройки
// =================== Начало работы сценария ===================
- Командой Script.SetDebug включается/отключается режим вывода дополнительных отладочных сообщений во время работы сценария. Как правило, это излишняя информация. Включать данный параметр рекомендуется только в случае, если сценарий выполняется некорректно и надо отправить разработчикам журнал с большим количеством информации. Без передачи параметра (true/false) функция включает режим отображения так, как установлено в конфигурации.
Script.SetDebug ();
- Команда Script.InLogInfo позволяет выводить информацию в журнал в интерфейсе программы и одновременно записывать её в системный журнал. В данном случае будет отметка о том, что сценарий загрузил все необходимые данные и запустился.
Script.InLogInfo ('Старт');
try {
- Далее определяется переменная Device класса CDevice, отвечающая за управление нашим устройством рассылки сообщений (модем, SMS-шлюз). Используется метод Open для устройства с проверкой успешности.
var Device = new CDevice ();
if (Device.Open ()) { // Если устройство открыто успешно
Script.InLogDebug ('Устройство открыто успешно');
- Определяется переменная Options класса COptions, отвечающая за управление нашим устройством рассылки сообщений (модем, SMS-шлюз). Используется метод Open для устройства с проверкой успешности.
- Устанавливается в единицу переменная CycleCount, отвечающая за количество сеансов обзвона.
var Options = new COptions ();
var CycleCount = 1;
- Определяется переменная DataRead класса CDataRead, отвечающая за получение данных из базы данных, проверяется переменная CycleCount на превышение значения. Если переменная не превышает значения, записанного в конфигурации, пишется сообщение в журнал о порядковом номере цикла рассылки в текущем сеансе.
var DataRead = new CDataRead ();
while (DataRead.CheckCycle (CycleCount)) { // Проверка количества попыток обзвона в сеансе
Script.InLogInfo ('Цикл рассылки <b>%s</b>', CycleCount);
- Определяется переменная Database класса CDatabase, отвечающая за работу с источником данных. Проверяется соединение с базой данных.
var Database = new CDatabase ();
if (Database.Open ()) { // Если соединение с базой данных успешное
- Определяется переменная Info класса CInfo, отвечающая за отображение статистики во вкладке «Журнал». Проводится первый подсчёт статистики на основе выбранных в конфигурации параметров (учитывать/не учитывать отправку сообщений ранее, количество попыток отправки и т.д.)
var Info = new CInfo ();
if (Info.Count (Database, DataRead)) {
- Определяется переменная Record, содержащая набор методов и свойств работы с выборкой запроса, делается проверка на её корректность.
var Record = Database.Query (DataRead.Query ()); // Выбор записей в базе данных
if (Record) {
- Определяется переменная DataWriteSMS класса CDataWritSMSe, отвечающая за запись результатов в базу данных. Проверяется наличие полей в источнике данных, необходимых для чтения и/или записи данных во время выполнения сценария.
var DataWriteSMS = new CDataWriteSMS ();
if (DataRead.CheckFields (Record) &&
DataWriteSMS.CheckFields (Record)) {
- Запускается цикл рассылки для выбранных записей базы данных.
while (Record.Fetch ()) {
Script.WaitPause (); // Ожидание, если нажали на Паузу
Info.DataShow (Record); // Показываем текущую запись в информационном окне
- Определяется переменная Time класса CTime, отвечающая за работу с временем и расписание.
- Устанавливается пустое значение для переменной Status, в которую записывается результат отправления сообщения.
var Time = new CTime ();
if (Time.CheckTime ()) { // Проверка расписания
var Status = '';
- Определяется массив Phone, содержащий номера очередных телефонов из базы данных. Даже если не указан параметр «Несколько номеров в ячейке», всё равно приходит в виде массива.
var Phone = DataRead.GetPhone (Record);
if (!empty (Phone)) { // Если номер телефона не пуст
if (!DataRead.CheckIsOK (Record)) { // Если статус - не прозвонен
// и не достигнут предел количества попыток
try {
- Запускается цикл внутри массива Phone.
- Проверяется и выполняется, если задано, ожидание перед отправкой очередного сообщения.
for (var i in Phone) {
if (DataRead.WaitBeforeCall ()) { // Ожидание перед звонком
- Определяется переменная SMS класса CSMS, отвечающая за с сообщениями. В переменную TextSMS заносится текст сообщения для текущего абонента. При условии, что текст сообщения не пуст, запускается процесс рассылки.
var SMS = new CSMS ();
var TextSMS = SMS.GetText (Record);
if (!empty (TextSMS)) {
- Устанавливается статус текущей рассылки в переменной PhoneStatus.
var PhoneStatus = 'OK';
- Происходит отправка сообщения и вывод в журнал результата, который вернул метод SendSMS.
switch (Device.SendSMS (Phone[i], TextSMS, SMS.GetSender ())) {
case 0: Script.InLogInfo ('Сообщение по номеру %s отправлено успешно', Phone[i]); break;
case 4: PhoneStatus = 'Отправка сообщения прервана пользователем'; break;
case 5: PhoneStatus = 'Истекло время ожидания отправки сообщения абоненту ' + Phone[i]; break;
default: PhoneStatus = 'Ошибка отправки сообщения'; break;
}
- Вносится, если необходимо, результат текущей рассылки в переменную Status.
- Проверяется необходимость при успешной рассылке рассылать сообщения по оставшимся номерам в ячеке.
- Проверяется остановка скрипта пользователем.
if (Status != 'OK') Status = PhoneStatus; // Статус записи
if (DataRead.IsRemaining (PhoneStatus)) break; // Если удачный дозвон
// и не включен параметр звонить
// по оставшимся номерам в ячейке
if (Script.IsStop ()) break;
- В случае, если пустой текст сообщения, выводится соответствующее сообщение в журнал и останавливается выполнение сценария.
} else Script.StopError ('Отсутствует текст сообщения. Выполнение сценария прервано.');
if (!DataWriteSMS.SetStatus (Record, Phone[i],Status)) break;
}
if (Script.IsStop ()) break;
}
if (Script.IsStop ()) break;
}
- При возникновении ошибки в выполнении сценария выводится в журнал сообщение об ошибке и останавливается выполнение сценария.
catch (Err) {
Status = Err.description;
Script.StopError ('Ошибка в процессе отправки сообщений. ' + Err.description);
}
- Записывается при необходимости статус рассылки в базу данных, обновляется информация в окне статистики.
DataWriteSMS.SetStatus (Record, DataRead.GetPhone (Record, true), Status); // Запись результата звонка
Info.Update (Status);
}
- Останавливается скрипт, если пуст номер телефона. Выводится соответствующее сообщение в журнал.
} else Script.StopError ('Номер телефона пуст.');
- Если устройство не готово, ожидание в течение 1 секунды, затем проверка на остановку
} else Device.Wait (1000);
if (Script.IsStop ()) break;
- Переход к следующей записи в базе данных.
Record.Next ();
}
if (Script.IsStop ()) break;
- Если проверка на наличие необходимых полей в базе данных не прошла, закрывается выборка. Если нужна остановка, завершается цикл.
} // Отсутствуют необходимые поля базы данных
Record.Close ();
if (Script.IsStop ()) break;
- Не получены записи из базы данных. Выполнение сценария остановлено, соответствующее сообщение записывается в журнал.
} else Script.InLogError ('Ошибка получения данных для отправки сообщения');
- Ни одна запись в базе данных не соответствует условиям выполнения. Соответствующее сообщение записывается в журнал, закрывается соединение с базой данных.
} else Script.InLogInfo ('Отсутствуют кандидаты на отправку SMS');
Database.Close ();
}
- Увеличивается значение счетчика циклов CycleCount. Проводится проверка на остановку сценария.
CycleCount++;
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 ('Стоп');