From e45e705c22df5bc979e72db6014dd1ff9637be42 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Wed, 24 Jun 2026 22:21:58 +0800
Subject: [PATCH] fix(okx): 修复网格交易成交日志记录问题

---
 src/main/java/com/xcong/excoin/modules/okxApi/wsHandler/OkxChannelHandler.java |  102 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 102 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/okxApi/wsHandler/OkxChannelHandler.java b/src/main/java/com/xcong/excoin/modules/okxApi/wsHandler/OkxChannelHandler.java
new file mode 100644
index 0000000..34e2df8
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxApi/wsHandler/OkxChannelHandler.java
@@ -0,0 +1,102 @@
+package com.xcong.excoin.modules.okxApi.wsHandler;
+
+import com.alibaba.fastjson.JSONObject;
+import org.java_websocket.client.WebSocketClient;
+
+/**
+ * OKX WebSocket 频道处理器接口。
+ *
+ * <h3>定位</h3>
+ * 每个 OKX 频道对应一个实现类。新增频道只需实现此接口,
+ * 然后通过 {@code OkxKlineWebSocketClient.addPublicHandler()} 或
+ * {@code addPrivateHandler()} 注册即可。
+ *
+ * <h3>与 Gate 版本的区别</h3>
+ * OKX 的公开频道和私有频道使用不同的 WebSocket 端点(public/private),
+ * 订阅格式为 {@code {"op":"subscribe","args":[{"channel":"candle1m","instId":"ETH-USDT-SWAP"}]}},
+ * 与 Gate 的 {@code event/payload} 格式不同。
+ *
+ * <h3>实现类</h3>
+ * <ul>
+ *   <li>{@code CandlestickOkxChannelHandler} — 公开频道,K线数据</li>
+ *   <li>{@code AbstractOkxPrivateChannelHandler} — 私有频道抽象基类(separate WS + login auth)</li>
+ *   <li>{@code PositionsOkxChannelHandler} — 私有频道,仓位更新</li>
+ *   <li>{@code OrderAlgoOkxChannelHandler} — 私有频道,条件订单(algo)状态推送</li>
+ * </ul>
+ *
+ * <h3>OKX 订阅确认格式</h3>
+ * {@code {"event":"subscribe","arg":{"channel":"candle1m"}}} 表示订阅成功。
+ *
+ * <h3>OKX 数据推送格式</h3>
+ * {@code {"arg":{"channel":"positions","instType":"SWAP"},"data":[...]}}。
+ *
+ * @author Administrator
+ */
+public interface OkxChannelHandler {
+
+    /**
+     * 频道名称,如 {@code "candle1m"}、{@code "positions"}、{@code "orders-algo"}。
+     *
+     * @return OKX 频道标识字符串
+     */
+    String getChannelName();
+
+    /**
+     * 交易对标识,如 {@code "ETH-USDT-SWAP"}。
+     * OKX 订阅需要 instId 参数来指定订阅的交易对。
+     *
+     * @return OKX 格式的交易对标识
+     */
+    String getInstId();
+
+    /**
+     * 发送订阅请求到指定的 WebSocket 连接。
+     *
+     * <h3>公开频道格式</h3>
+     * <pre>
+     * {"op":"subscribe","args":[{"channel":"candle1m","instId":"ETH-USDT-SWAP"}]}
+     * </pre>
+     *
+     * <h3>私有频道格式</h3>
+     * <pre>
+     * {"op":"subscribe","args":[{"channel":"positions","instType":"SWAP"}]}
+     * </pre>
+     *
+     * @param ws 目标 WebSocket 客户端(公开或私有端点)
+     */
+    void subscribe(WebSocketClient ws);
+
+    /**
+     * 发送取消订阅请求到指定的 WebSocket 连接。
+     *
+     * @param ws 目标 WebSocket 客户端
+     */
+    void unsubscribe(WebSocketClient ws);
+
+    /**
+     * 处理频道推送消息。
+     *
+     * <h3>路由规则</h3>
+     * 如果消息的 {@code arg.channel} 匹配当前处理器的频道名,
+     * 则提取 {@code data} 数组并处理业务逻辑,返回 {@code true};
+     * 否则返回 {@code false}(让路由器继续遍历其他 handler)。
+     *
+     * @param response WebSocket 推送的完整 JSON
+     * @return true 表示已处理(循环停止),false 表示频道不匹配(继续遍历下一个 handler)
+     */
+    boolean handleMessage(JSONObject response);
+
+    /**
+     * 是否已收到订阅成功确认(即收到 {@code event:"subscribe"} 响应)。
+     *
+     * @return true 表示订阅已确认
+     */
+    boolean isSubscribed();
+
+    /**
+     * 标记订阅已确认/未确认。
+     *
+     * @param subscribed true=已确认,false=未确认
+     */
+    void setSubscribed(boolean subscribed);
+}

--
Gitblit v1.9.1