From f690d3216d27d560c1d5d07a9a5cb76f5e31821d Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Wed, 08 Jul 2026 11:47:41 +0800
Subject: [PATCH] fix(gateApi): 统一返回成功状态的数据格式

---
 src/main/java/com/xcong/excoin/modules/gateApi/GateLogBuffer.java |   86 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 86 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/gateApi/GateLogBuffer.java b/src/main/java/com/xcong/excoin/modules/gateApi/GateLogBuffer.java
new file mode 100644
index 0000000..10e14db
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/gateApi/GateLogBuffer.java
@@ -0,0 +1,86 @@
+package com.xcong.excoin.modules.gateApi;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
+
+import java.io.IOException;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * Gate 策略日志环形缓冲区,支持 SSE 推送到前端。
+ * 最多保留 500 条日志,新客户端连接时先推送历史再持续推新日志。
+ */
+@Slf4j
+@Service
+public class GateLogBuffer {
+
+    private static final int MAX_ENTRIES = 500;
+    private static final DateTimeFormatter TF = DateTimeFormatter.ofPattern("HH:mm:ss");
+
+    private final List<String> entries = Collections.synchronizedList(new ArrayList<>(MAX_ENTRIES));
+    private final List<SseEmitter> emitters = new CopyOnWriteArrayList<>();
+
+    /**
+     * 推送一条日志到所有 SSE 客户端。
+     */
+    public void push(String level, String message) {
+        String line = String.format("[%s] %-5s %s", TF.format(LocalTime.now()), level, message);
+
+        synchronized (entries) {
+            if (entries.size() >= MAX_ENTRIES) {
+                entries.remove(0);
+            }
+            entries.add(line);
+        }
+
+        // 推送给所有 SSE 客户端
+        for (SseEmitter emitter : emitters) {
+            try {
+                emitter.send(SseEmitter.event().name("log").data(line));
+            } catch (IOException e) {
+                emitters.remove(emitter);
+            }
+        }
+    }
+
+    /** info 级别日志 */
+    public void info(String message) { push("INFO", message); }
+    /** warn 级别日志 */
+    public void warn(String message) { push("WARN", message); }
+    /** error 级别日志 */
+    public void error(String message) { push("ERROR", message); }
+
+    /**
+     * 创建 SSE 连接,先推送历史再持续推送新日志。
+     */
+    public SseEmitter subscribe() {
+        SseEmitter emitter = new SseEmitter(0L); // 无超时
+        emitters.add(emitter);
+
+        // 推送历史
+        List<String> history;
+        synchronized (entries) {
+            history = new ArrayList<>(entries);
+        }
+        for (String line : history) {
+            try {
+                emitter.send(SseEmitter.event().name("log").data(line));
+            } catch (IOException e) {
+                emitters.remove(emitter);
+                return emitter;
+            }
+        }
+
+        emitter.onCompletion(() -> emitters.remove(emitter));
+        emitter.onTimeout(() -> emitters.remove(emitter));
+        emitter.onError(e -> emitters.remove(emitter));
+
+        return emitter;
+    }
+}

--
Gitblit v1.9.1