From eb49fb9a98d6dd4e4361daf4eac4f9313236b8e8 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 19 三月 2026 10:56:34 +0800
Subject: [PATCH] #AI多租户管控

---
 rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiMcpMountServiceImpl.java |   47 ++++++++++++++++++++++++++++++++++-------------
 1 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiMcpMountServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiMcpMountServiceImpl.java
index 822d55c..7221714 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiMcpMountServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiMcpMountServiceImpl.java
@@ -34,31 +34,39 @@
     private final ObjectMapper objectMapper;
 
     @Override
-    public List<AiMcpMount> listActiveMounts() {
+    public List<AiMcpMount> listActiveMounts(Long tenantId) {
+        ensureTenantId(tenantId);
         return this.list(new LambdaQueryWrapper<AiMcpMount>()
+                .eq(AiMcpMount::getTenantId, tenantId)
                 .eq(AiMcpMount::getStatus, StatusType.ENABLE.val)
+                .eq(AiMcpMount::getDeleted, 0)
                 .orderByAsc(AiMcpMount::getSort)
                 .orderByAsc(AiMcpMount::getId));
     }
 
     @Override
-    public void validateBeforeSave(AiMcpMount aiMcpMount) {
+    public void validateBeforeSave(AiMcpMount aiMcpMount, Long tenantId) {
+        ensureTenantId(tenantId);
+        aiMcpMount.setTenantId(tenantId);
         fillDefaults(aiMcpMount);
-        ensureRequiredFields(aiMcpMount);
+        ensureRequiredFields(aiMcpMount, tenantId);
     }
 
     @Override
-    public void validateBeforeUpdate(AiMcpMount aiMcpMount) {
+    public void validateBeforeUpdate(AiMcpMount aiMcpMount, Long tenantId) {
+        ensureTenantId(tenantId);
         fillDefaults(aiMcpMount);
         if (aiMcpMount.getId() == null) {
             throw new CoolException("MCP 鎸傝浇 ID 涓嶈兘涓虹┖");
         }
-        ensureRequiredFields(aiMcpMount);
+        AiMcpMount current = requireMount(aiMcpMount.getId(), tenantId);
+        aiMcpMount.setTenantId(current.getTenantId());
+        ensureRequiredFields(aiMcpMount, tenantId);
     }
 
     @Override
     public List<AiMcpToolPreviewDto> previewTools(Long mountId, Long userId, Long tenantId) {
-        AiMcpMount mount = requireMount(mountId);
+        AiMcpMount mount = requireMount(mountId, tenantId);
         try (McpMountRuntimeFactory.McpMountRuntime runtime = mcpMountRuntimeFactory.create(List.of(mount), userId)) {
             List<AiMcpToolPreviewDto> tools = new ArrayList<>();
             for (ToolCallback callback : runtime.getToolCallbacks()) {
@@ -98,7 +106,7 @@
         } catch (Exception e) {
             throw new CoolException("宸ュ叿杈撳叆 JSON 鏍煎紡閿欒: " + e.getMessage());
         }
-        AiMcpMount mount = requireMount(mountId);
+        AiMcpMount mount = requireMount(mountId, tenantId);
         try (McpMountRuntimeFactory.McpMountRuntime runtime = mcpMountRuntimeFactory.create(List.of(mount), userId)) {
             ToolCallback callback = Arrays.stream(runtime.getToolCallbacks())
                     .filter(item -> item != null && item.getToolDefinition() != null)
@@ -132,13 +140,13 @@
         }
     }
 
-    private void ensureRequiredFields(AiMcpMount aiMcpMount) {
+    private void ensureRequiredFields(AiMcpMount aiMcpMount, Long tenantId) {
         if (!StringUtils.hasText(aiMcpMount.getName())) {
             throw new CoolException("MCP 鎸傝浇鍚嶇О涓嶈兘涓虹┖");
         }
         if (AiDefaults.MCP_TRANSPORT_BUILTIN.equals(aiMcpMount.getTransportType())) {
             builtinMcpToolRegistry.validateBuiltinCode(aiMcpMount.getBuiltinCode());
-            ensureBuiltinConflictFree(aiMcpMount);
+            ensureBuiltinConflictFree(aiMcpMount, tenantId);
             return;
         }
         if (AiDefaults.MCP_TRANSPORT_SSE_HTTP.equals(aiMcpMount.getTransportType())) {
@@ -156,18 +164,23 @@
         throw new CoolException("涓嶆敮鎸佺殑 MCP 浼犺緭绫诲瀷: " + aiMcpMount.getTransportType());
     }
 
-    private AiMcpMount requireMount(Long mountId) {
+    private AiMcpMount requireMount(Long mountId, Long tenantId) {
+        ensureTenantId(tenantId);
         if (mountId == null) {
             throw new CoolException("MCP 鎸傝浇 ID 涓嶈兘涓虹┖");
         }
-        AiMcpMount mount = this.getById(mountId);
-        if (mount == null || (mount.getDeleted() != null && mount.getDeleted() == 1)) {
+        AiMcpMount mount = this.getOne(new LambdaQueryWrapper<AiMcpMount>()
+                .eq(AiMcpMount::getId, mountId)
+                .eq(AiMcpMount::getTenantId, tenantId)
+                .eq(AiMcpMount::getDeleted, 0)
+                .last("limit 1"));
+        if (mount == null) {
             throw new CoolException("MCP 鎸傝浇涓嶅瓨鍦�");
         }
         return mount;
     }
 
-    private void ensureBuiltinConflictFree(AiMcpMount aiMcpMount) {
+    private void ensureBuiltinConflictFree(AiMcpMount aiMcpMount, Long tenantId) {
         if (aiMcpMount.getStatus() == null || aiMcpMount.getStatus() != StatusType.ENABLE.val) {
             return;
         }
@@ -176,8 +189,10 @@
             return;
         }
         LambdaQueryWrapper<AiMcpMount> queryWrapper = new LambdaQueryWrapper<AiMcpMount>()
+                .eq(AiMcpMount::getTenantId, tenantId)
                 .eq(AiMcpMount::getTransportType, AiDefaults.MCP_TRANSPORT_BUILTIN)
                 .eq(AiMcpMount::getStatus, StatusType.ENABLE.val)
+                .eq(AiMcpMount::getDeleted, 0)
                 .in(AiMcpMount::getBuiltinCode, conflictCodes);
         if (aiMcpMount.getId() != null) {
             queryWrapper.ne(AiMcpMount::getId, aiMcpMount.getId());
@@ -205,4 +220,10 @@
         }
         return codes;
     }
+
+    private void ensureTenantId(Long tenantId) {
+        if (tenantId == null) {
+            throw new CoolException("褰撳墠绉熸埛涓嶅瓨鍦�");
+        }
+    }
 }

--
Gitblit v1.9.1