ZhuDeKang 5 luni în urmă
părinte
comite
4b68ba0398

+ 9 - 30
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/controller/PtTreeCateController.java

@@ -1,16 +1,18 @@
 package com.ruoyi.interfaces.controller;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
 
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.interfaces.domain.*;
+import com.ruoyi.interfaces.domain.MdModelFlow;
+import com.ruoyi.interfaces.domain.MdModelInfo;
+import com.ruoyi.interfaces.domain.PtService;
 import com.ruoyi.interfaces.domain.vo.MdModelInfoVo;
-import com.ruoyi.interfaces.mapper.PtServiceParamMapper;
-import com.ruoyi.interfaces.service.*;
+import com.ruoyi.interfaces.service.IMdModelFlowService;
+import com.ruoyi.interfaces.service.IMdModelInfoService;
+import com.ruoyi.interfaces.service.PtServiceService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -24,6 +26,8 @@ import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.interfaces.domain.PtTreeCate;
+import com.ruoyi.interfaces.service.IPtTreeCateService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.page.TableDataInfo;
 
@@ -48,16 +52,6 @@ public class PtTreeCateController extends BaseController {
     @Autowired
     private IMdModelFlowService mdModelFlowService;
 
-
-    @Autowired
-    private PtServiceParamMapper ptServiceParamMapper;
-
-    @Autowired
-    private PtServiceReturnService ptServiceReturnService;
-
-    @Autowired
-    private PtServiceFileService ptServiceFileService;
-
     /**
      * 查询树状目录列表
      */
@@ -99,7 +93,6 @@ public class PtTreeCateController extends BaseController {
         return success(ptTreeCateService.buildDataTreeSelect(ptTreeCates));
     }
 
-
     /**
      * 构建模型流程图树状列表
      *
@@ -118,12 +111,9 @@ public class PtTreeCateController extends BaseController {
             }
         }
         List<MdModelFlow> mdModelFlows = mdModelFlowService.selectMdModelFlowList(new MdModelFlow());
-
         for (MdModelFlow mdModelFlow : mdModelFlows) {
             if (StringUtils.isNotNull(mdModelFlow.getMdid()) && StringUtils.isNotNull(mdModelFlow.getFlowId())
                     && StringUtils.isNotNull(mdModelFlow.getFlowName())) {
-
-
                 ptTreeCates.add(new PtTreeCate(mdModelFlow.getFlowId().toString(), mdModelFlow.getMdid(), mdModelFlow.getFlowName(), "FLOW"));
             }
         }
@@ -189,18 +179,7 @@ public class PtTreeCateController extends BaseController {
                 if (StringUtils.isNotNull(ptService.getSrvId()) &&
                         StringUtils.isNotNull(ptService.getMdid()) &&
                         StringUtils.isNotNull(ptService.getName())) {
-                    HashMap<String,Object> dataMap = new HashMap<>();
-
-                    List<PtServiceParam> list = ptServiceParamMapper.selectAll(ptService.getSrvId());
-                    List<PtServiceReturn> returnList = ptServiceReturnService.listBysrvId(ptService.getSrvId());
-                    List<PtServiceFile> fileList = ptServiceFileService.selectAll(ptService.getSrvId());
-                    dataMap.put("ptService", ptService);
-                    dataMap.put("list", list);
-                    dataMap.put("returnList", returnList);
-                    dataMap.put("fileList", fileList);
-
-
-                    ptTreeCates.add(new PtTreeCate(ptService.getSrvId(), ptService.getMdid(), ptService.getName(), "SERVICE",dataMap));
+                    ptTreeCates.add(new PtTreeCate(ptService.getSrvId(), ptService.getMdid(), ptService.getName(), "SERVICE",ptService));
                 }
             }
         }

+ 10 - 1
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/controller/SysMetaDatasourceController.java

@@ -3,6 +3,7 @@ package com.ruoyi.interfaces.controller;
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
+import com.ruoyi.interfaces.domain.vo.SysMetaQueryVo;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -103,7 +104,15 @@ public class SysMetaDatasourceController extends BaseController {
         return error("未知错误");
     }
 
-    
+    @GetMapping("/getTableNames/{dsCode}")
+    public AjaxResult getTableNames(@PathVariable String dsCode) {
 
+        return success(
+                sysMetaDatasourceService.getTableNames(dsCode));
+    }
+
+    public AjaxResult query(SysMetaQueryVo queryVo){
+        return success(sysMetaDatasourceService.queryTableData(queryVo));
+    }
 
 }

+ 155 - 0
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/database/DynamicDataSourceManager.java

@@ -146,4 +146,159 @@ public class DynamicDataSourceManager {
         DruidDataSource dataSource = dataSourceMap.get(key);
         return dataSource != null && !dataSource.isClosed();
     }
+    // 数据库类型枚举
+    public enum DatabaseType {
+        MYSQL,
+        ORACLE,
+        SQLSERVER,
+        POSTGRESQL,
+        DB2,
+        SQLITE,
+        H2,
+        MARIADB
+    }
+
+    private static final Map<DatabaseType, String> COUNT_SQL_TEMPLATES = new HashMap<>();
+    private static final Map<DatabaseType, String> PAGINATION_SQL_TEMPLATES = new HashMap<>();
+
+    static {
+        // 初始化计数SQL模板
+        COUNT_SQL_TEMPLATES.put(DatabaseType.MYSQL, "SELECT COUNT(*) FROM (%s) AS total_count");
+        COUNT_SQL_TEMPLATES.put(DatabaseType.ORACLE, "SELECT COUNT(*) FROM (%s)");
+        COUNT_SQL_TEMPLATES.put(DatabaseType.SQLSERVER, "SELECT COUNT(*) FROM (%s) AS total_count");
+        COUNT_SQL_TEMPLATES.put(DatabaseType.POSTGRESQL, "SELECT COUNT(*) FROM (%s) AS total_count");
+        COUNT_SQL_TEMPLATES.put(DatabaseType.DB2, "SELECT COUNT(*) FROM (%s)");
+        COUNT_SQL_TEMPLATES.put(DatabaseType.SQLITE, "SELECT COUNT(*) FROM (%s)");
+        COUNT_SQL_TEMPLATES.put(DatabaseType.H2, "SELECT COUNT(*) FROM (%s) AS total_count");
+        COUNT_SQL_TEMPLATES.put(DatabaseType.MARIADB, "SELECT COUNT(*) FROM (%s) AS total_count");
+
+        // 初始化分页SQL模板
+        PAGINATION_SQL_TEMPLATES.put(DatabaseType.MYSQL, "%s LIMIT %d, %d");
+        PAGINATION_SQL_TEMPLATES.put(DatabaseType.ORACLE,
+                "SELECT * FROM (SELECT a.*, ROWNUM rnum FROM (%s) a WHERE ROWNUM <= %d) WHERE rnum > %d");
+        PAGINATION_SQL_TEMPLATES.put(DatabaseType.SQLSERVER,
+                "SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_num FROM (%s) AS inner_query) AS outer_query WHERE row_num BETWEEN %d AND %d");
+        PAGINATION_SQL_TEMPLATES.put(DatabaseType.POSTGRESQL, "%s LIMIT %d OFFSET %d");
+        PAGINATION_SQL_TEMPLATES.put(DatabaseType.DB2,
+                "SELECT * FROM (SELECT inner_query.*, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_num FROM (%s) AS inner_query) AS outer_query WHERE row_num BETWEEN %d AND %d");
+        PAGINATION_SQL_TEMPLATES.put(DatabaseType.SQLITE, "%s LIMIT %d OFFSET %d");
+        PAGINATION_SQL_TEMPLATES.put(DatabaseType.H2, "%s LIMIT %d OFFSET %d");
+        PAGINATION_SQL_TEMPLATES.put(DatabaseType.MARIADB, "%s LIMIT %d, %d");
+    }
+
+    /**
+     * 生成计数SQL
+     * @param originalSql 原始SQL
+     * @param databaseType 数据库类型
+     * @return 计数SQL
+     */
+    public static String buildCountSql(String originalSql, DatabaseType databaseType) {
+        if (!COUNT_SQL_TEMPLATES.containsKey(databaseType)) {
+            throw new IllegalArgumentException("不支持的数据库类型: " + databaseType);
+        }
+        String template = COUNT_SQL_TEMPLATES.get(databaseType);
+        return String.format(template, originalSql);
+    }
+
+    /**
+     * 生成分页SQL
+     * @param originalSql 原始SQL
+     * @param pageNum 页码(从1开始)
+     * @param pageSize 每页大小
+     * @param databaseType 数据库类型
+     * @return 分页SQL
+     */
+    public static String buildPaginationSql(String originalSql, int pageNum, int pageSize, DatabaseType databaseType) {
+        if (!PAGINATION_SQL_TEMPLATES.containsKey(databaseType)) {
+            throw new IllegalArgumentException("不支持的数据库类型: " + databaseType);
+        }
+
+        String template = PAGINATION_SQL_TEMPLATES.get(databaseType);
+
+        // 计算起始位置
+        int start = (pageNum - 1) * pageSize;
+
+        // 根据不同数据库类型格式化SQL
+        switch (databaseType) {
+            case MYSQL:
+            case MARIADB:
+                return String.format(template, originalSql, start, pageSize);
+
+            case ORACLE:
+                int end = pageNum * pageSize;
+                return String.format(template, originalSql, end, start);
+
+            case SQLSERVER:
+            case DB2:
+                start = (pageNum - 1) * pageSize + 1;
+                int endRow = pageNum * pageSize;
+                return String.format(template, originalSql, start, endRow);
+
+            case POSTGRESQL:
+            case SQLITE:
+            case H2:
+                return String.format(template, originalSql, pageSize, start);
+
+            default:
+                throw new IllegalArgumentException("不支持的数据库类型: " + databaseType);
+        }
+    }
+
+
+    /**
+     * 根据数据库连接URL判断数据库类型
+     * @param jdbcType JDBC连接URL
+     * @return 数据库类型
+     */
+    public static DatabaseType getDatabaseTypeFromUrl(String jdbcType) {
+        if (jdbcType == null) {
+            throw new IllegalArgumentException("JDBC URL不能为空");
+        }
+
+        if (jdbcType.startsWith("mysql")) {
+            return DatabaseType.MYSQL;
+        } else if (jdbcType.startsWith("oracle")) {
+            return DatabaseType.ORACLE;
+        } else if (jdbcType.startsWith("sqlserver")) {
+            return DatabaseType.SQLSERVER;
+        } else if (jdbcType.startsWith("postgresql")) {
+            return DatabaseType.POSTGRESQL;
+        } else if (jdbcType.startsWith("db2")) {
+            return DatabaseType.DB2;
+        } else if (jdbcType.startsWith("sqlite")) {
+            return DatabaseType.SQLITE;
+        } else if (jdbcType.startsWith("h2")) {
+            return DatabaseType.H2;
+        } else if (jdbcType.startsWith("mariadb")) {
+            return DatabaseType.MARIADB;
+        } else {
+            throw new IllegalArgumentException("无法识别的数据库连接URL: " + jdbcType);
+        }
+    }
+    /**
+     * 生成分页SQL(通过JDBC URL自动识别数据库类型)
+     * @param originalSql 原始SQL
+     * @param pageNum 页码(从1开始)
+     * @param pageSize 每页大小
+     * @param jdbcType JDBC连接URL
+     * @return 分页SQL
+     */
+    public static String buildPaginationSql(String originalSql, int pageNum, int pageSize, String jdbcType) {
+        DatabaseType databaseType = getDatabaseTypeFromUrl(jdbcType);
+        return buildPaginationSql(originalSql, pageNum, pageSize, databaseType);
+    }
+
+    /**
+     * 生成计数SQL(通过JDBC URL自动识别数据库类型)
+     * @param originalSql 原始SQL
+     * @param jdbcType JDBC连接URL
+     * @return 计数SQL
+     */
+    public static String buildCountSql(String originalSql, String jdbcType) {
+        DatabaseType databaseType = getDatabaseTypeFromUrl(jdbcType);
+        return buildCountSql(originalSql, databaseType);
+    }
+
+
+
 }

+ 8 - 8
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/domain/PtTreeCate.java

@@ -9,7 +9,6 @@ import com.ruoyi.common.core.domain.BaseEntity;
 
 import java.util.ArrayList;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -32,7 +31,7 @@ public class PtTreeCate extends BaseEntity
     /** 父节点序号 */
     @Excel(name = "父节点序号")
     private String treePid;
-    private HashMap<String,Object> dataMap;
+    private PtService service;
 
     /** 名称 */
     @Excel(name = "名称")
@@ -58,12 +57,12 @@ public class PtTreeCate extends BaseEntity
 
     private List<PtTreeCate> children = new ArrayList<PtTreeCate>();
 
-    public PtTreeCate(String mdid, String cateid, String name, String model,HashMap<String,Object> dataMap) {
+    public PtTreeCate(String mdid, String cateid, String name, String model,PtService service) {
         this.treeId=mdid;
         this.treePid=cateid;
         this.itemName=name;
         this.nodeType=model;
-        this.dataMap=dataMap;
+        this.service=service;
     }
     public PtTreeCate(String mdid, String cateid, String name, String model) {
         this.treeId=mdid;
@@ -72,12 +71,13 @@ public class PtTreeCate extends BaseEntity
         this.nodeType=model;
     }
 
-    public HashMap<String, Object> getDataMap() {
-        return dataMap;
+
+    public PtService getService() {
+        return service;
     }
 
-    public void setDataMap(HashMap<String, Object> dataMap) {
-        this.dataMap = dataMap;
+    public void setService(PtService service) {
+        this.service = service;
     }
 
     public String getNodeType() {

+ 7 - 7
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/domain/TreeSelectString.java

@@ -3,7 +3,6 @@ package com.ruoyi.interfaces.domain;
 import com.fasterxml.jackson.annotation.JsonInclude;
 
 import java.io.Serializable;
-import java.util.HashMap;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -18,7 +17,7 @@ public class TreeSelectString  implements Serializable{
     private String label;
     private String nodeType;
 
-    private HashMap<String,Object> dataMap;
+    private PtService service;
 
 
     /** 子节点 */
@@ -41,16 +40,17 @@ public class TreeSelectString  implements Serializable{
         this.label = menu.getItemName();
         this.nodeType = menu.getNodeType();
         this.pid = menu.getTreePid();
-        this.dataMap = menu.getDataMap();
+        this.service = menu.getService();
         this.children = menu.getChildren().stream().map(TreeSelectString::new).collect(Collectors.toList());
     }
 
-    public HashMap<String, Object> getDataMap() {
-        return dataMap;
+
+    public PtService getService() {
+        return service;
     }
 
-    public void setDataMap(HashMap<String, Object> dataMap) {
-        this.dataMap = dataMap;
+    public void setService(PtService service) {
+        this.service = service;
     }
 
     public String getPid() {

+ 30 - 0
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/domain/vo/SysMetaQueryVo.java

@@ -0,0 +1,30 @@
+package com.ruoyi.interfaces.domain.vo;
+
+public class SysMetaQueryVo {
+    private String dsCode;
+    private String sql;
+
+    public SysMetaQueryVo(String dsCode, String sql) {
+        this.dsCode = dsCode;
+        this.sql = sql;
+    }
+
+    public SysMetaQueryVo() {
+    }
+
+    public String getDsCode() {
+        return dsCode;
+    }
+
+    public void setDsCode(String dsCode) {
+        this.dsCode = dsCode;
+    }
+
+    public String getSql() {
+        return sql;
+    }
+
+    public void setSql(String sql) {
+        this.sql = sql;
+    }
+}

+ 7 - 0
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/service/ISysMetaDatasourceService.java

@@ -1,7 +1,10 @@
 package com.ruoyi.interfaces.service;
 
 import java.util.List;
+import java.util.Map;
+
 import com.ruoyi.interfaces.domain.SysMetaDatasource;
+import com.ruoyi.interfaces.domain.vo.SysMetaQueryVo;
 
 /**
  * 数据源管理Service接口
@@ -60,4 +63,8 @@ public interface ISysMetaDatasourceService
     public int deleteSysMetaDatasourceByDsCode(String dsCode);
 
     Integer testConnection(String dsCode);
+
+    List<String> getTableNames(String dsCode);
+
+    List<Map<String, Object>>  queryTableData(SysMetaQueryVo queryVo);
 }

+ 68 - 23
ruoyi-api-patform/src/main/java/com/ruoyi/interfaces/service/impl/SysMetaDatasourceServiceImpl.java

@@ -1,11 +1,19 @@
 package com.ruoyi.interfaces.service.impl;
 
+import org.springframework.jdbc.core.JdbcTemplate;
+
 import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import com.ruoyi.common.utils.uuid.IdUtils;
 import com.ruoyi.interfaces.database.DynamicDataSourceManager;
+import com.ruoyi.interfaces.domain.vo.SysMetaQueryVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ruoyi.interfaces.mapper.SysMetaDatasourceMapper;
@@ -16,13 +24,12 @@ import javax.sql.DataSource;
 
 /**
  * 数据源管理Service业务层处理
- * 
+ *
  * @author 朱得糠
  * @date 2025-08-02
  */
 @Service
-public class SysMetaDatasourceServiceImpl implements ISysMetaDatasourceService 
-{
+public class SysMetaDatasourceServiceImpl implements ISysMetaDatasourceService {
     @Autowired
     private SysMetaDatasourceMapper sysMetaDatasourceMapper;
 
@@ -32,79 +39,72 @@ public class SysMetaDatasourceServiceImpl implements ISysMetaDatasourceService
 
     /**
      * 查询数据源管理
-     * 
+     *
      * @param dsCode 数据源管理主键
      * @return 数据源管理
      */
     @Override
-    public SysMetaDatasource selectSysMetaDatasourceByDsCode(String dsCode)
-    {
+    public SysMetaDatasource selectSysMetaDatasourceByDsCode(String dsCode) {
         return sysMetaDatasourceMapper.selectSysMetaDatasourceByDsCode(dsCode);
     }
 
     /**
      * 查询数据源管理列表
-     * 
+     *
      * @param sysMetaDatasource 数据源管理
      * @return 数据源管理
      */
     @Override
-    public List<SysMetaDatasource> selectSysMetaDatasourceList(SysMetaDatasource sysMetaDatasource)
-    {
+    public List<SysMetaDatasource> selectSysMetaDatasourceList(SysMetaDatasource sysMetaDatasource) {
         return sysMetaDatasourceMapper.selectSysMetaDatasourceList(sysMetaDatasource);
     }
 
     /**
      * 新增数据源管理
-     * 
+     *
      * @param sysMetaDatasource 数据源管理
      * @return 结果
      */
     @Override
-    public int insertSysMetaDatasource(SysMetaDatasource sysMetaDatasource)
-    {
+    public int insertSysMetaDatasource(SysMetaDatasource sysMetaDatasource) {
         sysMetaDatasource.setDsCode(IdUtils.fastUUID());
         return sysMetaDatasourceMapper.insertSysMetaDatasource(sysMetaDatasource);
     }
 
     /**
      * 修改数据源管理
-     * 
+     *
      * @param sysMetaDatasource 数据源管理
      * @return 结果
      */
     @Override
-    public int updateSysMetaDatasource(SysMetaDatasource sysMetaDatasource)
-    {
+    public int updateSysMetaDatasource(SysMetaDatasource sysMetaDatasource) {
         return sysMetaDatasourceMapper.updateSysMetaDatasource(sysMetaDatasource);
     }
 
     /**
      * 批量删除数据源管理
-     * 
+     *
      * @param dsCodes 需要删除的数据源管理主键
      * @return 结果
      */
     @Override
-    public int deleteSysMetaDatasourceByDsCodes(String[] dsCodes)
-    {
+    public int deleteSysMetaDatasourceByDsCodes(String[] dsCodes) {
         return sysMetaDatasourceMapper.deleteSysMetaDatasourceByDsCodes(dsCodes);
     }
 
     /**
      * 删除数据源管理信息
-     * 
+     *
      * @param dsCode 数据源管理主键
      * @return 结果
      */
     @Override
-    public int deleteSysMetaDatasourceByDsCode(String dsCode)
-    {
+    public int deleteSysMetaDatasourceByDsCode(String dsCode) {
         return sysMetaDatasourceMapper.deleteSysMetaDatasourceByDsCode(dsCode);
     }
 
     /**
-     *
      * @param dsCode
      * @return 1 = 成功 ; 0 = 超时
      */
@@ -114,10 +114,55 @@ public class SysMetaDatasourceServiceImpl implements ISysMetaDatasourceService
 
         try (Connection conn = sysDataSource.getConnection()) {
             boolean valid = conn.isValid(5);// 5秒超时
-            if (valid)return 1;
+            if (valid) return 1;
             return 0;
         } catch (SQLException e) {
             throw new RuntimeException("数据库连接测试失败: " + e.getMessage(), e);
         }
     }
+
+    @Override
+    public List<String> getTableNames(String dsCode) {
+
+        List<String> tables = new ArrayList<>();
+        DataSource dataSource = dataSourceManager.getSysDataSource(sysMetaDatasourceMapper.selectSysMetaDatasourceByDsCode(dsCode));
+        try (Connection conn = dataSource.getConnection()) {
+            DatabaseMetaData metaData = conn.getMetaData();
+            ResultSet rs = metaData.getTables(null, null, "%", new String[]{"TABLE"});
+
+            while (rs.next()) {
+                tables.add(rs.getString("TABLE_NAME"));
+            }
+        } catch (SQLException e) {
+            throw new RuntimeException("获取表名失败: " + e.getMessage(), e);
+        }
+        return tables;
+    }
+
+    /**
+     * 查询指定表的数据
+     */
+    @Override
+    public List<Map<String, Object>> queryTableData(SysMetaQueryVo queryVo) {
+
+        SysMetaDatasource sysMetaDatasource = sysMetaDatasourceMapper.selectSysMetaDatasourceByDsCode(queryVo.getDsCode());
+        DataSource dataSource = dataSourceManager.getSysDataSource(sysMetaDatasource);
+
+        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
+
+        String sql = DynamicDataSourceManager.buildPaginationSql(queryVo.getSql(), 1, 100, sysMetaDatasource.getDsType());
+
+
+        return jdbcTemplate.query(sql, (rs, rowNum) -> {
+            Map<String, Object> row = new HashMap<>();
+            int columnCount = rs.getMetaData().getColumnCount();
+
+            for (int i = 1; i <= columnCount; i++) {
+                String columnName = rs.getMetaData().getColumnName(i);
+                Object value = rs.getObject(i);
+                row.put(columnName, value);
+            }
+            return row;
+        });
+    }
 }