From 5e9cbb9cad84dddbff1e218cfbc1154a7284fe6d Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 24 Nov 2023 22:18:59 +0800 Subject: [PATCH] report:code review ureport 的集成 --- yudao-module-report/yudao-module-report-api/src/main/java/cn/iocoder/yudao/module/report/enums/ErrorCodeConstants.java | 6 ++++-- yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ureport/UreportFileController.java | 56 ++++++++++++++++++++++++++++---------------------------- yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ureport/vo/UreportFileRespVO.java | 12 +++++++----- yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ureport/vo/UreportFileSaveReqVO.java | 11 +++++++---- yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/dal/dataobject/ureport/UreportFileDO.java | 11 ++++++----- yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/security/config/SecurityConfiguration.java | 5 ++--- yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/config/UreportConfiguration.java | 11 ++++++----- yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/config/UreportDataSource.java | 13 ++++++------- yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/core/UreportDatabaseProvider.java | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/core/UreportFileReportProvider.java | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/provider/UreportDatabaseProvider.java | 128 -------------------------------------------------------------------------------------------------------------------------------- yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/provider/UreportFileReportProvider.java | 119 ----------------------------------------------------------------------------------------------------------------------- yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/service/ureport/UreportFileServiceImpl.java | 6 ++++++ yudao-module-report/yudao-module-report-biz/src/main/resources/mapper/ureport/UreportFileMapper.xml | 12 ------------ yudao-module-report/yudao-module-report-biz/src/main/resources/ureport.properties | 3 ++- yudao-module-report/yudao-module-report-biz/src/test/java/cn/iocoder/yudao/module/report/service/ureport/UreportFileServiceImplTest.java | 36 +++++++++++++++--------------------- yudao-server/src/main/resources/application-local.yaml | 1 + yudao-server/src/main/resources/application.yaml | 7 ++++--- 18 files changed, 356 insertions(+), 343 deletions(-) create mode 100644 yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/core/UreportDatabaseProvider.java create mode 100644 yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/core/UreportFileReportProvider.java delete mode 100644 yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/provider/UreportDatabaseProvider.java delete mode 100644 yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/provider/UreportFileReportProvider.java delete mode 100644 yudao-module-report/yudao-module-report-biz/src/main/resources/mapper/ureport/UreportFileMapper.xml diff --git a/yudao-module-report/yudao-module-report-api/src/main/java/cn/iocoder/yudao/module/report/enums/ErrorCodeConstants.java b/yudao-module-report/yudao-module-report-api/src/main/java/cn/iocoder/yudao/module/report/enums/ErrorCodeConstants.java index 39edb84..4757908 100644 --- a/yudao-module-report/yudao-module-report-api/src/main/java/cn/iocoder/yudao/module/report/enums/ErrorCodeConstants.java +++ b/yudao-module-report/yudao-module-report-api/src/main/java/cn/iocoder/yudao/module/report/enums/ErrorCodeConstants.java @@ -9,9 +9,11 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; */ public interface ErrorCodeConstants { - // ========== AUTH 模块 1-003-000-000 ========== + // ========== GoView 模块 1-003-000-000 ========== ErrorCode GO_VIEW_PROJECT_NOT_EXISTS = new ErrorCode(1_003_000_000, "GoView 项目不存在"); - ErrorCode UREPORT_FILE_NOT_EXISTS = new ErrorCode(1_003_001_000, "打印文件不存在,请检查Ureport报表文件"); + // ========== UREPORT 模块 1-003-001-000 ========== + ErrorCode UREPORT_FILE_NOT_EXISTS = new ErrorCode(1_003_001_000, "打印文件不存在,请检查 UReport 报表文件"); ErrorCode UREPORT_FILE_EXISTS = new ErrorCode(1_003_001_001, "报表名字已存在,请修改后再保存"); + } diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ureport/UreportFileController.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ureport/UreportFileController.java index 0ea93f2..cd2068d 100644 --- a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ureport/UreportFileController.java +++ b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ureport/UreportFileController.java @@ -1,35 +1,34 @@ package cn.iocoder.yudao.module.report.controller.admin.ureport; -import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.security.access.prepost.PreAuthorize; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Operation; - -import javax.validation.constraints.*; -import javax.validation.*; -import javax.servlet.http.*; -import java.util.*; -import java.io.IOException; - +import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; - import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; - -import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.*; +import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.UreportFilePageReqVO; +import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.UreportFileRespVO; +import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.UreportFileSaveReqVO; import cn.iocoder.yudao.module.report.dal.dataobject.ureport.UreportFileDO; import cn.iocoder.yudao.module.report.service.ureport.UreportFileService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; -@Tag(name = "管理后台 - Ureport2报表") +// TODO @赤焰: Ureport 改成 UReport +@Tag(name = "管理后台 - UReport2 报表") @RestController @RequestMapping("/report/ureport-file") @Validated @@ -39,14 +38,14 @@ public class UreportFileController { private UreportFileService ureportFileService; @PostMapping("/create") - @Operation(summary = "创建Ureport2报表") + @Operation(summary = "创建 UReport2 报表") @PreAuthorize("@ss.hasPermission('report:ureport-file:create')") public CommonResult createUreportFile(@Valid @RequestBody UreportFileSaveReqVO createReqVO) { return success(ureportFileService.createUreportFile(createReqVO)); } @PutMapping("/update") - @Operation(summary = "更新Ureport2报表") + @Operation(summary = "更新 UReport2 报表") @PreAuthorize("@ss.hasPermission('report:ureport-file:update')") public CommonResult updateUreportFile(@Valid @RequestBody UreportFileSaveReqVO updateReqVO) { ureportFileService.updateUreportFile(updateReqVO); @@ -54,7 +53,7 @@ public class UreportFileController { } @DeleteMapping("/delete") - @Operation(summary = "删除Ureport2报表") + @Operation(summary = "删除 UReport2 报表") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('report:ureport-file:delete')") public CommonResult deleteUreportFile(@RequestParam("id") Long id) { @@ -63,7 +62,7 @@ public class UreportFileController { } @GetMapping("/get") - @Operation(summary = "获得Ureport2报表") + @Operation(summary = "获得 UReport2 报表") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('report:ureport-file:query')") public CommonResult getUreportFile(@RequestParam("id") Long id) { @@ -72,15 +71,16 @@ public class UreportFileController { } @GetMapping("/page") - @Operation(summary = "获得Ureport2报表分页") + @Operation(summary = "获得 UReport2 报表分页") @PreAuthorize("@ss.hasPermission('report:ureport-file:query')") public CommonResult> getUreportFilePage(@Valid UreportFilePageReqVO pageReqVO) { PageResult pageResult = ureportFileService.getUreportFilePage(pageReqVO); return success(BeanUtils.toBean(pageResult, UreportFileRespVO.class)); } + // TODO @赤焰:导出是必须的么?没用可以删除哈 @GetMapping("/export-excel") - @Operation(summary = "导出Ureport2报表 Excel") + @Operation(summary = "导出 UReport2 报表 Excel") @PreAuthorize("@ss.hasPermission('report:ureport-file:export')") @OperateLog(type = EXPORT) public void exportUreportFileExcel(@Valid UreportFilePageReqVO pageReqVO, diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ureport/vo/UreportFileRespVO.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ureport/vo/UreportFileRespVO.java index 739369a..21dfceb 100644 --- a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ureport/vo/UreportFileRespVO.java +++ b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ureport/vo/UreportFileRespVO.java @@ -1,12 +1,13 @@ package cn.iocoder.yudao.module.report.controller.admin.ureport.vo; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.util.*; -import java.util.*; -import org.springframework.format.annotation.DateTimeFormat; +import lombok.Data; + import java.time.LocalDateTime; -import com.alibaba.excel.annotation.*; @Schema(description = "管理后台 - Ureport2报表 Response VO") @Data @@ -23,6 +24,7 @@ public class UreportFileRespVO { @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @ExcelProperty("状态") + @DictFormat(DictTypeConstants.COMMON_STATUS) private Integer status; @Schema(description = "备注", example = "随便") diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ureport/vo/UreportFileSaveReqVO.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ureport/vo/UreportFileSaveReqVO.java index fc8baa3..2eebca4 100644 --- a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ureport/vo/UreportFileSaveReqVO.java +++ b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ureport/vo/UreportFileSaveReqVO.java @@ -1,10 +1,12 @@ package cn.iocoder.yudao.module.report.controller.admin.ureport.vo; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.validation.InEnum; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.util.*; -import javax.validation.constraints.*; -import java.util.*; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; @Schema(description = "管理后台 - Ureport2报表新增/修改 Request VO") @Data @@ -19,6 +21,7 @@ public class UreportFileSaveReqVO { @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "状态不能为空") + @InEnum(CommonStatusEnum.class) private Integer status; @Schema(description = "文件内容") diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/dal/dataobject/ureport/UreportFileDO.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/dal/dataobject/ureport/UreportFileDO.java index c9872f8..f067441 100644 --- a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/dal/dataobject/ureport/UreportFileDO.java +++ b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/dal/dataobject/ureport/UreportFileDO.java @@ -1,11 +1,10 @@ package cn.iocoder.yudao.module.report.dal.dataobject.ureport; -import lombok.*; -import java.util.*; -import java.time.LocalDateTime; -import java.time.LocalDateTime; -import com.baomidou.mybatisplus.annotation.*; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; /** * Ureport2报表 DO @@ -27,6 +26,7 @@ public class UreportFileDO extends BaseDO { */ @TableId private Long id; + // TODO @赤焰:是不是用 name 就可以了。 /** * 文件名称 */ @@ -35,6 +35,7 @@ public class UreportFileDO extends BaseDO { * 状态 */ private Integer status; + // TODO @赤焰:是不是用 string 就可以了。然后字段名用 content? /** * 文件内容 */ diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/security/config/SecurityConfiguration.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/security/config/SecurityConfiguration.java index 82ded0d..f986f0d 100644 --- a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/security/config/SecurityConfiguration.java +++ b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/security/config/SecurityConfiguration.java @@ -18,9 +18,8 @@ public class SecurityConfiguration { @Override public void customize(ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry) { - //积木报表 - registry.antMatchers("/jmreport/**").permitAll(); - registry.antMatchers("/ureport/**").permitAll(); + registry.antMatchers("/jmreport/**").permitAll(); // 积木报表 + registry.antMatchers("/ureport/**").permitAll(); // UReport 报表 } }; diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/config/UreportConfiguration.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/config/UreportConfiguration.java index 6e3093f..0642bc3 100644 --- a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/config/UreportConfiguration.java +++ b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/config/UreportConfiguration.java @@ -10,15 +10,16 @@ import org.springframework.context.annotation.PropertySource; import javax.servlet.Servlet; /** - * Ureport 配置类 - * 加载ureport对应的xml配置文件 - * @author 赤焰 + * UReport2 配置类 + * + * @author 赤焰 */ @Configuration -@ImportResource({"classpath:ureport-console-context.xml"}) -@PropertySource(value = {"classpath:ureport.properties"}) +@ImportResource({"classpath:ureport-console-context.xml"}) // Bean 配置 +@PropertySource(value = {"classpath:ureport.properties"}) // 配置文件 public class UreportConfiguration { + // TODO @赤焰:bean 是不是取个和 ureport 相关的名字好点哈? @Bean public ServletRegistrationBean registrationBean() { return new ServletRegistrationBean<>(new UReportServlet(), "/ureport/*"); diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/config/UreportDataSource.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/config/UreportDataSource.java index 9aeddfc..5d079e3 100644 --- a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/config/UreportDataSource.java +++ b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/config/UreportDataSource.java @@ -10,7 +10,7 @@ import java.sql.Connection; import java.sql.SQLException; /** - * ureport内置数据源 + * UReport 内置数据源 */ @Slf4j @Component @@ -22,18 +22,17 @@ public class UreportDataSource implements BuildinDatasource { private DataSource dataSource; /** - * 数据源名称 - * - **/ + * @return 数据源名称 + */ @Override public String name() { return NAME; } + // TODO @赤焰:这个方法,如果拿不到连接,是不是抛出异常比较好? /** - * * 获取连接 - * - **/ + * @return 获取连接 + */ @Override public Connection getConnection() { try { diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/core/UreportDatabaseProvider.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/core/UreportDatabaseProvider.java new file mode 100644 index 0000000..f44b187 --- /dev/null +++ b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/core/UreportDatabaseProvider.java @@ -0,0 +1,142 @@ +package cn.iocoder.yudao.module.report.framework.ureport.core; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.UreportFileSaveReqVO; +import cn.iocoder.yudao.module.report.dal.dataobject.ureport.UreportFileDO; +import cn.iocoder.yudao.module.report.service.ureport.UreportFileService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bstek.ureport.provider.report.ReportFile; +import com.bstek.ureport.provider.report.ReportProvider; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.report.enums.ErrorCodeConstants.UREPORT_FILE_EXISTS; +import static cn.iocoder.yudao.module.report.enums.ErrorCodeConstants.UREPORT_FILE_NOT_EXISTS; + +// TODO @赤焰:有了这个功能,是不是就不需要 UreportFileController? +/** + * 基于数据库的 {@link ReportProvider} 实现类 + * + * @author 赤焰 + */ +@Component +@Slf4j +@Setter +@ConfigurationProperties(prefix = "ureport.provider.database") // TODO @赤焰:是不是单独搞个 UReportProperties 用来注入 prefix、disabled 等属性 +public class UreportDatabaseProvider implements ReportProvider { + + private static final String NAME = "mysql-provider"; + + // TODO @赤焰:IdTypeEnvironmentPostProcessor 参考下,通过 primary 数据源获取 + private String prefix = "mysql:"; + + private boolean disabled = false; + + @Resource + private UreportFileService ureportFileService; + + @Override + public InputStream loadReport(String file) { + // TODO @赤焰:是不是不需要这个 check 接口?直接使用 name 查询就 ok 了? + // TODO @赤焰:变量的命名要注意,这里 reportDo 是不是叫 count 就好了?还有,这个方法的命名也不太对。 + Long reportDo = ureportFileService.checkExistByName(getCorrectName(file)); + if (reportDo <=0) { // TODO 赤焰:<= 0 注释空格 + throw exception(UREPORT_FILE_NOT_EXISTS); + } + // TODO @赤焰:queryUreportFileDoByName 改成 getUreportFileDoByName 更合适,保持整个项目的命名风格一致性。 + UreportFileDO ureportFileDO = ureportFileService.queryUreportFileDoByName(getCorrectName(file)); + byte[] content = ureportFileDO.getFileContent(); + return new ByteArrayInputStream(content); + } + + @Override + public void deleteReport(String file) { + ureportFileService.deleteReportFileByName(getCorrectName(file)); + } + + @Override + public List getReportFiles() { + // TODO @赤焰:queryReportFileList 改成 getReportFileList 更合适,保持整个项目的命名风格一致性。 + List list = ureportFileService.queryReportFileList(); + List reportList = new ArrayList<>(); + if(CollUtil.isEmpty(list)){ // TODO 赤焰:CollUtil.isEmpty(list) 注意空格 + // TODO @赤焰:这里可以直接返回 Collections.emptyList(); + return reportList; + } + // TODO 赤焰:可以使用 CollectionUtils.converList + for (UreportFileDO reportFile : list) { + // TODO 赤焰:可以使用 DateUtils.of() 么? + LocalDateTime updateTime = reportFile.getUpdateTime(); + ZonedDateTime zdt = updateTime.atZone(ZoneId.systemDefault()); + Date date = Date.from(zdt.toInstant()); + reportList.add(new ReportFile(reportFile.getFileName(),date)); + } + return reportList; + + } + + @Override + public void saveReport(String file, String content) { + file = getCorrectName(file); + // TODO @赤焰:这里的逻辑,应该封装到 ureportFileService 中,这里只负责调用即可 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(UreportFileDO::getFileName, file); + Long count = ureportFileService.checkExistByName(file); + if(count>1){ + throw exception(UREPORT_FILE_EXISTS); + } + UreportFileDO ureportFileDO = ureportFileService.queryUreportFileDoByName(file); + UreportFileSaveReqVO saveReqVO = new UreportFileSaveReqVO(); + if (ureportFileDO == null) { + saveReqVO.setFileName(file); + saveReqVO.setFileContent(content); + saveReqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + ureportFileService.createUreportFile(saveReqVO); + } else { + saveReqVO.setId(ureportFileDO.getId()); + saveReqVO.setFileName(file); + saveReqVO.setFileContent(content); + saveReqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + ureportFileService.updateUreportFile(saveReqVO); + } + } + + @Override + public String getName() { + return NAME; + } + + @Override + public boolean disabled() { + return disabled; + } + + @Override + public String getPrefix() { + return prefix; + } + + // TODO @赤焰:这个方法的注释,最好写下哈; + private String getCorrectName(String name) { + // TODO 赤焰:一些常用方法,可以用 hutool StrUtil.removePrefix() + if (name.startsWith(getPrefix())) { + name = name.substring(getPrefix().length()); + } + return name; + } + +} diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/core/UreportFileReportProvider.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/core/UreportFileReportProvider.java new file mode 100644 index 0000000..0ce1007 --- /dev/null +++ b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/core/UreportFileReportProvider.java @@ -0,0 +1,120 @@ +/* +package cn.iocoder.yudao.module.report.framework.ureport.provider; + +import com.bstek.ureport.exception.ReportException; +import com.bstek.ureport.provider.report.ReportFile; +import com.bstek.ureport.provider.report.ReportProvider; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.io.*; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Objects; + +// TODO @赤焰:这个类的作用是?如果全部注释,是不是可以删除哈? +*/ +/** + * 自定义文件存储,可接入oss等 + * @author 赤焰 + *//* + +@Slf4j +@Component +@ConfigurationProperties(prefix = "ureport.provider.file") +public class UreportFileReportProvider implements ReportProvider{ + + private String prefix="reportFile:"; + private String fileStoreDir; + private boolean disabled; + + @Override + public InputStream loadReport(String file) { + if(file.startsWith(prefix)){ + file=file.substring(prefix.length(),file.length()); + } + String fullPath=fileStoreDir+"/"+file; + try { + return new FileInputStream(fullPath); + } catch (FileNotFoundException e) { + throw new ReportException(e); + } + } + + @Override + public void deleteReport(String file) { + if(file.startsWith(prefix)){ + file=file.substring(prefix.length(),file.length()); + } + String fullPath=fileStoreDir+"/"+file; + File f=new File(fullPath); + if(f.exists()){ + f.delete(); + } + } + + @Override + public List getReportFiles() { + File file=new File(fileStoreDir); + List list= new ArrayList<>(); + for(File f: Objects.requireNonNull(file.listFiles())){ + Calendar calendar=Calendar.getInstance(); + calendar.setTimeInMillis(f.lastModified()); + list.add(new ReportFile(f.getName(),calendar.getTime())); + } + list.sort((f1, f2) -> f2.getUpdateDate().compareTo(f1.getUpdateDate())); + return list; + } + + @Override + public String getName() { + return "文件存储系统"; + } + + @Override + public void saveReport(String file,String content) { + if(file.startsWith(prefix)){ + file=file.substring(prefix.length(),file.length()); + } + String fullPath=fileStoreDir+"/"+file; + FileOutputStream outStream=null; + try{ + outStream=new FileOutputStream(new File(fullPath)); + IOUtils.write(content, outStream,"utf-8"); + }catch(Exception ex){ + throw new ReportException(ex); + }finally{ + if(outStream!=null){ + try { + outStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + @Override + public boolean disabled() { + return disabled; + } + + public void setDisabled(boolean disabled) { + this.disabled = disabled; + } + + public void setFileStoreDir(String fileStoreDir) { + this.fileStoreDir = fileStoreDir; + } + + @Override + public String getPrefix() { + return prefix; + } + +} +*/ diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/provider/UreportDatabaseProvider.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/provider/UreportDatabaseProvider.java deleted file mode 100644 index ddaf7c7..0000000 --- a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/provider/UreportDatabaseProvider.java +++ /dev/null @@ -1,128 +0,0 @@ -package cn.iocoder.yudao.module.report.framework.ureport.provider; - -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.UreportFileSaveReqVO; -import cn.iocoder.yudao.module.report.dal.dataobject.ureport.UreportFileDO; -import cn.iocoder.yudao.module.report.service.ureport.UreportFileService; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.bstek.ureport.provider.report.ReportFile; -import com.bstek.ureport.provider.report.ReportProvider; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.report.enums.ErrorCodeConstants.UREPORT_FILE_EXISTS; -import static cn.iocoder.yudao.module.report.enums.ErrorCodeConstants.UREPORT_FILE_NOT_EXISTS; - -/** - * 提供数据库的存储方式 - * @author 赤焰 - */ -@Slf4j -@Setter -@Component -@ConfigurationProperties(prefix = "ureport.provider.database") -public class UreportDatabaseProvider implements ReportProvider{ - - private static final String NAME = "mysql-provider"; - - private String prefix = "mysql:"; - - private boolean disabled = false; - @Resource - private UreportFileService ureportFileService; - - @Override - public InputStream loadReport(String file) { - Long reportDo = ureportFileService.checkExistByName(getCorrectName(file)); - if (reportDo <=0) { - throw exception(UREPORT_FILE_NOT_EXISTS); - } - UreportFileDO ureportFileDO = ureportFileService.queryUreportFileDoByName(getCorrectName(file)); - byte[] content = ureportFileDO.getFileContent(); - return new ByteArrayInputStream(content); - } - - @Override - public void deleteReport(String file) { - ureportFileService.deleteReportFileByName(getCorrectName(file)); - } - - @Override - public List getReportFiles() { - List list = ureportFileService.queryReportFileList(); - List reportList = new ArrayList<>(); - if(CollUtil.isEmpty(list)){ - return reportList; - } - for (UreportFileDO reportFile : list) { - LocalDateTime updateTime = reportFile.getUpdateTime(); - ZonedDateTime zdt = updateTime.atZone(ZoneId.systemDefault()); - Date date = Date.from(zdt.toInstant()); - reportList.add(new ReportFile(reportFile.getFileName(),date)); - } - return reportList; - - } - - @Override - public void saveReport(String file, String content) { - file = getCorrectName(file); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(UreportFileDO::getFileName, file); - Long count = ureportFileService.checkExistByName(file); - if(count>1){ - throw exception(UREPORT_FILE_EXISTS); - } - UreportFileDO ureportFileDO = ureportFileService.queryUreportFileDoByName(file); - UreportFileSaveReqVO saveReqVO = new UreportFileSaveReqVO(); - if (ureportFileDO == null) { - saveReqVO.setFileName(file); - saveReqVO.setFileContent(content); - saveReqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - ureportFileService.createUreportFile(saveReqVO); - } else { - saveReqVO.setId(ureportFileDO.getId()); - saveReqVO.setFileName(file); - saveReqVO.setFileContent(content); - saveReqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); - ureportFileService.updateUreportFile(saveReqVO); - } - } - - @Override - public String getName() { - return NAME; - } - - @Override - public boolean disabled() { - return disabled; - } - - @Override - public String getPrefix() { - return prefix; - } - - private String getCorrectName(String name) { - if (name.startsWith(getPrefix())) { - name = name.substring(getPrefix().length()); - } - return name; - } -} diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/provider/UreportFileReportProvider.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/provider/UreportFileReportProvider.java deleted file mode 100644 index 504ba19..0000000 --- a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/provider/UreportFileReportProvider.java +++ /dev/null @@ -1,119 +0,0 @@ -/* -package cn.iocoder.yudao.module.report.framework.ureport.provider; - -import com.bstek.ureport.exception.ReportException; -import com.bstek.ureport.provider.report.ReportFile; -import com.bstek.ureport.provider.report.ReportProvider; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -import java.io.*; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; -import java.util.Objects; - -*/ -/** - * 自定义文件存储,可接入oss等 - * @author 赤焰 - *//* - -@Slf4j -@Component -@ConfigurationProperties(prefix = "ureport.provider.file") -public class UreportFileReportProvider implements ReportProvider{ - - private String prefix="reportFile:"; - private String fileStoreDir; - private boolean disabled; - - @Override - public InputStream loadReport(String file) { - if(file.startsWith(prefix)){ - file=file.substring(prefix.length(),file.length()); - } - String fullPath=fileStoreDir+"/"+file; - try { - return new FileInputStream(fullPath); - } catch (FileNotFoundException e) { - throw new ReportException(e); - } - } - - @Override - public void deleteReport(String file) { - if(file.startsWith(prefix)){ - file=file.substring(prefix.length(),file.length()); - } - String fullPath=fileStoreDir+"/"+file; - File f=new File(fullPath); - if(f.exists()){ - f.delete(); - } - } - - @Override - public List getReportFiles() { - File file=new File(fileStoreDir); - List list= new ArrayList<>(); - for(File f: Objects.requireNonNull(file.listFiles())){ - Calendar calendar=Calendar.getInstance(); - calendar.setTimeInMillis(f.lastModified()); - list.add(new ReportFile(f.getName(),calendar.getTime())); - } - list.sort((f1, f2) -> f2.getUpdateDate().compareTo(f1.getUpdateDate())); - return list; - } - - @Override - public String getName() { - return "文件存储系统"; - } - - @Override - public void saveReport(String file,String content) { - if(file.startsWith(prefix)){ - file=file.substring(prefix.length(),file.length()); - } - String fullPath=fileStoreDir+"/"+file; - FileOutputStream outStream=null; - try{ - outStream=new FileOutputStream(new File(fullPath)); - IOUtils.write(content, outStream,"utf-8"); - }catch(Exception ex){ - throw new ReportException(ex); - }finally{ - if(outStream!=null){ - try { - outStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - } - - @Override - public boolean disabled() { - return disabled; - } - - public void setDisabled(boolean disabled) { - this.disabled = disabled; - } - - public void setFileStoreDir(String fileStoreDir) { - this.fileStoreDir = fileStoreDir; - } - - @Override - public String getPrefix() { - return prefix; - } - -} -*/ diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/service/ureport/UreportFileServiceImpl.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/service/ureport/UreportFileServiceImpl.java index ccb47ef..00939af 100644 --- a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/service/ureport/UreportFileServiceImpl.java +++ b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/service/ureport/UreportFileServiceImpl.java @@ -73,6 +73,7 @@ public class UreportFileServiceImpl implements UreportFileService { @Override public Long checkExistByName(String name) { + // TODO @赤焰:Service 处理业务逻辑,不能出现 Mapper 层的东西,收敛成 mapper 的一个操作方法 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(UreportFileDO::getFileName,name); return ureportFileMapper.selectCount(queryWrapper); @@ -80,8 +81,10 @@ public class UreportFileServiceImpl implements UreportFileService { @Override public UreportFileDO queryUreportFileDoByName(String name) { + // TODO @赤焰:Service 处理业务逻辑,不能出现 Mapper 层的东西,收敛成 mapper 的一个操作方法 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(UreportFileDO::getFileName,name); + // TODO @赤焰:这里,可以用 selectByName 即可 List list = ureportFileMapper.selectList(queryWrapper); if(CollectionUtil.isNotEmpty(list)){ return list.get(0); @@ -91,14 +94,17 @@ public class UreportFileServiceImpl implements UreportFileService { @Override public List queryReportFileList() { + // TODO @赤焰:Service 处理业务逻辑,不能出现 Mapper 层的东西,收敛成 mapper 的一个操作方法 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); return ureportFileMapper.selectList(queryWrapper); } @Override public int deleteReportFileByName(String name) { + // TODO @赤焰:Service 处理业务逻辑,不能出现 Mapper 层的东西,收敛成 mapper 的一个操作方法 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(UreportFileDO::getFileName,name); return ureportFileMapper.delete(queryWrapper); } + } diff --git a/yudao-module-report/yudao-module-report-biz/src/main/resources/mapper/ureport/UreportFileMapper.xml b/yudao-module-report/yudao-module-report-biz/src/main/resources/mapper/ureport/UreportFileMapper.xml deleted file mode 100644 index 0a948a6..0000000 --- a/yudao-module-report/yudao-module-report-biz/src/main/resources/mapper/ureport/UreportFileMapper.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/yudao-module-report/yudao-module-report-biz/src/main/resources/ureport.properties b/yudao-module-report/yudao-module-report-biz/src/main/resources/ureport.properties index a4f9313..ef576d5 100644 --- a/yudao-module-report/yudao-module-report-biz/src/main/resources/ureport.properties +++ b/yudao-module-report/yudao-module-report-biz/src/main/resources/ureport.properties @@ -1,4 +1,5 @@ +## TODO ????????? application.yaml ????? ureport.disableHttpSessionReportCache=true ureport.disableFileProvider=true ureport.fileStoreDir=/WEB-INF/ureportfiles -ureport.debug=true +ureport.debug=true \ No newline at end of file diff --git a/yudao-module-report/yudao-module-report-biz/src/test/java/cn/iocoder/yudao/module/report/service/ureport/UreportFileServiceImplTest.java b/yudao-module-report/yudao-module-report-biz/src/test/java/cn/iocoder/yudao/module/report/service/ureport/UreportFileServiceImplTest.java index b9bc1ac..1cb2f3c 100644 --- a/yudao-module-report/yudao-module-report-biz/src/test/java/cn/iocoder/yudao/module/report/service/ureport/UreportFileServiceImplTest.java +++ b/yudao-module-report/yudao-module-report-biz/src/test/java/cn/iocoder/yudao/module/report/service/ureport/UreportFileServiceImplTest.java @@ -1,33 +1,27 @@ package cn.iocoder.yudao.module.report.service.ureport; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; - -import javax.annotation.Resource; - +import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; - -import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.*; +import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.UreportFilePageReqVO; +import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.UreportFileSaveReqVO; import cn.iocoder.yudao.module.report.dal.dataobject.ureport.UreportFileDO; import cn.iocoder.yudao.module.report.dal.mysql.ureport.UreportFileMapper; -import cn.iocoder.yudao.framework.common.pojo.PageResult; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.context.annotation.Import; import javax.annotation.Resource; -import org.springframework.context.annotation.Import; -import java.util.*; -import java.time.LocalDateTime; - -import static cn.hutool.core.util.RandomUtil.*; -import static cn.iocoder.yudao.module.report.enums.ErrorCodeConstants.*; -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; + +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; +import static cn.iocoder.yudao.module.report.enums.ErrorCodeConstants.UREPORT_FILE_NOT_EXISTS; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; +// TODO 芋艿:但愿测试后面补 /** * {@link UreportFileServiceImpl} 的单元测试类 * diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 4a277d5..193196a 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -264,6 +264,7 @@ justauth: prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE:: timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 +# TODO 赤焰:这个配置的目的是? #ureport配置 #ureport: # disableHttpSessionReportCache: true #是否禁用 diff --git a/yudao-server/src/main/resources/application.yaml b/yudao-server/src/main/resources/application.yaml index c70e44b..6aceca4 100644 --- a/yudao-server/src/main/resources/application.yaml +++ b/yudao-server/src/main/resources/application.yaml @@ -190,7 +190,7 @@ yudao: - /admin-api/system/sms/callback/* # 短信回调接口,无法带上租户编号 - /admin-api/pay/notify/** # 支付回调通知,不携带租户编号 - /jmreport/* # 积木报表,无法携带租户编号 - - /ureport/* # ureport报表,无法携带租户编号 + - /ureport/* # UReport 报表,无法携带租户编号 - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,无法携带租户编号 ignore-tables: - system_tenant @@ -259,11 +259,12 @@ yudao: debug: false -#积木报表配置 +# 积木报表配置 minidao : base-package: org.jeecg.modules.jmreport.desreport.dao* db-type: mysql -#ureport配置 + +# UReport 配置 ureport: provider: database: -- libgit2 0.21.4