123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- /**
- * 订单清理脚本
- * 用于手动清理 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);
- });
|