报表模块mycat环境无法路由修复

This commit is contained in:
gaoqr
2026-05-15 17:31:45 +08:00
parent dd134616bd
commit 80470b746b
3 changed files with 168 additions and 62 deletions
@@ -1,5 +1,6 @@
package com.cf.imes.module.report.dal.mysql.datasource;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.organ.core.aop.OrganIgnore;
@@ -7,6 +8,7 @@ import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO;
import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum;
import org.apache.ibatis.annotations.Mapper;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -30,17 +32,27 @@ public interface ReportDatasourceMapper extends BaseMapperX<ReportDatasourceDO>
*/
@OrganIgnore
default ReportDatasourceDO selectNormalDatasourceById(Long id, Long organId) {
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<ReportDatasourceDO>()
ReportDatasourceDO result = null;
// 1. 先查 CUSTOM(当前组织)
LambdaQueryWrapper<ReportDatasourceDO> customWrapper = new LambdaQueryWrapper<ReportDatasourceDO>()
.eq(ReportDatasourceDO::getId, id)
.and(wr -> wr
.or(wrapper -> wrapper
.eq(ReportDatasourceDO::getOrganId, organId)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM))
.or(wrapper -> wrapper
.eq(ReportDatasourceDO::getOrganId, 1L)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM))
);
return selectOne(queryWrapper);
.eq(ReportDatasourceDO::getOrganId, organId)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM);
result = selectOne(customWrapper);
// 2. 如果 CUSTOM 没查到,再查 SYSTEM(固定组织)
if (result == null) {
LambdaQueryWrapper<ReportDatasourceDO> systemWrapper = new LambdaQueryWrapper<ReportDatasourceDO>()
.eq(ReportDatasourceDO::getId, id)
.eq(ReportDatasourceDO::getOrganId, CF_ORGANID)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM);
result = selectOne(systemWrapper);
}
return result;
}
/**
@@ -51,14 +63,32 @@ public interface ReportDatasourceMapper extends BaseMapperX<ReportDatasourceDO>
*/
@OrganIgnore
default List<ReportDatasourceDO> selectNormalDatasourceList(Set<Long> datasourceIds, Long organId) {
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<ReportDatasourceDO>()
.in(ReportDatasourceDO::getId, datasourceIds)
.and(wr -> wr.or(wrapper -> wrapper
.eq(ReportDatasourceDO::getOrganId, organId)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM))
.or(wrapper -> wrapper
.eq(ReportDatasourceDO::getOrganId, CF_ORGANID)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM)));
return selectList(queryWrapper);
List<ReportDatasourceDO> result = new ArrayList<>();
// 1. CUSTOM(当前组织)
List<ReportDatasourceDO> customList = selectList(
new LambdaQueryWrapper<ReportDatasourceDO>()
.in(ReportDatasourceDO::getId, datasourceIds)
.eq(ReportDatasourceDO::getOrganId, organId)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM)
);
if (CollUtil.isNotEmpty(customList)) {
result.addAll(customList);
}
// 2. SYSTEM(固定组织)
List<ReportDatasourceDO> systemList = selectList(
new LambdaQueryWrapper<ReportDatasourceDO>()
.in(ReportDatasourceDO::getId, datasourceIds)
.eq(ReportDatasourceDO::getOrganId, CF_ORGANID)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM)
);
if (CollUtil.isNotEmpty(systemList)) {
result.addAll(systemList);
}
return result;
}
}
@@ -1,5 +1,6 @@
package com.cf.imes.module.report.dal.mysql.template;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -10,7 +11,11 @@ import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.CF_ORGANID;
@@ -32,19 +37,27 @@ public interface ReportTemplateMapper extends BaseMapperX<ReportTemplateDO> {
*/
@OrganIgnore
default ReportTemplateDO selectNormalTemplateById(Long id, Long organId) {
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<ReportTemplateDO>()
ReportTemplateDO result = null;
// 1. 先查 CUSTOM(当前组织)
LambdaQueryWrapper<ReportTemplateDO> customWrapper = new LambdaQueryWrapper<ReportTemplateDO>()
.eq(ReportTemplateDO::getId, id)
.and(wr -> wr
.or(wrapper -> wrapper
.eq(ReportTemplateDO::getOrganId, organId)
.eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.CUSTOM)
)
.or(wrapper -> wrapper
.eq(ReportTemplateDO::getOrganId, CF_ORGANID)
.eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.SYSTEM)
)
);
return selectOne(queryWrapper);
.eq(ReportTemplateDO::getOrganId, organId)
.eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.CUSTOM);
result = selectOne(customWrapper);
// 2. 查不到再查 SYSTEM(固定组织)
if (result == null) {
LambdaQueryWrapper<ReportTemplateDO> systemWrapper = new LambdaQueryWrapper<ReportTemplateDO>()
.eq(ReportTemplateDO::getId, id)
.eq(ReportTemplateDO::getOrganId, CF_ORGANID)
.eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.SYSTEM);
result = selectOne(systemWrapper);
}
return result;
}
/**
@@ -57,22 +70,55 @@ public interface ReportTemplateMapper extends BaseMapperX<ReportTemplateDO> {
*/
@OrganIgnore
default List<ReportTemplateDO> selectNormalTemplateList(String name, Long organId) {
LambdaQueryWrapper<ReportTemplateDO> queryWrapper = new LambdaQueryWrapperX<ReportTemplateDO>()
.likeIfPresent(ReportTemplateDO::getName, name)
.orderByDesc(ReportTemplateDO::getCreateTime)
.and(wr -> wr
.or(wrapper -> wrapper
.eq(ReportTemplateDO::getOrganId, organId)
.eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.CUSTOM)
List<ReportTemplateDO> result = new ArrayList<>();
// 1. CUSTOM(当前组织)
List<ReportTemplateDO> customList = selectList(
new LambdaQueryWrapperX<ReportTemplateDO>()
.likeIfPresent(ReportTemplateDO::getName, name)
.eq(ReportTemplateDO::getOrganId, organId)
.eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.CUSTOM)
.select(
ReportTemplateDO::getId,
ReportTemplateDO::getName,
ReportTemplateDO::getCreateTime,
ReportTemplateDO::getRemark,
ReportTemplateDO::getType
)
.or(wrapper -> wrapper
.eq(ReportTemplateDO::getOrganId, CF_ORGANID)
.eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.SYSTEM)
);
// 2. SYSTEM(系统模板)
List<ReportTemplateDO> systemList = selectList(
new LambdaQueryWrapperX<ReportTemplateDO>()
.likeIfPresent(ReportTemplateDO::getName, name)
.eq(ReportTemplateDO::getOrganId, CF_ORGANID)
.eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.SYSTEM)
.select(
ReportTemplateDO::getId,
ReportTemplateDO::getName,
ReportTemplateDO::getCreateTime,
ReportTemplateDO::getRemark,
ReportTemplateDO::getType
)
)
// 不返回content xml,点击具体的模板中返回xml
.select(ReportTemplateDO::getId, ReportTemplateDO::getName, ReportTemplateDO::getCreateTime, ReportTemplateDO::getRemark, ReportTemplateDO::getType);
return selectList(queryWrapper);
);
// 3. 合并(去重,防止 id 冲突)
Map<Long, ReportTemplateDO> map = new LinkedHashMap<>();
if (CollUtil.isNotEmpty(customList)) {
customList.forEach(e -> map.put(e.getId(), e));
}
if (CollUtil.isNotEmpty(systemList)) {
systemList.forEach(e -> map.putIfAbsent(e.getId(), e));
}
result.addAll(map.values());
// 4. 排序(保持原 SQL 行为)
result.sort(Comparator.comparing(ReportTemplateDO::getCreateTime).reversed());
return result;
}
/**
@@ -50,6 +50,7 @@ import java.sql.Connection;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -145,30 +146,59 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService {
@OrganIgnore
public List<ReportDatasourceDO> getDatasourceList(Long organId) {
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
LambdaQueryWrapper<ReportDatasourceDO> queryWrapper = new LambdaQueryWrapperX<ReportDatasourceDO>().orderByDesc(ReportDatasourceDO::getCreateTime);
// 当前登录人机构id
Long currentOrganId = loginUser.getOrganId();
// 超管查看不同组织数据源
if (ObjectUtil.isNotNull(loginUser) && Boolean.TRUE.equals(loginUser.getIsSupAdmin()) && ObjectUtil.isNotNull(organId)) {
// 超管可以切换组织
if (ObjectUtil.isNotNull(loginUser)
&& Boolean.TRUE.equals(loginUser.getIsSupAdmin())
&& ObjectUtil.isNotNull(organId)) {
currentOrganId = organId;
}
Long finalCurrentOrganId = currentOrganId;
queryWrapper.or(wrapper -> wrapper
.eq(ReportDatasourceDO::getOrganId, finalCurrentOrganId)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM))
.or(wrapper -> wrapper
// ======================
// 1. CUSTOM(当前组织)
// ======================
List<ReportDatasourceDO> customList = datasourceMapper.selectList(
new LambdaQueryWrapperX<ReportDatasourceDO>()
.eq(ReportDatasourceDO::getOrganId, currentOrganId)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM)
.orderByDesc(ReportDatasourceDO::getCreateTime)
);
// ======================
// 2. SYSTEM(固定组织)
// ======================
List<ReportDatasourceDO> systemList = datasourceMapper.selectList(
new LambdaQueryWrapperX<ReportDatasourceDO>()
.eq(ReportDatasourceDO::getOrganId, CF_ORGANID)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM)
);
.orderByDesc(ReportDatasourceDO::getCreateTime)
);
List<ReportDatasourceDO> reportDatasourceDOS = datasourceMapper.selectList(queryWrapper);
// 查询数据集
if (CollUtil.isNotEmpty(reportDatasourceDOS)) {
reportDatasourceDOS.forEach(reportDatasourceDO -> {
queryDatasetInSource(reportDatasourceDO);
});
// ======================
// 3. 合并 + 去重
// ======================
Map<Long, ReportDatasourceDO> map = new LinkedHashMap<>();
if (CollUtil.isNotEmpty(customList)) {
customList.forEach(e -> map.put(e.getId(), e));
}
return reportDatasourceDOS;
if (CollUtil.isNotEmpty(systemList)) {
systemList.forEach(e -> map.putIfAbsent(e.getId(), e));
}
List<ReportDatasourceDO> result = new ArrayList<>(map.values());
// ======================
// 4. 查询 dataset(保持原逻辑)
// ======================
if (CollUtil.isNotEmpty(result)) {
result.forEach(this::queryDatasetInSource);
}
return result;
}
@Override