From 53fa1addcd22557f6541092a151a3064779d3f93 Mon Sep 17 00:00:00 2001
From: Junjie <DELL@qq.com>
Date: 星期五, 12 十二月 2025 13:28:42 +0800
Subject: [PATCH] #AI

---
 src/main/java/com/zy/ai/service/WcsDiagnosisService.java |  161 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 161 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/zy/ai/service/WcsDiagnosisService.java b/src/main/java/com/zy/ai/service/WcsDiagnosisService.java
index a61d222..ce9f36e 100644
--- a/src/main/java/com/zy/ai/service/WcsDiagnosisService.java
+++ b/src/main/java/com/zy/ai/service/WcsDiagnosisService.java
@@ -3,18 +3,23 @@
 import com.alibaba.fastjson.JSON;
 import com.zy.ai.entity.ChatCompletionRequest;
 import com.zy.ai.entity.WcsDiagnosisRequest;
+import com.zy.common.utils.RedisUtil;
+import com.zy.core.enums.RedisKeyType;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 @Service
 @RequiredArgsConstructor
 public class WcsDiagnosisService {
 
     private final LlmChatService llmChatService;
+    private final RedisUtil redisUtil;
+    private static final long CHAT_TTL_SECONDS = 7L * 24 * 3600;
 
     /**
      * 閽堝鈥滅郴缁熶笉鎵ц浠诲姟 / 涓嶇煡閬撳摢涓澶囨病鍦ㄨ繍琛屸�濈殑閫氱敤 AI 璇婃柇
@@ -134,6 +139,162 @@
         });
     }
 
+    public void askStream(WcsDiagnosisRequest request,
+                          String prompt,
+                          String chatId,
+                          boolean reset,
+                          SseEmitter emitter) {
+        List<ChatCompletionRequest.Message> base = new ArrayList<>();
+
+        ChatCompletionRequest.Message system = new ChatCompletionRequest.Message();
+        system.setRole("system");
+        system.setContent(
+                "浣犳槸涓�鍚嶈祫娣� WCS锛堜粨鍌ㄦ帶鍒剁郴缁燂級涓庤嚜鍔ㄥ寲绔嬪簱涓撳锛岀啛鎮夛細鍫嗗灈鏈恒�佽緭閫佺嚎銆佹彁鍗囨満銆佺┛姊溅绛夎澶囩殑浠诲姟鍒嗛厤鍜岃繍琛岄�昏緫锛屼篃鐔熸倝甯歌鐨勭郴缁熷崱姝汇�佷换鍔′笉鎵ц銆佽澶囩┖闂蹭絾鏃犱换鍔$瓑闂妯″紡銆俓n\n" +
+                "鍦ㄥ洖绛旂敤鎴烽棶棰樻椂锛岄渶瑕佺粨鍚堜笅闈㈢粰鍑虹殑绯荤粺褰撳墠涓婁笅鏂囦俊鎭紙浠诲姟銆佽澶囧疄鏃剁姸鎬併�佽澶囬厤缃�佺郴缁熸棩蹇楃瓑锛夛紝浠ョ畝娲併�佹槑纭殑涓枃浣滅瓟锛屽苟鍦ㄩ渶瑕佹椂缁欏嚭鍙墽琛岀殑鎺掓煡寤鸿銆�"
+        );
+        base.add(system);
+
+        List<ChatCompletionRequest.Message> history = null;
+        String historyKey = null;
+        String metaKey = null;
+        if (chatId != null && !chatId.isEmpty()) {
+            historyKey = RedisKeyType.AI_CHAT_HISTORY.key + chatId;
+            metaKey = RedisKeyType.AI_CHAT_META.key + chatId;
+            if (reset) {
+                redisUtil.del(historyKey, metaKey);
+            }
+            List<Object> stored = redisUtil.lGet(historyKey, 0, -1);
+            if (stored != null && !stored.isEmpty()) {
+                history = new ArrayList<>(stored.size());
+                for (Object o : stored) {
+                    ChatCompletionRequest.Message m = convertToMessage(o);
+                    if (m != null) history.add(m);
+                }
+                if (!history.isEmpty()) base.addAll(history);
+            } else {
+                history = new ArrayList<>();
+            }
+        }
+
+        ChatCompletionRequest.Message contextMsg = new ChatCompletionRequest.Message();
+        contextMsg.setRole("user");
+        contextMsg.setContent(buildUserContent(request));
+        base.add(contextMsg);
+
+        ChatCompletionRequest.Message questionMsg = new ChatCompletionRequest.Message();
+        questionMsg.setRole("user");
+        questionMsg.setContent("銆愮敤鎴锋彁闂�慭n" + (prompt == null ? "" : prompt));
+        base.add(questionMsg);
+
+        StringBuilder assistantBuffer = new StringBuilder();
+        final String finalChatId = chatId;
+        final String finalHistoryKey = historyKey;
+        final String finalMetaKey = metaKey;
+        final String finalPrompt = prompt;
+
+        llmChatService.chatStream(base, 0.2, 2048, s -> {
+            try {
+                String safe = s == null ? "" : s.replace("\r", "").replace("\n", "\\n");
+                if (!safe.isEmpty()) {
+                    emitter.send(SseEmitter.event().data(safe));
+                    assistantBuffer.append(s);
+                }
+            } catch (Exception ignore) {}
+        }, () -> {
+            try {
+                if (finalChatId != null && !finalChatId.isEmpty()) {
+                    ChatCompletionRequest.Message q = new ChatCompletionRequest.Message();
+                    q.setRole("user");
+                    q.setContent(finalPrompt == null ? "" : finalPrompt);
+                    ChatCompletionRequest.Message a = new ChatCompletionRequest.Message();
+                    a.setRole("assistant");
+                    a.setContent(assistantBuffer.toString());
+                    redisUtil.lSet(finalHistoryKey, q);
+                    redisUtil.lSet(finalHistoryKey, a);
+                    redisUtil.expire(finalHistoryKey, CHAT_TTL_SECONDS);
+                    Map<Object, Object> old = redisUtil.hmget(finalMetaKey);
+                    Long createdAt = old != null && old.get("createdAt") != null ?
+                            (old.get("createdAt") instanceof Number ? ((Number) old.get("createdAt")).longValue() : Long.valueOf(String.valueOf(old.get("createdAt"))))
+                            : System.currentTimeMillis();
+                    Map<String, Object> meta = new java.util.HashMap<>();
+                    meta.put("chatId", finalChatId);
+                    meta.put("title", buildTitleFromPrompt(finalPrompt));
+                    meta.put("createdAt", createdAt);
+                    meta.put("updatedAt", System.currentTimeMillis());
+                    redisUtil.hmset(finalMetaKey, meta, CHAT_TTL_SECONDS);
+                }
+                emitter.complete();
+            } catch (Exception ignore) {}
+        }, e -> {
+            try { emitter.completeWithError(e); } catch (Exception ignore) {}
+        });
+    }
+
+    public List<Map<String, Object>> listChats() {
+        java.util.Set<String> keys = redisUtil.scanKeys(RedisKeyType.AI_CHAT_META.key, 1000);
+        List<Map<String, Object>> resp = new ArrayList<>();
+        if (keys != null) {
+            for (String key : keys) {
+                Map<Object, Object> m = redisUtil.hmget(key);
+                if (m != null && !m.isEmpty()) {
+                    java.util.HashMap<String, Object> item = new java.util.HashMap<>();
+                    for (Map.Entry<Object, Object> e : m.entrySet()) {
+                        item.put(String.valueOf(e.getKey()), e.getValue());
+                    }
+                    String chatId = String.valueOf(item.get("chatId"));
+                    String historyKey = RedisKeyType.AI_CHAT_HISTORY.key + chatId;
+                    item.put("size", redisUtil.lGetListSize(historyKey));
+                    resp.add(item);
+                }
+            }
+        }
+        return resp;
+    }
+
+    public boolean deleteChat(String chatId) {
+        if (chatId == null || chatId.isEmpty()) return false;
+        String historyKey = RedisKeyType.AI_CHAT_HISTORY.key + chatId;
+        String metaKey = RedisKeyType.AI_CHAT_META.key + chatId;
+        redisUtil.del(historyKey, metaKey);
+        return true;
+    }
+
+    public List<ChatCompletionRequest.Message> getChatHistory(String chatId) {
+        if (chatId == null || chatId.isEmpty()) return java.util.Collections.emptyList();
+        String historyKey = RedisKeyType.AI_CHAT_HISTORY.key + chatId;
+        List<Object> stored = redisUtil.lGet(historyKey, 0, -1);
+        List<ChatCompletionRequest.Message> result = new ArrayList<>();
+        if (stored != null) {
+            for (Object o : stored) {
+                ChatCompletionRequest.Message m = convertToMessage(o);
+                if (m != null) result.add(m);
+            }
+        }
+        return result;
+    }
+
+    private ChatCompletionRequest.Message convertToMessage(Object o) {
+        if (o instanceof ChatCompletionRequest.Message) {
+            return (ChatCompletionRequest.Message) o;
+        }
+        if (o instanceof Map) {
+            Map<?, ?> map = (Map<?, ?>) o;
+            ChatCompletionRequest.Message m = new ChatCompletionRequest.Message();
+            Object role = map.get("role");
+            Object content = map.get("content");
+            m.setRole(role == null ? null : String.valueOf(role));
+            m.setContent(content == null ? null : String.valueOf(content));
+            return m;
+        }
+        return null;
+    }
+
+    private String buildTitleFromPrompt(String prompt) {
+        if (prompt == null || prompt.isEmpty()) return "鏈懡鍚嶄細璇�";
+        String p = prompt.replaceAll("\n", " ").trim();
+        return p.length() > 20 ? p.substring(0, 20) : p;
+    }
+
     private String buildUserContent(WcsDiagnosisRequest request) {
         StringBuilder sb = new StringBuilder();
 

--
Gitblit v1.9.1