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