报表模块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; 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.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.organ.core.aop.OrganIgnore; 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 com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@@ -30,17 +32,27 @@ public interface ReportDatasourceMapper extends BaseMapperX<ReportDatasourceDO>
*/ */
@OrganIgnore @OrganIgnore
default ReportDatasourceDO selectNormalDatasourceById(Long id, Long organId) { 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) .eq(ReportDatasourceDO::getId, id)
.and(wr -> wr
.or(wrapper -> wrapper
.eq(ReportDatasourceDO::getOrganId, organId) .eq(ReportDatasourceDO::getOrganId, organId)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM)) .eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM);
.or(wrapper -> wrapper
.eq(ReportDatasourceDO::getOrganId, 1L) result = selectOne(customWrapper);
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM))
); // 2. 如果 CUSTOM 没查到,再查 SYSTEM(固定组织)
return selectOne(queryWrapper); 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 @OrganIgnore
default List<ReportDatasourceDO> selectNormalDatasourceList(Set<Long> datasourceIds, Long organId) { default List<ReportDatasourceDO> selectNormalDatasourceList(Set<Long> datasourceIds, Long organId) {
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<ReportDatasourceDO>() List<ReportDatasourceDO> result = new ArrayList<>();
// 1. CUSTOM(当前组织)
List<ReportDatasourceDO> customList = selectList(
new LambdaQueryWrapper<ReportDatasourceDO>()
.in(ReportDatasourceDO::getId, datasourceIds) .in(ReportDatasourceDO::getId, datasourceIds)
.and(wr -> wr.or(wrapper -> wrapper
.eq(ReportDatasourceDO::getOrganId, organId) .eq(ReportDatasourceDO::getOrganId, organId)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM)) .eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM)
.or(wrapper -> wrapper );
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::getOrganId, CF_ORGANID)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM))); .eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM)
return selectList(queryWrapper); );
if (CollUtil.isNotEmpty(systemList)) {
result.addAll(systemList);
}
return result;
} }
} }
@@ -1,5 +1,6 @@
package com.cf.imes.module.report.dal.mysql.template; 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.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; 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.Mapper;
import org.apache.ibatis.annotations.Param; 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.List;
import java.util.Map;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.CF_ORGANID; import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.CF_ORGANID;
@@ -32,19 +37,27 @@ public interface ReportTemplateMapper extends BaseMapperX<ReportTemplateDO> {
*/ */
@OrganIgnore @OrganIgnore
default ReportTemplateDO selectNormalTemplateById(Long id, Long organId) { 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) .eq(ReportTemplateDO::getId, id)
.and(wr -> wr
.or(wrapper -> wrapper
.eq(ReportTemplateDO::getOrganId, organId) .eq(ReportTemplateDO::getOrganId, organId)
.eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.CUSTOM) .eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.CUSTOM);
)
.or(wrapper -> wrapper 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::getOrganId, CF_ORGANID)
.eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.SYSTEM) .eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.SYSTEM);
)
); result = selectOne(systemWrapper);
return selectOne(queryWrapper); }
return result;
} }
/** /**
@@ -57,22 +70,55 @@ public interface ReportTemplateMapper extends BaseMapperX<ReportTemplateDO> {
*/ */
@OrganIgnore @OrganIgnore
default List<ReportTemplateDO> selectNormalTemplateList(String name, Long organId) { default List<ReportTemplateDO> selectNormalTemplateList(String name, Long organId) {
LambdaQueryWrapper<ReportTemplateDO> queryWrapper = new LambdaQueryWrapperX<ReportTemplateDO>() List<ReportTemplateDO> result = new ArrayList<>();
// 1. CUSTOM(当前组织)
List<ReportTemplateDO> customList = selectList(
new LambdaQueryWrapperX<ReportTemplateDO>()
.likeIfPresent(ReportTemplateDO::getName, name) .likeIfPresent(ReportTemplateDO::getName, name)
.orderByDesc(ReportTemplateDO::getCreateTime)
.and(wr -> wr
.or(wrapper -> wrapper
.eq(ReportTemplateDO::getOrganId, organId) .eq(ReportTemplateDO::getOrganId, organId)
.eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.CUSTOM) .eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.CUSTOM)
.select(
ReportTemplateDO::getId,
ReportTemplateDO::getName,
ReportTemplateDO::getCreateTime,
ReportTemplateDO::getRemark,
ReportTemplateDO::getType
) )
.or(wrapper -> wrapper );
// 2. SYSTEM(系统模板)
List<ReportTemplateDO> systemList = selectList(
new LambdaQueryWrapperX<ReportTemplateDO>()
.likeIfPresent(ReportTemplateDO::getName, name)
.eq(ReportTemplateDO::getOrganId, CF_ORGANID) .eq(ReportTemplateDO::getOrganId, CF_ORGANID)
.eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.SYSTEM) .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); // 3. 合并(去重,防止 id 冲突)
return selectList(queryWrapper); 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.sql.ResultSetMetaData;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -145,30 +146,59 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService {
@OrganIgnore @OrganIgnore
public List<ReportDatasourceDO> getDatasourceList(Long organId) { public List<ReportDatasourceDO> getDatasourceList(Long organId) {
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
LambdaQueryWrapper<ReportDatasourceDO> queryWrapper = new LambdaQueryWrapperX<ReportDatasourceDO>().orderByDesc(ReportDatasourceDO::getCreateTime);
// 当前登录人机构id
Long currentOrganId = loginUser.getOrganId(); 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; currentOrganId = organId;
} }
Long finalCurrentOrganId = currentOrganId;
queryWrapper.or(wrapper -> wrapper // ======================
.eq(ReportDatasourceDO::getOrganId, finalCurrentOrganId) // 1. CUSTOM(当前组织)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM)) // ======================
.or(wrapper -> wrapper List<ReportDatasourceDO> customList = datasourceMapper.selectList(
.eq(ReportDatasourceDO::getOrganId, CF_ORGANID) new LambdaQueryWrapperX<ReportDatasourceDO>()
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM) .eq(ReportDatasourceDO::getOrganId, currentOrganId)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM)
.orderByDesc(ReportDatasourceDO::getCreateTime)
); );
List<ReportDatasourceDO> reportDatasourceDOS = datasourceMapper.selectList(queryWrapper); // ======================
// 查询数据集 // 2. SYSTEM(固定组织)
if (CollUtil.isNotEmpty(reportDatasourceDOS)) { // ======================
reportDatasourceDOS.forEach(reportDatasourceDO -> { List<ReportDatasourceDO> systemList = datasourceMapper.selectList(
queryDatasetInSource(reportDatasourceDO); new LambdaQueryWrapperX<ReportDatasourceDO>()
}); .eq(ReportDatasourceDO::getOrganId, CF_ORGANID)
.eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM)
.orderByDesc(ReportDatasourceDO::getCreateTime)
);
// ======================
// 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 @Override