From e96aaddc59b17e86beb08cc8f3aa64957cdd57cf Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 19 三月 2026 15:45:04 +0800
Subject: [PATCH] #备货
---
rsf-server/src/main/java/com/vincent/rsf/server/ai/controller/AiChatController.java | 75 ++++++++++++++++++++++++++++++++++++-
1 files changed, 73 insertions(+), 2 deletions(-)
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/ai/controller/AiChatController.java b/rsf-server/src/main/java/com/vincent/rsf/server/ai/controller/AiChatController.java
index 63a2073..b096123 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/ai/controller/AiChatController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/ai/controller/AiChatController.java
@@ -1,21 +1,33 @@
package com.vincent.rsf.server.ai.controller;
import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.server.ai.dto.AiChatSessionPinRequest;
+import com.vincent.rsf.server.ai.dto.AiChatSessionRenameRequest;
import com.vincent.rsf.server.ai.dto.AiChatRequest;
import com.vincent.rsf.server.ai.service.AiChatService;
import com.vincent.rsf.server.system.controller.BaseController;
import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
+import java.util.UUID;
+
@RestController
+@Slf4j
@RequiredArgsConstructor
public class AiChatController extends BaseController {
private final AiChatService aiChatService;
+ /**
+ * 杩斿洖褰撳墠鐢ㄦ埛鍦ㄦ寚瀹� Prompt 鍦烘櫙涓嬬殑 AI 杩愯鏃跺揩鐓с��
+ * 杩欓噷涓嶄細鐪熸瑙﹀彂妯″瀷璋冪敤锛屽彧璐熻矗鎶婂綋鍓嶇敓鏁堢殑妯″瀷銆丳rompt銆�
+ * 宸叉寕杞� MCP 浠ュ強浼氳瘽璁板繂姒傚喌涓�娆℃�ц繑鍥炵粰鍓嶇鎶藉眽鍒濆鍖栦娇鐢ㄣ��
+ */
@PreAuthorize("isAuthenticated()")
@GetMapping("/ai/chat/runtime")
public R runtime(@RequestParam(required = false) String promptCode,
@@ -23,12 +35,20 @@
return R.ok().add(aiChatService.getRuntime(promptCode, sessionId, getLoginUserId(), getTenantId()));
}
+ /**
+ * 鏌ヨ褰撳墠鐧诲綍鐢ㄦ埛鍦ㄦ寚瀹� Prompt 涓嬬殑鍘嗗彶浼氳瘽鍒楄〃銆�
+ * 鍓嶇宸︿晶浼氳瘽鏍忎緷璧栬鎺ュ彛鍋氫細璇濆垏鎹€�佹悳绱㈠拰鍒锋柊銆�
+ */
@PreAuthorize("isAuthenticated()")
@GetMapping("/ai/chat/sessions")
- public R sessions(@RequestParam(required = false) String promptCode) {
- return R.ok().add(aiChatService.listSessions(promptCode, getLoginUserId(), getTenantId()));
+ public R sessions(@RequestParam(required = false) String promptCode,
+ @RequestParam(required = false) String keyword) {
+ return R.ok().add(aiChatService.listSessions(promptCode, keyword, getLoginUserId(), getTenantId()));
}
+ /**
+ * 杞垹闄ゅ崟涓� AI 浼氳瘽锛屽悓鏃剁骇鑱斿垹闄や細璇濅笅鐨勬秷鎭褰曘��
+ */
@PreAuthorize("isAuthenticated()")
@PostMapping("/ai/chat/session/remove/{sessionId}")
public R removeSession(@PathVariable Long sessionId) {
@@ -36,9 +56,60 @@
return R.ok("Delete Success").add(sessionId);
}
+ /**
+ * 鏇存柊浼氳瘽鏍囬锛屼緵鍓嶇閲嶅懡鍚嶄細璇濇椂璋冪敤銆�
+ */
+ @PreAuthorize("isAuthenticated()")
+ @PostMapping("/ai/chat/session/rename/{sessionId}")
+ public R renameSession(@PathVariable Long sessionId, @RequestBody AiChatSessionRenameRequest request) {
+ return R.ok("Update Success").add(aiChatService.renameSession(sessionId, request, getLoginUserId(), getTenantId()));
+ }
+
+ /**
+ * 鏇存柊浼氳瘽缃《鐘舵�併��
+ * 缃《鍙奖鍝嶅綋鍓嶇敤鎴风殑浼氳瘽鎺掑簭锛屼笉鏀瑰彉浼氳瘽鍐呭鍜岃蹇嗐��
+ */
+ @PreAuthorize("isAuthenticated()")
+ @PostMapping("/ai/chat/session/pin/{sessionId}")
+ public R pinSession(@PathVariable Long sessionId, @RequestBody AiChatSessionPinRequest request) {
+ return R.ok("Update Success").add(aiChatService.pinSession(sessionId, request, getLoginUserId(), getTenantId()));
+ }
+
+ /**
+ * 娓呯┖鎸囧畾浼氳瘽鐨勬寔涔呭寲娑堟伅銆佹憳瑕佽蹇嗗拰浜嬪疄璁板繂銆�
+ * 浼氳瘽鏈韩淇濈暀锛屼究浜庡墠绔户缁湪鍚屼竴涓� sessionId 涓婂彂璧锋柊瀵硅瘽銆�
+ */
+ @PreAuthorize("isAuthenticated()")
+ @PostMapping("/ai/chat/session/memory/clear/{sessionId}")
+ public R clearSessionMemory(@PathVariable Long sessionId) {
+ aiChatService.clearSessionMemory(sessionId, getLoginUserId(), getTenantId());
+ return R.ok("Clear Success").add(sessionId);
+ }
+
+ /**
+ * 鍙繚鐣欎細璇濇渶杩戜竴杞棶绛旓紝鐢ㄤ簬涓诲姩瑁佸壀涓婁笅鏂囩獥鍙c��
+ */
+ @PreAuthorize("isAuthenticated()")
+ @PostMapping("/ai/chat/session/memory/retain-latest/{sessionId}")
+ public R retainLatestRound(@PathVariable Long sessionId) {
+ aiChatService.retainLatestRound(sessionId, getLoginUserId(), getTenantId());
+ return R.ok("Retain Success").add(sessionId);
+ }
+
+ /**
+ * 浠� SSE 鏂瑰紡鍚姩 AI 瀵硅瘽銆�
+ * 鎺у埗鍣ㄥ彧璐熻矗鐢熸垚 requestId銆佽褰曞叆鍙f棩蹇楀拰鎶婇壌鏉冧笂涓嬫枃閫忎紶缁欐湇鍔″眰锛�
+ * 鐪熸鐨勬祦寮忔帹鐞嗐�佸伐鍏疯皟鐢ㄥ拰璁板繂钀藉簱閮藉湪鏈嶅姟灞傚畬鎴愩��
+ */
@PreAuthorize("isAuthenticated()")
@PostMapping(value = "/ai/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter stream(@RequestBody AiChatRequest request) {
+ String requestId = StringUtils.hasText(request.getRequestId())
+ ? request.getRequestId().trim()
+ : UUID.randomUUID().toString().replace("-", "");
+ request.setRequestId(requestId);
+ log.info("AI chat request accepted, requestId={}, userId={}, tenantId={}, sessionId={}",
+ requestId, getLoginUserId(), getTenantId(), request.getSessionId());
return aiChatService.stream(request, getLoginUserId(), getTenantId());
}
}
--
Gitblit v1.9.1