From 3e04c23c5acdbf1d2790e193ad87121e06544e48 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Wed, 4 Sep 2024 14:39:56 +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=96=B0=E5=A2=9E=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E5=86=85=E7=BD=AE=E6=95=B0=E6=8D=AE=E6=BA=90=E5=88=97?= =?UTF-8?q?=E8=A1=A8=EF=BC=88=E5=85=A8=E5=88=A0=E5=85=A8=E5=A2=9E=EF=BC=89?= =?UTF-8?q?=E3=80=81=E4=BF=AE=E6=94=B9=E8=8E=B7=E5=8F=96=E5=86=85=E7=BD=AE?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E5=88=97=E8=A1=A8=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E3=80=81=E6=95=B0=E6=8D=AE=E6=BA=90=E8=A1=A8=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?buildinType=E5=AD=97=E6=AE=B5=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReportDatasourceController.java | 18 +++-- .../datasource/vo/ReportDatasourceRespVO.java | 2 +- .../vo/ReportDatasourceSaveReqVO.java | 6 +- .../datasource/ReportDatasourceDO.java | 8 +- .../datasource/ReportDatasourceMapper.java | 4 + .../datasource/ReportDatasourceService.java | 14 ++++ .../ReportDatasourceServiceImpl.java | 73 ++++++++++++++++--- .../template/ReportTemplateServiceImpl.java | 4 +- .../ReportDatasourceTypeInEnum.java | 2 +- .../template/ReportTemplateTypeInEnum.java | 2 +- .../ReportTemplateTypeInEnumValidator.java | 3 + 11 files changed, 111 insertions(+), 25 deletions(-) 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 a2124531d..29fd669cb 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 @@ -1,6 +1,5 @@ package com.cf.imes.module.report.controller.admin.datasource; -import com.bstek.common.config.DataSourceConfig; import com.bstek.common.utils.MultipleJdbcTemplate; import com.bstek.datasource.bean.DataSourceInfo; import com.bstek.datasource.bean.PreviewParams; @@ -47,9 +46,6 @@ public class ReportDatasourceController { @Resource private ReportDatasourceService datasourceService; - @Resource - private DataSourceConfig dataSourceConfig; - @Resource private DataSourceService ureportDataSourceService; @@ -117,12 +113,20 @@ public class ReportDatasourceController { } @GetMapping("/buildin/datasources") - @Operation(summary = "获取内置数据源") + @Operation(summary = "获取内置数据源列表") // @PreAuthorize("@ss.hasPermission('report:datasource:query')") - public CommonResult> getBuildinDatasources() { - return CommonResult.success(dataSourceConfig.getDatasource()); + public CommonResult> getBuildinDatasources() { + return CommonResult.success(datasourceService.getBuildinDatasourceList()); } + @PostMapping("/buildin/datasources") + @Operation(summary = "保存内置数据源") + public CommonResult saveBuildinDatasources(@Valid @RequestBody @NotEmpty(message = "内置数据源列表不能为空") List reportDatasourceDOS) { + datasourceService.saveBuildinDatasources(reportDatasourceDOS); + return CommonResult.success(true); + } + + @PostMapping("/datasource/connect") @Operation(summary = "测试数据源连接") // @PreAuthorize("@ss.hasPermission('report:datasource:query')") diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java index 28cb451e4..de05540f5 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceRespVO.java @@ -28,7 +28,7 @@ public class ReportDatasourceRespVO { @Schema(description = "数据源名称", example = "测试库") private String name; - @Schema(description = "数据源类型,jdbc、spring、buildin、api", example = "0") + @Schema(description = "数据源类型,jdbc、spring、api", example = "0") private Integer type; @Schema(description = "数据源驱动类",example = "com.mysql.cj.jdbc.Driver") 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 acf0d0700..246a8badf 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.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; @@ -36,10 +37,13 @@ public class ReportDatasourceSaveReqVO implements Serializable { @Schema(description = "数据源名称", example = "测试库") private String name; - @Schema(description = "数据源类型,jdbc、spring、buildin、api", example = "1") + @Schema(description = "数据源类型,jdbc、spring、api", example = "1") @ReportDatasourceTypeInEnum private String type; + @JsonIgnore + private Integer buildinType; + @Schema(description = "spring型数据源id") private String beanId; 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 0f761a61b..8fb10e773 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 @@ -8,6 +8,7 @@ import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; import com.cf.imes.framework.mybatis.core.type.CompressObjectListTypeHandler; import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO; import com.cf.imes.module.report.enums.datasource.ReportDatasourceTypeEnum; +import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -48,10 +49,15 @@ public class ReportDatasourceDO extends BaseDO { private String name; /** - * 模板类型,0内置、1自定义 + * 数据源类型:jdbc、spring、api */ private ReportDatasourceTypeEnum type; + /** + * 内置类型:0是、1否 + */ + private ReportTemplateTypeEnum buildinType; + /** * spring型数据源id */ 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 d0bb8dbf4..e1e7f855d 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 @@ -2,6 +2,7 @@ package com.cf.imes.module.report.dal.mysql.datasource; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; +import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper; /** @@ -12,4 +13,7 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface ReportDatasourceMapper extends BaseMapperX { + + @Delete("DELETE FROM report_datasource WHERE buildin_type = 0") + int physicsDeleteBuildinDatasource(); } 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 e459a74a3..7a71403fd 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 @@ -85,4 +85,18 @@ public interface ReportDatasourceService { * @return */ List getSpringBeanResultFieldList(String clazz); + + /** + * 获取内置数据源列表 + * + * @return + */ + List getBuildinDatasourceList(); + + /** + * 保存内置数据源列表 + * + * @param buildinDatasources + */ + void saveBuildinDatasources(List buildinDatasources); } 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 4f3dbeb49..855f361f2 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 @@ -17,7 +17,10 @@ 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.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; @@ -25,6 +28,7 @@ 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 com.cf.imes.module.report.framework.ureport.annotation.CfReportSpringbeanDatasource; import com.cf.imes.module.report.service.dataset.ReportDatasetService; import com.cf.imes.module.report.util.SqlInjectionUtil; @@ -55,6 +59,7 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_GET_FIE import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_SQL_ILLEGAL; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_SQL_INJECTION_RISK; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_SQL_REQUIRED; +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.DATASOURCE_SPRINGBEAN_GET_FAIL; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRINGBEAN_METHODS_GET_FAIL; @@ -113,17 +118,6 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { datasetMapper.delete(new LambdaQueryWrapperX().eq(ReportDatasetDO::getDatasourceId, id)); } - /** - * 校验数据源是否存在 - * - * @param id - */ - private void validateDatasourceExists(Long id) { - if (datasourceMapper.selectById(id) == null) { - throw exception(DATASOURCE_NOT_EXISTS); - } - } - @Override public ReportDatasourceDO getDatasource(Long id) { ReportDatasourceDO reportDatasourceDO = datasourceMapper.selectById(id); @@ -278,6 +272,52 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { } } + @Override + public List getBuildinDatasourceList() { + List reportDatasourceDOS = datasourceMapper.selectList(new LambdaQueryWrapperX() + .eqIfPresent(ReportDatasourceDO::getBuildinType, ReportTemplateTypeEnum.SYSTEM) + .orderByDesc(ReportDatasourceDO::getCreateTime)); + // 查询数据集 + if (CollUtil.isNotEmpty(reportDatasourceDOS)) { + reportDatasourceDOS.forEach(reportDatasourceDO -> { + queryDatasetInSource(reportDatasourceDO); + }); + } + return reportDatasourceDOS; + } + + @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); + } + }); + } + /** * 查询数据源下的数据集 * @@ -290,4 +330,15 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { reportDatasourceDO.setDatasets(datasetList); } } + + /** + * 校验数据源是否存在 + * + * @param id + */ + private void validateDatasourceExists(Long id) { + if (datasourceMapper.selectById(id) == null) { + throw exception(DATASOURCE_NOT_EXISTS); + } + } } 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 ecf6e8a69..ee325b507 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 @@ -69,7 +69,7 @@ import java.util.Map; import java.util.Objects; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATATEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR; +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; /** @@ -261,7 +261,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); // 非超管不能操作内置模板 if (ReportTemplateTypeEnum.SYSTEM.equals(templateDO.getType()) && !isSuperAdmin) { - throw exception(DATATEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR); + throw exception(TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR); } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/datasource/ReportDatasourceTypeInEnum.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/datasource/ReportDatasourceTypeInEnum.java index 411c32a9d..c90178ab2 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/datasource/ReportDatasourceTypeInEnum.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/datasource/ReportDatasourceTypeInEnum.java @@ -28,7 +28,7 @@ import java.lang.annotation.Target; validatedBy = {ReportDatasourceTypeInEnumValidator.class} ) public @interface ReportDatasourceTypeInEnum { - String message() default "数据源类型[type]错误,请检查是否jdbc/spring/buildin/api"; + String message() default "数据源类型[type]错误,请检查是否jdbc/spring/api"; Class[] groups() default {}; diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnum.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnum.java index 1e2ae091d..df4844e52 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnum.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnum.java @@ -28,7 +28,7 @@ import java.lang.annotation.Target; validatedBy = {ReportTemplateTypeInEnumValidator.class} ) public @interface ReportTemplateTypeInEnum { - String message() default "类型[type]错误,请检查是否0(内置)/1(自定义)"; + String message() default "类型错误,请检查是否0(内置)/1(自定义)"; Class[] groups() default {}; diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnumValidator.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnumValidator.java index 880ab32c1..2fc8b796c 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnumValidator.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnumValidator.java @@ -21,6 +21,9 @@ public class ReportTemplateTypeInEnumValidator implements ConstraintValidator