|
|
@@ -1,4 +1,5 @@
|
|
|
-import { reactive, computed, toRefs } from 'vue'
|
|
|
+import { reactive, computed, toRefs, onUnmounted } from 'vue'
|
|
|
+import { v4 } from 'uuid'
|
|
|
import { handlePriceColor } from '@/filters'
|
|
|
import { queryErmcpGoods, queryQuoteDay } from '@/services/api/goods'
|
|
|
import { defineStore } from '../store'
|
|
|
@@ -11,10 +12,12 @@ import moment from 'moment'
|
|
|
* @returns
|
|
|
*/
|
|
|
export const useFuturesStore = defineStore(() => {
|
|
|
+ // 行情监听集合
|
|
|
+ const quoteWatchMap = new Map<string, { keys: string[]; callback: (value: Partial<Model.QuoteDayRsp>) => void; }>()
|
|
|
+
|
|
|
const state = reactive({
|
|
|
loading: false,
|
|
|
goodsList: <Model.GoodsRsp[]>[], // 商品列表
|
|
|
- quotes: <Partial<Model.QuoteDayRsp>[]>[], // 行情数据
|
|
|
goodsQuoteList: <Model.GoodsQuote[]>[], // 商品行情列表
|
|
|
})
|
|
|
|
|
|
@@ -60,16 +63,6 @@ export const useFuturesStore = defineStore(() => {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- // 通过 goodscode 获取实时行情
|
|
|
- const getQuote = (goodsCode: string) => {
|
|
|
- return computed(() => {
|
|
|
- const quote = state.quotes.find((e) => e.goodscode === goodsCode)
|
|
|
- return {
|
|
|
- ...quote
|
|
|
- }
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
// 获取商品名称
|
|
|
const getGoodsName = (code: string | number) => {
|
|
|
const quote = state.goodsList.find((e) => e.goodscode === code || e.goodsid === code)
|
|
|
@@ -82,20 +75,48 @@ export const useFuturesStore = defineStore(() => {
|
|
|
return quote?.marketid ?? 0
|
|
|
}
|
|
|
|
|
|
+ // 监听行情推送
|
|
|
+ const quoteWatch = (goodsCodes: string | string[], callback: (value: Partial<Model.QuoteDayRsp>) => void) => {
|
|
|
+ const uuid = v4()
|
|
|
+
|
|
|
+ quoteWatchMap.set(uuid, {
|
|
|
+ keys: Array.isArray(goodsCodes) ? goodsCodes : [goodsCodes],
|
|
|
+ callback
|
|
|
+ })
|
|
|
+
|
|
|
+ const append = (...goodsCodes: string[]) => {
|
|
|
+ const value = quoteWatchMap.get(uuid)
|
|
|
+ value?.keys.push(...goodsCodes)
|
|
|
+ }
|
|
|
+
|
|
|
+ const stop = () => {
|
|
|
+ quoteWatchMap.delete(uuid)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 页面离开时停止监听事件,防止事件重复触发
|
|
|
+ onUnmounted(() => stop())
|
|
|
+
|
|
|
+ return {
|
|
|
+ uuid,
|
|
|
+ append,
|
|
|
+ stop
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// 接收行情推送通知
|
|
|
const quotePushNotify = eventBus.$on('QuotePushNotify', (res) => {
|
|
|
const data = res as Proto.Quote[]
|
|
|
data.forEach((item) => {
|
|
|
const quote = handleQuote(item)
|
|
|
- const index = state.quotes.findIndex((e) => e.goodscode === item.goodscode)
|
|
|
- if (index > -1) {
|
|
|
- state.quotes[index] = quote
|
|
|
- } else {
|
|
|
- state.quotes.push(quote)
|
|
|
- }
|
|
|
if (!state.loading) {
|
|
|
updateGoodsQuote(quote)
|
|
|
}
|
|
|
+ // 触发行情监听事件
|
|
|
+ for (const e of quoteWatchMap.values()) {
|
|
|
+ if (e.keys.includes(item.goodscode ?? '')) {
|
|
|
+ e.callback(quote)
|
|
|
+ }
|
|
|
+ }
|
|
|
})
|
|
|
})
|
|
|
|
|
|
@@ -303,13 +324,13 @@ export const useFuturesStore = defineStore(() => {
|
|
|
|
|
|
return {
|
|
|
...toRefs(state),
|
|
|
- getQuote,
|
|
|
getQuotePrice,
|
|
|
getGoodsList,
|
|
|
getGoodsQuote,
|
|
|
getGoodsName,
|
|
|
getGoodsMarket,
|
|
|
updateGoodsQuote,
|
|
|
+ quoteWatch,
|
|
|
quotePushNotify,
|
|
|
}
|
|
|
})
|