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