package com.xly.runner; import com.xly.entity.SceneDto; import com.xly.entity.ToolMeta; import com.xly.entity.ParamRule; import com.xly.mapper.SceneMapper; import com.xly.mapper.ParamRuleMapper; import com.xly.mapper.ToolMetaMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @Slf4j @Component @Order(100) public class AppStartupRunner implements CommandLineRunner { // 静态缓存列表 private static final List AI_AGENT_CACHE = new ArrayList<>(); private static final List AI_TOOL_CACHE = new ArrayList<>(); private static final List AI_TOOL_PARAMS_CACHE = new ArrayList<>(); // 使用实例变量进行依赖注入 @Autowired private SceneMapper sceneMapper; @Autowired private ParamRuleMapper paramRuleMapper; @Autowired private ToolMetaMapper toolMetaMapper; public void cleanAllInit(){ AI_AGENT_CACHE.clear(); AI_TOOL_CACHE.clear(); AI_TOOL_PARAMS_CACHE.clear(); //初始化 initCache(); } @Override public void run(String... args) throws Exception { log.info("应用启动完成,开始初始化..."); // 初始化缓存 initCache(); // 打印缓存信息 printCacheInfo(); log.info("应用初始化完成"); } /** * 配置热点数据加载 */ private void initCache() { log.info("开始初始化缓存..."); // 1. 加载AI代理数据 List sceneDtos = sceneMapper.findAll(); if (sceneDtos != null) { AI_AGENT_CACHE.clear(); AI_AGENT_CACHE.addAll(sceneDtos); log.info("加载AI代理数据: {} 条", sceneDtos.size()); } else { log.warn("AI代理数据为空"); } // 2. 加载AI工具数据 List toolMetas = toolMetaMapper.findAll(); if (toolMetas != null) { AI_TOOL_CACHE.clear(); AI_TOOL_CACHE.addAll(toolMetas); log.info("加载AI工具数据: {} 条", toolMetas.size()); } else { log.warn("AI工具数据为空"); } // 3. 加载AI工具参数数据 List toolParams = paramRuleMapper.findAll(); if (toolParams != null) { AI_TOOL_PARAMS_CACHE.clear(); AI_TOOL_PARAMS_CACHE.addAll(toolParams); log.info("加载AI工具参数数据: {} 条", toolParams.size()); } else { log.warn("AI工具参数数据为空"); } log.info("缓存初始化完成"); } /** * 打印缓存信息 */ private void printCacheInfo() { log.info("=== 缓存统计 ==="); log.info("AI代理缓存: {} 条", AI_AGENT_CACHE.size()); log.info("AI工具缓存: {} 条", AI_TOOL_CACHE.size()); log.info("AI工具参数缓存: {} 条", AI_TOOL_PARAMS_CACHE.size()); // 打印前几条数据示例 if (!AI_AGENT_CACHE.isEmpty()) { log.info("AI代理示例: {}", AI_AGENT_CACHE.get(0)); } if (!AI_TOOL_CACHE.isEmpty()) { log.info("AI工具示例: {}", AI_TOOL_CACHE.get(0)); } } /** * 静态方法获取缓存(线程安全) */ public static List getAiAgentCache() { return new ArrayList<>(AI_AGENT_CACHE); // 返回副本,保证线程安全 } public static List getAiToolCache() { return new ArrayList<>(AI_TOOL_CACHE); } public static List getAiToolParamsCache() { return new ArrayList<>(AI_TOOL_PARAMS_CACHE); } public static List getTools(List sModleData) { List rData = AI_TOOL_CACHE.stream() .filter(agent -> sModleData.contains(agent.getSSrcFormId())) .collect(Collectors.toList()); rData.sort(Comparator.comparing(h -> h.getIOrder())); return rData; } public static List getAllTools() { return AI_TOOL_CACHE; } /** * 根据ID获取AI代理 */ public static SceneDto getAiAgentById(String sId) { return AI_AGENT_CACHE.stream() .filter(agent -> agent.getSId().equals(sId)) .findFirst() .orElse(null); } /** * 根据编码获取AI代理 */ public static SceneDto getAiAgentByCode(String sCode) { return AI_AGENT_CACHE.stream() .filter(agent -> agent.getSSceneNo().equals(sCode)) .findFirst() .orElse(null); } /** * 刷新缓存 */ public void refreshCache() { initCache(); } }