No description
  • Go 99.8%
  • Makefile 0.2%
Find a file
2026-04-10 09:25:57 +03:00
cmd fix(kiz): исправить маппинг клавиатуры и снять заглушку кириллицы 2026-04-03 10:53:00 +03:00
configs chore(release): выпустить v0.1.0 2026-03-13 14:28:20 +03:00
docs docs: add full project documentation in docs/ 2026-03-13 18:26:15 +00:00
internal fix(kiz): добавить Shift+цифра маппинги и расширить regex до GS1 charset 82 2026-04-10 09:25:57 +03:00
.gitignore chore(repo): исключить служебные артефакты 2026-03-13 14:31:05 +03:00
CHANGELOG.md chore(reprint): layout-fix, cyrillic guard, bump v0.7.2 2026-03-20 15:08:09 +03:00
go.mod chore(reprint): layout-fix, cyrillic guard, bump v0.7.2 2026-03-20 15:08:09 +03:00
go.sum chore(reprint): layout-fix, cyrillic guard, bump v0.7.2 2026-03-20 15:08:09 +03:00
Makefile chore(release): выпустить v0.1.0 2026-03-13 14:28:20 +03:00
README.md docs: создать README.md с полной документацией проекта 2026-03-13 18:15:37 +00:00
VERSION chore(reprint): layout-fix, cyrillic guard, bump v0.7.2 2026-03-20 15:08:09 +03:00

go_mc_goods_reprint

Консольное приложение на Go для автоматической перепечатки товарных ярлыков через МойСклад.
Оператор сканирует штрихкод КИЗ, приложение получает данные товара из МойСклад, формирует PDF-ярлык и отправляет его на принтер — всё без ручного вмешательства.

Содержание


Обзор

go_mc_goods_reprint решает задачу быстрой перепечатки ярлыков на складе:

  1. Оператор подносит КИЗ (Контрольный Идентификационный Знак) к сканеру штрихкодов.
  2. Приложение разбирает КИЗ в формате GS1 (AI 01/21/91/92).
  3. По штрихкоду EAN-13 загружается карточка товара из МойСклад.
  4. Выбирается шаблон ярлыка — по бренду или артикулу из правил templates.toml.
  5. PDF-ярлык генерируется сервисом go_pdf_create.
  6. Готовый 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

При старте приложение:

  1. Проверяет и при необходимости запускает go_pdf_create и bulk_print.
  2. Проверяет наличие токена МойСклад в keyring (при необходимости запрашивает логин/пароль).
  3. Переходит в режим ожидания сканирования.

В консоль выводятся статусные сообщения вида:

[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+1Ctrl+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/stderr go_pdf_create
  • logs/printer_service.log — stdout/stderr bulk_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.