From 95ae0c83d2aa58d86b4039e3f7f16ee93afb8f00 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期五, 23 十月 2026 17:01:00 +0800
Subject: [PATCH] feat(ai): 完善模型管理和智能体导入功能

---
 yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiModelServiceImpl.java |   71 +++++++++++++++++++++++++++++++++--
 1 files changed, 66 insertions(+), 5 deletions(-)

diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiModelServiceImpl.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiModelServiceImpl.java
index c2adbae..4b34498 100644
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiModelServiceImpl.java
+++ b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiModelServiceImpl.java
@@ -5,9 +5,12 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelPageReqVO;
 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelSaveReqVO;
+import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelUpdateStatusReqVO;
 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO;
 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO;
 import cn.iocoder.yudao.module.ai.dal.mysql.model.AiModelMapper;
+import cn.iocoder.yudao.module.ai.enums.model.AiModelCapabilityEnum;
+import cn.iocoder.yudao.module.ai.enums.model.AiModelTypeEnum;
 import cn.iocoder.yudao.module.ai.enums.model.AiPlatformEnum;
 import cn.iocoder.yudao.module.ai.framework.ai.config.YudaoAiProperties;
 import cn.iocoder.yudao.module.ai.framework.ai.core.model.AiModelFactory;
@@ -17,6 +20,7 @@
 import org.springframework.ai.vectorstore.VectorStore;
 import org.springframework.ai.vectorstore.milvus.MilvusVectorStore;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import java.util.List;
 import java.util.Map;
@@ -37,20 +41,34 @@
     private YudaoAiProperties aiProperties;
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Long createModel(AiModelSaveReqVO createReqVO) {
         AiPlatformEnum.validatePlatform(createReqVO.getPlatform());
         apiKeyService.validateApiKey(createReqVO.getKeyId());
         AiModelDO model = BeanUtils.toBean(createReqVO, AiModelDO.class);
+        model.setCapability(resolveCapability(createReqVO.getCapability()));
+        if (CommonStatusEnum.isEnable(model.getStatus())) {
+            disableOtherEnabledModels(model);
+        }
         modelMapper.insert(model);
         return model.getId();
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void updateModel(AiModelSaveReqVO updateReqVO) {
-        validateModelExists(updateReqVO.getId());
+        AiModelDO existing = validateModelExists(updateReqVO.getId());
         AiPlatformEnum.validatePlatform(updateReqVO.getPlatform());
         apiKeyService.validateApiKey(updateReqVO.getKeyId());
-        modelMapper.updateById(BeanUtils.toBean(updateReqVO, AiModelDO.class));
+        AiModelDO model = BeanUtils.toBean(updateReqVO, AiModelDO.class);
+        // 鏈紶鑳藉姏鏃舵部鐢ㄥ師鍊硷紝閬垮厤鑰佸墠绔彁浜ゆ妸瑙嗚妯″瀷闄嶇骇鎴愭枃鏈兘鍔�
+        model.setCapability(resolveCapability(
+                updateReqVO.getCapability() == null || updateReqVO.getCapability().isBlank()
+                        ? existing.getCapability() : updateReqVO.getCapability()));
+        if (CommonStatusEnum.isEnable(model.getStatus())) {
+            disableOtherEnabledModels(model);
+        }
+        modelMapper.updateById(model);
     }
 
     @Override
@@ -66,8 +84,17 @@
 
     @Override
     public AiModelDO getRequiredDefaultModel(Integer type) {
-        AiModelDO model = modelMapper.selectFirstByStatus(type, CommonStatusEnum.ENABLE.getStatus());
-        if (model == null) throw exception(MODEL_DISABLE);
+        return getRequiredDefaultModel(type, AiModelCapabilityEnum.defaultCapability());
+    }
+
+    @Override
+    public AiModelDO getRequiredDefaultModel(Integer type, String capability) {
+        AiModelDO model = modelMapper.selectFirstByTypeAndCapabilityAndStatus(
+                type, resolveCapability(capability), CommonStatusEnum.ENABLE.getStatus());
+        if (model == null) {
+            throw exception(MODEL_NOT_ENABLED,
+                    AiModelTypeEnum.getName(type), AiModelCapabilityEnum.getName(resolveCapability(capability)));
+        }
         return model;
     }
 
@@ -77,9 +104,21 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateModelStatus(AiModelUpdateStatusReqVO updateReqVO) {
+        AiModelDO model = validateModelExists(updateReqVO.getId());
+        model.setStatus(updateReqVO.getStatus());
+        if (CommonStatusEnum.isEnable(updateReqVO.getStatus())) {
+            // 鍚敤锛氳嚜鍔ㄥ叧闂悓銆岀被鍨� + 鑳藉姏銆嶄笅鐨勫叾浠栨ā鍨嬶紝淇濊瘉鍚岀粍鍙湁涓�涓惎鐢�
+            disableOtherEnabledModels(model);
+        }
+        modelMapper.updateById(model);
+    }
+
+    @Override
     public AiModelDO validateModel(Long id) {
         AiModelDO model = validateModelExists(id);
-        if (CommonStatusEnum.isDisable(model.getStatus())) throw exception(MODEL_DISABLE);
+        if (CommonStatusEnum.isDisable(model.getStatus())) throw exception(MODEL_DISABLE, model.getName());
         return model;
     }
 
@@ -88,6 +127,28 @@
         return modelMapper.selectListByStatusAndType(status, type, platform);
     }
 
+    /**
+     * 鍏抽棴鍚屻�岀被鍨� + 鑳藉姏銆嶄笅宸插惎鐢ㄧ殑鍏朵粬妯″瀷锛堜笉鍚嚜韬級
+     */
+    private void disableOtherEnabledModels(AiModelDO model) {
+        List<AiModelDO> sameGroup = modelMapper.selectListByTypeAndCapabilityAndStatus(
+                model.getType(), resolveCapability(model.getCapability()), CommonStatusEnum.ENABLE.getStatus());
+        for (AiModelDO other : sameGroup) {
+            if (other.getId().equals(model.getId())) {
+                continue;
+            }
+            AiModelDO update = new AiModelDO();
+            update.setId(other.getId());
+            update.setStatus(CommonStatusEnum.DISABLE.getStatus());
+            modelMapper.updateById(update);
+        }
+    }
+
+    private static String resolveCapability(String capability) {
+        return capability == null || capability.isBlank()
+                ? AiModelCapabilityEnum.defaultCapability() : capability;
+    }
+
     private AiModelDO validateModelExists(Long id) {
         AiModelDO model = modelMapper.selectById(id);
         if (model == null) throw exception(MODEL_NOT_EXISTS);

--
Gitblit v1.9.3