Бот-магазин: управление параллелизмом и БД
В данном уроке вы узнаете как создать самый простой бот для интернет магазина с контролем склада и заказов.
Мы создадим бот для небольшого магазина глиняных изделий, который даст возможность клиентам рассмотреть имеющиеся товары и заказывать их. Все заказы будут сохраняться в базу данных, а на складе будет производиться автоматический контроль товаров.
В ходе урока вы узнаете:
Пора перейти к практике!
Перед началом следует ознакомиться с предыдущими уроками Hello Humans: ваше руководство по быстрому старту и Metabot 101: Вывод фото в боте по REST API
Создание скриптов
Чтобы не отвлекаться на это в будущем, сразу создадим стартовый скрипт с приветствием, маршрут связанный с ним и канал Телеграм, при помощи которого будем тестировать бота, как мы делали это в предыдущих уроках.
Нам потребуются следующие скрипты:
Перейдем к их созданию
1. Стартовый скрипт и меню
Стартовый скрипт будет активироваться всего раз после начала лидом диалога с ботом. В нем должно быть всего две команды: отправка сообщения с приветствием и переход на скрипт меню.
Скрипт меню будет выполнять роль навигатора для переключения между категориями товаров. Основным его наполнением будут кнопки, каждая из которых ведет в скрипт определенной категории товаров. Например, в нашем случае, для магазина глиняных изделий, будет создано две категории: тарелки и кружки.
Таким образом в скрипте меню нам нужно добавить команду отправки сообщения-подсказки, например: "Какие товары вас интересуют?", и кнопки меню соответствующие каждой категории.
2. Скрипты категорий
Для каждой категории мы создадим свой скрипт, на который будет ссылаться соответствующая кнопка из меню.
Для удобства все скрипты категорий можно занести в меню скриптов в один раздел. Разделы можно сворачивать, чтобы ненужные в данный момент скрипты не мешались перед глазами, а так же их можно сортировать между собой и организовывать свое рабочее пространство как вам удобно.
Чтобы это сделать создайте раздел при помощи кнопки "Создать раздел". Введите название раздела и подтвердите действия кнопкой "Создать".
Далее в редакторе свойств скрипта из выпадающего списка "Раздел" выберите созданный ранее раздел.
Теперь ваше рабочее пространство будет лучше организованно и с ним будет удобнее работать.
Но вернемся к наполнению скриптов категорий.
Данные скрипты понадобятся нам для того, чтобы бот мог запомнить, товары из какой категории следует выводить боту. В каждом таком скрипте мы создадим две команды: JS код с созданием атрибутов и переход к скрипту вывода товаров.
В команде "Выполнить JavaScript" в атрибуты бота будут добавлены две переменные:
Ниже вы можете скопировать код с фото.
lead.setAttr('category', 'mugs');
lead.setAttr('productNum', 1);
Перед созданием оставшихся скриптов следует реализовать БД для магазина.
Создание кастомных таблиц
Платформа Metabot предоставляет возможность создания своей БД при помощи кастомных таблиц.
Чтобы перейти в меню кастомных таблиц в верхнем меню бота из выпадающего списка "Таблицы" выберите "Конструктор таблиц".
Для нашего бота нужны следующие таблицы:
Перейдем к их созданию.
1. Таблицы товаров
Для создания новой таблицы нажмите на кнопку "Создать" в меню кастомных таблиц. В открывшемся окне заполните следующие поля:
Остальные поля оставьте без изменения и нажмите кнопку "Создать".
Наименования таблиц и названия категорий из скриптов категорий должны быть одинаковыми для исправной работы данного бота.
После создания перейдем в структуру таблицы по соответствующей кнопке в конструкторе таблиц.
Здесь мы можем указать какие поля будет содержать наша таблица. Для примера создадим первое поле таблицы товаров "Название", в котором будут храниться названия продающихся в магазине товаров.
Для этого в меню структуры таблицы нажимаем на кнопку "Создать". В открывшемся окне заполняем следующие поля:
Таким же образом создаем остальные поля таблицы товаров:
Для каждой категории нужно создать таблицу с идентичной структурой. В нашем примере мы имеем две таблицы товаров: plates и mugs.
Затем каждую из этих таблиц нужно заполнить товарами, для исправной работы бота:
2. Таблица заказов
По тому же принципу создаем таблицу заказов со следующими полями:
Таблица заказов будет заполняться автоматически при взаимодействии лидов с ботом. Теперь мы можем переходить к созданию оставшихся скриптов.
Работа с методами таблиц
Для просмотра товаров будет создано два скрипта: скрипт вывода товара и скрипт перехода на следующий товар.
1. Скрипт вывода товаров
В скрипте вывода товара при помощи обращения к таблице товаров и команды отправки текста лиду будет выведена вся информация о товаре.
Для начала добавим команду "Выполнить JavaScript" со следующим кодом:
let category = lead.getAttr('category');
let item = table.find(category, [], [["id", "=", lead.getAttr('productNum')]]);
lead.setAttr('productName', item[0].name);
lead.setAttr('productQua', item[0].qua);
lead.setAttr('productPrice', item[0].price);
lead.setAttr('productPhoto', item[0].photo);
В первой строке мы берем из атрибутов лида информацию о том, какая категория была им выбрана.
Затем в третьей строке мы обращаемся к таблице с помощью команды нахождения записей и записываем результат в локальную переменную item. Для этого указываем наименование категории и условие по которому будет искаться запись. В нашем случае мы ищем запись сопоставляя номер выводимого товара с id записи в таблице.
В строках 5-8 из найденной записи записываем в атрибуты бота все данные о товаре. Эти данные затем будут выведены в диалог с лидом при помощи команды отправки текста.
После JS команды добавляем команду "Отправить текст" со следующим содержимым:
Осталось на складе: {{$productQua}}
Цена: {{$productPrice}}
Фото товара: {{$productPhoto}}
Таким образом у нас получается следующий набор команд:
В данном скрипте осталось только создать меню со следующими кнопками:
2. Скрипт перехода на следующий товар
Данный скрипт поможет нам выводить лиду следующие товары из таблицы. В нем нужно создать две команды: JS скрипт с изменением номера товара и переход в скрипт вывода товаров.
Для начала добавим команду "Выполнить JavaScript" со следующим кодом:
let category = lead.getAttr('category');
let productNum = lead.getAttr('productNum');
if (category == 'plates'){
if (table.count("plates") > productNum){
lead.setAttr('productNum', parseInt(productNum) + 1);
} else {
lead.setAttr('productNum', 1);
}
} else {
if (table.count("mugs") > productNum){
lead.setAttr('productNum', parseInt(productNum) + 1);
} else {
lead.setAttr('productNum', 1);
}
}
В данном скрипте, если пользователь выбрал категорию plates, то происходит проверка больше ли количество записей в таблице plates чем значение номера товара, который должен быть выведен лиду. Если да, то номер товара увеличивается на один, иначе счет номера товара начинается сначала (с единицы).
Тоже самое происходит в случае если пользователь выбрал другую категорию.
После JS команды добавляем команду "Выполнить скрипт" - "Вывод товара" и переходим к созданию следующего скрипта.
Работа с блокировками
Перейдем к созданию последнего скрипта в нашем боте - "Оформление заказа".
В данном скрипте у лида будут запрошены контактные данные, а затем они и остальные данные о заказе будут добавлены в таблицу заказов.
Первым делом создадим три команды "Запросить значение". Из них мы узнаем имя, адрес и телефон заказчика.
Затем перейдем к созданию команды "Выполнить JavaScript". Одной из основных ее частей будет являться работа с блокировками.
let customer = lead.getAttr('customer');
let address = lead.getAttr('address');
let phone = lead.getAttr('phone');
let category = lead.getAttr('category');
let productNum = lead.getAttr('productNum');
// Запись для таблицы заказов
let order = {
"name": customer,
"address": address,
"phone": phone,
"category": category,
"product_id": productNum
}
//----------------------------
let isLocked = false
// Получаем блокировку по боту
bot.sendText('Рассматриваем ваш заказ! Ожидайте подтверждения');
isLocked = bot.waitForBotLock('my_lock', '', 20, 300);
//----------------------------
if (isLocked) {
// Проверяем остались ли товары на складе
let item = table.find(category, [], [["id", "=", productNum]]);
if (item[0].qua > 0){
//----------------------------
// Обновляем данные на складе и создаем запись в таблице заказов
item[0].update({"qua": item[0].qua - 1});
table.createItem("orders", order);
//----------------------------
bot.sendText('Заказ оформлен');
} else {
bot.sendText('К сожалению данного товара уже нет на складе');
}
} else {
bot.sendText('Время ожидания истекло, попробуйте еще раз');
}
// Освобождаем блокировку полученную в данном скрипте
let hasLock = bot.hasLockForBot('my_lock');
if (hasLock) {
bot.releaseCurrentLockForBot('my_lock');
}
//----------------------------
Для начала скрипт узнает все необходимые переменные из атрибутов лида и заносит их в JSON переменную, которая понадобится при создании новой записи в таблице заказов.
Далее переходим к работе с блокировками. В нашем боте мы можем столкнутся с случаем когда остается один экземпляр определенного товара. Для того чтобы исключить ошибки в случаях, когда несколько заказчиков в одно и то же время хотят заказать этот товар, мы используем блокировки.
Скрипт отправляет лиду сообщение о том что его заказ рассматривается и пытается перехватить блокировку. Если время ожидания захвата истекло, то пользователю отправляется сообщение с просьбой попробовать еще раз.
Если же блокировка была захвачена, то скрипт проверяет, точно ли остались товары на складе, и если и эта проверка прошла успешно, то из поле "Количество" в записи товара вычитается единица, а данные заказа добавляются в таблицу заказов.
В конце скрипта происходит проверка на существование ранее захваченной блокировки и ее удаление.
После JS команды добавляем команду "Выполнить скрипт" - "Меню".
Бот готов к тестированию.
Проверка работы бота
Проверим как работает наш бот.
1. Выберите категорию в меню. У вас должны вывестись данные о товаре.
2. Нажмите на кнопку "Следующий товар". У вас должны вывестись данные о другом товаре.
3. Нажмите на кнопку "Оформить заказ". Бот должен запросить у вас данные и прислать сообщение о принятии заказа.
В боте при этом должны обновиться данные в таблицах. В таблице заказов должен появиться новый заказ. А в таблице товаров должно уменьшиться количество выбранного товара.
Если в каждом из пунктов все работает правильно, значит у вас получилось сделать свой бот-магазин.
Поздравляем вас с прохождением урока!


















