Розробка мобільного додатку для управління складом (WMS)
Ми створюємо додатки, які дозволяють складським працівникам виконувати операції швидше та без помилок, використовуючи спеціалізовані термінали збору даних (ТСД). Наш досвід включає інтеграцію з SAP, 1С та іншими ERP-системами, а також реалізацію офлайн-режиму для надійної роботи в умовах нестабільної мережі. Мобільний WMS — це не просто сканування штрихкодів. Це інтерфейс між складським працівником та системою управління запасами: приймання товару, розміщення на позиції, відбір для замовлення, переміщення між зонами, інвентаризація, відвантаження. Кожна операція потребує підтвердження через сканування, а додаток працює в умовах слабкого Wi-Fi, гумових рукавичок та 10-годинних змін.
Апаратура: ТСД та мобільні комп'ютери
Споживчий смартфон на складі — тимчасове рішення. Професійні ТСД (Zebra MC9300, Honeywell CT40, Point Mobile PM90) — це IP65/IP67 захист, змінні акумулятори, вбудований лазерний сканер з дальністю 10 метрів та підтримкою всіх одномірних та двомірних кодів.
Розробка для Zebra: DataWedge налаштовується через Intent API — додаток декларує профіль у datawedge.db або програмно через broadcast. Сканування приходить як Intent з extra com.symbol.datawedge.data_string:
class WarehouseActivity : AppCompatActivity() { private val scanReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val barcode = intent.getStringExtra("com.symbol.datawedge.data_string") ?: return val source = intent.getStringExtra("com.symbol.datawedge.label_type") // EAN13, CODE128, QR_CODE viewModel.processBarcode(barcode, source) } } override fun onResume() { super.onResume() registerReceiver(scanReceiver, IntentFilter("com.symbol.datawedge.api.RESULT_ACTION")) // Вмикаємо DataWedge profile для нашого додатку sendDataWedgeIntent("com.symbol.datawedge.api.SWITCH_TO_PROFILE", "WarehousePro") } } Для Honeywell — Honeywell Scanning SDK (аналогічний Intent-механізм). Для універсальності: абстракція ScannerProvider з реалізаціями ZebraScanner, HoneywellScanner, CameraScanner. Визначаємо тип пристрою через Build.MANUFACTURER.
Завдання та черги: серверна модель
Складський працівник бачить список завдань, відсортованих за пріоритетом та маршрутом (щоб мінімізувати переміщення по складу). Завдання містить: тип операції, список товарних позицій з артикулами та кількістю, адреси комірок (стелаж-ярус-позиція).
@Entity(tableName = "tasks") data class WarehouseTask( @PrimaryKey val taskId: String, val type: TaskType, // RECEIVING, PUTAWAY, PICKING, REPLENISHMENT, INVENTORY val status: TaskStatus, // ASSIGNED, IN_PROGRESS, COMPLETED, BLOCKED val priority: Int, val assignedUserId: String, val lines: List<TaskLine>, val syncedAt: Long, ) @Entity(tableName = "task_lines") data class TaskLine( @PrimaryKey val lineId: String, val taskId: String, val sku: String, val description: String, val expectedQty: Double, val actualQty: Double?, val fromLocation: String?, val toLocation: String, val lotNumber: String?, val expiryDate: String?, ) Офлайн-режим: при втраті Wi-Fi завдання доступні з Room. Всі операції записуються локально з timestamp, синхронізуються пакетом при відновленні з'єднання. Конфлікт версій (інший користувач обробив ту саму позицію) — сервер вирішує за timestamp, додаток повідомляє про зміну.
Відбір за маршрутом (Picking)
Відбір — найкритичніша операція за часом. Сортування завдань за маршрутом обходу: алгоритм S-подібного маршруту (Serpentine) або найближчого сусіда за адресами комірок. Реалізується на бекенді, мобільний додаток отримує вже відсортований список.
Візуальний індикатор поточної комірки: виділення на схемі складу або просто великий адрес (A-12-03) на весь екран. Підтвердження через сканування адреси комірки — захист від помилок. Після сканування комірки — сканування штрихкоду товару, введення кількості (або автоматично 1, якщо одиничний відбір).
sealed class PickingStep { object ScanLocation : PickingStep() data class ScanItem(val expectedSku: String) : PickingStep() data class EnterQuantity(val sku: String, val required: Double) : PickingStep() data class Completed(val lineId: String) : PickingStep() } class PickingViewModel : ViewModel() { private val _step = MutableStateFlow<PickingStep>(PickingStep.ScanLocation) fun processBarcode(barcode: String) { when (val step = _step.value) { is PickingStep.ScanLocation -> { if (barcode == currentLine.toLocation) { _step.value = PickingStep.ScanItem(currentLine.sku) } else { _events.tryEmit(Event.WrongLocation(barcode, currentLine.toLocation)) } } is PickingStep.ScanItem -> { if (barcode == step.expectedSku || isAlias(barcode, step.expectedSku)) { _step.value = PickingStep.EnterQuantity(step.expectedSku, currentLine.expectedQty) } else { _events.tryEmit(Event.WrongItem(barcode)) } } else -> { /* обробка інших кроків */ } } } } Інтеграція з WMS/ERP
Типові інтеграції: SAP WM/EWM через RFC/BAPI або REST (SAP API Hub), 1С:УПП/ERP через HTTP-сервіс, Microsoft Dynamics 365 через Dataverse API, кастомні WMS через REST/gRPC.
Стратегія інтеграції: не смикати ERP напряму з мобільного — ставимо проміжний сервіс (middleware), який буферизує операції, обробляє помилки ERP та не роняє мобільний клієнт при 30-секундних відповідях SAP.
Як забезпечити роботу додатку без зв'язку?
Використовуємо Room для локального зберігання завдань та операцій. При втраті мережі всі дії записуються в локальну базу, а при відновленні — синхронізуються пакетно. Конфлікти вирішуються за часовими мітками. Такий підхід гарантує безперебійну роботу навіть при нестабільному Wi-Fi.
Чому обирати промисловий ТСД?
Смартфони не розраховані на пил, вологу та падіння. Промислові ТСД мають IP65/IP67, змінні акумулятори та вбудовані лазерні сканери. Це знижує час простою та кількість помилок сканування. На практиці, термін служби ТСД у 3-5 разів довший, ніж у звичайного смартфона на складі.
Що входить в роботу
- Аудит поточних складських процесів та вибір оптимального стеку.
- Розробка мобільного додатку під iOS, Android або крос-платформу.
- Налаштування DataWedge/Honeywell SDK та інтеграція з ТСД.
- Реалізація офлайн-режиму з синхронізацією.
- Інтеграція з ERP (SAP, 1С, Dynamics) через middleware.
- Тестування на складі, навчання співробітників та документація.
- Підтримка після запуску (гарантія 12 місяців).
Наші метрики
Понад 50 реалізованих проектів у сфері складської автоматизації. 5+ років експертизи в розробці мобільних WMS. Сертифіковані інженери по Zebra та SAP. Зв'яжіться з нами для розрахунку вартості вашого проекту.
| Режим роботи | Переваги | Недоліки |
|---|---|---|
| Онлайн | Актуальні дані в реальному часі, миттєва синхронізація з ERP | Залежність від стабільного з'єднання, затримки при повільному каналі |
| Офлайн | Робота без зв'язку, миттєвий відгук інтерфейсу | Можливі конфлікти при паралельній роботі, необхідність вирішення колізій |
Розробка мобільного WMS-додатку з підтримкою ТСД Zebra/Honeywell, офлайн-режимом, відбором за маршрутом та REST-інтеграцією: 3-5 місяців. Повний цикл (приймання, розміщення, відбір, інвентаризація, відвантаження) з інтеграцією SAP/1С: 5-8 місяців. Вартість розраховується індивідуально. Отримайте консультацію — оцінимо ваш проект.







