Pārlūkot izejas kodu

优化代码支持sql动态传参数

liwh 1 gadu atpakaļ
vecāks
revīzija
9decfc08e2

+ 10 - 0
cql-service/src/main/java/cn/com/taiji/cql/service/IBuildDataStore.java

@@ -0,0 +1,10 @@
+package cn.com.taiji.cql.service;
+
+import org.geotools.api.data.DataStore;
+
+import java.util.Map;
+
+public interface IBuildDataStore {
+
+    DataStore createDataStore(Map<String, Object> mapParams) throws Exception;
+}

+ 14 - 0
cql-service/src/main/java/cn/com/taiji/cql/service/IDataCommonService.java

@@ -0,0 +1,14 @@
+package cn.com.taiji.cql.service;
+
+import cn.com.taiji.common.domain.PageResult;
+import cn.com.taiji.common.model.GeoRequestParam;
+
+
+public interface IDataCommonService {
+
+    /**
+     * 数据通用查询接口
+     * @return
+     */
+    PageResult dataCommonQuery(GeoRequestParam geoRequestParam);
+}

+ 82 - 0
cql-service/src/main/java/cn/com/taiji/cql/service/impl/BuildDataStoreImpl.java

@@ -0,0 +1,82 @@
+package cn.com.taiji.cql.service.impl;
+
+import cn.com.taiji.common.util.HashCodeUtil;
+import cn.com.taiji.cql.service.IBuildDataStore;
+import lombok.extern.slf4j.Slf4j;
+import org.geotools.api.data.DataStore;
+import org.geotools.data.jdbc.datasource.DBCPDataSourceFactory;
+import org.geotools.data.jdbc.datasource.DataSourceFinder;
+import org.geotools.data.mysql.MySQLDataStoreFactory;
+import org.geotools.jdbc.JDBCDataStoreFactory;
+import org.springframework.stereotype.Service;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+@Service
+public class BuildDataStoreImpl implements IBuildDataStore {
+
+    private Map<String,DataStore> dataStoreMaps = new ConcurrentHashMap<String,DataStore>();
+
+
+    @Override
+    public DataStore createDataStore(Map<String, Object> mapParams) throws Exception {
+
+        String host = mapParams.get(JDBCDataStoreFactory.HOST.key).toString();
+
+        String port = mapParams.get(JDBCDataStoreFactory.PORT.key).toString();
+
+        String database = mapParams.get(JDBCDataStoreFactory.DATABASE.key).toString();
+
+        int hashKey = HashCodeUtil.hashCode(host+"-"+port+"-"+database);
+
+        JDBCDataStoreFactory jDBCDataStoreFactory = null;
+
+        DataStore dataStore = null;
+
+        if(dataStoreMaps.containsKey(String.valueOf(hashKey))){
+
+            dataStore = dataStoreMaps.get(String.valueOf(hashKey));
+
+            log.info("系统从内存连接到位于:" + host + "的空间数据库" + database + "成功!");
+
+        }else{
+
+
+            DataSource dataSource = DataSourceFinder.getDataSource(mapParams);
+
+            if(dataSource !=null){
+
+                if(mapParams.get(DBCPDataSourceFactory.DRIVERCLASS.key).equals("com.mysql.cj.jdbc.Driver")){
+
+                    jDBCDataStoreFactory = new MySQLDataStoreFactory();
+                }
+
+                Map<String, Object> dataStoreParams = new HashMap<String, Object>();
+
+                dataStoreParams.put(JDBCDataStoreFactory.SCHEMA.key, database);
+                dataStoreParams.put(JDBCDataStoreFactory.DATASOURCE.key,dataSource);
+                dataStoreParams.put(JDBCDataStoreFactory.BATCH_INSERT_SIZE.key, 1000);
+
+                dataStore = jDBCDataStoreFactory.createDataStore(dataStoreParams);
+
+                dataStoreMaps.put(String.valueOf(hashKey),dataStore);
+
+                log.info("系统新建连接到位于:" + host + "的空间数据库" + database + "成功!");
+
+            }else{
+
+                log.info("获取"+host+"-"+port+"-"+database+"的数据源连接池失败!");
+            }
+
+
+
+        }
+
+        return dataStore;
+
+    }
+}

+ 54 - 0
cql-service/src/main/java/cn/com/taiji/cql/service/impl/DataCommonServiceImpl.java

@@ -0,0 +1,54 @@
+package cn.com.taiji.cql.service.impl;
+
+import cn.com.taiji.common.domain.PageResult;
+
+import cn.com.taiji.common.model.GeoRequestParam;
+import cn.com.taiji.common.model.LayerGroupDsView;
+import cn.com.taiji.cql.service.IDataCommonService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class DataCommonServiceImpl extends BuildDataStoreImpl implements IDataCommonService {
+
+
+
+    @Override
+    public PageResult dataCommonQuery(GeoRequestParam geoRequestParam) {
+
+        List<String> layerGroupList = new ArrayList<String>();
+
+        //图层组
+        String layers = geoRequestParam.getLayers();
+        if(layers !=null && "".equals(layers)){
+
+            layerGroupList.add(layers);
+        }
+        //图层
+        String typeName = geoRequestParam.getTypename();
+
+        if(typeName !=null && "".equals(typeName)){
+
+            String[] typeNames = typeName.split(",");
+
+            layerGroupList.addAll(Arrays.asList(typeNames));
+
+        }
+
+        if(layerGroupList.size() >0){
+
+
+        }
+
+
+
+        return null;
+    }
+}

+ 6 - 83
cql-service/src/main/java/cn/com/taiji/cql/service/impl/ECqlServiceImpl.java

@@ -2,7 +2,6 @@ package cn.com.taiji.cql.service.impl;
 import cn.com.taiji.common.domain.PageResult;
 import cn.com.taiji.common.domain.Result;
 import cn.com.taiji.common.enums.CommonConstant;
-import cn.com.taiji.common.util.HashCodeUtil;
 import cn.com.taiji.common.util.IdGenerator;
 import cn.com.taiji.cql.service.IECqlService;
 import com.alibaba.fastjson.JSONObject;
@@ -16,9 +15,6 @@ import org.geotools.api.filter.identity.FeatureId;
 import org.geotools.api.filter.sort.SortBy;
 import org.geotools.api.filter.sort.SortOrder;
 import org.geotools.data.collection.ListFeatureCollection;
-import org.geotools.data.jdbc.datasource.DBCPDataSourceFactory;
-import org.geotools.data.jdbc.datasource.DataSourceFinder;
-import org.geotools.data.mysql.MySQLDataStoreFactory;
 import org.geotools.data.simple.SimpleFeatureCollection;
 import org.geotools.data.simple.SimpleFeatureIterator;
 import org.geotools.data.store.ContentFeatureSource;
@@ -28,19 +24,14 @@ import org.geotools.filter.SortByImpl;
 import org.geotools.filter.text.ecql.ECQL;
 import org.geotools.jdbc.JDBCDataStoreFactory;
 import org.springframework.stereotype.Service;
-
-import javax.sql.DataSource;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 @Slf4j
 @Service
-public class ECqlServiceImpl implements IECqlService{
-
-    private Map<String,DataStore> dataStoreMaps = new ConcurrentHashMap<String,DataStore>();
+public class ECqlServiceImpl extends BuildDataStoreImpl implements IECqlService{
 
     /**
      * cql 通用查询接口
@@ -58,8 +49,6 @@ public class ECqlServiceImpl implements IECqlService{
 
         List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
 
-        DataStore dataStore = null;
-
         String host = dsParams.get(JDBCDataStoreFactory.HOST.key).toString();
 
         String database = dsParams.get(JDBCDataStoreFactory.DATABASE.key).toString();
@@ -79,7 +68,7 @@ public class ECqlServiceImpl implements IECqlService{
 
         try {
 
-            dataStore = createDataStore(dsParams);
+            DataStore dataStore = createDataStore(dsParams);
 
             if (dataStore != null) {
 
@@ -266,11 +255,9 @@ public class ECqlServiceImpl implements IECqlService{
 
             String database = mapParams.get(JDBCDataStoreFactory.DATABASE.key).toString();
 
-            DataStore dataStore = null;
-
             try{
 
-                dataStore = createDataStore(mapParams);
+                DataStore dataStore = createDataStore(mapParams);
 
                 if (dataStore != null) {
 
@@ -342,11 +329,9 @@ public class ECqlServiceImpl implements IECqlService{
 
             String database = mapParams.get(JDBCDataStoreFactory.DATABASE.key).toString();
 
-            DataStore dataStore = null;
-
             try{
 
-                dataStore = createDataStore(mapParams);
+                DataStore dataStore = createDataStore(mapParams);
 
                 if (dataStore != null) {
 
@@ -409,11 +394,9 @@ public class ECqlServiceImpl implements IECqlService{
 
             String database = mapParams.get(JDBCDataStoreFactory.DATABASE.key).toString();
 
-            DataStore dataStore = null;
-
             try{
 
-                dataStore = createDataStore(mapParams);
+                DataStore dataStore = createDataStore(mapParams);
 
                 if (dataStore != null) {
 
@@ -462,11 +445,9 @@ public class ECqlServiceImpl implements IECqlService{
 
         String database = mapParams.get(JDBCDataStoreFactory.DATABASE.key).toString();
 
-        DataStore dataStore = null;
-
         try{
 
-            dataStore = createDataStore(mapParams);
+            DataStore dataStore = createDataStore(mapParams);
 
             if (dataStore != null) {
 
@@ -503,62 +484,4 @@ public class ECqlServiceImpl implements IECqlService{
 
         }
     }
-
-    private DataStore createDataStore(Map<String, Object> mapParams) throws Exception{
-
-
-        String host = mapParams.get(JDBCDataStoreFactory.HOST.key).toString();
-
-        String port = mapParams.get(JDBCDataStoreFactory.PORT.key).toString();
-
-        String database = mapParams.get(JDBCDataStoreFactory.DATABASE.key).toString();
-
-        int hashKey = HashCodeUtil.hashCode(host+"-"+port+"-"+database);
-
-        DataStore dataStore = null;
-
-        JDBCDataStoreFactory jDBCDataStoreFactory = null;
-
-        if(dataStoreMaps.containsKey(String.valueOf(hashKey))){
-
-            dataStore = dataStoreMaps.get(String.valueOf(hashKey));
-
-            log.info("系统从内存连接到位于:" + host + "的空间数据库" + database + "成功!");
-
-        }else{
-
-
-            DataSource dataSource = DataSourceFinder.getDataSource(mapParams);
-
-            if(dataSource !=null){
-
-                if(mapParams.get(DBCPDataSourceFactory.DRIVERCLASS.key).equals("com.mysql.cj.jdbc.Driver")){
-
-                    jDBCDataStoreFactory = new MySQLDataStoreFactory();
-                }
-
-                Map<String, Object> dataStoreParams = new HashMap<String, Object>();
-
-                dataStoreParams.put(JDBCDataStoreFactory.SCHEMA.key, database);
-                dataStoreParams.put(JDBCDataStoreFactory.DATASOURCE.key,dataSource);
-                dataStoreParams.put(JDBCDataStoreFactory.BATCH_INSERT_SIZE.key, 1000);
-
-                dataStore = jDBCDataStoreFactory.createDataStore(dataStoreParams);
-
-                dataStoreMaps.put(String.valueOf(hashKey),dataStore);
-
-                log.info("系统新建连接到位于:" + host + "的空间数据库" + database + "成功!");
-
-            }else{
-
-                log.info("获取"+host+"-"+port+"-"+database+"的数据源连接池失败!");
-            }
-
-
-
-        }
-
-        return dataStore;
-
-    }
 }

+ 7 - 1
cql-service/src/main/java/cn/com/taiji/cql/model/GeoRequestParam.java

@@ -1,4 +1,4 @@
-package cn.com.taiji.cql.model;
+package cn.com.taiji.common.model;
 
 import lombok.Data;
 
@@ -20,6 +20,10 @@ public class GeoRequestParam implements Serializable {
 
     private String layers;
 
+    private String typename;
+
+    private String viewparams;
+
     private String exceptions = "application/vnd.ogc.se_inimage";
 
     private String cqlFilter;
@@ -38,4 +42,6 @@ public class GeoRequestParam implements Serializable {
 
     private int x;
     private int y;
+
+    private String geoType;
 }

+ 5 - 0
tile-common/src/main/java/cn/com/taiji/common/model/LayerGroupDsView.java

@@ -82,4 +82,9 @@ public class LayerGroupDsView implements Serializable {
      * 数据表名
      */
     private String tableName;
+
+    /**
+     * sql绑定参数json数据
+     */
+    private String json;
 }

+ 55 - 0
tile-common/src/main/java/cn/com/taiji/common/model/LayerSqlParam.java

@@ -0,0 +1,55 @@
+package cn.com.taiji.common.model;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class LayerSqlParam implements Serializable {
+
+    /**
+     * 主键
+     */
+    private String id;
+
+    /**
+     * 图层代码
+     */
+    private String layerCode;
+
+    /**
+     * 参数名称
+     */
+    private String paramName;
+    /**
+     * 默认值
+     */
+    private String defaultValue;
+
+    /**
+     * 校验正则表达式
+     */
+    private String checkRegular;
+
+
+    /**
+     * 创建人
+     */
+    private String createUser;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 修改人
+     */
+    private String updateUser;
+
+    /**
+     * 修改时间
+     */
+    private Date updateTime;
+}

+ 28 - 0
tile-common/src/main/java/cn/com/taiji/common/model/SqlJsonData.java

@@ -0,0 +1,28 @@
+package cn.com.taiji.common.model;
+
+import lombok.Data;
+
+import java.io.Serializable;
+@Data
+public class SqlJsonData implements Serializable {
+
+    /**
+     * 参数名称
+     */
+    private String name;
+
+    /**
+     * 默认值
+     */
+    private String value;
+
+    /**
+     * viewParams传递的参数值
+     */
+    private String data;
+
+    /**
+     * 校验正则表达式
+     */
+    private String check;
+}

+ 1 - 1
tile-service/src/main/java/cn/com/taiji/tile/service/ITileService.java

@@ -3,7 +3,7 @@ package cn.com.taiji.tile.service;
 
 import cn.com.taiji.common.model.LayerGroupDsView;
 import cn.com.taiji.common.model.LayerStyleView;
-import cn.com.taiji.cql.model.GeoRequestParam;
+import cn.com.taiji.common.model.GeoRequestParam;
 import cn.com.taiji.tile.model.FeatureInfo;
 
 import java.util.List;

+ 87 - 7
tile-service/src/main/java/cn/com/taiji/tile/service/impl/TileServiceImpl.java

@@ -1,20 +1,21 @@
 package cn.com.taiji.tile.service.impl;
 
 import cn.com.taiji.common.domain.PageResult;
-import cn.com.taiji.common.model.LayerGroupDsView;
-import cn.com.taiji.common.model.LayerStyleView;
-import cn.com.taiji.cql.model.GeoRequestParam;
+import cn.com.taiji.common.model.*;
 import cn.com.taiji.cql.service.IECqlService;
 import cn.com.taiji.cql.service.ISqlService;
 import cn.com.taiji.tile.model.FeatureInfo;
 import cn.com.taiji.tile.model.POI;
 import cn.com.taiji.tile.service.ITileService;
-import cn.com.taiji.tile.style.ShapeStyle;
 import cn.com.taiji.tile.util.ShapeUtils;
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.geotools.api.filter.Filter;
 import org.geotools.data.jdbc.datasource.DBCPDataSourceFactory;
+import org.geotools.data.mysql.MySQLFilterToSQL;
+import org.geotools.filter.text.ecql.ECQL;
 import org.geotools.jdbc.JDBCDataStoreFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -24,7 +25,6 @@ import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.List;
@@ -129,12 +129,92 @@ public class TileServiceImpl implements ITileService {
             }
             pageResult = ecqlService.cqlQuery(cqlDsParams, mapParams);
         } else if (layerDataType != null && !"".equals(layerDataType) && "sql".equals(layerDataType)) {
+
             if (layerDataRun != null && !"".equals(layerDataRun)) {
-                //安照sql语句的占位符?的顺序来设置sql语句的动态参数
+
+                Map<String,Object> viewParamMaps = new HashMap<String,Object>();
+                String viewParams = requestParam.getViewparams();
+                if(viewParams !=null && !"".equals(viewParams)){
+
+                    String[] viewParamArr = viewParams.split(";");
+                    for(String viewData:viewParamArr){
+
+                        String[] viewValue = viewData.split(":");
+                        if(viewValue.length >1){
+                            viewParamMaps.put(viewValue[0],viewValue[1]);
+                        }
+
+
+                    }
+
+                }
+
+                Map<String,SqlJsonData> sqlParamMaps = new HashMap<String,SqlJsonData>();
+
+                String sqlJson = layerGroupDsView.getJson();
+
+                if(sqlJson !=null && !"".equals(sqlJson)){
+
+                    List<SqlJsonData> sqlParamList = JSONObject.parseArray(sqlJson, SqlJsonData.class);
+
+                    for(SqlJsonData sqlJsonData:sqlParamList){
+
+                        if(viewParamMaps.containsKey(sqlJsonData.getName())){
+
+                            sqlJsonData.setData((String) viewParamMaps.get(sqlJsonData.getName()));
+
+                        }
+
+                        sqlParamMaps.put(sqlJsonData.getName(),sqlJsonData);
+                    }
+                }
+
+                for(String paramKey:sqlParamMaps.keySet()){
+
+                    String paramData = sqlParamMaps.get(paramKey).getData();
+
+                    if(paramData == null || "".equals(paramData)){
+
+                        paramData = sqlParamMaps.get(paramKey).getValue();
+
+                    }
+
+                    layerDataRun = layerDataRun.replace("%" + paramKey + "%", paramData);
+
+                }
+
+                String cqlFilter = requestParam.getCqlFilter();
+
+                if(cqlFilter !=null && !"".equals(cqlFilter)){
+
+                    try{
+
+                        MySQLFilterToSQL filterToSql = new MySQLFilterToSQL();
+                        filterToSql.setInline(true);
+
+                        Filter filter = ECQL.toFilter(cqlFilter);
+
+                        String actual = filterToSql.encodeToString(filter);
+
+                        layerDataRun = layerDataRun + " and " +actual;
+
+                    }catch (Exception exception){
+                        exception.printStackTrace();
+                    }
+
+
+
+                }
+
                 Object[] bindArgs = new Object[0];
+
                 pageResult = sqlService.sqlQuery4Jdbc(cqlDsParams, layerDataRun, bindArgs);
+
+
+
             } else {
-                log.info("执行图层数据类型:" + layerDataType + "和图层代码:" + requestParam.getLayers() + " 的执行内容为空或者为null");
+
+                log.info("执行图层数据类型:" + layerDataType + "和图层代码:" + layerGroupDsView.getLayerCode() + " 的执行内容为空或者为null");
             }
         }
         Result result = new Result(layerStyleViewList, pageResult);

+ 27 - 6
tile-web/src/main/java/cn/com/taiji/web/controller/TileWebController.java

@@ -5,7 +5,7 @@ package cn.com.taiji.web.controller;
 import cn.com.taiji.common.domain.Result;
 import cn.com.taiji.common.model.LayerGroupDsView;
 import cn.com.taiji.common.model.LayerStyleView;
-import cn.com.taiji.cql.model.GeoRequestParam;
+import cn.com.taiji.common.model.GeoRequestParam;
 import cn.com.taiji.tile.model.FeatureInfo;
 import cn.com.taiji.tile.service.ITileService;
 import cn.com.taiji.web.service.IGeoDataSourceService;
@@ -47,7 +47,9 @@ public class TileWebController {
     @PostConstruct
     public void initData(){
         try {
-            List<LayerGroupDsView> layerGroupDsViewList = geoDataSourceService.layerCodeGeoDataSource("socialManagementElement");
+            List<String> layerCodeList = new ArrayList<String>();
+            layerCodeList.add("socialManagementElement");
+            List<LayerGroupDsView> layerGroupDsViewList = geoDataSourceService.layerCodeGeoDataSource(layerCodeList);
 
 
         } catch (Exception e) {
@@ -71,13 +73,32 @@ public class TileWebController {
 
         GeoRequestParam geoRequestParam = JSONObject.parseObject(JSONObject.toJSONString(getParameterMap(request)), GeoRequestParam.class);
 
-        if(geoRequestParam.getLayers() !=null && !"".equals(geoRequestParam.getLayers())){
+        List<String> layerGroupList = new ArrayList<String>();
+
+        //图层组
+        String layers = geoRequestParam.getLayers();
+        if(layers !=null && !"".equals(layers)){
+
+            layerGroupList.add(layers);
+        }
+        //图层
+        String typeName = geoRequestParam.getTypename();
+
+        if(typeName !=null && !"".equals(typeName)){
+
+            String[] typeNames = typeName.split(",");
+
+            layerGroupList.addAll(Arrays.asList(typeNames));
+
+        }
+
+        if(layerGroupList.size() >0){
 
             try{
 
-                List<LayerGroupDsView> layerGroupDsViewList = geoDataSourceService.layerCodeGeoDataSource(geoRequestParam.getLayers());
+                List<LayerGroupDsView> layerGroupDsViewList = geoDataSourceService.layerCodeGeoDataSource(layerGroupList);
 
-                if(layerGroupDsViewList !=null){
+                if(layerGroupDsViewList !=null && layerGroupDsViewList.size()>0){
 
                     List<String> layerCodeList = new ArrayList<String>();
 
@@ -118,7 +139,7 @@ public class TileWebController {
 
         }else{
 
-            log.info("图层代码layers参数为空!");
+            log.info("图层组layers参数为空或者图层typeName参数为空");
         }
 
 

+ 1 - 1
tile-web/src/main/java/cn/com/taiji/web/service/IGeoDataSourceService.java

@@ -15,7 +15,7 @@ public interface IGeoDataSourceService {
      * 获取图层代码对应的数据源信息
      * @return
      */
-    List<LayerGroupDsView> layerCodeGeoDataSource(String layerCode) throws Exception;
+    List<LayerGroupDsView> layerCodeGeoDataSource(List<String> layerCodeList) throws Exception;
 
     /**
      * 获取图层代码对应的样式信息

+ 2 - 2
tile-web/src/main/java/cn/com/taiji/web/service/impl/GeoDataSourceServiceImpl.java

@@ -38,7 +38,7 @@ public class GeoDataSourceServiceImpl implements IGeoDataSourceService {
 
 
     @Override
-    public List<LayerGroupDsView> layerCodeGeoDataSource(String layerCode) throws Exception{
+    public List<LayerGroupDsView> layerCodeGeoDataSource(List<String> layerCodeList) throws Exception{
 
 
         List<LayerGroupDsView> layerGroupDsViewList = new ArrayList<LayerGroupDsView>();
@@ -57,7 +57,7 @@ public class GeoDataSourceServiceImpl implements IGeoDataSourceService {
         dsParams.put("tableName", "layer_group_ds_view");
 
 
-        String layerCodeCql = "(group_code ='"+layerCode+"' or layer_code='"+layerCode+"')";
+        String layerCodeCql = "(group_code IN ("+StringUtils.convertListToString(layerCodeList)+") or layer_code in ("+StringUtils.convertListToString(layerCodeList)+"))";
 
         Map<String, Object> mapParams = new HashMap<String, Object>();
         mapParams.put("cql", layerCodeCql);