Приём показаний приборов учёта. Инструкция: различия между версиями
McBurns (обсуждение | вклад) |
Jugin (обсуждение | вклад) |
||
(не показано 16 промежуточных версий 3 участников) | |||
Строка 27: | Строка 27: | ||
==Запрос на поиск лицевого счёта по номеру телефона== | ==Запрос на поиск лицевого счёта по номеру телефона== | ||
Если | Если вы используете жёсткую привязку лицевого счёта к номеру телефона, используйте SQL-запрос на странице '''«Поиск лицевого счета по номеру телефона»'''. Если такой привязки нет, запрос можно оставить пустым, и поиск по номеру телефона производиться не будет. | ||
В SQL-запросе необходимо в обязательном порядке указать поле, содержащее номер лицевого счёта. Поле выбирается там же на странице настроек. | В SQL-запросе необходимо в обязательном порядке указать поле, содержащее номер лицевого счёта. Поле выбирается там же на странице настроек. | ||
Строка 33: | Строка 33: | ||
Для подстановки в запрос номера телефона, который определился у абонента, используйте переменную '''[InPhone]'''. | Для подстановки в запрос номера телефона, который определился у абонента, используйте переменную '''[InPhone]'''. | ||
Например, если | Например, если указать SQL-запрос | ||
select * from `Account` where `Phone`='[InPhone]' | select * from `Account` where `Phone`='[InPhone]' | ||
Строка 105: | Строка 105: | ||
и название прибора учёта в базе данных указано как «по горячей воде», в случае приёма показаний голосом будет сказано: «Произнесите показания прибора учёта по горячей воде». Если идёт приём показаний путём распознавания нажатых клавиш, будет произнесено: «Введите показания прибора учёта по горячей воде и нажмите звёздочку». | и название прибора учёта в базе данных указано как «по горячей воде», в случае приёма показаний голосом будет сказано: «Произнесите показания прибора учёта по горячей воде». Если идёт приём показаний путём распознавания нажатых клавиш, будет произнесено: «Введите показания прибора учёта по горячей воде и нажмите звёздочку». | ||
В течение 18 секунд сценарий ожидает голосового сообщения или нажатия клавиш телефона. Полученное значение записывается в переменную области действия сценария '''[ | В течение 18 секунд сценарий ожидает голосового сообщения или нажатия клавиш телефона. Полученное значение записывается в переменную области действия сценария '''[Reading]''' и [[#Проверка полученных показаний|проверяется на корректность]]. Если полученные показания допускаются после [[#Проверка полученных показаний|проверки]], выполняется запись показаний в базу данных, сценарий переходит к следующему [[#Получение списка приборов учёта по лицевому счёту|прибору учёта из списка]]. | ||
Если показания [[#Проверка полученных показаний|не проходят проверку на корректность]], произносится сообщение, указанное на странице настроек голосового сообщения '''«Не получены показания»''', сценарий ещё дважды пытается [[#Проверка полученных показаний|получить корректные показания]]. | Если показания [[#Проверка полученных показаний|не проходят проверку на корректность]], произносится сообщение, указанное на странице настроек голосового сообщения '''«Не получены показания»''', сценарий ещё дважды пытается [[#Проверка полученных показаний|получить корректные показания]]. | ||
Строка 117: | Строка 117: | ||
Кроме этого в функцию передаётся класс Database для работы с базой данных. | Кроме этого в функцию передаётся класс Database для работы с базой данных. | ||
Например, следующая функция сравнивает текущие показания прибора учёта из поля '''[Счетчик. | Например, следующая функция сравнивает текущие показания прибора учёта из поля '''[Счетчик.LastReading]''' с полученными от абонента ('''[Reading]'''). Если '''[Reading]''' меньше текущих показаний, возвращается текст ошибки: «Введённые показания [Reading] меньше текущих [Счетчик.LastReading]». | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript"> | ||
function (Database) | function (Database) | ||
{ | { | ||
if ([Счетчик. | if ([Счетчик.LastReading] >[Reading]) return 'Введённые показания [Reading] меньше текущих [Счетчик.LastReading]'; | ||
/* | /* | ||
Здесь вы можете использовать любые выражения Javascript и/или выполнять запросы к базе данных. Например: | |||
var Record = Database.Query ("select * from `Counter` where `Account`='[Account]' and `CounterName`='[CounterName]'"); | var Record = Database.Query ("select * from `Counter` where `Account`='[Account]' and `CounterName`='[CounterName]'"); | ||
Строка 131: | Строка 131: | ||
if (Record.Fetch ()) { | if (Record.Fetch ()) { | ||
if (Record.GetFieldValue (` | if (Record.GetFieldValue (`Id_Counter`) > 5) return 'Id прибора учёта больше пяти'; | ||
} | } | ||
Строка 148: | Строка 148: | ||
Например, запрос | Например, запрос | ||
update `Counter` set ` | 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]' | |||
во время действия сценария при получении значения лицевого счёта 123456789, названия прибора учёта | будет во-первых, разделён на два SQL-запроса по метке «//», а во-вторых, во время действия сценария при получении значения лицевого счёта '''123456789''', названия прибора учёта '''«По горячей воде»''' и полученных показаний '''123456''' запросы будут исполнены как | ||
update `Counter` set ` | insert into `CounterLog` (`Id_Counter`, `Phone`, `Reading`, `DReading`) | ||
values (1, '2222201', 123456, now()) | |||
// | |||
update `Counter` set `LastReading`=123456 where `Account`='123456789' and `CounterName`='по горячей воде' | |||
Если запрос выполнен без ошибок, произносится голосовое сообщение со страницы «Показания записаны успешно». Если в процессе сохранения данных возникла ошибка, описание ошибки сохраняется в переменную области действия сценария '''[SaveResult]''' и произносится сообщение '''«Ошибка записи показаний»'''. | Если запрос выполнен без ошибок, произносится голосовое сообщение со страницы «Показания записаны успешно». Если в процессе сохранения данных возникла ошибка, описание ошибки сохраняется в переменную области действия сценария '''[SaveResult]''' и произносится сообщение '''«Ошибка записи показаний»'''. | ||
Для записи принятых показаний в разные столбцы, в зависимости от того, показание какого прибора учета получено, следует использовать запросы такого вида: | |||
update `Counter` set `Показание1` = [Reading] where `Account`='[Account]' and '[CounterName]'='Холодная вода' | |||
// | |||
update `Counter` set `Показание2` = [Reading] where `Account`='[Account]' and '[CounterName]'='Горячая вода' | |||
// | |||
... | |||
В данном примере показание по холодной воде будет записано в столбец '''Показание1''', а показание по горячей воде в столбец '''Показание2'''. Конечно, названия приборов учета должны точно соответствовать названием приборов полученных в запросе на получение списка приборов учета по лицевому счету. | |||
==Прощальное сообщение== | ==Прощальное сообщение== | ||
Строка 163: | Строка 179: | ||
При необходимости можно включить дополнительно сохранение голоса абонента в звуковой файл. Подробное описание можно найти на странице «[[Сохранить аудиозапись звонка (версия 3.xx)]]». | При необходимости можно включить дополнительно сохранение голоса абонента в звуковой файл. Подробное описание можно найти на странице «[[Сохранить аудиозапись звонка (версия 3.xx)]]». | ||
=Запуск в консольном режиме= | |||
Для минимизации использования ресурсов компьютера конфигурацию Приём показаний можно запускать в [[Параметры_командной_строки|консольном режиме]], например, так: | |||
start /D "C:\Program Files\Call Office" RunConfig.bat "Приём показаний.co" | |||
Если необходимо запустить одно и ту же конфигурацию несколько раз, для каждой конфигурации нужно указать уникальное имя журнала. Это можно сделать так: | |||
start /D "C:\Program Files\Call Office" RunConfig.bat "Приём показаний.co" Thread=1 | |||
start /D "C:\Program Files\Call Office" RunConfig.bat "Приём показаний.co" Thread=2 | |||
start /D "C:\Program Files\Call Office" RunConfig.bat "Приём показаний.co" Thread=3 | |||
В этом случае, в область видимости переменных сценария будет добавлена переменная '''Arg.Thread''' с значением переданным в командной строке. В этом случае, в имя файла журнала в свойствах сценария нужно добавить макроподстановку переменной '''[Arg.Thread]''', например так: | |||
Приём показаний [Arg.Thread].log | |||
Таким образом, конфигурация для разных процессов одна и та же, а файлы журнала для каждого процесса будут разными. | |||
[[Category:Приём показаний]] |
Текущая версия на 08:42, 12 июля 2018
Основной алгоритм работы
- Произнесение приветственого сообщения.
- Ожидание выбора способа передачи показаний.
- Если номер телефона определён, выполняется запрос на поиск лицевого счёта по номеру телефона.
- Если номер лицевого счёта по номеру телефона не получен, выполняется получение номера лицевого счёта от абонента.
- Если лицевой счёт получен, выполняется запрос на поиск лицевого счёта в базе данных.
- Если лицевой счёт найден в базе данных, выполняется запрос на получение списка приборов учёта по этому лицевому счёту.
- По каждому прибору учёта из списка принимаются показания.
- Принятые показания проверяются и, если проверка прошла успешно, записываются в базу данных.
- Произносится прощальное сообщение.
Пошаговая настройка
Вступительное сообщение
В этом сообщении абонент получает информацию о том, каким образом будет происходить приём показаний.
В сообщении абоненту необходимо объяснить, что при нажатии любой клавиши на телефоне в тональном режиме приём показаний будет происходить путём распознавания нажатых клавиш, иначе — путём распознавания голоса.
Ожидание выбора способа передачи показаний
После трёхсекундного ожидания в область действия сценария добавляется переменная [IsVoice]. Если абонент не нажимал никаких клавиш, она имеет значение true, выбрана передача показаний голосом. Если была нажата клавиша на телефоне, переменная получает значение false, выбрано получение показаний путём нажатия клавиш телефона.
В дальнейшем эту и любые другие переменные, добавленные в область действия сценария, можно использовать как в запросах, так и в голосовых сообщениях. Например, для выбора сообщения, которое будет произноситься абоненту.
Запрос на поиск лицевого счёта по номеру телефона
Если вы используете жёсткую привязку лицевого счёта к номеру телефона, используйте SQL-запрос на странице «Поиск лицевого счета по номеру телефона». Если такой привязки нет, запрос можно оставить пустым, и поиск по номеру телефона производиться не будет.
В SQL-запросе необходимо в обязательном порядке указать поле, содержащее номер лицевого счёта. Поле выбирается там же на странице настроек.
Для подстановки в запрос номера телефона, который определился у абонента, используйте переменную [InPhone].
Например, если указать SQL-запрос
select * from `Account` where `Phone`='[InPhone]'
во время работы сценария при звонке с номера 2222201 будет выполнен запрос:
select * from `Account` where `Phone`='2222201'
На этой же странице можно ввести для проверки номер телефона, который будет подставлен вместо переменной [InPhone] после нажатия кнопки «Проверить». Результат выполнения запроса будет выведен в виде таблицы в поле «Результаты запроса».
Во время работы сценария выполняется поиск по номеру телефона. В случае, если запись с лицевым счётом найдена, в область действия сценария добавляется переменная [Account], содержащая номер лицевого счёта.
При получении только одной записи в результате выполнения запроса при работе сценария лицевой счёт считается определённым и дополнительно не спрашивается у абонента.
Если не получено ни одной записи, или получено две и более записей, сценарий предлагает абоненту указать лицевой счёт.
Получение номера лицевого счёта от абонента
Произносится голосовое сообщение, заданное на странице «Получение лицевого счёта». В поле «Выражение» можно использовать переменную [IsVoice]. Например:
([IsVoice]? 'Назовите номер лицевого счёта' : 'Введите номер лицевого счёта и нажмите звёздочку')
В случае, если идёт приём показаний голосом ([IsVoice] = true), произносится: «Назовите номер лицевого счёта». Иначе: «Введите номер лицевого счёта и нажмите звёздочку».
После произнесения сообщения сценарий в течение 18 секунд ожидает произнесения номера лицевого счёта или нажатия клавиш на телефоне.
В область действия сценария добавляется переменная [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-запросе.
Приём показаний по каждому прибору учёта из списка
Произносится голосовое сообщение, указанное на странице «Получение показаний». Например, при использовании такого выражения:
([IsVoice]? 'Произнесите показания прибора учёта [CounterName]' : 'Введите показания прибора учёта [CounterName] и нажмите звёздочку')
и название прибора учёта в базе данных указано как «по горячей воде», в случае приёма показаний голосом будет сказано: «Произнесите показания прибора учёта по горячей воде». Если идёт приём показаний путём распознавания нажатых клавиш, будет произнесено: «Введите показания прибора учёта по горячей воде и нажмите звёздочку».
В течение 18 секунд сценарий ожидает голосового сообщения или нажатия клавиш телефона. Полученное значение записывается в переменную области действия сценария [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] и произносится сообщение «Ошибка записи показаний».
Для записи принятых показаний в разные столбцы, в зависимости от того, показание какого прибора учета получено, следует использовать запросы такого вида:
update `Counter` set `Показание1` = [Reading] where `Account`='[Account]' and '[CounterName]'='Холодная вода' // update `Counter` set `Показание2` = [Reading] where `Account`='[Account]' and '[CounterName]'='Горячая вода' // ...
В данном примере показание по холодной воде будет записано в столбец Показание1, а показание по горячей воде в столбец Показание2. Конечно, названия приборов учета должны точно соответствовать названием приборов полученных в запросе на получение списка приборов учета по лицевому счету.
Прощальное сообщение
После окончания процедуры принятия показаний произносится голосовое сообщение, указанное на странице настроек «До свидания».
Запись голоса абонента
При необходимости можно включить дополнительно сохранение голоса абонента в звуковой файл. Подробное описание можно найти на странице «Сохранить аудиозапись звонка (версия 3.xx)».
Запуск в консольном режиме
Для минимизации использования ресурсов компьютера конфигурацию Приём показаний можно запускать в консольном режиме, например, так:
start /D "C:\Program Files\Call Office" RunConfig.bat "Приём показаний.co"
Если необходимо запустить одно и ту же конфигурацию несколько раз, для каждой конфигурации нужно указать уникальное имя журнала. Это можно сделать так:
start /D "C:\Program Files\Call Office" RunConfig.bat "Приём показаний.co" Thread=1 start /D "C:\Program Files\Call Office" RunConfig.bat "Приём показаний.co" Thread=2 start /D "C:\Program Files\Call Office" RunConfig.bat "Приём показаний.co" Thread=3
В этом случае, в область видимости переменных сценария будет добавлена переменная Arg.Thread с значением переданным в командной строке. В этом случае, в имя файла журнала в свойствах сценария нужно добавить макроподстановку переменной [Arg.Thread], например так:
Приём показаний [Arg.Thread].log
Таким образом, конфигурация для разных процессов одна и та же, а файлы журнала для каждого процесса будут разными.