- Go 99.8%
- Makefile 0.2%
| cmd | ||
| configs | ||
| docs | ||
| internal | ||
| .gitignore | ||
| CHANGELOG.md | ||
| go.mod | ||
| go.sum | ||
| Makefile | ||
| README.md | ||
| VERSION | ||
go_mc_goods_reprint
Консольное приложение на Go для автоматической перепечатки товарных ярлыков через МойСклад.
Оператор сканирует штрихкод КИЗ, приложение получает данные товара из МойСклад, формирует PDF-ярлык и отправляет его на принтер — всё без ручного вмешательства.
Содержание
- Обзор
- Архитектура
- Зависимости
- Требования
- Установка и сборка
- Конфигурация
- Первый запуск: получение токена
- Запуск
- Взаимодействие оператора
- Структура проекта
- Внутренние пакеты
- Логирование
- Разработка и тесты
- Changelog
Обзор
go_mc_goods_reprint решает задачу быстрой перепечатки ярлыков на складе:
- Оператор подносит КИЗ (Контрольный Идентификационный Знак) к сканеру штрихкодов.
- Приложение разбирает КИЗ в формате GS1 (AI
01/21/91/92). - По штрихкоду EAN-13 загружается карточка товара из МойСклад.
- Выбирается шаблон ярлыка — по бренду или артикулу из правил
templates.toml. - PDF-ярлык генерируется сервисом
go_pdf_create. - Готовый PDF отправляется на печать через сервис
bulk_print.
Данные товара и готовые PDF кешируются в памяти на протяжении сессии, чтобы не делать лишних запросов при повторном сканировании одного и того же КИЗ.
Архитектура
┌────────────────────────────────────────────────────┐
│ go_mc_goods_reprint │
│ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ KIZ │ │ МойСклад │ │ Cache │ │
│ │ Parser │ │ Client │ │ (products │ │
│ │ (GS1/AI) │ │ (API v1.2) │ │ + PDFs) │ │
│ └─────┬──────┘ └─────┬──────┘ └────────────┘ │
│ │ │ │
│ ┌─────▼──────────────▼──────────────────────────┐ │
│ │ Service Manager │ │
│ │ (запускает go_pdf_create и bulk_print, │ │
│ │ если они не запущены) │ │
│ └─────┬──────────────────────────┬──────────────┘ │
│ │ │ │
│ ┌─────▼──────┐ ┌──────▼──────┐ │
│ │ go_pdf_ │ │ bulk_print │ │
│ │ create │ │ (HTTP API) │ │
│ │ (HTTP API) │ └─────────────┘ │
│ └────────────┘ │
└────────────────────────────────────────────────────┘
Поток обработки одного КИЗ:
Сканер → Parse KIZ → EAN13 lookup (cache / МойСклад)
→ ResolveTemplate → PDF render (go_pdf_create)
→ Print job (bulk_print) → DONE
Зависимости
Приложение автоматически запускает два внешних HTTP-сервиса (если они ещё не запущены) и ожидает их готовности:
| Сервис | Назначение | URL по умолчанию |
|---|---|---|
| go_pdf_create | Генерация PDF-ярлыков по шаблонам | http://127.0.0.1:8080 |
| bulk_print | Очередь печати PDF на принтере | http://127.0.0.1:8321 |
Пути к исполняемым файлам этих сервисов указываются в config.toml.
Требования
- Go 1.25+
- Windows (основная целевая платформа; Linux/macOS — без Windows raw console)
- Учётная запись МойСклад с доступом к Remap API 1.2
- Установленные
go_pdf_createиbulk_print(их пути прописываются в конфиге)
Установка и сборка
# Клонировать репозиторий
git clone https://github.com/altinbike/go_mc_goods_reprint
cd go_mc_goods_reprint
# Собрать основное приложение
go build -o reprint.exe ./cmd/reprint
# Собрать утилиту для получения токена
go build -o get-token.exe ./cmd/get-token
Или через make:
make build # сборка reprint.exe
make test # запуск тестов
make vet # статический анализ
make clean # удалить артефакты сборки
Конфигурация
Скопируйте пример конфига и заполните под своё окружение:
cp configs/config.toml.example configs/config.toml
config.toml
[moysklad]
# Имя записи в Windows Credential Manager / keyring
keyring_service = "moysklad"
# Имя пользователя в записи keyring (ключ для хранения токена)
token_user = "access_token"
[pdf_create]
# URL сервиса go_pdf_create
url = "http://127.0.0.1:8080"
# Путь к исполняемому файлу go_pdf_create
exe_path = "C:\\path\\to\\labelgen.exe"
# Аргументы командной строки для запуска сервиса
args = ["--serve", ":8080", "--assets", "assets", "--templates-dir", "templates", "--output", "output"]
# Рабочий каталог сервиса (шаблоны и ресурсы ищутся относительно него)
work_dir = "C:\\Users\\user\\Documents\\go_pdf_create"
# Каталог, куда сервис сохраняет сгенерированные PDF
output_dir = "./output"
# Имя аккаунта МойСклад (передаётся в render payload)
account = "myaccount"
# Таймаут запуска сервиса в секундах (по умолчанию: 20)
startup_timeout_seconds = 20
[print]
# URL сервиса bulk_print
url = "http://127.0.0.1:8321"
# Путь к исполняемому файлу bulk_print
exe_path = "C:\\path\\to\\bulk_print.exe"
# Количество копий по умолчанию
copies = 1
# Таймаут запуска сервиса в секундах (по умолчанию: 20)
startup_timeout_seconds = 20
[templates]
# Шаблон ярлыка по умолчанию (имя файла шаблона в go_pdf_create)
default = "ШК 40x58 EAN13.xml"
# Путь к файлу правил выбора шаблона
rules_file = "configs/templates.toml"
templates.toml
Файл содержит правила выбора шаблона ярлыка на основе бренда и/или артикула варианта:
[[rules]]
template = "ШК 40x58 EAN13 Спорт.xml"
# Правило по артикулам, начинающимся с "SH", ИЛИ по бренду "ALTIN FIT"
article_prefixes = ["SH"]
brands = ["ALTIN FIT"]
[[rules]]
template = "ШК 40x58 EAN13 Хлопок.xml"
article_prefixes = ["PG"]
brands = ["COCOLUX"]
Каждое правило может содержать:
| Поле | Тип | Описание |
|---|---|---|
template |
string | Имя файла шаблона в go_pdf_create |
brand |
string | Точное имя бренда (одно значение) |
brands |
[]string | Список брендов (любое из значений) |
article_prefix |
string | Префикс артикула варианта (одно значение) |
article_prefixes |
[]string | Список префиксов артикула |
Правила проверяются по порядку. Первое совпавшее правило определяет шаблон. Если ни одно правило не сработало — используется templates.default.
Сравнение нечувствительно к регистру, пробелам, дефисам и символу ё/е.
Первый запуск: получение токена
Перед первым запуском необходимо сохранить токен доступа МойСклад в системный keyring (Windows Credential Manager). Для этого используется утилита get-token:
get-token.exe
# Введите логин МойСклад: user@example.com
# Введите пароль МойСклад: ********
# Токен МойСклад обновлен и сохранен в keyring.
Параметры по умолчанию совпадают с config.toml. Если вы изменили keyring_service или token_user, передайте их явно:
get-token.exe -keyring-service myservice -token-user myuser
Токен автоматически обновляется при получении 401 Unauthorized от МойСклад: приложение подхватывает актуальный токен из keyring без перезапуска.
Запуск
reprint.exe
# или с явным путём к конфигу:
reprint.exe -config configs/config.toml
При старте приложение:
- Проверяет и при необходимости запускает
go_pdf_createиbulk_print. - Проверяет наличие токена МойСклад в keyring (при необходимости запрашивает логин/пароль).
- Переходит в режим ожидания сканирования.
В консоль выводятся статусные сообщения вида:
[START] Проверка и запуск зависимых сервисов
[SERVICES] go_pdf_create и bulk_print готовы
[AUTH] Проверка токена МойСклад
[AUTH] Токен МойСклад готов
[READY] Ожидание сканирования КИЗ (копий: 1)
Для каждого КИЗ:
[SCAN] КИЗ получен, начинается обработка
[KIZ] EAN13=4600000000001
[MOYSKLAD] Запрос данных товара
[CACHE] Товар загружен из МойСклад и сохранен в кеш
[TEMPLATE] Выбран шаблон: ШК 40x58 EAN13.xml
[PDF] PDF сформирован
[PRINT] Отправка PDF на печать (1 коп.)
[DONE] Печать завершена
[READY] Ожидание сканирования КИЗ (копий: 1)
Взаимодействие оператора
Горячие клавиши (Windows)
| Клавиша | Действие |
|---|---|
Ctrl+1 … Ctrl+9 |
Выбрать количество копий для следующей печати |
Ctrl+C |
Завершить приложение |
Esc |
Завершить приложение |
Кеш сессии
В рамках одной сессии приложение кеширует:
- Данные товара (по EAN-13): повторный скан того же товара не обращается к МойСклад.
- PDF-ярлык (по полному КИЗ): повторный скан того же КИЗ сразу отправляется на печать.
Кеш сбрасывается при перезапуске приложения.
Структура проекта
go_mc_goods_reprint/
├── cmd/
│ ├── reprint/ # Основное приложение
│ │ ├── main.go # Точка входа, цикл обработки КИЗ
│ │ ├── scan_source.go # Интерфейс источника сканирования
│ │ ├── scan_source_windows.go # Windows: raw console (Ctrl+1..9, Esc)
│ │ └── scan_source_default.go # Прочие платформы: построчный ввод
│ └── get-token/ # Утилита обновления токена МойСклад
│ └── main.go
├── internal/
│ ├── cache/ # In-memory кеш товаров и PDF
│ ├── config/ # Загрузка config.toml и templates.toml
│ ├── kiz/ # Парсер КИЗ (GS1, AI 01/21/91/92)
│ ├── moysklad/ # Клиент МойСклад API (auth, rate-limit, retry)
│ ├── pdfcreate/ # Клиент сервиса go_pdf_create
│ ├── printer/ # Клиент сервиса bulk_print
│ └── service/ # Менеджер зависимых сервисов
├── configs/
│ ├── config.toml.example # Пример конфигурации
│ └── templates.toml # Правила выбора шаблонов
├── logs/ # Журналы (создаётся при запуске)
├── Makefile
├── go.mod
├── go.sum
├── VERSION
└── CHANGELOG.md
Внутренние пакеты
internal/kiz — Парсер КИЗ
Разбирает коды маркировки в формате GS1 DataMatrix.
Поддерживает:
- Стандартный формат с разделителями GS (
\x1D):01{GTIN}21{serial}\x1D91{verKey}\x1D92{crypto} - «Компактный» формат без разделителей (автодетект по AI-маркерам)
- Автоматическую транслитерацию русской раскладки клавиатуры в латинскую
- Дедупликацию задвоенного хвоста AI 92
Метод EAN13() возвращает 13-значный код, используемый для поиска в МойСклад.
internal/moysklad — Клиент МойСклад
HTTP-клиент к Remap API 1.2.
Возможности:
- Хранение токена в системном keyring (Windows Credential Manager / Secret Service)
- Автоматический retry (до 5 попыток) с экспоненциальной задержкой
- Соблюдение лимитов API через заголовки
X-RateLimit-*иX-Lognex-* - Декодирование gzip-ответов
- Поиск варианта по штрихкоду с автоматическим expand=product
internal/pdfcreate — Клиент PDF-сервиса
Отправляет запрос на рендеринг ярлыка в go_pdf_create и скачивает результат.
При недоступности endpoint скачивания — использует локальный артефакт из output_dir.
internal/printer — Клиент сервиса печати
Создаёт задание печати в bulk_print и ожидает его завершения (polling по статусу).
Поддерживает состояния: queued, processing, printing, awaiting_confirmation, completed, failed, cancelled.
internal/service — Менеджер сервисов
При старте проверяет healthcheck go_pdf_create и bulk_print.
Если сервис недоступен — запускает его из пути, указанного в конфиге, и ждёт готовности.
При завершении приложения останавливает запущенные сервисы.
internal/config — Конфигурация
Загружает config.toml и опциональный templates.toml через библиотеку BurntSushi/toml.
Выполняет нормализацию путей относительно расположения конфиг-файла.
internal/cache — Сессионный кеш
Потокобезопасный in-memory кеш (sync.RWMutex) для:
products— карточки товаров (ключ: EAN-13)pdfs— пути к сгенерированным PDF (ключ: полный GS1 payload КИЗ)
Логирование
Все события записываются в logs/reprint.log в формате JSON (zerolog).
Логи зависимых сервисов:
logs/pdf_service.log— stdout/stderrgo_pdf_createlogs/printer_service.log— stdout/stderrbulk_print
В консоль выводятся только краткие статусные строки [STEP] message.
Разработка и тесты
# Запустить все тесты
make test
# или
go test ./...
# Статический анализ
make vet
# или
go vet ./...
Тесты охватывают:
- Парсинг КИЗ (стандартный, компактный, задвоенный AI 92, транслит)
- Логику выбора шаблона по бренду и артикулу
- Клиент МойСклад (gzip, retry, rate-limit, auth)
- Клиент PDF-сервиса
- Сессионный кеш
- Windows: горячие клавиши Ctrl+1..9 и Ctrl+C
Changelog
История версий — в файле CHANGELOG.md.
Текущая версия указана в файле VERSION.