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<String, ModuleSearchable> moduleSearchMap;
|
|
/**
|
* 自动收集所有实现ModuleSearchable接口的Bean
|
*/
|
@Autowired
|
public InterfaceBasedSearchRouter(List<ModuleSearchable> 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<SysMenu> 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);
|
}
|
}
|