Revolus API Reference
Documentação completa das APIs REST da plataforma Revolus OEE — sistema de monitoramento industrial em tempo real multi-tenant.
Formato
JSON · REST
Autenticação
Bearer JWT
Multi-tenant
companyId no JWT
A plataforma utiliza JWT Bearer Token. Após o login, inclua o token no header
Authorization de todas as requisições protegidas.
Tokens expiram e devem ser renovados via POST /refresh.
Authorization: Bearer <seu-jwt-token>
O payload do JWT contém: sub (userId),
companyId,
companyTag,
equipmentIds e
scope.
Todos os dados são automaticamente escopados pela empresa do usuário autenticado.
companyId é opcional — quando omitido, o sistema seleciona
a empresa padrão do usuário.
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| username | string | obrigatório | Login do usuário |
| password | string | obrigatório | Senha do usuário (mínimo 6 caracteres) |
| companyId | string (UUID) | opcional | ID da empresa para login direto em multi-tenant |
{ "username": "operador01", "password": "senha123", "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b" }
{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "tokenExpires": 1750000000, "refreshToken": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4...", "refreshExpires": 1752592000 }
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| refreshToken | string | obrigatório | Refresh token obtido no login |
{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "tokenExpires": 1750003600, "refreshToken": "dGhpcyBpcyBhIG5ldyByZWZyZXNoIHRva2Vu...", "refreshExpires": 1752595600 }
companyId e companyTag.| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| companyId | string (UUID) | obrigatório | ID da empresa destino |
{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "tokenExpires": 1750000000, "refreshToken": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4...", "refreshExpires": 1752592000 }
| Parâmetro | Tipo | Status | Descrição |
|---|---|---|---|
| page | integer | opcional | Número da página (min: 1, padrão: 1) |
| pageRows | integer | opcional | Registros por página (1–100, padrão: 10) |
| orderBy | string | opcional | Campo para ordenação |
| order | ASC | DESC | opcional | Direção da ordenação |
| name | string | opcional | Filtro por nome (busca parcial) |
| active | boolean | opcional | Filtrar por status ativo/inativo |
{ "count": 42, "rows": [ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b", "name": "Kleber Marçal", "login": "kleber", "email": "kleber@empresa.com", "active": true, "createdAt": "2025-01-15T10:00:00.000Z" } ] }
{ "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b", "name": "Kleber Marçal", "login": "kleber", "email": "kleber@empresa.com", "active": true, "selectedCompany": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b" }
| Parâmetro | Tipo | Status | Descrição |
|---|---|---|---|
| id | string (UUID) | obrigatório | ID do usuário |
{ "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b", "login": "operador01", "name": "João Operador", "email": "joao@empresa.com", "userCompanies": [ { "userId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b", "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00", "systems": ["MES"], "active": true, "company": { "id": "01932e4a-…", "name": "Brasfit", "tag": "BRFIT" } } ] }
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| name | string | obrigatório | Nome completo do usuário |
| login | string | obrigatório | Login único do usuário |
| password | string | obrigatório | Senha (mínimo 6 caracteres) |
| string (email) | opcional | Endereço de e-mail |
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| name | string | opcional | Nome completo |
| login | string | opcional | Login |
| password | string | opcional | Nova senha (mín. 6 caracteres) |
| string (email) | opcional |
active: true.| Parâmetro | Tipo | Status | Descrição |
|---|---|---|---|
| id | string (UUID) | obrigatório | ID do usuário |
active: false.| Parâmetro | Tipo | Status | Descrição |
|---|---|---|---|
| id | string (UUID) | obrigatório | ID do usuário |
userCompanies).[]
Todas as rotas exigem JWT Bearer e são escopadas pela empresa do token.
Listagens paginadas aceitam pagination[page] (padrão 1),
pagination[pageRows] (1–10000, padrão 10) e
order[campo]=asc|desc, e respondem no formato
{ count, rows }.
Usuários com restrição de equipamentos no JWT só enxergam os equipamentos permitidos.
filter[...].| Parâmetro | Tipo | Status | Descrição |
|---|---|---|---|
| filter[name] | string | opcional | Filtro por nome (busca parcial) |
| filter[description] | string | opcional | Filtro por descrição |
| filter[collectorMac] | string | opcional | MAC do coletor vinculado |
| filter[groupId] | string (UUID) | opcional | Grupo de equipamentos |
| filter[productId] | string (UUID) | opcional | Somente equipamentos vinculados ao produto |
| filter[equipmentIds][] | string[] (UUID) | opcional | Lista de ids específicos |
| filter[active] | boolean | opcional | Status ativo/inativo |
| pagination[page] | integer | opcional | Página (padrão 1) |
| pagination[pageRows] | integer | opcional | Registros por página (1–10000, padrão 10) |
| order[campo] | asc | desc | opcional | Ordenação, ex. order[name]=asc |
{ "count": 8, "rows": [ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b", "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00", "erpId": null, "name": "Impressora Flexo 01", "description": "Linha 1 — galpão A", "collectorMac": "A0:B1:C2:D3:E4:F5", "groupId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a99", "color": "#3B82F6", "band": 1, "active": true, "hourmeter": 152340, "createdAt": "2025-01-15T10:00:00.000Z", "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55", "updatedAt": "2025-03-02T08:12:00.000Z", "updatedBy": null } ] }
rssi vem null quando o coletor nunca reportou.| Parâmetro | Tipo | Status | Descrição |
|---|---|---|---|
| macs | string (CSV) | obrigatório | MACs separados por vírgula, ex. A0:B1:C2:D3:E4:F5,B0:C1:D2:E3:F4:A5 |
[ { "mac": "A0:B1:C2:D3:E4:F5", "rssi": -58 }, { "mac": "B0:C1:D2:E3:F4:A5", "rssi": null } ]
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| name | string | obrigatório | Nome do equipamento |
| color | string (hexa) | obrigatório | Cor de exibição, ex. #3B82F6 |
| description | string | opcional | Descrição livre |
| band | number | opcional | Banda/faixa do coletor |
| active | boolean | opcional | Status inicial |
name, description, groupId, color, active. Resposta 200: o Equipamento atualizado.active: false.active: true.[ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a99", "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00", "name": "Linha 1", "color": "22C55E", "active": true, "createdAt": "2025-01-15T10:00:00.000Z", "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55", "updatedAt": null, "updatedBy": null } ]
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| name | string | obrigatório | Nome do grupo |
| color | string (hexa 6) | obrigatório | Cor em hexa de 6 dígitos, ex. 22C55E |
| active | boolean | obrigatório | Status do grupo |
name, color e active opcionais. Resposta 200: o Grupo atualizado.{ count, rows }.{ "count": 120, "rows": [ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c30", "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00", "erpId": null, "name": "Rótulo Refrigerante 2L", "code": "ROT-2L-001", "metricId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c40", "dealMetricId": null, "type": "FINISHED_PRODUCT", "unitPrice": 0.12, "labelsPerRoll": 5000, "rows": 4, "active": true, "createdAt": "2025-01-15T10:00:00.000Z", "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55", "updatedAt": null, "updatedBy": null } ] }
| Parâmetro | Tipo | Status | Descrição |
|---|---|---|---|
| filter[nameOrCode] | string | opcional | Busca por nome ou código |
| filter[name] | string | opcional | Filtro por nome |
| filter[code] | string | opcional | Filtro por código |
| filter[metricId] | string (UUID) | opcional | Unidade de medida |
| filter[equipmentId] | string (UUID) | opcional | Somente produtos vinculados ao equipamento |
| filter[type] | enum | opcional | RAW_MATERIAL · UNFINISHED_PRODUCT · FINISHED_PRODUCT |
| filter[active] | boolean | opcional | Status ativo/inativo |
| pagination / order | — | opcional | Paginação e ordenação padrão MES |
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| name | string | obrigatório | Nome do produto |
| code | string | obrigatório | Código interno do produto |
| metricId | string (UUID) | obrigatório | Unidade de medida |
| type | enum | obrigatório | RAW_MATERIAL · UNFINISHED_PRODUCT · FINISHED_PRODUCT |
| width / gapWidth | number (mm) | opcional | Largura e gap de largura |
| height / gapHeight | number (mm) | opcional | Altura e gap de altura |
| unitPrice | number | opcional | Preço unitário |
| labelsPerRoll | number | opcional | Etiquetas por bobina |
| rows | number | opcional | Número de carreiras |
| active | boolean | opcional | Status inicial |
active: false.active: true.{ count, rows } — cada vínculo define a capacidade nominal e os fatores de conversão daquele produto naquele equipamento. Cada item vem com os objetos equipment e product completos embutidos.| Parâmetro | Tipo | Status | Descrição |
|---|---|---|---|
| equipmentId | string (UUID) | opcional | Filtrar por equipamento |
| equipmentName | string | opcional | Nome do equipamento |
| productId | string (UUID) | opcional | Filtrar por produto |
| productCode | string | opcional | Código do produto |
| productName | string | opcional | Nome do produto |
| active | boolean | opcional | Status do vínculo |
{ "count": 35, "rows": [ { "equipmentId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b", "productId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c30", "nominalCapacity": 1200, "multiplierFactor": 4, "divideFactor": 1, "microStopInit": 10, "microStopEnd": 120, "visualAlert": true, "soundAlert": false, "firstAlert": 30, "secondAlert": 90, "perBar": null, "active": true, "createdAt": "2025-01-15T10:00:00.000Z", "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55", "updatedAt": null, "updatedBy": null, "equipment": { "…objeto Equipamento completo…" }, "product": { "…objeto Produto completo…" } } ] }
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| equipmentId | string (UUID) | obrigatório | Equipamento |
| productId | string (UUID) | obrigatório | Produto |
| nominalCapacity | number | obrigatório | Peças produzidas em 1h de execução (base da Performance do OEE) |
| multiplierFactor | number | obrigatório | Quantidade produzida por ciclo de máquina |
| divideFactor | number | obrigatório | Fator divisor por ciclo (padrão 1) |
| Campo | Tipo | Descrição |
|---|---|---|
| nominalCapacity | number | Peças por hora |
| multiplierFactor / divideFactor | number | Fatores de conversão por ciclo |
| microStopInit / microStopEnd | integer (s) | Janela de microparada em segundos |
| visualAlert / soundAlert | boolean | Sinais visual e sonoro do ANDON |
| firstAlert / secondAlert | integer (s) | Tempos do 1º e 2º alertas |
| perBar | integer | Peças por barra |
| active | boolean | Status do vínculo |
active: false.active: true.[ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c40", "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00", "name": "Peças", "code": "PÇ", "active": true, "createdAt": "2025-01-15T10:00:00.000Z", "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55", "updatedAt": null, "updatedBy": null } ]
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| code | string (máx 4) | obrigatório | Código curto, ex. PÇ |
| name | string | obrigatório | Nome da unidade, ex. Peças |
| active | boolean | opcional | Status inicial |
code, name e active opcionais. Resposta 200: a Métrica atualizada.PLANNED → RUNNING ⇄ PAUSED → REVIEW → FINISHED (ou CANCELED).| Parâmetro | Tipo | Status | Descrição |
|---|---|---|---|
| filter[name] | string | opcional | Nome da produção |
| filter[equipmentIds][] | string[] (UUID) | opcional | Equipamentos |
| filter[productId] | string (UUID) | opcional | Produto |
| filter[status][] | enum[] | opcional | PLANNED · RUNNING · PAUSED · REVIEW · FINISHED · CANCELED |
| filter[groupId] | string (UUID) | opcional | Grupo de equipamentos |
| filter[collectorMac] | string | opcional | MAC do coletor |
| filter[plannedStartInterval] | DateInterval | opcional | Intervalo do início planejado |
| pagination / order | — | opcional | Paginação e ordenação padrão MES |
{ "count": 17, "rows": [ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b01", "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00", "equipmentId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b", "productId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c30", "erpId": null, "name": "OP-2025-0612", "multiplierFactor": 4, "divideFactor": 1, "nominalCapacity": 1200, "status": "RUNNING", "plannedStart": "2025-06-12T06:00:00.000Z", "plannedEnd": "2025-06-12T22:00:00.000Z", "plannedQuantity": 10000, "plannedQuality": 98, "plannedAvailability": 90, "plannedPerformance": 85, "cycleTime": 3.0, "startTime": "2025-06-12T06:04:12.000Z", "lastPlay": "2025-06-12T13:10:00.000Z", "pastExecutionTime": 18450, "expectedEnd": "2025-06-12T21:40:00.000Z", "endTime": null, "active": true, "observation": "Prioridade alta", "client": "Cliente XYZ", "value": 12500.00, "createdAt": "2025-06-11T18:00:00.000Z", "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55", "updatedAt": null, "updatedBy": null, "equipment": { "…objeto Equipamento completo…" }, "product": { "…objeto Produto completo…" }, "counter": 5230, "setupCounter": 48, "cycleAverage": 2.94 } ] }
Os campos counter, setupCounter e
cycleAverage (contadores ao vivo, lidos do Redis) só aparecem em produções com status RUNNING.
id deve ser um UUIDv7 válido. Resposta 200: objeto Produção — mesma estrutura dos itens de GET /productions.status: "PLANNED".| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| name | string | obrigatório | Identificação da ordem |
| productId | string (UUID) | obrigatório | Produto a produzir |
| equipmentId | string (UUID) | obrigatório | Equipamento designado |
| nominalCapacity | number | obrigatório | Capacidade nominal (peças/h) desta ordem |
| plannedQuantity | integer | obrigatório | Quantidade planejada (≥ 1) |
| plannedStart | string (ISO date) | obrigatório | Início planejado |
| plannedEnd | string (ISO date) | obrigatório | Fim planejado |
| plannedAvailability | integer (1–100) | obrigatório | Meta de disponibilidade % |
| plannedPerformance | integer (1–100) | obrigatório | Meta de performance % |
| plannedQuality | integer (1–100) | obrigatório | Meta de qualidade % |
| observation | string | obrigatório | Observações da ordem |
| client | string | opcional | Cliente da ordem |
| value | number (2 casas) | opcional | Valor da produção |
| rows | number | opcional | Carreiras (produtos impressos) |
| active | boolean | opcional | Status inicial |
RUNNING. O equipamento passa a contabilizar contagens desta ordem e o evento {equipmentId}/UPDATE_EQUIPMENT_PRODUCT é emitido via WebSocket para os dashboards. Resposta 200: a Produção com status: "RUNNING".PAUSED, preservando o tempo de execução acumulado. Resposta 200: a Produção com status: "PAUSED".status: "FINISHED" e endTime preenchido.active: false.| Parâmetro | Tipo | Status | Descrição |
|---|---|---|---|
| filter[equipmentIds][] | string[] (UUID) | opcional | Equipamentos |
| filter[productionIds][] | string[] (UUID) | opcional | Produções |
| filter[shiftIds][] | string[] (UUID) | opcional | Turnos |
| filter[motiveIds][] | string[] (UUID) | opcional | Motivos de parada |
| filter[stopMotiveGroupIds][] | string[] (UUID) | opcional | Grupos de motivo |
| filter[productIds][] | string[] (UUID) | opcional | Produtos |
| filter[productionStatus][] | enum[] | opcional | Status da produção associada |
| filter[start] / filter[end] | string (ISO date) | opcional | Período de início das paradas |
| pagination / order | — | opcional | Paginação e ordenação padrão MES |
{ "count": 42, "rows": [ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1e01", "productionId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b01", "startTime": "2025-06-10T14:22:31.000Z", "endTime": "2025-06-10T14:41:05.000Z", "duration": 1114, "motiveId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c07", "motiveType": "UNPLANNED", "stopMotive": { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c07", "name": "Quebra mecânica", "color": "#EF4444", "type": "UNPLANNED", "isSetup": false, "isMaintenance": true }, "production": { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b01", "name": "OP-2025-0612", "product": { "name": "Rótulo Refrigerante 2L" }, "equipment": { "name": "Impressora Flexo 01" } } } ] }
duration em segundos, recortada ao período filtrado.
motiveId/stopMotive vêm
null em paradas ainda não classificadas.
{equipmentId}/STOP_FINALIZE via WebSocket. Resposta 200: a parada encerrada, com endTime preenchido.| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| finalizeSetup | boolean | opcional | Indica que o setup foi concluído junto com a quebra da parada |
{equipmentId}/STOP_CLASSIFY via WebSocket para atualizar os dashboards. Resposta 200: a parada com motiveId e motiveType atualizados.| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| motiveId | string (UUID) | obrigatório | Motivo de parada atribuído |
| observation | string | opcional | Observação do classificador |
{ count, rows }.{ "count": 12, "rows": [ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c07", "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00", "stopMotiveGroupId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c90", "name": "Quebra mecânica", "type": "UNPLANNED", "isSetup": false, "isMaintenance": true, "color": "#EF4444", "active": true, "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55", "createdAt": "2025-01-15T10:00:00.000Z", "updatedBy": null, "updatedAt": null } ] }
| Parâmetro | Tipo | Status | Descrição |
|---|---|---|---|
| name | string | opcional | Filtro por nome |
| type | enum | opcional | PLANNED · UNPLANNED · MICROSTOP |
| isSetup | boolean | opcional | Somente motivos de setup |
| isMaintenance | boolean | opcional | Somente motivos de manutenção |
| stopMotiveGroupId | string (UUID) | opcional | Grupo de motivos |
| active | boolean | opcional | Status ativo/inativo |
PLANNED não penaliza disponibilidade; UNPLANNED penaliza; MICROSTOP impacta performance. Resposta 200: o Motivo criado.| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| name | string | obrigatório | Nome do motivo |
| type | enum | obrigatório | PLANNED · UNPLANNED · MICROSTOP |
| isSetup | boolean | obrigatório | Motivo de setup/troca |
| isMaintenance | boolean | obrigatório | Motivo de manutenção (alimenta MTTR/MTBF) |
| color | string (hexa) | obrigatório | Cor de exibição |
| stopMotiveGroupId | string (UUID) | opcional | Grupo do motivo |
| active | boolean | opcional | Status inicial |
{ count, rows }.{ "count": 4, "rows": [ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c90", "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00", "name": "Mecânica", "color": "#F59E0B", "active": true, "createdAt": "2025-01-15T10:00:00.000Z", "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55", "updatedAt": null, "updatedBy": null } ] }
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| name | string | obrigatório | Nome do grupo |
| color | string (hexa) | obrigatório | Cor de exibição |
| active | boolean | obrigatório | Status do grupo |
name, color e active opcionais. Resposta 200: o Grupo atualizado.| Parâmetro | Tipo | Status | Descrição |
|---|---|---|---|
| equipmentId | string (UUID) | opcional | Filtrar por equipamento |
| stopMotiveId | string (UUID) | opcional | Filtrar por motivo |
| stopMotiveName | string | opcional | Nome do motivo |
| type | enum | opcional | Tipo do motivo |
| isQuick | boolean | opcional | Somente classificação rápida |
{ "count": 28, "rows": [ { "equipmentId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b", "stopMotiveId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c07", "isQuick": true, "createdAt": "2025-01-15T10:00:00.000Z", "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55", "updatedAt": null, "updatedBy": null, "equipment": { "…objeto Equipamento completo…" }, "stopMotive": { "…objeto Motivo de Parada completo…" } } ] }
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| equipmentId | string (UUID) | obrigatório | Equipamento |
| stopMotiveId | string (UUID) | obrigatório | Motivo de parada |
| isQuick | boolean | opcional | Exibe como botão de classificação rápida (padrão false) |
isQuick do vínculo. Resposta 200: o vínculo atualizado.[ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1f01", "productionId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b01", "shiftId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b10", "discardMotiveId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1f90", "multiplier": 1, "total": 35, "discardMetricId": null, "observation": "Falha de impressão", "createdAt": "2025-06-12T09:31:00.000Z", "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55", "updatedAt": null, "updatedBy": null } ]
{equipmentId}/DISCARD_UPDATE via WebSocket. Resposta 200: o Descarte criado — mesma estrutura dos itens de GET /discards/:productionId.| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| productionId | string (UUID) | obrigatório | Produção onde ocorreu o descarte |
| total | integer (≥ 1) | obrigatório | Quantidade descartada |
| discardMotiveId | string (UUID) | obrigatório | Motivo do descarte |
| equipmentId | string (UUID) | opcional | Equipamento de origem |
| metricId | string (UUID) | opcional | Unidade de medida do descarte |
| multiplier | number | opcional | Multiplicador de conversão |
| observation | string | opcional | Observação |
{ count, rows }. Aceita name como filtro, além de pagination/order.{ "count": 6, "rows": [ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1f90", "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00", "name": "Falha de impressão", "active": true, "createdAt": "2025-01-15T10:00:00.000Z", "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55", "updatedAt": null, "updatedBy": null } ] }
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| name | string | obrigatório | Nome do motivo |
| active | boolean | opcional | Status inicial |
name e active opcionais. Resposta 200: o Motivo atualizado.tzOffset é o offset de fuso em minutos (padrão −180 = UTC−3).[ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b10", "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00", "name": "Turno A", "startTime": 360, "duration": 480, "tzOffset": -180, "firstShift": true, "active": true, "createdAt": "2025-01-15T10:00:00.000Z", "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55", "updatedAt": null, "updatedBy": null } ]
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| name | string | obrigatório | Nome do turno, ex. Turno A |
| startTime | integer (0–1439) | obrigatório | Início em minutos — 360 = 06:00 |
| duration | integer (≥ 1) | obrigatório | Duração em minutos — 480 = 8h |
| firstShift | boolean | opcional | Marca o turno que abre o dia produtivo |
{ "name": "Turno A", "startTime": 360, "duration": 480, "firstShift": true }
[ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b", "name": "Impressora Flexo 01", "…demais campos do Equipamento…": "…", "equipmentShiftPlan": [ { "id": "01932e4a-…", "equipmentId": "01932e4a-…", "shiftId": "01932e4a-…", "dayOfWeek": 1, "active": true, "shift": { "…objeto Turno completo…" } } ], "equipmentStopPlan": [ { "id": "01932e4a-…", "equipmentId": "01932e4a-…", "stopMotiveId": "01932e4a-…", "dayOfWeek": 1, "startTime": 720, "duration": 60, "tzOffset": -180, "active": true, "stopMotive": { "…objeto Motivo de Parada completo…" } } ] } ]
dayOfWeek vai de 0 (domingo) a 6 (sábado); horários em minutos do dia. Resposta 200: o plano criado com as grades persistidas.| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| equipmentIds | string[] (UUID) | obrigatório | Equipamentos cobertos pelo plano |
| shiftPlan | object[] | obrigatório | Itens { dayOfWeek, shiftId } |
| stopPlan | object[] | obrigatório | Itens { dayOfWeek, startTime, duration, motiveId } |
{ "equipmentIds": ["01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b"], "shiftPlan": [ { "dayOfWeek": 1, "shiftId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b10" } ], "stopPlan": [ { "dayOfWeek": 1, "startTime": 720, "duration": 60, "motiveId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c20" } ] }
id, name, active.[ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d10", "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00", "name": "Supervisor", "createdAt": "2025-01-15T10:00:00.000Z", "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55", "updatedAt": null, "updatedBy": null } ]
[ "EQUIPMENT_READ", "PRODUCTION_WRITE", "STOP_CLASSIFY", "…" ]
{ "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d10", "companyId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b00", "name": "Supervisor", "createdAt": "2025-01-15T10:00:00.000Z", "createdBy": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d55", "updatedAt": null, "updatedBy": null, "permissions": ["EQUIPMENT_READ", "PRODUCTION_WRITE", "…"] }
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| name | string | obrigatório | Nome do perfil |
| permissions | enum[] | opcional | Permissões do catálogo /profiles/permissions |
name, active.{ "count": 12, "rows": [ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b", "name": "João Operador", "login": "operador01", "email": "joao@empresa.com", "active": true, "userProfile": { "userId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b", "profileId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1d10", "profile": { "id": "01932e4a-…", "name": "Operador", "…": "…" } } } ] }
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
| name | string | obrigatório | Nome completo |
| login | string | obrigatório | Login único |
| password | string (mín 6) | obrigatório | Senha inicial |
| userProfileId | string (UUID) | obrigatório | Perfil de acesso MES |
| string (email) | opcional |
name, login, password, email, userProfileId e equipmentIds[] (restrição de equipamentos visíveis ao usuário). Resposta 200: o usuário atualizado.active: true.active: false.COUNT_UPDATE, STOP_CREATE, etc.).| Parâmetro | Tipo | Status | Descrição |
|---|---|---|---|
| id | string (UUID) | obrigatório | ID do equipamento |
{ "serverTime": "2025-06-12T13:12:00.000Z", "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b01", "equipmentId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b", "name": "OP-2025-0612", "startTime": "2025-06-12T06:04:12.000Z", "lastPlay": "2025-06-12T13:10:00.000Z", "pastExecutionTime": 18450, "nominalCapacity": 1200, "plannedQuantity": 10000, "plannedStart": "2025-06-12T06:00:00.000Z", "plannedEnd": "2025-06-12T22:00:00.000Z", "cycleTime": 3.0, "product": { "id": "01932e4a-…", "code": "ROT-2L-001", "name": "Rótulo Refrigerante 2L", "metric": { "code": "PÇ", "name": "Peças" } }, "equipment": { "collectorMac": "A0:B1:C2:D3:E4:F5", "hourmeter": 152340 }, "equipmentProduct": { "multiplierFactor": 4, "divideFactor": 1, "microStopInit": 10, "microStopEnd": 120, "visualAlert": true, "soundAlert": false, "firstAlert": 30, "secondAlert": 90, "perBar": null }, "counters": [ { "hour": "2025-06-12T13:00:00.000Z", "count": 1180 } ], "slices": [ "…fatias de produção do turno…" ], "stops": [ "…paradas da produção corrente…" ], "discards": [ "…descartes da produção corrente…" ] }
Retorna null quando o equipamento não tem produção corrente.
ids[] na query para restringir os equipamentos; também disponível como POST /dashboards/manager com ids no body para listas grandes. A restrição de equipamentos do JWT é aplicada automaticamente.[ { "serverTime": "2025-06-12T13:12:00.000Z", "…produção corrente do equipamento (mesmos campos do dashboard operacional)…": "…", "stops": [ { "id": "01932e4a-…", "startTime": "2025-06-12T10:00:00.000Z", "endTime": "2025-06-12T10:18:00.000Z", "motiveId": "01932e4a-…", "stopMotive": { "id": "01932e4a-…", "name": "Troca de bobina", "color": "#F59E0B", "type": "PLANNED", "isSetup": true, "isMaintenance": false } } ], "discards": [ "…descartes da produção corrente…" ] } ]
FORCE_CLASSIFY, PLAN_END_SETUP, PROD_START_IN_SETUP, ENABLE_ANDONS, SPEED_UNIT, OPERATIONAL_DASH, entre outras.[ { "companyId": "01932e4a-…", "key": "FORCE_CLASSIFY", "value": "true" }, { "companyId": "01932e4a-…", "key": "SPEED_UNIT", "value": "pçs/h" } ]
Todas as rotas são GET, exigem JWT e compartilham o mesmo conjunto de filtros de período.
start e
end são obrigatórios (ISO 8601);
shiftIds[],
equipmentIds[],
productIds[] e
productionIds[] são opcionais.
Respostas são cacheadas em Redis com TTL por rota.
| Parâmetro | Tipo | Status | Descrição |
|---|---|---|---|
| start | string (ISO date) | obrigatório | Início do período |
| end | string (ISO date) | obrigatório | Fim do período |
| shiftIds[] | string[] (UUID) | opcional | Turnos |
| equipmentIds[] | string[] (UUID) | opcional | Equipamentos |
| productIds[] | string[] (UUID) | opcional | Produtos |
| productionIds[] | string[] (UUID) | opcional | Produções |
{ "executionTime": 25340, "nominalCapacity": 1200, "doneQuantity": 7850, "discardedQuantity": 112, "unclassifiedStopTime": 420, "plannedStopTime": 3600, "unplannedStopTime": 1140 }
counters (contagens de produção),
slices (fatias de tempo em produção) e
stops (paradas).
Base dos gráficos de linha do dia produtivo. Usa os mesmos filtros de /oee.
{ "counters": [ { "total": 1180, "hour": 6 }, { "total": 1240, "hour": 7 } ], "slices": [ { "hour": 0, "duration": 0, "nominalCapacity": 0 }, { "hour": 6, "duration": 3355, "nominalCapacity": 1118 } ], "stops": [ { "hour": 0, "planned": 0, "unplanned": 0, "unclassified": 0 }, { "hour": 10, "planned": 1080, "unplanned": 420, "unclassified": 0 } ] }
counters traz apenas as horas com produção;
slices e stops sempre
retornam as 24 horas (índice hour 0–23), com durações em segundos.
[ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c07", "name": "Quebra mecânica", "type": "UNPLANNED", "duration": 4230 }, { "id": null, "name": null, "type": "UNCLASSIFIED", "duration": 860 } ]
Paradas sem classificação aparecem com id/name nulos e
type: "UNCLASSIFIED".
[ { "equipmentId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b", "equipment": "Impressora Flexo 01", "productionId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1b01", "production": "OP-2025-0612", "productId": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1c30", "product": "Rótulo Refrigerante 2L", "planned": 10000, "value": 12500.00, "observation": "Prioridade alta", "doneQuantity": 7850, "discardedQuantity": 112, "executionTime": 25340, "nominalCapacity": 1200, "unclassifiedStopTime": 420, "plannedStopTime": 3600, "unplannedStopTime": 1140 } ]
Tempos em segundos. Produções com status PLANNED ou
CANCELED não entram no resultado.
isMaintenance): MTTF, MTTR e MTBF em horas,
consolidados, por equipamento e por falha individual. Usa os mesmos filtros de /oee.
{ "summary": { "mttf": 46.5, "mttr": 1.2, "mtbf": 47.7, "totalFailures": 14 }, "byEquipment": [ { "name": "Impressora Flexo 01", "mttf": 52.1, "mttr": 0.9, "mtbf": 53.0 } ], "failures": [ { "id": "01932e4a-bfc0-7000-8f6a-3c2d5e4f1a2b", "equipment": "Impressora Flexo 01", "failedAt": "2025-06-10T14:22:31.000Z", "repairedAt": "2025-06-10T15:10:05.000Z", "mttf": 38.4, "mttr": 0.79, "cause": "Quebra mecânica" } ] }