重构UserAIModelConfigServiceImpl的setDefaultConfiguration逻辑,并为AdminModelConfig的enabled字段设置默认值

This commit is contained in:
史悦
2025-09-12 13:41:30 +08:00
parent 5c2b69ae3d
commit 8c5089bc66
4 changed files with 32 additions and 37 deletions

View File

@@ -381,7 +381,7 @@ public class AdminModelConfigController {
.provider(requestDTO.getProvider()) .provider(requestDTO.getProvider())
.modelId(requestDTO.getModelId()) .modelId(requestDTO.getModelId())
.displayName(requestDTO.getDisplayName()) .displayName(requestDTO.getDisplayName())
.enabled(requestDTO.getEnabled()) .enabled(requestDTO.getEnabled() != null ? requestDTO.getEnabled() : true)
.apiEndpoint(requestDTO.getApiEndpoint()) .apiEndpoint(requestDTO.getApiEndpoint())
.enabledForFeatures(requestDTO.getEnabledForFeatures()) .enabledForFeatures(requestDTO.getEnabledForFeatures())
.creditRateMultiplier(requestDTO.getCreditRateMultiplier()) .creditRateMultiplier(requestDTO.getCreditRateMultiplier())

View File

@@ -12,7 +12,6 @@ import reactor.core.publisher.Mono;
public interface UserAIModelConfigRepository extends ReactiveMongoRepository<UserAIModelConfig, String> { public interface UserAIModelConfigRepository extends ReactiveMongoRepository<UserAIModelConfig, String> {
Flux<UserAIModelConfig> findByUserId(String userId); Flux<UserAIModelConfig> findByUserId(String userId);
Mono<UserAIModelConfig> findByUserIdAndId(String userId, String id); Mono<UserAIModelConfig> findByUserIdAndId(String userId, String id);
Mono<UserAIModelConfig> findByUserIdAndProviderAndModelName(String userId, String provider, String modelName); Mono<UserAIModelConfig> findByUserIdAndProviderAndModelName(String userId, String provider, String modelName);

View File

@@ -174,43 +174,37 @@ public class UserAIModelConfigServiceImpl implements UserAIModelConfigService {
@Override @Override
@Transactional @Transactional
public Mono<UserAIModelConfig> setDefaultConfiguration(String userId, String configId) { public Mono<UserAIModelConfig> setDefaultConfiguration(String userId, String configId) {
return configRepository.findByUserIdAndId(userId, configId) // 查找要设为默认的配置,并确保它存在且已验证
Mono<UserAIModelConfig> configToSetDefaultMono = configRepository.findByUserIdAndId(userId, configId)
.switchIfEmpty(Mono.error(new RuntimeException("配置不存在或无权访问"))) .switchIfEmpty(Mono.error(new RuntimeException("配置不存在或无权访问")))
.flatMap(configToSetDefault -> { .flatMap(config -> {
if (!configToSetDefault.getIsValidated()) { if (!config.getIsValidated()) {
return Mono.error(new IllegalArgumentException("无法将未验证的配置设为默认")); return Mono.error(new IllegalArgumentException("无法将未验证的配置设为默认"));
} }
if (configToSetDefault.isDefault()) { if (config.isDefault()) {
return Mono.just(configToSetDefault); return Mono.just(config); // 如果已经是默认,直接返回
} }
return Mono.just(config);
return configRepository.findByUserIdAndIsDefaultIsTrue(userId)
.flatMap(currentDefault -> {
if (!currentDefault.getId().equals(configId)) {
currentDefault.setDefault(false);
currentDefault.setUpdatedAt(LocalDateTime.now());
return configRepository.save(currentDefault);
}
return Mono.empty();
})
.thenMany(configRepository.findByUserIdAndIsDefaultIsFalse(userId))
.filter(config -> !config.getId().equals(configId))
.flatMap(config -> {
if (config.isDefault()) {
config.setDefault(false);
config.setUpdatedAt(LocalDateTime.now());
return configRepository.save(config);
}
return Mono.empty();
})
.then()
.then(Mono.fromCallable(() -> {
configToSetDefault.setDefault(true);
configToSetDefault.setUpdatedAt(LocalDateTime.now());
return configToSetDefault;
}))
.flatMap(configRepository::save);
}); });
// 事务性操作:先将所有配置取消默认,再设置新的默认
return configToSetDefaultMono.flatMap(configToSetDefault ->
configRepository.findByUserId(userId)
.flatMap(config -> {
if (config.isDefault()) {
config.setDefault(false);
config.setUpdatedAt(LocalDateTime.now());
return configRepository.save(config);
}
return Mono.empty();
})
.then()
.then(Mono.defer(() -> {
configToSetDefault.setDefault(true);
configToSetDefault.setUpdatedAt(LocalDateTime.now());
return configRepository.save(configToSetDefault);
}))
);
} }
@Override @Override

View File

@@ -15,7 +15,7 @@ MANAGEMENT_HEALTH_RABBIT_ENABLED=false
# ==== 最小必填占位(避免 Bean 装配失败)==== # ==== 最小必填占位(避免 Bean 装配失败)====
# ChatLanguageModelConfig 需要该键存在;开源默认给占位值,实际使用请改成真实 Key # ChatLanguageModelConfig 需要该键存在;开源默认给占位值,实际使用请改成真实 Key
AI_OPENAI_API_KEY=dummy_openai_key AI_OPENAI_API_KEY=sk-QodfEMFLud0D6mtKQwtgcOUA6Vh2djaSPZSKuu9r4bopnKLF
# 可选:如你启用了 Gemini 相关功能,可填,否则保留占位即可 # 可选:如你启用了 Gemini 相关功能,可填,否则保留占位即可
AI_GEMINI_API_KEY=dummy_gemini_key AI_GEMINI_API_KEY=dummy_gemini_key
@@ -43,9 +43,11 @@ CHROMA_URL=
CHROMA_COLLECTION=ainovel CHROMA_COLLECTION=ainovel
# ==== AI Key按需==== # ==== AI Key按需====
OPENAI_API_KEY= OPENAI_API_KEY=sk-QodfEMFLud0D6mtKQwtgcOUA6Vh2djaSPZSKuu9r4bopnKLF
GEMINI_API_KEY= GEMINI_API_KEY=
ANTHROPIC_API_KEY= ANTHROPIC_API_KEY=
AI_DEFAULT_MODEL=gemini-2.5-pro
DEFAULT_API_ENDPOINT=https://newapi.shizhuoran.top/v1
AINOVEL_AI_FEATURES_SETTING_TREE_GENERATION_INIT_ON_STARTUP=true AINOVEL_AI_FEATURES_SETTING_TREE_GENERATION_INIT_ON_STARTUP=true