219 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			219 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package excservice
 | |
| 
 | |
| import (
 | |
| 	"go-admin/pkg/utility"
 | |
| 
 | |
| 	"github.com/bytedance/sonic"
 | |
| 	log "github.com/go-admin-team/go-admin-core/logger"
 | |
| )
 | |
| 
 | |
| /*
 | |
| Bitget用户订单订阅处理
 | |
|   - @msg 消息内容
 | |
|   - @listenType 订阅类型 0-现货 1-合约
 | |
| */
 | |
| func ReceiveBitgetListen(msg []byte, listenType int, apiKey string) (reconnect bool, err error) {
 | |
| 	var dataMap map[string]interface{}
 | |
| 	err = sonic.Unmarshal(msg, &dataMap)
 | |
| 
 | |
| 	if err != nil {
 | |
| 		log.Error("接收Bitget ws 反序列化失败:", err)
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	// 检查是否是操作响应
 | |
| 	if op, exists := dataMap["op"]; exists {
 | |
| 		switch op {
 | |
| 		case "login":
 | |
| 			return handleBitgetLogin(dataMap, apiKey)
 | |
| 		case "subscribe":
 | |
| 			return handleBitgetSubscribe(dataMap, apiKey)
 | |
| 		case "unsubscribe":
 | |
| 			return handleBitgetUnsubscribe(dataMap, apiKey)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// 检查是否是数据推送
 | |
| 	if arg, exists := dataMap["arg"]; exists {
 | |
| 		return handleBitgetDataPush(dataMap, arg, listenType, apiKey)
 | |
| 	}
 | |
| 
 | |
| 	log.Info("未知Bitget事件 内容:", string(msg))
 | |
| 	return false, nil
 | |
| }
 | |
| 
 | |
| // handleBitgetLogin 处理登录响应
 | |
| func handleBitgetLogin(dataMap map[string]interface{}, apiKey string) (bool, error) {
 | |
| 	if code, exists := dataMap["code"]; exists {
 | |
| 		if code == "0" || code == 0 {
 | |
| 			log.Info("Bitget WebSocket登录成功 key:%s", apiKey)
 | |
| 		} else {
 | |
| 			log.Error("Bitget WebSocket登录失败 key:%s code:%v", apiKey, code)
 | |
| 			return true, nil // 需要重连
 | |
| 		}
 | |
| 	}
 | |
| 	return false, nil
 | |
| }
 | |
| 
 | |
| // handleBitgetSubscribe 处理订阅响应
 | |
| func handleBitgetSubscribe(dataMap map[string]interface{}, apiKey string) (bool, error) {
 | |
| 	if code, exists := dataMap["code"]; exists {
 | |
| 		if code == "0" || code == 0 {
 | |
| 			log.Info("Bitget WebSocket订阅成功 key:%s", apiKey)
 | |
| 		} else {
 | |
| 			log.Error("Bitget WebSocket订阅失败 key:%s code:%v", apiKey, code)
 | |
| 		}
 | |
| 	}
 | |
| 	return false, nil
 | |
| }
 | |
| 
 | |
| // handleBitgetUnsubscribe 处理取消订阅响应
 | |
| func handleBitgetUnsubscribe(dataMap map[string]interface{}, apiKey string) (bool, error) {
 | |
| 	if code, exists := dataMap["code"]; exists {
 | |
| 		if code == "0" || code == 0 {
 | |
| 			log.Info("Bitget WebSocket取消订阅成功 key:%s", apiKey)
 | |
| 		} else {
 | |
| 			log.Error("Bitget WebSocket取消订阅失败 key:%s code:%v", apiKey, code)
 | |
| 		}
 | |
| 	}
 | |
| 	return false, nil
 | |
| }
 | |
| 
 | |
| // handleBitgetDataPush 处理数据推送
 | |
| func handleBitgetDataPush(dataMap map[string]interface{}, arg interface{}, listenType int, apiKey string) (bool, error) {
 | |
| 	argMap, ok := arg.(map[string]interface{})
 | |
| 	if !ok {
 | |
| 		log.Error("Bitget数据推送参数格式错误 key:%s", apiKey)
 | |
| 		return false, nil
 | |
| 	}
 | |
| 
 | |
| 	channel, exists := argMap["channel"]
 | |
| 	if !exists {
 | |
| 		log.Error("Bitget数据推送缺少channel参数 key:%s", apiKey)
 | |
| 		return false, nil
 | |
| 	}
 | |
| 
 | |
| 	switch channel {
 | |
| 	case "account":
 | |
| 		return handleBitgetAccount(dataMap, listenType, apiKey)
 | |
| 	case "orders":
 | |
| 		return handleBitgetOrders(dataMap, listenType, apiKey)
 | |
| 	case "positions":
 | |
| 		return handleBitgetPositions(dataMap, listenType, apiKey)
 | |
| 	case "balance":
 | |
| 		return handleBitgetBalance(dataMap, listenType, apiKey)
 | |
| 	default:
 | |
| 		log.Info("收到Bitget未处理的频道数据 channel:%v key:%s", channel, apiKey)
 | |
| 	}
 | |
| 
 | |
| 	return false, nil
 | |
| }
 | |
| 
 | |
| // handleBitgetAccount 处理账户更新
 | |
| func handleBitgetAccount(dataMap map[string]interface{}, listenType int, apiKey string) (bool, error) {
 | |
| 	log.Info("收到Bitget账户更新 listenType:%d key:%s", listenType, apiKey)
 | |
| 
 | |
| 	data, exists := dataMap["data"]
 | |
| 	if !exists {
 | |
| 		return false, nil
 | |
| 	}
 | |
| 
 | |
| 	// 这里可以根据需要实现具体的账户更新处理逻辑
 | |
| 	// 类似于binanceservice.ChangeSpotOrder或binanceservice.ChangeFutureOrder
 | |
| 
 | |
| 	utility.SafeGo(func() {
 | |
| 		handleBitgetAccountUpdate(data, listenType, apiKey)
 | |
| 	})
 | |
| 
 | |
| 	return false, nil
 | |
| }
 | |
| 
 | |
| // handleBitgetOrders 处理订单更新
 | |
| func handleBitgetOrders(dataMap map[string]interface{}, listenType int, apiKey string) (bool, error) {
 | |
| 	log.Info("收到Bitget订单更新 listenType:%d key:%s", listenType, apiKey)
 | |
| 
 | |
| 	data, exists := dataMap["data"]
 | |
| 	if !exists {
 | |
| 		return false, nil
 | |
| 	}
 | |
| 
 | |
| 	utility.SafeGo(func() {
 | |
| 		handleBitgetOrderUpdate(data, listenType, apiKey)
 | |
| 	})
 | |
| 
 | |
| 	return false, nil
 | |
| }
 | |
| 
 | |
| // handleBitgetPositions 处理持仓更新
 | |
| func handleBitgetPositions(dataMap map[string]interface{}, listenType int, apiKey string) (bool, error) {
 | |
| 	log.Info("收到Bitget持仓更新 listenType:%d key:%s", listenType, apiKey)
 | |
| 
 | |
| 	data, exists := dataMap["data"]
 | |
| 	if !exists {
 | |
| 		return false, nil
 | |
| 	}
 | |
| 
 | |
| 	utility.SafeGo(func() {
 | |
| 		handleBitgetPositionUpdate(data, listenType, apiKey)
 | |
| 	})
 | |
| 
 | |
| 	return false, nil
 | |
| }
 | |
| 
 | |
| // handleBitgetBalance 处理余额更新
 | |
| func handleBitgetBalance(dataMap map[string]interface{}, listenType int, apiKey string) (bool, error) {
 | |
| 	log.Info("收到Bitget余额更新 listenType:%d key:%s", listenType, apiKey)
 | |
| 
 | |
| 	data, exists := dataMap["data"]
 | |
| 	if !exists {
 | |
| 		return false, nil
 | |
| 	}
 | |
| 
 | |
| 	utility.SafeGo(func() {
 | |
| 		handleBitgetBalanceUpdate(data, listenType, apiKey)
 | |
| 	})
 | |
| 
 | |
| 	return false, nil
 | |
| }
 | |
| 
 | |
| // 具体的处理函数,可以根据业务需求实现
 | |
| 
 | |
| // handleBitgetAccountUpdate 处理账户更新的具体逻辑
 | |
| func handleBitgetAccountUpdate(data interface{}, listenType int, apiKey string) {
 | |
| 	// TODO: 实现具体的账户更新处理逻辑
 | |
| 	log.Info("处理Bitget账户更新 listenType:%d key:%s data:%v", listenType, apiKey, data)
 | |
| }
 | |
| 
 | |
| // handleBitgetOrderUpdate 处理订单更新的具体逻辑
 | |
| func handleBitgetOrderUpdate(data interface{}, listenType int, apiKey string) {
 | |
| 	// TODO: 实现具体的订单更新处理逻辑
 | |
| 	log.Info("处理Bitget订单更新 listenType:%d key:%s data:%v", listenType, apiKey, data)
 | |
| 
 | |
| 	// 这里可以参考binanceservice中的订单处理逻辑
 | |
| 	// 例如:更新数据库中的订单状态、触发回调等
 | |
| }
 | |
| 
 | |
| // handleBitgetPositionUpdate 处理持仓更新的具体逻辑
 | |
| func handleBitgetPositionUpdate(data interface{}, listenType int, apiKey string) {
 | |
| 	// TODO: 实现具体的持仓更新处理逻辑
 | |
| 	log.Info("处理Bitget持仓更新 listenType:%d key:%s data:%v", listenType, apiKey, data)
 | |
| }
 | |
| 
 | |
| // handleBitgetBalanceUpdate 处理余额更新的具体逻辑
 | |
| func handleBitgetBalanceUpdate(data interface{}, listenType int, apiKey string) {
 | |
| 	// TODO: 实现具体的余额更新处理逻辑
 | |
| 	log.Info("处理Bitget余额更新 listenType:%d key:%s data:%v", listenType, apiKey, data)
 | |
| }
 | |
| 
 | |
| // getBitgetWsTypeName 获取WebSocket类型名称
 | |
| func getBitgetWsTypeName(listenType int) string {
 | |
| 	switch listenType {
 | |
| 	case 0:
 | |
| 		return "现货"
 | |
| 	case 1:
 | |
| 		return "合约"
 | |
| 	default:
 | |
| 		return "未知"
 | |
| 	}
 | |
| }
 |