许鹏程
2024-08-15 df81fa08540b7cc71e1facf50e24c395f089037c
src/main/java/com/product/data/sync/service/ConnectionConfigurationService.java
@@ -41,363 +41,363 @@
 */
@Service
public class ConnectionConfigurationService extends AbstractBaseService implements IConnectionConfigurationService {
    @Autowired
    public BaseDao baseDao;
    @Autowired
    PermissionService permissionService;
    @Autowired
    QueryFilterService queryFilterService;
   @Autowired
   public BaseDao baseDao;
   @Autowired
   PermissionService permissionService;
   @Autowired
   QueryFilterService queryFilterService;
    /**
     * 数据同步连接配置 --本地同步
     *
     * @param fse
     * @throws BaseException
     */
    private void currentConnectionConfigTables(FieldSetEntity fse, String condition) throws BaseException {
        BaseUtil.createCreatorAndCreationTime(fse);
        baseDao.saveFieldSetEntity(fse);
        String uuid = fse.getUUID();
        DataTableEntity dt = baseDao.listTable("SELECT table_name,? as database_config_uuid from product_sys_datamodel_table_field_v where length(table_name)>0 " + condition + " GROUP BY table_name ", new Object[]{uuid});
        dt.getMeta().setTableName(new Object[]{CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD});
        add(dt);
    }
   /**
    * 数据同步连接配置 --本地同步
    *
    * @param fse
    * @throws BaseException
    */
   private void currentConnectionConfigTables(FieldSetEntity fse, String condition) throws BaseException {
      BaseUtil.createCreatorAndCreationTime(fse);
      baseDao.saveFieldSetEntity(fse);
      String uuid = fse.getUUID();
      DataTableEntity dt = baseDao.listTable("SELECT table_name,? as database_config_uuid from product_sys_datamodel_table_field_v where length(table_name)>0 " + condition + " GROUP BY table_name ", new Object[]{uuid});
      dt.getMeta().setTableName(new Object[]{CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD});
      add(dt);
   }
    /**
     * 同步本库字段名
     *
     * @param fse
     * @param tableName 表名
     * @throws BaseException
     */
    private void currentConnectionConfigFields(FieldSetEntity fse, String tableName) throws BaseException {
        BaseUtil.createCreatorAndCreationTime(fse);
        if (!StringUtils.isEmpty(fse.getUUID())) {
            // 删除已存在的配置 重新插入最新配置
            baseDao.delete(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD, "database_config_uuid=?", new Object[]{fse.getUUID()});
        }
        baseDao.saveFieldSetEntity(fse);
        String uuid = fse.getUUID();
   /**
    * 同步本库字段名
    *
    * @param fse
    * @param tableName 表名
    * @throws BaseException
    */
   private void currentConnectionConfigFields(FieldSetEntity fse, String tableName) throws BaseException {
      BaseUtil.createCreatorAndCreationTime(fse);
      if (!StringUtils.isEmpty(fse.getUUID())) {
         // 删除已存在的配置 重新插入最新配置
         baseDao.delete(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD, "database_config_uuid=?", new Object[]{fse.getUUID()});
      }
      baseDao.saveFieldSetEntity(fse);
      String uuid = fse.getUUID();
        DataTableEntity dt = baseDao.listTable("SELECT table_name,field_name,? as database_config_uuid from product_sys_datamodel_table_field_v where table_name = ? ", new Object[]{uuid, tableName});
        dt.getMeta().setTableName(new Object[]{CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD});
        add(dt);
    }
      DataTableEntity dt = baseDao.listTable("SELECT table_name,field_name,? as database_config_uuid from product_sys_datamodel_table_field_v where table_name = ? ", new Object[]{uuid, tableName});
      dt.getMeta().setTableName(new Object[]{CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD});
      add(dt);
   }
    @Override
    @Transactional
    public String saveConnectionConfiguration(FieldSetEntity fs) throws BaseException, SQLException, ClassNotFoundException {
        String uuid = fs.getUUID();
        Connection conn = this.runConnectionConfiguration(fs);
        String sourceType = Global.getSystemConfig("data.source.type", "");
        if (BaseUtil.strIsNull(uuid)) {
            //数据库类型相同
            if (sourceType != null && sourceType.equalsIgnoreCase(fs.getString(CmnConst.DATABASE_TYPE))) {
                if ("/".equals(fs.getString(CmnConst.IP_ADDRESS))) {
                    // 修改了 product_sys_database_tablename_field 的表结构需要修改 此方法
                    this.currentConnectionConfigTables(fs, "");
                    return fs.getUUID();
                }
            }
            fs.setValue("org_level_uuid", SpringMVCContextHolder.getCurrentUser().getOrg_level_uuid());
            fs.setValue("created_by", SpringMVCContextHolder.getCurrentUser().getUser_id());
            fs.setValue("created_utc_datetime", new Date());
   @Override
   @Transactional
   public String saveConnectionConfiguration(FieldSetEntity fs) throws BaseException, SQLException, ClassNotFoundException {
      String uuid = fs.getUUID();
      Connection conn = this.runConnectionConfiguration(fs);
      String sourceType = Global.getSystemConfig("data.source.type", "");
      if (BaseUtil.strIsNull(uuid)) {
         //数据库类型相同
         if (sourceType != null && sourceType.equalsIgnoreCase(fs.getString(CmnConst.DATABASE_TYPE))) {
            if ("/".equals(fs.getString(CmnConst.IP_ADDRESS))) {
               // 修改了 product_sys_database_tablename_field 的表结构需要修改 此方法
               this.currentConnectionConfigTables(fs, "");
               return fs.getUUID();
            }
         }
         fs.setValue("org_level_uuid", SpringMVCContextHolder.getCurrentUser().getOrg_level_uuid());
         fs.setValue("created_by", SpringMVCContextHolder.getCurrentUser().getUser_id());
         fs.setValue("created_utc_datetime", new Date());
            uuid = baseDao.add(fs);
            if (conn != null) {
                this.saveTableName(conn, fs, null);
            } else {
                throw new BaseException(SystemCode.GET_JDBC_CONNECT_FAIL.getValue(), SystemCode.GET_JDBC_CONNECT_FAIL.getText());
            }
        } else {
            DataTableEntity sync_config = baseDao.listTable(CmnConst.PRODUCT_SYS_DATABASE_SYNC_CONFIG, " database_config_uuid = ? ", new String[]{uuid});
            if (BaseUtil.dataTableIsEmpty(sync_config)) {
                //直接删除表   从新保存表名
                baseDao.delete(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD, " database_config_uuid = ? ", new String[]{uuid});
                //数据库类型相同
                if (sourceType != null && sourceType.equalsIgnoreCase(fs.getString(CmnConst.DATABASE_TYPE))) {
                    if ("/".equals(fs.getString(CmnConst.IP_ADDRESS))) {
                        // 修改了 product_sys_database_tablename_field 的表结构需要修改 此方法
                        this.currentConnectionConfigTables(fs, "");
                        return fs.getUUID();
                    }
                }
                if (conn != null) {
                    this.saveTableName(conn, fs, null);
                } else {
                    throw new BaseException(SystemCode.GET_JDBC_CONNECT_FAIL.getValue(), SystemCode.GET_JDBC_CONNECT_FAIL.getText());
                }
                fs.setValue("updated_by", SpringMVCContextHolder.getCurrentUser().getUser_id());
                fs.setValue("updated_utc_datetime", new Date());
                baseDao.update(fs);
                try {
                    conn.close();
                } catch (SQLException e) {
                    throw new BaseException(e.toString(), "");
                }
            } else {
                //已创建同步的表不更新
                List<String> originName = Lists.newArrayList();
                for (int i = 0; i < sync_config.getRows(); i++) {
                    FieldSetEntity syncFse = sync_config.getFieldSetEntity(i);
                    originName.add(syncFse.getString(CmnConst.DATA_ORIGIN_NAME));
                }
                String and = BaseUtil.buildQuestionMarkFilter("", originName.toArray(), false);
                //先删除其他表
                baseDao.delete(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD, " database_config_uuid = ? AND table_name " + and, new String[]{uuid});
                //数据库类型相同
                if (sourceType != null && sourceType.equalsIgnoreCase(fs.getString(CmnConst.DATABASE_TYPE))) {
                    if ("/".equals(fs.getString(CmnConst.IP_ADDRESS))) {
                        // 修改了 product_sys_database_tablename_field 的表结构需要修改 此方法
                        this.currentConnectionConfigTables(fs, " and table_name " + and);
                        return fs.getUUID();
                    }
                }
                if (conn != null) {
                    this.saveTableName(conn, fs, and);
                } else {
                    throw new BaseException(SystemCode.GET_JDBC_CONNECT_FAIL.getValue(), SystemCode.GET_JDBC_CONNECT_FAIL.getText());
                }
            }
            baseDao.update(fs);
        }
        return uuid;
    }
         uuid = baseDao.add(fs);
         if (conn != null) {
            this.saveTableName(conn, fs, null);
         } else {
            throw new BaseException(SystemCode.GET_JDBC_CONNECT_FAIL.getValue(), SystemCode.GET_JDBC_CONNECT_FAIL.getText());
         }
      } else {
         DataTableEntity sync_config = baseDao.listTable(CmnConst.PRODUCT_SYS_DATABASE_SYNC_CONFIG, " database_config_uuid = ? ", new String[]{uuid});
         if (BaseUtil.dataTableIsEmpty(sync_config)) {
            //直接删除表   从新保存表名
            baseDao.delete(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD, " database_config_uuid = ? ", new String[]{uuid});
            //数据库类型相同
            if (sourceType != null && sourceType.equalsIgnoreCase(fs.getString(CmnConst.DATABASE_TYPE))) {
               if ("/".equals(fs.getString(CmnConst.IP_ADDRESS))) {
                  // 修改了 product_sys_database_tablename_field 的表结构需要修改 此方法
                  this.currentConnectionConfigTables(fs, "");
                  return fs.getUUID();
               }
            }
            if (conn != null) {
               this.saveTableName(conn, fs, null);
            } else {
               throw new BaseException(SystemCode.GET_JDBC_CONNECT_FAIL.getValue(), SystemCode.GET_JDBC_CONNECT_FAIL.getText());
            }
            fs.setValue("updated_by", SpringMVCContextHolder.getCurrentUser().getUser_id());
            fs.setValue("updated_utc_datetime", new Date());
            baseDao.update(fs);
            try {
               conn.close();
            } catch (SQLException e) {
               throw new BaseException(e.toString(), "");
            }
         } else {
            //已创建同步的表不更新
            List<String> originName = Lists.newArrayList();
            for (int i = 0; i < sync_config.getRows(); i++) {
               FieldSetEntity syncFse = sync_config.getFieldSetEntity(i);
               originName.add(syncFse.getString(CmnConst.DATA_ORIGIN_NAME));
            }
            String and = BaseUtil.buildQuestionMarkFilter("", originName.toArray(), false);
            //先删除其他表
            baseDao.delete(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD, " database_config_uuid = ? AND table_name " + and, new String[]{uuid});
            //数据库类型相同
            if (sourceType != null && sourceType.equalsIgnoreCase(fs.getString(CmnConst.DATABASE_TYPE))) {
               if ("/".equals(fs.getString(CmnConst.IP_ADDRESS))) {
                  // 修改了 product_sys_database_tablename_field 的表结构需要修改 此方法
                  this.currentConnectionConfigTables(fs, " and table_name " + and);
                  return fs.getUUID();
               }
            }
            if (conn != null) {
               this.saveTableName(conn, fs, and);
            } else {
               throw new BaseException(SystemCode.GET_JDBC_CONNECT_FAIL.getValue(), SystemCode.GET_JDBC_CONNECT_FAIL.getText());
            }
         }
         baseDao.update(fs);
      }
      return uuid;
   }
    //获取表名和字段名
    public void saveTableNameAndFieldName(Connection con, FieldSetEntity fs) throws BaseException {
        String uuid = fs.getString(CmnConst.UUID);
        String databaseType = fs.getString(CmnConst.DATABASE_TYPE);//数据库类型
        String sql;
        if ("mysql".equals(databaseType)) {             //数据库名称
            sql = "select TABLE_NAME,COLUMN_NAME from information_schema.COLUMNS WHERE TABLE_SCHEMA = '" + fs.getString(CmnConst.DATABASE_NAME) + "'";
        } else if ("oracle".equals(databaseType)) {                                //用户名 分大小写
            sql = "select TABLE_NAME,COLUMN_NAME from all_tab_columns";
        } else if ("sqlserver".equals(databaseType)) {                            //数据库名称
            sql = "SELECT a.name TABLE_NAME,b.name COLUMN_NAME FROM " + fs.getString(CmnConst.DATABASE_NAME) + "..SysObjects a " +
                    "LEFT JOIN " + fs.getString(CmnConst.DATABASE_NAME) + "..SysColumns b ON a.id = b.id Where a.XType='U' " +
                    "ORDER BY a.name ";
        } else if ("informix".equals(databaseType)) {                            //数据库名称
            sql = "SELECT t.tabname TABLE_NAME,c.colname COLUMN_NAME" +
                    "  FROM \"informix\".systables  AS t\n" +
                    "  JOIN \"informix\".syscolumns AS c ON t.tabid = c.tabid\n" +
                    " WHERE t.tabtype = 'T'\n" +
                    "   AND t.tabid >= 100\n" +
                    " ORDER BY t.tabname,c.colno;";
        } else {
            throw new BaseException(SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getValue(), SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getText());
        }
        try {
            PreparedStatement ps = con.prepareStatement(sql);
            ResultSet resultSet = ps.executeQuery();
            while (resultSet.next()) {
                FieldSetEntity field = new FieldSetEntity();
                field.setTableName(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD);
                field.setValue(CmnConst.DATABASE_CONFIG_UUID, uuid);
                //表名
                field.setValue(CmnConst.TABLE_NAME, resultSet.getString("TABLE_NAME"));
                //字段名
                field.setValue(CmnConst.FIELD_NAME, resultSet.getString("COLUMN_NAME"));
                baseDao.add(field);
            }
        } catch (SQLException e) {
            try {
                con.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
                throw new BaseException(SystemCode.GET_DATA_SOURCE_FAIL.getValue(), SystemCode.GET_DATA_SOURCE_FAIL.getText() + ex.getMessage());
            }
            throw new BaseException(SystemCode.GET_DATA_SOURCE_FAIL.getValue(), SystemCode.GET_DATA_SOURCE_FAIL.getText() + e.getMessage());
        }
    }
   //获取表名和字段名
   public void saveTableNameAndFieldName(Connection con, FieldSetEntity fs) throws BaseException {
      String uuid = fs.getString(CmnConst.UUID);
      String databaseType = fs.getString(CmnConst.DATABASE_TYPE);//数据库类型
      String sql;
      if ("mysql".equals(databaseType)) {             //数据库名称
         sql = "select TABLE_NAME,COLUMN_NAME from information_schema.COLUMNS WHERE TABLE_SCHEMA = '" + fs.getString(CmnConst.DATABASE_NAME) + "'";
      } else if ("oracle".equals(databaseType)) {                                //用户名 分大小写
         sql = "select TABLE_NAME,COLUMN_NAME from all_tab_columns";
      } else if ("sqlserver".equals(databaseType)) {                            //数据库名称
         sql = "SELECT a.name TABLE_NAME,b.name COLUMN_NAME FROM " + fs.getString(CmnConst.DATABASE_NAME) + "..SysObjects a " +
               "LEFT JOIN " + fs.getString(CmnConst.DATABASE_NAME) + "..SysColumns b ON a.id = b.id Where a.XType='U' " +
               "ORDER BY a.name ";
      } else if ("informix".equals(databaseType)) {                            //数据库名称
         sql = "SELECT t.tabname TABLE_NAME,c.colname COLUMN_NAME" +
               "  FROM \"informix\".systables  AS t\n" +
               "  JOIN \"informix\".syscolumns AS c ON t.tabid = c.tabid\n" +
               " WHERE t.tabtype = 'T'\n" +
               "   AND t.tabid >= 100\n" +
               " ORDER BY t.tabname,c.colno;";
      } else {
         throw new BaseException(SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getValue(), SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getText());
      }
      try {
         PreparedStatement ps = con.prepareStatement(sql);
         ResultSet resultSet = ps.executeQuery();
         while (resultSet.next()) {
            FieldSetEntity field = new FieldSetEntity();
            field.setTableName(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD);
            field.setValue(CmnConst.DATABASE_CONFIG_UUID, uuid);
            //表名
            field.setValue(CmnConst.TABLE_NAME, resultSet.getString("TABLE_NAME"));
            //字段名
            field.setValue(CmnConst.FIELD_NAME, resultSet.getString("COLUMN_NAME"));
            baseDao.add(field);
         }
      } catch (SQLException e) {
         try {
            con.close();
         } catch (SQLException ex) {
            ex.printStackTrace();
            throw new BaseException(SystemCode.GET_DATA_SOURCE_FAIL.getValue(), SystemCode.GET_DATA_SOURCE_FAIL.getText() + ex.getMessage());
         }
         throw new BaseException(SystemCode.GET_DATA_SOURCE_FAIL.getValue(), SystemCode.GET_DATA_SOURCE_FAIL.getText() + e.getMessage());
      }
   }
    //获取并保存表名
    public void saveTableName(Connection con, FieldSetEntity fs, String condition) throws BaseException {
        String uuid = fs.getString(CmnConst.UUID);
        String databaseType = fs.getString(CmnConst.DATABASE_TYPE);//数据库类型
        String sql;
        if ("mysql".equals(databaseType)) {             //数据库名称
            if (!BaseUtil.strIsNull(condition)) {
                condition = " AND TABLE_NAME " + condition;
            }
            sql = "select TABLE_NAME from information_schema.COLUMNS WHERE TABLE_SCHEMA = '" + fs.getString(CmnConst.DATABASE_NAME) + "' " + condition + " GROUP BY TABLE_NAME";
        } else if ("oracle".equals(databaseType)) {                                //用户名 分大小写
            if (!BaseUtil.strIsNull(condition)) {
                condition = " AND TABLE_NAME " + condition;
            }
            sql = "select TABLE_NAME from all_tab_columns WHERE OWNER = '" + fs.getString(CmnConst.USER_NAME) + "' " + condition + " GROUP BY TABLE_NAME ";
        } else if ("sqlserver".equals(databaseType)) {                            //数据库名称
            if (!BaseUtil.strIsNull(condition)) {
                condition = " AND name" + condition;
            }
            sql = "SELECT name TABLE_NAME FROM " + fs.getString(CmnConst.DATABASE_NAME) + "..SysObjects Where XType='U' " + condition;
        } else if ("informix".equals(databaseType)) {                            //数据库名称
            if (!BaseUtil.strIsNull(condition)) {
                condition = " AND tabname " + condition;
            }
            sql = "SELECT tabname TABLE_NAME FROM \"informix\".systables WHERE tabtype = 'T' AND tabid >= 100 " + condition;
        } else {
            throw new BaseException(SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getValue(), SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getText());
        }
        try {
            PreparedStatement ps = con.prepareStatement(sql);
            SpringMVCContextHolder.getSystemLogger().info("执行sql:\n\t" + sql);
            ResultSet resultSet = ps.executeQuery();
            while (resultSet.next()) {
                FieldSetEntity field = new FieldSetEntity();
                field.setTableName(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD);
                field.setValue(CmnConst.DATABASE_CONFIG_UUID, uuid);
                //只取表名
                field.setValue(CmnConst.TABLE_NAME, resultSet.getString("TABLE_NAME"));
                //字段名
   //获取并保存表名
   public void saveTableName(Connection con, FieldSetEntity fs, String condition) throws BaseException {
      String uuid = fs.getString(CmnConst.UUID);
      String databaseType = fs.getString(CmnConst.DATABASE_TYPE);//数据库类型
      String sql;
      if ("mysql".equals(databaseType)) {             //数据库名称
         if (!BaseUtil.strIsNull(condition)) {
            condition = " AND TABLE_NAME " + condition;
         }
         sql = "select TABLE_NAME from information_schema.COLUMNS WHERE TABLE_SCHEMA = '" + fs.getString(CmnConst.DATABASE_NAME) + "' " + (condition == null ? "" : condition) + " GROUP BY TABLE_NAME";
      } else if ("oracle".equals(databaseType)) {                                //用户名 分大小写
         if (!BaseUtil.strIsNull(condition)) {
            condition = " AND TABLE_NAME " + condition;
         }
         sql = "select TABLE_NAME from all_tab_columns WHERE OWNER = '" + fs.getString(CmnConst.USER_NAME) + "' " + (condition == null ? "" : condition) + " GROUP BY TABLE_NAME ";
      } else if ("sqlserver".equals(databaseType)) {                            //数据库名称
         if (!BaseUtil.strIsNull(condition)) {
            condition = " AND name" + condition;
         }
         sql = "SELECT name TABLE_NAME FROM " + fs.getString(CmnConst.DATABASE_NAME) + "..SysObjects Where XType='U' " + (condition == null ? "" : condition);
      } else if ("informix".equals(databaseType)) {                            //数据库名称
         if (!BaseUtil.strIsNull(condition)) {
            condition = " AND tabname " + condition;
         }
         sql = "SELECT tabname TABLE_NAME FROM \"informix\".systables WHERE tabtype = 'T' AND tabid >= 100 " + (condition == null ? "" : condition);
      } else {
         throw new BaseException(SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getValue(), SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getText());
      }
      try {
         PreparedStatement ps = con.prepareStatement(sql);
         SpringMVCContextHolder.getSystemLogger().info("执行sql:\n\t" + sql);
         ResultSet resultSet = ps.executeQuery();
         while (resultSet.next()) {
            FieldSetEntity field = new FieldSetEntity();
            field.setTableName(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD);
            field.setValue(CmnConst.DATABASE_CONFIG_UUID, uuid);
            //只取表名
            field.setValue(CmnConst.TABLE_NAME, resultSet.getString("TABLE_NAME"));
            //字段名
//                field.setValue(CmnConst.FIELD_NAME,resultSet.getString("COLUMN_NAME"));
                baseDao.add(field);
            }
        } catch (SQLException e) {
            SpringMVCContextHolder.getSystemLogger().error(e);
            SpringMVCContextHolder.getSystemLogger().info("执行sql错误:\n\t" + sql);
            try {
                con.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
                throw new BaseException(SystemCode.GET_DATA_SOURCE_FAIL.getValue(), SystemCode.GET_DATA_SOURCE_FAIL.getText() + ex.getMessage());
            }
            throw new BaseException(SystemCode.GET_DATA_SOURCE_FAIL.getValue(), SystemCode.GET_DATA_SOURCE_FAIL.getText() + e.getMessage());
        }
    }
            baseDao.add(field);
         }
      } catch (SQLException e) {
         SpringMVCContextHolder.getSystemLogger().error(e);
         SpringMVCContextHolder.getSystemLogger().info("执行sql错误:\n\t" + sql);
         try {
            con.close();
         } catch (SQLException ex) {
            ex.printStackTrace();
            throw new BaseException(SystemCode.GET_DATA_SOURCE_FAIL.getValue(), SystemCode.GET_DATA_SOURCE_FAIL.getText() + ex.getMessage());
         }
         throw new BaseException(SystemCode.GET_DATA_SOURCE_FAIL.getValue(), SystemCode.GET_DATA_SOURCE_FAIL.getText() + e.getMessage());
      }
   }
    /**
     * 查询数据源库 获取并保存字段名
     *
     * @param fs
     * @return
     * @throws BaseException
     */
    @Transactional
    @Override
    public Boolean saveField(FieldSetEntity fs) throws BaseException, SQLException, ClassNotFoundException {
        //表名
        String tableName = fs.getString(CmnConst.TABLE_NAME);
        //数据库连接uuid
        String databaseConfigUuid = fs.getString(CmnConst.DATABASE_CONFIG_UUID);
        //获取连接配置
        FieldSetEntity configField = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_DATABASE_CONNECTION_CONFIG, databaseConfigUuid, false);
        //数据库类型
        String databaseType = configField.getString(CmnConst.DATABASE_TYPE);
        //获取数据源连接
        Connection con = this.runConnectionConfiguration(configField);
        String sourceType = Global.getSystemConfig("data.source.type", "");
        if (sourceType != null && sourceType.equalsIgnoreCase(configField.getString(CmnConst.DATABASE_TYPE))) {
            if ("/".equals(configField.getString(CmnConst.IP_ADDRESS))) {
                // 修改了 product_sys_database_tablename_field 的表结构需要修改 此方法
                this.currentConnectionConfigFields(configField, tableName);
                return true;
            }
        }
        String sql;
        if ("mysql".equals(databaseType)) {             //数据库名称
            sql = "select COLUMN_NAME from information_schema.COLUMNS WHERE TABLE_SCHEMA = '" + configField.getString(CmnConst.DATABASE_NAME) + "' AND TABLE_NAME = '" + tableName + "'";
        } else if ("oracle".equals(databaseType)) {                                //用户名 分大小写
            sql = "select COLUMN_NAME from all_tab_columns WHERE OWNER = '" + configField.getString(CmnConst.USER_NAME) + "' AND TABLE_NAME = '" + tableName + "'";
        } else if ("sqlserver".equals(databaseType)) {
            //数据库名称
            sql = "SELECT name TABLE_NAME FROM " + fs.getString(CmnConst.DATABASE_NAME) + "..SysColumns WHERE id = ( " +
                    " SELECT id FROM " + fs.getString(CmnConst.DATABASE_NAME) + "..SysObjects WHERE XType='U' and name = '" + tableName + "')";
        } else if ("informix".equals(databaseType)) {                            //数据库名称
            sql = " SELECT colname COLUMN_NAME from \"informix\".syscolumns where tabid = ( " +
                    " SELECT tabid FROM \"informix\".systables WHERE tabname = '" + tableName + "'); ";
        } else {
            throw new BaseException(SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getValue(), SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getText());
        }
   /**
    * 查询数据源库 获取并保存字段名
    *
    * @param fs
    * @return
    * @throws BaseException
    */
   @Transactional
   @Override
   public Boolean saveField(FieldSetEntity fs) throws BaseException, SQLException, ClassNotFoundException {
      //表名
      String tableName = fs.getString(CmnConst.TABLE_NAME);
      //数据库连接uuid
      String databaseConfigUuid = fs.getString(CmnConst.DATABASE_CONFIG_UUID);
      //获取连接配置
      FieldSetEntity configField = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_DATABASE_CONNECTION_CONFIG, databaseConfigUuid, false);
      //数据库类型
      String databaseType = configField.getString(CmnConst.DATABASE_TYPE);
      //获取数据源连接
      Connection con = this.runConnectionConfiguration(configField);
      String sourceType = Global.getSystemConfig("data.source.type", "");
      if (sourceType != null && sourceType.equalsIgnoreCase(configField.getString(CmnConst.DATABASE_TYPE))) {
         if ("/".equals(configField.getString(CmnConst.IP_ADDRESS))) {
            // 修改了 product_sys_database_tablename_field 的表结构需要修改 此方法
            this.currentConnectionConfigFields(configField, tableName);
            return true;
         }
      }
      String sql;
      if ("mysql".equals(databaseType)) {             //数据库名称
         sql = "select COLUMN_NAME from information_schema.COLUMNS WHERE TABLE_SCHEMA = '" + configField.getString(CmnConst.DATABASE_NAME) + "' AND TABLE_NAME = '" + tableName + "'";
      } else if ("oracle".equals(databaseType)) {                                //用户名 分大小写
         sql = "select COLUMN_NAME from all_tab_columns WHERE OWNER = '" + configField.getString(CmnConst.USER_NAME) + "' AND TABLE_NAME = '" + tableName + "'";
      } else if ("sqlserver".equals(databaseType)) {
         //数据库名称
         sql = "SELECT name TABLE_NAME FROM " + fs.getString(CmnConst.DATABASE_NAME) + "..SysColumns WHERE id = ( " +
               " SELECT id FROM " + fs.getString(CmnConst.DATABASE_NAME) + "..SysObjects WHERE XType='U' and name = '" + tableName + "')";
      } else if ("informix".equals(databaseType)) {                            //数据库名称
         sql = " SELECT colname COLUMN_NAME from \"informix\".syscolumns where tabid = ( " +
               " SELECT tabid FROM \"informix\".systables WHERE tabname = '" + tableName + "'); ";
      } else {
         throw new BaseException(SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getValue(), SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getText());
      }
        try {
            PreparedStatement ps = con.prepareStatement(sql);
            ResultSet resultSet = ps.executeQuery();
            //判断改表名是否需要添加字段
      try {
         PreparedStatement ps = con.prepareStatement(sql);
         ResultSet resultSet = ps.executeQuery();
         //判断改表名是否需要添加字段
//            if(resultSet.getRow() > 0) {
            //先删除之前的数据
            baseDao.delete(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD, " database_config_uuid = ? and table_name = ? ", new String[]{databaseConfigUuid, tableName});
            while (resultSet.next()) {
         //先删除之前的数据
         baseDao.delete(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD, " database_config_uuid = ? and table_name = ? ", new String[]{databaseConfigUuid, tableName});
         while (resultSet.next()) {
//                    String fieldName = fs.getString(CmnConst.FIELD_NAME);
//                    if (BaseUtil.strIsNull(fieldName)) {
//                        fs.setValue(CmnConst.FIELD_NAME, resultSet.getString("COLUMN_NAME"));
//                        baseDao.update(fs);
//                        continue;
//                    }
                FieldSetEntity field = new FieldSetEntity();
                field.setTableName(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD);
                field.setValue(CmnConst.DATABASE_CONFIG_UUID, databaseConfigUuid);
                //表名
                field.setValue(CmnConst.TABLE_NAME, tableName);
                //字段名
                field.setValue(CmnConst.FIELD_NAME, resultSet.getString("COLUMN_NAME"));
                //再添加新的数据
                baseDao.add(field);
            }
            FieldSetEntity field = new FieldSetEntity();
            field.setTableName(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD);
            field.setValue(CmnConst.DATABASE_CONFIG_UUID, databaseConfigUuid);
            //表名
            field.setValue(CmnConst.TABLE_NAME, tableName);
            //字段名
            field.setValue(CmnConst.FIELD_NAME, resultSet.getString("COLUMN_NAME"));
            //再添加新的数据
            baseDao.add(field);
         }
//            }
        } catch (SQLException e) {
            try {
                con.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
                throw new BaseException(SystemCode.GET_DATA_SOURCE_FAIL.getValue(), SystemCode.GET_DATA_SOURCE_FAIL.getText() + ex.getMessage());
            }
            throw new BaseException(SystemCode.GET_DATA_SOURCE_FAIL.getValue(), SystemCode.GET_DATA_SOURCE_FAIL.getText() + e.getMessage());
        }
        return true;
    }
      } catch (SQLException e) {
         try {
            con.close();
         } catch (SQLException ex) {
            ex.printStackTrace();
            throw new BaseException(SystemCode.GET_DATA_SOURCE_FAIL.getValue(), SystemCode.GET_DATA_SOURCE_FAIL.getText() + ex.getMessage());
         }
         throw new BaseException(SystemCode.GET_DATA_SOURCE_FAIL.getValue(), SystemCode.GET_DATA_SOURCE_FAIL.getText() + e.getMessage());
      }
      return true;
   }
    @Override
    public DataTableEntity listConnectionConfiguration(FieldSetEntity fs) throws BaseException {
        String queryFilter;
        if (BaseUtil.dataTableIsEmpty(fs.getSubDataTable("systemSeniorQueryString"))) {
            queryFilter = "";
        } else {
            queryFilter = queryFilterService.getQueryFilter(fs);
        }
        DataTableEntity dt = baseDao.listTable(CmnConst.PRODUCT_SYS_DATABASE_CONNECTION_CONFIG, queryFilter, null, null, null, fs.getInteger(CmnConst.PAGESIZE), fs.getInteger(CmnConst.CPAGE));
   @Override
   public DataTableEntity listConnectionConfiguration(FieldSetEntity fs) throws BaseException {
      String queryFilter;
      if (BaseUtil.dataTableIsEmpty(fs.getSubDataTable("systemSeniorQueryString"))) {
         queryFilter = "";
      } else {
         queryFilter = queryFilterService.getQueryFilter(fs);
      }
      DataTableEntity dt = baseDao.listTable(CmnConst.PRODUCT_SYS_DATABASE_CONNECTION_CONFIG, queryFilter, null, null, null, fs.getInteger(CmnConst.PAGESIZE), fs.getInteger(CmnConst.CPAGE));
        return dt;
    }
      return dt;
   }
    @Override
    public FieldSetEntity getConnectionConfiguration(FieldSetEntity fs) throws BaseException {
        return baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_DATABASE_CONNECTION_CONFIG, fs.getUUID(), false);
    }
   @Override
   public FieldSetEntity getConnectionConfiguration(FieldSetEntity fs) throws BaseException {
      return baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_DATABASE_CONNECTION_CONFIG, fs.getUUID(), false);
   }
    @Override
    @Transactional
    public boolean delConnectionConfiguration(FieldSetEntity fs) throws BaseException {
        String uuid = fs.getUUID();
        String[] uuids = uuid.split(",");
        DataTableEntity dataTableEntity = baseDao.listTable(CmnConst.PRODUCT_SYS_DATABASE_SYNC_CONFIG, BaseUtil.buildQuestionMarkFilter(CmnConst.DATABASE_CONFIG_UUID, uuids.length, true), uuids);
        if (BaseUtil.dataTableIsEmpty(dataTableEntity)) {
            //删除该连接对应的表名跟字段名
            baseDao.delete(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD, BaseUtil.buildQuestionMarkFilter(CmnConst.DATABASE_CONFIG_UUID, uuids.length, true), uuids);
            //删除连接配置
            return baseDao.delete(CmnConst.PRODUCT_SYS_DATABASE_CONNECTION_CONFIG, uuids);
        } else {
            throw new BaseException(SystemCode.SYNC_EXISTING_CONFIGURATION_FAIL.getValue(), SystemCode.SYNC_EXISTING_CONFIGURATION_FAIL.getText());
        }
    }
   @Override
   @Transactional
   public boolean delConnectionConfiguration(FieldSetEntity fs) throws BaseException {
      String uuid = fs.getUUID();
      String[] uuids = uuid.split(",");
      DataTableEntity dataTableEntity = baseDao.listTable(CmnConst.PRODUCT_SYS_DATABASE_SYNC_CONFIG, BaseUtil.buildQuestionMarkFilter(CmnConst.DATABASE_CONFIG_UUID, uuids.length, true), uuids);
      if (BaseUtil.dataTableIsEmpty(dataTableEntity)) {
         //删除该连接对应的表名跟字段名
         baseDao.delete(CmnConst.PRODUCT_SYS_DATABASE_TABLENAME_FIELD, BaseUtil.buildQuestionMarkFilter(CmnConst.DATABASE_CONFIG_UUID, uuids.length, true), uuids);
         //删除连接配置
         return baseDao.delete(CmnConst.PRODUCT_SYS_DATABASE_CONNECTION_CONFIG, uuids);
      } else {
         throw new BaseException(SystemCode.SYNC_EXISTING_CONFIGURATION_FAIL.getValue(), SystemCode.SYNC_EXISTING_CONFIGURATION_FAIL.getText());
      }
   }
    public Connection runConnectionConfiguration(FieldSetEntity fs) throws BaseException, SQLException, ClassNotFoundException {
        String databaseType = fs.getString(CmnConst.DATABASE_TYPE);//数据库类型
        String ipAddress = fs.getString(CmnConst.IP_ADDRESS);//ip地址
        String databaseName = fs.getString(CmnConst.DATABASE_NAME);//数据库名称
        String portNumber = fs.getString(CmnConst.PORT_NUMBER);//端口号
        String userName = fs.getString(CmnConst.USER_NAME);//用户名
        String userPassword = fs.getString(CmnConst.USER_PASSWORD);//密码
        String instantiation = fs.getString(CmnConst.INSTANTIATION);//实例名
        String url;
        String diver;
        String sourceType = Global.getSystemConfig("data.source.type", "");
        if (sourceType != null && sourceType.equalsIgnoreCase(fs.getString(CmnConst.DATABASE_TYPE))) {
            if ("/".equals(fs.getString(CmnConst.IP_ADDRESS))) {
                return ConnectionManager.getConnection();
            }
        }
   public Connection runConnectionConfiguration(FieldSetEntity fs) throws BaseException, SQLException, ClassNotFoundException {
      String databaseType = fs.getString(CmnConst.DATABASE_TYPE);//数据库类型
      String ipAddress = fs.getString(CmnConst.IP_ADDRESS);//ip地址
      String databaseName = fs.getString(CmnConst.DATABASE_NAME);//数据库名称
      String portNumber = fs.getString(CmnConst.PORT_NUMBER);//端口号
      String userName = fs.getString(CmnConst.USER_NAME);//用户名
      String userPassword = fs.getString(CmnConst.USER_PASSWORD);//密码
      String instantiation = fs.getString(CmnConst.INSTANTIATION);//实例名
      String url;
      String diver;
      String sourceType = Global.getSystemConfig("data.source.type", "");
      if (sourceType != null && sourceType.equalsIgnoreCase(fs.getString(CmnConst.DATABASE_TYPE))) {
         if ("/".equals(fs.getString(CmnConst.IP_ADDRESS))) {
            return ConnectionManager.getConnection();
         }
      }
//        if("null".equals(databaseType) && !BaseUtil.strIsNull(jdbcConnect)){
//            url = jdbcConnect;
//            if(jdbcConnect.contains("mysql")){
@@ -410,48 +410,48 @@
//                throw  new BaseException("", "");
//            }
//        }else
        if ("mysql".equals(databaseType)) {
            diver = "com.mysql.cj.jdbc.Driver";
            url = "jdbc:mysql://" + ipAddress + ":" + portNumber + "/" + databaseName + "?useSSL=false&serverTimezone=UTC";
        } else if ("oracle".equals(databaseType)) {
            diver = "oracle.jdbc.driver.OracleDriver";
            url = "jdbc:oracle:thin:@" + ipAddress + ":" + portNumber + ":orcl";
        } else if ("sqlserver".equals(databaseType)) {
            diver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
            url = "jdbc:sqlserver://" + ipAddress + ":" + portNumber + ";DataBaseName=" + databaseName;
        } else if ("informix".equals(databaseType)) {
            diver = "com.informix.jdbc.IfxDriver";
            url = "jdbc:informix-sqli://" + ipAddress + ":" + portNumber + "/" + databaseName + ":informixserver=" + instantiation;
        } else {
            throw new BaseException(SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getValue(), SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getText());
        }
      if ("mysql".equals(databaseType)) {
         diver = "com.mysql.cj.jdbc.Driver";
         url = "jdbc:mysql://" + ipAddress + ":" + portNumber + "/" + databaseName + "?useSSL=false&serverTimezone=UTC";
      } else if ("oracle".equals(databaseType)) {
         diver = "oracle.jdbc.driver.OracleDriver";
         url = "jdbc:oracle:thin:@" + ipAddress + ":" + portNumber + ":orcl";
      } else if ("sqlserver".equals(databaseType)) {
         diver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
         url = "jdbc:sqlserver://" + ipAddress + ":" + portNumber + ";DataBaseName=" + databaseName;
      } else if ("informix".equals(databaseType)) {
         diver = "com.informix.jdbc.IfxDriver";
         url = "jdbc:informix-sqli://" + ipAddress + ":" + portNumber + "/" + databaseName + ":informixserver=" + instantiation;
      } else {
         throw new BaseException(SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getValue(), SystemCode.SYSTEM_UNKNOWN_DATABASE_TYPE.getText());
      }
        //获取jdbc连接
        return DataManipulationUtils.getConnection(diver, url, userName, userPassword);
    }
      //获取jdbc连接
      return DataManipulationUtils.getConnection(diver, url, userName, userPassword);
   }
    public JSONArray getSyncTree() throws BaseException {
        DataTableEntity dataTableEntity = baseDao.listTable(CmnConst.PRODUCT_SYS_DATABASE_CONNECTION_CONFIG);
        JSONArray linkArray = new JSONArray();
        for (int i = 0; i < dataTableEntity.getRows(); i++) {
            JSONObject configObject = new JSONObject();
            FieldSetEntity fieldSetEntity = dataTableEntity.getFieldSetEntity(i);
            String uuid = fieldSetEntity.getUUID();
            configObject.put("uuid", uuid);//uuid
            configObject.put("label", fieldSetEntity.getString("connect_name"));//连接名称
   public JSONArray getSyncTree() throws BaseException {
      DataTableEntity dataTableEntity = baseDao.listTable(CmnConst.PRODUCT_SYS_DATABASE_CONNECTION_CONFIG);
      JSONArray linkArray = new JSONArray();
      for (int i = 0; i < dataTableEntity.getRows(); i++) {
         JSONObject configObject = new JSONObject();
         FieldSetEntity fieldSetEntity = dataTableEntity.getFieldSetEntity(i);
         String uuid = fieldSetEntity.getUUID();
         configObject.put("uuid", uuid);//uuid
         configObject.put("label", fieldSetEntity.getString("connect_name"));//连接名称
            JSONArray syncArray = new JSONArray();
            DataTableEntity syncData = baseDao.listTable(CmnConst.PRODUCT_SYS_DATABASE_SYNC_CONFIG, " database_config_uuid = ? ", new String[]{uuid});
            for (int j = 0; j < syncData.getRows(); j++) {
                JSONObject jsonObject = new JSONObject();
                FieldSetEntity syncField = syncData.getFieldSetEntity(j);
                jsonObject.put("uuid", syncField.getString("uuid"));
                jsonObject.put("label", syncField.getString("system_table_name"));
                syncArray.add(jsonObject);
            }
            configObject.put("children", syncArray);
            linkArray.add(configObject);
        }
        return linkArray;
    }
         JSONArray syncArray = new JSONArray();
         DataTableEntity syncData = baseDao.listTable(CmnConst.PRODUCT_SYS_DATABASE_SYNC_CONFIG, " database_config_uuid = ? ", new String[]{uuid});
         for (int j = 0; j < syncData.getRows(); j++) {
            JSONObject jsonObject = new JSONObject();
            FieldSetEntity syncField = syncData.getFieldSetEntity(j);
            jsonObject.put("uuid", syncField.getString("uuid"));
            jsonObject.put("label", syncField.getString("system_table_name"));
            syncArray.add(jsonObject);
         }
         configObject.put("children", syncArray);
         linkArray.add(configObject);
      }
      return linkArray;
   }
}