Печать (print-agent)
Модель работы локального print-agent, принтер XPrinter XP-T80Q, установка на месте, критический фикс кириллицы и шаблоны чеков.
Модель работы
Планшеты и касса не печатают напрямую. Заказ → Supabase Realtime → print-agent (Node.js daemon на ноутбуке кассы, в той же Wi-Fi) → термопринтер по LAN → чек.
- Слушает status
accepted→ печатает. Локальная очередь на LowDB при offline, ретрай каждые 30 сек (#20). - API на Fastify:
/api/health,/api/test; веб-дашбордhttp://localhost:9090. - Печатает кухонный ярлык и предчек — это не фискальный чек ГНС (фискальный — отдельная ККМ, зона заказчика).
- print-agent не в workspaces монорепо — живёт локально на кассе, зависимости изолированы, к Cloudflare отношения не имеет.
Принтер XPrinter XP-T80Q (#39)
- Интерфейс USB + LAN (рекомендуется LAN).
- Скорость 200 мм/с, бумага 80 мм термолента.
- Протокол ESC/POS, порт TCP 9100, 48 символов/строку (Font A).
- Справочник
xprinter-80-series.md.
Модель подтверждена по наклейке; отменяет прежние упоминания XP-T80A (ARCHITECTURE) и XP-N160II (старое ТЗ).
Установка на месте (кратко)
- Заправить термоленту (термослой к головке — проверка царапаньем ногтем).
- LAN-кабель в роутер → self-test (выкл → зажать FEED → вкл) → записать IP → закрепить статически (DHCP-резерв по MAC).
- Node.js 20+ на ноутбук, скопировать
print-agent,ping <IP>проходит. .env(значения — см. закрытый файл доступов):SUPABASE_URL,SUPABASE_SERVICE_ROLE_KEY(секрет!),PRINTER_TYPE=xprinter,PRINTER_HOST=tcp://<IP>:9100,WEB_UI_PORT=9090.npm install && npm run dev→ в логеAgent started, listening :9090.- Health:
GET /api/health→supabase: connected,printer: online. Тест:POST /api/test. - E2E: тестовый заказ → accepted → кухонный ярлык печатается → «Печать предчека» → предчек; offline-очередь: выключить принтер → заказ → включить → допечатывается.
- Автозапуск: Windows
install-windows.bat(нужен nssm), macOSinstall-macos.sh.
Кириллица — критический фикс (withCyrillic, #46, #51)
Проблема: XP-T80Q залипает в китайском двухбайтовом режиме и печатает кириллицу иероглифами (GB18030). Одного FS . мало — принтер запоминает режим и релапсит на длинном чеке или после смены размера шрифта.
Решение: перед текстом слать сырую последовательность FS . + FS C 0 + ESC t 17 (байты 0x1C 0x2E 0x1C 0x43 0x00 0x1B 0x74 0x11) — принудительный однобайтовый режим + кодовая страница PC866.
Разовый сброс сверху чека не спасал → обёртка withCyrillic(printer) через Proxy шлёт эту последовательность перед каждым println / print / leftRight. Проверено на железе: с полной тройкой — чистый русский, без — иероглифы.
Шаблоны чеков (#49, #50)
Кухонный (renderTicket)
Cook-first по research Toast/KDS: тип + № крупно, количество СЛЕВА (2x Плов), блюда double-height, без цен и ИТОГО, повтор №N внизу, логотип убран. Per-item comment печатается под блюдом normal size (#56).
Предчек гостю (renderClientReceipt)
Бренд ЧУЙГУН / ЗАКАЗ № / ИТОГО крупно (double H+W), позиция = название + 2 x цена … сумма, дата/время для аудита, дисклеймер «Не является фискальным чеком».
Комментарий повару в гостевом чеке НЕ печатается — только в кухонном.