Этот материал посвящен сервису Xalq Nazorati (Народный Контроль) — с ним люди могут пожаловаться на нерабочий лифт, яму на дороге, сломанный светофор или стертую дорожную разметку. В статье расскажем, с чего мы начинали проект, какие ошибки допускали, как их исправляли и где в итоге оказались.
Резюме
Сегодня в сервис Народный Контроль уже поступило более 28 тыс. обращений от горожан — чаще всего люди жалуются на проблемы на дорогах, ЖКХ и экологические проблемы.
88% всех обращений были в итоге решены.
Чтобы контролировать работу сервиса и обеспечить реальное решение проблем, мы разработали рейтинг районов города, тем самым мотивируя чиновников не отмахиваться от проблем.
Чтобы лучше обозначать раскрытие темы, используем индикатор из хорошо знакомой многим игры. Так интереснее.
Итак, начнём:
Задача
Начнём с определения требований — что должен был делать сервис, зачем он нужен? Ведь и так много разных порталов для подачи заявлений и жалоб на работу госорганов. Посмотрев все, мы поняли, что при всех прочих равных у таких сервисов есть три больших минуса.
Первое — госорган должен обязательно ответить письмом (бумажкой) так как все заявки были приравнены к закону о подаче обращений (там 15-30 дней, официальное письмо и всё такое), что значительно тормозит процесс ответа, даже если он есть вот тут, под рукой. Меня как гражданина это никак не успокаивает.
Второе — на той стороне экрана (мир исполнителей данных заявок) ничего для удобства исполнителей не сделано. Они просто получают письмо, распечатывают его и несутся исполнять но бюрократическая машина превращает это в бег с препятствиями. Так как созданная система не подразумевает только получение по электрической электронной почте и отправку по ней же. Причём отсканированным письмом за подписью руководителя.
Конечно, у этого процесса есть свои цели, в основном сделать ответ официально оформленным и возложить ответственность на руководителя. Поэтому, даже если у исполнителя ответ готов за 3 дня или за 7, в любом случае процесс его оформления занимает пару дней, а иногда и больше.
А еще, пока ответ исполнителя дойдет до гражданина по почте, пройдет еще несколько дней.
Также важно учитывать что бумажные письма доставляются исполнителям через канцелярию — а это люди, а не автоматизированная система. Поэтому обычно письмо проходит 3-4 руки перед доставкой непосредственно самому исполнителю — а это лишнее время.
Третье — это отсутствие человека, который должен контролировать качество работы исполнителей: они правда пытаются решить проблему или стараются просто избавиться от назойливой жалобы?
Итак основная задача была задана: сделать удобный сервис по подаче и получению ответа и общению между исполнителями и заявителями. Удобный сервис для обеих “сторон экрана”. Скажем так, сократить расстояние между участниками процесса.
Архитектура сервиса
Архитектура сервиса — удобное понятие, которым многие пользуются по-своему и не всегда правильно. Никто из нас не заканчивал «сервисо-архитектурный университет» и не обладает знаниями глубинного познания чудотворной архитектуры, которая позволит тебе и твоему сервису работать как швейцарский нож швейцарские часы. Но чтобы такие часы создать, мы должны были выстроить логику сервиса как в CRM (customer relationship management), поскольку нам нужна была система, которая может одновременно обслуживать большое количество клиентов, при этом не ломаясь и выдавая своевременный фидбек всем участникам.
Также нам было важно, чтобы в системе была возможность обсуждения проблемы не просто двумя сторонами, но и тремя или даже четырьмя: например, в чате одновременно могут общаться горожанин, представитель районного хокимията, представитель Тошиссиккувват (отвечает за горячую воду и отопление в городе) и, скажем, ГУЖКО (координирующий орган по вопросам ЖКХ).
В качестве БД мы выбрали Postgresql, потому что это проверенное временем, надежное, масштабируемое решение, а также оно интегрируется с Django сразу из коробки. Типом нашего хранилища выступил PostgreSQL - преимущественно реляционная СУБД, так что и модель данных, соответственно, реляционная. У нас все сущности предметной области довольно четко структурированы и прописаны, так что не было необходимости заводить какие-то иные по типу хранилища данных. Ну мы еще использовали redis как буфер для некритичных временных данных и для всякого кеширования.
На бэке у нас — python, django, а на фронте у части пользователей Vue JS, а у другой — никакого фреймворка, потому что изначально проект планировался как одна форма отправки обращений, а когда он начал расширяться, уже было поздно и накладно что-либо коренным образом менять. Кстати, скоро мы как раз планируем переписать эту часть проекта на реакте, чтобы структурировать фронт и отделить логику сервиса от логики представления.
Идентификацию через государственный центр персонализации мы сделали обязательной. Потому что, мы понимали, что если сделать возможность отправки заявок анонимно, то продуктивной работы бы не было. Элементарно, мы не смогли бы отфильтровать действительный заявки от заявок-хулиганства. При чем, даже учитывая регистрацию по паспортным данным, в начале старта сервиса, были заявки, сделанные ради забавы, некоторыми пользователями.
При этом, вся система авторизации и идентификации работает по защищенному шлюзу — как своеобразный G2G VPN.
Далее свое место занимает система распределения заявок по темам — она важна, чтобы мы не теряли «хвосты» заявок, понимали, к какой проблеме какая заявка относится и к кому ее нужно направить для решения.
Благодаря тщательной работе по анализу и каталогизированию гос.струкур, у нас есть таблицы соответствия категорий проблем, организаций, направлений, исполнителей. Имея четкую структуру того, кто за что отвечает и кто кому подчиняется, сделать все это просто: при отправке заявки смотрим, к какой категории относится заявка, затем берем соответствующего исполнителя и назначаем его на решение данной заявки. Это исполнитель первого уровня. Чаще всего на каждую заявку есть один такой исполнитель — в начале мы пытались назначать несколько исполнителей, но оказалось, что они перекладывают друг на друга ответственность и эффективность работы падает.
А чтобы с поступающими заявками было проще работать, мы нанесли их на географическую плоскость — карту города. Для этого применяли методы геокодирования и связывали заявки с конкретными точками на карте Ташкента.
Современные сервисы без мобильного приложения — дичь. Поэтому мы сделали наше приложение для двух платформ: Android и iOS. Основным языком программирования для мобилки мы взяли язык Dart и его фреймворк Flutter. Выбор этой технологии основывался на том, что в краткий срок мы могли получить аппку для двух платформ сразу. Мы не планировали много анимаций, поэтому даже версия Flutter-a 2021 года полностью удовлетворяла нашим требованиям.
Мобильное приложение напрямую связывается с Сервером и выводит все данные в реальном времени. Связь с беком производится с помощью протокола http1.0 и клиент-серверным интерфейсом RestAPI. В самом приложении использовано архитектура BLoC, которая широко используется в фреймворке Flutter.
Почему Flutter?
Тесты для Android
Ещё есть:
Система автоматической привязки исполнителя
Чат
Рейтинг
Система оповещения жителей об авариях
Обо всем этом подробнее расскажу ниже.
Размыть границы
Для упрощения и ускорения решений жалоб горожан мы разработали систему автоматической привязки исполнителя к заявке — сервис, принимая жалобы от горожан автоматически считывает тему обращения и направляет его к нужной службе. Например, жалоба о нерабочем светофоре идет напрямую в ЦОДД, а заявка о сломанном лифте — в ЖКХ.
В целом исполнитель назначается по следующим критериям:
организация исполнителя совпадает с организацией, ответственной за категорию заявки;
район, к которому принадлежит исполнитель, совпадает с районом подачи заявки;
направление деятельности исполнителя совпадает с обозначенным направлением категории заявки.
Когда заявитель и исполнитель нашли друг-друга, задача сервиса — поддерживать их диалог, пока проблема не будет решена. Эту задачу закрывает чат.
В чат имеют доступ и модераторы сервиса, они следят за тем, чтобы исполнители не уклонялись от работы, а заявители выдвигали адекватные требования. У каждого модератора есть свой набор инструментов и удобный личный кабинет.
Такие же личные кабинеты есть и для высшего руководства города — там можно посмотреть статистику по районам, количество жалоб, проблемные участки и направления города. Это все нужно, чтобы чиновники могли вовремя отреагировать на системную проблему и начать ее решать.
А публичным маркером работы чиновников служит наш рейтинг районов, о котором мы упоминали в начале материала.
Еще одна удобная функция нашего сервиса — система оповещения жителей об авариях. Например, если горожанин зарегистрирован в нашем сервисе, он сможет заранее узнать о том, что завтра у него отключат горячую воду, или что где-то случилась авария, и ему придется несколько дней прожить без газа.
Типы пользователей
Она довольно сложная, ведь в процессе обработки заявки участвует сразу 5 типов пользователей:
И все эти пользователи работают не только вертикально, но и горизонтально — например, модераторы могут вмешиваться в процесс буквально на любой стадии.
Когда мы шли к этой логике, где у всех есть свой личный кабинет и возможность так или иначе влиять на процесс, мы проводили серию встреч и интервью со всеми государственными службами, чтобы понять, что им было бы важно получить в таком сервисе, а что наоборот — только бы помешало.
Мы поняли, что большинству организаций комфортно в текущей системе ролевых моделей, в которой есть ощутимый минус в виде сотрудников промежуточных звеньев, которые не создают никакой ценности при работе с заявками, а в большинстве своем выполняют функцию маршрутизации, которую мы можем автоматизировать. Поэтому мы их исключили из цепочки Исполнителей и сфокусировались на том, что Заявка должна попадать тем лицам, кто непосредственно близок к тем, кто работает с решением заявок.
Разработка сервиса
По-началу, разработка сервиса вызывала лишь раздражение — никому не нужен еще один сайт, куда нужно вписывать отчеты. В идеале исполнителям нужна была удобная платформа, как мессенджер, чтобы без лишней волокиты делать свою работу.
Чтобы дать им инструмент мечты мы создавали мокапы и строили User Story.
В итоге, мы переделали почти все, что было сделано на начальной стадии, ведь то, что нам казалось очень удобным и правильным, в реальном мире работало криво и неэффективно — заявки не решались и никто не знал за что отвечает.
Запуск
При запуске мы столкнулись с несколькими проблемами, как организационного, так и технического характера:
С момента обучения Исполнителей, до момента релиза прошло около 2х месяцев. В течение которого в некоторых организациях произошли кадровые перемены, а поскольку в г.Ташкент отсутствует единая платформа где бы велся учет персонала, то на этапе старта оказалось, что Исполнител есть, но за заявками никто не следил и они шли в никуда.
После запуска сервиса, в течение 3-4х дней начались проблемы у министерской защищенной сети МСПД, через которую мы обращались к бэку ГЦП (Государственного Центра Персонализации) и в результате пользователи не могли пройти регистрацию, что вызвало обоснованный шквал негодования и наш саппорт даже после восстановления работоспособности сервиса, разгребал тикеты в телеграм-боте.
Работа над ошибками и система оповещения
После запуска мы провели работу над ошибками.
Изначально регистрация проходила через номер мобильного телефона, а также через серию паспорта и ПИНФЛ (он не меняется, даже если человек поменяет паспорт).
Для облегчения сбора данных, мы сделали для Флаттера сканер паспорта, но не на всех устройствах он работал хорошо, особенно на дешевых смартфонах с плохой камерой
Жители начали жаловаться в наш телеграм-бот о том, что сканирование проходит тяжело и не всегда работает правильно, поэтому, мы изменили набор паспортных данных на серию паспорта и дату рождения.
Наблюдение
Вся история о “выполнении и наказании” конечно не может существовать без контроля и статистики. Для управления всем этим делом мы решили создать кабинет наблюдателя. Почему именно наблюдателя? Так как этот инструмент для руководителя, напрямую из системы он не должен влиять на результат. Тут можно увидеть всё. Заявки и их содержимое, сортировать его по всем признакам, посмотреть на рейтинги.
Тут же можно раскрыть заявки и посмотреть на их содержимое и на переписку во внутреннем мессенджере. Но в данном инструменте не предусмотрена связь с исполнителем или заявителем в любом виде. Это инструмент верхнеуровневого управления, чтобы быть в курсе всего и если нужно изучить всё до деталей.
Ну и конечно для удобного визуального контроля был сделан дэшборд для которого была использована платформа Visiology. Весь процесс постройки дэшборда был проделан в ней и с помощью iframe интегрирован в кабинет наблюдателя.
Сводные данные портала «Халк Назорати» зафиксированы в дэшборде, с целью получения актуальной информации жизни города. Данные хранятся в более чем семидесяти таблицах, которые посредством присоединения друг к другу образуют единую большую таблицу. Что из себя представляют эти данные: Количество заявок, поступающие в портал, после распределяются по исполнителям в каждом районе по всему городу. Заявка на момент поступления имеет статус «На рассмотрении», после получения исполнителями, она меняет статус на «Рассмотрено» и отправляется обратно к заявителю. В зависимости от того, какой ответ даст заявитель «Подтвердить решение» либо «Не согласен с решением», она может получать статусы «Закрыто» или «На рассмотрении» соответственно. Также, заявитель может закрыть заявку до рассмотрения исполнителем, тем самым поменяв её статус на «Неактуально». За правильностью распределения и исполнения заявок следят модераторы портала «Халк Назорати». В свою очередь, модераторы имеют возможность закрыть заявку принудительно, если она не подходит под условия, поменяв её статус на «Закрыто модератором».
Заявки подразделяются на Темы, категории и подкатегории, процент которых показан на дэшборде. Отсюда мы можем заметить, что самой актуальной темой за всё время существования портала является «Моя дорога». В данную тему входят категории, которые позволяют заявителям отправить заявку по дорогам, если на них есть ямы и ухабы.
Распределяя заявки по районам, можно судить о том, какой из районов является самым активным по подаче заявок. Отметим Юнусабадский и Мирзо-Улугбекский районы, число поданных заявок которых составляет 3000.
Также в дэшборде представлена динамика зарегистрированных новых пользователей в разрезе по дням, а также их возрастной диапазон. Отметим, что основная аудитория это люди в возрасте с 25-44 лет.
О том как мы начинали работать c BI платформой Visiology я писал в ранних статьях.
https://habr.com/ru/company/visiology/blog/662019/
https://habr.com/ru/company/visiology/blog/667450/
Что еще мы планируем сделать…
Разного рода фидбэки и общение с диспетчерской службы породило идею создания системы оповещения при отключении “жизненно” важных коммунальных услуг. Проблема была в том, что при отключении электричества, газа или воды люди тут же начинают беспокоится и звонить во все возможные службы с одним и тем же вопросом, почему отключили и когда включат. Конечно есть стандартные отключения при неоплате про них люди и сами знают, а вот при авариях или плановых работах нет. Мы решили сделать систему оповещения о таких случаях. Мол выключился свет, тут зарегистрированным пользователям будет приходить пуш-уведомление, что по их адресу было отключено электричество в связи с аварией на станции или плановыми работами и включится в такое то время. В идеале это должно сократить звонки диспетчерам и дать понять, что ситуация под контролем и оповестить о примерном или точном времени подключения услуги.
Мы планируем начать с электричества, обычно с ним бывает больше всего проблем.
А вообще, у нас много идей того какие новые фичи добавить в продукт, но не хотим спойлерить, чтобы не портить сюрприз жителям.
А с читателями Хабра, о новых фичах расскажем после релиза.
Комментарии (6)
ShPioN
28.11.2022 11:55+4пробовал пользоваться данной платформой, к сожалению всё стопорится на исполнителях, загружают фотки под особым ракурсом или с временным решением и закрывают заявку, несмотря на возражения что по факту всё как было, так и осталось. к примеру если кто-то перекрывает доорогу конусами (самовольно), исполнитель приходит, убирает конусы в сторону, фоткает и закрывает заявку. по факту конусы возвращаются обратно.
brucewayneorjustahror Автор
28.11.2022 12:03+1Исполнители это генератор решений как я и описал. Везде они разные. Кто буквально исполняет как вы написали убирает конус фоткает и покеда. Кто то пытается решить системно проблему. Но тут такое дело, эти конусы ставит не правительство или не город не те кто подчиняются городу, видимо это такой же гражданин как мы с вами, ему выгодно ставить вот он и ставит. Это был бы печальный конец истории НО в платформе есть другой механизм. Геоаналитика, если модераторы замечают системность такой проблемы (например эти перегородки ставят повсеместно все и люди которым это не нравится начинают жаловаться массово) то это сложность другого уровня и должны быть решена системно, скажем законом или подзаконным актом, такие случаи есть, это долгая история но решаемая. Таких людей которые ставят самовольно перегородки нужно по букве закона вести иначе они так и будут ставить их.
Вы продолжайте так же для нас это важно!
inferrna
28.11.2022 12:07+2Это уже не проблема приложения и должно исправляться не инженерией, а политикой (то бишь стучанием по головам чиновникам, пытаясь избежать коего они и заказали это приложение).
Можно ввести регламент, по которому статус заявки на "Исполнена" меняет не сам исполнитель, а заявитель, либо его доверенные лица ("френды" в приложении). Если заявитель забросил свою заявку и не реагирует сутки-двое, можно считать заявку исполненной, а его забанить на пару недель за раздолбайство. Но всё это тоже, своего рода, политика, не уверен, могут ли разработчики самостоятельно внести такие изменения.brucewayneorjustahror Автор
28.11.2022 12:34+1Всё что вы описали уже сделано инженерией в приложении. Закрыть заявку может только заявитель или модератор (в случае, если заявитель сделал так как вы описали или чего хуже). Конечно легко сказать , что всё должно идти сверху "политикой". По сути политика определяет правила и она разрешает делать такие вещи. Но порой, что бы кто то увидел ,что так можно нужно просто сделать и понаблюдать как приживётся. Были ли те кто был против таких кнопочек - конечно были (и сейчас есть и будут ещё долго), но мы смогли отстоять своё мнение.
ADSoft
Это был заказ самого города? типа вот мы хотим то и сё? Или же полностью Ваша идея - "а давайте мы вам сделаем, вот столько стоить будет" ? Так как показывает практика, сложности в основном не технические идут - а организационные.
brucewayneorjustahror Автор
Это скорее заказ Президента (правительства) т.к. это Постановлении президента было (в нём обычно участвуют много людей, скажем так идея коллективного разума), а мы как город (наше подразделение является часть города ИТ частью) его исполнили. Но мы как профессиональная команда не хотели создавать очередной портал для портала или создать сайт , чтобы бумажку закрыть. Хотелось полноценный продукт создать.
В основном организационные вы правы. Так и было. Но уникальность в том, что мы не только горожанам хотели жизнь улучшить так все хотят. Хотелось и исполнителям помочь избавится от бюрократии.