Доставка решает
Постановка задач курьерам имеет свои особенности - нужно учесть время прибытия, время на дорогу, что можно дать в нагрузку для соседних адресов и самое главное - что и куда вообще нужно доставить. Если в компании своя доставка товаров, то за львиную долю успеха всего бизнеса отвечает логистика. Каким бы уникальным не был товар и приятными цены, проблемы с доставкой всегда будут оказывать большое влияние на повторные заказы и оставлять неприятный осадок у покупателя.
Ко мне обратилась компания, которая продавала товар с доставкой не просто день-в-день, у них был заявлен срок доставки заказа по Москве от 40 минут, а заказы у них были.
Представьте себе, в течение часа компания получает, допустим, 15 заказов и, пока товар готовится к отправке, нужно успеть определиться с тем, какие из этих заказов рядом, чтобы отдать их одному курьеру, распределить их очередность, чтобы курьер оказался по нужному адресу в согласованное с клиентом время и не забыть ему вручить карточку с данными о заказе, чтобы курьер мог быстро увидеть детали заказа, комментарии к нему, адрес, время и какой товар вообще отдавать клиенту. И так весь день, с утра до самого вечера. Сложно? Лично мне это кажется очень серьезным испытанием. Тем более, что логистику я пока так и не смог хоть как-то понять. Программировать я научиться смог, понял логику и мне это перестало казаться магией, а вот логистика на тот момент не укладывалась ни в какие известные мне алгоритмы решения задач и была белым пятном (скорее даже черным) в моём кругозоре.
Карточки для курьеров
Немного остановимся на том, что из себя представляют эти самые карточки для курьеров с данными о заказе (маршрутные листы). Это простой лист А4, на котором указаны:
- Время;
- Товар;
- Комментарии;
- Контакты для связи с получателем;
- Данные о способе и сумме оплаты;
- Другие технические детали.
Вторым листом к этому бланку печатался фрагмент из Яндекс карт с отметкой нужного адреса и ближайшей станцией метро. Как я понял в дальнейшем, подобный перечень данных выдается курьерам во многих организациях, даже, если это редкая задача по доставке, например, документов.
Процесс в исходном виде
А теперь, о том, как эти карточки формировались.
Все достаточно просто и банально - руками и классическим копипастом из Google таблицы в шаблонный бланк. Дополнительно копировался адрес в Яндекс карты, иногда уточнялся, так как не всегда он был понятен картам. Масштаб на карте подгонялся так, чтобы было видно и адрес, и ближайшее метро, а затем уже выводился на печать.
С учетом количества фрагментов данных, которые нужно было перенести в бланк, и печати самой карты, количество простых, абсолютно механических действий начиналось от 12 кликов и переключений между вкладками. Беря во внимание суету, в которой все это происходит, необходимость размышлять о том, какому из курьеров отдать конкретный заказ, успеют ли заказ подготовить к выходу курьера и других моментах (о чем там еще думают логисты?) - становится ясно, что вероятность совершения простой механической ошибки достаточно высока.
Отдельным пунктом этой увлекательной истории следует отметить упорство и старательность сотрудников, которые это делали. И делали достаточно давно, более 7 лет. Честно, мне кажется, я бы сдулся и изменил свое позитивное отношение к жизни до конца первого года подобного труда.
Исправляем ситуацию
Из ответов на мои вопросы, которые заказчик вдумчиво и старательно давал в перерывах между копированием данных в задания курьеру, поиском адресов на карте и печатью бланков, нам с ним удалось сформулировать цель предстоящих действий и определить задачи.
Спойлер: вот тут можно поиграться с результатом, но лучше с компьютера
И так, цель мы сформулировали следующую: “Ускорить процесс назначения и отправки курьеров”, естественно, без ущерба качеству самой логистики. А задачи звучали буквально так (цитирую): “Нам нужно быстро, в идеале одной кнопкой, печатать бланк заказа для курьера и карту, чтобы на ней был виден сам адрес и ближайшее метро”. В целом все понятно, в частности - не очень. Пришлось задать полтора уточняющих вопроса, и в итоге получилось составить список, с которым уже можно открывать редактор и приниматься за разработку.
А теперь о том, что нужно было сделать, исходя из поставленной цели:
- Составить шаблон бланка с необходимыми курьеру данными о заказе и картой.
- Реализовать автоматический перенос данных о заказе из таблицы в этот шаблон.
- В бланке отобразить карту Яндекс, в центре которой бы отображались точка доставки и ближайшее к ней метро. Точку доставки обозначить меткой с подписью, в подписи продублировать адрес, а ближайшее метро обозначить меткой с буквой “М”. Предусмотреть возможность “подвигать” карту и изменить масштаб, чтобы при необходимости, вручную скорректировать отображение.
- Под картой разместить текстовое поле для ввода адреса с подсказками и кнопку, при нажатии на которую бы карта перемещалась на новый адрес и метро. В поле для адреса по умолчанию показывать текущий адрес, который указан в таблице и по которому центрирована карта. Эти элементы на печать не выводить.
- В особых случаях, при соблюдении конкретных условий - в шапке бланка отобразить изображение.
- Отобразить кнопку “печать”, при нажатии на которую бланк будет отправляться на печать. Кнопку на печать не выводить.
- Автоматически заливать строки в таблице с заказами, для которых бланк уже распечатан.
- Запускать процесс в минимальное количество действий, и обязательно из таблицы с заказами.
Если бы нужно было просто перенести данные из таблицы в шаблон и расставить по своим местам - задача была бы совсем тривиальной, неинтересной и даже скучной. Однако, необходимость приручить принтер и карты Яндекса из таблицы Гугла, обойти ограничения таблиц по размещению кнопок (я хотел запускать процесс прямо из строки с заказом), бросала мне вызов и добавляла азарта. Принимая во внимание желание вырвать людей из лап той монотонной скукотищи, которой занимался заказчик - мотивацию можно было считать железобетонной.
Реализация решения для курьеров
Забегая немного вперед, скажу, что не со всеми поставленными задачами мне удалось справиться именно так, как я рассчитывал. Поэтому, если я упустил какое-то решение или вы просто знаете его - попрошу поделиться в комментариях.
В качестве среды, в которой будет выполняться, обрабатываться и отображаться приложение я выбрал гугл скрипты, решил воспользоваться возможностью развертывания web-app. Этот способ позволяет обработать входящий запрос и отдать нужный ответ. Такая “облачная функция” на минималках. В данном случае скрипт в ответ отдавал веб-страницу, на которой я с помощью HTML и ванильного JavaScript расставлял по нужным местам шаблона данные, а с помощью API Яндекс карт находил координаты адреса, ближайшее метро и строил карту с ними.
А вот с печатью мне пришлось повозиться. При нажатии на кнопку “напечатать”, я настроил заливку строки в таблице и скрытие ненужных курьеру полей и кнопок. Проблема возникла в том, что у меня никак не получилось обойти вызов диалогового окна печати. С какой стороны я не заходил, как не игрался с настройками браузера, печать по кнопке на странице реализовать не удалось и получилось одно лишнее движение - нужно подтверждать отправку на печать. Поэтому, если вдруг кто-то знает способ - дайте знать, пожалуйста, а то я плохо сплю.
Для запуска я решил отказаться от кнопок в таблице и использования меню. Просто добавил столбец с функцией ГИПЕРССЫЛКА() в массиве, заполнил его. В качестве текста ссылки использовал эмоджи с машинкой (доставка же), а в качестве адреса - ссылку на развернутое веб-приложение и номер заказа в параметрах. Мне кажется получилось гениально и, кроме того, еще и быстро. Во-первых - это быстрее, чем запускать скрипт через клик на картинке, ждать выполнения скрипта и перенаправлять пользователя на еще один скрипт, а во-вторых - не нужно выходить за пределы строки с заказом.
Получился следующий процесс: клик по ссылке у машинки рядом с адресом => открытие новой вкладки с бланком => исправление адреса или карты при необходимости => клик на кнопку “печать” и подтверждение печати. Всего 4 действия и примерно 3-5 секунд, вместо минимум 30 секунд, которые тратили раньше на перенос данных и переключения между вкладками.
Заключение
Подводя итог, хочу заметить что подобные не сильно громоздкие, но очень вязкие процессы встречаются очень часто. Бывает, что причиной является привычка из разряда “всегда так делали” и замыленный взгляд, а бывает и незнание доступных способов автоматизации. Конечно, подобное становится заметным, когда проблема принимает большой масштаб и количество затрачиваемых сил поднимает приоритет необходимости оптимизации на заметный уровень, но если автоматизацию проводить чуть раньше - это ощутимо сказывается на количестве свободных ресурсов и, как следствие, на развитии бизнеса.