.gitignore
@@ -45,3 +45,4 @@ !*/build/*.java !*/build/*.html !*/build/*.xml **/EsSearchController.java ruoyi-admin/src/main/java/com/ruoyi/web/controller/zhang/EsSearchController.java
@@ -2,6 +2,9 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.EsModel; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.domain.PeopleSea; import com.ruoyi.service.EsService; import com.ruoyi.service.ZfEconomyService; import com.ruoyi.service.impl.InterfaceBasedSearchRouter; @@ -15,6 +18,9 @@ import javax.websocket.server.PathParam; import java.util.Date; import java.util.List; import static com.ruoyi.common.core.page.TableSupport.PAGE_NUM; import static com.ruoyi.common.core.page.TableSupport.PAGE_SIZE; /** * @Author Jinquan_Ou @@ -54,19 +60,22 @@ } @GetMapping("/companion/{moduleCode}") public AjaxResult getAllbyCAY( @PathVariable("moduleCode") String moduleCode,@RequestParam(value = "companion", required = false) String companion, @RequestParam(value = "happenStartTime", required = false) public AjaxResult getAllbyCAY(@PathVariable("moduleCode") String moduleCode, @RequestParam(value = "companion", required = false) String companion, @RequestParam(value = "happenStartTime", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date happenStartTime, @RequestParam(value = "happenEndTime", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date happenEndTime){ @RequestParam(value = "happenEndTime", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date happenEndTime, PeopleSea peopleSea){ System.out.println("[[[[[["+moduleCode); System.out.println("[[[[[["+companion); System.out.println("[[[[[["+happenStartTime); System.out.println("[[[[[["+happenEndTime); Integer pageNum = Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1); Integer pageSize = Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10); zfEconomyService.clearAllCache(); return interfaceBasedSearchRouter.routeSearch(moduleCode,companion,happenStartTime,happenEndTime); return interfaceBasedSearchRouter.routeSearch(peopleSea,pageNum,pageSize); } /** * 新增全模块搜索接口(不指定moduleCode) @@ -76,14 +85,31 @@ @RequestParam(value = "happenStartTime", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date happenStartTime, @RequestParam(value = "happenEndTime", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date happenEndTime) { @DateTimeFormat(pattern = "yyyy-MM-dd") Date happenEndTime, PeopleSea peopleSea) { System.out.println("全模块搜索 - 同伴: " + companion); System.out.println("全模块搜索 - 开始时间: " + happenStartTime); System.out.println("全模块搜索 - 结束时间: " + happenEndTime); zfEconomyService.clearAllCache(); // 使用null或空字符串表示全模块搜索 return interfaceBasedSearchRouter.routeSearch(null, companion, happenStartTime, happenEndTime); Integer pageNum = Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1); Integer pageSize = Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10); return interfaceBasedSearchRouter.routeSearch(peopleSea,pageNum,pageSize); } /** * 通用搜索接口 * 支持单个、多个、全模块搜索 */ @PostMapping("/universal") public AjaxResult universalSearch(@RequestBody PeopleSea peopleSea) { Integer pageNum = Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1); Integer pageSize = Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10); System.out.println("全模块搜索 - 同伴: " + peopleSea.getPeoples()); System.out.println("全模块搜索 - 开始时间: " + peopleSea.getStartTime()); System.out.println("全模块搜索 - 结束时间: " + peopleSea.getEndTime()); return interfaceBasedSearchRouter.routeSearch(peopleSea,pageNum,pageSize); } } ruoyi-admin/src/main/java/com/ruoyi/web/controller/zhang/peopleSearchController.java
@@ -4,10 +4,8 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.domain.ZfDoctor; import com.ruoyi.domain.peopleSea; import com.ruoyi.domain.PeopleSea; import com.ruoyi.service.PeopleSearchService; import com.ruoyi.service.PhyscialService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -25,7 +23,7 @@ @GetMapping("/all") public AjaxResult listAll(peopleSea peopleSea){ public AjaxResult listAll(PeopleSea peopleSea){ Integer pageNum = Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1); Integer pageSize = Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10); System.out.println(peopleSearchService); ruoyi-common/src/main/java/com/ruoyi/common/config/ElasticSearchConfig.java
@@ -35,7 +35,9 @@ new HttpHost( "localhost", 8087, "http" "http" ) )); zhang-content/src/main/java/com/ruoyi/domain/ModuleSearchResult.java
@@ -4,6 +4,7 @@ public class ModuleSearchResult { private final String moduleCode; private final String moduleName; private final List<?> data; private final int count; private final long searchTime; @@ -13,6 +14,7 @@ private ModuleSearchResult(String moduleCode, String moduleName, List<?> data, int count, long searchTime, boolean success, String errorMessage) { this.moduleCode = moduleCode; this.moduleName = moduleName; this.data = data; this.count = count; this.searchTime = searchTime; @@ -29,8 +31,9 @@ return new ModuleSearchResult(moduleCode, null, null, 0, 0, false, errorMessage); } // getters... // Getters public String getModuleCode() { return moduleCode; } public String getModuleName() { return moduleName; } public List<?> getData() { return data; } public int getCount() { return count; } public long getSearchTime() { return searchTime; } zhang-content/src/main/java/com/ruoyi/domain/PeopleSea.java
File was renamed from zhang-content/src/main/java/com/ruoyi/domain/peopleSea.java @@ -5,7 +5,7 @@ import java.util.Date; @Data public class peopleSea { public class PeopleSea { private String[] modules; // private String module; @@ -13,5 +13,5 @@ private Date endTime; private String peoples; private String hasAttachment; private String hasAttachment; } zhang-content/src/main/java/com/ruoyi/domain/ZfDoctor.java
@@ -121,4 +121,10 @@ */ @TableField(exist = false) private Date happenEndTime; /** * 是否有附件 */ @TableField(exist = false) private String hasAttachment; } zhang-content/src/main/java/com/ruoyi/domain/ZfEconomy.java
@@ -134,5 +134,9 @@ // @TableField(exist = false) // private Integer year; /** * 是否有附件 */ @TableField(exist = false) private String hasAttachment; } zhang-content/src/main/java/com/ruoyi/service/ModuleSearchable.java
@@ -3,6 +3,7 @@ import com.ruoyi.domain.ZfEconomy; import java.util.Date; import java.util.HashMap; import java.util.List; public interface ModuleSearchable { @@ -14,7 +15,7 @@ /** * 搜索方法 */ List<?> search(String companion, Date happenStartTime,Date happenEndTime); List<?> search(String companion, Date happenStartTime, Date happenEndTime, String hasAttachment); /** * 模块名称 zhang-content/src/main/java/com/ruoyi/service/PeopleSearchService.java
@@ -1,9 +1,9 @@ package com.ruoyi.service; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.domain.peopleSea; import com.ruoyi.domain.PeopleSea; public interface PeopleSearchService { AjaxResult selectDataList(peopleSea peopleS, Integer pageNum, Integer pageSize); AjaxResult selectDataList(PeopleSea peopleS, Integer pageNum, Integer pageSize); } zhang-content/src/main/java/com/ruoyi/service/impl/InterfaceBasedSearchRouter.java
@@ -1,20 +1,18 @@ package com.ruoyi.service.impl; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.domain.ModuleSearchResult; import com.ruoyi.domain.PeopleSea; import com.ruoyi.service.ModuleSearchable; import lombok.extern.slf4j.Slf4j; import org.apache.commons.logging.Log; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.function.Function; import java.util.stream.Collectors; @@ -24,6 +22,11 @@ private final Map<String, ModuleSearchable> moduleSearchMap; // 模块分割符 private static final String MODULE_SEPARATOR = ","; // 全模块标识 private static final String ALL_MODULES_FLAG = "all"; /** * 自动收集所有实现ModuleSearchable接口的Bean @@ -43,214 +46,353 @@ log.info("已注册搜索模块: {}", moduleSearchMap.keySet()); } @Async // 声明此方法异步执行,将使用我们上面配置的Executor public CompletableFuture<ModuleSearchResult> searchModuleAsync(String moduleCode, ModuleSearchable service, String companion, Date startTime, Date endTime) { // 将原来在lambda表达式中的搜索逻辑移到这里 @Async public CompletableFuture<ModuleSearchResult> searchModuleAsync(String moduleCode, ModuleSearchable service, String companion, Date startTime, Date endTime, String hasAttachment, Integer pageNum, Integer pageSize) { long start = System.currentTimeMillis(); try { List<?> data = service.search(companion, startTime, endTime); // 调用搜索方法,返回 List<?> List<?> data = service.search(companion, startTime, endTime, hasAttachment); long searchTime = System.currentTimeMillis() - start; ModuleSearchResult result = ModuleSearchResult.success(moduleCode, service.getModuleName(), data, data.size(), searchTime); int count = 0; if (data != null) { count = data.size(); } // 获取模块名称 String moduleName = getModuleName(moduleCode); ModuleSearchResult result = ModuleSearchResult.success( moduleCode, moduleName, data, count, searchTime ); return CompletableFuture.completedFuture(result); } catch (Exception e) { log.error("模块[{}]搜索失败: {}", moduleCode, e.getMessage()); ModuleSearchResult result = ModuleSearchResult.error(moduleCode, e.getMessage()); log.error("模块[{}]搜索失败: {}", moduleCode, e.getMessage(), e); String errorMessage = e.getMessage(); if (e.getCause() != null) { errorMessage += " (" + e.getCause().getMessage() + ")"; } ModuleSearchResult result = ModuleSearchResult.error(moduleCode, errorMessage); return CompletableFuture.completedFuture(result); } } /** * 通用的路由搜索请求(支持不同参数类型) */ /** * 通用的路由搜索请求 */ public AjaxResult routeSearch(String moduleCode, Object... args) { log.info("路由搜索: moduleCode={}, args={}", moduleCode, Arrays.toString(args)); public AjaxResult routeSearch(PeopleSea peopleS, Integer pageNum, Integer pageSize) { String moduleCode = null; // 全模块搜索:当moduleCode为空或特定标识时 if (moduleCode == null || moduleCode.isEmpty() || "all".equalsIgnoreCase(moduleCode)) { return searchAllModules(args); } // 安全处理 String[] 类型的 modules if (peopleS != null && peopleS.getModules() != null && peopleS.getModules().length != 0) { String[] modulesArray = peopleS.getModules(); // 单个模块搜索(原有逻辑) 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()); } } 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); } /** * 全模块搜索:获取所有模块的数据并分类 */ private AjaxResult searchAllModules(Object[] args) { log.info("执行全模块搜索,参数数量: {}", args.length); try { Map<String, Object> result = new LinkedHashMap<>(); int totalCount = 0; int successCount = 0; // 处理搜索参数 String companion = extractCompanion(args); Date happenStartTime = extractStartTime(args); Date happenEndTime = extractEndTime(args); System.out.println("全模块搜索 ------ 同伴: " + companion); System.out.println("全模块搜索 ------ 开始时间: " + happenStartTime); System.out.println("全模块搜索 ------ 结束时间: " + happenEndTime); // 并行处理所有模块搜索(提高性能) List<CompletableFuture<ModuleSearchResult>> futures = moduleSearchMap.entrySet().stream().map(entry -> searchModuleAsync(entry.getKey(), entry.getValue(), companion, happenStartTime, happenEndTime)) // 过滤掉空字符串和空白字符 List<String> validModules = Arrays.stream(modulesArray) .filter(StringUtils::isNotBlank) .map(String::trim) .collect(Collectors.toList()); if (!validModules.isEmpty()) { // 用逗号连接有效的模块代码 moduleCode = String.join(",", validModules); } } // 等待所有搜索完成 CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); log.info("路由搜索: moduleCode={}, peopleS={}, pageNum={}, pageSize={}", moduleCode, peopleS, pageNum, pageSize); // 收集结果 for (CompletableFuture<ModuleSearchResult> future : futures) { ModuleSearchResult moduleResult = future.get(); if (moduleResult.isSuccess()) { // 创建一个可变的HashMap并填入数据 Map<String, Object> resultMap = new HashMap<>(); resultMap.put("data", moduleResult.getData()); resultMap.put("count", moduleResult.getCount()); resultMap.put("searchTime", moduleResult.getSearchTime()); // 解析模块代码 List<String> targetModules = parseModuleCodes(moduleCode); // 将构建好的Map放入最终结果中 result.put(moduleResult.getModuleCode(), resultMap); if (targetModules.isEmpty()) { // 不选模块的情况 return handleNoModuleSelected(); } successCount++; totalCount += moduleResult.getCount(); } else { Map<String, Object> errorInfo = new HashMap<>(); errorInfo.put("error", moduleResult.getErrorMessage()); errorInfo.put("success", false); result.put(moduleResult.getModuleCode(), errorInfo); // 统一处理:单个模块、多个模块都使用同样的处理逻辑 return executeModulesSearch(targetModules, peopleS, pageNum, pageSize); } /** * 统一执行模块搜索 */ private AjaxResult executeModulesSearch(List<String> moduleCodes, PeopleSea peopleS, Integer pageNum, Integer pageSize) { log.info("执行模块搜索: moduleCodes={}, 模块数量={}", moduleCodes, moduleCodes.size()); // 验证所有模块是否存在 List<String> invalidModules = moduleCodes.stream() .filter(code -> !moduleSearchMap.containsKey(code)) .collect(Collectors.toList()); if (!invalidModules.isEmpty()) { String availableModules = String.join(", ", moduleSearchMap.keySet()); String errorMsg = String.format("以下模块不支持: %s。可用模块: [%s]", invalidModules, availableModules); return AjaxResult.error(errorMsg); } // 提取参数 String companion = extractCompanion(peopleS); Date startTime = extractStartTime(peopleS); Date endTime = extractEndTime(peopleS); String hasAttachment = extractHasAttachment(peopleS); // 设置分页默认值 if (pageNum == null || pageNum <= 0) { pageNum = 1; } if (pageSize == null || pageSize <= 0) { pageSize = 10; } // 并发搜索 Integer finalPageNum = pageNum; Integer finalPageSize = pageSize; List<CompletableFuture<ModuleSearchResult>> futures = moduleCodes.stream() .map(code -> searchModuleAsync(code, moduleSearchMap.get(code), companion, startTime, endTime, hasAttachment, finalPageNum, finalPageSize)) .collect(Collectors.toList()); // 等待完成 CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); // 合并数据 List<Object> allData = new ArrayList<>(); for (CompletableFuture<ModuleSearchResult> future : futures) { try { ModuleSearchResult result = future.get(); if (result.isSuccess() && result.getData() != null) { allData.addAll(result.getData()); } } catch (Exception e) { // 记录错误但继续处理其他模块 log.error("获取模块搜索结果失败", e); } } // 对数据进行排序(如果需要) sortData(allData); // 分页 int startIndex = (pageNum - 1) * pageSize; List<Object> paginatedData = allData.stream() .skip(startIndex) .limit(pageSize) .collect(Collectors.toList()); // 返回结果 Map<String, Object> data = new HashMap<>(); data.put("list", paginatedData); data.put("total", allData.size()); data.put("pageNum", pageNum); data.put("pageSize", pageSize); return AjaxResult.success(data); } /** * 对数据进行排序 * 默认按创建时间降序排列 */ private void sortData(List<Object> allData) { if (CollectionUtils.isEmpty(allData)) { return; } // 如果数据是 Map 类型,尝试按 createTime 排序 if (allData.get(0) instanceof Map) { allData.sort((a, b) -> { Map<String, Object> mapA = (Map<String, Object>) a; Map<String, Object> mapB = (Map<String, Object>) b; Object timeA = mapA.get("createTime"); Object timeB = mapB.get("createTime"); if (timeA instanceof Date && timeB instanceof Date) { // 降序排列:最新的在前 return ((Date) timeB).compareTo((Date) timeA); } else if (timeA instanceof String && timeB instanceof String) { // 如果时间是字符串,尝试解析 try { Date dateA = parseDate((String) timeA); Date dateB = parseDate((String) timeB); if (dateA != null && dateB != null) { return dateB.compareTo(dateA); } } catch (Exception e) { // 解析失败,不排序 } } return 0; }); } } /** * 解析日期字符串 */ private Date parseDate(String dateStr) { if (dateStr == null || dateStr.isEmpty()) { return null; } try { // 尝试常见的日期格式 String[] formats = { "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd" }; for (String format : formats) { try { return new java.text.SimpleDateFormat(format).parse(dateStr); } catch (Exception e) { // 继续尝试下一个格式 } } // 构建返回结果 Map<String, Object> finalResult = new LinkedHashMap<>(); finalResult.put("totalModules", moduleSearchMap.size()); finalResult.put("successModules", successCount); finalResult.put("totalRecords", totalCount); finalResult.put("searchTime", new Date()); finalResult.put("modules", result); log.info("全模块搜索完成: 成功{}/{}个模块,总计{}条记录", successCount, moduleSearchMap.size(), totalCount); return AjaxResult.success("全模块搜索成功", finalResult); } catch (Exception e) { log.error("全模块搜索执行失败", e); return AjaxResult.error("全模块搜索失败: " + e.getMessage()); log.warn("无法解析日期字符串: {}", dateStr, e); } } /** * 单个模块搜索包装方法 */ private ModuleSearchResult searchSingleModule(String moduleCode, ModuleSearchable service, String companion, Date startTime, Date endTime) { long start = System.currentTimeMillis(); try { List<?> data = service.search(companion, startTime, endTime); long searchTime = System.currentTimeMillis() - start; return ModuleSearchResult.success(moduleCode, service.getModuleName(), data, data.size(), searchTime); } catch (Exception e) { log.error("模块[{}]搜索失败: {}", moduleCode, e.getMessage()); return ModuleSearchResult.error(moduleCode, e.getMessage()); } } // // /** // * 获取所有可搜索的模块信息 // */ // public List<SysMenu> getAvailableModules() { // return moduleSearchMap.values().stream() // .map(service -> SysMenu.builder() // .moduleCode(service.getModuleCode()) // .moduleName(service.getModuleName()) // .build()) // .collect(Collectors.toList()); // } /** * 参数提取辅助方法 */ private String extractCompanion(Object[] args) { if (args.length > 0 && args[0] instanceof String) { return (String) args[0]; } else if (args.length > 0 && args[0] != null) { return args[0].toString(); } return null; } private Date extractStartTime(Object[] args) { return (args.length > 1 && args[1] instanceof Date) ? (Date) args[1] : null; /** * 获取模块名称 */ private String getModuleName(String moduleCode) { ModuleSearchable service = moduleSearchMap.get(moduleCode); return service != null ? service.getModuleName() : "未知模块"; } private Date extractEndTime(Object[] args) { return (args.length > 2 && args[2] instanceof Date) ? (Date) args[2] : null; /** * 安全的参数提取方法 */ private String extractCompanion(PeopleSea peopleS) { if (peopleS == null) { return ""; } return peopleS.getPeoples() == null ? "" : peopleS.getPeoples().trim(); } private Date extractStartTime(PeopleSea peopleS) { if (peopleS == null) { return null; } return peopleS.getStartTime(); } private Date extractEndTime(PeopleSea peopleS) { if (peopleS == null) { return null; } return peopleS.getEndTime(); } private String extractHasAttachment(PeopleSea peopleS) { if (peopleS == null) { return ""; } return peopleS.getHasAttachment() == null ? "" : peopleS.getHasAttachment().trim(); } /** * 解析模块代码 */ private List<String> parseModuleCodes(String moduleCode) { if (StringUtils.isBlank(moduleCode)) { // 空/空白/null -> 全模块搜索 return new ArrayList<>(moduleSearchMap.keySet()); } String trimmedCode = moduleCode.trim(); // 处理全模块标识 if (ALL_MODULES_FLAG.equalsIgnoreCase(trimmedCode)) { return new ArrayList<>(moduleSearchMap.keySet()); } // 处理不选模块的情况 if ("none".equalsIgnoreCase(trimmedCode) || "null".equalsIgnoreCase(trimmedCode)) { return Collections.emptyList(); } // 检查是否包含逗号(多个模块) if (trimmedCode.contains(MODULE_SEPARATOR)) { String[] moduleArray = trimmedCode.split(MODULE_SEPARATOR); return Arrays.stream(moduleArray) .map(String::trim) .filter(code -> !code.isEmpty()) .collect(Collectors.toList()); } // 单个模块 return Collections.singletonList(trimmedCode); } /** * 不选模块的处理逻辑 */ private AjaxResult handleNoModuleSelected() { Map<String, Object> result = new LinkedHashMap<>(); result.put("list", Collections.emptyList()); result.put("total", 0); result.put("pageNum", 1); result.put("pageSize", 10); return AjaxResult.success("未选择搜索模块,请选择要搜索的模块", result); } /** * 获取可用模块列表 */ public AjaxResult getAvailableModules() { Map<String, Object> result = new HashMap<>(); List<Map<String, Object>> modules = moduleSearchMap.values().stream() .map(service -> { Map<String, Object> moduleInfo = new HashMap<>(); moduleInfo.put("moduleCode", service.getModuleCode()); moduleInfo.put("moduleName", service.getModuleName()); return moduleInfo; }) .collect(Collectors.toList()); result.put("modules", modules); result.put("total", modules.size()); return AjaxResult.success("获取可用模块成功", result); } /** * 验证模块代码是否存在 */ public boolean validateModule(String moduleCode) { if (StringUtils.isBlank(moduleCode)) { return false; } // 处理多个模块的情况 if (moduleCode.contains(MODULE_SEPARATOR)) { String[] moduleArray = moduleCode.split(MODULE_SEPARATOR); for (String code : moduleArray) { String trimmedCode = code.trim(); if (!moduleSearchMap.containsKey(trimmedCode) && !ALL_MODULES_FLAG.equalsIgnoreCase(trimmedCode)) { return false; } } return true; } // 单个模块的情况 String trimmedCode = moduleCode.trim(); return moduleSearchMap.containsKey(trimmedCode) || ALL_MODULES_FLAG.equalsIgnoreCase(trimmedCode); } } zhang-content/src/main/java/com/ruoyi/service/impl/PeopleSearchServiceImpl.java
@@ -7,7 +7,7 @@ import com.ruoyi.domain.ZfEvent; import com.ruoyi.domain.dto.zfEventdto; import com.ruoyi.domain.peopleSea; import com.ruoyi.domain.PeopleSea; import com.ruoyi.service.PeopleSearchService; import com.ruoyi.service.ZfEventService; import org.springframework.beans.factory.annotation.Autowired; @@ -24,7 +24,7 @@ private ZfEventService zfEventService; private LambdaQueryWrapper<peopleSea> buildCondition(peopleSea peops) { private LambdaQueryWrapper<PeopleSea> buildCondition(PeopleSea peops) { return null; // if(peops.getModule().equals("事纪")) { @@ -44,7 +44,7 @@ @Override public AjaxResult selectDataList(peopleSea peopleS, Integer pageNum, Integer pageSize) { public AjaxResult selectDataList(PeopleSea peopleS, Integer pageNum, Integer pageSize) { System.out.println(peopleS.getModules().toString()); for(String thi: peopleS.getModules()) { zhang-content/src/main/java/com/ruoyi/service/impl/ZfDoctorServiceImpl.java
@@ -11,6 +11,7 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.domain.*; import com.ruoyi.domain.dto.zfEventdto; import com.ruoyi.mapper.ZfDoctorMapper; import com.ruoyi.service.*; import com.ruoyi.service.ZfDoctorService; @@ -160,13 +161,13 @@ public List<ZfDoctor> markOwnData(Long familyId,Long fatherFamilyId, Long motherFamilyId, List<ZfDoctor> beanRecords) { return beanRecords.stream().peek( bean -> { if (Objects.equals(bean.getFamilyId(), familyId) ||(fatherFamilyId!=0L && fatherFamilyId.equals(familyId))||(motherFamilyId!=0L && motherFamilyId.equals(familyId))) { bean.setOwnData(1); } else { bean.setOwnData(0); } bean -> { if (Objects.equals(bean.getFamilyId(), familyId) ||(fatherFamilyId!=0L && fatherFamilyId.equals(familyId))||(motherFamilyId!=0L && motherFamilyId.equals(familyId))) { bean.setOwnData(1); } else { bean.setOwnData(0); } } ).sorted((a, b) -> b.getOwnData() - a.getOwnData()).collect(Collectors.toList()); } @@ -194,13 +195,13 @@ for (ZfDoctor zfDoctor : dataList) { // if (zfDoctor.getSuitable().length() != 0 || zfDoctor.getType().length() != 0 || zfDoctor.getEffect().length() != 0 ) { if(zfDoctor.getSymptom().length() == 0 || zfDoctor.getSymptom() == null){ throw new RuntimeException("症状为空,导入数据失败"); } else { zfDoctorService.addData(zfDoctor); } if(zfDoctor.getSymptom().length() == 0 || zfDoctor.getSymptom() == null){ throw new RuntimeException("症状为空,导入数据失败"); } else { zfDoctorService.addData(zfDoctor); } } // } return AjaxResult.success("导入数据成功"); @@ -353,13 +354,13 @@ UpdateRequest updateRequest = new UpdateRequest("allsearchdata", esResult.getId()); updateRequest.doc( "by1", newModel.getBy1(), "by2", newModel.getBy2(), "by3", newModel.getBy3(), "by4", newModel.getBy4(), "by6", newModel.getBy6(), "by7", newModel.getBy7(), "remark", newModel.getRemark() "by1", newModel.getBy1(), "by2", newModel.getBy2(), "by3", newModel.getBy3(), "by4", newModel.getBy4(), "by6", newModel.getBy6(), "by7", newModel.getBy7(), "remark", newModel.getRemark() ); try { @@ -456,17 +457,19 @@ private LambdaQueryWrapper<ZfDoctor> buildCondition(ZfDoctor zfDoctor, List<Long> familyIdList) { LambdaQueryWrapper<ZfDoctor> lqw = new LambdaQueryWrapper<>(); lqw.in(ZfDoctor::getFamilyId, familyIdList); lqw.in(familyIdList != null,ZfDoctor::getFamilyId, familyIdList); lqw.orderByDesc(ZfDoctor::getCreateTime); lqw.like(StringUtils.isNotEmpty(zfDoctor.getType()), ZfDoctor::getType, zfDoctor.getType()) .like(StringUtils.isNotEmpty(zfDoctor.getSymptom()), ZfDoctor::getSymptom, zfDoctor.getSymptom()) .like(StringUtils.isNotEmpty(zfDoctor.getDuration()), ZfDoctor::getDuration, zfDoctor.getDuration()) .like(StringUtils.isNotEmpty(zfDoctor.getEffect()), ZfDoctor::getEffect, zfDoctor.getEffect()) .like(StringUtils.isNotEmpty(zfDoctor.getSuitable()), ZfDoctor::getSuitable, zfDoctor.getSuitable()) .like(StringUtils.isNotEmpty(zfDoctor.getWmedical()), ZfDoctor::getWmedical, zfDoctor.getWmedical()) .like(StringUtils.isNotEmpty(zfDoctor.getCmedical()), ZfDoctor::getCmedical, zfDoctor.getCmedical()) .like(StringUtils.isNotEmpty(zfDoctor.getRemark()), ZfDoctor::getRemark, zfDoctor.getRemark()); // lqw.like(StringUtils.isNotEmpty(zfDoctor.getCompanion()),ZfDoctor::getCompanion,zfDoctor.getCompanion()); .like(StringUtils.isNotEmpty(zfDoctor.getSymptom()), ZfDoctor::getSymptom, zfDoctor.getSymptom()) .like(StringUtils.isNotEmpty(zfDoctor.getDuration()), ZfDoctor::getDuration, zfDoctor.getDuration()) .like(StringUtils.isNotEmpty(zfDoctor.getEffect()), ZfDoctor::getEffect, zfDoctor.getEffect()) .like(StringUtils.isNotEmpty(zfDoctor.getSuitable()), ZfDoctor::getSuitable, zfDoctor.getSuitable()) .like(StringUtils.isNotEmpty(zfDoctor.getWmedical()), ZfDoctor::getWmedical, zfDoctor.getWmedical()) .like(StringUtils.isNotEmpty(zfDoctor.getCmedical()), ZfDoctor::getCmedical, zfDoctor.getCmedical()) .like(StringUtils.isNotEmpty(zfDoctor.getRemark()), ZfDoctor::getRemark, zfDoctor.getRemark()); if (zfDoctor.getHasAttachment() != null && zfDoctor.getHasAttachment().equals("是")) { lqw.apply("url IS NOT NULL AND url != ''"); }// lqw.like(StringUtils.isNotEmpty(zfDoctor.getCompanion()),ZfDoctor::getCompanion,zfDoctor.getCompanion()); if (CollectionUtils.isNotEmpty(zfDoctor.getCompanionList())) { List<String> companionList = zfDoctor.getCompanionList(); @@ -492,8 +495,8 @@ if (StringUtils.isNotEmpty(zfDoctor.getPrescription())) { lqw.and(wrapper -> { wrapper.like(StringUtils.isNotEmpty(zfDoctor.getPrescription()), ZfDoctor::getWmedical, zfDoctor.getPrescription()) .or() .like(StringUtils.isNotEmpty(zfDoctor.getPrescription()), ZfDoctor::getCmedical, zfDoctor.getPrescription()); .or() .like(StringUtils.isNotEmpty(zfDoctor.getPrescription()), ZfDoctor::getCmedical, zfDoctor.getPrescription()); }); } return lqw; @@ -501,11 +504,11 @@ @Override public String getModuleCode() { return "2043"; return "药方"; } @Override public List<?> search(String companion, Date happenStartTime, Date happenEndTime) { public List<?> search(String companion, Date happenStartTime, Date happenEndTime, String hasAttachment) { ZfDoctor zfDoctor = new ZfDoctor(); String[] split = companion.split(","); @@ -513,7 +516,30 @@ zfDoctor.setCompanionList(list); zfDoctor.setHappenStartTime(happenStartTime); zfDoctor.setHappenEndTime(happenEndTime); return selectByCondition(zfDoctor); zfDoctor.setHasAttachment(hasAttachment); return doctorList(zfDoctor); } public List<zfEventdto> doctorList(ZfDoctor zfDoctor) { LambdaQueryWrapper<ZfDoctor> lqw = buildCondition(zfDoctor, null); List<ZfDoctor> beanRecords = list(lqw); return encapData(beanRecords); } public List<zfEventdto> encapData(List<ZfDoctor> lis) { List<zfEventdto> daoRes = new ArrayList<>() ; for(ZfDoctor obj : lis) { zfEventdto atd = new zfEventdto(); atd.setId(Math.toIntExact(obj.getId())); atd.setModule("药方"); atd.setName(obj.getCompanion()); atd.setCreateTime(obj.getCreateTime()); daoRes.add(atd); } return daoRes; } // public LambdaQueryWrapper<ZfDoctor> buildCondition2(List<Long> ids) { zhang-content/src/main/java/com/ruoyi/service/impl/ZfEconomyServiceImpl.java
@@ -12,6 +12,7 @@ import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.domain.*; import com.ruoyi.domain.ZfEconomy; import com.ruoyi.domain.dto.zfEventdto; import com.ruoyi.mapper.ZfEconomyMapper; import com.ruoyi.service.*; import lombok.extern.slf4j.Slf4j; @@ -72,7 +73,7 @@ private LambdaQueryWrapper<ZfEconomy> buildCondition(ZfEconomy zfEconomy,List<Long> familyIdList) { LambdaQueryWrapper<ZfEconomy> lqw = new LambdaQueryWrapper<>(); lqw.orderByDesc(ZfEconomy::getCreateTime); lqw.in(ZfEconomy::getFamilyId,familyIdList); lqw.in(familyIdList != null, ZfEconomy::getFamilyId,familyIdList); lqw.like(StringUtils.isNotEmpty(zfEconomy.getType()),ZfEconomy::getType,zfEconomy.getType()); lqw.like(StringUtils.isNotEmpty(zfEconomy.getKind()),ZfEconomy::getKind,zfEconomy.getKind()); lqw.like(StringUtils.isNotEmpty(zfEconomy.getPrice()),ZfEconomy::getPrice,zfEconomy.getPrice()); @@ -80,30 +81,33 @@ lqw.like(StringUtils.isNotEmpty(zfEconomy.getUsePeople()),ZfEconomy::getUsePeople,zfEconomy.getUsePeople()); lqw.like(StringUtils.isNotEmpty(zfEconomy.getBalance()),ZfEconomy::getBalance,zfEconomy.getBalance()); lqw.like(StringUtils.isNotEmpty(zfEconomy.getRemark()),ZfEconomy::getRemark,zfEconomy.getRemark()); if (zfEconomy.getHasAttachment() != null && zfEconomy.getHasAttachment().equals("是")) { lqw.apply("url IS NOT NULL AND url != ''"); } // lqw.in(StringUtils.isNotEmpty(zfEconomy.getCompanionList()),ZfEconomy::getCompanion,zfEconomy.getCompanionList()); // if (zfEconomy.getYear() != 0) { // System.out.println("pppppppppppppppppppppppppppppppppppppppppppppppppppp"+zfEconomy.getYear()); // lqw.apply("YEAR(happen_time) = {0}", zfEconomy.getYear()); // } if (CollectionUtils.isNotEmpty(zfEconomy.getCompanionList())) { List<String> companionList = zfEconomy.getCompanionList(); if (CollectionUtils.isNotEmpty(zfEconomy.getCompanionList())) { List<String> companionList = zfEconomy.getCompanionList(); // 清理和去重 companionList = companionList.stream() .map(String::trim) .filter(s -> !s.isEmpty()) .distinct() .collect(Collectors.toList()); // 清理和去重 companionList = companionList.stream() .map(String::trim) .filter(s -> !s.isEmpty()) .distinct() .collect(Collectors.toList()); if (!companionList.isEmpty()) { // 确保所有参与人都在companion字段中 for (String companion : companionList) { lqw.apply("FIND_IN_SET({0}, REPLACE(REPLACE(companion, ' ', ''), ',', ',')) > 0", companion); } if (!companionList.isEmpty()) { // 确保所有参与人都在companion字段中 for (String companion : companionList) { lqw.apply("FIND_IN_SET({0}, REPLACE(REPLACE(companion, ' ', ''), ',', ',')) > 0", companion); } } } @@ -132,7 +136,7 @@ @Override public List<ZfEconomy> change(){ ZfEconomy zfEconomy = new ZfEconomy(); return list(buildCondition(zfEconomy,null)); return list(buildCondition(zfEconomy,null)); } // private LambdaQueryWrapper<ZfEconomy> buildCondition(ZfEconomy zfEconomy, String familyIds, String secondFamilyAuthority) { @@ -391,13 +395,13 @@ public List<ZfEconomy> markOwnData(Long familyId,Long fatherFamilyId, Long motherFamilyId,List<ZfEconomy> beanRecords){ return beanRecords.stream().peek( bean -> { if (Objects.equals(bean.getFamilyId(), familyId) ||(fatherFamilyId!=0L && fatherFamilyId.equals(familyId))||(motherFamilyId!=0L && motherFamilyId.equals(familyId))) { bean.setOwnData(1); } else { bean.setOwnData(0); } bean -> { if (Objects.equals(bean.getFamilyId(), familyId) ||(fatherFamilyId!=0L && fatherFamilyId.equals(familyId))||(motherFamilyId!=0L && motherFamilyId.equals(familyId))) { bean.setOwnData(1); } else { bean.setOwnData(0); } } ).sorted((a,b)-> b.getOwnData()-a.getOwnData()).collect(Collectors.toList()); } @@ -576,9 +580,9 @@ UpdateRequest updateRequest = new UpdateRequest("allsearchdata", esResult.getId()); updateRequest.doc( "by1",newModel.getBy1(), "by2",newModel.getBy2(), "remark",newModel.getRemark() "by1",newModel.getBy1(), "by2",newModel.getBy2(), "remark",newModel.getRemark() ); try { @@ -643,12 +647,12 @@ @Override public String getModuleCode() { return "2045"; return "收支"; } @Override @Cacheable(value = "economy_search", key = "T(String).format('2045_%s_%s_%s',#companion != null ? #companion : 'null',#happenStartTime != null ? #happenStartTime.getTime() : 0,#happenEndTime != null ? #happenEndTime.getTime() : 0)") public List<?> search(String companion, Date happenStartTime,Date happenEndTime) { // @Cacheable(value = "economy_search", key = "T(String).format('2045_%s_%s_%s_%s',#companion != null ? #companion : 'null',#happenStartTime != null ? #happenStartTime.getTime() : 0,#happenEndTime != null ? #happenEndTime.getTime() : 0,#hasAttachment != null ? #hasAttachment : 'null')") public List<?> search(String companion, Date happenStartTime,Date happenEndTime,String hasAttachment) { ZfEconomy zfEconomy = new ZfEconomy(); zfEconomy.setCompanion(companion); zfEconomy.setHappenStartTime(happenStartTime); @@ -657,10 +661,39 @@ String[] split = companion.split(","); List<String> list = Arrays.asList(split); System.out.println("[[[[[[[["+hasAttachment); zfEconomy.setCompanionList(list); return selectByCondition(zfEconomy); zfEconomy.setHasAttachment(hasAttachment); return dataList(zfEconomy); } public List<zfEventdto> dataList(ZfEconomy zfEconomy) { LambdaQueryWrapper<ZfEconomy> lqw = buildCondition(zfEconomy, null); List<ZfEconomy> beanRecords = list(lqw); return encapData(beanRecords); } public List<zfEventdto> encapData(List<ZfEconomy> lis) { List<zfEventdto> daoRes = new ArrayList<>() ; for(ZfEconomy obj : lis) { zfEventdto atd = new zfEventdto(); atd.setId(Math.toIntExact(obj.getId())); atd.setModule("收支"); atd.setName(obj.getCompanion()); atd.setCreateTime(obj.getCreateTime()); daoRes.add(atd); } return daoRes; } @CacheEvict(value = "economy_search", allEntries = true) public void clearAllCache() { System.out.println("清除所有经济搜索缓存");