| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- import { ref, computed } from 'vue'
- import { timerInterceptor } from '@/utils/timer'
- import { queryGoodsList } from '@/services/api/goods'
- import { sessionData } from './storage'
- import moment from 'moment'
- import eventBus from '@/services/bus'
- /**
- * 期货存储类
- */
- export default new (class {
- private quotes: Proto.Quote[] = [] // 行情数据
- loading = ref(false)
- goodsList = ref<Ermcp.GoodsRsp[]>([]) // 商品列表
- quoteDayList = ref<Ermcp.QuoteDay[]>([]) // 盘面列表
- constructor() {
- // 接收行情推送通知
- eventBus.$on('QuotePushNotify', (res) => {
- const data = res as Proto.Quote[]
- data.forEach((item) => {
- const index = this.quotes.findIndex((e) => e.goodscode === item.goodscode)
- if (index > -1) {
- this.quotes[index] = item
- } else {
- this.quotes.push(item)
- }
- })
- this.handleQuote()
- })
- }
- /**
- * 处理行情数据
- */
- private handleQuote = timerInterceptor.setThrottle(() => {
- const quoteList = this.quoteDayList.value
- this.quotes.forEach((item) => {
- const quote = quoteList.find((e) => e.goodscode.toUpperCase() === item.goodscode?.toUpperCase())
- const last = item.last ?? 0
- const lasttime = (item.date && item.time) ? moment(item.date + item.time, 'YYYYMMDDHHmmss').format('YYYY-MM-DD HH:mm:ss') : ''
- if (quote) {
- Object.entries(item).forEach(([key, value]) => {
- // 只更新存在的属性
- if (Reflect.has(quote, key)) {
- const prop = key as keyof Ermcp.QuoteDay;
- (<K extends typeof prop>(key: K) => quote[key] = value)(prop);
- }
- })
- // 处理最高最低价
- if (last) {
- if (last > quote.highest) {
- quote.highest = last;
- }
- if (last < quote.lowest) {
- quote.lowest = last;
- }
- }
- // 处理最新时间
- if (lasttime) {
- quote.lasttime = lasttime;
- }
- } else {
- console.warn('行情推送的商品 ' + item.goodscode + ' 缺少盘面信息')
- quoteList.push({
- Lastturnover: 0,
- ask: item.ask ?? 0,
- ask2: item.ask2 ?? 0,
- ask3: item.ask3 ?? 0,
- ask4: item.ask4 ?? 0,
- ask5: item.ask5 ?? 0,
- ask6: 0,
- ask7: 0,
- ask8: 0,
- ask9: 0,
- ask10: 0,
- askorderid: 0,
- askorderid2: 0,
- askorderid3: 0,
- askorderid4: 0,
- askorderid5: 0,
- askordervolume: 0,
- askordervolume2: 0,
- askordervolume3: 0,
- askordervolume4: 0,
- askordervolume5: 0,
- askordervolume6: 0,
- askordervolume7: 0,
- askordervolume8: 0,
- askordervolume9: 0,
- askordervolume10: 0,
- askqueueinfo: "",
- askvolume: item.askvolume ?? 0,
- askvolume2: item.askvolume2 ?? 0,
- askvolume3: item.askvolume3 ?? 0,
- askvolume4: item.askvolume4 ?? 0,
- askvolume5: item.askvolume5 ?? 0,
- askvolume6: 0,
- askvolume7: 0,
- askvolume8: 0,
- askvolume9: 0,
- askvolume10: 0,
- averageprice: 0,
- bid: item.bid ?? 0,
- bid2: item.bid2 ?? 0,
- bid3: item.bid3 ?? 0,
- bid4: item.bid4 ?? 0,
- bid5: item.bid5 ?? 0,
- bid6: 0,
- bid7: 0,
- bid8: 0,
- bid9: 0,
- bid10: 0,
- bidorderid: 0,
- bidorderid2: 0,
- bidorderid3: 0,
- bidorderid4: 0,
- bidorderid5: 0,
- bidordervolume: 0,
- bidordervolume2: 0,
- bidordervolume3: 0,
- bidordervolume4: 0,
- bidordervolume5: 0,
- bidordervolume6: 0,
- bidordervolume7: 0,
- bidordervolume8: 0,
- bidordervolume9: 0,
- bidordervolume10: 0,
- bidqueueinfo: "",
- bidvolume: item.bidvolume ?? 0,
- bidvolume2: item.bidvolume2 ?? 0,
- bidvolume3: item.bidvolume3 ?? 0,
- bidvolume4: item.bidvolume4 ?? 0,
- bidvolume5: item.bidvolume5 ?? 0,
- bidvolume6: 0,
- bidvolume7: 0,
- bidvolume8: 0,
- bidvolume9: 0,
- bidvolume10: 0,
- calloptionpremiums: item.calloptionpremiums ?? 0,
- calloptionpremiums2: item.calloptionpremiums2 ?? 0,
- calloptionpremiums3: item.calloptionpremiums3 ?? 0,
- calloptionpremiums4: item.calloptionpremiums4 ?? 0,
- calloptionpremiums5: item.calloptionpremiums5 ?? 0,
- cleartime: 0,
- exchangecode: item.exchangecode ?? 0,
- exchangedate: item.exchangedate ?? 0,
- goodscode: item.goodscode ?? '',
- grepmarketprice: 0,
- highest: item.highest ?? 0,
- holdincrement: 0,
- holdvolume: item.holdvolume ?? 0,
- iep: 0,
- iev: 0,
- inventory: item.inventory ?? 0,
- iscleared: 0,
- issettled: 0,
- last,
- lastlot: 0,
- lasttime,
- lastvolume: item.lastvolume ?? 0,
- limitdown: item.limitlow ?? 0,
- limitup: item.limithigh ?? 0,
- lowest: item.lowest ?? 0,
- nontotalholdervolume: 0,
- nontotallot: 0,
- nontotalturnover: 0,
- nontotalvolume: 0,
- opened: item.opened ?? 0,
- opentime: '',
- orderid: 0,
- preclose: item.preclose ?? 0,
- preholdvolume: item.preholdvolume ?? 0,
- presettle: item.presettle ?? 0,
- publictradetype: '',
- putoptionpremiums: item.putoptionpremiums ?? 0,
- putoptionpremiums2: item.putoptionpremiums2 ?? 0,
- putoptionpremiums3: item.putoptionpremiums3 ?? 0,
- putoptionpremiums4: item.putoptionpremiums4 ?? 0,
- putoptionpremiums5: item.putoptionpremiums5 ?? 0,
- settle: item.settle ?? 0,
- strikeprice: 0,
- totalaskvolume: 0,
- totalbidvolume: 0,
- totallot: 0,
- totalturnover: item.totalturnover ?? 0,
- totalvolume: item.totalvolume ?? 0,
- utclasttime: ''
- })
- }
- })
- }, 200)
- /**
- * 获取商品列表
- */
- getGoodsList = () => {
- this.loading.value = true
- return queryGoodsList({
- data: {
- userid: sessionData.getLoginInfo('UserID')
- },
- success: (res) => {
- this.goodsList.value = res.data
- },
- complete: () => {
- this.loading.value = false
- }
- })
- }
- /**
- * 通过 goodscode 获取盘面实时行情
- * @param goodscode
- * @returns
- */
- getQuoteDayInfoByCode = (goodscode: string) => {
- return computed(() => this.quoteDayList.value.find((e) => e.goodscode.toUpperCase() === goodscode.toUpperCase()))
- }
- /**
- * 通过 goodscode 获取商品实时报价
- * @param goodscode
- * @returns
- */
- getGoodsPriceByCode = (goodscode: string) => {
- return computed(() => {
- const quote = this.getQuoteDayInfoByCode(goodscode)
- return quote.value?.last ?? 0
- })
- }
- })
|