From 56fc9577e9af44c47b31467862713e29de816993 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Tue, 30 Jul 2024 16:47:03 +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=E8=A7=84=E8=8C=83=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E3=80=81=E6=95=B0=E6=8D=AE=E6=BA=90=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?type=E5=85=A5=E5=8F=82=EF=BC=9B2=E3=80=81=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E5=AD=97=E6=AE=B5ds=5Ftype=EF=BC=8C?= =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=85=A5=E5=8F=82=EF=BC=9B3=E3=80=81?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=95=B0=E6=8D=AE=E6=BA=90=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E5=8C=85=E6=8B=AC=EF=BC=9A=E6=96=B0=E5=A2=9E=E5=86=85?= =?UTF-8?q?=E7=BD=AE=E6=95=B0=E6=8D=AE=E6=BA=90=E6=9F=A5=E8=AF=A2=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E6=95=B0=E6=8D=AE=E6=BA=90=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=97=B6=E9=99=84=E5=B8=A6=E6=95=B0=E6=8D=AE=E9=9B=86=EF=BC=8C?= =?UTF-8?q?=E5=86=85=E7=BD=AE=E6=95=B0=E6=8D=AE=E6=BA=90=E5=A2=9E=E6=94=B9?= =?UTF-8?q?=E6=9D=83=E9=99=90=E9=99=90=E5=88=B6=E4=B8=BA=E8=B6=85=E7=AE=A1?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E5=90=8C=E6=97=B6=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/handler/GlobalExceptionHandler.java | 13 +++ .../report/enums/ErrorCodeConstants.java | 4 +- .../template/ReportTemplateTypeEnum.java | 26 ----- .../dataset/vo/ReportDatasetSaveReqVO.java | 2 +- .../ReportDatasourceController.java | 7 ++ .../datasource/vo/ReportDatasourceReqVO.java | 2 +- .../datasource/vo/ReportDatasourceRespVO.java | 7 +- .../vo/ReportDatasourceSaveReqVO.java | 12 +- .../template/vo/ReportTemplateRespVO.java | 2 +- .../template/vo/ReportTemplateSaveReqVO.java | 2 + .../datasource/ReportDatasourceDO.java | 11 +- .../dataobject/template/ReportTemplateDO.java | 3 +- .../datasource/ReportDatasourceTypeEnum.java | 3 +- .../template/ReportTemplateTypeEnum.java | 38 ++++++ .../datasource/ReportDatasourceService.java | 6 + .../ReportDatasourceServiceImpl.java | 110 +++++++++++++++++- .../template/ReportTemplateServiceImpl.java | 4 +- .../ReportDatasourceTypeInEnum.java | 3 +- .../ReportDatasourceTypeInEnumValidator.java | 11 +- .../template/ReportTemplateTypeInEnum.java | 36 ++++++ .../ReportTemplateTypeInEnumValidator.java | 33 ++++++ .../template/ReportCommonServiceImplTest.java | 3 +- 22 files changed, 280 insertions(+), 58 deletions(-) delete mode 100644 cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/template/ReportTemplateTypeEnum.java create mode 100644 cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/enums/template/ReportTemplateTypeEnum.java create mode 100644 cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnum.java create mode 100644 cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnumValidator.java diff --git a/cf-framework/cf-spring-boot-starter-web/src/main/java/com/cf/imes/framework/web/core/handler/GlobalExceptionHandler.java b/cf-framework/cf-spring-boot-starter-web/src/main/java/com/cf/imes/framework/web/core/handler/GlobalExceptionHandler.java index 9b9c2f7dd..5b734fe73 100644 --- a/cf-framework/cf-spring-boot-starter-web/src/main/java/com/cf/imes/framework/web/core/handler/GlobalExceptionHandler.java +++ b/cf-framework/cf-spring-boot-starter-web/src/main/java/com/cf/imes/framework/web/core/handler/GlobalExceptionHandler.java @@ -14,6 +14,7 @@ import com.cf.imes.framework.common.util.json.JsonUtils; import com.cf.imes.framework.common.util.servlet.ServletUtils; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DuplicateKeyException; import org.springframework.security.access.AccessDeniedException; import org.springframework.util.Assert; import org.springframework.validation.BindException; @@ -212,6 +213,18 @@ public class GlobalExceptionHandler { return CommonResult.error(ex.getCode(), ex.getMessage()); } + /** + * 处理数据库DuplicateKeyException,违反唯一约束异常 + * + * @param ex + * @return + */ + @ExceptionHandler(value = DuplicateKeyException.class) + public CommonResult duplicateKeyExceptionHandler(DuplicateKeyException ex) { + log.info("[duplicateKeyExceptionHandler]", ex); + return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), "请求数据已存在,请检查"); + } + /** * 处理系统异常,兜底处理所有的一切 */ diff --git a/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java b/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java index 539c761cb..db4a7d81c 100644 --- a/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java +++ b/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java @@ -15,7 +15,9 @@ public final class ErrorCodeConstants { // ========== UREPORT datasource模块 1-003-002-000 ========== public static final ErrorCode DATASOURCE_NOT_EXISTS = new ErrorCode(1_003_002_001, "报表数据源不存在"); - public static final ErrorCode DATASOURCE_CONNECT_FAIL = new ErrorCode(1_003_002_001, "报表数据源连接失败"); + public static final ErrorCode DATASOURCE_CONNECT_FAIL = new ErrorCode(1_003_002_002, "报表数据源连接失败"); + public static final ErrorCode DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR = new ErrorCode(1_003_002_003, "内置报表数据源只能由超级管理员操作"); + // ========== UREPORT dataset模块 1-003-003-000 ========== public static final ErrorCode DATASET_NOT_EXISTS = new ErrorCode(1_003_003_001, "报表数据集不存在"); diff --git a/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/template/ReportTemplateTypeEnum.java b/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/template/ReportTemplateTypeEnum.java deleted file mode 100644 index 0aca8ef67..000000000 --- a/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/template/ReportTemplateTypeEnum.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.cf.imes.module.report.enums.template; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 报表模板类型 - * - * @author Gqr - * @since 2024/7/5 9:25 - */ -@Getter -@AllArgsConstructor -public enum ReportTemplateTypeEnum { - /** - * 内置 - */ - SYSTEM(1), - /** - * 自定义 - */ - CUSTOM(2); - - private final Integer type; - -} 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 12e14ef09..dfc4eb8eb 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 @@ -30,7 +30,7 @@ public class ReportDatasetSaveReqVO implements Serializable { @Schema(description = "数据集名称", example = "测试数据集") private String name; - @Schema(description = "数据源id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @Schema(description = "数据源id", example = "1") 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 c96f0bc69..136d982ae 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 @@ -95,6 +95,13 @@ public class ReportDatasourceController { return success(datasourceService.loadBeanMethods(beanId)); } + @GetMapping("/buildin/datasources") + @Operation(summary = "获取内置数据源") + @PreAuthorize("@ss.hasPermission('report:datasource:query')") + public CommonResult> getBuildinDatasources() { + return success(BeanUtils.toBean(datasourceService.getBuildinDatasources(), ReportDatasourceRespVO.class)); + } + @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/ReportDatasourceReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceReqVO.java index 2878f0d62..35cc87ef5 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceReqVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/vo/ReportDatasourceReqVO.java @@ -30,6 +30,6 @@ public class ReportDatasourceReqVO implements Serializable { @Schema(description = "数据源名称", example = "测试库") private String name; - @Schema(description = "数据源类型,0 jdbc、1 buildin、2 spring", example = "jdbc") + @Schema(description = "类型,0 内置、1 自定义", example = "1") private Integer type; } 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 82ba7889d..2505c0bd2 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,8 +28,11 @@ public class ReportDatasourceRespVO { @Schema(description = "数据源名称", example = "测试库") private String name; - @Schema(description = "数据源类型,jdbc、buildin、spring", example = "jdbc") - private ReportDatasourceTypeEnum type; + @Schema(description = "数据源类型,jdbc、spring", example = "jdbc") + private ReportDatasourceTypeEnum dsType; + + @Schema(description = "模板类型,0内置、1自定义", example = "0") + private Integer type; @Schema(description = "数据源驱动类",example = "com.mysql.cj.jdbc.Driver") private String 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 f0ad81190..896aceb1d 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,13 +2,13 @@ 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 io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; 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; @@ -30,15 +30,19 @@ public class ReportDatasourceSaveReqVO implements Serializable { @Schema(description = "数据源id", example = "1") private Long id; - @Schema(description = "模板id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @Schema(description = "模板id", example = "1") private Long templateId; @Schema(description = "数据源名称", example = "测试库") private String name; - @Schema(description = "数据源类型,jdbc、buildin、spring", example = "jdbc") + @Schema(description = "模板类型,0内置、1自定义", example = "1") + @ReportTemplateTypeInEnum + private Integer type; + + @Schema(description = "数据源类型,jdbc、spring", example = "jdbc") @ReportDatasourceTypeInEnum - private String type; + private String dsType; @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/controller/admin/template/vo/ReportTemplateRespVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateRespVO.java index 7479e566b..5dc20d7be 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateRespVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateRespVO.java @@ -28,7 +28,7 @@ public class ReportTemplateRespVO { private String content; @Schema(description = "模板类型,0内置、1自定义", example = "0") - private Long type; + private Integer type; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; 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 375de199c..6dcf2360a 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,6 +1,7 @@ package com.cf.imes.module.report.controller.admin.template.vo; import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO; +import com.cf.imes.module.report.validation.template.ReportTemplateTypeInEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; @@ -34,6 +35,7 @@ public class ReportTemplateSaveReqVO { private List datasource = new ArrayList<>(); @Schema(description = "模板类型,0内置、1自定义", example = "1") + @ReportTemplateTypeInEnum private Integer type; @Schema(description = "备注", example = "该模板仅供生产使用") 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 3beab7a73..7e56e6a99 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 @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; 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.*; import java.util.List; @@ -40,9 +41,15 @@ public class ReportDatasourceDO extends BaseDO { */ private String name; /** - * 模板类型,jdbc、buildin、spring + * 模板类型,jdbc、spring */ - private ReportDatasourceTypeEnum type; + private ReportDatasourceTypeEnum dsType; + + /** + * 模板类型,0内置、1自定义 + */ + private ReportTemplateTypeEnum type; + /** * spring型数据源id */ 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 c6d82b70a..f621abe5c 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 @@ -4,6 +4,7 @@ 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.module.report.dal.dataobject.datasource.ReportDatasourceDO; +import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; import lombok.*; import java.util.List; @@ -40,7 +41,7 @@ public class ReportTemplateDO extends BaseDO { /** * 模板类型,0内置、1自定义 */ - private Integer type; + private ReportTemplateTypeEnum type; /** * 备注 */ diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/enums/datasource/ReportDatasourceTypeEnum.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/enums/datasource/ReportDatasourceTypeEnum.java index d31672640..2e2a03057 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/enums/datasource/ReportDatasourceTypeEnum.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/enums/datasource/ReportDatasourceTypeEnum.java @@ -14,8 +14,7 @@ import lombok.Getter; @AllArgsConstructor public enum ReportDatasourceTypeEnum { JDBC(0,"jdbc"), - BUILDIN(1,"buildin"), - SPRING(2,"spring"); + SPRING(1,"spring"); @EnumValue private final Integer code; diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/enums/template/ReportTemplateTypeEnum.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/enums/template/ReportTemplateTypeEnum.java new file mode 100644 index 000000000..9e24af0cf --- /dev/null +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/enums/template/ReportTemplateTypeEnum.java @@ -0,0 +1,38 @@ +package com.cf.imes.module.report.enums.template; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonCreator; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 报表模板类型 + * + * @author Gqr + * @since 2024/7/5 9:25 + */ +@Getter +@AllArgsConstructor +public enum ReportTemplateTypeEnum { + /** + * 内置 + */ + SYSTEM(0), + /** + * 自定义 + */ + CUSTOM(1); + + @EnumValue + private final Integer type; + + @JsonCreator + public static ReportTemplateTypeEnum fromType(Integer type) { + for (ReportTemplateTypeEnum value : values()) { + if (value.getType().equals(type)) { + return value; + } + } + return null; + } +} 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 d140b9363..c2d36a457 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 @@ -63,6 +63,12 @@ public interface ReportDatasourceService { */ List getBeanDatasourceList(); + /** + * 获取内置数据源列表 + * @return + */ + List getBuildinDatasources(); + /** * 获取bean方法 * 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 227cefdfc..fcd29b866 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 @@ -1,6 +1,7 @@ package com.cf.imes.module.report.service.datasource; import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.toolkit.sql.SqlInjectionUtils; import com.bstek.ureport.definition.dataset.Field; @@ -10,15 +11,23 @@ import com.bstek.ureport.utils.ProcedureUtils; import com.cf.imes.framework.common.exception.ServiceException; 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.ReportDatasetFieldVO; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetParameterVO; +import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO; 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.controller.admin.datasource.vo.ReportDatasourceTestConnReqVO; +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; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -49,6 +58,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; /** @@ -64,6 +74,12 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { @Resource private ReportDatasourceMapper datasourceMapper; + @Resource + private ReportDatasetService datasetService; + + @Resource + private ReportDatasetMapper datasetMapper; + private final ApplicationContext applicationContext; public ReportDatasourceServiceImpl(ApplicationContext applicationContext) { @@ -72,9 +88,13 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { @Override public Long createDatasource(ReportDatasourceSaveReqVO createReqVO) { - // 插入 ReportDatasourceDO datasource = BeanUtils.toBean(createReqVO, ReportDatasourceDO.class); + // 校验内置数据源操作权限 + validateBuildinsource(datasource); + // 插入 datasourceMapper.insert(datasource); + // 解析数据集 + analyzeDataset(datasource); // 返回 return datasource.getId(); } @@ -83,9 +103,54 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { public void updateDatasource(ReportDatasourceSaveReqVO updateReqVO) { // 校验存在 validateDatasourceExists(updateReqVO.getId()); - // 更新 ReportDatasourceDO updateObj = BeanUtils.toBean(updateReqVO, ReportDatasourceDO.class); + // 校验内置数据源操作权限 + validateBuildinsource(updateObj); + // 更新 datasourceMapper.updateById(updateObj); + // 解析数据集 + analyzeDataset(updateObj); + } + + /** + * 校验只有超管可以操作内置数据源 + */ + private void validateBuildinsource(ReportDatasourceDO datasource) { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); + // 非超管不能操作内置数据源 + if (ReportTemplateTypeEnum.SYSTEM.equals(datasource.getType()) && !isSuperAdmin) { + throw exception(DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR); + } + } + + /** + * 解析数据源下的数据集 + * + * @param datasource + */ + private void analyzeDataset(ReportDatasourceDO datasource) { + List datasets = datasource.getDatasets(); + List batchInsertDataset = new ArrayList<>(); + List batchupdateDataset = new ArrayList<>(); + datasets.forEach(dataset -> { + // 更新/新增数据集 + if (ObjectUtil.isNotNull(dataset.getId())) { + batchupdateDataset.add(dataset); + } else { + dataset.setDatasourceId(datasource.getId()); + batchInsertDataset.add(dataset); + } + }); + + // 批量插入数据集 + if (CollUtil.isNotEmpty(batchInsertDataset)) { + datasetMapper.insertBatch(batchInsertDataset); + } + // 批量更新数据集 + if (CollUtil.isNotEmpty(batchupdateDataset)) { + datasetMapper.updateBatch(batchupdateDataset); + } } @Override @@ -109,7 +174,10 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { @Override public ReportDatasourceDO getDatasource(Long id) { - return datasourceMapper.selectById(id); + ReportDatasourceDO reportDatasourceDO = datasourceMapper.selectById(id); + // 查询数据集 + queryDatasetInSource(reportDatasourceDO); + return reportDatasourceDO; } @Override @@ -117,8 +185,14 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { List reportDatasourceDOS = datasourceMapper.selectList(new LambdaQueryWrapperX() .eqIfPresent(ReportDatasourceDO::getTemplateId, reqVO.getTemplateId()) .likeIfPresent(ReportDatasourceDO::getName, reqVO.getName()) - .eqIfPresent(ReportDatasourceDO::getType, reqVO.getType()) + .eqIfPresent(ReportDatasourceDO::getDsType, reqVO.getType()) .orderByDesc(ReportDatasourceDO::getCreateTime)); + // 查询数据集 + if (CollUtil.isNotEmpty(reportDatasourceDOS)) { + reportDatasourceDOS.forEach(reportDatasourceDO -> { + queryDatasetInSource(reportDatasourceDO); + }); + } return reportDatasourceDOS; } @@ -136,6 +210,21 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { return beanDatasourceRespVOList; } + @Override + @OrganIgnore + public List getBuildinDatasources() { + List reportDatasourceDOS = datasourceMapper.selectList(new LambdaQueryWrapperX() + .eqIfPresent(ReportDatasourceDO::getType, ReportTemplateTypeEnum.SYSTEM) + .orderByDesc(ReportDatasourceDO::getCreateTime)); + // 查询数据集 + if (CollUtil.isNotEmpty(reportDatasourceDOS)) { + reportDatasourceDOS.forEach(reportDatasourceDO -> { + queryDatasetInSource(reportDatasourceDO); + }); + } + return reportDatasourceDOS; + } + @Override public List loadBeanMethods(String beanId) { Object obj = applicationContext.getBean(beanId); @@ -294,4 +383,17 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { } return conn; } + + /** + * 查询数据源下的数据集 + * + * @param reportDatasourceDO + */ + private void queryDatasetInSource(ReportDatasourceDO reportDatasourceDO) { + if (ObjectUtil.isNotNull(reportDatasourceDO)) { + // 查询数据集 + List datasetList = datasetService.getDatasetList(ReportDatasetReqVO.builder().datasourceId(reportDatasourceDO.getId()).build()); + reportDatasourceDO.setDatasets(datasetList); + } + } } 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 442db1210..4fdf56258 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 @@ -217,8 +217,8 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 查询数据集 List datasetList = datasetService.getDatasetList(ReportDatasetReqVO.builder().datasourceId(ds.getId()).build()); List datasetDefinitions = new ArrayList<>(); - switch (ds.getType()) { - case JDBC, BUILDIN -> { + switch (ds.getDsType()) { + case JDBC -> { // 转换对应的ureport对象 JdbcDatasourceDefinition jdbcDatasourceDefinition = BeanUtils.toBean(ds, JdbcDatasourceDefinition.class); datasetDefinitions.addAll(BeanUtils.toBean(datasetList, SqlDatasetDefinition.class)); 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 c3af82df2..c9036826c 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,10 +28,9 @@ import java.lang.annotation.Target; validatedBy = {ReportDatasourceTypeInEnumValidator.class} ) public @interface ReportDatasourceTypeInEnum { - String message() default "数据源类型[type]错误,请检查是否jdbc/buildin/spring"; + String message() default "数据源类型[dsType]错误,请检查是否jdbc/spring"; Class[] groups() default {}; Class[] payload() default {}; - } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/datasource/ReportDatasourceTypeInEnumValidator.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/datasource/ReportDatasourceTypeInEnumValidator.java index 76d858956..cc6c291d9 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/datasource/ReportDatasourceTypeInEnumValidator.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/datasource/ReportDatasourceTypeInEnumValidator.java @@ -2,7 +2,6 @@ package com.cf.imes.module.report.validation.datasource; import cn.hutool.core.util.ObjectUtil; import com.cf.imes.module.report.enums.datasource.ReportDatasourceTypeEnum; -import org.apache.commons.lang3.StringUtils; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; @@ -22,15 +21,11 @@ public class ReportDatasourceTypeInEnumValidator implements ConstraintValidator< @Override public boolean isValid(String value, ConstraintValidatorContext context) { - if (StringUtils.isEmpty(value)) { + ReportDatasourceTypeEnum byType = ReportDatasourceTypeEnum.fromDesc(value); + if (ObjectUtil.isNotNull(byType)) { return true; } else { - ReportDatasourceTypeEnum byType = ReportDatasourceTypeEnum.fromDesc(value); - if (ObjectUtil.isNotNull(byType)) { - return true; - } else { - return false; - } + return false; } } 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 new file mode 100644 index 000000000..1e2ae091d --- /dev/null +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnum.java @@ -0,0 +1,36 @@ +package com.cf.imes.module.report.validation.template; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义报表模板类型入参校验注解 + * + * @author Gqr + * @since 2024/7/17 9:33 + */ +@Target({ + ElementType.METHOD, + ElementType.FIELD, + ElementType.ANNOTATION_TYPE, + ElementType.CONSTRUCTOR, + ElementType.PARAMETER, + ElementType.TYPE_USE +}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint( + validatedBy = {ReportTemplateTypeInEnumValidator.class} +) +public @interface ReportTemplateTypeInEnum { + String message() default "类型[type]错误,请检查是否0(内置)/1(自定义)"; + + Class[] groups() default {}; + + Class[] payload() 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 new file mode 100644 index 000000000..880ab32c1 --- /dev/null +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/validation/template/ReportTemplateTypeInEnumValidator.java @@ -0,0 +1,33 @@ +package com.cf.imes.module.report.validation.template; + +import cn.hutool.core.util.ObjectUtil; +import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * 自定义报表模板类型入参校验器 + * + * @author Gqr + * @since 2024/7/17 9:33 + */ +public class ReportTemplateTypeInEnumValidator implements ConstraintValidator { + + @Override + public void initialize(ReportTemplateTypeInEnum constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + } + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext context) { + ReportTemplateTypeEnum byType = ReportTemplateTypeEnum.fromType(value); + if (ObjectUtil.isNotNull(byType)) { + return true; + } else { + return false; + } + } + +} + 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 af4954b58..9901e4668 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 @@ -42,7 +42,8 @@ public abstract class ReportCommonServiceImplTest { .id(id) .name("单元测试数据源") .templateId(reportId) - .type(ReportDatasourceTypeEnum.SPRING.getDesc()) + .dsType(ReportDatasourceTypeEnum.SPRING.getDesc()) + .type(ReportTemplateTypeEnum.SYSTEM.getType()) .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")