Розробка мобільного додатку для управління складом (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 місяців. Вартість розраховується індивідуально. Отримайте консультацію — оцінимо ваш проект.







