| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- import "dotenv/config";
- import { Atendimento } from "../src/models/Atendimento.model.js";
- import { avaliarAtendimento } from "../src/services/atendimentoAvaliacaoService.js";
- const limiteIdx = process.argv.indexOf("--limite");
- const LIMITE = limiteIdx > -1 ? Number(process.argv[limiteIdx + 1]) : null;
- const janelaIdx = process.argv.indexOf("--janela");
- const JANELA = janelaIdx > -1 ? process.argv[janelaIdx + 1] : null;
- const [JANELA_INICIO, JANELA_FIM] = JANELA ? JANELA.split("-").map(Number) : [null, null];
- function dentroDaJanela(inicioHora, fimHora) {
- const horaSp = Number(
- new Intl.DateTimeFormat("en-US", { timeZone: "America/Sao_Paulo", hour: "2-digit", hourCycle: "h23" }).format(new Date())
- );
- if (inicioHora <= fimHora) return horaSp >= inicioHora && horaSp < fimHora;
- return horaSp >= inicioHora || horaSp < fimHora;
- }
- async function aguardarJanela(inicioHora, fimHora) {
- let avisado = false;
- while (!dentroDaJanela(inicioHora, fimHora)) {
- if (!avisado) {
- console.log(`[reavaliar-temp0] fora da janela (${inicioHora}h-${fimHora}h) — pausado até reabrir`);
- avisado = true;
- }
- await new Promise((r) => setTimeout(r, 5 * 60 * 1000));
- }
- if (avisado) console.log("[reavaliar-temp0] janela reaberta, retomando");
- }
- async function main() {
- let query = Atendimento.query()
- .join("atendimento_avaliacoes as av", "av.AtendimentoId", "atendimentos.Id")
- .where("av.Avaliavel", true)
- .select("atendimentos.Id", "atendimentos.Codigo")
- .orderBy("atendimentos.Abertura", "desc");
- if (LIMITE) query = query.limit(LIMITE);
- const alvos = await query;
- const total = alvos.length;
- console.log(`[reavaliar-temp0] iniciando: ${total} atendimentos`);
- let processados = 0;
- let erros = 0;
- const t0 = Date.now();
- for (const a of alvos) {
- if (JANELA) await aguardarJanela(JANELA_INICIO, JANELA_FIM);
- try {
- await avaliarAtendimento(a.Id);
- } catch (err) {
- erros += 1;
- console.warn(`[reavaliar-temp0] erro em ${a.Codigo}: ${err.message}`);
- } finally {
- processados += 1;
- if (processados % 25 === 0 || processados === total) {
- const s = Math.round((Date.now() - t0) / 1000);
- const ritmo = s / processados;
- const restamMin = Math.round(((total - processados) * ritmo) / 60);
- console.log(
- `[reavaliar-temp0] progresso: ${processados}/${total} | erros: ${erros} | ${Math.round(s / 60)}min decorridos | ~${restamMin}min restantes`
- );
- }
- }
- }
- console.log(`[reavaliar-temp0] concluído: ${processados}/${total} | erros: ${erros} | ${Math.round((Date.now() - t0) / 60000)}min total`);
- process.exit(0);
- }
- main().catch((err) => {
- console.error("[reavaliar-temp0] falha fatal:", err);
- process.exit(1);
- });
|