Конфигурации (версия 3.хх)/Приём показаний в Telegram

Материал из Call Office Wiki
Версия от 05:43, 4 апреля 2025; Dmitry (обсуждение | вклад) (Новая страница: «=Основной алгоритм работы= #Если номер телефона определён, #Запрос на поиск лицевого сч...»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Основной алгоритм работы

  1. Если номер телефона определён, выполняется запрос на поиск лицевого счёта по идентификатору Telegram.
  2. Если номер лицевого счёта по идентификатору Telegram не получен, выполняется получение номера лицевого счёта от абонента.
  3. Если лицевой счёт получен, выполняется запрос на поиск лицевого счёта в базе данных.
  4. Если лицевой счёт найден в базе данных, выполняется запрос на получение списка приборов учёта по этому лицевому счёту.
  5. По каждому прибору учёта из списка принимаются показания.
  6. Принятые показания проверяются и, если проверка прошла успешно, записываются в базу данных.

Пошаговая настройка

Запрос на поиск лицевого счёта по идентификатору Telegram

Если вы используете жёсткую привязку лицевого счёта к идентификатору Telegram, используйте SQL-запрос на странице «Поиск лицевого счета по идентификатору Telegramа». Если такой привязки нет, запрос можно оставить пустым, и поиск по идентификатору Telegrma производиться не будет.

В SQL-запросе необходимо в обязательном порядке указать поле, содержащее номер лицевого счёта. Поле выбирается там же на странице настроек.

Для подстановки в запрос идентификатора Telegrma, который определился у абонента, используйте переменную [InPhone].

Например, если указать SQL-запрос

  select * from `Account` where `Phone`='[InPhone]'

во время работы сценария при входящем сообщении с идентификатором 2222201 будет выполнен запрос:

  select * from `Account` where `Phone`='2222201'

На этой же странице можно ввести для проверки идентификатора, который будет подставлен вместо переменной [InPhone] после нажатия кнопки «Проверить». Результат выполнения запроса будет выведен в виде таблицы в поле «Результаты запроса».

Во время работы сценария выполняется поиск по идентификатору Telegrma. В случае, если запись с лицевым счётом найдена, в область действия сценария добавляется переменная [Account], содержащая номер лицевого счёта.

При получении только одной записи в результате выполнения запроса при работе сценария лицевой счёт считается определённым и дополнительно не спрашивается у абонента.

Если не получено ни одной записи, или получено две и более записей, сценарий предлагает абоненту указать лицевой счёт.

Получение номера лицевого счёта от абонента

В область действия сценария добавляется переменная [Account], содержащая полученное значение лицевого счёта, которую можно в дальнейшем использовать в SQL-запросах или в поле «Выражение» голосовых сообщений

Если лицевой счёт не получен или данные по нему не найдены в базе данных, произносится сообщение «Не получены данные лицевого счёта», сценарий ещё два раза запрашивает у абонента лицевой счёт.

Если лицевой счёт не получен или не найден в базе данных после трёх попыток, сценарий переходит к прощальному сообщению.

При получении данных лицевого счёта сценарий переходит к получению списка приборов учёта.

Поиск лицевого счёта в базе данных

На странице настроек «Поиск по номеру лицевого счёта» указывается 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] и проверяется на корректность. Если полученные показания допускаются после проверки, выполняется запись показаний в базу данных, сценарий переходит к следующему прибору учёта из списка.

Если показания не проходят проверку на корректность, произносится сообщение, указанное на странице настроек голосового сообщения «Не получены показания», сценарий ещё дважды пытается получить корректные показания.

Проверка полученных показаний

На странице «Проверка показаний приборов учёта» необходимо задать функцию, которая возвращает 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] и произносится сообщение «Ошибка записи показаний».