perf(X-Pack): 对接 SQLBot 接口

This commit is contained in:
fit2cloud-chenyw
2025-08-25 16:17:09 +08:00
committed by fit2cloud-chenyw
parent 0fc089933a
commit 6aeac2f5cb
3 changed files with 242 additions and 8 deletions

View File

@@ -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<Map<String, Object>> query();
List<Map<String, Object>> 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<Map<String, Object>> queryCommunity();
@Select("""
<script>
WITH user_ds_permissions AS (
<choose>
<when test="!orgAdmin">
SELECT DISTINCT resource_id
FROM (
SELECT resource_id FROM per_auth_busi_user
WHERE oid = #{oid} AND uid = #{uid} AND resource_type = 4
UNION ALL
SELECT a.resource_id FROM per_auth_busi_role a
INNER JOIN per_user_role b ON a.rid = b.rid
WHERE b.oid = #{oid} AND b.uid = #{uid} AND a.resource_type = 4
) temp
</when>
<otherwise>
SELECT id as resource_id FROM per_busi_resource
WHERE org_id = #{oid} AND rt_id = 4
</otherwise>
</choose>
),
user_dg_permissions AS (
<choose>
<when test="!orgAdmin">
SELECT DISTINCT resource_id
FROM (
SELECT resource_id FROM per_auth_busi_user
WHERE oid = #{oid} AND uid = #{uid} AND resource_type = 3
UNION ALL
SELECT a.resource_id FROM per_auth_busi_role a
INNER JOIN per_user_role b ON a.rid = b.rid
WHERE b.oid = #{oid} AND b.uid = #{uid} AND a.resource_type = 3
) temp
</when>
<otherwise>
SELECT id as resource_id FROM per_busi_resource
WHERE org_id = #{oid} AND rt_id = 3
</otherwise>
</choose>
)
SELECT
cdt.id, cdt.datasource_id, cdt.table_name, cdt.info,
cdg.id as dataset_group_id,
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
INNER JOIN user_ds_permissions ds_p ON cd.id = ds_p.resource_id
INNER JOIN user_dg_permissions dg_p ON cdg.id = dg_p.resource_id
</script>
""")
List<Map<String, Object>> queryEnterprise(@Param("oid") Long oid, @Param("uid") Long uid, @Param("orgAdmin") Boolean orgAdmin);
}

View File

@@ -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<Long, List<DataSetColumnPermissionsDTO>> getColPermission(Long uid, List<Long> roleIds) {
ColumnPermissionsApi columnPermissionsApi = CommonBeanFactory.getBean(ColumnPermissionsApi.class);
Objects.requireNonNull(columnPermissionsApi);
DataSetColumnPermissionsDTO dataSetColumnPermissionsDTO = new DataSetColumnPermissionsDTO();
dataSetColumnPermissionsDTO.setAuthTargetId(uid);
dataSetColumnPermissionsDTO.setAuthTargetType("user");
dataSetColumnPermissionsDTO.setEnable(true);
List<DataSetColumnPermissionsDTO> dataSetColumnPermissionsDTOS = columnPermissionsApi.list(dataSetColumnPermissionsDTO);
if (CollectionUtils.isNotEmpty(roleIds)) {
dataSetColumnPermissionsDTO.setAuthTargetId(null);
dataSetColumnPermissionsDTO.setAuthTargetIds(roleIds);
dataSetColumnPermissionsDTO.setAuthTargetType("role");
List<DataSetColumnPermissionsDTO> 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<Long, List<DataSetRowPermissionsTreeDTO>> getRowPermission(Long uid, List<Long> roleIds) {
RowPermissionsApi rowPermissionsApi = CommonBeanFactory.getBean(RowPermissionsApi.class);
Objects.requireNonNull(rowPermissionsApi);
DatasetRowPermissionsTreeRequest request = new DatasetRowPermissionsTreeRequest();
request.setEnable(true);
request.setAuthTargetId(uid);
request.setAuthTargetType("user");
List<DataSetRowPermissionsTreeDTO> permissionsTreeDTOS = rowPermissionsApi.list(request);
if (ObjectUtils.isNotEmpty(roleIds)) {
request.setAuthTargetId(null);
request.setAuthTargetIds(roleIds);
request.setAuthTargetType("role");
List<DataSetRowPermissionsTreeDTO> 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<DataSQLBotAssistantVO> getDatasourceList(List<Long> ids) {
List<Map<String, Object>> list = dataSetAssistantMapper.query();
TokenUserBO user = Objects.requireNonNull(AuthUtils.getUser());
Long oid = user.getDefaultOid();
Long uid = user.getUserId();
List<Long> roleIds = null;
Map<Long, List<DataSetColumnPermissionsDTO>> colPermissionMap = null;
Map<Long, List<DataSetRowPermissionsTreeDTO>> rowPermissionMap = null;
Boolean model = deIndexManage.xpackModel();
List<Map<String, Object>> 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<RoleVO> 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<DataSQLBotAssistantVO> result = new ArrayList<>();
Map<String, DataSQLBotAssistantVO> 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();