From ed8c7a5effd0d423ce1118b680ecdca6fe732609 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期三, 02 七月 2025 16:43:13 +0800 Subject: [PATCH] Merge branch 'master' of http://192.168.11.205:9000/r/P2022036_Service --- src/main/java/com/lf/server/service/all/BaseQueryService.java | 330 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 270 insertions(+), 60 deletions(-) diff --git a/src/main/java/com/lf/server/service/all/BaseQueryService.java b/src/main/java/com/lf/server/service/all/BaseQueryService.java index 07eb3b2..94a4e38 100644 --- a/src/main/java/com/lf/server/service/all/BaseQueryService.java +++ b/src/main/java/com/lf/server/service/all/BaseQueryService.java @@ -1,62 +1,51 @@ package com.lf.server.service.all; +import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.lf.server.entity.all.RedisCacheKey; +import com.lf.server.entity.all.StaticData; +import com.lf.server.entity.ctrl.IdNameEntity; +import com.lf.server.entity.ctrl.KeyValueEntity; +import com.lf.server.entity.ctrl.TabEntity; +import com.lf.server.entity.data.DictEntity; +import com.lf.server.entity.data.DomainEntity; +import com.lf.server.entity.sys.AttachEntity; import com.lf.server.helper.AesHelper; import com.lf.server.helper.ClassHelper; import com.lf.server.helper.StringHelper; +import com.lf.server.mapper.all.BaseQueryMapper; +import com.lf.server.mapper.all.BasicMapper; import com.lf.server.mapper.all.GeomBaseMapper; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.TimeUnit; /** * 鐖舵煡璇㈡湇鍔$被 * @author WWW */ @Service -public class BaseQueryService { +public class BaseQueryService implements BaseQueryMapper { + @Autowired + BaseQueryMapper baseQueryMapper; + + @Autowired + RedisService redisService; + /** - * 鑾峰彇鐖禡apper + * 琛ㄥ悕Map + */ + private static Map<String, String> tabMap = new HashMap<>(3); + + /** + * 娣诲姞杩囨护鏉′欢 * - * @param name Mapper鍚� - * @return BaseMapper + * @param wrapper QueryWrapper + * @param filter 鍘熷杩囨护鏉′欢瀛楃涓� */ - public BaseMapper getBaseMapper(String name) { - if (StringHelper.isEmpty(name)) { - return null; - } - - Object obj = ClassHelper.getBean(name.trim() + "Mapper"); - if (!(obj instanceof BaseMapper)) { - return null; - } - - return (BaseMapper) obj; - } - - /** - * 鑾峰彇绌洪棿鐖禡apper - * - * @param name Mapper鍚� - * @return GeomBaseMapper - */ - public GeomBaseMapper getGeoBaseMapper(String name) { - if (StringHelper.isEmpty(name)) { - return null; - } - - Object obj = ClassHelper.getBean(name.trim() + "Mapper"); - if (!(obj instanceof GeomBaseMapper)) { - return null; - } - - return (GeomBaseMapper) obj; - } - - /** - * @param wrapper - * @param filter - */ - public <T> void addFilterWrapper(QueryWrapper<T> wrapper, String filter) { + public void addFilterWrapper(QueryWrapper wrapper, String filter) { if (StringHelper.isEmpty(filter)) { return; } @@ -72,35 +61,95 @@ continue; } - String field = str.substring(0, start).trim(); + String field = convertFiled(str.substring(0, start).trim()); String express = str.substring(start + 1, end).trim().toLowerCase(); String value = str.substring(end + 1).trim(); - addWrapper(wrapper, field, express, value); + + addWrapper(wrapper, field, express, getObjectVal(express, value)); } } - private <T> void addWrapper(QueryWrapper<T> wrapper, String field, String express, String value) { + /** + * 瀛楁杞崲 + */ + private String convertFiled(String field) { + StringBuilder sb = new StringBuilder(); + for (int i = 0, c = field.length(); i < c; i++) { + char ch = field.charAt(i); + if (Character.isUpperCase(ch)) { + sb.append('_'); + sb.append(Character.toLowerCase(ch)); + } else { + sb.append(ch); + } + } + + return sb.toString(); + } + + /** + * 鑾峰彇鍊煎璞� + * + * @param val 鍊� + * @return 瀵硅薄 + */ + private Object getObjectVal(String express, String val) { + if (StringHelper.isInteger(val)) { + return Long.parseLong(val); + } + if (StringHelper.isNumeric(val)) { + return Double.parseDouble(val); + } + if (StaticData.IN.equals(express)) { + return val; + } + + return val.replace("'", ""); + } + + /** + * 娣诲姞鍖呰鍣� + * + * @param wrapper QueryWrapper + * @param field 瀛楁 + * @param express 琛ㄨ揪寮� + * @param val 鍊� + */ + private void addWrapper(QueryWrapper wrapper, String field, String express, Object val) { + if (StringHelper.isDate(val.toString())) { + wrapper.apply(String.format("%s %s '%s'", field, express, val)); + return; + } + switch (express) { case "like": - wrapper.like(field, value); + wrapper.like("UPPER(" + field + ")", val.toString().toUpperCase()); break; case ">": - wrapper.gt(field, value); + wrapper.gt(field, val); break; case ">=": - wrapper.ge(field, value); + wrapper.ge(field, val); break; case "<>": - wrapper.ne(field, value); + case "!=": + wrapper.ne(field, val); break; case "=": - wrapper.eq(field, value); + wrapper.eq(field, val); break; case "<": - wrapper.lt(field, value); + wrapper.lt(field, val); break; case "<=": - wrapper.le(field, value); + wrapper.le(field, val); + break; + case "in": + if (val.toString().contains(StaticData.SINGLE_QUOTES)) { + wrapper.in(field, getStringList(val.toString())); + } else { + wrapper.in(field, getIntegerList(val.toString())); + } break; default: break; @@ -108,18 +157,179 @@ } /** - * 娣诲姞绌洪棿鏌ヨ鏉′欢 + * 鑾峰彇瀛楃涓插垪琛� + */ + private List<String> getStringList(String val) { + return Arrays.asList(val.replace(StaticData.SINGLE_QUOTES, "").split(StaticData.COMMA)); + } + + /** + * 鑾峰彇鏁存暟鍒楄〃 + */ + private List<Integer> getIntegerList(String val) { + List<Integer> list = new ArrayList<>(); + for (String str : val.split(StaticData.COMMA)) { + list.add(Integer.parseInt(str)); + } + + return list; + } + + /** + * 娣诲姞绌洪棿杩囨护鏉′欢 + * + * @param basicMapper 鐖禡apper + * @param wrapper QueryWrapper + * @param wkt WKT锛堣憲鍚嶆枃鏈級 + * @throws Exception 寮傚父 + */ + public void addGeomWrapper(BasicMapper basicMapper, QueryWrapper wrapper, String wkt) throws Exception { + if (basicMapper instanceof GeomBaseMapper && !StringHelper.isEmpty(wkt)) { + wkt = AesHelper.decrypt(wkt); + + Integer srid = getSrid((GeomBaseMapper) basicMapper); + wrapper.apply(String.format("ST_Intersects(ST_PolygonFromText('%s', %d), geom)", wkt, srid)); + } + } + + /** + * 鑾峰彇鍑犱綍瀵硅薄鐨勭┖闂村弬鑰� + * + * @param basicMapper 绌洪棿鍩虹Mapper + * @return SRID + */ + public Integer getSrid(GeomBaseMapper basicMapper) { + String tab = getTabName(basicMapper); + String key = RedisCacheKey.sridKey(tab); + + Object obj = redisService.get(key); + if (obj instanceof Integer) { + return (Integer) obj; + } + + Integer srid = basicMapper.selectSrid(tab); + if (null == srid) { + return StaticData.I4490; + } + redisService.put(key, srid, 5, TimeUnit.MINUTES); + + return srid; + } + + /** + * 鏍规嵁Mapper鑾峰彇琛ㄥ悕 + * + * @param basicMapper Mapper + * @return 琛ㄥ悕 + */ + public static String getTabName(BasicMapper basicMapper) { + String className = ClassHelper.getClassName(basicMapper); + if (tabMap.containsKey(className)) { + return tabMap.get(className); + } + + return getTabName(className); + } + + /** + * 鏍规嵁Mapper鑾峰彇琛ㄥ悕 + * + * @param className Mapper绫诲悕 + * @return 琛ㄥ悕 + */ + private static String getTabName(String className) { + Class clazz = ClassHelper.getEntityClass(className); + if (clazz == null) { + return null; + } + + TableName annotation = (TableName) clazz.getAnnotation(TableName.class); + + String tabName = annotation.value(); + if (tabName != null && !tabMap.containsKey(className)) { + tabMap.put(className, tabName); + } + + return tabName; + } + + /** + * 娣诲姞缂撳啿鍖鸿繃婊ゆ潯浠� * * @param baseMapper 鐖禡apper * @param wrapper QueryWrapper * @param wkt WKT锛堣憲鍚嶆枃鏈級 - * @param srid 绌洪棿寮曠敤鏍囪瘑绗� - * @throws Exception 寮傚父 */ - public void addGeomWrapper(BaseMapper baseMapper, QueryWrapper<Object> wrapper, String wkt, Integer srid) throws Exception { - if (baseMapper instanceof GeomBaseMapper && !StringHelper.isEmpty(wkt) && srid != null) { - wkt = AesHelper.decrypt(wkt); - wrapper.apply(String.format("ST_Intersects(geom, ST_PolygonFromText('%s', %d))", wkt, srid)); - } + public void addBufferWrapper(GeomBaseMapper baseMapper, QueryWrapper wrapper, String wkt, double buffer) { + Integer srid = getSrid(baseMapper); + // buffer = buffer * 0.00000899928 + buffer = buffer / 1852 / 60; + + wrapper.apply(String.format("ST_Intersects(geom, ST_Buffer(ST_GeomFromText('%s', %d), %f, 'endcap=round join=round'))", wkt, srid, buffer)); + } + + @Override + public List<IdNameEntity> selectUserFuzzy(String name) { + name = StringHelper.getLikeUpperStr(name); + + return baseQueryMapper.selectUserFuzzy(name); + } + + @Override + public List<IdNameEntity> selectDepFuzzy(String name) { + name = StringHelper.getLikeUpperStr(name); + + return baseQueryMapper.selectDepFuzzy(name); + } + + @Override + public Integer selectTabsForCount(String tab, String typesFilter, String field) { + tab = StringHelper.getLikeUpperStr(tab); + + return baseQueryMapper.selectTabsForCount(tab, typesFilter, field); + } + + @Override + public List<TabEntity> selectTabsByPage(String tab, String typesFilter, String field, String filters, Integer limit, Integer offset) { + tab = StringHelper.getLikeUpperStr(tab); + + return baseQueryMapper.selectTabsByPage(tab, typesFilter, field, filters, limit, offset); + } + + @Override + public List<DictEntity> selectFields(String ns, String tab) { + return baseQueryMapper.selectFields(ns, tab); + } + + @Override + public List<DomainEntity> selectDomains(String ns, String tab) { + return baseQueryMapper.selectDomains(ns, tab); + } + + @Override + public String selectRoute(double x1, double y1, double x2, double y2) { + return baseQueryMapper.selectRoute(x1, y1, x2, y2); + } + + @Override + public List<KeyValueEntity> selectLocation(String wkt) { + return baseQueryMapper.selectLocation(wkt); + } + + @Override + public List<KeyValueEntity> selectDirTypes(String name) { + name = StringHelper.getLikeUpperStr(name); + + return baseQueryMapper.selectDirTypes(name); + } + + @Override + public List<KeyValueEntity> selectDirsByTypes(String[] types, String dirs) { + return baseQueryMapper.selectDirsByTypes(types, dirs); + } + + @Override + public List<AttachEntity> selectAnnexByTab(String tab, String gids) { + return baseQueryMapper.selectAnnexByTab(tab, gids); } } -- Gitblit v1.9.3