diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java index c36eba371..bb15f22fe 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetSaveReqVO.java @@ -56,7 +56,7 @@ public class ReportDatasetSaveReqVO implements Serializable { private List parameters = new ArrayList<>(); @Schema(description = "字段列表") - @Size(max = 30, message = "字段列表数量不能超过30个") + @Size(max = 100, message = "字段列表数量不能超过100个") @Valid private List fields = new ArrayList<>(); } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java index e5272def7..e2800af05 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java @@ -2,7 +2,6 @@ package com.cf.imes.module.report.controller.admin.datasource; import com.bstek.common.utils.MultipleJdbcTemplate; import com.bstek.datasource.bean.DataSourceInfo; -import com.bstek.datasource.bean.PreviewParams; import com.bstek.datasource.service.DataSourceService; import com.bstek.ureport.definition.dataset.Field; import com.cf.imes.framework.common.pojo.CommonResult; @@ -14,6 +13,7 @@ import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasource import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceTestConnReqVO; import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; import com.cf.imes.module.report.service.datasource.ReportDatasourceService; +import com.cf.imes.module.report.utils.TenantParamsUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -51,6 +51,9 @@ public class ReportDatasourceController { @Resource private DataSourceService ureportDataSourceService; + @Resource + private TenantParamsUtils tenantParamsUtils; + @PutMapping("/datasource") @Operation(summary = "创建报表数据源") @PreAuthorize("@ss.hasPermission('report:design')") @@ -134,13 +137,13 @@ public class ReportDatasourceController { @Operation(summary = "获取数据源表字段") @PreAuthorize("@ss.hasPermission('report:design')") public CommonResult> getDatasourceTableFields(@RequestBody @Valid ReportDatasourcePreviewReqVO reqVO) { - return success(datasourceService.getTableFields(BeanUtils.toBean(reqVO, PreviewParams.class))); + return success(datasourceService.getTableFields(tenantParamsUtils.prepareTenantParam(reqVO))); } @PostMapping("/datasource/preview") @Operation(summary = "数据源预览") @PreAuthorize("@ss.hasPermission('report:design')") public CommonResult> previewData(@RequestBody @Valid ReportDatasourcePreviewReqVO reqVO) { - return success(ureportDataSourceService.previewData(BeanUtils.toBean(reqVO, PreviewParams.class))); + return success(ureportDataSourceService.previewData(tenantParamsUtils.prepareTenantParam(reqVO))); } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourcePreviewReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourcePreviewReqVO.java index a90a1a37c..9ff4a8a3c 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourcePreviewReqVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourcePreviewReqVO.java @@ -24,7 +24,7 @@ import java.util.List; @NoArgsConstructor public class ReportDatasourcePreviewReqVO { @Schema(description = "数据源连接信息") - @NotNull + @NotNull(message = "数据源连接信息不能为空") @Valid private ReportDatasourceTestConnReqVO info; @@ -37,4 +37,8 @@ public class ReportDatasourcePreviewReqVO { @Size(max = 30, message = "查询参数列表数量不能超过30个") @Valid private List parameters; + + @Schema(description = "数据源编号") + @NotNull(message = "数据源编号不能为空") + private Long datasourceId; } 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 9dfd34eb1..d25e1bb2a 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 @@ -13,7 +13,6 @@ import com.bstek.datasource.bean.PreviewParams; import com.bstek.ureport.definition.dataset.Field; import com.bstek.ureport.definition.dataset.Parameter; import com.bstek.ureport.definition.dataset.SqlDatasetDefinition; -import com.bstek.ureport.definition.dataset.TenantParams; import com.bstek.ureport.utils.ProcedureUtils; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; @@ -237,7 +236,7 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { Map params = new HashMap<>(); Map pmap = sqlDatasetDefinition.buildParameters(params); - String sqlForUse = sqlDatasetDefinition.parseSql(pmap, new TenantParams()); + String sqlForUse = sqlDatasetDefinition.parseSql(pmap, previewParams.getTenantParams()); if (ProcedureUtils.isProcedure(sqlForUse)) { return ProcedureUtils.procedureColumnsQuery(sqlForUse, pmap, conn); } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java index 991221db0..bb4201bb5 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java @@ -35,7 +35,6 @@ import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.security.core.LoginUser; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; -import com.cf.imes.module.report.config.CfReportProperties; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplatePreviewReqVO; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateReqVO; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateRespVO; @@ -47,6 +46,7 @@ import com.cf.imes.module.report.dal.mysql.dataset.ReportDatasetMapper; import com.cf.imes.module.report.dal.mysql.datasource.ReportDatasourceMapper; import com.cf.imes.module.report.dal.mysql.template.ReportTemplateMapper; import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; +import com.cf.imes.module.report.utils.TenantParamsUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -66,7 +66,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; -import java.util.stream.Collectors; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR; @@ -95,7 +94,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { private static final String UTF8_CHARSET = CharsetUtil.UTF_8; @Resource - private CfReportProperties cfReportProperties; + private TenantParamsUtils tenantParamsUtils; @Override @Transactional(rollbackFor = Exception.class) @@ -380,47 +379,11 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { ReportDefinition reportDefinition = getReportDefinition(reportRender, params); Map parameters = params.getQuery(); // 增加多租户参数 - prepareTenantParam(parameters); + tenantParamsUtils.prepareTenantParam(parameters); Report report = reportRender.render(reportDefinition, parameters); return htmlProducer.produce(reportDefinition, report); } - - /** - * 往parameters中增加租户相关参数 - * - * @param parameters - */ - private void prepareTenantParam(Map parameters) { - Long userOrganId = SecurityFrameworkUtils.getUserOrganId(); - if (Boolean.FALSE.equals(SecurityFrameworkUtils.isSuperAdmin())) { - // 根据前端传递的数据集id,判断是不是内置数据源下的,是就把name传给ureport - List datasetIds = (List) parameters.get("datasetIds"); - if (CollUtil.isNotEmpty(datasetIds)) { - // 内置数据集名称列表 - List buildinDsNames = new ArrayList<>(); - // 遍历获取所有上级数据源 - List reportDatasetDOS = datasetMapper.selectNormalDatasetList(datasetIds.stream().collect(Collectors.toSet())); - for (ReportDatasetDO datasetDO : reportDatasetDOS) { - Long datasourceId = datasetDO.getDatasourceId(); - // 查询数据源,如果是内置数据源则把数据集的name传给ureport - // 机构下 + 内置数据源查询 - ReportDatasourceDO datasourceDO = datasourceMapper.selectNormalDatasourceById(datasourceId, userOrganId); - if (ObjectUtil.isNotNull(datasourceDO) && ObjectUtil.equal(datasourceDO.getBuildinType(), ReportTemplateTypeEnum.SYSTEM)) { - buildinDsNames.add(datasetDO.getName()); - } - } - if (CollUtil.isNotEmpty(buildinDsNames)) { - parameters.put("buildinDsNames", buildinDsNames); - } - } - // imes多租户业务表表名列表 - parameters.put("tenantTableNames", cfReportProperties.getTenantTableNames()); - // 用户组织id - parameters.put("organId", userOrganId); - } - } - @Override public void print(ReportTemplatePreviewReqVO reqVO, HttpServletResponse response) { // 自定义请求vo转ureport对象 @@ -431,7 +394,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { ReportDefinition reportDefinition = getReportDefinition(reportRender, params); Map query = params.getQuery(); // 增加多租户参数 - prepareTenantParam(query); + tenantParamsUtils.prepareTenantParam(query); Report report = reportRender.render(reportDefinition, query); Map chartImages = params.getChartImages(); report.setChartImages(chartImages); @@ -461,7 +424,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { ReportDefinition reportDefinition = getReportDefinition(reportRender, params); Map query = params.getQuery(); // 增加多租户参数 - prepareTenantParam(query); + tenantParamsUtils.prepareTenantParam(query); Report report = reportRender.render(reportDefinition, query); Map chartImages = params.getChartImages(); report.setChartImages(chartImages); diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/utils/TenantParamsUtils.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/utils/TenantParamsUtils.java new file mode 100644 index 000000000..8493278ac --- /dev/null +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/utils/TenantParamsUtils.java @@ -0,0 +1,102 @@ +package com.cf.imes.module.report.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.bstek.datasource.bean.PreviewParams; +import com.bstek.ureport.definition.dataset.TenantParams; +import com.cf.imes.framework.common.util.object.BeanUtils; +import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; +import com.cf.imes.module.report.config.CfReportProperties; +import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourcePreviewReqVO; +import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO; +import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; +import com.cf.imes.module.report.dal.mysql.dataset.ReportDatasetMapper; +import com.cf.imes.module.report.dal.mysql.datasource.ReportDatasourceMapper; +import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 租户参数工具类 + * + * @author Gqr + * @since 2024/11/27 10:32 + */ +@Component +public class TenantParamsUtils { + + @Resource + private ReportDatasourceMapper datasourceMapper; + + @Resource + private ReportDatasetMapper datasetMapper; + + @Resource + private CfReportProperties cfReportProperties; + + /** + * 根据数据源id构造租户对象 + * + * @param reqVO + */ + public PreviewParams prepareTenantParam(ReportDatasourcePreviewReqVO reqVO) { + PreviewParams previewParams = BeanUtils.toBean(reqVO, PreviewParams.class); + Long datasourceId = reqVO.getDatasourceId(); + TenantParams tenantParams = new TenantParams(); + Long userOrganId = SecurityFrameworkUtils.getUserOrganId(); + // 根据前端传递的数据源id,判断是不是内置数据源,是就把所有其下的datasetname传给ureport + ReportDatasourceDO datasourceDO = datasourceMapper.selectNormalDatasourceById(datasourceId, userOrganId); + if (ObjectUtil.isNotNull(datasourceDO) && ObjectUtil.equal(datasourceDO.getBuildinType(), ReportTemplateTypeEnum.SYSTEM)) { + List datasetDOList = datasetMapper.selectList(new LambdaQueryWrapperX().in(ReportDatasetDO::getDatasourceId, datasourceId)); + if (CollUtil.isNotEmpty(datasetDOList)) { + tenantParams.setBuildinDsNames(datasetDOList.stream().map(ReportDatasetDO::getName).collect(Collectors.toList())); + } + } + // 用户组织id + tenantParams.setOrganId(userOrganId); + // imes多租户业务表表名列表 + tenantParams.setTenantTableNames(cfReportProperties.getTenantTableNames()); + previewParams.setTenantParams(tenantParams); + return previewParams; + } + + /** + * 往parameters中增加租户相关参数 + * + * @param parameters + */ + public void prepareTenantParam(Map parameters) { + Long userOrganId = SecurityFrameworkUtils.getUserOrganId(); + // 根据前端传递的数据集id,判断是不是内置数据源下的,是就把name传给ureport + List datasetIds = (List) parameters.get("datasetIds"); + if (CollUtil.isNotEmpty(datasetIds)) { + // 内置数据集名称列表 + List buildinDsNames = new ArrayList<>(); + // 遍历获取所有上级数据源 + List reportDatasetDOS = datasetMapper.selectNormalDatasetList(datasetIds.stream().collect(Collectors.toSet())); + for (ReportDatasetDO datasetDO : reportDatasetDOS) { + Long datasourceId = datasetDO.getDatasourceId(); + // 查询数据源,如果是内置数据源则把数据集的name传给ureport + // 机构下 + 内置数据源查询 + ReportDatasourceDO datasourceDO = datasourceMapper.selectNormalDatasourceById(datasourceId, userOrganId); + if (ObjectUtil.isNotNull(datasourceDO) && ObjectUtil.equal(datasourceDO.getBuildinType(), ReportTemplateTypeEnum.SYSTEM)) { + buildinDsNames.add(datasetDO.getName()); + } + } + if (CollUtil.isNotEmpty(buildinDsNames)) { + parameters.put("buildinDsNames", buildinDsNames); + } + } + // imes多租户业务表表名列表 + parameters.put("tenantTableNames", cfReportProperties.getTenantTableNames()); + // 用户组织id + parameters.put("organId", userOrganId); + } + +} diff --git a/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar b/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar index 8e8acf0b4..6121e521a 100644 Binary files a/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar and b/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar differ