fix-delay-scheduler.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #!/usr/bin/env node
  2. /**
  3. * 修复延迟调度器脚本
  4. * 1. 检查当前延迟任务状态
  5. * 2. 手动执行超时任务
  6. * 3. 提供修复建议
  7. */
  8. const { DataSource } = require('typeorm');
  9. const { DelaySchedulerService } = require('./packages/feie-printer-module-mt/build-simple.cjs');
  10. async function main() {
  11. console.log('=== 延迟调度器修复脚本 ===\n');
  12. // 1. 检查数据库中的延迟任务
  13. console.log('1. 检查数据库中的延迟任务...');
  14. const dataSource = new DataSource({
  15. type: 'postgres',
  16. host: '127.0.0.1',
  17. port: 5432,
  18. username: 'postgres',
  19. password: '',
  20. database: 'postgres',
  21. synchronize: false,
  22. logging: false
  23. });
  24. try {
  25. await dataSource.initialize();
  26. console.log('数据库连接成功\n');
  27. // 查询延迟任务
  28. const tasks = await dataSource.query(`
  29. SELECT
  30. task_id,
  31. order_id,
  32. print_status,
  33. scheduled_at,
  34. created_at,
  35. EXTRACT(EPOCH FROM (NOW() - scheduled_at)) as seconds_late
  36. FROM feie_print_task_mt
  37. WHERE print_status IN ('DELAYED', 'PENDING')
  38. ORDER BY scheduled_at
  39. `);
  40. console.log(`找到 ${tasks.length} 个延迟任务:`);
  41. tasks.forEach((task, index) => {
  42. console.log(` ${index + 1}. ${task.task_id} - 订单: ${task.order_id}`);
  43. console.log(` 状态: ${task.print_status}, 计划时间: ${task.scheduled_at}`);
  44. console.log(` 已超时: ${Math.round(task.seconds_late)} 秒\n`);
  45. });
  46. if (tasks.length === 0) {
  47. console.log('没有找到延迟任务,无需修复');
  48. return;
  49. }
  50. // 2. 创建调度器并手动处理任务
  51. console.log('2. 创建调度器并手动处理任务...');
  52. const feieConfig = {
  53. baseUrl: 'https://api.feieyun.cn/Api/Open/',
  54. user: '',
  55. ukey: '',
  56. timeout: 10000,
  57. maxRetries: 3
  58. };
  59. // 获取所有租户ID
  60. const tenantIds = await dataSource.query(`
  61. SELECT DISTINCT tenant_id
  62. FROM feie_print_task_mt
  63. WHERE print_status IN ('DELAYED', 'PENDING')
  64. ORDER BY tenant_id
  65. `);
  66. for (const row of tenantIds) {
  67. const tenantId = row.tenant_id;
  68. console.log(`\n处理租户 ${tenantId} 的任务:`);
  69. const scheduler = new DelaySchedulerService(dataSource, feieConfig, tenantId);
  70. // 手动处理任务
  71. const result = await scheduler.triggerManualProcess(tenantId);
  72. console.log(` 结果: ${result.message}`);
  73. // 启动调度器(如果未运行)
  74. try {
  75. await scheduler.start();
  76. console.log(` 调度器已启动`);
  77. } catch (error) {
  78. if (error.message.includes('已经在运行中')) {
  79. console.log(` 调度器已在运行中`);
  80. } else {
  81. console.log(` 启动调度器失败: ${error.message}`);
  82. }
  83. }
  84. }
  85. // 3. 验证修复结果
  86. console.log('\n3. 验证修复结果...');
  87. const remainingTasks = await dataSource.query(`
  88. SELECT COUNT(*) as count
  89. FROM feie_print_task_mt
  90. WHERE print_status IN ('DELAYED', 'PENDING')
  91. AND scheduled_at <= NOW()
  92. `);
  93. console.log(`剩余未处理的延迟任务: ${remainingTasks[0].count} 个`);
  94. if (remainingTasks[0].count > 0) {
  95. console.log('\n⚠️ 警告: 仍有未处理的延迟任务');
  96. console.log('可能原因:');
  97. console.log(' 1. 打印机配置问题');
  98. console.log(' 2. 飞鹅API连接失败');
  99. console.log(' 3. 订单状态检查失败');
  100. } else {
  101. console.log('\n✅ 所有延迟任务已处理完成');
  102. }
  103. } catch (error) {
  104. console.error('修复过程中发生错误:', error);
  105. } finally {
  106. if (dataSource.isInitialized) {
  107. await dataSource.destroy();
  108. }
  109. }
  110. console.log('\n=== 修复脚本执行完成 ===');
  111. }
  112. // 执行修复
  113. main().catch(console.error);