index.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import APP from '@/services';
  2. import { funCode } from '@/services/funcode/index';
  3. import { buildSubscribePeq, parseSubscribeRsp } from '@/services/socket/quota/adapter/index';
  4. import Bus from '@/utils/eventBus/index';
  5. import timerUtil from '@/utils/timer/timerUtil';
  6. import { Callback } from '@/utils/websocket/index';
  7. import { SubscribeInfoType } from './interface';
  8. import { isLogin } from '@/services/bus/login';
  9. const subscribeGoodsList = new Map<string, SubscribeInfoType[]>(); // 订阅商品数据中心池
  10. let isSubscribeSucess = false; // 订阅是否成功
  11. const timeDiff = 2 * 1000 // 没有订阅成功,下次发起订阅的间隔时间
  12. /**
  13. * 重组订阅商品(包括去重,组合)
  14. */
  15. function recombinationSubscribeGoods(): SubscribeInfoType[] {
  16. const result: SubscribeInfoType[] = [];
  17. const goodsCodeSet = new Set<string>();
  18. for (const item of subscribeGoodsList.values()) {
  19. item.forEach((e) => {
  20. if (!goodsCodeSet.has(e.goodsCode)) {
  21. result.push(e);
  22. }
  23. });
  24. }
  25. return result;
  26. }
  27. /**
  28. * 尝试商品订阅,如果订阅不成功,则 timeDiff 后续继续发起订阅请求,直到订阅成功后为止
  29. */
  30. function trySubcribe() {
  31. const timer = 'quoteSucribe'
  32. actionSubcribe()
  33. timerUtil.setInterval(() => {
  34. if (isSubscribeSucess) {
  35. // 订阅成功后,不在继续尝试订阅了
  36. timerUtil.clearInterval(timer)
  37. } else {
  38. // 订阅失败,重新发起订阅
  39. actionSubcribe()
  40. }
  41. }, timeDiff, timer)
  42. }
  43. /**
  44. * 开始商品订阅
  45. * @param subscribeInfos
  46. */
  47. function actionSubcribe() {
  48. const arr = recombinationSubscribeGoods();
  49. if (arr.length) {
  50. const req = buildSubscribePeq(arr);
  51. isSubscribeSucess = false
  52. APP.sendQuoteServer(req, funCode.MainClassNumber_Quota_SubscriptRsp, {
  53. onSuccess: (res: any) => {
  54. parseSubscribeRsp(res)
  55. .then((value) => {
  56. console.log('订阅成功!', value);
  57. isSubscribeSucess = true
  58. })
  59. .catch((err) => {
  60. isSubscribeSucess = false
  61. console.log('订阅失败:', err);
  62. // 失败原因:行情断
  63. // 重新 走行情链接逻辑
  64. });
  65. },
  66. onFail: (err) => {
  67. if (isLogin()) {
  68. isSubscribeSucess = false
  69. console.log('订阅失败:', err)
  70. } else {
  71. isSubscribeSucess = true
  72. }
  73. },
  74. } as Callback);
  75. }
  76. }
  77. /**
  78. * 添加行情订阅
  79. * @param subscribeInfos
  80. */
  81. export function addSubscribeQuotation(uuid: string, subscribeInfos: SubscribeInfoType[]) {
  82. APP.connectQuote().then(() => {
  83. subscribeGoodsList.set(uuid, subscribeInfos);
  84. trySubcribe();
  85. });
  86. }
  87. /**
  88. * 删除订阅
  89. */
  90. export function removeSubscribeQuotation(uuid: string) {
  91. if (subscribeGoodsList.has(uuid)) {
  92. subscribeGoodsList.delete(uuid);
  93. console.log('删除订阅', uuid)
  94. if (subscribeGoodsList.size) {
  95. trySubcribe();
  96. } else {
  97. // 没有订阅商品时候,主动断开行情链路
  98. APP.closeQuote();
  99. }
  100. }
  101. }
  102. // 行情链路 重连成功后,重新订阅商品
  103. Bus.$on('quoteReconnectSucess', () => {
  104. console.log('======== 行情链路 重连成功后,开启重新订阅商品')
  105. trySubcribe()
  106. })