From 10b88a7ff17caf92f3d4e8a550c1085a70c2517a Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期四, 28 五月 2026 17:43:26 +0800
Subject: [PATCH] Merge dev_New_pro into dev_山西_晋和园_pro

---
 src/main/java/com/ruoyi/ai/context/AiSessionUserContext.java |   65 ++++++++++++++++++++++++++++++++
 1 files changed, 65 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/ai/context/AiSessionUserContext.java b/src/main/java/com/ruoyi/ai/context/AiSessionUserContext.java
new file mode 100644
index 0000000..5251561
--- /dev/null
+++ b/src/main/java/com/ruoyi/ai/context/AiSessionUserContext.java
@@ -0,0 +1,65 @@
+package com.ruoyi.ai.context;
+
+import com.ruoyi.framework.security.LoginUser;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Component
+public class AiSessionUserContext {
+
+    private final Map<String, LoginUser> loginUserByMemoryId = new ConcurrentHashMap<>();
+    private final Map<String, Instant> lastAccessTimeByMemoryId = new ConcurrentHashMap<>();
+    private static final Duration SESSION_TIMEOUT = Duration.ofHours(24);
+
+    public void bind(String memoryId, LoginUser loginUser) {
+        if (!StringUtils.hasText(memoryId) || loginUser == null) {
+            return;
+        }
+        loginUserByMemoryId.put(memoryId, loginUser);
+        lastAccessTimeByMemoryId.put(memoryId, Instant.now());
+    }
+
+    public LoginUser get(String memoryId) {
+        if (!StringUtils.hasText(memoryId)) {
+            return null;
+        }
+        if (isExpired(memoryId)) {
+            remove(memoryId);
+            return null;
+        }
+        lastAccessTimeByMemoryId.put(memoryId, Instant.now());
+        return loginUserByMemoryId.get(memoryId);
+    }
+
+    public void remove(String memoryId) {
+        if (!StringUtils.hasText(memoryId)) {
+            return;
+        }
+        loginUserByMemoryId.remove(memoryId);
+        lastAccessTimeByMemoryId.remove(memoryId);
+    }
+
+    public void cleanExpiredSessions() {
+        Instant now = Instant.now();
+        lastAccessTimeByMemoryId.entrySet().removeIf(entry -> {
+            boolean expired = Duration.between(entry.getValue(), now).compareTo(SESSION_TIMEOUT) > 0;
+            if (expired) {
+                loginUserByMemoryId.remove(entry.getKey());
+            }
+            return expired;
+        });
+    }
+
+    private boolean isExpired(String memoryId) {
+        Instant lastAccess = lastAccessTimeByMemoryId.get(memoryId);
+        if (lastAccess == null) {
+            return true;
+        }
+        return Duration.between(lastAccess, Instant.now()).compareTo(SESSION_TIMEOUT) > 0;
+    }
+}

--
Gitblit v1.9.3