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];
|
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 - 当前价
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user