package com.ruoyi.service.impl; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.service.ModuleSearchable; import lombok.extern.slf4j.Slf4j; import org.apache.commons.logging.Log; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @Service @Slf4j public class InterfaceBasedSearchRouter { private final Map moduleSearchMap; /** * 自动收集所有实现ModuleSearchable接口的Bean */ @Autowired public InterfaceBasedSearchRouter(List searchServices) { this.moduleSearchMap = searchServices.stream() .collect(Collectors.toMap( ModuleSearchable::getModuleCode, Function.identity(), (existing, replacement) -> { log.warn("发现重复的模块编码: {}, 使用先注册的服务", existing.getModuleCode()); return existing; } )); log.info("已注册搜索模块: {}", moduleSearchMap.keySet()); } /** * 通用的路由搜索请求(支持不同参数类型) */ /** * 通用的路由搜索请求 */ public AjaxResult routeSearch(String moduleCode, Object... args) { log.info("路由搜索: moduleCode={}, args={}", moduleCode, Arrays.toString(args)); ModuleSearchable searchService = moduleSearchMap.get(moduleCode); if (searchService == null) { String availableModules = String.join(", ", moduleSearchMap.keySet()); return AjaxResult.error("不支持的搜索模块: " + moduleCode + "。可用模块: [" + availableModules + "]"); } try { // 根据参数数量进行路由 if (args.length == 3) { return handleFourArgs(searchService, args); } else { return AjaxResult.error("不支持的参数数量,需要3个参数,实际收到: " + args.length); } } catch (Exception e) { log.error("搜索执行失败: moduleCode={}", moduleCode, e); return AjaxResult.error("搜索执行失败: " + e.getMessage()); } } /** * 处理3个参数的情况(companion + happenStartTime + happenEndTime) */ private AjaxResult handleFourArgs(ModuleSearchable searchService, Object[] args) { String companion = null; Date happenStartTime = null; Date happenEndTime = null; // 处理companion参数 if (args[0] instanceof String) { companion = (String) args[0]; } else if (args[0] != null) { companion = args[0].toString(); } // 处理时间参数 if (args[1] instanceof Date) { happenStartTime = (Date) args[1]; } if (args[2] instanceof Date) { happenEndTime = (Date) args[2]; } // 判断搜索类型 boolean hasTimeRange = happenStartTime != null && happenEndTime != null; List result; if (hasTimeRange) { // 有时间范围:执行时间范围搜索 log.info("执行时间范围搜索: companion={}, startTime={}, endTime={}", companion, happenStartTime, happenEndTime); result = searchService.search(companion, happenStartTime, happenEndTime); } else { // 无时间范围:只按companion搜索 log.info("执行companion搜索: companion={}, 时间范围为空", companion); result = searchService.search(companion, null, null); } return AjaxResult.success("搜索成功", result); } // // /** // * 获取所有可搜索的模块信息 // */ // public List getAvailableModules() { // return moduleSearchMap.values().stream() // .map(service -> SysMenu.builder() // .moduleCode(service.getModuleCode()) // .moduleName(service.getModuleName()) // .build()) // .collect(Collectors.toList()); // } /** * 检查模块是否支持搜索 */ public boolean supports(String moduleCode) { return moduleSearchMap.containsKey(moduleCode); } /** * 获取模块服务实例 */ public ModuleSearchable getModuleService(String moduleCode) { return moduleSearchMap.get(moduleCode); } }