Конфигурации (версия 3.хх)/Приём показаний в Telegram
Основной алгоритм работы
- Если лицевой счёт получен, выполняется запрос на поиск лицевого счёта в базе данных.
- Если лицевой счёт найден в базе данных, выполняется запрос на получение списка приборов учёта по этому лицевому счёту.
- По каждому прибору учёта из списка принимаются показания.
- Принятые показания проверяются и, если проверка прошла успешно, записываются в базу данных.
Пошаговая настройка
Для приема показаний, нужно зарегистрироваться в Telegram и создать бота. Получение токена Telegram.
Токен прописываем в разделе Устройство
Получение номера лицевого счёта от абонента
В область действия сценария добавляется переменная [Account], содержащая полученное значение лицевого счёта, которую можно в дальнейшем использовать в SQL-запросах.
Если лицевой счёт не получен или данные по нему не найдены в базе данных, то будет отправлено сообщение «Номер лицевого счета XXXXXXXXX не найден в базе данных»
При получении данных лицевого счёта сценарий переходит к получению списка приборов учёта.
Поиск лицевого счёта в базе данных
На странице настроек «Поиск по номеру лицевого счёта» указывается SQL-запрос на получение данных по номеру лицевого счёта. Для подстановки в запрос значение номера лицевого счёта, указанного абонентом или определившегося по номеру телефона, используется переменная [Account].
Например, если задать запрос:
select * from `Account` where `Account`='[Account]'
во время работы сценария при указанном лицевом счёте 123456789 будет выполнен запрос:
select * from `Account` where `Account`='123456789'
Если получена запись с номером лицевого счёта, в сценарий возвращается эта запись, иначе возвращается значение null.
Получение списка приборов учёта по лицевому счёту
После того, как лицевой счёт получен и найден в базе данных, выполняется SQL-запрос, указанный на странице настроек «Поиск доступных приборов учёта». В SQL-запросе можно использовать все ранее полученные переменные из области действия сценария.
Например, если задать запрос:
select * from `Counter` where Account ='[Account]' order by `CounterName`
во время работы сценария при указанном лицевом счёте 123456789 будет выполнен запрос:
select * from `Counter` where Account ='123456789' order by `CounterName`
Запрос получает список приборов учёта по указанному лицевому счёту. На странице настроек необходимо указать поле «Название прибора учёта», содержимое этого поля при выполнении сценария добавляется в переменную [CounterName] и в дальнейшем может использоваться в SQL-запросах.
Сценарий запрашивает у абонента показания по каждому прибору учёта в порядке их получения в SQL-запросе.
Приём показаний по каждому прибору учёта из списка
Полученное значение записывается в переменную области действия сценария [Reading] и проверяется на корректность. Если полученные показания допускаются после проверки, выполняется запись показаний в базу данных, сценарий переходит к следующему прибору учёта из списка.
Если показания не проходят проверку на корректность, отправляем сообщение «Показания <XX> прибора учёта <Название прибора учета> не приняты: Введённые показания <XX> меньше текущих <XX>.», и можно еще раз передать показания получить корректные показания.
Проверка полученных показаний
На странице «Проверка показаний приборов учёта» необходимо задать функцию, которая возвращает true, если введённые показания удовлетворяют условиям, или текст сообщения об ошибке, если показания не корректны.
В этой функции вы можете использовать переменные, полученные в результате выполнения предыдущих запросов. Они добавляются в область действия сценария в формате [<Имя запроса>.<Название поля>]. Например, если на странице «Поиск по номеру лицевого счёта» указать имя запроса Лицевой счёт, и в таблице, к которой обращается SQL-запрос есть поля: Phone, Account, Name, Debt, Status, CallTime, — в область действия сценария добавляются переменные: [Лицевой счёт.Phone], [Лицевой счёт.Account], [Лицевой счёт.Name], [Лицевой счёт.Debt], [Лицевой счёт.Status] и [Лицевой счёт.CallTime], имеющие значения соответствующих полей.
Кроме этого в функцию передаётся класс Database для работы с базой данных.
Например, следующая функция сравнивает текущие показания прибора учёта из поля [Счетчик.LastReading] с полученными от абонента ([Reading]). Если [Reading] меньше текущих показаний, возвращается текст ошибки: «Введённые показания [Reading] меньше текущих [Счетчик.LastReading]».
function (Database)
{
if ([Счетчик.LastReading] >[Reading]) return 'Введённые показания [Reading] меньше текущих [Счетчик.LastReading]';
/*
Здесь вы можете использовать любые выражения Javascript и/или выполнять запросы к базе данных. Например:
var Record = Database.Query ("select * from `Counter` where `Account`='[Account]' and `CounterName`='[CounterName]'");
if (Record.Fetch ()) {
if (Record.GetFieldValue (`Id_Counter`) > 5) return 'Id прибора учёта больше пяти';
}
*/
return true;
}
Этот текст сохраняется в переменную области действия сценария [CheckCounterResult] и может быть использован в сообщении «Не получены показания» для произнесения абоненту.
Запись принятых показаний в базу данных
SQL-запрос сохранения полученных данных можно настроить на странице «Запись данных». В нём можно использовать все ранее полученные переменные из области действия сценария.
Например, запрос
insert into `CounterLog` (`Id_Counter`, `Phone`, `Reading`, `DReading`) values ([Счетчик.Id_Counter], '[InPhone]', [Reading], now()) // update `Counter` set `LastReading` = [Reading] where `Account`='[Account]' and `CounterName`='[CounterName]'
будет во-первых, разделён на два SQL-запроса по метке «//», а во-вторых, во время действия сценария при получении значения лицевого счёта 123456789, названия прибора учёта «По горячей воде» и полученных показаний 123456 запросы будут исполнены как
insert into `CounterLog` (`Id_Counter`, `Phone`, `Reading`, `DReading`) values (1, '2222201', 123456, now()) // update `Counter` set `LastReading`=123456 where `Account`='123456789' and `CounterName`='по горячей воде'
Если запрос выполнен без ошибок, произносится голосовое сообщение со страницы «Показания записаны успешно». Если в процессе сохранения данных возникла ошибка, описание ошибки сохраняется в переменную области действия сценария [SaveResult] и произносится сообщение «Ошибка записи показаний».