diff --git a/src/api/baidu/mapWsQuote.ts b/src/api/baidu/mapWsQuote.ts index 215bd4d..081b932 100644 --- a/src/api/baidu/mapWsQuote.ts +++ b/src/api/baidu/mapWsQuote.ts @@ -76,8 +76,9 @@ function upsertIntraday( /** * Merge tick detailinfos into quote.trades (newest first, dedupe, cap 200). * Mutates quote in place so Vue only invalidates trade-dependent effects. + * @returns newly inserted ticks (not already in quote.trades) */ -export function applyWsTick(quote: QuoteData, data: BaiduWsTickData): void { +export function applyWsTick(quote: QuoteData, data: BaiduWsTickData): TradeTick[] { const incoming: TradeTick[] = [...(data.detailinfos ?? [])] .reverse() .map((t) => ({ @@ -87,6 +88,12 @@ export function applyWsTick(quote: QuoteData, data: BaiduWsTickData): void { side: t.bsFlag === 'B' ? 'B' : 'S', })) + const existingKeys = new Set(quote.trades.map(tradeKey)) + const added: TradeTick[] = [] + for (const t of incoming) { + if (!existingKeys.has(tradeKey(t))) added.push(t) + } + const seen = new Set() const merged: TradeTick[] = [] for (const t of [...incoming, ...quote.trades]) { @@ -97,6 +104,7 @@ export function applyWsTick(quote: QuoteData, data: BaiduWsTickData): void { if (merged.length >= MAX_TRADES) break } quote.trades = merged + return added } /** diff --git a/src/components/header/AppHeader.vue b/src/components/header/AppHeader.vue index 0ba91ba..a0dc7c7 100644 --- a/src/components/header/AppHeader.vue +++ b/src/components/header/AppHeader.vue @@ -34,7 +34,7 @@ :value="c.id" /> - 合约 + 自选 diff --git a/src/components/header/ContractSettingsDialog.vue b/src/components/header/ContractSettingsDialog.vue index 2972a32..6823b6a 100644 --- a/src/components/header/ContractSettingsDialog.vue +++ b/src/components/header/ContractSettingsDialog.vue @@ -2,7 +2,7 @@ @@ -25,6 +25,11 @@ + + +