From b05f094ac51dce91eb8c00235226d54a04658c6d Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期一, 23 三月 2026 15:51:17 +0800
Subject: [PATCH] #ai 页面优化
---
rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiPromptServiceImpl.java | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 103 insertions(+), 7 deletions(-)
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiPromptServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiPromptServiceImpl.java
index 7603c97..02b3398 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiPromptServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiPromptServiceImpl.java
@@ -3,21 +3,34 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vincent.rsf.framework.exception.CoolException;
+import com.vincent.rsf.server.ai.dto.AiPromptPreviewDto;
+import com.vincent.rsf.server.ai.dto.AiPromptPreviewRequest;
import com.vincent.rsf.server.ai.entity.AiPrompt;
import com.vincent.rsf.server.ai.mapper.AiPromptMapper;
+import com.vincent.rsf.server.ai.store.AiConfigCacheStore;
+import com.vincent.rsf.server.ai.store.AiConversationCacheStore;
import com.vincent.rsf.server.ai.service.AiPromptService;
import com.vincent.rsf.server.system.enums.StatusType;
+import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
@Service("aiPromptService")
+@RequiredArgsConstructor
public class AiPromptServiceImpl extends ServiceImpl<AiPromptMapper, AiPrompt> implements AiPromptService {
+ private final AiPromptRenderSupport aiPromptRenderSupport;
+ private final AiConfigCacheStore aiConfigCacheStore;
+ private final AiConversationCacheStore aiConversationCacheStore;
+
@Override
- public AiPrompt getActivePrompt(String code) {
+ public AiPrompt getActivePrompt(String code, Long tenantId) {
+ ensureTenantId(tenantId);
AiPrompt aiPrompt = this.getOne(new LambdaQueryWrapper<AiPrompt>()
+ .eq(AiPrompt::getTenantId, tenantId)
.eq(AiPrompt::getCode, code)
.eq(AiPrompt::getStatus, StatusType.ENABLE.val)
+ .eq(AiPrompt::getDeleted, 0)
.last("limit 1"));
if (aiPrompt == null) {
throw new CoolException("鏈壘鍒板惎鐢ㄤ腑鐨� Prompt锛�" + code);
@@ -26,18 +39,81 @@
}
@Override
- public void validateBeforeSave(AiPrompt aiPrompt) {
+ public void validateBeforeSave(AiPrompt aiPrompt, Long tenantId) {
+ ensureTenantId(tenantId);
+ aiPrompt.setTenantId(tenantId);
ensureRequiredFields(aiPrompt);
- ensureUniqueCode(aiPrompt.getCode(), null);
+ ensureUniqueCode(aiPrompt.getCode(), tenantId, null);
}
@Override
- public void validateBeforeUpdate(AiPrompt aiPrompt) {
+ public void validateBeforeUpdate(AiPrompt aiPrompt, Long tenantId) {
+ ensureTenantId(tenantId);
if (aiPrompt.getId() == null) {
throw new CoolException("Prompt ID 涓嶈兘涓虹┖");
}
+ AiPrompt current = requireOwnedRecord(aiPrompt.getId(), tenantId);
+ aiPrompt.setTenantId(current.getTenantId());
ensureRequiredFields(aiPrompt);
- ensureUniqueCode(aiPrompt.getCode(), aiPrompt.getId());
+ ensureUniqueCode(aiPrompt.getCode(), tenantId, aiPrompt.getId());
+ }
+
+ @Override
+ public AiPromptPreviewDto renderPreview(AiPromptPreviewRequest request, Long tenantId) {
+ ensureTenantId(tenantId);
+ if (request == null) {
+ throw new CoolException("Prompt 棰勮鍙傛暟涓嶈兘涓虹┖");
+ }
+ if (!StringUtils.hasText(request.getSystemPrompt())) {
+ throw new CoolException("绯荤粺 Prompt 涓嶈兘涓虹┖");
+ }
+ return aiPromptRenderSupport.render(
+ request.getSystemPrompt(),
+ request.getUserPromptTemplate(),
+ request.getInput(),
+ request.getMetadata()
+ );
+ }
+
+ @Override
+ public boolean save(AiPrompt entity) {
+ boolean saved = super.save(entity);
+ if (saved && entity != null && entity.getTenantId() != null) {
+ aiConfigCacheStore.evictTenantConfigCaches(entity.getTenantId());
+ aiConversationCacheStore.evictTenantRuntimeCaches(entity.getTenantId());
+ }
+ return saved;
+ }
+
+ @Override
+ public boolean updateById(AiPrompt entity) {
+ boolean updated = super.updateById(entity);
+ if (updated && entity != null && entity.getTenantId() != null) {
+ aiConfigCacheStore.evictTenantConfigCaches(entity.getTenantId());
+ aiConversationCacheStore.evictTenantRuntimeCaches(entity.getTenantId());
+ }
+ return updated;
+ }
+
+ @Override
+ public boolean removeByIds(java.util.Collection<?> list) {
+ java.util.List<java.io.Serializable> ids = list == null ? java.util.List.of() : list.stream()
+ .filter(java.util.Objects::nonNull)
+ .map(item -> (java.io.Serializable) item)
+ .toList();
+ java.util.List<AiPrompt> records = this.listByIds(ids);
+ boolean removed = super.removeByIds(list);
+ if (removed) {
+ records.stream()
+ .map(AiPrompt::getTenantId)
+ .filter(java.util.Objects::nonNull)
+ .distinct()
+ .forEach(tenantId -> {
+ aiConfigCacheStore.evictTenantConfigCaches(tenantId);
+ aiConversationCacheStore.evictTenantRuntimeCaches(tenantId);
+ });
+ }
+ return removed;
}
private void ensureRequiredFields(AiPrompt aiPrompt) {
@@ -55,9 +131,11 @@
}
}
- private void ensureUniqueCode(String code, Long selfId) {
+ private void ensureUniqueCode(String code, Long tenantId, Long selfId) {
LambdaQueryWrapper<AiPrompt> wrapper = new LambdaQueryWrapper<AiPrompt>()
- .eq(AiPrompt::getCode, code);
+ .eq(AiPrompt::getTenantId, tenantId)
+ .eq(AiPrompt::getCode, code)
+ .eq(AiPrompt::getDeleted, 0);
if (selfId != null) {
wrapper.ne(AiPrompt::getId, selfId);
}
@@ -65,4 +143,22 @@
throw new CoolException("Prompt 缂栫爜宸插瓨鍦�");
}
}
+
+ private AiPrompt requireOwnedRecord(Long id, Long tenantId) {
+ AiPrompt aiPrompt = this.getOne(new LambdaQueryWrapper<AiPrompt>()
+ .eq(AiPrompt::getId, id)
+ .eq(AiPrompt::getTenantId, tenantId)
+ .eq(AiPrompt::getDeleted, 0)
+ .last("limit 1"));
+ if (aiPrompt == null) {
+ throw new CoolException("Prompt 涓嶅瓨鍦ㄦ垨鏃犳潈璁块棶");
+ }
+ return aiPrompt;
+ }
+
+ private void ensureTenantId(Long tenantId) {
+ if (tenantId == null) {
+ throw new CoolException("褰撳墠绉熸埛涓嶅瓨鍦�");
+ }
+ }
}
--
Gitblit v1.9.1