From 3adf2c7b226908ed9c2b0686dab39b4873c2e8f1 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Thu, 5 Sep 2024 21:51:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=9F=BA=E7=A1=80=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=EF=BC=9A1=E3=80=81=E6=8A=A5=E8=A1=A8=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E6=96=B0=E5=A2=9Edatasourceids=E3=80=81datasetids?= =?UTF-8?q?=EF=BC=9B2=E3=80=81=E6=95=B0=E6=8D=AE=E6=BA=90=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E4=BE=9D=E8=B5=96=E6=A8=A1=E6=9D=BF=EF=BC=8C=E7=8B=AC?= =?UTF-8?q?=E7=AB=8B=E5=AD=98=E5=9C=A8=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataset/vo/ReportDatasetSaveReqVO.java | 2 + .../ReportDatasourceController.java | 9 +- .../vo/ReportDatasourceSaveReqVO.java | 10 +- .../template/vo/ReportTemplateSaveReqVO.java | 12 +- .../datasource/ReportDatasourceDO.java | 5 +- .../dataobject/template/ReportTemplateDO.java | 15 ++ .../dataset/ReportDatasetServiceImpl.java | 29 ++-- .../datasource/ReportDatasourceService.java | 2 +- .../ReportDatasourceServiceImpl.java | 107 ++++++------ .../template/ReportTemplateServiceImpl.java | 152 ++++-------------- .../template/ReportCommonServiceImplTest.java | 3 - .../ReportDatasourceServiceImplTest.java | 2 +- 12 files changed, 129 insertions(+), 219 deletions(-) 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 dfc4eb8eb..4c7b44432 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 @@ -6,6 +6,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import javax.validation.constraints.NotNull; import java.io.Serial; import java.io.Serializable; import java.util.ArrayList; @@ -31,6 +32,7 @@ public class ReportDatasetSaveReqVO implements Serializable { private String name; @Schema(description = "数据源id", example = "1") + @NotNull(message = "数据源id不能为空") private Long datasourceId; @Schema(description = "动态查询SQL") 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 29fd669cb..44c5bc9af 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 @@ -82,12 +82,11 @@ public class ReportDatasourceController { return success(BeanUtils.toBean(datasource, ReportDatasourceRespVO.class)); } - @GetMapping("/{templateId}/datasources") - @Operation(summary = "获取报表模板下的报表数据源") + @GetMapping("/datasources") + @Operation(summary = "获取报表数据源") // @PreAuthorize("@ss.hasPermission('report:datasource:query')") - @Parameter(name = "templateId", description = "模版id", required = true) - public CommonResult> getDatasourcePage(@PathVariable(value = "templateId") Long templateId) { - return success(BeanUtils.toBean(datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(templateId).build()), ReportDatasourceRespVO.class)); + public CommonResult> getDatasourcePage() { + return success(BeanUtils.toBean(datasourceService.getDatasourceList(), ReportDatasourceRespVO.class)); } @GetMapping("/datasource/beans") diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java index 246a8badf..c97a4ee05 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceSaveReqVO.java @@ -2,6 +2,7 @@ package com.cf.imes.module.report.controller.admin.datasource.vo; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO; import com.cf.imes.module.report.validation.datasource.ReportDatasourceTypeInEnum; +import com.cf.imes.module.report.validation.template.ReportTemplateTypeInEnum; import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; @@ -31,9 +32,6 @@ public class ReportDatasourceSaveReqVO implements Serializable { @Schema(description = "数据源id", example = "1") private Long id; - @Schema(description = "模板id", example = "1") - private Long templateId; - @Schema(description = "数据源名称", example = "测试库") private String name; @@ -41,7 +39,8 @@ public class ReportDatasourceSaveReqVO implements Serializable { @ReportDatasourceTypeInEnum private String type; - @JsonIgnore + @Schema(description = "内置数据源类型,0是、1否", example = "1") + @ReportTemplateTypeInEnum private Integer buildinType; @Schema(description = "spring型数据源id") @@ -62,9 +61,6 @@ public class ReportDatasourceSaveReqVO implements Serializable { @Schema(description = "备注", example = "该模板仅供生产使用") private String remark; - @Schema(description = "数据集") - private List datasets = new ArrayList<>(); - @Schema(description = "请求头参数") private List> headers; } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java index 963a4ff30..9ac133146 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java @@ -1,14 +1,13 @@ package com.cf.imes.module.report.controller.admin.template.vo; -import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.ArrayList; import java.util.List; +import java.util.Set; /** * @author Gqr @@ -30,9 +29,12 @@ public class ReportTemplateSaveReqVO { @Schema(description = "报表模板") private String content; - @Schema(description = "数据源") - private List datasource = new ArrayList<>(); - @Schema(description = "备注", example = "该模板仅供生产使用") private String remark; + + @Schema(description = "数据源id列表") + private Set datasourceIds; + + @Schema(description = "数据集id列表") + private Set datasetIds; } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java index 8fb10e773..8c38c4dd6 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/datasource/ReportDatasourceDO.java @@ -39,10 +39,7 @@ public class ReportDatasourceDO extends BaseDO { */ @TableId private Long id; - /** - * 模板id - */ - private Long templateId; + /** * 数据源名称 */ diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java index f621abe5c..502f4d929 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java @@ -3,11 +3,14 @@ package com.cf.imes.module.report.dal.dataobject.template; import com.baomidou.mybatisplus.annotation.*; import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; import com.cf.imes.framework.mybatis.core.type.CompressStringTypeHandler; +import com.cf.imes.framework.mybatis.core.type.JsonLongSetTypeHandler; +import com.cf.imes.framework.mybatis.core.type.LongListTypeHandler; import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; import lombok.*; import java.util.List; +import java.util.Set; /** * 报表模板信息DO @@ -57,4 +60,16 @@ public class ReportTemplateDO extends BaseDO { */ @TableField(exist = false) private List datasource; + + /** + * 数据源id列表 + */ + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set datasourceIds; + + /** + * 数据集id列表 + */ + @TableField(typeHandler = JsonLongSetTypeHandler.class) + private Set datasetIds; } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java index e41d1bd8e..b7b5f24c4 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java @@ -4,16 +4,13 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; 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.controller.admin.dataset.vo.ReportDatasetReqVO; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO; 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.dataobject.template.ReportTemplateDO; 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 org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -23,9 +20,8 @@ import java.util.List; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_NOT_EXISTS; +import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_NOT_EXISTS; -import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR; -import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EXISTS; /** * 报表数据集 Service 实现类 @@ -36,9 +32,6 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EX @Service @Validated public class ReportDatasetServiceImpl implements ReportDatasetService { - @Resource - private ReportTemplateMapper reportTemplateMapper; - @Resource private ReportDatasourceMapper reportDatasourceMapper; @@ -49,6 +42,8 @@ public class ReportDatasetServiceImpl implements ReportDatasetService { public Long createDataset(ReportDatasetSaveReqVO createReqVO) { // 插入 ReportDatasetDO dataset = BeanUtils.toBean(createReqVO, ReportDatasetDO.class); + // 校验内置模板操作权限 + validateSystemDataset(createReqVO.getDatasourceId()); datasetMapper.insert(dataset); // 返回 return dataset.getId(); @@ -66,6 +61,8 @@ public class ReportDatasetServiceImpl implements ReportDatasetService { public void updateDataset(ReportDatasetSaveReqVO updateReqVO) { // 校验存在 validateDatasetExists(updateReqVO.getId()); + // 校验内置模板操作权限 + validateSystemDataset(updateReqVO.getDatasourceId()); // 更新 ReportDatasetDO updateObj = BeanUtils.toBean(updateReqVO, ReportDatasetDO.class); datasetMapper.updateById(updateObj); @@ -84,7 +81,7 @@ public class ReportDatasetServiceImpl implements ReportDatasetService { // 校验存在 ReportDatasetDO reportDatasetDO = validateDatasetExists(id); // 校验内置模板操作权限 - validateSystemTemplate(reportDatasetDO.getDatasourceId()); + validateSystemDataset(reportDatasetDO.getDatasourceId()); // 删除 datasetMapper.deleteById(id); } @@ -99,24 +96,18 @@ public class ReportDatasetServiceImpl implements ReportDatasetService { } /** - * 校验只有超管可以操作内置模板 + * 校验只有超管可以操作内置数据源 * * @param datasourceId 数据源id */ - private void validateSystemTemplate(Long datasourceId) { + private void validateSystemDataset(Long datasourceId) { ReportDatasourceDO reportDatasourceDO = reportDatasourceMapper.selectById(datasourceId); if (ObjectUtil.isNull(reportDatasourceDO)) { throw exception(DATASOURCE_NOT_EXISTS); } - ReportTemplateDO templateDO = reportTemplateMapper.selectById(reportDatasourceDO.getTemplateId()); - if (ObjectUtil.isNull(templateDO)) { - throw exception(TEMPLATE_NOT_EXISTS); - } - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); // 非超管不能操作内置模板 - if (ReportTemplateTypeEnum.SYSTEM.equals(templateDO.getType()) && !isSuperAdmin) { - throw exception(TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR); + if (ReportTemplateTypeEnum.SYSTEM.equals(reportDatasourceDO.getBuildinType()) && Boolean.FALSE.equals(SecurityFrameworkUtils.isSuperAdmin())) { + throw exception(DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR); } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java index 7a71403fd..df1eede30 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java @@ -53,7 +53,7 @@ public interface ReportDatasourceService { * @param reqVO 查询参数 * @return 报表数据源分页 */ - List getTemplateDatasourceList(ReportDatasourceReqVO reqVO); + List getDatasourceList(); /** * 获取springbean数据源列表 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 520208be1..7b000d4c2 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 @@ -4,6 +4,7 @@ import cn.hutool.core.annotation.AnnotationUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.sql.SqlInjectionUtils; import com.bstek.common.exception.ReportDesignException; import com.bstek.common.utils.MultipleJdbcTemplate; @@ -17,16 +18,15 @@ import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.framework.organ.core.aop.OrganIgnore; import com.cf.imes.framework.security.core.LoginUser; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO; import com.cf.imes.module.report.controller.admin.datasource.vo.ReportBeanDatasourceRespVO; -import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceReqVO; import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO; 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.dataobject.template.ReportTemplateDO; 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; @@ -65,8 +65,6 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_BUIL import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_NOT_EXISTS; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRINGBEAN_GET_FAIL; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRINGBEAN_METHODS_GET_FAIL; -import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR; -import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EXISTS; /** * 报表数据源 Service 实现类 @@ -78,9 +76,6 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EX @Validated @Slf4j public class ReportDatasourceServiceImpl implements ReportDatasourceService { - @Resource - private ReportTemplateMapper reportTemplateMapper; - @Resource private ReportDatasourceMapper datasourceMapper; @@ -99,6 +94,8 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { @Override public Long createDatasource(ReportDatasourceSaveReqVO createReqVO) { ReportDatasourceDO datasource = BeanUtils.toBean(createReqVO, ReportDatasourceDO.class); + // 校验内置数据源操作权限 + validateSystemDatasource(createReqVO.getBuildinType()); // 插入 datasourceMapper.insert(datasource); // 返回 @@ -109,6 +106,8 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { public void updateDatasource(ReportDatasourceSaveReqVO updateReqVO) { // 校验存在 validateDatasourceExists(updateReqVO.getId()); + // 校验内置数据源操作权限 + validateSystemDatasource(updateReqVO.getBuildinType()); ReportDatasourceDO updateObj = BeanUtils.toBean(updateReqVO, ReportDatasourceDO.class); // 更新 datasourceMapper.updateById(updateObj); @@ -119,8 +118,8 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { public void deleteDatasource(Long id) { // 校验存在 ReportDatasourceDO reportDatasourceDO = validateDatasourceExists(id); - // 校验内置模板操作权限 - validateSystemTemplate(reportDatasourceDO.getTemplateId()); + // 校验内置数据源操作权限 + validateSystemDatasource(reportDatasourceDO.getBuildinType().getType()); // 删除 datasourceMapper.deleteById(id); // 删除关联数据集 @@ -136,17 +135,25 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { } @Override - public List getTemplateDatasourceList(ReportDatasourceReqVO reqVO) { - List reportDatasourceDOS = datasourceMapper.selectList(new LambdaQueryWrapperX() - .eqIfPresent(ReportDatasourceDO::getTemplateId, reqVO.getTemplateId()) - .likeIfPresent(ReportDatasourceDO::getName, reqVO.getName()) - .orderByDesc(ReportDatasourceDO::getCreateTime)); + @OrganIgnore + public List getDatasourceList() { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapperX().orderByDesc(ReportDatasourceDO::getCreateTime); + if (ObjectUtil.isNotNull(loginUser) && Boolean.FALSE.equals(loginUser.getIsSupAdmin())) { + // 普通用户查看机构下的和system数据源 + queryWrapper.or(wrapper -> wrapper + .eq(ReportDatasourceDO::getOrganId, loginUser.getOrganId()) + .eq(ReportDatasourceDO::getType, ReportTemplateTypeEnum.CUSTOM)) + .or(wrapper -> wrapper.eq(ReportDatasourceDO::getType, ReportTemplateTypeEnum.SYSTEM)); + } + List reportDatasourceDOS = datasourceMapper.selectList(queryWrapper); // 查询数据集 if (CollUtil.isNotEmpty(reportDatasourceDOS)) { reportDatasourceDOS.forEach(reportDatasourceDO -> { queryDatasetInSource(reportDatasourceDO); }); } + // 超管查看全部 return reportDatasourceDOS; } @@ -297,34 +304,34 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { @Override public void saveBuildinDatasources(List buildinDatasources) { - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); - // 非超管不能操作内置模板 - if (!isSuperAdmin) { - throw exception(DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR); - } - // 全删内置数据源 - int deleteNum = datasourceMapper.physicsDeleteBuildinDatasource(); - log.info("[ReportDatasourceService][saveBuildinDatasources]删除内置数据源{}条", deleteNum); - buildinDatasources.forEach(ds -> { - // 新增数据源 - ds.setBuildinType(ReportTemplateTypeEnum.SYSTEM.getType()); - ds.setId(null); - Long datasourceId = createDatasource(ds); - List datasets = ds.getDatasets(); - List batchInsertDataset = new ArrayList<>(); - datasets.forEach(dataset -> { - // 新增数据集 - dataset.setDatasourceId(datasourceId); - dataset.setId(null); - batchInsertDataset.add(dataset); - }); - - // 批量插入数据集 - if (CollUtil.isNotEmpty(batchInsertDataset)) { - datasetService.batchCreateDataset(batchInsertDataset); - } - }); +// LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); +// boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); +// // 非超管不能操作内置模板 +// if (!isSuperAdmin) { +// throw exception(DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR); +// } +// // 全删内置数据源 +// int deleteNum = datasourceMapper.physicsDeleteBuildinDatasource(); +// log.info("[ReportDatasourceService][saveBuildinDatasources]删除内置数据源{}条", deleteNum); +// buildinDatasources.forEach(ds -> { +// // 新增数据源 +// ds.setBuildinType(ReportTemplateTypeEnum.SYSTEM.getType()); +// ds.setId(null); +// Long datasourceId = createDatasource(ds); +// List datasets = ds.getDatasets(); +// List batchInsertDataset = new ArrayList<>(); +// datasets.forEach(dataset -> { +// // 新增数据集 +// dataset.setDatasourceId(datasourceId); +// dataset.setId(null); +// batchInsertDataset.add(dataset); +// }); +// +// // 批量插入数据集 +// if (CollUtil.isNotEmpty(batchInsertDataset)) { +// datasetService.batchCreateDataset(batchInsertDataset); +// } +// }); } /** @@ -355,20 +362,14 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { } /** - * 校验只有超管可以操作内置模板 + * 校验只有超管可以操作内置数据源 * - * @param templateId 模板id + * @param buildinType 内置数据源类型 */ - private void validateSystemTemplate(Long templateId) { - ReportTemplateDO templateDO = reportTemplateMapper.selectById(templateId); - if (ObjectUtil.isNull(templateDO)) { - throw exception(TEMPLATE_NOT_EXISTS); - } - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); + private void validateSystemDatasource(Integer buildinType) { // 非超管不能操作内置模板 - if (ReportTemplateTypeEnum.SYSTEM.equals(templateDO.getType()) && !isSuperAdmin) { - throw exception(TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR); + if (ReportTemplateTypeEnum.SYSTEM.getType().equals(buildinType) && Boolean.FALSE.equals(SecurityFrameworkUtils.isSuperAdmin())) { + throw exception(DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR); } } } 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 c573f0ff5..7df315fff 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 @@ -28,17 +28,12 @@ import com.bstek.ureport.export.html.HtmlReport; import com.bstek.ureport.model.Report; import com.bstek.ureport.parser.ReportParser; import com.bstek.ureport.utils.ToolUtils; -import com.cf.imes.framework.common.util.json.JsonUtils; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.organ.core.aop.OrganIgnore; import com.cf.imes.framework.security.core.LoginUser; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.report.api.template.dto.ReportTemplateGenerateReqDTO; -import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO; -import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO; -import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceReqVO; -import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateReqVO; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateSaveReqVO; import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO; @@ -67,6 +62,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; 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; @@ -85,12 +81,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { @Resource private ReportTemplateMapper templateMapper; - @Resource - private ReportDatasourceService datasourceService; - - @Resource - private ReportDatasetService datasetService; - @Resource private ReportDatasourceMapper datasourceMapper; @@ -120,8 +110,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { } templateMapper.insert(template); Long templateId = template.getId(); - // 解析数据源 - analyzeDatasource(createReqVO.getDatasource(), templateId); // 返回主键 return templateId; } @@ -149,83 +137,11 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { } // 新增模版 templateMapper.insert(copyTemplateDO); - Long newtemplateId = copyTemplateDO.getId(); - - // 复制datasource、dataset - List templateDatasourceList = datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(templateId).build()); - List copyDatasourceList = new ArrayList<>(); - // 遍历数据源 - templateDatasourceList.forEach(ds -> { - ReportDatasourceSaveReqVO copyDatasourceSaveReqVO = JsonUtils.parseObject(JsonUtils.toJsonString(ds), ReportDatasourceSaveReqVO.class); - copyDatasourceSaveReqVO.setId(null); - copyDatasourceSaveReqVO.setTemplateId(newtemplateId); - - List templateDatasetList = ds.getDatasets(); - // 遍历数据集 - if (CollUtil.isNotEmpty(templateDatasetList)) { - List copyDatasetList = new ArrayList<>(); - templateDatasetList.forEach(dt -> { - ReportDatasetSaveReqVO copyDatasetSaveReqVO = BeanUtils.toBean(dt, ReportDatasetSaveReqVO.class); - copyDatasetSaveReqVO.setId(null); - copyDatasetSaveReqVO.setDatasourceId(null); - copyDatasetList.add(copyDatasetSaveReqVO); - }); - copyDatasourceSaveReqVO.setDatasets(copyDatasetList); - } - copyDatasourceList.add(copyDatasourceSaveReqVO); - }); - // 更新数据源 - analyzeDatasource(copyDatasourceList, newtemplateId); // 返回主键 - return newtemplateId; - } - - /** - * 解析数据源集合并入库 - * - * @param datasource 数据源列表 - * @param templateId 模板id - */ - private void analyzeDatasource(List datasource, Long templateId) { - if (CollUtil.isEmpty(datasource)) { - return; - } - datasource.forEach(ds -> { - // 更新/新增数据源 - Long datasourceId; - if (ObjectUtil.isNotNull(ds.getId())) { - datasourceId = ds.getId(); - datasourceService.updateDatasource(ds); - } else { - ds.setTemplateId(templateId); - datasourceId = datasourceService.createDatasource(ds); - } - List datasets = ds.getDatasets(); - List batchInsertDataset = new ArrayList<>(); - List batchupdateDataset = new ArrayList<>(); - datasets.forEach(dataset -> { - // 更新/新增数据集 - if (ObjectUtil.isNotNull(dataset.getId())) { - batchupdateDataset.add(dataset); - } else { - dataset.setDatasourceId(datasourceId); - batchInsertDataset.add(dataset); - } - }); - - // 批量插入数据集 - if (CollUtil.isNotEmpty(batchInsertDataset)) { - datasetService.batchCreateDataset(batchInsertDataset); - } - // 批量更新数据集 - if (CollUtil.isNotEmpty(batchupdateDataset)) { - datasetService.batchUpdateDataset(batchupdateDataset); - } - }); + return copyTemplateDO.getId(); } @Override - @Transactional(rollbackFor = Exception.class) public void updateReportTemplate(ReportTemplateSaveReqVO updateReqVO) { Long templateId = updateReqVO.getId(); // 校验存在 @@ -242,13 +158,9 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 更新模板 ReportTemplateDO updateObj = BeanUtils.toBean(updateReqVO, ReportTemplateDO.class); templateMapper.updateById(updateObj); - - // 更新数据源 - analyzeDatasource(updateReqVO.getDatasource(), templateId); } @Override - @Transactional(rollbackFor = Exception.class) public void deleteReportTemplate(Long id) { // 校验存在 ReportTemplateDO reportTemplateDO = validateTemplateExists(id); @@ -256,15 +168,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { validateSystemTemplate(reportTemplateDO); // 删除 templateMapper.deleteById(id); - // 删除关联数据源 - List reportDatasourceDOS = datasourceMapper.selectList(new LambdaQueryWrapperX().eq(ReportDatasourceDO::getTemplateId, id)); - if (CollUtil.isNotEmpty(reportDatasourceDOS)) { - // 模板下的数据源id - List datasourceIds = reportDatasourceDOS.stream().map(ReportDatasourceDO::getId).toList(); - datasourceMapper.deleteBatchIds(datasourceIds); - // 删除关联数据集 - datasetMapper.delete(new LambdaQueryWrapperX().in(ReportDatasetDO::getDatasourceId, datasourceIds)); - } } @@ -319,16 +222,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { validateTemplateExists(id); // 查询模板 ReportTemplateDO template = templateMapper.selectById(id); - if (ObjectUtil.isNotNull(template)) { - // 查询数据源 - List datasourceList = datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(template.getId()).build()); - datasourceList.forEach(ds -> { - // 查询数据集 - List datasetList = datasetService.getDatasetList(ReportDatasetReqVO.builder().datasourceId(ds.getId()).build()); - ds.setDatasets(datasetList); - }); - template.setDatasource(datasourceList); - } return template; } @@ -348,7 +241,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 解析xml ReportDefinition reportDefinition = new ReportParser().parse(is, template.getName()); if (ObjectUtil.isNotNull(template)) { - queryDatasource(template.getId(), reportDefinition); + queryDatasource(template, reportDefinition); } return new ReportDefinitionWrapper(reportDefinition); } @@ -356,38 +249,55 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { /** * 查询数据源信息(替代ureport xml中的数据源) * - * @param templateId 模板id + * @param templateDO 模板 * @param reportDefinition 报表定义 */ - private void queryDatasource(Long templateId, ReportDefinition reportDefinition) { + private void queryDatasource(ReportTemplateDO templateDO, ReportDefinition reportDefinition) { + Set datasourceIds = templateDO.getDatasourceIds(); + Set datasetIds = templateDO.getDatasetIds(); + List reportDatasourceDOS = new ArrayList<>(); + + if (CollUtil.isNotEmpty(datasourceIds)) { + // 查询模板下的数据源 + reportDatasourceDOS = datasourceMapper.selectList(new LambdaQueryWrapperX().in(ReportDatasourceDO::getId, datasourceIds)); + } + + List reportDatasetDOS = new ArrayList<>(); + if (CollUtil.isNotEmpty(datasetIds)) { + // 查询模板下的数据集 + reportDatasetDOS = datasetMapper.selectList(new LambdaQueryWrapperX().in(ReportDatasetDO::getId, datasetIds)); + } + // 转换ureport对象后的数据源列表 List datasourceDefinitions = new ArrayList<>(); - // 查询数据源 - List datasourceList = datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(templateId).build()); - for (ReportDatasourceDO ds : datasourceList) { - // 查询数据集 - List datasetList = datasetService.getDatasetList(ReportDatasetReqVO.builder().datasourceId(ds.getId()).build()); + + + // 遍历列表转换为ureport对象 + for (ReportDatasourceDO ds : reportDatasourceDOS) { + // 转换ureport对象后的数据集列表 List datasetDefinitions = new ArrayList<>(); + // 匹配数据源下的数据集 + List datasetInDatasourceList = reportDatasetDOS.stream().filter(reportDatasetDO -> ds.getId().equals(reportDatasetDO.getDatasourceId())).toList(); // 忽略转换的字段名,手动转列表 String ignorePropertieName = "datasets"; switch (ds.getType()) { case JDBC -> { // 转换对应的ureport对象 JdbcDatasourceDefinition jdbcDatasourceDefinition = BeanUtil.copyProperties(ds, JdbcDatasourceDefinition.class, ignorePropertieName); - datasetDefinitions.addAll(BeanUtils.toBean(datasetList, SqlDatasetDefinition.class)); + datasetDefinitions.addAll(BeanUtils.toBean(datasetInDatasourceList, SqlDatasetDefinition.class)); jdbcDatasourceDefinition.setDatasets(datasetDefinitions); datasourceDefinitions.add(jdbcDatasourceDefinition); } case SPRING -> { // 转换对应的ureport对象 SpringBeanDatasourceDefinition springBeanDatasourceDefinition = BeanUtil.copyProperties(ds, SpringBeanDatasourceDefinition.class, ignorePropertieName); - datasetDefinitions.addAll(BeanUtils.toBean(datasetList, BeanDatasetDefinition.class)); + datasetDefinitions.addAll(BeanUtils.toBean(datasetInDatasourceList, BeanDatasetDefinition.class)); springBeanDatasourceDefinition.setDatasets(datasetDefinitions); datasourceDefinitions.add(springBeanDatasourceDefinition); } case API -> { // 转换对应的ureport对象 ApiDatasourceDefinition apiDatasourceDefinition = BeanUtil.copyProperties(ds, ApiDatasourceDefinition.class, ignorePropertieName); - datasetDefinitions.addAll(BeanUtils.toBean(datasetList, ApiDatasetDefinition.class)); + datasetDefinitions.addAll(BeanUtils.toBean(datasetInDatasourceList, ApiDatasetDefinition.class)); apiDatasourceDefinition.setDatasets(datasetDefinitions); datasourceDefinitions.add(apiDatasourceDefinition); } @@ -519,7 +429,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 解析xml ReportDefinition reportDefinition = reportRender.getReportDefinition(xmlContent, CharsetUtil.UTF_8); // 查询数据源 - queryDatasource(template.getId(), reportDefinition); + queryDatasource(template, reportDefinition); // 设置参数 PreviewParameters previewParameters = new PreviewParameters(); previewParameters.setQuery(reqDTO.getParams()); diff --git a/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportCommonServiceImplTest.java b/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportCommonServiceImplTest.java index 34e5da3c5..cccf9c219 100644 --- a/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportCommonServiceImplTest.java +++ b/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportCommonServiceImplTest.java @@ -30,7 +30,6 @@ public abstract class ReportCommonServiceImplTest { .name("单元测试模板") .content(JsonUtil.zipString(TEMPLATE)) .remark(RandomUtils.randomString()) - .datasource(new ArrayList<>()) .build(); } @@ -39,14 +38,12 @@ public abstract class ReportCommonServiceImplTest { return ReportDatasourceSaveReqVO.builder() .id(id) .name("单元测试数据源") - .templateId(reportId) .type(ReportDatasourceTypeEnum.SPRING.getDesc()) .driver("com.mysql.cj.jdbc.Driver") .url("jdbc:mysql://192.168.1.205:3307/imes_base?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true") .username("root") .password("root") .remark(RandomUtils.randomString()) - .datasets(new ArrayList<>()) .build(); } diff --git a/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportDatasourceServiceImplTest.java b/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportDatasourceServiceImplTest.java index 3301cab06..96b107fb1 100644 --- a/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportDatasourceServiceImplTest.java +++ b/cf-module-report/cf-module-report-biz/src/test/java/com/cf/imes/module/report/service/template/ReportDatasourceServiceImplTest.java @@ -70,7 +70,7 @@ public class ReportDatasourceServiceImplTest extends ReportCommonServiceImplTest reqVO.setTemplateId(templateId); reqVO.setType(ReportDatasourceTypeEnum.JDBC.getCode()); reqVO.setName(updateReqVO.getName()); - List templateDatasourceList = reportDatasourceService.getTemplateDatasourceList(reqVO); + List templateDatasourceList = reportDatasourceService.getDatasourceList(); assertNotNull(templateDatasourceList); assertNotEquals(0, templateDatasourceList.size());