#!/usr/bin/env python3 """ 自动修复数据库中的异常订单 """ import sys import os # 添加项目路径 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from app.services.db_service import db_service from app.models.paper_trading import PaperOrder, OrderStatus from datetime import datetime def fix_abnormal_orders(): """修复异常订单""" db = db_service.get_session() print("=" * 80) print("异常订单自动修复") print("=" * 80) print() fixed_count = 0 # 1. 删除 OPEN 状态但 filled_price 为 0 或 None 的订单 print("【1】清理 OPEN 状态但成交价无效的订单...") invalid_orders = db.query(PaperOrder).filter( PaperOrder.status == OrderStatus.OPEN, (PaperOrder.filled_price == None) | (PaperOrder.filled_price == 0) ).all() if invalid_orders: print(f" 发现 {len(invalid_orders)} 个异常订单:") for order in invalid_orders: print(f" - {order.order_id} | {order.symbol} | {order.side.value} | 成交价: {order.filled_price}") # 确认删除 confirm = input("\n 确认删除这些订单? (yes/no): ") if confirm.lower() == 'yes': for order in invalid_orders: db.delete(order) fixed_count += 1 db.commit() print(f" ✅ 已删除 {len(invalid_orders)} 个异常订单") else: print(" ⏭️ 跳过删除") else: print(" ✅ 无异常订单") print() # 2. 修复 PENDING 状态但有成交价的订单 print("【2】修复 PENDING 状态但有成交价的订单...") pending_orders = db.query(PaperOrder).filter( PaperOrder.status == OrderStatus.PENDING, PaperOrder.filled_price != None, PaperOrder.filled_price > 0 ).all() if pending_orders: print(f" 发现 {len(pending_orders)} 个状态不一致的订单:") for order in pending_orders: print(f" - {order.order_id} | {order.symbol} | 状态: PENDING → OPEN") confirm = input("\n 确认修复这些订单? (yes/no): ") if confirm.lower() == 'yes': for order in pending_orders: order.status = OrderStatus.OPEN fixed_count += 1 db.commit() print(f" ✅ 已修复 {len(pending_orders)} 个订单") else: print(" ⏭️ 跳过修复") else: print(" ✅ 无异常订单") print() # 3. 删除无用的测试数据(可选) print("【3】检查是否有测试数据需要清理...") test_orders = db.query(PaperOrder).filter( PaperOrder.symbol.like('%TEST%') ).count() if test_orders > 0: print(f" 发现 {test_orders} 个测试订单") confirm = input(" 是否删除测试数据? (yes/no): ") if confirm.lower() == 'yes': db.execute("DELETE FROM paper_orders WHERE symbol LIKE '%TEST%'") db.commit() print(f" ✅ 已删除测试数据") else: print(" ✅ 无测试数据") print() print("=" * 80) print(f"修复完成!共处理 {fixed_count} 个异常订单") print("=" * 80) db.close() if __name__ == "__main__": fix_abnormal_orders()