reavaliarComTemperatureZero.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import "dotenv/config";
  2. import { Atendimento } from "../src/models/Atendimento.model.js";
  3. import { avaliarAtendimento } from "../src/services/atendimentoAvaliacaoService.js";
  4. const limiteIdx = process.argv.indexOf("--limite");
  5. const LIMITE = limiteIdx > -1 ? Number(process.argv[limiteIdx + 1]) : null;
  6. const janelaIdx = process.argv.indexOf("--janela");
  7. const JANELA = janelaIdx > -1 ? process.argv[janelaIdx + 1] : null;
  8. const [JANELA_INICIO, JANELA_FIM] = JANELA ? JANELA.split("-").map(Number) : [null, null];
  9. const desdeIdx = process.argv.indexOf("--desde");
  10. const DESDE = desdeIdx > -1 ? process.argv[desdeIdx + 1] : null;
  11. function dentroDaJanela(inicioHora, fimHora) {
  12. const horaSp = Number(
  13. new Intl.DateTimeFormat("en-US", { timeZone: "America/Sao_Paulo", hour: "2-digit", hourCycle: "h23" }).format(new Date())
  14. );
  15. if (inicioHora <= fimHora) return horaSp >= inicioHora && horaSp < fimHora;
  16. return horaSp >= inicioHora || horaSp < fimHora;
  17. }
  18. async function aguardarJanela(inicioHora, fimHora) {
  19. let avisado = false;
  20. while (!dentroDaJanela(inicioHora, fimHora)) {
  21. if (!avisado) {
  22. console.log(`[reavaliar-temp0] fora da janela (${inicioHora}h-${fimHora}h) — pausado até reabrir`);
  23. avisado = true;
  24. }
  25. await new Promise((r) => setTimeout(r, 5 * 60 * 1000));
  26. }
  27. if (avisado) console.log("[reavaliar-temp0] janela reaberta, retomando");
  28. }
  29. async function main() {
  30. let query = Atendimento.query()
  31. .join("atendimento_avaliacoes as av", "av.AtendimentoId", "atendimentos.Id")
  32. .where("av.Avaliavel", true)
  33. .select("atendimentos.Id", "atendimentos.Codigo")
  34. .orderBy("atendimentos.Abertura", "desc");
  35. if (DESDE) query = query.where("av.UpdatedAt", "<", DESDE);
  36. if (LIMITE) query = query.limit(LIMITE);
  37. const alvos = await query;
  38. const total = alvos.length;
  39. console.log(`[reavaliar-temp0] iniciando: ${total} atendimentos`);
  40. let processados = 0;
  41. let erros = 0;
  42. const t0 = Date.now();
  43. for (const a of alvos) {
  44. if (JANELA) await aguardarJanela(JANELA_INICIO, JANELA_FIM);
  45. try {
  46. await avaliarAtendimento(a.Id);
  47. } catch (err) {
  48. erros += 1;
  49. console.warn(`[reavaliar-temp0] erro em ${a.Codigo}: ${err.message}`);
  50. } finally {
  51. processados += 1;
  52. if (processados % 25 === 0 || processados === total) {
  53. const s = Math.round((Date.now() - t0) / 1000);
  54. const ritmo = s / processados;
  55. const restamMin = Math.round(((total - processados) * ritmo) / 60);
  56. console.log(
  57. `[reavaliar-temp0] progresso: ${processados}/${total} | erros: ${erros} | ${Math.round(s / 60)}min decorridos | ~${restamMin}min restantes`
  58. );
  59. }
  60. }
  61. }
  62. console.log(`[reavaliar-temp0] concluído: ${processados}/${total} | erros: ${erros} | ${Math.round((Date.now() - t0) / 60000)}min total`);
  63. process.exit(0);
  64. }
  65. main().catch((err) => {
  66. console.error("[reavaliar-temp0] falha fatal:", err);
  67. process.exit(1);
  68. });