Administrator
2025-12-17 815aa1f65c9430fe23256fb6a9ee0a131274fc0a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package com.xcong.excoin.modules.okxNewPrice.okxWs;
 
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.xcong.excoin.modules.okxNewPrice.okxWs.enums.CoinEnums;
import com.xcong.excoin.modules.okxNewPrice.okxWs.enums.OrderParamEnums;
import com.xcong.excoin.modules.okxNewPrice.okxWs.wanggeList.WangGeListEnum;
import com.xcong.excoin.modules.okxNewPrice.okxpi.MallUtils;
import com.xcong.excoin.modules.okxNewPrice.utils.WsMapBuild;
import com.xcong.excoin.modules.okxNewPrice.utils.WsParamBuild;
import com.xcong.excoin.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.java_websocket.client.WebSocketClient;
 
import java.math.BigDecimal;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
 
/**
 * @author Administrator
 */
@Slf4j
public class OrderInfoWs {
 
    // 使用双层Map,第一层key为账号名称,第二层key为数据key
    public static final Map<String, Map<String, String>> ORDERINFOWSMAP = new ConcurrentHashMap<>();
    
    // 获取指定账号的Map,如果不存在则创建
    public static Map<String, String> getAccountMap(String accountName) {
        return ORDERINFOWSMAP.computeIfAbsent(accountName, k -> new ConcurrentHashMap<>());
    }
 
    public static final String ORDERINFOWS_CHANNEL = "orders";
 
    public static void subscribeOrderInfoChannel(WebSocketClient webSocketClient, String option) {
        try {
            JSONArray argsArray = new JSONArray();
            JSONObject args = new JSONObject();
            args.put("channel", ORDERINFOWS_CHANNEL);
            args.put("instType", CoinEnums.INSTTYPE_SWAP.getCode());
            args.put("instId", CoinEnums.HE_YUE.getCode());
            argsArray.add(args);
 
            String connId = MallUtils.getOrderNum(ORDERINFOWS_CHANNEL);
            JSONObject jsonObject = WsParamBuild.buildJsonObject(connId, option, argsArray);
            webSocketClient.send(jsonObject.toJSONString());
//            log.info("发送订单频道频道:{}", option);
        } catch (Exception e) {
            log.error("订阅订单频道构建失败", e);
        }
    }
 
    public static void initEvent(JSONObject response, String accountName) {
//        log.info("订阅成功: {}", response.getJSONObject("arg"));
    }
 
 
    private static final String DATA_KEY = "data";
    private static final String INSTID_KEY = "instId";
    private static final String ORDID_KEY = "ordId";
    private static final String CLORDID_KEY = "clOrdId";
    private static final String SIDE_KEY = "side";
    private static final String TDMODE_KEY = "tdMode";
    private static final String ACCFILLSZ_KEY = "accFillSz";
    private static final String AVGPX_KEY = "avgPx";
    private static final String STATE_KEY = "state";
    public static void handleEvent(JSONObject response, RedisUtils redisUtils, String accountName) {
 
//        log.info("开始执行OrderInfoWs......");
        try {
            JSONArray dataArray = response.getJSONArray(DATA_KEY);
            if (dataArray == null || dataArray.isEmpty()) {
                log.warn("订单频道数据为空");
                return;
            }
 
            for (int i = 0; i < dataArray.size(); i++) {
                JSONObject detail = dataArray.getJSONObject(i);
 
                String instId = detail.getString(INSTID_KEY);
                if (!CoinEnums.HE_YUE.getCode().equals(instId)){
                    log.info( "订单详情-币种: {} 没有成交订单", CoinEnums.HE_YUE.getCode() );
                    continue;
                }
                String ordId = detail.getString(ORDID_KEY);
                String clOrdId = detail.getString(CLORDID_KEY);
                String side = detail.getString(SIDE_KEY);
                String tdMode = detail.getString(TDMODE_KEY);
                String accFillSz = detail.getString(ACCFILLSZ_KEY);
                String avgPx = detail.getString(AVGPX_KEY);
                String state = detail.getString(STATE_KEY);
 
                log.info(
                        "{}: 订单详情-币种: {}, 系统编号: {}, 自定义编号: {}, 订单方向: {}, 交易模式: {}," +
                                " 累计成交数量: {}, 成交均价: {}, 订单状态: {}",
                        accountName, instId, ordId, clOrdId, side, tdMode,
                        accFillSz, avgPx,state
                );
 
                String clOrdIdStr = TradeOrderWs.getAccountMap(accountName).get("clOrdId");
                String stateStr = TradeOrderWs.getAccountMap(accountName).get("state");
                if (
                        StrUtil.isNotBlank(clOrdIdStr)
                                && clOrdId.equals(clOrdIdStr)
                                && StrUtil.isNotBlank(stateStr)
                                && state.equals(stateStr)
                ){
                    Map<String, String> accountMap = getAccountMap(accountName);
                    //记录成交均价
                    if (accountMap.get("orderPrice") == null){
                        WsMapBuild.saveStringToMap(accountMap, "orderPrice",avgPx);
                    }
                    WsMapBuild.saveStringToMap(TradeOrderWs.getAccountMap(accountName), "state", CoinEnums.ORDER_LIVE.getCode());
 
                    //保存上一个网格信息
                    WangGeListEnum gridByPrice = WangGeListEnum.getGridByPrice(new BigDecimal(avgPx));
                    if (gridByPrice != null){
                        Map<String, String> instrumentsMap = InstrumentsWs.getAccountMap(accountName);
                        WsMapBuild.saveStringToMap(instrumentsMap, CoinEnums.WANG_GE_OLD.name(), gridByPrice.name());
                    }
 
                    // 使用账号特定的Map
                    String positionAccountName = PositionsWs.initAccountName(accountName, side);
                    Map<String, BigDecimal> positionsMap = PositionsWs.getAccountMap(positionAccountName);
                    WsMapBuild.saveBigDecimalToMap(positionsMap, CoinEnums.READY_STATE.name(), WsMapBuild.parseBigDecimalSafe(CoinEnums.READY_STATE_NO.getCode()));
 
                    Map<String, String> accountWsMap = AccountWs.getAccountMap(accountName);
                    WsMapBuild.saveStringToMap(accountWsMap, CoinEnums.READY_STATE.name(), CoinEnums.READY_STATE_NO.getCode());
 
                    log.info("{}: 订单详情已完成: {}, 自定义编号: {}", accountName, CoinEnums.HE_YUE.getCode(), clOrdId);
                }
            }
        } catch (Exception e) {
            log.error("处理订单频道推送数据失败", e);
        }
    }
 
}