rabbitmq.go 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085
  1. package initialize
  2. import (
  3. "encoding/base64"
  4. "fmt"
  5. "mtp20access/client"
  6. "mtp20access/global"
  7. rsp "mtp20access/model/mq/response"
  8. "mtp20access/packet"
  9. "mtp20access/rabbitmq"
  10. "mtp20access/res/pb"
  11. accountSrv "mtp20access/service/account"
  12. "mtp20access/utils"
  13. "strconv"
  14. // "github.com/golang/protobuf/proto"
  15. "github.com/streadway/amqp"
  16. "go.uber.org/zap"
  17. "google.golang.org/protobuf/encoding/protojson"
  18. "google.golang.org/protobuf/proto"
  19. )
  20. func RabbitMQ() *global.RabbitMQ {
  21. url := global.M2A_CONFIG.Rabbitmq.Url
  22. connection, err := amqp.Dial(url)
  23. if err != nil {
  24. global.M2A_LOG.Error("rabbitmq connect failed, err:", zap.Error(err))
  25. return nil
  26. }
  27. channel, err := connection.Channel()
  28. if err != nil {
  29. global.M2A_LOG.Error("rabbitmq open channel failed, err:", zap.Error(err))
  30. return nil
  31. }
  32. global.M2A_LOG.Info("rabbitmq connect successed.")
  33. return &global.RabbitMQ{
  34. Connection: connection,
  35. Channel: channel,
  36. }
  37. }
  38. // MQProc 消息处理对象
  39. type MQProc struct{}
  40. // process 消息处理接口
  41. func (t *MQProc) Process(topic, queuename string, msg *[]byte) {
  42. // info := fmt.Sprintf("rabbitmq receive message from: topic[%s] queue[%s] contentLen[%d]",
  43. // topic,
  44. // queuename,
  45. // len(string(*msg)))
  46. // global.M2A_LOG.Info(info)
  47. if funcode, sessionId, bytes, serialNumber, err := t.getRspProtobuf(msg); err == nil && bytes != nil {
  48. if sessionId == 0 || funcode == uint32(global.LogoutRsp) || funcode == uint32(global.LoginRsp) {
  49. // 通知类 或 特殊处理
  50. t.onNtf(funcode, sessionId, bytes)
  51. } else {
  52. // 请求回复W
  53. // 尝试获取对应异步任务
  54. if client, exists := client.Clients[int(sessionId)]; exists {
  55. key := fmt.Sprintf("%v_%v_%v", sessionId, funcode, serialNumber)
  56. // 银行服务相关的回复流水号是错误的,所以需要特殊处理
  57. if int(funcode) == global.T2bBankSignRsp ||
  58. int(funcode) == global.T2bBankCancelSignRsp ||
  59. int(funcode) == global.T2bBankWithdrawRsp ||
  60. int(funcode) == global.T2bBankDepositRsp {
  61. key = fmt.Sprintf("%v_%v", sessionId, funcode)
  62. }
  63. asyncTask := client.GetAsyncTask(key)
  64. if asyncTask != nil {
  65. rspData := string(*bytes)
  66. // 判断是否要加密
  67. if asyncTask.IsEncrypted {
  68. if b, err := packet.Encrypt(*bytes, packet.AESKey, true); err != nil {
  69. global.M2A_LOG.Error("总线回复数据加密失败", zap.Error(err))
  70. return
  71. } else {
  72. rspData = base64.StdEncoding.EncodeToString(b)
  73. }
  74. }
  75. // 给客户端回调
  76. global.M2A_LOG.Info("[S->C]", zap.Any("rsp", funcode), zap.Any("sessionId", sessionId), zap.Any("data", string(rspData)))
  77. r := rsp.MQBodyRsp{
  78. FunCode: funcode,
  79. IsEncrypted: asyncTask.IsEncrypted,
  80. Data: rspData,
  81. }
  82. asyncTask.Rsp <- r
  83. } else {
  84. global.M2A_LOG.Info("找不到对应KEY的异步任务", zap.Any("key", key), zap.Any("AsyncMap", client.GetAllAsyncTask()))
  85. }
  86. } else {
  87. global.M2A_LOG.Info("找不到对应的client", zap.Any("sessionId", sessionId))
  88. }
  89. }
  90. }
  91. }
  92. func (t *MQProc) onNtf(funcode uint32, sessionId uint32, bytes *[]byte) {
  93. var clients []*client.Client
  94. var err error
  95. var sendBytes *[]byte
  96. switch int(funcode) {
  97. case global.LoginRsp: // 用户登录应答 - 主要记录旧Token
  98. var p pb.LoginRsp
  99. if err = proto.Unmarshal(*bytes, &p); err != nil {
  100. global.M2A_LOG.Error("总线数据反序列化失败", zap.Error(err))
  101. return
  102. }
  103. // if bs, e := protojson.Marshal(&p); e != nil {
  104. // global.M2A_LOG.Error("总线数据反序列化失败", zap.Error(err))
  105. // return
  106. // } else {
  107. // sendBytes = &bs
  108. // }
  109. // 获取目标客户
  110. for i := range client.Clients {
  111. c := client.Clients[i]
  112. if strconv.Itoa(int(p.GetUserID())) == c.UserID &&
  113. strconv.Itoa(int(sessionId)) == c.SessionID {
  114. // 主要记录旧Token
  115. c.OldToken = p.GetToken()
  116. }
  117. }
  118. case global.LogoutRsp: // 用户登出应答 - 主要用于接收管理端踢上线
  119. var p pb.LogoutRsp
  120. if err = proto.Unmarshal(*bytes, &p); err != nil {
  121. global.M2A_LOG.Error("总线数据反序列化失败", zap.Error(err))
  122. return
  123. }
  124. if bs, e := protojson.Marshal(&p); e != nil {
  125. global.M2A_LOG.Error("总线数据序列化JSON失败", zap.Error(err))
  126. return
  127. } else {
  128. sendBytes = &bs
  129. }
  130. // 获取目标客户
  131. clients = make([]*client.Client, 0)
  132. for i := range client.Clients {
  133. c := client.Clients[i]
  134. if strconv.Itoa(int(p.GetHeader().GetUserID())) == c.UserID {
  135. clients = append(clients, c)
  136. }
  137. }
  138. case global.MoneyChangedNtf: // 资金变化通知
  139. var p pb.MoneyChangedNtf
  140. if err = proto.Unmarshal(*bytes, &p); err != nil {
  141. global.M2A_LOG.Error("总线数据反序列化失败", zap.Error(err))
  142. return
  143. }
  144. if bs, e := protojson.Marshal(&p); e != nil {
  145. global.M2A_LOG.Error("总线数据序列化JSON失败", zap.Error(err))
  146. return
  147. } else {
  148. sendBytes = &bs
  149. }
  150. // 获取目标客户
  151. clients, err = accountSrv.GetClientsByAccountID(*p.AccountID)
  152. if err != nil {
  153. return
  154. }
  155. case global.PosChangedNtf: // 头寸变化通知
  156. var p pb.PosChangedNtf
  157. if err = proto.Unmarshal(*bytes, &p); err != nil {
  158. global.M2A_LOG.Error("总线数据反序列化失败", zap.Error(err))
  159. return
  160. }
  161. if bs, e := protojson.Marshal(&p); e != nil {
  162. global.M2A_LOG.Error("总线数据序列化JSON失败", zap.Error(err))
  163. return
  164. } else {
  165. sendBytes = &bs
  166. }
  167. // 获取目标客户
  168. clients, err = accountSrv.GetClientsByAccountID(*p.AccountID)
  169. if err != nil {
  170. global.M2A_LOG.Info(fmt.Sprintf("接收头寸变化通知时获取不到对应Client,AccountID:%v", *p.AccountID))
  171. return
  172. }
  173. case global.OrderDealedNtf: // 委托单成交通知
  174. var p pb.OrderDealedNtf
  175. if err = proto.Unmarshal(*bytes, &p); err != nil {
  176. global.M2A_LOG.Error("总线数据反序列化失败", zap.Error(err))
  177. return
  178. }
  179. if bs, e := protojson.Marshal(&p); e != nil {
  180. global.M2A_LOG.Error("总线数据序列化JSON失败", zap.Error(err))
  181. return
  182. } else {
  183. sendBytes = &bs
  184. }
  185. // 获取目标客户
  186. clients, err = accountSrv.GetClientsByAccountID(*p.AccountID)
  187. if err != nil {
  188. return
  189. }
  190. case global.MarketStatusChangeNtf: // 市场状态变更通知
  191. var p pb.MarketStatusChangeNtf
  192. if err = proto.Unmarshal(*bytes, &p); err != nil {
  193. global.M2A_LOG.Error("总线数据反序列化失败", zap.Error(err))
  194. return
  195. }
  196. if bs, e := protojson.Marshal(&p); e != nil {
  197. global.M2A_LOG.Error("总线数据序列化JSON失败", zap.Error(err))
  198. return
  199. } else {
  200. sendBytes = &bs
  201. }
  202. // 获取目标客户
  203. clients = make([]*client.Client, 0)
  204. for i := range client.Clients {
  205. c := client.Clients[i]
  206. clients = append(clients, c)
  207. }
  208. case global.ListingOrderChangeNtf: // 挂牌委托变更广播通知
  209. var p pb.ListingOrderChangeNtf
  210. if err = proto.Unmarshal(*bytes, &p); err != nil {
  211. global.M2A_LOG.Error("总线数据反序列化失败", zap.Error(err))
  212. return
  213. }
  214. if bs, e := protojson.Marshal(&p); e != nil {
  215. global.M2A_LOG.Error("总线数据序列化JSON失败", zap.Error(err))
  216. return
  217. } else {
  218. sendBytes = &bs
  219. }
  220. // 获取目标客户
  221. clients = make([]*client.Client, 0)
  222. for i := range client.Clients {
  223. c := client.Clients[i]
  224. clients = append(clients, c)
  225. }
  226. }
  227. if err == nil && len(clients) > 0 {
  228. // 组装待发送给客户端的5.0报文包
  229. b, err := packet.BuildPacket(funcode, 0, 0, *sendBytes, true)
  230. if err != nil {
  231. global.M2A_LOG.Error("组装5.0报文失败", zap.Error(err))
  232. return
  233. }
  234. // 发送信息
  235. for _, item := range clients {
  236. // c := clients[i]
  237. sessionId, _ := strconv.Atoi(item.SessionID)
  238. c := client.Clients[sessionId]
  239. c.WriteTradeWsBuf(b)
  240. // 给客户端通知
  241. global.M2A_LOG.Info("[S->C]给客户端通知", zap.Any("ntf", funcode), zap.Any("clients", c.LoginID), zap.Any("SessionID", c.SessionID), zap.Any("len", len(b)))
  242. }
  243. }
  244. }
  245. // getRspProtobuf 将总线回复的数据反序列化为Protobuf
  246. func (t *MQProc) getRspProtobuf(msg *[]byte) (funcode uint32, sessionId uint32, bytes *[]byte, serialNumber uint32, err error) {
  247. // 分解总线包信息
  248. funcode = utils.BytesToUint32((*msg)[0:4])
  249. sessionId = utils.BytesToUint32((*msg)[4:8])
  250. b := (*msg)[8:]
  251. global.M2A_LOG.Info("收到总线消息", zap.Any("funcode", funcode), zap.Any("sessionId", sessionId), zap.Any("len", len(b)))
  252. switch int(funcode) {
  253. case global.PosChangedNtf,
  254. global.MoneyChangedNtf,
  255. global.OrderDealedNtf,
  256. global.MarketStatusChangeNtf,
  257. global.LoginRsp,
  258. global.LogoutRsp,
  259. global.ListingOrderChangeNtf: // 资金变化通知等
  260. bytes = &b
  261. case global.ModifyPwdRsp: // 修改账户密码应答
  262. var p pb.ModifyPwdRsp
  263. if err = proto.Unmarshal(b, &p); err != nil {
  264. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  265. return
  266. }
  267. if bs, e := protojson.Marshal(&p); e != nil {
  268. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  269. return
  270. } else {
  271. bytes = &bs
  272. serialNumber = p.GetHeader().GetRequestID()
  273. }
  274. case global.UserReceiveInfoRsp: // 新增修改收货地址请求响应
  275. var p pb.UserReceiveInfoRsp
  276. if err = proto.Unmarshal(b, &p); err != nil {
  277. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  278. return
  279. }
  280. if bs, e := protojson.Marshal(&p); e != nil {
  281. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  282. return
  283. } else {
  284. bytes = &bs
  285. serialNumber = p.GetHeader().GetRequestID()
  286. }
  287. case global.DelUserReceiveInfoRsp: // 删除收货地址请求响应
  288. var p pb.DelUserReceiveInfoRsp
  289. if err = proto.Unmarshal(b, &p); err != nil {
  290. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  291. return
  292. }
  293. if bs, e := protojson.Marshal(&p); e != nil {
  294. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  295. return
  296. } else {
  297. bytes = &bs
  298. serialNumber = p.GetHeader().GetRequestID()
  299. }
  300. case global.UserReceiveIsDefaultRsp:
  301. var p pb.UserReceiveIsDefaultRsp
  302. if err = proto.Unmarshal(b, &p); err != nil {
  303. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  304. return
  305. }
  306. if bs, e := protojson.Marshal(&p); e != nil {
  307. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  308. return
  309. } else {
  310. bytes = &bs
  311. serialNumber = p.GetHeader().GetRequestID()
  312. }
  313. case global.UserReceiptInfoRsp: // 新增修改用户发票信息请求响应
  314. var p pb.UserReceiptInfoRsp
  315. if err = proto.Unmarshal(b, &p); err != nil {
  316. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  317. return
  318. }
  319. if bs, e := protojson.Marshal(&p); e != nil {
  320. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  321. return
  322. } else {
  323. bytes = &bs
  324. serialNumber = p.GetHeader().GetRequestID()
  325. }
  326. case global.DelUserReceiptInfoRsp: // 删除用户发票信息请求响应
  327. var p pb.DelUserReceiptInfoRsp
  328. if err = proto.Unmarshal(b, &p); err != nil {
  329. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  330. return
  331. }
  332. if bs, e := protojson.Marshal(&p); e != nil {
  333. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  334. return
  335. } else {
  336. bytes = &bs
  337. serialNumber = p.GetHeader().GetRequestID()
  338. }
  339. case global.T2bBankSignRsp: // 签约应答
  340. var p pb.T2BBankSignRsp
  341. if err = proto.Unmarshal(b, &p); err != nil {
  342. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  343. return
  344. }
  345. if bs, e := protojson.Marshal(&p); e != nil {
  346. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  347. return
  348. } else {
  349. bytes = &bs
  350. serialNumber = p.GetHeader().GetRequestID()
  351. }
  352. case global.T2bBankCancelSignRsp: // 解约应答
  353. var p pb.T2BBankCancelSignRsp
  354. if err = proto.Unmarshal(b, &p); err != nil {
  355. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  356. return
  357. }
  358. if bs, e := protojson.Marshal(&p); e != nil {
  359. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  360. return
  361. } else {
  362. bytes = &bs
  363. serialNumber = p.GetHeader().GetRequestID()
  364. }
  365. case global.T2bBankWithdrawRsp: // 出金应答
  366. var p pb.T2BBankWithdrawRsp
  367. if err = proto.Unmarshal(b, &p); err != nil {
  368. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  369. return
  370. }
  371. if bs, e := protojson.Marshal(&p); e != nil {
  372. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  373. return
  374. } else {
  375. bytes = &bs
  376. serialNumber = p.GetHeader().GetRequestID()
  377. }
  378. case global.T2bBankDepositRsp: // 入金应答
  379. var p pb.T2BBankDepositRsp
  380. if err = proto.Unmarshal(b, &p); err != nil {
  381. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  382. return
  383. }
  384. if bs, e := protojson.Marshal(&p); e != nil {
  385. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  386. return
  387. } else {
  388. bytes = &bs
  389. serialNumber = p.GetHeader().GetRequestID()
  390. }
  391. case global.WarehouseApplyRsp: // 仓库申请应答
  392. var p pb.WarehouseApplyRsp
  393. if err = proto.Unmarshal(b, &p); err != nil {
  394. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  395. return
  396. }
  397. if bs, e := protojson.Marshal(&p); e != nil {
  398. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  399. return
  400. } else {
  401. bytes = &bs
  402. serialNumber = p.GetHeader().GetRequestID()
  403. }
  404. case global.PerformanceContractedApplyRsp: // 违约申请应答
  405. var p pb.PerformanceContractedApplyRsp
  406. if err = proto.Unmarshal(b, &p); err != nil {
  407. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  408. return
  409. }
  410. if bs, e := protojson.Marshal(&p); e != nil {
  411. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  412. return
  413. } else {
  414. bytes = &bs
  415. serialNumber = p.GetHeader().GetRequestID()
  416. }
  417. case global.PerformanceDelayApplyRsp: // 延期申请应答
  418. var p pb.PerformanceDelayApplyRsp
  419. if err = proto.Unmarshal(b, &p); err != nil {
  420. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  421. return
  422. }
  423. if bs, e := protojson.Marshal(&p); e != nil {
  424. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  425. return
  426. } else {
  427. bytes = &bs
  428. serialNumber = p.GetHeader().GetRequestID()
  429. }
  430. case global.PerformanceManualConfirmRsp: // 履约手动确认应答
  431. var p pb.PerformanceManualConfirmRsp
  432. if err = proto.Unmarshal(b, &p); err != nil {
  433. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  434. return
  435. }
  436. if bs, e := protojson.Marshal(&p); e != nil {
  437. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  438. return
  439. } else {
  440. bytes = &bs
  441. serialNumber = p.GetHeader().GetRequestID()
  442. }
  443. case global.PerformanceModifyContactRsp: // 履约修改联络信息回应
  444. var p pb.PerformanceModifyContactRsp
  445. if err = proto.Unmarshal(b, &p); err != nil {
  446. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  447. return
  448. }
  449. if bs, e := protojson.Marshal(&p); e != nil {
  450. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  451. return
  452. } else {
  453. bytes = &bs
  454. serialNumber = p.GetHeader().GetRequestID()
  455. }
  456. case global.GoodsFavoriteOperateRsp: // 商品收藏操作接口应答
  457. var p pb.GoodsFavoriteOperateRsp
  458. if err = proto.Unmarshal(b, &p); err != nil {
  459. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  460. return
  461. }
  462. if bs, e := protojson.Marshal(&p); e != nil {
  463. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  464. return
  465. } else {
  466. bytes = &bs
  467. serialNumber = p.GetHeader().GetRequestID()
  468. }
  469. case global.ZSBuyOrderListingRsp: // 钻石买挂牌接口应答
  470. var p pb.ZSBuyOrderListingRsp
  471. if err = proto.Unmarshal(b, &p); err != nil {
  472. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  473. return
  474. }
  475. if bs, e := protojson.Marshal(&p); e != nil {
  476. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  477. return
  478. } else {
  479. bytes = &bs
  480. serialNumber = p.GetHeader().GetRequestID()
  481. }
  482. case global.ZSSellOrderListingRsp: // 钻石卖挂牌接口响应
  483. var p pb.ZSSellOrderListingRsp
  484. if err = proto.Unmarshal(b, &p); err != nil {
  485. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  486. return
  487. }
  488. if bs, e := protojson.Marshal(&p); e != nil {
  489. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  490. return
  491. } else {
  492. bytes = &bs
  493. serialNumber = p.GetHeader().GetRequestID()
  494. }
  495. case global.ZSBuyOrderDestingRsp: // 钻石卖摘牌申请接口响应
  496. var p pb.ZSBuyOrderDestingRsp
  497. if err = proto.Unmarshal(b, &p); err != nil {
  498. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  499. return
  500. }
  501. if bs, e := protojson.Marshal(&p); e != nil {
  502. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  503. return
  504. } else {
  505. bytes = &bs
  506. serialNumber = p.GetHeader().GetRequestID()
  507. }
  508. case global.ZSSellOrderDestingApplyOperateRsp: // 钻石卖摘牌申请操作接口应答
  509. var p pb.ZSSellOrderDestingApplyOperateRsp
  510. if err = proto.Unmarshal(b, &p); err != nil {
  511. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  512. return
  513. }
  514. if bs, e := protojson.Marshal(&p); e != nil {
  515. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  516. return
  517. } else {
  518. bytes = &bs
  519. serialNumber = p.GetHeader().GetRequestID()
  520. }
  521. case global.ZSBuyOrderDestingNegPriceRsp: // 买摘牌询价接口应答
  522. var p pb.ZSBuyOrderDestingNegPriceRsp
  523. if err = proto.Unmarshal(b, &p); err != nil {
  524. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  525. return
  526. }
  527. if bs, e := protojson.Marshal(&p); e != nil {
  528. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  529. return
  530. } else {
  531. bytes = &bs
  532. serialNumber = p.GetHeader().GetRequestID()
  533. }
  534. case global.ZSBuyOrderDestingNegPriceOperateRsp: // 买摘牌询价操作接口应答
  535. var p pb.ZSBuyOrderDestingNegPriceOperateRsp
  536. if err = proto.Unmarshal(b, &p); err != nil {
  537. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  538. return
  539. }
  540. if bs, e := protojson.Marshal(&p); e != nil {
  541. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  542. return
  543. } else {
  544. bytes = &bs
  545. serialNumber = p.GetHeader().GetRequestID()
  546. }
  547. case global.WRListingCancelOrderRsp: // 挂牌撤单应答
  548. var p pb.WRListingCancelOrderRsp
  549. if err = proto.Unmarshal(b, &p); err != nil {
  550. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  551. return
  552. }
  553. if bs, e := protojson.Marshal(&p); e != nil {
  554. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  555. return
  556. } else {
  557. bytes = &bs
  558. serialNumber = p.GetHeader().GetRequestID()
  559. }
  560. case global.HdWROrderRsp:
  561. var p pb.HdWROrderRsp
  562. if err = proto.Unmarshal(b, &p); err != nil {
  563. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  564. return
  565. }
  566. if bs, e := protojson.Marshal(&p); e != nil {
  567. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  568. return
  569. } else {
  570. bytes = &bs
  571. serialNumber = p.GetHeader().GetRequestID()
  572. }
  573. case global.WROutApplyRsp:
  574. var p pb.WROutApplyRsp
  575. if err = proto.Unmarshal(b, &p); err != nil {
  576. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  577. return
  578. }
  579. if bs, e := protojson.Marshal(&p); e != nil {
  580. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  581. return
  582. } else {
  583. bytes = &bs
  584. serialNumber = p.GetHeader().GetRequestID()
  585. }
  586. case global.ReceiptZSOutApplyRsp: // 钻石出库申请接口响应
  587. var p pb.ReceiptZSOutApplyRsp
  588. if err = proto.Unmarshal(b, &p); err != nil {
  589. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  590. return
  591. }
  592. if bs, e := protojson.Marshal(&p); e != nil {
  593. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  594. return
  595. } else {
  596. bytes = &bs
  597. serialNumber = p.GetHeader().GetRequestID()
  598. }
  599. case global.SpotPresaleListingOrderRsp: // 铁合金现货预售挂牌接口应答
  600. var p pb.SpotPresaleListingOrderRsp
  601. if err = proto.Unmarshal(b, &p); err != nil {
  602. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  603. return
  604. }
  605. if bs, e := protojson.Marshal(&p); e != nil {
  606. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  607. return
  608. } else {
  609. bytes = &bs
  610. serialNumber = p.GetHeader().GetRequestID()
  611. }
  612. case global.CJJCMemberOperateRsp: // 出境检测会员操作响应
  613. var p pb.CJJCMemberOperateRsp
  614. if err = proto.Unmarshal(b, &p); err != nil {
  615. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  616. return
  617. }
  618. if bs, e := protojson.Marshal(&p); e != nil {
  619. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  620. return
  621. } else {
  622. bytes = &bs
  623. serialNumber = p.GetHeader().GetRequestID()
  624. }
  625. case global.BSFWMemberOperateRsp: // 保税服务会员操作响应
  626. var p pb.BSFWMemberOperateRsp
  627. if err = proto.Unmarshal(b, &p); err != nil {
  628. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  629. return
  630. }
  631. if bs, e := protojson.Marshal(&p); e != nil {
  632. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  633. return
  634. } else {
  635. bytes = &bs
  636. serialNumber = p.GetHeader().GetRequestID()
  637. }
  638. case global.AccountFundInfoRsp: // 账户资金信息响应
  639. var p pb.AccountFundInfoRsp
  640. if err = proto.Unmarshal(b, &p); err != nil {
  641. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  642. return
  643. }
  644. if bs, e := protojson.Marshal(&p); e != nil {
  645. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  646. return
  647. } else {
  648. bytes = &bs
  649. serialNumber = p.GetHeader().GetRequestID()
  650. }
  651. case global.GZPresaleApplyRsp: // 广钻预售申请响应
  652. var p pb.GZPresaleApplyRsp
  653. if err = proto.Unmarshal(b, &p); err != nil {
  654. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  655. return
  656. }
  657. if bs, e := protojson.Marshal(&p); e != nil {
  658. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  659. return
  660. } else {
  661. bytes = &bs
  662. serialNumber = p.GetHeader().GetRequestID()
  663. }
  664. case global.GZPresaleOrderRsp: // 广钻预售认购下单响应
  665. var p pb.GZPresaleOrderRsp
  666. if err = proto.Unmarshal(b, &p); err != nil {
  667. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  668. return
  669. }
  670. if bs, e := protojson.Marshal(&p); e != nil {
  671. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  672. return
  673. } else {
  674. bytes = &bs
  675. serialNumber = p.GetHeader().GetRequestID()
  676. }
  677. case global.GZCenterPurchaseApplyRsp: // 广钻集采申请响应
  678. var p pb.GZCenterPurchaseApplyRsp
  679. if err = proto.Unmarshal(b, &p); err != nil {
  680. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  681. return
  682. }
  683. if bs, e := protojson.Marshal(&p); e != nil {
  684. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  685. return
  686. } else {
  687. bytes = &bs
  688. serialNumber = p.GetHeader().GetRequestID()
  689. }
  690. case global.GZCenterPurchaseOrderRsp: // 广钻集采认购下单响应
  691. var p pb.GZCenterPurchaseOrderRsp
  692. if err = proto.Unmarshal(b, &p); err != nil {
  693. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  694. return
  695. }
  696. if bs, e := protojson.Marshal(&p); e != nil {
  697. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  698. return
  699. } else {
  700. bytes = &bs
  701. serialNumber = p.GetHeader().GetRequestID()
  702. }
  703. case global.BSWMSReckonPayRsp: // WMS结算单支付接口响应
  704. var p pb.BSWMSReckonPayRsp
  705. if err = proto.Unmarshal(b, &p); err != nil {
  706. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  707. return
  708. }
  709. if bs, e := protojson.Marshal(&p); e != nil {
  710. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  711. return
  712. } else {
  713. bytes = &bs
  714. serialNumber = p.GetHeader().GetRequestID()
  715. }
  716. case global.OrderRsp:
  717. var p pb.OrderRsp
  718. if err = proto.Unmarshal(b, &p); err != nil {
  719. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  720. return
  721. }
  722. if bs, e := protojson.Marshal(&p); e != nil {
  723. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  724. return
  725. } else {
  726. bytes = &bs
  727. serialNumber = p.GetHeader().GetRequestID()
  728. }
  729. case global.CancelOrderRsp:
  730. var p pb.CancelOrderRsp
  731. if err = proto.Unmarshal(b, &p); err != nil {
  732. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  733. return
  734. }
  735. if bs, e := protojson.Marshal(&p); e != nil {
  736. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  737. return
  738. } else {
  739. bytes = &bs
  740. serialNumber = p.GetHeader().GetRequestID()
  741. }
  742. case global.HolderCloseRsp:
  743. var p pb.HolderCloseRsp
  744. if err = proto.Unmarshal(b, &p); err != nil {
  745. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  746. return
  747. }
  748. if bs, e := protojson.Marshal(&p); e != nil {
  749. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  750. return
  751. } else {
  752. bytes = &bs
  753. serialNumber = p.GetHeader().GetRequestID()
  754. }
  755. case global.DeliveryOrderRsp:
  756. var p pb.DeliveryOrderRsp
  757. if err = proto.Unmarshal(b, &p); err != nil {
  758. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  759. return
  760. }
  761. if bs, e := protojson.Marshal(&p); e != nil {
  762. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  763. return
  764. } else {
  765. bytes = &bs
  766. serialNumber = p.GetHeader().GetRequestID()
  767. }
  768. case global.MakeUpDepositRsp:
  769. var p pb.MakeUpDepositRsp
  770. if err = proto.Unmarshal(b, &p); err != nil {
  771. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  772. return
  773. }
  774. if bs, e := protojson.Marshal(&p); e != nil {
  775. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  776. return
  777. } else {
  778. bytes = &bs
  779. serialNumber = p.GetHeader().GetRequestID()
  780. }
  781. case global.HoldAppendDepositRsp:
  782. var p pb.HoldAppendDepositRsp
  783. if err = proto.Unmarshal(b, &p); err != nil {
  784. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  785. return
  786. }
  787. if bs, e := protojson.Marshal(&p); e != nil {
  788. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  789. return
  790. } else {
  791. bytes = &bs
  792. serialNumber = p.GetHeader().GetRequestID()
  793. }
  794. case global.OfflineDeliveryRsp:
  795. var p pb.OfflineDeliveryRsp
  796. if err = proto.Unmarshal(b, &p); err != nil {
  797. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  798. return
  799. }
  800. if bs, e := protojson.Marshal(&p); e != nil {
  801. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  802. return
  803. } else {
  804. bytes = &bs
  805. serialNumber = p.GetHeader().GetRequestID()
  806. }
  807. case global.HdWRDealOrderRsp:
  808. var p pb.HdWRDealOrderRsp
  809. if err = proto.Unmarshal(b, &p); err != nil {
  810. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  811. return
  812. }
  813. if bs, e := protojson.Marshal(&p); e != nil {
  814. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  815. return
  816. } else {
  817. bytes = &bs
  818. serialNumber = p.GetHeader().GetRequestID()
  819. }
  820. case global.SupplementDepositRsp:
  821. var p pb.SupplementDepositRsp
  822. if err = proto.Unmarshal(b, &p); err != nil {
  823. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  824. return
  825. }
  826. if bs, e := protojson.Marshal(&p); e != nil {
  827. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  828. return
  829. } else {
  830. bytes = &bs
  831. serialNumber = p.GetHeader().GetRequestID()
  832. }
  833. case global.RefundedDepositRsp:
  834. var p pb.RefundedDepositRsp
  835. if err = proto.Unmarshal(b, &p); err != nil {
  836. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  837. return
  838. }
  839. if bs, e := protojson.Marshal(&p); e != nil {
  840. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  841. return
  842. } else {
  843. bytes = &bs
  844. serialNumber = p.GetHeader().GetRequestID()
  845. }
  846. case global.MarketOrderDeliveryApplyRsp:
  847. var p pb.MarketOrderDeliveryApplyRsp
  848. if err = proto.Unmarshal(b, &p); err != nil {
  849. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  850. return
  851. }
  852. if bs, e := protojson.Marshal(&p); e != nil {
  853. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  854. return
  855. } else {
  856. bytes = &bs
  857. serialNumber = p.GetHeader().GetRequestID()
  858. }
  859. case global.DeliveryClientOperatorRsp:
  860. var p pb.DeliveryClientOperatorRsp
  861. if err = proto.Unmarshal(b, &p); err != nil {
  862. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  863. return
  864. }
  865. if bs, e := protojson.Marshal(&p); e != nil {
  866. global.M2A_LOG.Error("总线回复数据反序列化失败", zap.Error(err))
  867. return
  868. } else {
  869. bytes = &bs
  870. serialNumber = p.GetHeader().GetRequestID()
  871. }
  872. }
  873. return
  874. }
  875. // RabbitMQSubscribeTopic 订阅主题
  876. func RabbitMQSubscribeTopic() (err error) {
  877. // 订阅需要的总线响应主题
  878. if err = rabbitmq.SubscribeTopic(global.TOPIC_RSP_USER); err != nil {
  879. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  880. return
  881. }
  882. if err = rabbitmq.SubscribeTopic(global.TOPIC_RSP_NTF); err != nil {
  883. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  884. return
  885. }
  886. if err = rabbitmq.SubscribeTopic(global.TOPIC_CLIENT_NTF); err != nil {
  887. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  888. return
  889. }
  890. if err = rabbitmq.SubscribeTopic(global.TOPIC_RSP_QKERNEL); err != nil {
  891. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  892. return
  893. }
  894. if err = rabbitmq.SubscribeTopic(global.TOPIC_MANAGE_RSP); err != nil {
  895. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  896. return
  897. }
  898. if err = rabbitmq.SubscribeTopic(global.TOPIC_RSP_BANK); err != nil {
  899. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  900. return
  901. }
  902. if err = rabbitmq.SubscribeTopic(global.TOPIC_RSP_MONEY); err != nil {
  903. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  904. return
  905. }
  906. if err = rabbitmq.SubscribeTopic(global.TOPIC_PERFORMANCE_RSP); err != nil {
  907. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  908. return
  909. }
  910. if err = rabbitmq.SubscribeTopic(global.TOPIC_WAREHOUSE_RECIEPT_RSP); err != nil {
  911. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  912. return
  913. }
  914. if err = rabbitmq.SubscribeTopic(global.TOPIC_RSP_WAREHOUSE_TRADE); err != nil {
  915. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  916. return
  917. }
  918. if err = rabbitmq.SubscribeTopic(global.TOPIC_RSP_WAREHOUSE_TRADE_GZ); err != nil {
  919. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  920. return
  921. }
  922. if err = rabbitmq.SubscribeTopic(global.TOPIC_RSP_CJBS_TRADE_GZ); err != nil {
  923. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  924. return
  925. }
  926. // 铁合金
  927. if err = rabbitmq.SubscribeTopic(global.TOPIC_RSP_WAREHOUSE_PRESALE_THJ); err != nil {
  928. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  929. return
  930. }
  931. if err = rabbitmq.SubscribeTopic(global.TOPIC_MANAGER_THJ_NTF); err != nil {
  932. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  933. return
  934. }
  935. if err = rabbitmq.SubscribeTopic(global.TOPIC_RSP_WAREHOUSE_PRESALE_GZ); err != nil {
  936. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  937. return
  938. }
  939. if err = rabbitmq.SubscribeTopic(global.TOPIC_RSP_WAREHOUSE_CENTERPURCHASE_GZ); err != nil {
  940. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  941. return
  942. }
  943. if err = rabbitmq.SubscribeTopic(global.TOPIC_RSP_ORDER); err != nil {
  944. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  945. return
  946. }
  947. if err = rabbitmq.SubscribeTopic(global.TOPIC_RSP_DELIVERY_TRADE); err != nil {
  948. global.M2A_LOG.Error("rabbitmq subscribe topic failed, err:", zap.Error(err))
  949. return
  950. }
  951. global.M2A_LOG.Info("rabbitmq subscribe topic successed.")
  952. return
  953. }
  954. // StartRabbitMQReceive 开始接收总线消息
  955. func StartRabbitMQReceive() {
  956. t := &MQProc{}
  957. go func() {
  958. for _, subinfo := range rabbitmq.SubInfos {
  959. rabbitmq.Receive(subinfo.Topic, subinfo.QueueName, t)
  960. }
  961. }()
  962. }
  963. // InitFuncodeTopic 初始化功能码主题MAP
  964. func InitFuncodeTopic() {
  965. if global.M2A_FuncodeTopic == nil {
  966. global.M2A_FuncodeTopic = make(map[string][]int)
  967. }
  968. global.M2A_FuncodeTopic[global.TOPIC_REQ_QKERNEL] = []int{
  969. global.ModifyPwdReq,
  970. }
  971. global.M2A_FuncodeTopic[global.TOPIC_MANAGE_REQ] = []int{
  972. global.UserReceiveInfoReq,
  973. global.DelUserReceiveInfoReq,
  974. global.UserReceiveIsDefaultReq,
  975. global.UserReceiptInfoReq,
  976. global.DelUserReceiptInfoReq,
  977. global.WarehouseApplyReq,
  978. global.WROutApplyReq,
  979. }
  980. global.M2A_FuncodeTopic[global.TOPIC_REQ_BANK] = []int{
  981. global.T2bBankSignReq,
  982. global.T2bBankCancelSignReq,
  983. global.T2bBankWithdrawReq,
  984. global.T2bBankDepositReq,
  985. }
  986. global.M2A_FuncodeTopic[global.TOPIC_REQ_MONEY] = []int{
  987. global.AccountFundInfoReq,
  988. }
  989. global.M2A_FuncodeTopic[global.TOPIC_PERFORMANCE_REQ] = []int{
  990. global.PerformanceContractedApplyReq,
  991. global.PerformanceDelayApplyReq,
  992. global.PerformanceManualConfirmReq,
  993. global.PerformanceModifyContactReq,
  994. }
  995. global.M2A_FuncodeTopic[global.TOPIC_WAREHOUSE_RECIEPT] = []int{
  996. global.ReceiptZSOutApplyReq,
  997. }
  998. global.M2A_FuncodeTopic[global.TOPIC_REQ_WAREHOUSE_TRADE] = []int{
  999. global.WRListingCancelOrderReq,
  1000. global.HdWROrderReq,
  1001. global.HdWRDealOrderReq,
  1002. }
  1003. global.M2A_FuncodeTopic[global.TOPIC_REQ_WAREHOUSE_TRADE_GZ] = []int{
  1004. global.GoodsFavoriteOperateReq,
  1005. global.ZSBuyOrderListingReq,
  1006. global.ZSSellOrderListingReq,
  1007. global.ZSBuyOrderDestingReq,
  1008. global.ZSSellOrderDestingApplyReq,
  1009. global.ZSSellOrderDestingApplyOperateReq,
  1010. global.ZSBuyOrderDestingNegPriceReq,
  1011. global.ZSBuyOrderDestingNegPriceOperateReq,
  1012. }
  1013. global.M2A_FuncodeTopic[global.TOPIC_REQ_CJBS_TRADE_GZ] = []int{
  1014. global.CJJCMemberOperateReq,
  1015. global.BSFWMemberOperateReq,
  1016. global.BSWMSReckonPayReq,
  1017. }
  1018. // 铁合金
  1019. global.M2A_FuncodeTopic[global.TOPIC_REQ_WAREHOUSE_PRESALE_THJ] = []int{
  1020. global.SpotPresaleListingOrderReq,
  1021. }
  1022. global.M2A_FuncodeTopic[global.TOPIC_REQ_WAREHOUSE_PRESALE_GZ] = []int{
  1023. global.GZPresaleApplyReq,
  1024. global.GZPresaleOrderReq,
  1025. }
  1026. global.M2A_FuncodeTopic[global.TOPIC_REQ_WAREHOUSE_CENTERPURCHASE_GZ] = []int{
  1027. global.GZCenterPurchaseApplyReq,
  1028. global.GZCenterPurchaseOrderReq,
  1029. }
  1030. global.M2A_FuncodeTopic[global.TOPIC_REQ_ORDER] = []int{
  1031. global.OrderReq,
  1032. global.CancelOrderReq,
  1033. global.HolderCloseReq,
  1034. global.MakeUpDepositReq,
  1035. global.HoldAppendDepositReq,
  1036. global.OfflineDeliveryReq,
  1037. global.SupplementDepositReq,
  1038. global.RefundedDepositReq,
  1039. global.MarketOrderDeliveryApplyReq,
  1040. global.DeliveryClientOperatorReq,
  1041. }
  1042. global.M2A_FuncodeTopic[global.TOPIC_REQ_DELIVERY_TRADE] = []int{
  1043. global.DeliveryOrderReq,
  1044. }
  1045. global.M2A_FuncodeTopic[global.TOPIC_REQ_USER] = []int{
  1046. global.LoginReq,
  1047. }
  1048. }