index.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { v4 } from 'uuid'
  2. import { Package50 } from '@/utils/websocket/package'
  3. import { FunCode } from '@/constants/funcode'
  4. import { useLoginStore } from '@/stores/modules/login'
  5. import { useErrorInfoStore } from '@/stores/modules/errorInfo'
  6. import { IMessageHead } from './protobuf/proto'
  7. import { TradeRequest, TradeResponse } from './interface'
  8. import Protobuf from './protobuf'
  9. import socket from '../index'
  10. /**
  11. * 构建消息头部
  12. */
  13. function getProtoHeader(funCode: keyof typeof FunCode, header?: IMessageHead, marketId?: number) {
  14. const { getUserId } = useLoginStore();
  15. // 组合请求头
  16. const protoHeader: IMessageHead = {
  17. FunCode: FunCode[funCode],
  18. UUID: v4(),
  19. UserID: getUserId(),
  20. ...(header ?? {})
  21. }
  22. if (marketId) {
  23. protoHeader.MarketID = marketId;
  24. }
  25. return protoHeader;
  26. }
  27. /**
  28. * 向交易服务器发送请求
  29. * @param params 请求参数
  30. * @param reqKey 请求代码
  31. * @param rspKey 回调代码
  32. * @param marketId 市场ID
  33. */
  34. function tradeServerMiddleware<Req, Rsp>(reqKey: keyof typeof FunCode, rspKey: keyof typeof FunCode, params: TradeRequest<Req, Rsp>, marketId?: number): Promise<Rsp> {
  35. params.data.Header = getProtoHeader(reqKey, params.data.Header, marketId);
  36. console.log(reqKey, FunCode[reqKey], params.data);
  37. return new Promise((resolve, reject) => {
  38. Protobuf.requestEncode(reqKey, params.data).then((res) => {
  39. // 发送消息
  40. socket.sendTradeServer({
  41. data: {
  42. rspCode: FunCode[rspKey],
  43. payload: new Package50(FunCode[reqKey], res)
  44. },
  45. success: (raw) => {
  46. Protobuf.responseDecode<Rsp>(rspKey, raw.content).then((res) => {
  47. console.log(rspKey, FunCode[rspKey], res);
  48. resolve(res);
  49. }).catch(() => {
  50. console.error(rspKey, raw);
  51. reject('报文解析失败');
  52. })
  53. },
  54. fail: (err) => {
  55. console.error(reqKey, err);
  56. reject(err);
  57. }
  58. })
  59. }).catch((msg) => {
  60. console.error(reqKey, msg);
  61. reject('报文构建失败');
  62. })
  63. })
  64. }
  65. /**
  66. * 向交易服务器发送请求
  67. * @param reqKey
  68. * @param rspKey
  69. * @param params
  70. * @param marketId
  71. */
  72. export async function tradeServerRequest<Req, Rsp>(reqKey: keyof typeof FunCode, rspKey: keyof typeof FunCode, params: TradeRequest<Req, Rsp & TradeResponse>, marketId?: number) {
  73. const { getErrorInfoByCode } = useErrorInfoStore();
  74. const { success, fail, complete } = params;
  75. await tradeServerMiddleware(reqKey, rspKey, params, marketId).then((res) => {
  76. const { RetCode, Status, RetDesc } = { ...res };
  77. switch (RetCode) {
  78. case 0: {
  79. success && success(res);
  80. return Promise.resolve();
  81. }
  82. case -1: {
  83. // 管理端错误消息
  84. return Promise.reject(RetDesc);
  85. }
  86. case 12018: {
  87. if (RetDesc) {
  88. // 解析base64
  89. res.RetDesc = Buffer.from(RetDesc, 'base64').toString();
  90. }
  91. return Promise.reject(res.RetDesc);
  92. }
  93. default: {
  94. // 银行 业务 以 Status 作为判断依据
  95. if (Status === 0) {
  96. success && success(res);
  97. return Promise.resolve();
  98. }
  99. const msg = getErrorInfoByCode(RetCode || Status);
  100. const error = String(RetDesc || RetCode);
  101. return Promise.reject(msg ?? error);
  102. }
  103. }
  104. }).catch((err) => {
  105. fail && fail(err);
  106. return Promise.reject(err);
  107. }).finally(() => {
  108. complete && complete();
  109. })
  110. }