update pay ui

This commit is contained in:
2025-12-11 13:39:45 +08:00
parent 39ad523dad
commit 5f23844160
3 changed files with 362 additions and 720 deletions

View File

@@ -2,7 +2,7 @@
* 实时行情相关工具函数 * 实时行情相关工具函数
*/ */
import type { Exchange, OrderBookLevel } from '../types'; import type { Exchange } from '../types';
/** /**
* 判断证券代码属于哪个交易所 * 判断证券代码属于哪个交易所
@@ -75,23 +75,6 @@ export const normalizeCode = (code: string): string => {
return code.split('.')[0]; return code.split('.')[0];
}; };
/**
* 从深交所 bids/asks 数组提取价格和量数组
* 格式:[{price, volume}, ...]
* @param orderBook - 盘口数组
* @returns { prices, volumes }
*/
export const extractOrderBook = (
orderBook: OrderBookLevel[] | undefined
): { prices: number[]; volumes: number[] } => {
if (!orderBook || !Array.isArray(orderBook) || orderBook.length === 0) {
return { prices: [], volumes: [] };
}
const prices = orderBook.map(item => item.price || 0);
const volumes = orderBook.map(item => item.volume || 0);
return { prices, volumes };
};
/** /**
* 计算涨跌幅 * 计算涨跌幅
* @param price - 当前价 * @param price - 当前价

View File

@@ -1,5 +1,6 @@
/** /**
* 灵活屏组件类型定义 * 灵活屏组件类型定义
* 基于深交所 WebSocket API v4.0 (SZSE_WEBSOCKET_API.md)
*/ */
// ==================== WebSocket 相关类型 ==================== // ==================== WebSocket 相关类型 ====================
@@ -7,18 +8,15 @@
/** 交易所标识 */ /** 交易所标识 */
export type Exchange = 'SSE' | 'SZSE'; export type Exchange = 'SSE' | 'SZSE';
/** 深交所频道类型 */
export type SZSEChannel = 'stock' | 'index' | 'bond' | 'hkstock';
/** WebSocket 连接状态 */ /** WebSocket 连接状态 */
export interface ConnectionStatus { export interface ConnectionStatus {
SSE: boolean; SSE: boolean;
SZSE: boolean; SZSE: boolean;
} }
/** 盘口档位数据 */
export interface OrderBookLevel {
price: number;
volume: number;
}
// ==================== 行情数据类型 ==================== // ==================== 行情数据类型 ====================
/** 盘后交易数据 */ /** 盘后交易数据 */
@@ -59,7 +57,7 @@ export interface StockQuoteData extends BaseQuoteData {
askPrices: number[]; askPrices: number[];
askVolumes: number[]; askVolumes: number[];
tradingPhase?: string; tradingPhase?: string;
afterhours?: AfterhoursData; // 盘后交易数据 afterhours?: AfterhoursData;
} }
/** 指数行情数据 */ /** 指数行情数据 */
@@ -140,191 +138,180 @@ export interface SSEMessage {
// ==================== 深交所 WebSocket 消息类型 ==================== // ==================== 深交所 WebSocket 消息类型 ====================
// API 文档: SZSE_WEBSOCKET_API.md // API 文档: SZSE_WEBSOCKET_API.md
// 与上交所 API 保持一致的设计
/** 深交所数据类别(对应 channels */ /**
export type SZSECategory = 'stock' | 'bond' | 'fund'; * 深交所股票行情数据 (消息类型 300111)
* 字段名与 API 文档保持一致
/** 深交所股票行情数据(新 API 格式) */ */
export interface SZSEStockData { export interface SZSEStockData {
security_id: string; security_id: string;
md_stream_id?: string; // MDStreamID: 010 md_stream_id?: string;
orig_time?: number; orig_time?: number;
channel_no?: number; channel_no?: number;
trading_phase_code?: string; // 新字段名 trading_phase_code?: string;
trading_phase?: string; // 兼容旧字段名 prev_close_px: number;
prev_close_px: number; // 新字段名
prev_close?: number; // 兼容旧字段名
open_px: number; open_px: number;
high_px: number; high_px: number;
low_px: number; low_px: number;
last_px: number; last_px: number;
upper_limit_px?: number; // 新字段名 upper_limit_px?: number;
upper_limit?: number; // 兼容旧字段名 lower_limit_px?: number;
lower_limit_px?: number; // 新字段名
lower_limit?: number; // 兼容旧字段名
num_trades?: number; num_trades?: number;
total_volume_trade?: number; // 新字段名 (成交量) total_volume_trade: number;
total_value_trade?: number; // 新字段名 (成交额) total_value_trade: number;
volume?: number; // 兼容旧字段名 bid_prices: number[];
amount?: number; // 兼容旧字段名 bid_volumes: number[];
// 新 API 格式:直接是数组 ask_prices: number[];
bid_prices?: number[]; ask_volumes: number[];
bid_volumes?: number[];
ask_prices?: number[];
ask_volumes?: number[];
// 兼容旧格式
bids?: OrderBookLevel[];
asks?: OrderBookLevel[];
update_time?: string; update_time?: string;
} }
/** 深交所指数行情数据 */ /**
* 深交所指数行情数据 (消息类型 309011)
*/
export interface SZSEIndexData { export interface SZSEIndexData {
security_id: string; security_id: string;
orig_time?: number; md_stream_id?: string;
channel_no?: number; prev_close: number;
trading_phase?: string; num_trades?: number;
volume: number;
amount: number;
current_index: number; current_index: number;
open_index: number; open_index: number;
high_index: number; high_index: number;
low_index: number; low_index: number;
close_index?: number; close_index?: number;
prev_close: number; update_time?: string;
volume: number;
amount: number;
num_trades?: number;
} }
/** 深交所债券行情数据 */ /**
* 深交所债券行情数据 (消息类型 300211)
*/
export interface SZSEBondData { export interface SZSEBondData {
security_id: string; security_id: string;
orig_time?: number; md_stream_id?: string;
channel_no?: number; trading_phase_code?: string;
trading_phase?: string; prev_close: number;
last_px: number;
open_px: number; open_px: number;
high_px: number; high_px: number;
low_px: number; low_px: number;
prev_close: number; last_px: number;
weighted_avg_px?: number; weighted_avg_px?: number;
num_trades?: number;
volume: number; volume: number;
amount: number; amount: number;
num_trades?: number; update_time?: string;
auction_volume?: number;
auction_amount?: number;
} }
/** 深交所港股行情数据 */ /**
* 深交所港股行情数据 (消息类型 306311)
*/
export interface SZSEHKStockData { export interface SZSEHKStockData {
security_id: string; security_id: string;
orig_time?: number; md_stream_id?: string;
channel_no?: number; trading_phase_code?: string;
trading_phase?: string; prev_close: number;
last_px: number;
open_px: number; open_px: number;
high_px: number; high_px: number;
low_px: number; low_px: number;
prev_close: number; last_px: number;
nominal_px?: number; nominal_px?: number; // 按盘价
reference_px?: number; num_trades?: number;
volume: number; volume: number;
amount: number; amount: number;
num_trades?: number; bid_prices: number[];
vcm_start_time?: number; bid_volumes: number[];
vcm_end_time?: number; ask_prices: number[];
bids?: OrderBookLevel[]; ask_volumes: number[];
asks?: OrderBookLevel[]; update_time?: string;
} }
/** 深交所盘后交易数据 */ /**
export interface SZSEAfterhoursData { * 深交所实时推送消息 (批量格式)
security_id: string; * type 直接表示频道类型
orig_time?: number; */
channel_no?: number;
trading_phase?: string;
prev_close: number;
bid_px: number;
bid_size: number;
offer_px: number;
offer_size: number;
volume: number;
amount: number;
num_trades?: number;
}
/** 深交所实时消息(新 API 格式type 直接是 'stock' | 'index' | 'bond' | 'fund' */
export interface SZSERealtimeMessage { export interface SZSERealtimeMessage {
type: 'stock' | 'index' | 'bond' | 'fund' | 'hkstock' | 'realtime'; // 新 API 直接用 type='stock' 等 type: 'stock' | 'index' | 'bond' | 'hkstock';
category?: SZSECategory; // 旧 API 使用 category data: Record<string, SZSEStockData | SZSEIndexData | SZSEBondData | SZSEHKStockData>;
msg_type?: number;
timestamp: string; timestamp: string;
// 新 API 批量格式data 是 { code: quote, ... } 字典
// 旧 API 单条格式data 是单个行情对象
data: SZSEStockData | SZSEIndexData | SZSEBondData | SZSEHKStockData | SZSEAfterhoursData | Record<string, unknown>;
} }
/** 深交所快照消息 */ /**
* 深交所快照响应消息
*/
export interface SZSESnapshotMessage { export interface SZSESnapshotMessage {
type: 'snapshot'; type: 'snapshot';
data: SZSEStockData | SZSEIndexData | SZSEBondData | SZSEHKStockData;
timestamp?: string; timestamp?: string;
data: SZSEStockData | {
// 兼容旧格式的批量快照
stocks?: SZSEStockData[];
indexes?: SZSEIndexData[];
bonds?: SZSEBondData[];
};
} }
/** 深交所欢迎消息 */ /**
export interface SZSEWelcomeMessage { * 深交所订阅确认消息
type: 'welcome'; */
message: string;
timestamp: string;
usage?: Record<string, unknown>;
categories?: string[];
}
/** 深交所订阅确认消息 */
export interface SZSESubscribedMessage { export interface SZSESubscribedMessage {
type: 'subscribed'; type: 'subscribed';
channels?: string[]; // 新 API 格式 channels: SZSEChannel[];
codes?: string[]; // 新 API 格式 codes: string[];
securities?: string[]; // 兼容旧格式
categories?: string[]; // 兼容旧格式
all?: boolean;
incremental_only?: boolean;
message?: string;
} }
/** 深交所取消订阅确认消息 */ /**
* 深交所取消订阅确认消息
*/
export interface SZSEUnsubscribedMessage { export interface SZSEUnsubscribedMessage {
type: 'unsubscribed'; type: 'unsubscribed';
channels?: string[]; // 新 API 格式 channels: SZSEChannel[];
codes?: string[]; // 新 API 格式 codes: string[];
securities?: string[]; // 兼容旧格式
categories?: string[]; // 兼容旧格式
remaining_securities?: string[];
remaining_categories?: string[];
} }
/** 深交所错误消息 */ /**
* 深交所订阅状态响应
*/
export interface SZSEStatusMessage {
type: 'status';
channels: SZSEChannel[];
codes: string[];
filter_active: boolean;
}
/**
* 深交所代码列表响应 (单频道)
*/
export interface SZSECodesListSingleMessage {
type: 'codes_list';
category: SZSEChannel;
codes: string[];
count: number;
}
/**
* 深交所代码列表响应 (全部频道)
*/
export interface SZSECodesListAllMessage {
type: 'codes_list';
data: Record<SZSEChannel, { codes: string[]; count: number }>;
}
/**
* 深交所错误消息
*/
export interface SZSEErrorMessage { export interface SZSEErrorMessage {
type: 'error'; type: 'error';
message: string; message: string;
} }
/** 深交所消息类型 */ /**
* 深交所消息联合类型
*/
export type SZSEMessage = export type SZSEMessage =
| SZSERealtimeMessage | SZSERealtimeMessage
| SZSESnapshotMessage | SZSESnapshotMessage
| SZSEWelcomeMessage
| SZSESubscribedMessage | SZSESubscribedMessage
| SZSEUnsubscribedMessage | SZSEUnsubscribedMessage
| SZSEStatusMessage
| SZSECodesListSingleMessage
| SZSECodesListAllMessage
| SZSEErrorMessage | SZSEErrorMessage
| { type: 'pong'; timestamp?: string } | { type: 'pong' };
| { type: 'query_result'; security_id: string; found: boolean; data: unknown }
| { type: 'query_batch_result'; count: number; found: number; data: Record<string, unknown> };
// ==================== 组件 Props 类型 ==================== // ==================== 组件 Props 类型 ====================
@@ -377,4 +364,8 @@ export interface UseRealtimeQuoteReturn {
connected: ConnectionStatus; connected: ConnectionStatus;
subscribe: (code: string) => void; subscribe: (code: string) => void;
unsubscribe: (code: string) => void; unsubscribe: (code: string) => void;
/** 获取订阅状态 (仅深交所) */
getStatus: () => void;
/** 获取单只股票快照 (仅深交所) */
getSnapshot: (code: string) => void;
} }