管道基础大数据平台系统开发-【后端】-Server
1
sws
2022-11-26 ab849f796bdc17236a95ea5fe5c166fb8f24a75c
src/main/java/com/lf/server/service/all/BaseQueryService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,232 @@
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.ctrl.IdNameEntity;
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.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.data.redis.cache.RedisCache;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
 * çˆ¶æŸ¥è¯¢æœåŠ¡ç±»
 * @author WWW
 */
@Service
public class BaseQueryService implements BaseQueryMapper {
    @Autowired
    BaseQueryMapper baseQueryMapper;
    @Autowired
    RedisService redisService;
    /**
     * è¡¨åMap
     */
    private static Map<String, String> tabMap = new HashMap<String, String>(3);
    /**
     * æ·»åŠ è¿‡æ»¤æ¡ä»¶
     *
     * @param wrapper QueryWrapper
     * @param filter  åŽŸå§‹è¿‡æ»¤æ¡ä»¶å­—ç¬¦ä¸²
     */
    public void addFilterWrapper(QueryWrapper wrapper, String filter) {
        if (StringHelper.isEmpty(filter)) {
            return;
        }
        String[] strs = filter.trim().split(" (?i)and ");
        for (String str : strs) {
            int start = str.indexOf(" ");
            if (start == -1) {
                continue;
            }
            int end = str.indexOf(" ", start + 1);
            if (end == -1) {
                continue;
            }
            String field = 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, getObjectVal(value));
        }
    }
    /**
     * èŽ·å–å€¼å¯¹è±¡
     *
     * @param value å€¼
     * @return å¯¹è±¡
     */
    private Object getObjectVal(String value) {
        if (StringHelper.isInteger(value)) {
            return Long.parseLong(value);
        }
        if (StringHelper.isNumeric(value)) {
            return Double.parseDouble(value);
        }
        return value.replace("'", "");
    }
    /**
     * æ·»åŠ åŒ…è£…å™¨
     *
     * @param wrapper QueryWrapper
     * @param field   å­—段
     * @param express è¡¨è¾¾å¼
     * @param value   å€¼
     */
    private void addWrapper(QueryWrapper wrapper, String field, String express, Object value) {
        switch (express) {
            case "like":
                wrapper.like(field, value);
                break;
            case ">":
                wrapper.gt(field, value);
                break;
            case ">=":
                wrapper.ge(field, value);
                break;
            case "<>":
                wrapper.ne(field, value);
                break;
            case "=":
                wrapper.eq(field, value);
                break;
            case "<":
                wrapper.lt(field, value);
                break;
            case "<=":
                wrapper.le(field, value);
                break;
            default:
                break;
        }
    }
    /**
     * æ·»åŠ ç©ºé—´è¿‡æ»¤æ¡ä»¶
     *
     * @param basicMapper çˆ¶Mapper
     * @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
     */
    private 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 (srid != null) {
            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;
    }
    @Override
    public List<IdNameEntity> selectUserFuzzy(String name) {
        name = StringHelper.getLikeStr(name);
        return baseQueryMapper.selectUserFuzzy(name);
    }
    @Override
    public List<IdNameEntity> selectDepFuzzy(String name) {
        name = StringHelper.getLikeStr(name);
        return baseQueryMapper.selectDepFuzzy(name);
    }
    @Override
    public List<TabEntity> selectTabs() {
        return baseQueryMapper.selectTabs();
    }
    @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);
    }
}