| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- import APP from '@/services';
- import { funCode } from '@/services/funcode/index';
- import { buildSubscribePeq, parseSubscribeRsp } from '@/services/socket/quota/adapter/index';
- import Bus from '@/utils/eventBus/index';
- import timerUtil from '@/utils/timer/timerUtil';
- import { Callback } from '@/utils/websocket/index';
- import { SubscribeInfoType } from './interface';
- import { isLogin } from '@/services/bus/login';
- const subscribeGoodsList = new Map<string, SubscribeInfoType[]>(); // 订阅商品数据中心池
- let isSubscribeSucess = false; // 订阅是否成功
- const timeDiff = 2 * 1000 // 没有订阅成功,下次发起订阅的间隔时间
- /**
- * 重组订阅商品(包括去重,组合)
- */
- function recombinationSubscribeGoods(): SubscribeInfoType[] {
- const result: SubscribeInfoType[] = [];
- const goodsCodeSet = new Set<string>();
- for (const item of subscribeGoodsList.values()) {
- item.forEach((e) => {
- if (!goodsCodeSet.has(e.goodsCode)) {
- result.push(e);
- }
- });
- }
- return result;
- }
- /**
- * 尝试商品订阅,如果订阅不成功,则 timeDiff 后续继续发起订阅请求,直到订阅成功后为止
- */
- function trySubcribe() {
- const timer = 'quoteSucribe'
- actionSubcribe()
- timerUtil.setInterval(() => {
- if (isSubscribeSucess) {
- // 订阅成功后,不在继续尝试订阅了
- timerUtil.clearInterval(timer)
- } else {
- // 订阅失败,重新发起订阅
- actionSubcribe()
- }
- }, timeDiff, timer)
- }
- /**
- * 开始商品订阅
- * @param subscribeInfos
- */
- function actionSubcribe() {
- const arr = recombinationSubscribeGoods();
- if (arr.length) {
- const req = buildSubscribePeq(arr);
- isSubscribeSucess = false
- APP.sendQuoteServer(req, funCode.MainClassNumber_Quota_SubscriptRsp, {
- onSuccess: (res: any) => {
- parseSubscribeRsp(res)
- .then((value) => {
- console.log('订阅成功!', value);
- isSubscribeSucess = true
- })
- .catch((err) => {
- isSubscribeSucess = false
- console.log('订阅失败:', err);
- // 失败原因:行情断
- // 重新 走行情链接逻辑
- });
- },
- onFail: (err) => {
- if (isLogin()) {
- isSubscribeSucess = false
- console.log('订阅失败:', err)
- } else {
- isSubscribeSucess = true
- }
- },
- } as Callback);
- }
- }
- /**
- * 添加行情订阅
- * @param subscribeInfos
- */
- export function addSubscribeQuotation(uuid: string, subscribeInfos: SubscribeInfoType[]) {
- APP.connectQuote().then(() => {
- subscribeGoodsList.set(uuid, subscribeInfos);
- trySubcribe();
- });
- }
- /**
- * 删除订阅
- */
- export function removeSubscribeQuotation(uuid: string) {
- if (subscribeGoodsList.has(uuid)) {
- subscribeGoodsList.delete(uuid);
- console.log('删除订阅', uuid)
- if (subscribeGoodsList.size) {
- trySubcribe();
- } else {
- // 没有订阅商品时候,主动断开行情链路
- APP.closeQuote();
- }
- }
- }
- // 行情链路 重连成功后,重新订阅商品
- Bus.$on('quoteReconnectSucess', () => {
- console.log('======== 行情链路 重连成功后,开启重新订阅商品')
- trySubcribe()
- })
|