| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #!/usr/bin/env node
- /**
- * 简单修复延迟任务脚本
- * 直接使用数据库查询和更新
- */
- const { Client } = require('pg');
- async function main() {
- console.log('=== 延迟任务简单修复脚本 ===\n');
- const client = new Client({
- host: '127.0.0.1',
- port: 5432,
- user: 'postgres',
- password: '',
- database: 'postgres'
- });
- try {
- await client.connect();
- console.log('数据库连接成功\n');
- // 1. 检查延迟任务
- console.log('1. 检查延迟任务状态...');
- const tasksResult = await client.query(`
- SELECT
- task_id,
- order_id,
- print_status,
- scheduled_at,
- EXTRACT(EPOCH FROM (NOW() - scheduled_at)) as seconds_late
- FROM feie_print_task_mt
- WHERE print_status IN ('DELAYED', 'PENDING')
- AND scheduled_at <= NOW()
- ORDER BY scheduled_at
- `);
- const tasks = tasksResult.rows;
- console.log(`找到 ${tasks.length} 个超时的延迟任务:`);
- tasks.forEach((task, index) => {
- console.log(` ${index + 1}. ${task.task_id} - 订单: ${task.order_id}`);
- console.log(` 状态: ${task.print_status}, 计划时间: ${task.scheduled_at}`);
- console.log(` 已超时: ${Math.round(task.seconds_late)} 秒\n`);
- });
- if (tasks.length === 0) {
- console.log('没有找到超时的延迟任务');
- return;
- }
- // 2. 检查订单状态
- console.log('2. 检查订单状态...');
- for (const task of tasks) {
- if (!task.order_id) continue;
- const orderResult = await client.query(`
- SELECT pay_state, state
- FROM order_mt
- WHERE id = $1 AND tenant_id = 1
- `, [task.order_id]);
- if (orderResult.rows.length === 0) {
- console.log(` 订单 ${task.order_id} 不存在,标记任务为取消`);
- await client.query(`
- UPDATE feie_print_task_mt
- SET print_status = 'CANCELLED',
- updated_at = NOW(),
- cancel_reason = 'ORDER_NOT_FOUND'
- WHERE task_id = $1
- `, [task.task_id]);
- } else {
- const order = orderResult.rows[0];
- console.log(` 订单 ${task.order_id}: 支付状态=${order.pay_state}, 订单状态=${order.state}`);
- // 检查是否已退款 (pay_state = 3) 或订单关闭 (state = 5)
- if (order.pay_state === 3 || order.state === 5) {
- console.log(` 订单 ${task.order_id} 已退款/关闭,取消打印任务`);
- await client.query(`
- UPDATE feie_print_task_mt
- SET print_status = 'CANCELLED',
- updated_at = NOW(),
- cancel_reason = 'REFUND'
- WHERE task_id = $1
- `, [task.task_id]);
- } else {
- console.log(` 订单 ${task.order_id} 正常,标记任务为失败(模拟打印失败)`);
- await client.query(`
- UPDATE feie_print_task_mt
- SET print_status = 'FAILED',
- updated_at = NOW(),
- error_message = '手动修复:任务超时未执行'
- WHERE task_id = $1
- `, [task.task_id]);
- }
- }
- }
- // 3. 验证结果
- console.log('\n3. 验证修复结果...');
- const remainingResult = await client.query(`
- SELECT COUNT(*) as count
- FROM feie_print_task_mt
- WHERE print_status IN ('DELAYED', 'PENDING')
- AND scheduled_at <= NOW()
- `);
- console.log(`剩余未处理的延迟任务: ${remainingResult.rows[0].count} 个`);
- if (remainingResult.rows[0].count > 0) {
- console.log('\n⚠️ 仍有未处理的延迟任务,建议:');
- console.log(' 1. 检查调度器是否启动');
- console.log(' 2. 检查飞鹅打印机配置');
- console.log(' 3. 检查网络连接');
- } else {
- console.log('\n✅ 所有超时延迟任务已处理');
- }
- } catch (error) {
- console.error('修复过程中发生错误:', error);
- } finally {
- await client.end();
- }
- console.log('\n=== 修复脚本执行完成 ===');
- }
- // 执行修复
- main().catch(console.error);
|