fix: 更新 AsterRestClient 和 AsterGateway 中的订单处理逻辑,支持字符串类型的订单 ID

This commit is contained in:
discountry
2025-09-27 23:23:53 +08:00
parent 7e2d312fe3
commit 46c0551133
+18 -13
View File
@@ -278,8 +278,14 @@ export class AsterRestClient {
async cancelOrders(params: { symbol: string; orderIdList?: Array<number | string>; origClientOrderIdList?: string[] }): Promise<AsterOrder[]> { async cancelOrders(params: { symbol: string; orderIdList?: Array<number | string>; origClientOrderIdList?: string[] }): Promise<AsterOrder[]> {
const payload: Record<string, unknown> = { symbol: params.symbol }; const payload: Record<string, unknown> = { symbol: params.symbol };
if (params.orderIdList) payload.orderIdList = JSON.stringify(params.orderIdList.map((id) => Number(id))); if (params.orderIdList?.length) {
if (params.origClientOrderIdList) payload.origClientOrderIdList = JSON.stringify(params.origClientOrderIdList); payload.orderIdList = `[${params.orderIdList
.map((id) => (typeof id === "string" ? id.trim() : String(id)))
.join(",")}]`;
}
if (params.origClientOrderIdList?.length) {
payload.origClientOrderIdList = JSON.stringify(params.origClientOrderIdList);
}
const response = await this.signedRequest<any[]>({ path: "/fapi/v1/batchOrders", method: "DELETE", params: payload }); const response = await this.signedRequest<any[]>({ path: "/fapi/v1/batchOrders", method: "DELETE", params: payload });
return response.map(toOrderFromRest); return response.map(toOrderFromRest);
} }
@@ -706,13 +712,15 @@ function updateAccountSnapshot(snapshot: AsterAccountSnapshot | null, event: { e
return next; return next;
} }
function mergeOrderSnapshot(map: Map<number, AsterOrder>, order: AsterOrder): void { function mergeOrderSnapshot(map: Map<string, AsterOrder>, order: AsterOrder): void {
const numericId = typeof order.orderId === "number" ? order.orderId : Number(order.orderId); const rawId = order.orderId;
if (!Number.isFinite(numericId)) return; if (rawId === undefined || rawId === null) return;
const key = String(rawId);
if (!key) return;
if (FINAL_ORDER_STATUSES.has(order.status)) { if (FINAL_ORDER_STATUSES.has(order.status)) {
map.delete(numericId); map.delete(key);
} else { } else {
map.set(numericId, { ...order, orderId: numericId }); map.set(key, { ...order, orderId: key });
} }
} }
@@ -722,7 +730,7 @@ export class AsterGateway {
private readonly userStream: AsterUserStream; private readonly userStream: AsterUserStream;
private accountSnapshot: AsterAccountSnapshot | null = null; private accountSnapshot: AsterAccountSnapshot | null = null;
private readonly openOrders = new Map<number, AsterOrder>(); private readonly openOrders = new Map<string, AsterOrder>();
private positionSyncTimer: ReturnType<typeof setInterval> | null = null; private positionSyncTimer: ReturnType<typeof setInterval> | null = null;
private positionSyncInFlight = false; private positionSyncInFlight = false;
@@ -1003,12 +1011,9 @@ export class AsterGateway {
async cancelAllOrders(params: { symbol: string }): Promise<void> { async cancelAllOrders(params: { symbol: string }): Promise<void> {
await this.rest.cancelAllOrders(params); await this.rest.cancelAllOrders(params);
for (const order of Array.from(this.openOrders.values())) { for (const [key, order] of Array.from(this.openOrders.entries())) {
if (order.symbol === params.symbol) { if (order.symbol === params.symbol) {
const numericId = typeof order.orderId === "number" ? order.orderId : Number(order.orderId); this.openOrders.delete(key);
if (Number.isFinite(numericId)) {
this.openOrders.delete(numericId);
}
} }
} }
this.ordersEvent.emit(Array.from(this.openOrders.values())); this.ordersEvent.emit(Array.from(this.openOrders.values()));