Разработка мобильного приложения для приёмки товара со сканером
Приёмка товара — первая точка контроля в цепочке поставок. Фактическое количество и артикулы расходятся с заказом чаще, чем кажется: пересортица, недостача, повреждённый товар, неправильная маркировка. Мобильное приложение с поддержкой сканирования превращает приёмку из заполнения бумажных актов в структурированный процесс с немедленной верификацией.
Сканирование 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)
}
}
Перебор (over-receiving) и недобор — оба требуют визуального предупреждения. Цветовая кодировка: зелёный (в допуске), жёлтый (небольшое расхождение), красный (значительный перебор или брак).
Фотофиксация и акт о расхождении
Повреждённый товар требует фотодокументирования. Делаем фото прямо из приложения через 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 недель. Стоимость рассчитывается индивидуально.







