From 8c5089bc66b355f36793a6a1be7a409255f47deb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B2=E6=82=A6?= Date: Fri, 12 Sep 2025 13:41:30 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84UserAIModelConfigServiceImpl?= =?UTF-8?q?=E7=9A=84setDefaultConfiguration=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E4=B8=BAAdminModelConfig=E7=9A=84enabled=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E8=AE=BE=E7=BD=AE=E9=BB=98=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdminModelConfigController.java | 2 +- .../UserAIModelConfigRepository.java | 1 - .../impl/UserAIModelConfigServiceImpl.java | 58 +++++++++---------- deploy/open/production.env | 8 ++- 4 files changed, 32 insertions(+), 37 deletions(-) diff --git a/AINovalServer/src/main/java/com/ainovel/server/controller/AdminModelConfigController.java b/AINovalServer/src/main/java/com/ainovel/server/controller/AdminModelConfigController.java index 1cfc4dd..c297895 100644 --- a/AINovalServer/src/main/java/com/ainovel/server/controller/AdminModelConfigController.java +++ b/AINovalServer/src/main/java/com/ainovel/server/controller/AdminModelConfigController.java @@ -381,7 +381,7 @@ public class AdminModelConfigController { .provider(requestDTO.getProvider()) .modelId(requestDTO.getModelId()) .displayName(requestDTO.getDisplayName()) - .enabled(requestDTO.getEnabled()) + .enabled(requestDTO.getEnabled() != null ? requestDTO.getEnabled() : true) .apiEndpoint(requestDTO.getApiEndpoint()) .enabledForFeatures(requestDTO.getEnabledForFeatures()) .creditRateMultiplier(requestDTO.getCreditRateMultiplier()) diff --git a/AINovalServer/src/main/java/com/ainovel/server/repository/UserAIModelConfigRepository.java b/AINovalServer/src/main/java/com/ainovel/server/repository/UserAIModelConfigRepository.java index 6a13fc3..4360f2e 100644 --- a/AINovalServer/src/main/java/com/ainovel/server/repository/UserAIModelConfigRepository.java +++ b/AINovalServer/src/main/java/com/ainovel/server/repository/UserAIModelConfigRepository.java @@ -12,7 +12,6 @@ import reactor.core.publisher.Mono; public interface UserAIModelConfigRepository extends ReactiveMongoRepository { Flux findByUserId(String userId); - Mono findByUserIdAndId(String userId, String id); Mono findByUserIdAndProviderAndModelName(String userId, String provider, String modelName); diff --git a/AINovalServer/src/main/java/com/ainovel/server/service/impl/UserAIModelConfigServiceImpl.java b/AINovalServer/src/main/java/com/ainovel/server/service/impl/UserAIModelConfigServiceImpl.java index 1710c1c..fffbd3f 100644 --- a/AINovalServer/src/main/java/com/ainovel/server/service/impl/UserAIModelConfigServiceImpl.java +++ b/AINovalServer/src/main/java/com/ainovel/server/service/impl/UserAIModelConfigServiceImpl.java @@ -174,43 +174,37 @@ public class UserAIModelConfigServiceImpl implements UserAIModelConfigService { @Override @Transactional public Mono setDefaultConfiguration(String userId, String configId) { - return configRepository.findByUserIdAndId(userId, configId) + // 查找要设为默认的配置,并确保它存在且已验证 + Mono configToSetDefaultMono = configRepository.findByUserIdAndId(userId, configId) .switchIfEmpty(Mono.error(new RuntimeException("配置不存在或无权访问"))) - .flatMap(configToSetDefault -> { - if (!configToSetDefault.getIsValidated()) { + .flatMap(config -> { + if (!config.getIsValidated()) { return Mono.error(new IllegalArgumentException("无法将未验证的配置设为默认")); } - if (configToSetDefault.isDefault()) { - return Mono.just(configToSetDefault); + if (config.isDefault()) { + 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 Mono.just(config); }); + + // 事务性操作:先将所有配置取消默认,再设置新的默认 + 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 diff --git a/deploy/open/production.env b/deploy/open/production.env index d07ba35..a60a222 100644 --- a/deploy/open/production.env +++ b/deploy/open/production.env @@ -15,7 +15,7 @@ MANAGEMENT_HEALTH_RABBIT_ENABLED=false # ==== 最小必填占位(避免 Bean 装配失败)==== # ChatLanguageModelConfig 需要该键存在;开源默认给占位值,实际使用请改成真实 Key -AI_OPENAI_API_KEY=dummy_openai_key +AI_OPENAI_API_KEY=sk-QodfEMFLud0D6mtKQwtgcOUA6Vh2djaSPZSKuu9r4bopnKLF # 可选:如你启用了 Gemini 相关功能,可填,否则保留占位即可 AI_GEMINI_API_KEY=dummy_gemini_key @@ -43,9 +43,11 @@ CHROMA_URL= CHROMA_COLLECTION=ainovel # ==== AI Key(按需)==== -OPENAI_API_KEY= +OPENAI_API_KEY=sk-QodfEMFLud0D6mtKQwtgcOUA6Vh2djaSPZSKuu9r4bopnKLF GEMINI_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 \ No newline at end of file +AINOVEL_AI_FEATURES_SETTING_TREE_GENERATION_INIT_ON_STARTUP=true