zhou zhou
13 小时以前 5e40dee0e0a4e4cff4a1aafca2444f61c39cbf32
rsf-server/src/main/java/com/vincent/rsf/server/ai/service/impl/AiParamServiceImpl.java
@@ -15,9 +15,12 @@
public class AiParamServiceImpl extends ServiceImpl<AiParamMapper, AiParam> implements AiParamService {
    @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 +29,25 @@
    }
    @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());
    }
    @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());
    }
    private void ensureBaseFields(AiParam aiParam) {
@@ -60,12 +68,14 @@
        }
    }
    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);
        }
@@ -74,6 +84,24 @@
        }
    }
    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("当前租户不存在");
        }
    }
    private void fillDefaults(AiParam aiParam) {
        if (!StringUtils.hasText(aiParam.getProviderType())) {
            aiParam.setProviderType(AiDefaults.PROVIDER_OPENAI_COMPATIBLE);