feat: workstations API + agent WebSocket — паркинг агентов и управление оборудованием

- migration 041: таблицы workstations, agent_pair_codes, workstation_devices
- routes/workstations: CRUD рабочих мест, генерация 6-значного кода, CRUD устройств
- POST /api/agent/pair: сопряжение агента по коду → JWT токен
- agent-ws.ts: WebSocket /ws/agent для постоянного соединения агентов,
  heartbeat 30s, онлайн/оффлайн статус в БД

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-26 18:27:24 +03:00
parent be58b16365
commit 439be33c55
4 changed files with 432 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
-- Рабочие места (агенты Windows)
CREATE TABLE IF NOT EXISTS workstations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
hotel_id UUID NOT NULL REFERENCES hotels(id) ON DELETE CASCADE,
agent_id VARCHAR(64) UNIQUE, -- UUID генерируемый агентом
name VARCHAR(100) NOT NULL, -- «Ресепшн 1», «Бар»
hostname VARCHAR(255), -- имя Windows-компьютера
ip_address INET,
is_online BOOLEAN NOT NULL DEFAULT false,
last_seen TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Коды сопряжения (6 цифр, TTL 10 минут)
CREATE TABLE IF NOT EXISTS agent_pair_codes (
code CHAR(6) PRIMARY KEY,
workstation_id UUID NOT NULL REFERENCES workstations(id) ON DELETE CASCADE,
expires_at TIMESTAMPTZ NOT NULL,
used BOOLEAN NOT NULL DEFAULT false
);
-- Устройства привязанные к рабочему месту
CREATE TABLE IF NOT EXISTS workstation_devices (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
workstation_id UUID NOT NULL REFERENCES workstations(id) ON DELETE CASCADE,
type VARCHAR(20) NOT NULL CHECK (type IN ('kkt', 'printer')),
name VARCHAR(100) NOT NULL,
connection VARCHAR(20) NOT NULL CHECK (connection IN ('usb', 'network')),
network_host VARCHAR(255),
network_port INTEGER,
purpose VARCHAR(30) CHECK (purpose IN ('fiscal', 'kitchen', 'bar', 'receipt', 'other')),
config JSONB NOT NULL DEFAULT '{}'
);