| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- import fs from "node:fs";
- import path from "node:path";
- import { fileURLToPath } from "node:url";
- import { AtendimentoAvaliacao } from "../src/models/AtendimentoAvaliacao.model.js";
- import { AtendimentoMensagem } from "../src/models/AtendimentoMensagem.model.js";
- import { contarPendentes } from "../src/services/atendimentoAvaliacaoService.js";
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
- const APLICAR = process.argv.includes("--apply");
- const limiteIdx = process.argv.indexOf("--limite");
- const LIMITE = limiteIdx > -1 ? Number(process.argv[limiteIdx + 1]) : null;
- const SENTINELS = ["__processando__", "__erro__"];
- async function buscarCandidatos() {
- const rows = await AtendimentoAvaliacao.query()
- .where("atendimento_avaliacoes.Avaliavel", true)
- .join(AtendimentoMensagem.tableName + " as m", "m.AtendimentoId", "atendimento_avaliacoes.AtendimentoId")
- .whereIn("m.Transcricao", SENTINELS)
- .whereRaw("atendimento_avaliacoes.UltimaMensagemId >= m.Id")
- .select(
- "atendimento_avaliacoes.AtendimentoId",
- "atendimento_avaliacoes.ScoreAtendente",
- "atendimento_avaliacoes.UltimaMensagemId"
- )
- .distinct("atendimento_avaliacoes.AtendimentoId")
- .orderBy("atendimento_avaliacoes.AtendimentoId");
- return rows;
- }
- async function main() {
- const candidatos = await buscarCandidatos();
- const alvos = LIMITE ? candidatos.slice(0, LIMITE) : candidatos;
- console.log(`[backfill-transcricao-sentinel] ${candidatos.length} atendimentos avaliados com sentinel no texto.`);
- console.log(`[backfill-transcricao-sentinel] ${alvos.length} avaliações serão resetadas para pendente${LIMITE ? ` (--limite ${LIMITE})` : ""}.`);
- if (!APLICAR) {
- console.log("[backfill-transcricao-sentinel] dry-run (nenhuma alteração feita). Use --apply para executar.");
- process.exit(0);
- }
- if (alvos.length === 0) {
- console.log("[backfill-transcricao-sentinel] nada para reavaliar.");
- process.exit(0);
- }
- const backupDir = path.resolve(__dirname, "logs");
- fs.mkdirSync(backupDir, { recursive: true });
- const backupPath = path.join(backupDir, `backfill-transcricao-sentinel-${new Date().toISOString().replace(/[:.]/g, "-")}.json`);
- fs.writeFileSync(backupPath, JSON.stringify(alvos, null, 2));
- console.log(`[backfill-transcricao-sentinel] backup dos valores antigos salvo em ${backupPath}`);
- const ids = alvos.map((a) => a.AtendimentoId);
- const pendentesAntes = await contarPendentes();
- await AtendimentoAvaliacao.query().whereIn("AtendimentoId", ids).patch({ UltimaMensagemId: null });
- const pendentesDepois = await contarPendentes();
- console.log(`[backfill-transcricao-sentinel] resetados ${ids.length} — fila de pendentes ${pendentesAntes} -> ${pendentesDepois}.`);
- console.log("[backfill-transcricao-sentinel] pronto. Agora rode scripts/avaliarTudo.js para drenar a fila.");
- process.exit(0);
- }
- main().catch((e) => {
- console.error("[backfill-transcricao-sentinel] falha:", e.message);
- process.exit(1);
- });
|