zqy
2 天以前 cedaeeed6d401aefebf93ea6ea21cc9e06d5f5db
新增搜索 模块+同伴+时间
5个文件已修改
2个文件已添加
266 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/zhang/EsSearchController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/EsModel.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhang-content/src/main/java/com/ruoyi/domain/ZfEconomy.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhang-content/src/main/java/com/ruoyi/service/ModuleSearchable.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhang-content/src/main/java/com/ruoyi/service/impl/InterfaceBasedSearchRouter.java 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zhang-content/src/main/java/com/ruoyi/service/impl/ZfEconomyServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/zhang/EsSearchController.java
@@ -3,10 +3,15 @@
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.EsModel;
import com.ruoyi.service.EsService;
import com.ruoyi.service.ZfEconomyService;
import com.ruoyi.service.impl.InterfaceBasedSearchRouter;
import com.ruoyi.service.impl.ZfEconomyServiceImpl;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.websocket.server.PathParam;
import java.util.Date;
import java.util.List;
/**
@@ -21,6 +26,12 @@
    @Resource
    EsService esService;
    @Resource
    InterfaceBasedSearchRouter interfaceBasedSearchRouter;
    @Resource
    ZfEconomyServiceImpl zfEconomyService;
    @GetMapping()
    public AjaxResult search(@PathParam("keyword") String keyword){
@@ -39,4 +50,22 @@
        List<EsModel> modelList = esService.getAll();
        return AjaxResult.success(modelList);
    }
    @GetMapping("/companion/{moduleCode}")
    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){
        System.out.println("[[[[[["+moduleCode);
        System.out.println("[[[[[["+companion);
        System.out.println("[[[[[["+happenStartTime);
        System.out.println("[[[[[["+happenEndTime);
    return interfaceBasedSearchRouter.routeSearch(moduleCode,companion,happenStartTime,happenEndTime);
    }
}
ruoyi-admin/src/main/resources/application.yml
@@ -65,7 +65,7 @@
  messages:
    # 国际化资源文件路径
    basename: i18n/messages
  profiles:
  profiles:
    active: druid
  # 文件上传
  servlet:
@@ -120,6 +120,10 @@
      mail.smtp.ssl.trust: smtp.qq.com
      mail.smtp.ssl.protocols: TLSv1.2
    default-encoding: UTF-8
    # 特定模块的缓存过期时间
    cache:
      cache-names:
        economy_search: 1800       # economy_search缓存1小时
# token配置
token:
@@ -129,7 +133,7 @@
    secret: abcdefghijklmnopqrstuvwxyz
    # 令牌有效期(默认30分钟)
    expireTime: 100
# MyBatis配置
mybatis-plus:
    # 搜索指定包别名
@@ -140,7 +144,7 @@
#    configLocation: classpath:mybatis/mybatis-config.xml
# PageHelper分页插件
pagehelper:
pagehelper:
  helperDialect: mysql
  supportMethodsArguments: true
  params: count=countSql
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/EsModel.java
@@ -105,17 +105,17 @@
    @Field(index = true,type = FieldType.Text,analyzer = "ik_max_word")
    private int by13;
    /** 备用14 */
    @Field(index = true,type = FieldType.Date,analyzer = "ik_max_wor")
    private Date by14;
//    /** 备用14 */
//    @Field(index = true,type = FieldType.Date,analyzer = "ik_max_wor")
//    private Date by14;
//
//    /** 备用15 */
//    @Field(index = true,type = FieldType.Date,analyzer = "ik_max_wor")
//    private Date by15;
    /** 备用15 */
    @Field(index = true,type = FieldType.Date,analyzer = "ik_max_wor")
    private Date by15;
    /** 备用16 */
    @Field(index = true,type = FieldType.Date,analyzer = "ik_max_wor ")
    private Timestamp by16;
//    /** 备用16 */
//    @Field(index = true,type = FieldType.Date,analyzer = "ik_max_wor")
//    private Timestamp by16;
}
zhang-content/src/main/java/com/ruoyi/domain/ZfEconomy.java
@@ -8,6 +8,7 @@
import com.ruoyi.common.annotation.Excel;
import lombok.Data;
import lombok.ToString;
import org.springframework.data.annotation.Transient;
import java.io.Serializable;
import java.time.LocalDate;
@@ -118,4 +119,11 @@
    private String cosKey;
    /**
     * 参与者
     */
    private String companion;
//    @TableField(exist = false)
//    private Integer year;
}
zhang-content/src/main/java/com/ruoyi/service/ModuleSearchable.java
New file
@@ -0,0 +1,25 @@
package com.ruoyi.service;
import com.ruoyi.domain.ZfEconomy;
import java.util.Date;
import java.util.List;
public interface ModuleSearchable {
    /**
     * 获取支持的模块编码
     */
    String getModuleCode();
    /**
     * 搜索方法
     */
    List<?> search(String companion, Date happenStartTime,Date happenEndTime);
    /**
     * 模块名称
     */
    default String getModuleName() {
        return getModuleCode();
    }
}
zhang-content/src/main/java/com/ruoyi/service/impl/InterfaceBasedSearchRouter.java
New file
@@ -0,0 +1,137 @@
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);
    }
}
zhang-content/src/main/java/com/ruoyi/service/impl/ZfEconomyServiceImpl.java
@@ -18,6 +18,8 @@
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
@@ -40,7 +42,7 @@
 */
@Service
@Slf4j
public class ZfEconomyServiceImpl extends ServiceImpl<ZfEconomyMapper, ZfEconomy> implements ZfEconomyService {
public class ZfEconomyServiceImpl extends ServiceImpl<ZfEconomyMapper, ZfEconomy> implements ZfEconomyService,ModuleSearchable{
    @Resource
    ZfEconomyService zfEconomyService;
@@ -76,8 +78,15 @@
        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());
        lqw.like(StringUtils.isNotEmpty(zfEconomy.getCompanion()),ZfEconomy::getCompanion,zfEconomy.getCompanion());
//        if (zfEconomy.getYear() != 0) {
//            System.out.println("pppppppppppppppppppppppppppppppppppppppppppppppppppp"+zfEconomy.getYear());
//            lqw.apply("YEAR(happen_time) = {0}", zfEconomy.getYear());
//        }
        lqw.eq(zfEconomy.getHappenTime() != null, ZfEconomy::getHappenTime, zfEconomy.getHappenTime());
        lqw.between(zfEconomy.getHappenStartTime() != null && zfEconomy.getHappenEndTime() != null, ZfEconomy::getHappenTime, zfEconomy.getHappenStartTime(), zfEconomy.getHappenEndTime());
        System.out.println("查询条件: " + lqw.getCustomSqlSegment());
        return lqw;
    }
@@ -425,6 +434,9 @@
    @Override
    public AjaxResult addData(ZfEconomy zfEconomy) {
        //清除redis中zfEconomy的缓存
        clearAllCache();
        ZInfoUser myself = zInfoUserService.getMyself();
        Long familyId = myself.getFamilyId();
@@ -479,6 +491,9 @@
    @Override
    public AjaxResult updateData(ZfEconomy zfEconomy) {
        //清除redis中zfEconomy的缓存
        clearAllCache();
        ZInfoUser myself = zInfoUserService.getMyself();
        Long familyId = myself.getFamilyId();
@@ -600,4 +615,24 @@
    }
    @Override
    public String getModuleCode() {
        return "2045";
    }
    @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) {
        ZfEconomy zfEconomy = new ZfEconomy();
        zfEconomy.setCompanion(companion);
        zfEconomy.setHappenStartTime(happenStartTime);
        zfEconomy.setHappenEndTime(happenEndTime);
        System.out.println("ssssss"+zfEconomy);
        return selectByCondition(zfEconomy);
    }
    @CacheEvict(value = "economy_search", allEntries = true)
    public void clearAllCache() {
        System.out.println("清除所有经济搜索缓存");
    }
}