From d5884d0974d17d96225a5d80e432de33a5ee6552 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 19 三月 2026 13:10:21 +0800
Subject: [PATCH] #AI.日志与审计
---
rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiParamServiceImpl.java | 87 +++++++++++++++++++++++++++++++++++++++----
1 files changed, 79 insertions(+), 8 deletions(-)
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiParamServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiParamServiceImpl.java
index 41a014b..957c7b0 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiParamServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiParamServiceImpl.java
@@ -4,20 +4,31 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.ai.config.AiDefaults;
+import com.vincent.rsf.server.ai.dto.AiParamValidateResultDto;
import com.vincent.rsf.server.ai.entity.AiParam;
import com.vincent.rsf.server.ai.mapper.AiParamMapper;
import com.vincent.rsf.server.ai.service.AiParamService;
import com.vincent.rsf.server.system.enums.StatusType;
+import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
@Service("aiParamService")
+@RequiredArgsConstructor
public class AiParamServiceImpl extends ServiceImpl<AiParamMapper, AiParam> implements AiParamService {
+ private final AiParamValidationSupport aiParamValidationSupport;
+
@Override
- public AiParam getActiveParam() {
+ public AiParam getActiveParam(Long tenantId) {
+ ensureTenantId(tenantId);
AiParam aiParam = this.getOne(new LambdaQueryWrapper<AiParam>()
+ .eq(AiParam::getTenantId, tenantId)
.eq(AiParam::getStatus, StatusType.ENABLE.val)
+ .eq(AiParam::getDeleted, 0)
.last("limit 1"));
if (aiParam == null) {
throw new CoolException("鏈壘鍒板惎鐢ㄤ腑鐨� AI 鍙傛暟閰嶇疆");
@@ -26,20 +37,35 @@
}
@Override
- public void validateBeforeSave(AiParam aiParam) {
+ public void validateBeforeSave(AiParam aiParam, Long tenantId) {
+ ensureTenantId(tenantId);
+ aiParam.setTenantId(tenantId);
fillDefaults(aiParam);
ensureBaseFields(aiParam);
- ensureSingleActive(aiParam, null);
+ ensureSingleActive(tenantId, null, aiParam.getStatus());
+ applyValidation(aiParam);
}
@Override
- public void validateBeforeUpdate(AiParam aiParam) {
+ public void validateBeforeUpdate(AiParam aiParam, Long tenantId) {
+ ensureTenantId(tenantId);
fillDefaults(aiParam);
if (aiParam.getId() == null) {
throw new CoolException("AI 鍙傛暟 ID 涓嶈兘涓虹┖");
}
+ AiParam current = requireOwnedRecord(aiParam.getId(), tenantId);
+ aiParam.setTenantId(current.getTenantId());
ensureBaseFields(aiParam);
- ensureSingleActive(aiParam, aiParam.getId());
+ ensureSingleActive(tenantId, aiParam.getId(), aiParam.getStatus());
+ applyValidation(aiParam);
+ }
+
+ @Override
+ public AiParamValidateResultDto validateDraft(AiParam aiParam, Long tenantId) {
+ ensureTenantId(tenantId);
+ fillDefaults(aiParam);
+ ensureBaseFields(aiParam);
+ return aiParamValidationSupport.validate(aiParam);
}
private void ensureBaseFields(AiParam aiParam) {
@@ -60,17 +86,37 @@
}
}
- private void ensureSingleActive(AiParam aiParam, Long selfId) {
- if (aiParam.getStatus() == null || aiParam.getStatus() != StatusType.ENABLE.val) {
+ private void ensureSingleActive(Long tenantId, Long selfId, Integer status) {
+ if (status == null || status != StatusType.ENABLE.val) {
return;
}
LambdaQueryWrapper<AiParam> wrapper = new LambdaQueryWrapper<AiParam>()
- .eq(AiParam::getStatus, StatusType.ENABLE.val);
+ .eq(AiParam::getTenantId, tenantId)
+ .eq(AiParam::getStatus, StatusType.ENABLE.val)
+ .eq(AiParam::getDeleted, 0);
if (selfId != null) {
wrapper.ne(AiParam::getId, selfId);
}
if (this.count(wrapper) > 0) {
throw new CoolException("鍚屼竴绉熸埛浠呭厑璁镐竴鏉″惎鐢ㄤ腑鐨� AI 鍙傛暟閰嶇疆");
+ }
+ }
+
+ private AiParam requireOwnedRecord(Long id, Long tenantId) {
+ AiParam aiParam = this.getOne(new LambdaQueryWrapper<AiParam>()
+ .eq(AiParam::getId, id)
+ .eq(AiParam::getTenantId, tenantId)
+ .eq(AiParam::getDeleted, 0)
+ .last("limit 1"));
+ if (aiParam == null) {
+ throw new CoolException("AI 鍙傛暟涓嶅瓨鍦ㄦ垨鏃犳潈璁块棶");
+ }
+ return aiParam;
+ }
+
+ private void ensureTenantId(Long tenantId) {
+ if (tenantId == null) {
+ throw new CoolException("褰撳墠绉熸埛涓嶅瓨鍦�");
}
}
@@ -90,8 +136,33 @@
if (aiParam.getStreamingEnabled() == null) {
aiParam.setStreamingEnabled(Boolean.TRUE);
}
+ if (!StringUtils.hasText(aiParam.getValidateStatus())) {
+ aiParam.setValidateStatus(AiDefaults.PARAM_VALIDATE_NOT_TESTED);
+ }
if (aiParam.getStatus() == null) {
aiParam.setStatus(StatusType.ENABLE.val);
}
}
+
+ private void applyValidation(AiParam aiParam) {
+ AiParamValidateResultDto validateResult = aiParamValidationSupport.validate(aiParam);
+ aiParam.setValidateStatus(validateResult.getStatus());
+ aiParam.setLastValidateMessage(validateResult.getMessage());
+ aiParam.setLastValidateElapsedMs(validateResult.getElapsedMs());
+ aiParam.setLastValidateTime(parseDate(validateResult.getValidatedAt()));
+ if (!AiDefaults.PARAM_VALIDATE_VALID.equals(validateResult.getStatus())) {
+ throw new CoolException(validateResult.getMessage());
+ }
+ }
+
+ private Date parseDate(String dateTime) {
+ if (!StringUtils.hasText(dateTime)) {
+ return null;
+ }
+ try {
+ return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateTime);
+ } catch (Exception e) {
+ throw new CoolException("瑙f瀽鏍¢獙鏃堕棿澶辫触: " + e.getMessage());
+ }
+ }
}
--
Gitblit v1.9.1