# RfidNatura (Print Server RFID) Este proyecto es una aplicación backend que utiliza Node.js, Docker, MariaDB y worker threads para gestionar la impresión de etiquetas ZPL. ## Contenido - [Instalación](#instalación) - [Uso](#uso) - [Descripción de Archivos](#descripción-de-archivos) - [main.js](#mainjs) - [worker.js](#workerjs) - [workerPool.js](#workerpooljs) - [pool.js](#pooljs) - [zplTemplate.js](#zpltemplatejs) - [package.json](#packagejson) - [label.json](#labeljson) ## Instalación 1. Clona el repositorio: ```sh git clone https://gitea.verdnatura.es/verdnatura/dismuntel.git ``` 2. Instala las dependencias de Node.js: ```sh npm install ``` 3. Asegúrate de tener Docker y Docker Compose instalados en tu máquina. 4. Crea un archivo `.env` en el directorio raíz del proyecto y configura las variables de entorno necesarias: ```env # DEBUG=1 # KEEP_TMP_FILES=1 # DRY_PRINT=1 DB_HOST=mariadb DB_PORT=3306 DB_USER=user DB_PASSWORD=password DB_NAME=name DB_PRINTER_SCHEMA=name WORKERS=10 REPLACE_WORKER_DELAY=10000 DB_RECORD_DELAY=6000 DB_CONN_DELAY=2000 DB_CONN_ATTEMPTS=1 PRINTER_CONN_TIMEOUT=1000 PRINTER_CONN_ATTEMPTS=2 PRINTER_CONN_PORT=9100 ``` ## Descripción de Archivos ### `main.js` Este es el archivo de entrada principal que inicializa y comienza el procesamiento del pool de workers. - **WorkerPool**: Se importa la clase `WorkerPool` desde el archivo `worker/workerPool`. - **threads**: Se define el número de threads/workers que se van a utilizar. - **workerPool**: Se instancia un nuevo `WorkerPool` con el número de threads definido. - **start**: Se llama al método `start` para asignar las tareas iniciales a los workers. ### `worker.js` Maneja el procesamiento de registros de impresión y la comunicación con las impresoras. - **getConnWithRetries**: Intenta obtener una conexión a la base de datos con reintentos. - **sendZPL**: Envía el contenido ZPL a la impresora con reintentos. - **getPrinterIpAddress**: Obtiene la dirección IP de una impresora basada en su ID. - **getRecordForProcessing**: Obtiene un registro para procesamiento, con manejo de transacciones y reintentos. - **processRecord**: Procesa un registro específico, generando el contenido ZPL y enviándolo a la impresora. Actualiza la base de datos con el estado de impresión. ### `workerPool.js` Maneja un pool de workers, creando y asignando tareas a los workers. - **initWorkers**: Inicializa el número especificado de workers. - **createWorker**: Crea un nuevo worker y maneja sus mensajes, errores y su finalización. - **replaceWorker**: Reemplaza un worker fallido creando uno nuevo. - **start**: Asigna tareas iniciales a todos los workers. - **end**: Termina todos los workers. ### `pool.js` Configura y exporta un pool de conexiones MySQL. - **dotenv**: Carga las variables de entorno desde un archivo `.env`. - **mysql.createPool**: Crea un pool de conexiones MySQL usando las variables de entorno. ### `zplTemplate.js` Genera las etiquetas ZPL basadas en los registros y la plantilla de etiquetas. - **generateZPL**: Genera el código ZPL para una etiqueta específica basada en el registro y la plantilla de etiquetas. - **rf_id_venature**: Un valor fijo agregado al ID de expedición. - **id_venature**: Formatea el ID de expedición para que tenga una longitud de 20 caracteres. - **upperCaseRecord**: Convierte todos los valores de texto del registro a mayúsculas. - **result**: Contiene el ZPL generado para cada etiqueta. ### `label.json` Este archivo define el formato y los mapeos necesarios para la generación de etiquetas ZPL. Si deseas cambiar los datos que se pasan a ZPL para la impresión de etiquetas, siempre debes seguir este formato. El `label.json` tiene la siguiente estructura: - **name**: Nombre de la etiqueta. - **mappings**: Definición de los campos que serán reemplazados en la plantilla ZPL. - **val1, val2, ...**: Claves que se corresponden con los campos del registro. - **zpl**: Código ZPL que define el diseño de la etiqueta. Dentro del código ZPL, los valores de los mapeos se deben utilizar para ser reemplazados dinámicamente. - **density**: La densidad de impresión. - **width**: Ancho de la etiqueta. - **height**: Altura de la etiqueta.