Розробка мобільного додатку для приймання товару зі сканером
Приймання товару — перша точка контролю в ланцюжку поставок. Фактичне кількість та артикули розходяться з замовленням частіше, ніж здається: пересортиця, недостача, пошкоджений товар, неправильна маркування. Мобільний додаток з підтримкою сканування перетворює приймання з заповнення паперових актів у структурований процес з негайною верифікацією.
Сканування GS1-128 та SSCC
Товар у поставці маркується кількома рівнями: штрихкод одиниці (EAN-13/EAN-8), штрихкод коробки/упаковки (ITF-14, Code 128), SSCC на паллеті (Serial Shipping Container Code, 18 цифр, Code 128 або GS1-128).
GS1-128 — це Code 128 з Application Identifiers (AI): (00) — SSCC, (01) — GTIN, (17) — термін придатності YYMMDD, (10) — номер лоту, (37) — кількість. Один GS1-128 штрихкод може містити кілька AI.
class GS1Parser {
private val GROUP_SEPARATOR = '\u001D' // FNC1
fun parse(barcode: String): Map<String, String> {
val result = mutableMapOf<String, String>()
var pos = 0
val raw = barcode.replace("]C1", "").replace("]e0", "") // видаляємо маркери сканера
while (pos < raw.length) {
val ai = detectAI(raw, pos) ?: break
pos += ai.length
val value = extractValue(raw, pos, ai)
result[ai] = value
pos += value.length
if (pos < raw.length && raw[pos] == GROUP_SEPARATOR) pos++
}
return result
}
private fun detectAI(s: String, pos: Int): String? {
// AI можуть бути 2, 3 або 4 цифри
return listOf(4, 3, 2).firstNotNullOfOrNull { len ->
if (pos + len <= s.length && KNOWN_AIS.contains(s.substring(pos, pos + len)))
s.substring(pos, pos + len) else null
}
}
}
DataMatrix та QR коди у фармацевтиці та маркуванні Честний Знак містять аналогічні GS1-дані. ML Kit Barcode Scanning декодує їх усі; головне — коректно парсити Application Identifiers.
Верифікація з замовленням на поставку (PO)
Основний сценарій: завантажуємо Purchase Order (замовлення постачальнику) перед приймванням, сканюємо прибувший товар, порівнюємо факт з планом у реальному часі.
data class ReceivingLine(
val poLineId: String,
val sku: String,
val gtin: String,
val orderedQty: Double,
val receivedQty: Double = 0.0,
val lotNumber: String? = null,
val expiryDate: LocalDate? = null,
val status: LineStatus = LineStatus.PENDING
)
class ReceivingViewModel : ViewModel() {
fun processScan(parsedBarcode: Map<String, String>) {
val gtin = parsedBarcode["01"] ?: parsedBarcode["02"] ?: return
val lot = parsedBarcode["10"]
val expiry = parsedBarcode["17"]?.let { parseExpiry(it) }
val qty = parsedBarcode["37"]?.toDoubleOrNull() ?: 1.0
val line = findLineByGtin(gtin) ?: run {
// Товар не у PO — попередження, фіксуємо як неочікуваний
recordUnexpectedItem(gtin, qty)
return
}
val updated = line.copy(
receivedQty = line.receivedQty + qty,
lotNumber = lot ?: line.lotNumber,
expiryDate = expiry ?: line.expiryDate,
status = when {
line.receivedQty + qty > line.orderedQty * 1.05 -> LineStatus.OVER_RECEIVED
abs(line.receivedQty + qty - line.orderedQty) < 0.01 -> LineStatus.COMPLETED
else -> LineStatus.IN_PROGRESS
}
)
updateLine(updated)
}
}
Перебір та недобір — обидва вимагають візуального попередження. Кольорова кодування: зелений (у допуску), жовтий (невеликої розходження), червоний (значний перебір або брак).
Фотофіксація та акт про розходження
Пошкоджений товар вимагає фотодокументування. Робимо фото прямо з додатку через CameraX (Android) / AVCaptureSession (iOS), привязуємо до позиції приймання. Фото завантажується в S3/MinIO, в акті посилання на зображення.
Акт про розходження (форма ТОРГ-2) формується автоматично за результатами приймання. PDF через iText на Android або серверна генерація через Puppeteer/WeasyPrint. Підпис приймача — SignatureView (малюємо пальцем) або інтеграція з DocuSign API для юридично значимого документообігу.
Маркування Честний Знак
Для товарів, що підлягають обов'язковій маркуванню (молоко, вода, взуття, одяг, парфум) — верифікація кода маркування через API ГІС МТ (Честний Знак): POST /api/v3/true-api/codes/check з кодом Data Matrix. Відповідь містить статус коду (в обороті, виведено з обігу, не знайдено) та атрибути товару.
Розробка додатку приймання зі сканування GS1-128/DataMatrix, верифікацією за PO та актами розходжень: 5–7 тижнів. З інтеграцією Честний Знак, фотофіксацією та двосторонньою інтеграцією з WMS/1С: 10–14 тижнів. Стоимість розраховується індивідуально.







