diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/datasource/ReportDatasourceMapper.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/datasource/ReportDatasourceMapper.java index 9009d23e8..d826bff88 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/datasource/ReportDatasourceMapper.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/datasource/ReportDatasourceMapper.java @@ -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 */ @OrganIgnore default ReportDatasourceDO selectNormalDatasourceById(Long id, Long organId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + ReportDatasourceDO result = null; + + // 1. 先查 CUSTOM(当前组织) + LambdaQueryWrapper customWrapper = new LambdaQueryWrapper() .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 systemWrapper = new LambdaQueryWrapper() + .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 */ @OrganIgnore default List selectNormalDatasourceList(Set datasourceIds, Long organId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() - .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 result = new ArrayList<>(); + + // 1. CUSTOM(当前组织) + List customList = selectList( + new LambdaQueryWrapper() + .in(ReportDatasourceDO::getId, datasourceIds) + .eq(ReportDatasourceDO::getOrganId, organId) + .eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM) + ); + + if (CollUtil.isNotEmpty(customList)) { + result.addAll(customList); + } + + // 2. SYSTEM(固定组织) + List systemList = selectList( + new LambdaQueryWrapper() + .in(ReportDatasourceDO::getId, datasourceIds) + .eq(ReportDatasourceDO::getOrganId, CF_ORGANID) + .eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM) + ); + + if (CollUtil.isNotEmpty(systemList)) { + result.addAll(systemList); + } + + return result; } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/template/ReportTemplateMapper.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/template/ReportTemplateMapper.java index a21f6a27a..5f573d2de 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/template/ReportTemplateMapper.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/template/ReportTemplateMapper.java @@ -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 { */ @OrganIgnore default ReportTemplateDO selectNormalTemplateById(Long id, Long organId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + ReportTemplateDO result = null; + + // 1. 先查 CUSTOM(当前组织) + LambdaQueryWrapper customWrapper = new LambdaQueryWrapper() .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 systemWrapper = new LambdaQueryWrapper() + .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 { */ @OrganIgnore default List selectNormalTemplateList(String name, Long organId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapperX() - .likeIfPresent(ReportTemplateDO::getName, name) - .orderByDesc(ReportTemplateDO::getCreateTime) - .and(wr -> wr - .or(wrapper -> wrapper - .eq(ReportTemplateDO::getOrganId, organId) - .eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.CUSTOM) + List result = new ArrayList<>(); + + // 1. CUSTOM(当前组织) + List customList = selectList( + new LambdaQueryWrapperX() + .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 systemList = selectList( + new LambdaQueryWrapperX() + .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 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; } /** diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java index 8a5efb28c..f35122229 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java @@ -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 getDatasourceList(Long organId) { LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapperX().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 customList = datasourceMapper.selectList( + new LambdaQueryWrapperX() + .eq(ReportDatasourceDO::getOrganId, currentOrganId) + .eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.CUSTOM) + .orderByDesc(ReportDatasourceDO::getCreateTime) + ); + + // ====================== + // 2. SYSTEM(固定组织) + // ====================== + List systemList = datasourceMapper.selectList( + new LambdaQueryWrapperX() .eq(ReportDatasourceDO::getOrganId, CF_ORGANID) .eq(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM) - ); + .orderByDesc(ReportDatasourceDO::getCreateTime) + ); - List reportDatasourceDOS = datasourceMapper.selectList(queryWrapper); - // 查询数据集 - if (CollUtil.isNotEmpty(reportDatasourceDOS)) { - reportDatasourceDOS.forEach(reportDatasourceDO -> { - queryDatasetInSource(reportDatasourceDO); - }); + // ====================== + // 3. 合并 + 去重 + // ====================== + Map 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 result = new ArrayList<>(map.values()); + + // ====================== + // 4. 查询 dataset(保持原逻辑) + // ====================== + if (CollUtil.isNotEmpty(result)) { + result.forEach(this::queryDatasetInSource); + } + + return result; } @Override