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];
};
/**
* 从深交所 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 - 当前价

View File

@@ -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;
}