Привет, Хабр! Меня зовут Грищенков Евгений, я системный аналитик Fix Price. В этой статье расскажу о собственном приложении FixMark. Отгрузка в коробках уменьшает затраты на транспортную и складскую логистику. Для маркировки коробок используются общепринятые SSCC-коды (сокращение от Serial Shipping Container Code), которые облегчают отслеживание грузов и помогают автоматизировать логистические операции, позволяя идентифицировать грузы на всех этапах транспортировки. Фактически один SSCC-код агрегирует данные о штрих-кодах всех товаров внутри коробки, позволяя проводить операции со всем содержимым через одно сканирование.

Тем не менее комплектация товаров в коробки занимает довольно продолжительное время. Поэтому для облегчения этого процесса мы решили подобрать подходящее ПО, однако ни один из продуктов на рынке нас по разным причинам не устроил, так что было принято решение разработать собственное ПО. Так и появился FixMark — мобильное приложение для терминалов. Это приложение позволило нам сократить общий цикл поставки в несколько раз и значительно уменьшить количество ошибок в отгрузках.

FixMark — мультиязычное приложение, интерфейс переведён также на английский и китайский языки, что удобно для наших поставщиков за рубежом. На данный момент вышла уже вторая версия приложения: FixMark 2.0. К таким функциям первой версии, как агрегация, разагрегация коробов, проверка статуса и содержимого коробов, а также отгрузка, добавились:

  • возможность введения даты производства товара для поставщика;

  • дополнительная информация для поставщиков с целью повышения удобства агрегации и дезагрегации;

  • возможность сканирования штрих-кодов товаров для удобства определения статуса и местонахождения товаров (в каком именно коробе находятся);

  • расширенная информация при параллельном сканировании с нескольких терминалов;

  • массовое удаление любого количества коробов из отгрузки (поставки) одним свайпом;

  • пин-коды для защиты от случайных действий (например, при удалении коробов);

  • создание и редактирование документов инвентаризации с функцией параллельного сканирования;

  • проверка этикеток на их соответствие содержимому коробов с помещением ошибочно маркированных коробов в «карантин» для последующей дезагрегации;

  • различные уведомления о состоянии коробов и ряд других функций.

    Стек технологий

    Бэкенд реализован на Yii2, ориентирован на REST API, имеет модульную структуру с поддержкой версионности, использует строгую типизацию и разделение ответственности по слоям Service / Repository / Entity / DTO.

    Основной стек:

    • PHP 8.3

    • Фреймворк: Yii2

    • Сборка и зависимости: Composer

    Проект построен по принципам Layered Architecture с элементами DDD (Domain-Driven Design) и модульной структурой, адаптированной под REST API. Структура Module/V1, внутри модуля V1 размещаются собственные контроллеры, модели и сервисы.

    Слои данных и бизнес-логики:

    • Entity — сущности базы данных (Doctrine Entities).

    • Repository — реализация паттерна Repository для абстракции доступа к данным.

    • Service — сервисный слой, содержащий основную бизнес-логику.

    • Model — form-модели для валидации входных данных.

    Инфраструктура и утилиты:

    • Command — консольные команды.

    • Migration — миграции базы данных.

    • Component — кастомные компоненты Yii.

    • Exception — кастомные исключения.

    • Инструменты статического анализа: PHPStan (phpstan.neon), Psalm (psalm.xml), Rector (rector.php).

    • Инструментарий тестирования: Codeception (codeception.yml, каталог tests).

    • Линтеры: PHP-CS-Fixer, PHPLint.

    • Для логирования используется стек ELK: Elasticsearch, Logstash, Kibana.

    Как выглядит программа

    В завершение несколько скриншотов приложения.

    Так выглядит главное меню:

Инспекция, сканирование короба и марки:

А это агрегация: