Перейти к содержимому
обсудить проект
UMIT

мобильное приложение для маркетплейса запчастей спецтехники

cоздание списков с избранными товарами и заявками оформление заказов на товары со склада и предложений с оплатой автоматическое управление остатками на складе

сайт проекта →
мобильное приложение для маркетплейса запчастей спецтехники
технологии

design flutter python

отрасль

e-com

услуги

design, mobile, frontend, backend

Вводные данные

Клиент

ООО «Сервис» — компания, специализирующаяся на продаже легковых автомобилей и коммерческого транспорта малой грузоподъёмности. В дополнение к основному ассортименту компания также занимается торговлей автозапчастями и комплектующими — как оригинальными, так и аналогами от проверенных поставщиков. Ассортимент включает:

  • новые легковые автомобили различных марок;
  • малотоннажные грузовые автомобили для бизнеса;
  • запасные части и расходные материалы: тормозные системы, фильтры, шины, аккумуляторы, детали подвески и др.

Проблема

До нашего привлечения проект находился в начальной стадии MVP с участием нескольких сторонних специалистов, что не позволило довести его до полноценного релиза. Компания искала команду, которая сможет:

Экран приложения, 1
  • полноценно погрузиться в проект на ежедневной основе;
  • взять на себя как разработку, так и техническое проектирование;
  • предложить грамотные аналитические и архитектурные решения;
  • обеспечить стабильную коммуникацию и предсказуемый прогресс.

Клиент ожидал от новой команды не только продолжения работы, но и структурирования проекта, закрытия технических пробелов, появившихся из-за несогласованной работы разных специалистов.

Задача

Создание мобильного приложения — маркетплейса автозапчастей и техники — с учётом:

  • сложной бизнес-логики;
  • масштабируемой архитектуры;
  • кросс-ролевого взаимодействия (один аккаунт = несколько ролей и профилей).
  • наработок предыдущей команды

Также стояла задача настройки среды разработки, оптимизации производительности и качества кода.

Экран приложения, 2

О проекте

Проект представляет собой мобильное приложение-маркетплейс для торговли автомобилями, автозапчастями и комплектующими. Платформа объединяет покупателей и продавцов, обеспечивая полный цикл операций: от размещения товаров и заявок до оформления заказов, оплаты и отслеживания доставки.

Приложение адаптировано под разные роли пользователей: один аккаунт может включать как профиль покупателя, так и профиль продавца, с возможностью быстрого переключения между ними. Реализованы ключевые разделы для управления товарами, заявками, заказами, корзиной, уведомлениями, чатами и профилем пользователя.

Выбор стека разработки

Выбор стека разработки был частично предопределён ранее — часть архитектурных решений и технологий уже была заложена предыдущими командами.

Мы продолжили использовать эти инструменты, предварительно проведя технический аудит и оптимизацию кодовой базы, а также адаптировав и оптимизировав их под актуальные задачи проекта.

Процесс работы

1.Проектирование

Экран приложения, 3

В работе над проектом с нашей стороны участвовала команда из шести человек: два разработчика на Flutter, два backend-разработчика, менеджер проекта и тестировщик. Работа над проектом началась с технического аудита и анализа текущего состояния: команда провела ревизию кода, API и требований, чтобы определить слабые места и риски.

Далее была выстроена новая архитектурная структура, сформированы стандарты разработки и организовано разделение задач между разработчиками.

2.Разработка

Работа над проектом была разделена на четыре этапа:

  • Разработка функционала по разделами “Склад” и “Заявки”
  • Реализация разделов “Заказы” и “Корзина”
  • Интеграция со службами доставки для отслеживания статусов доставки в транспортных компаниях и интеграция с платежными системами для проведения платежных операций
  • Реализация разделов “Профиль”, “Уведомления”, “Чаты” и “Обучение”

В первую очередь команда занялась доработкой уже существующего решения, а также реализовала недостающий функционал. Параллельно велась разработка backend-части: было спроектировано и реализовано API, работа с товарами, заказами и ролями.

Раздел «Заявки» является одним из центральных в бизнес-логике приложения — как для продавцов, так и для покупателей. В этом разделе отображаются все входящие для продавца и исходящие для покупателя запросы на приобретение товаров, а также взаимодействие между сторонами сделки.

Экран приложения, 4
  • Листинг заявок для покупателя и продавца: покупатель видит свои отправленные запросы, а продавец поступившие заявки от всех покупателей. Для продавцов реализованы фильтрация, поиск и сортировка для быстрого ориентирования в большом объёме данных.
  • Детальная карточка заявки с информацией о товаре и сторонах сделки с возможностью для продавца добавить заявку в избранное и для покупателя просмотреть все доступные предложения по его заявке.
  • Действия по роли пользователя: покупатель может создавать, копировать, отправлять заявки в архив или размещать их под заказ; продавец просматривать листинг, создавать предложения и добавлять заявки в избранное.
  • Интерфейс под каждую роль: покупатели и продавцы видят разные кнопки, статусы и сценарии, что упрощает работу и снижает ошибки.
  • Организация заявок: покупатели создают папки для удобного управления своими запросами, а продавцы сохраняют подборки по заявкам для фильтрации по заданным параметрам и получения уведомлений о новых релевантных запросах.

Раздел «Склад» позволяет продавцам управлять собственными товарами, добавлять новые позиции, редактировать характеристики и отслеживать наличие. Это один из ключевых модулей маркетплейса, тесно связанный
с функциональностью заявок и заказов.

  • Листинг товаров для покупателя и продавца: покупатель видит доступный каталог, продавец собственный ассортимент.
  • Детальная карточка товара с описанием, характеристиками и фото; покупатель может сразу добавить товар в корзину.
  • Добавление новых позиций на склад и редактирование уже созданных карточек для продавца — обновление цен, фото, описаний, остатков.
  • Массовые действия с товарами для продавца: выделение нескольких или всех позиций и выполнение сразу нескольких операций. Для активных товаров — перемещение в архив или в папку; для архивных — возврат в актуальное или удаление.
  • Фильтрация, сортировка и поиск по складу для всех ролей — быстрый доступ к нужным товарам даже при большом объёме данных.
  • Автоматическое уменьшение доступного количества товара на складе у продавца после оформления заказа на определённое количество данного товара.
  • Организация каталога: продавцы могут создавать папки для группировки ассортимента, а покупатели подборки товаров под свои интересы.

Раздел «Заказы» обеспечивает полный цикл обработки покупок, начиная от момента оформления заказа до его получения.

  • Просмотр заказов: пользователи видят все активные и завершённые заказы, что позволяет отслеживать историю покупок и статусы текущих заказов.
  • Детальная карточка заказа: содержит информацию о товарах, покупателе/продавце и текущем статусе, что облегчает контроль и обработку каждого заказа.
  • Подтверждение получения товара: при самовывозе покупатель и продавец фиксируют факт передачи, обеспечивая прозрачность и точность расчётов.
  • Изменение статусов: статусы обновляются автоматически (для доставки) или вручную (для самовывоза), что обеспечивает актуальную информацию для всех участников.
  • Добавление накладных: продавцы должны прикреплять сканы ТТН для контроля отправлений и подтверждения отправки.
  • Способы доставки: «Самовывоз» и «Доставка до ПВЗ» с отображением актуального состояния заказа и возможностью выбора удобного варианта получения.
  • Отмена заказов: заказы могут быть отменены вручную пользователями или автоматически системой при несоблюдении сроков оплаты, отправки или получения, что поддерживает актуальность данных и снижает нагрузку на участников.
  • Сложная бизнес-логика формирования заказов из корзины, с учётом группировки по продавцам;
  • Привязка заказов к конкретному аккаунту и роли — доступ и действия строго разграничены;
  • Синхронизация с разделами «Заявки» и «Склад»: зарезервированные товары помечались, а при подтверждении — списывались с остатка;
  • Система уведомлений по изменениям статуса заказа;
  • Статусная система с возможностью трекать каждый этап — от оформления до завершения.

Корзина и оформление заказа

Экран приложения, 5

Раздел «Корзина» реализован как инструмент для покупателей, позволяющий собрать интересующие позиции от разных продавцов перед оформлением заказа. В корзину можно добавлять товары продавцов
со склада и предложения продавцов по заявкам.

  • Добавление товаров и предложений: покупатели могут добавлять товары со склада и предложения по заявкам для оформления заказа.
  • Изменение и отмена заказа: покупатель может корректировать количество товаров или полностью удалять позиции из корзины до оформления заказа.
  • Проверка доступности: система автоматически проверяет наличие товаров у продавцов, предотвращая оформление недоступных позиций.
  • Оформление заказа: покупатель может оформить заказ на все позиции из корзины, система автоматически подставляет данные профиля, позволяет выбрать способ доставки («Самовывоз» или «Доставка до ПВЗ») и обеспечивает контроль остатков товаров.
  • Сохранение корзины между сессиями: корзина сохраняется при выходе из приложения или переключении аккаунтов и ролей, что обеспечивает непрерывность работы.
  • Корзина синхронизировалась с backend и локальным хранилищем;
  • Реализована логика восстановления корзины после выхода или переключения аккаунта;
  • Применялось кэширование и оптимизация перерисовок при изменении состояния.

Интеграция с транспортными компаниями

Для автоматизации логистики и повышения удобства пользователей была реализована интеграция с транспортными компаниями. Это позволяет отслеживать заказы на всех этапах доставки прямо внутри платформы
— без необходимости переходить на сторонние сайты перевозчиков.

  • Продавец указывает транспортную компанию и трек-номер при оформлении отправки;
  • В карточке заказа отображаются сведения о перевозчике и текущий статус доставки;
  • Покупатель получает актуальную информацию о перемещении заказа в режиме реального времени;
  • Поддержка уведомлений об изменении статуса доставки;
  • Информация обновляется автоматически через API транспортной компании.
  • Интеграция реализована через REST API ведущих транспортных компаний;
  • Система периодически запрашивает обновления по активным трек-номерам;
  • Реализована проверка и обработка ошибок в случае недоступности API;
  • Возможность масштабирования под новых перевозчиков без изменения бизнес-логики.

Интеграция с платежными сервисом

Экран приложения, 6
  • Проверка валидности реквизитов продавца (ИНН, КПП, БИК и т.д.) при регистрации, чтобы избежать проблем с выплатами;
  • Автоматическое создание бенефициаров на стороне банка для каждого продавца;
  • Обработка возвратов, отмен и частичных выкупов с соблюдением требований банка;
  • Интеграция через API с обязательной криптографической подписью (RSA);
  • Прозрачный процесс для пользователя: все средства доставляются только после успешной проверки и идентификации.
  • Подключение эквайринга через API Точка Банка с поддержкой агрегированных платежей;
  • Учет возвратов: при частичном или полном возврате суммы корректировались данные внутреннего баланса продавца;
  • Защита от повторной обработки: система исключала дублирование поступлений при повторной отправке данных со стороны банка;
  • Автоматическая сверка платежей с заказами на стороне платформы;
  • Реализация сценариев на случай ошибок при проведении платежей или отмен.

Раздел «Профиль» — это центральная точка управления учётной записью пользователя, включающая доступ к данным аккаунта, балансу, документам, обучающим материалам и службе поддержки. Он адаптирован под разные сценарии использования и различается в зависимости от текущей роли (продавец / покупатель) у выбранного аккаунта.

  • Раздел “Информация”: просмотр и редактирование данных аккаунта: название организации, ИНН, платежные и контактные данные, и т. д.;
  • Раздел “Техника”: управление карточками техники пользователя, создание новых карточек, редактирование и удаление существующих;
  • Раздел “Мой рейтинг”: отображение текущего рейтинга пользователя на основе отзывов других пользователей, просмотр всех отзывов;
  • Раздел "Баланс": отображение текущих средств, истории операций и возможность вывода средств;
  • Раздел "Техническая поддержка": создание заявки для обращения в техподдержку;
  • Раздел “Партнерская программа”: отображение персонального промокода по реферальной программе, просмотр списка существующих рефералов пользователя;
  • Раздел “Инструкция/обучение: доступ к обучающим материалам и документации;
  • Раздел “Документы”: доступ ко всем юридическим материалам, связанным с использованием платформы.
  • Персонализированный интерфейс: в зависимости от выбранного типа аккаунта в профиле отображаются только релевантные поля;
  • Разная логика оформления и оплаты заказов: для юрлиц предусмотрены безналичные расчёты и выставление счетов, для физлиц только онлайн-оплата;
  • Разграничение механизмов вывода средств: юридическим лицам средства выводятся на расчётный счёт, физическим лицам на карту;
  • Каждый пользователь получает уникальный реферальный промокод, который можно передать другим людям.
  • Новый пользователь указывает промокод при регистрации. Это закрепляет его как реферала за пригласившим.
  • После того как реферал оформляет свой первый заказ, пригласившему пользователю начисляется 1% от суммы заказа на внутренний баланс.
  • Все данные и действия в профиле были строго привязаны к текущему активному аккаунту и роли — это исключало возможность случайного вмешательства между контекстами;
  • Были реализованы проверки прав доступа к определённым разделам в зависимости от роли.

Роли продавца и покупателя

  • Управлению текущим активным профилем: четкое определение и поддержка данных для выбранной в данный момент комбинации «аккаунт-роль».
  • Хранению и изоляции данных: надёжный механизм для сохранения, загрузки и очистки данных при переключении между аккаунтами и ролями, чтобы информация одного профиля не смешивалась с другим.
  • Синхронизации состояния между сессиями: обеспечение согласованности данных о выбранном аккаунте и роли между:
  • Адаптации интерфейса и функционала: мгновенное отображение соответствующего интерфейса, контента и доступных функций в зависимости от currently active (текущей активной) роли (покупатель или продавец).
  • Чётко разделить логику отображения и поведения интерфейса в зависимости от роли;
  • Избежать повторной авторизации при переключении аккаунтов и ролей;
  • Гибко управлять состоянием приложения и кэшированием данных;
  • Синхронизировать контекст между несколькими вкладками или устройствами.
  • На стороне мобильного приложения логика работы с ролями была реализована с учётом BLoC-архитектуры: переключение между аккаунтами инициировало соответствующие события и пересоздавало нужные состояния.
  • Для корректной работы реализовано жёсткое разделение данных по ролям и аккаунтам — это исключает отображение некорректной информации и защищает от конфликтов при одновременной работе с несколькими вкладками или устройствами.
  • Все действия пользователя (например, добавление в корзину, отправка заявки, открытие чата) выполнялись в контексте активного аккаунта и роли — при переключении контекста происходит полная перегрузка связанных данных и интерфейсных компонентов.

Раздел «Уведомления» был разработан для оперативного информирования пользователей о событиях, связанных с их аккаунтами, заказами, товарами, заявками и чатом. Уведомления позволяют пользователям не пропускать важные изменения и быстрее реагировать на действия контрагентов.

Экран приложения, 7
  • Отображение уведомлений по ключевым событиям: новые заявки, отклики на заявки, обновления заказов, новые сообщения в чатах, изменения по товарам и тд.;
  • Разные типы уведомлений в зависимости от роли пользователя (покупатель / продавец);
  • Визуальный индикатор новых уведомлений;
  • Отображение списка уведомлений по каждой роли для одного аккаунта;
  • Поддержка push-уведомлений через Firebase Messaging.
  • Уведомления приходили в реальном времени — через WebSocket-соединение;
  • Сообщения автоматически группируются по типу событий и отображаются в зависимости от активного профиля и роли;
  • Реализована логика "прочитано / непрочитано" и очистки уведомлений.

Раздел «Чаты» обеспечивает коммуникацию между покупателями
и продавцами напрямую внутри платформы, что позволяет упростить согласование условий, задать уточняющие вопросы по заявкам или заказам
и ускорить процесс принятия решений.

  • Чаты по каждой заявке, товару или заказу (привязка к конкретной сущности);
  • Отображение истории переписки, в том числе по завершённым сделкам;
  • Система уведомлений о новых сообщениях;
  • Возможность быстрого перехода из карточки заявки/заказа в соответствующий чат.
  • Реализация через WebSocket для обновления сообщений в реальном времени;
  • Чаты интегрированы в общую систему аккаунтов и ролей — при переключении контекста загружаются соответствующие переписки;
  • при разработке пришлось учитывать сложность идентификации участников: сообщения формируются с учётом активного аккаунта и его роли (продавец или покупатель);
  • Реализация защиты от повторной отправки сообщений и обработки ошибок соединения.

Возникшие трудности

  • Отсутствие документации
  • Разрозненная кодовая база
  • Сильная связанность компонентов
  • Частые изменения бизнес-требований
  • Неудобный и несогласованный API
  • Неясность в логике аккаунтов и ролей
Экран приложения, 8

Отсутствие документации. И по frontend-, и по backend-части не было технических описаний, что усложняло вхождение в проект и замедляло работу на старте.

Разрозненная кодовая база. Код от предыдущих исполнителей был фрагментирован, плохо структурирован и содержал устаревшие решения. Потребовались масштабный рефакторинг и единый подход к архитектуре.

Сильная связанность компонентов. Из-за отсутствия модульности изменения в одном участке приложения затрагивали множество других, снижая надёжность и усложняя масштабирование.

Частые изменения бизнес-требований. Требования уточнялись или менялись уже после реализации без должной фиксации, что приводило к переработкам и осложняло планирование.

Неудобный и несогласованный API. Интерфейсы содержали дублирующиеся или конфликтующие эндпоинты, непоследовательную логику и не отражали реальную бизнес-модель.

Неясность в логике аккаунтов и ролей. Бизнес-логика ролей пользователей и их связей с профилями не была определена на старте и прояснялась по ходу реализации.

Результаты

Мобильное приложение было доведено до полнофункционального состояния, включая переработку пользовательского интерфейса, стабильную работу с данными, а также надёжную backend-инфраструктуру. Приложение было выпущено в продакшн, и им уже начали пользоваться реальные пользователи:

  • за первые недели зарегистрировалось около 50 пользователей, из них до 30 аккаунтов продавцов;
  • размещено более 20000 товарных позиций и создано 70 заявок на покупку.