Была поставлена задача автоматизировать, упростить работу сотрудника, занимающегося распределением доставок по маршрутам. Ну если быть более точным, то задача выглядела вот так:
1. ...
2. Возможность загрузить доставки на заданный интервал дат.
3. При запуске скрипта запросить условие — по признакам ...
4. Изменить внешний функционал. Не делить экран на два поля в разделе маршруты. Сделать две закладки — «доставки» и «маршруты». В закладке доставки отображать документы доставок (то,что сейчас отображается в разделе «маршруты»), а в разделе «маршруты» отображать работу с маршрутами.
5. Ликвидировать раздел «пирамиды».
6. В разделе Маршруты:
а.) Выводить маршруты соответствующие выбранному диаппазону доставок.
б.) добавить колонку «водитель». В которой оператор будет проставлять ФИО водителя. Эти данные нужно будет сохранить и проставить это ФИО в каждой доставке.
в.) подвал маршрута — показывать позиции изделий, упаковки. Скрыть крепеж. Для упаковок тоже сделать подвал, в котором нужно отобразить содержимое упаковки.
г.) к маршруту добавить колонку «изображение изделия с размерами». В том виде как сейчас это реализовано в разделе пирамиды.
7. Во всех полях «комментарий», если есть комментарий показывать значок всплывающего окна, кликнув на который открывается коммент.
8. В закладке доставок создать колонку для работы диспетчера, по которой он будет группировать. В этой колонке будут ставить текст.
9. Сделать возможным увидеть общее количество доставок, изделий, площадь
10. Сделать с подсветкой доставки, у которых в заказе монтаж равен дате доставки
Уже в процессе решения основной задачи поступили просьбы, связать программу WinDraw с какой-либо графической картой, что бы отображать нужный адрес на карте. Выбирая с какой картой работать сначала отсекли офф-лайн версии. Дальше выбирали между Яндекс.Картами и Google.Maps. В итоге выбран был Гугл, как наиболее функциональный и быстро развивающийся.
Итак, от карты требовалось либо отобразить адрес конкретного договора, либо проложить маршрут по нескольким адресам.
Первая часть была решена быстро и просто, фактически открывается браузер по умолчанию и в адресную строку вставляется выражение
1 | http://maps.google.ru/maps?q=необходимый адрес |
например
1 | http://maps.google.ru/maps?q=Вилиса%20Лациса%20д.17%20к.1 |
Вторая часть более интересна. Необходимо передать несколько адресов сразу, что бы проложить маршрут между ними. Сразу появилась проблема — в длинне строки http больше 10 адресов не удается отправить. Тем более, что адреса заполняет кто как. Плюс в адрес вставляют номер квартиры, этаж, код домофона и многое другое, что только мешает Google.Maps правильно найти адрес. Была написана такая вот функция (она не идеальна и периодически дорабатывается):
1 | public static string GetGoogleAddress(string address) { address = address.ToLower().Replace("г.", ""); address = address.Replace(":", " ").Replace("\"", "").Replace("<", "").Replace(">", "").Replace("?", " ").Replace("!", " ").Replace("*", " ").Replace("&", " ").Replace("@", "").Replace("(", " ").Replace(")", " "); address = address.Replace("пос.", ""); address = address.Replace("ул.", ""); address = address.Replace(" д.", " "); address = address.Replace("москва", ""); address = address.Replace("москв,", ""); address = address.Replace(@"м/о", "").Replace(@"м\о", "").Replace(" м.", "").Replace(" о.", ""); address = address.Replace("проезд", ""); address = address.Replace(" пр.", " "); address = address.Replace(" пр ", " "); address = address.Replace("пр-т ", " "); address = address.Replace(" бул. ", " "); address = address.Replace(" бул ", " "); address = address.Replace(" б-р ", " "); address = address.Replace("пр-д", ""); address = address.Replace("шоссе", ""); address = address.Replace("ш.", ""); address = address.Replace(" ак.", " "); address = address.Replace(" ак ", " "); address = address.Replace(".", " "); address = address.Replace(",д ", " "); address = address.Replace(" дом ", " "); address = address.Replace(" дом1", " 1"); address = address.Replace(" дом2", " 2"); address = address.Replace(" дом3", " 3"); address = address.Replace(" дом4", " 4"); address = address.Replace(" дом5", " 5"); address = address.Replace(" дом6", " 6"); address = address.Replace(" дом7", " 7"); address = address.Replace(" дом8", " 8"); address = address.Replace(" дом9", " 9"); address = address.Replace(" д1", " 1"); address = address.Replace(" д2", " 2"); address = address.Replace(" д3", " 3"); address = address.Replace(" д4", " 4"); address = address.Replace(" д5", " 5"); address = address.Replace(" д6", " 6"); address = address.Replace(" д7", " 7"); address = address.Replace(" д8", " 8"); address = address.Replace(" д9", " 9"); address = address.Replace(" кв1", " кв 1"); address = address.Replace(" кв2", " кв 2"); address = address.Replace(" кв3", " кв 3"); address = address.Replace(" кв4", " кв 4"); address = address.Replace(" кв5", " кв 5"); address = address.Replace(" кв6", " кв 6"); address = address.Replace(" кв7", " кв 7"); address = address.Replace(" кв8", " кв 8"); address = address.Replace(" кв9", " кв 9"); address = address.Replace(",кв", " кв "); if (address.Contains(" кв ")) address = |
1 | address.Remove(address.IndexOf(" кв ")); address = address.TrimEnd(new char[] { ',', ' ' }); address = address.TrimStart(new char[] { ',', ' ' }); while (address.Contains(" ")) { address = address.Replace(" ", " "); } if (address.Length > 50) address = address.Substring(0, 50); return address; } |
Благодаря этой функции стало возможно передавать больше 10 адресов сразу.
Конечно некоторые адреса приходится подкорректировать, но в итоге получается проложенный маршрут, внутри которого можно менять последовательность точек прохождения (достаточно просто перетаскивать буквенный маркер вверх или вниз и маршрут перестраивается).
Вот такой вот получился инструмент.