/** * 订单清理脚本 * 用于手动清理 Pacifica 账户的开放订单 * * 使用方法: * npm run cleanup-orders # 清理所有账户的订单 * npm run cleanup-orders -- --dry # 干运行模式,只显示要清理的订单 */ import { ConfigManager } from '../src/core/ConfigManager'; import { AccountManager } from '../src/services/AccountManager'; import { OrderCleanupService, CleanupOptions } from '../src/services/OrderCleanupService'; import Logger from '../src/utils/Logger'; async function main() { const logger = Logger.getInstance(); const configManager = ConfigManager.getInstance(); const accountManager = new AccountManager(); const cleanupService = new OrderCleanupService(); try { console.log('\n🧹 Pacifica 订单清理工具'); console.log('==========================================\n'); // 检查是否为干运行模式 const isDryRun = process.argv.includes('--dry') || process.argv.includes('-d'); if (isDryRun) { console.log('⚠️ 干运行模式:只显示要清理的订单,不实际执行\n'); } // 初始化账户管理器 logger.info('初始化账户管理器...'); await accountManager.initialize(); const accounts = accountManager.getActiveAccounts(); if (accounts.length === 0) { console.log('❌ 没有找到活跃账户'); process.exit(1); } console.log(`📊 找到 ${accounts.length} 个活跃账户\n`); // 为每个账户初始化清理服务 for (const account of accounts) { cleanupService.initializeAccount(account); console.log(`✅ 账户已加载: ${account.getName()} (${account.getId()})`); } console.log('\n------------------------------------------\n'); // 清理选项 const cleanupOptions: CleanupOptions = { cleanAll: true, // 清理所有订单 includeReduceOnly: false, // 不清理 reduce_only 订单 mode: 'selective', // 逐个取消 dryRun: isDryRun }; console.log('🔧 清理选项:', { 清理所有订单: cleanupOptions.cleanAll, 包含ReduceOnly订单: cleanupOptions.includeReduceOnly, 模式: cleanupOptions.mode, 干运行: cleanupOptions.dryRun }); console.log('\n------------------------------------------\n'); // 执行清理 const startTime = Date.now(); console.log('🚀 开始清理订单...\n'); const results = await cleanupService.cleanupMultipleAccounts( accounts, cleanupOptions ); const duration = Date.now() - startTime; // 汇总结果 console.log('\n=========================================='); console.log('📊 清理结果汇总'); console.log('==========================================\n'); let totalOrders = 0; let totalCancelled = 0; let totalFailed = 0; for (const [accountId, result] of results.entries()) { const account = accounts.find(acc => acc.getId() === accountId); const accountName = account ? account.getName() : accountId; totalOrders += result.totalOrders; totalCancelled += result.cancelledOrders; totalFailed += result.failedOrders; console.log(`📌 ${accountName} (${accountId})`); console.log(` 开放订单: ${result.totalOrders}`); console.log(` 需要清理: ${result.ordersToClean}`); if (isDryRun) { console.log(` 将要取消: ${result.ordersToClean}`); } else { console.log(` 已取消: ${result.cancelledOrders}`); console.log(` 失败: ${result.failedOrders}`); } console.log(` 耗时: ${result.duration}ms\n`); // 如果有错误,显示详情 if (result.errors.length > 0) { console.log(` ⚠️ 错误详情:`); result.errors.slice(0, 3).forEach(error => { console.log(` 订单ID ${error.orderId}: ${error.error}`); }); if (result.errors.length > 3) { console.log(` ... 还有 ${result.errors.length - 3} 个错误`); } console.log(''); } } console.log('=========================================='); console.log('🎯 总计'); console.log('=========================================='); console.log(`账户数: ${accounts.length}`); console.log(`总订单数: ${totalOrders}`); if (isDryRun) { console.log(`将要取消: ${totalCancelled}`); } else { console.log(`成功取消: ${totalCancelled}`); console.log(`取消失败: ${totalFailed}`); } console.log(`总耗时: ${duration}ms`); console.log('==========================================\n'); if (isDryRun) { console.log('💡 提示: 移除 --dry 参数以实际执行清理\n'); } else if (totalCancelled > 0) { console.log('✅ 订单清理完成!\n'); } else if (totalOrders === 0) { console.log('✅ 没有需要清理的订单\n'); } else { console.log('⚠️ 清理完成,但有部分订单清理失败\n'); } // 清理资源 await accountManager.shutdown(); await cleanupService.shutdown(); process.exit(0); } catch (error) { logger.error('订单清理失败', { error: error instanceof Error ? error.message : '未知错误' }); console.error('\n❌ 订单清理失败:', error instanceof Error ? error.message : '未知错误'); process.exit(1); } } // 运行脚本 main().catch(error => { console.error('脚本执行失败:', error); process.exit(1); });