From 6aeac2f5cb80ea9047c74608ae1d31cc45b7615b Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Mon, 25 Aug 2025 16:17:09 +0800 Subject: [PATCH] =?UTF-8?q?perf(X-Pack):=20=E5=AF=B9=E6=8E=A5=20SQLBot=20?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ext/mapper/DataSetAssistantMapper.java | 113 ++++++++++++++- .../dataset/manage/DatasetSQLBotManage.java | 135 +++++++++++++++++- de-xpack | 2 +- 3 files changed, 242 insertions(+), 8 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/dataset/dao/ext/mapper/DataSetAssistantMapper.java b/core/core-backend/src/main/java/io/dataease/dataset/dao/ext/mapper/DataSetAssistantMapper.java index 2c848d802d..78514bd0fd 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/dao/ext/mapper/DataSetAssistantMapper.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/dao/ext/mapper/DataSetAssistantMapper.java @@ -1,6 +1,7 @@ package io.dataease.dataset.dao.ext.mapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; @@ -12,7 +13,7 @@ public interface DataSetAssistantMapper { @Select( """ select - cdt.*, + cdt.id, cdt.datasource_id, cdt.table_name, cdt.info, cdg.name as dataset_name, cd.name as ds_name, cd.description as ds_desc, @@ -30,8 +31,114 @@ public interface DataSetAssistantMapper { left join `core_datasource` cd on cdt.datasource_id = cd.id left join `core_dataset_table_field` cdtf on cdtf.dataset_table_id = cdt.id left join `core_dataset_group` cdg on cdg.id = cdt.dataset_group_id - where cdg.mode = 0 and cdg.is_cross != 1 and cd.status = 'Success' + where cdg.is_cross != 1 and (cd.STATUS IS NULL OR cd.STATUS != 'Error') """ ) - List> query(); + List> queryAll(); + + @Select(""" + WITH user_ds_permissions AS ( + SELECT DISTINCT resource_id + FROM ( + select id as resource_id from per_busi_resource where rt_id = 4 + ) temp + ), + user_dg_permissions AS ( + SELECT DISTINCT resource_id + FROM ( + select id as resource_id from per_busi_resource where rt_id = 3 + ) temp + ) + SELECT + cdt.id, cdt.datasource_id, cdt.table_name, cdt.info, + cdg.name as dataset_name, + cd.name as ds_name, + cd.description as ds_desc, + cd.type as ds_type, + cd.configuration as ds_config, + cdtf.id as field_id, + cdtf.origin_name, + cdtf.name as field_show_name, + cdtf.description as field_desc, + cdtf.dataease_name, + cdtf.type as field_type + FROM `core_dataset_table` cdt + INNER JOIN `core_datasource` cd ON cdt.datasource_id = cd.id and (cd.STATUS IS NULL OR cd.STATUS != 'Error') + INNER JOIN `core_dataset_group` cdg ON cdg.id = cdt.dataset_group_id + AND cdg.is_cross != 1 + INNER JOIN `core_dataset_table_field` cdtf ON cdtf.dataset_table_id = cdt.id + where not exists( select 1 from user_ds_permissions ds_p where cd.id = ds_p.resource_id ) + and not exists( select 1 from user_dg_permissions dg_p where cdg.id = dg_p.resource_id ) + """) + List> queryCommunity(); + + + + @Select(""" + +""") + List> queryEnterprise(@Param("oid") Long oid, @Param("uid") Long uid, @Param("orgAdmin") Boolean orgAdmin); + + } diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLBotManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLBotManage.java index 08f1c522c2..106dacedc5 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLBotManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLBotManage.java @@ -4,27 +4,138 @@ import io.dataease.api.dataset.union.DatasetTableInfoDTO; import io.dataease.api.dataset.vo.DataSQLBotAssistantVO; import io.dataease.api.dataset.vo.SQLBotAssistanTable; import io.dataease.api.dataset.vo.SQLBotAssistantField; +import io.dataease.api.permissions.dataset.api.ColumnPermissionsApi; +import io.dataease.api.permissions.dataset.api.RowPermissionsApi; +import io.dataease.api.permissions.dataset.dto.DataSetColumnPermissionsDTO; +import io.dataease.api.permissions.dataset.dto.DataSetRowPermissionsTreeDTO; +import io.dataease.api.permissions.dataset.dto.DatasetRowPermissionsTreeRequest; +import io.dataease.api.permissions.role.api.RoleApi; +import io.dataease.api.permissions.role.dto.RoleRequest; +import io.dataease.api.permissions.role.vo.RoleVO; +import io.dataease.auth.bo.TokenUserBO; import io.dataease.commons.utils.EncryptUtils; import io.dataease.dataset.dao.ext.mapper.DataSetAssistantMapper; +import io.dataease.datasource.dao.auto.entity.CoreDatasource; +import io.dataease.datasource.manage.EngineManage; import io.dataease.extensions.datasource.vo.Configuration; +import io.dataease.extensions.datasource.vo.DatasourceConfiguration; +import io.dataease.home.manage.DeIndexManage; +import io.dataease.utils.AuthUtils; +import io.dataease.utils.CommonBeanFactory; import io.dataease.utils.JsonUtil; import io.dataease.utils.LogUtil; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; import java.util.*; +import java.util.stream.Collectors; @Component public class DatasetSQLBotManage { + @Resource + private DeIndexManage deIndexManage; + @Resource private DataSetAssistantMapper dataSetAssistantMapper; + @Resource + private EngineManage engineManage; + + @Resource + private Environment environment; + + private Map> getColPermission(Long uid, List roleIds) { + ColumnPermissionsApi columnPermissionsApi = CommonBeanFactory.getBean(ColumnPermissionsApi.class); + Objects.requireNonNull(columnPermissionsApi); + + DataSetColumnPermissionsDTO dataSetColumnPermissionsDTO = new DataSetColumnPermissionsDTO(); + dataSetColumnPermissionsDTO.setAuthTargetId(uid); + dataSetColumnPermissionsDTO.setAuthTargetType("user"); + dataSetColumnPermissionsDTO.setEnable(true); + List dataSetColumnPermissionsDTOS = columnPermissionsApi.list(dataSetColumnPermissionsDTO); + + if (CollectionUtils.isNotEmpty(roleIds)) { + dataSetColumnPermissionsDTO.setAuthTargetId(null); + dataSetColumnPermissionsDTO.setAuthTargetIds(roleIds); + dataSetColumnPermissionsDTO.setAuthTargetType("role"); + List roleDataSetColumnPermissionsDTOS = columnPermissionsApi.list(dataSetColumnPermissionsDTO); + if (CollectionUtils.isNotEmpty(roleDataSetColumnPermissionsDTOS)) { + dataSetColumnPermissionsDTOS.addAll(roleDataSetColumnPermissionsDTOS); + } + } + if (CollectionUtils.isEmpty(dataSetColumnPermissionsDTOS)) { + return null; + } + return dataSetColumnPermissionsDTOS.stream().collect(Collectors.groupingBy(DataSetColumnPermissionsDTO::getDatasetId)); + } + + private Map> getRowPermission(Long uid, List roleIds) { + RowPermissionsApi rowPermissionsApi = CommonBeanFactory.getBean(RowPermissionsApi.class); + Objects.requireNonNull(rowPermissionsApi); + + DatasetRowPermissionsTreeRequest request = new DatasetRowPermissionsTreeRequest(); + request.setEnable(true); + + request.setAuthTargetId(uid); + request.setAuthTargetType("user"); + List permissionsTreeDTOS = rowPermissionsApi.list(request); + + if (ObjectUtils.isNotEmpty(roleIds)) { + request.setAuthTargetId(null); + request.setAuthTargetIds(roleIds); + request.setAuthTargetType("role"); + List rolePermissionDTOS = rowPermissionsApi.list(request); + if (CollectionUtils.isNotEmpty(rolePermissionDTOS)) { + permissionsTreeDTOS.addAll(rolePermissionDTOS); + } + } + if (CollectionUtils.isEmpty(permissionsTreeDTOS)) { + return null; + } + return permissionsTreeDTOS.stream().collect(Collectors.groupingBy(DataSetRowPermissionsTreeDTO::getDatasetId)); + } + public List getDatasourceList(List ids) { - List> list = dataSetAssistantMapper.query(); + TokenUserBO user = Objects.requireNonNull(AuthUtils.getUser()); + Long oid = user.getDefaultOid(); + Long uid = user.getUserId(); + List roleIds = null; + Map> colPermissionMap = null; + Map> rowPermissionMap = null; + Boolean model = deIndexManage.xpackModel(); + List> list = null; + boolean isAdmin = uid == 1; + if (ObjectUtils.isEmpty(model)) { + if (!isAdmin) { + return null; + } + list = dataSetAssistantMapper.queryAll(); + } else if (!model) { + if (!isAdmin) { + return null; + } + list = dataSetAssistantMapper.queryCommunity(); + } else { + boolean isRootRole = isAdmin; + if (!isAdmin) { + RoleRequest request = new RoleRequest(); + request.setUid(uid); + List roleVOS = Objects.requireNonNull(CommonBeanFactory.getBean(RoleApi.class)).selectedForUser(request); + isRootRole = roleVOS.stream().anyMatch(RoleVO::isRoot); + /*roleIds = roleVOS.stream().map(RoleVO::getId).toList(); + + colPermissionMap = getColPermission(uid, roleIds); + rowPermissionMap = getRowPermission(uid, roleIds);*/ + } + list = dataSetAssistantMapper.queryEnterprise(oid, uid, isRootRole); + } + List result = new ArrayList<>(); Map dsFlagMap = new HashMap<>(); @@ -80,8 +191,23 @@ public class DatasetSQLBotManage { if (ObjectUtils.isEmpty(dsConfig) || StringUtils.isBlank(dsConfig.toString())) { return null; } - String config_json = EncryptUtils.aesDecrypt(dsConfig.toString()).toString(); - Configuration config = JsonUtil.parseObject(config_json, Configuration.class); + String dsHost = environment.getProperty("dataease.dsHost", String.class); + if (StringUtils.isBlank(dsHost)) { + dsHost = environment.getProperty("dataease.dataease-servers", String.class); + } + String dsType = row.get("ds_type").toString(); + Configuration config = null; + if (dsType.contains(DatasourceConfiguration.DatasourceType.Excel.name()) || dsType.contains(DatasourceConfiguration.DatasourceType.API.name())) { + CoreDatasource deEngine = engineManage.getDeEngine(); + String config_json = EncryptUtils.aesDecrypt(deEngine.getConfiguration()).toString(); + config = JsonUtil.parseObject(config_json, Configuration.class); + if (StringUtils.isNotBlank(dsHost) && ObjectUtils.isNotEmpty(config)) { + config.setHost(dsHost); + } + } else { + String config_json = EncryptUtils.aesDecrypt(dsConfig.toString()).toString(); + config = JsonUtil.parseObject(config_json, Configuration.class); + } DataSQLBotAssistantVO vo = new DataSQLBotAssistantVO(); vo.setDataBase(config.getDataBase()); vo.setExtraParams(config.getExtraParams()); @@ -89,7 +215,7 @@ public class DatasetSQLBotManage { vo.setPort(config.getPort()); vo.setName(row.get("ds_name").toString()); vo.setComment(ObjectUtils.isEmpty(row.get("ds_desc")) ? vo.getName() : row.get("ds_desc").toString()); - vo.setType(row.get("ds_type").toString()); + vo.setType(dsType); vo.setSchema(config.getSchema()); vo.setUser(config.getUsername()); vo.setPassword(config.getPassword()); @@ -100,6 +226,7 @@ public class DatasetSQLBotManage { SQLBotAssistanTable table = new SQLBotAssistanTable(); table.setName(row.get("table_name").toString()); table.setComment(row.get("dataset_name").toString()); + Object infoObj = null; if (ObjectUtils.isNotEmpty(infoObj = row.get("info"))) { String info = infoObj.toString(); diff --git a/de-xpack b/de-xpack index a6df1a50d2..acda00c592 160000 --- a/de-xpack +++ b/de-xpack @@ -1 +1 @@ -Subproject commit a6df1a50d2f5951b7c46daea31c68472c87d4a0c +Subproject commit acda00c592582cb88af2e72a51ba27427b8eef92