mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 02:08:43 +08:00 
			
		
		
		
	【优化】ureport2菜单,初始化数据,按照规范重新进行命名处理
This commit is contained in:
		
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -13,7 +13,7 @@ public interface ErrorCodeConstants { | ||||
|     ErrorCode GO_VIEW_PROJECT_NOT_EXISTS = new ErrorCode(1_003_000_000, "GoView 项目不存在"); | ||||
|  | ||||
|     // ========== 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, "报表名字已存在,请修改后再保存"); | ||||
|     ErrorCode REPORT_DATA_NOT_EXISTS = new ErrorCode(1_003_001_001, "Ureport2报表不存在"); | ||||
|  | ||||
|     ErrorCode REPORT_DATABASE_NOT_EXISTS = new ErrorCode(1_003_001_001, "Ureport2报表数据源不存在"); | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,95 @@ | ||||
| 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.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.dal.dataobject.ureport.UReportDataDO; | ||||
| import cn.iocoder.yudao.module.report.service.ureport.UReportDataService; | ||||
|  | ||||
| @Tag(name = "管理后台 - Ureport2报表") | ||||
| @RestController | ||||
| @RequestMapping("/report/ureport-data") | ||||
| @Validated | ||||
| public class UReportDataController { | ||||
|  | ||||
|     @Resource | ||||
|     private UReportDataService uReportDataService; | ||||
|  | ||||
|     @PostMapping("/create") | ||||
|     @Operation(summary = "创建Ureport2报表") | ||||
|     @PreAuthorize("@ss.hasPermission('report:ureport-data:create')") | ||||
|     public CommonResult<Long> createUReportData(@Valid @RequestBody UReportDataSaveReqVO createReqVO) { | ||||
|         return success(uReportDataService.createUReportData(createReqVO)); | ||||
|     } | ||||
|  | ||||
|     @PutMapping("/update") | ||||
|     @Operation(summary = "更新Ureport2报表") | ||||
|     @PreAuthorize("@ss.hasPermission('report:ureport-data:update')") | ||||
|     public CommonResult<Boolean> updateUReportData(@Valid @RequestBody UReportDataSaveReqVO updateReqVO) { | ||||
|         uReportDataService.updateUReportData(updateReqVO); | ||||
|         return success(true); | ||||
|     } | ||||
|  | ||||
|     @DeleteMapping("/delete") | ||||
|     @Operation(summary = "删除Ureport2报表") | ||||
|     @Parameter(name = "id", description = "编号", required = true) | ||||
|     @PreAuthorize("@ss.hasPermission('report:ureport-data:delete')") | ||||
|     public CommonResult<Boolean> deleteUReportData(@RequestParam("id") Long id) { | ||||
|         uReportDataService.deleteUReportData(id); | ||||
|         return success(true); | ||||
|     } | ||||
|  | ||||
|     @GetMapping("/get") | ||||
|     @Operation(summary = "获得Ureport2报表") | ||||
|     @Parameter(name = "id", description = "编号", required = true, example = "1024") | ||||
|     @PreAuthorize("@ss.hasPermission('report:ureport-data:query')") | ||||
|     public CommonResult<UReportDataRespVO> getUReportData(@RequestParam("id") Long id) { | ||||
|         UReportDataDO uReportData = uReportDataService.getUReportData(id); | ||||
|         return success(BeanUtils.toBean(uReportData, UReportDataRespVO.class)); | ||||
|     } | ||||
|  | ||||
|     @GetMapping("/page") | ||||
|     @Operation(summary = "获得Ureport2报表分页") | ||||
|     @PreAuthorize("@ss.hasPermission('report:ureport-data:query')") | ||||
|     public CommonResult<PageResult<UReportDataRespVO>> getUReportDataPage(@Valid UReportDataPageReqVO pageReqVO) { | ||||
|         PageResult<UReportDataDO> pageResult = uReportDataService.getUReportDataPage(pageReqVO); | ||||
|         return success(BeanUtils.toBean(pageResult, UReportDataRespVO.class)); | ||||
|     } | ||||
|  | ||||
|     @GetMapping("/export-excel") | ||||
|     @Operation(summary = "导出Ureport2报表 Excel") | ||||
|     @PreAuthorize("@ss.hasPermission('report:ureport-data:export')") | ||||
|     @OperateLog(type = EXPORT) | ||||
|     public void exportUReportDataExcel(@Valid UReportDataPageReqVO pageReqVO, | ||||
|               HttpServletResponse response) throws IOException { | ||||
|         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); | ||||
|         List<UReportDataDO> list = uReportDataService.getUReportDataPage(pageReqVO).getList(); | ||||
|         // 导出 Excel | ||||
|         ExcelUtils.write(response, "Ureport2报表.xls", "数据", UReportDataRespVO.class, | ||||
|                         BeanUtils.toBean(list, UReportDataRespVO.class)); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,95 +0,0 @@ | ||||
| package cn.iocoder.yudao.module.report.controller.admin.ureport; | ||||
|  | ||||
| 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.util.object.BeanUtils; | ||||
| import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; | ||||
| import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; | ||||
| 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; | ||||
|  | ||||
| // TODO @赤焰: Ureport 改成 UReport | ||||
| @Tag(name = "管理后台 - UReport2 报表") | ||||
| @RestController | ||||
| @RequestMapping("/report/ureport-file") | ||||
| @Validated | ||||
| public class UreportFileController { | ||||
|  | ||||
|     @Resource | ||||
|     private UreportFileService ureportFileService; | ||||
|  | ||||
|     @PostMapping("/create") | ||||
|     @Operation(summary = "创建 UReport2 报表") | ||||
|     @PreAuthorize("@ss.hasPermission('report:ureport-file:create')") | ||||
|     public CommonResult<Long> createUreportFile(@Valid @RequestBody UreportFileSaveReqVO createReqVO) { | ||||
|         return success(ureportFileService.createUreportFile(createReqVO)); | ||||
|     } | ||||
|  | ||||
|     @PutMapping("/update") | ||||
|     @Operation(summary = "更新 UReport2 报表") | ||||
|     @PreAuthorize("@ss.hasPermission('report:ureport-file:update')") | ||||
|     public CommonResult<Boolean> updateUreportFile(@Valid @RequestBody UreportFileSaveReqVO updateReqVO) { | ||||
|         ureportFileService.updateUreportFile(updateReqVO); | ||||
|         return success(true); | ||||
|     } | ||||
|  | ||||
|     @DeleteMapping("/delete") | ||||
|     @Operation(summary = "删除 UReport2 报表") | ||||
|     @Parameter(name = "id", description = "编号", required = true) | ||||
|     @PreAuthorize("@ss.hasPermission('report:ureport-file:delete')") | ||||
|     public CommonResult<Boolean> deleteUreportFile(@RequestParam("id") Long id) { | ||||
|         ureportFileService.deleteUreportFile(id); | ||||
|         return success(true); | ||||
|     } | ||||
|  | ||||
|     @GetMapping("/get") | ||||
|     @Operation(summary = "获得 UReport2 报表") | ||||
|     @Parameter(name = "id", description = "编号", required = true, example = "1024") | ||||
|     @PreAuthorize("@ss.hasPermission('report:ureport-file:query')") | ||||
|     public CommonResult<UreportFileRespVO> getUreportFile(@RequestParam("id") Long id) { | ||||
|         UreportFileDO ureportFile = ureportFileService.getUreportFile(id); | ||||
|         return success(BeanUtils.toBean(ureportFile, UreportFileRespVO.class)); | ||||
|     } | ||||
|  | ||||
|     @GetMapping("/page") | ||||
|     @Operation(summary = "获得 UReport2 报表分页") | ||||
|     @PreAuthorize("@ss.hasPermission('report:ureport-file:query')") | ||||
|     public CommonResult<PageResult<UreportFileRespVO>> getUreportFilePage(@Valid UreportFilePageReqVO pageReqVO) { | ||||
|         PageResult<UreportFileDO> pageResult = ureportFileService.getUreportFilePage(pageReqVO); | ||||
|         return success(BeanUtils.toBean(pageResult, UreportFileRespVO.class)); | ||||
|     } | ||||
|  | ||||
|     // TODO @赤焰:导出是必须的么?没用可以删除哈 | ||||
|     @GetMapping("/export-excel") | ||||
|     @Operation(summary = "导出 UReport2 报表 Excel") | ||||
|     @PreAuthorize("@ss.hasPermission('report:ureport-file:export')") | ||||
|     @OperateLog(type = EXPORT) | ||||
|     public void exportUreportFileExcel(@Valid UreportFilePageReqVO pageReqVO, | ||||
|               HttpServletResponse response) throws IOException { | ||||
|         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); | ||||
|         List<UreportFileDO> list = ureportFileService.getUreportFilePage(pageReqVO).getList(); | ||||
|         // 导出 Excel | ||||
|         ExcelUtils.write(response, "Ureport2报表.xls", "数据", UreportFileRespVO.class, | ||||
|                         BeanUtils.toBean(list, UreportFileRespVO.class)); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -13,15 +13,15 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ | ||||
| @Data | ||||
| @EqualsAndHashCode(callSuper = true) | ||||
| @ToString(callSuper = true) | ||||
| public class UreportFilePageReqVO extends PageParam { | ||||
| public class UReportDataPageReqVO extends PageParam { | ||||
| 
 | ||||
|     @Schema(description = "文件名称", example = "赵六") | ||||
|     private String fileName; | ||||
|     @Schema(description = "文件名称", example = "李四") | ||||
|     private String name; | ||||
| 
 | ||||
|     @Schema(description = "状态", example = "1") | ||||
|     private Integer status; | ||||
| 
 | ||||
|     @Schema(description = "备注", example = "随便") | ||||
|     @Schema(description = "备注", example = "你猜") | ||||
|     private String remark; | ||||
| 
 | ||||
|     @Schema(description = "创建时间") | ||||
| @@ -1,6 +1,7 @@ | ||||
| package cn.iocoder.yudao.module.report.controller.admin.ureport.vo; | ||||
| 
 | ||||
| import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; | ||||
| import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; | ||||
| import cn.iocoder.yudao.module.system.enums.DictTypeConstants; | ||||
| import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||||
| import com.alibaba.excel.annotation.ExcelProperty; | ||||
| @@ -12,22 +13,26 @@ import java.time.LocalDateTime; | ||||
| @Schema(description = "管理后台 - Ureport2报表 Response VO") | ||||
| @Data | ||||
| @ExcelIgnoreUnannotated | ||||
| public class UreportFileRespVO { | ||||
| public class UReportDataRespVO { | ||||
| 
 | ||||
|     @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "9948") | ||||
|     @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26175") | ||||
|     @ExcelProperty("ID") | ||||
|     private Long id; | ||||
| 
 | ||||
|     @Schema(description = "文件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") | ||||
|     @Schema(description = "文件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") | ||||
|     @ExcelProperty("文件名称") | ||||
|     private String fileName; | ||||
|     private String name; | ||||
| 
 | ||||
|     @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||||
|     @ExcelProperty("状态") | ||||
|     @ExcelProperty(value = "状态", converter = DictConvert.class) | ||||
|     @DictFormat(DictTypeConstants.COMMON_STATUS) | ||||
|     private Integer status; | ||||
| 
 | ||||
|     @Schema(description = "备注", example = "随便") | ||||
|     @Schema(description = "文件内容") | ||||
|     @ExcelProperty("文件内容") | ||||
|     private String content; | ||||
| 
 | ||||
|     @Schema(description = "备注", example = "你猜") | ||||
|     @ExcelProperty("备注") | ||||
|     private String remark; | ||||
| 
 | ||||
| @@ -1,33 +1,30 @@ | ||||
| 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.Data; | ||||
| 
 | ||||
| import javax.validation.constraints.NotEmpty; | ||||
| import javax.validation.constraints.NotNull; | ||||
| import lombok.*; | ||||
| import java.util.*; | ||||
| import javax.validation.constraints.*; | ||||
| import java.util.*; | ||||
| 
 | ||||
| @Schema(description = "管理后台 - Ureport2报表新增/修改 Request VO") | ||||
| @Data | ||||
| public class UreportFileSaveReqVO { | ||||
| public class UReportDataSaveReqVO { | ||||
| 
 | ||||
|     @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "9948") | ||||
|     @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26175") | ||||
|     private Long id; | ||||
| 
 | ||||
|     @Schema(description = "文件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") | ||||
|     @Schema(description = "文件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") | ||||
|     @NotEmpty(message = "文件名称不能为空") | ||||
|     private String fileName; | ||||
|     private String name; | ||||
| 
 | ||||
|     @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||||
|     @NotNull(message = "状态不能为空") | ||||
|     @InEnum(CommonStatusEnum.class) | ||||
|     private Integer status; | ||||
| 
 | ||||
|     @Schema(description = "文件内容") | ||||
|     private String fileContent; | ||||
|     private String content; | ||||
| 
 | ||||
|     @Schema(description = "备注", example = "随便") | ||||
|     @Schema(description = "备注", example = "你猜") | ||||
|     private String remark; | ||||
| 
 | ||||
| } | ||||
| @@ -1,5 +1,6 @@ | ||||
| package cn.iocoder.yudao.module.report.dal.dataobject.ureport; | ||||
| 
 | ||||
| import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||||
| import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | ||||
| import com.baomidou.mybatisplus.annotation.KeySequence; | ||||
| import com.baomidou.mybatisplus.annotation.TableId; | ||||
| @@ -11,35 +12,35 @@ import lombok.*; | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| @TableName("ureport_file") | ||||
| @KeySequence("ureport_file_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 | ||||
| @TableName("report_ureport_data") | ||||
| @KeySequence("report_ureport_data_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 | ||||
| @Data | ||||
| @EqualsAndHashCode(callSuper = true) | ||||
| @ToString(callSuper = true) | ||||
| @Builder | ||||
| @NoArgsConstructor | ||||
| @AllArgsConstructor | ||||
| public class UreportFileDO extends BaseDO { | ||||
| public class UReportDataDO extends BaseDO { | ||||
| 
 | ||||
|     /** | ||||
|      * ID | ||||
|      */ | ||||
|     @TableId | ||||
|     private Long id; | ||||
|     // TODO @赤焰:是不是用 name 就可以了。 | ||||
|     /** | ||||
|      * 文件名称 | ||||
|      */ | ||||
|     private String fileName; | ||||
|     private String name; | ||||
|     /** | ||||
|      * 状态 | ||||
|      * | ||||
|      * 枚举  {@link  CommonStatusEnum#getStatus()} | ||||
|      */ | ||||
|     private Integer status; | ||||
|     // TODO @赤焰:是不是用 string 就可以了。然后字段名用 content? | ||||
|     /** | ||||
|      * 文件内容 | ||||
|      */ | ||||
|     private byte[] fileContent; | ||||
|     private String content; | ||||
|     /** | ||||
|      * 备注 | ||||
|      */ | ||||
| @@ -0,0 +1,60 @@ | ||||
| package cn.iocoder.yudao.module.report.dal.mysql.ureport; | ||||
|  | ||||
| import java.util.*; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | ||||
| import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | ||||
| import cn.iocoder.yudao.module.report.dal.dataobject.ureport.UReportDataDO; | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
| import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.*; | ||||
|  | ||||
| /** | ||||
|  * Ureport2报表 Mapper | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| @Mapper | ||||
| public interface UReportDataMapper extends BaseMapperX<UReportDataDO> { | ||||
|  | ||||
|     default PageResult<UReportDataDO> selectPage(UReportDataPageReqVO reqVO) { | ||||
|         return selectPage(reqVO, new LambdaQueryWrapperX<UReportDataDO>() | ||||
|                 .likeIfPresent(UReportDataDO::getName, reqVO.getName()) | ||||
|                 .eqIfPresent(UReportDataDO::getStatus, reqVO.getStatus()) | ||||
|                 .eqIfPresent(UReportDataDO::getRemark, reqVO.getRemark()) | ||||
|                 .betweenIfPresent(UReportDataDO::getCreateTime, reqVO.getCreateTime()) | ||||
|                 .orderByDesc(UReportDataDO::getId)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据名字查询报表 | ||||
|      * @param name 报表名字 | ||||
|      * @return | ||||
|      */ | ||||
|     default List<UReportDataDO> selectByName(String name){ | ||||
|         return selectList(new LambdaQueryWrapperX<UReportDataDO>() | ||||
|                 .eqIfPresent(UReportDataDO::getName,name)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据名字查询报表 | ||||
|      * @param name 报表名字 | ||||
|      * @return | ||||
|      */ | ||||
|     default UReportDataDO selectOneByName(String name){ | ||||
|         return selectOne(new LambdaQueryWrapperX<UReportDataDO>() | ||||
|                 .eqIfPresent(UReportDataDO::getName,name)); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * 根据名字删除报表 | ||||
|      * @param name 报表名字 | ||||
|      * @return | ||||
|      */ | ||||
|     default int deleteByName(String name){ | ||||
|         return delete(new LambdaQueryWrapperX<UReportDataDO>() | ||||
|                 .eqIfPresent(UReportDataDO::getName,name)); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,29 +0,0 @@ | ||||
| package cn.iocoder.yudao.module.report.dal.mysql.ureport; | ||||
|  | ||||
| import java.util.*; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; | ||||
| import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | ||||
| import cn.iocoder.yudao.module.report.dal.dataobject.ureport.UreportFileDO; | ||||
| import org.apache.ibatis.annotations.Mapper; | ||||
| import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.*; | ||||
|  | ||||
| /** | ||||
|  * Ureport2报表 Mapper | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| @Mapper | ||||
| public interface UreportFileMapper extends BaseMapperX<UreportFileDO> { | ||||
|  | ||||
|     default PageResult<UreportFileDO> selectPage(UreportFilePageReqVO reqVO) { | ||||
|         return selectPage(reqVO, new LambdaQueryWrapperX<UreportFileDO>() | ||||
|                 .likeIfPresent(UreportFileDO::getFileName, reqVO.getFileName()) | ||||
|                 .eqIfPresent(UreportFileDO::getStatus, reqVO.getStatus()) | ||||
|                 .eqIfPresent(UreportFileDO::getRemark, reqVO.getRemark()) | ||||
|                 .betweenIfPresent(UreportFileDO::getCreateTime, reqVO.getCreateTime()) | ||||
|                 .orderByDesc(UreportFileDO::getId)); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,10 +1,17 @@ | ||||
| package cn.iocoder.yudao.module.report.framework.security.config; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum; | ||||
| import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer; | ||||
| import cn.iocoder.yudao.framework.security.config.SecurityProperties; | ||||
| import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi; | ||||
| import org.springframework.boot.web.servlet.FilterRegistrationBean; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.security.config.annotation.web.builders.HttpSecurity; | ||||
| import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; | ||||
| import org.springframework.util.StringUtils; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
|  | ||||
| /** | ||||
|  * Report 模块的 Security 配置 | ||||
| @@ -12,6 +19,9 @@ import org.springframework.security.config.annotation.web.configurers.Expression | ||||
| @Configuration("reportSecurityConfiguration") | ||||
| public class SecurityConfiguration { | ||||
|  | ||||
|     @Resource | ||||
|     private OAuth2TokenApi oauth2TokenApi; | ||||
|  | ||||
|     @Bean("reportAuthorizeRequestsCustomizer") | ||||
|     public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() { | ||||
|         return new AuthorizeRequestsCustomizer() { | ||||
| @@ -25,4 +35,16 @@ public class SecurityConfiguration { | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * 创建 UReportFilter 过滤器,响应 header 设置 token | ||||
|      */ | ||||
|     /*@Bean | ||||
|     public FilterRegistrationBean<UReportFilter> uReportFilterFilterRegistrationBean() { | ||||
|         FilterRegistrationBean<UReportFilter> registrationBean = new FilterRegistrationBean<>(); | ||||
|         registrationBean.setFilter(new UReportFilter(oauth2TokenApi)); | ||||
|         registrationBean.setOrder(WebFilterOrderEnum.TRACE_FILTER); | ||||
|         return registrationBean; | ||||
|     }*/ | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,80 @@ | ||||
| package cn.iocoder.yudao.module.report.framework.security.config; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.exception.ServiceException; | ||||
| import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; | ||||
| import cn.iocoder.yudao.framework.security.core.LoginUser; | ||||
| import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; | ||||
| import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; | ||||
| import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; | ||||
| import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi; | ||||
| import cn.iocoder.yudao.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO; | ||||
| import lombok.Data; | ||||
| import lombok.RequiredArgsConstructor; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.web.filter.OncePerRequestFilter; | ||||
|  | ||||
| import javax.servlet.FilterChain; | ||||
| import javax.servlet.ServletException; | ||||
| import javax.servlet.http.HttpServletRequest; | ||||
| import javax.servlet.http.HttpServletResponse; | ||||
| import java.io.IOException; | ||||
| import java.util.Map; | ||||
|  | ||||
| /** | ||||
|  * UReport 认证过滤器 | ||||
|  * @author 赤焰 | ||||
|  */ | ||||
| @Slf4j | ||||
| @RequiredArgsConstructor | ||||
| public class UReportFilter extends OncePerRequestFilter { | ||||
|  | ||||
|     private final static String TOKEN = "token"; | ||||
|  | ||||
|     private final OAuth2TokenApi oauth2TokenApi; | ||||
|  | ||||
|     @Override | ||||
|     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) | ||||
|             throws ServletException, IOException { | ||||
|  | ||||
|         if(log.isDebugEnabled()){ | ||||
|             log.debug("UReportFilter自定义过滤器"); | ||||
|         } | ||||
|  | ||||
|         Map<String, String> paramMap = ServletUtils.getParamMap(request); | ||||
|         String requestURI = request.getRequestURI(); | ||||
|         boolean contains = requestURI.contains("/ureport"); | ||||
|         if (paramMap.containsKey(TOKEN)&&contains) { | ||||
|            String token = request.getParameter(TOKEN); | ||||
|             if(log.isDebugEnabled()){ | ||||
|                 log.debug("UReportFilter自定义过滤器 token="+token); | ||||
|             } | ||||
|  | ||||
|             response.addHeader(TOKEN,token); | ||||
|  | ||||
|             TenantContextHolder.setIgnore(true); // 忽略租户,保证可查询到 token 信息 | ||||
|             LoginUser user = null; | ||||
|             try { | ||||
|                 OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token); | ||||
|                 if (accessToken != null) { | ||||
|                     user = new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType()) | ||||
|                             .setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes()); | ||||
|                     if (user != null) { | ||||
|                         SecurityFrameworkUtils.setLoginUser(user, WebFrameworkUtils.getRequest()); | ||||
|  | ||||
|                         // ② 参考 TenantContextWebFilter 实现(Tenant 的上下文清理,交给 TenantContextWebFilter 完成) | ||||
|                         // 目的:基于 LoginUser 获得到的租户编号,设置到 Tenant 上下文,避免查询数据库时的报错 | ||||
|                         TenantContextHolder.setIgnore(false); | ||||
|                         TenantContextHolder.setTenantId(user.getTenantId()); | ||||
|                     } | ||||
|                 } | ||||
|             } catch (ServiceException ignored) { | ||||
|                 chain.doFilter(request, response); | ||||
|             } | ||||
|  | ||||
|         } | ||||
|  | ||||
|         // 继续过滤 | ||||
|         chain.doFilter(request, response); | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,17 @@ | ||||
| package cn.iocoder.yudao.module.report.framework.security.config; | ||||
|  | ||||
| import lombok.Data; | ||||
| import org.springframework.boot.context.properties.ConfigurationProperties; | ||||
|  | ||||
| /** | ||||
|  * UReport配置类 | ||||
|  * | ||||
|  * @author 赤焰 | ||||
|  */ | ||||
| @Data | ||||
| @ConfigurationProperties(prefix = "ureport.provider.database") | ||||
| public class UReportProperties { | ||||
| 	private String name = "数据库文件系统"; | ||||
| 	private String prefix = "db-"; | ||||
| 	private boolean disabled = false; | ||||
| } | ||||
| @@ -1,6 +1,8 @@ | ||||
| package cn.iocoder.yudao.module.report.framework.ureport.config; | ||||
| 
 | ||||
| import cn.iocoder.yudao.module.report.framework.security.config.UReportProperties; | ||||
| import com.bstek.ureport.console.UReportServlet; | ||||
| import org.springframework.boot.context.properties.EnableConfigurationProperties; | ||||
| import org.springframework.boot.web.servlet.ServletRegistrationBean; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| @@ -15,13 +17,13 @@ import javax.servlet.Servlet; | ||||
|  * @author 赤焰 | ||||
|  */ | ||||
| @Configuration | ||||
| @ImportResource({"classpath:ureport-console-context.xml"}) // Bean 配置 | ||||
| @PropertySource(value = {"classpath:ureport.properties"}) // 配置文件 | ||||
| public class UreportConfiguration { | ||||
| @ImportResource({"classpath:ureport-console-context.xml"}) | ||||
| @PropertySource(value = {"classpath:ureport.properties"}) | ||||
| @EnableConfigurationProperties({UReportProperties.class}) | ||||
| public class UReportConfiguration { | ||||
| 
 | ||||
|     // TODO @赤焰:bean 是不是取个和 ureport 相关的名字好点哈? | ||||
|     @Bean | ||||
|     public ServletRegistrationBean<Servlet> registrationBean() { | ||||
|     public ServletRegistrationBean<Servlet> uReportRegistrationBean() { | ||||
|         return new ServletRegistrationBean<>(new UReportServlet(), "/ureport/*"); | ||||
|     } | ||||
| 
 | ||||
| @@ -9,14 +9,18 @@ import javax.sql.DataSource; | ||||
| import java.sql.Connection; | ||||
| import java.sql.SQLException; | ||||
| 
 | ||||
| import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||
| import static cn.iocoder.yudao.module.report.enums.ErrorCodeConstants.REPORT_DATABASE_NOT_EXISTS; | ||||
| 
 | ||||
| /** | ||||
|  * UReport 内置数据源 | ||||
|  * @author 赤焰 | ||||
|  */ | ||||
| @Slf4j | ||||
| @Component | ||||
| public class UreportDataSource implements BuildinDatasource { | ||||
| public class UReportDataSource implements BuildinDatasource { | ||||
| 
 | ||||
| 	private static final String NAME = "UreportDataSource"; | ||||
| 	private static final String NAME = "UReportDataSource"; | ||||
| 
 | ||||
| 	@Resource | ||||
| 	private DataSource dataSource; | ||||
| @@ -29,7 +33,6 @@ public class UreportDataSource implements BuildinDatasource { | ||||
| 		return NAME; | ||||
| 	} | ||||
| 
 | ||||
|     // TODO @赤焰:这个方法,如果拿不到连接,是不是抛出异常比较好? | ||||
| 	/** | ||||
| 	 * @return 获取连接 | ||||
| 	 */ | ||||
| @@ -38,10 +41,9 @@ public class UreportDataSource implements BuildinDatasource { | ||||
| 		try { | ||||
| 			return dataSource.getConnection(); | ||||
| 		} catch (SQLException e) { | ||||
| 			log.error("Ureport 数据源 获取连接失败!"); | ||||
| 			e.printStackTrace(); | ||||
| 			log.error("UReportDataSource获取连接失败!"); | ||||
| 			throw exception(REPORT_DATABASE_NOT_EXISTS); | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| @@ -0,0 +1,106 @@ | ||||
| package cn.iocoder.yudao.module.report.framework.ureport.core; | ||||
|  | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.date.DateUtils; | ||||
| import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.UReportDataSaveReqVO; | ||||
| import cn.iocoder.yudao.module.report.dal.dataobject.ureport.UReportDataDO; | ||||
| import cn.iocoder.yudao.module.report.framework.security.config.UReportProperties; | ||||
| import cn.iocoder.yudao.module.report.service.ureport.UReportDataService; | ||||
| 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.beans.factory.annotation.Autowired; | ||||
| import org.springframework.stereotype.Component; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
| import java.io.ByteArrayInputStream; | ||||
| import java.io.InputStream; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * 基于数据库的 {@link ReportProvider} 实现类 | ||||
|  * | ||||
|  * @author 赤焰 | ||||
|  */ | ||||
| @Component | ||||
| @Slf4j | ||||
| @Setter | ||||
| public class UReportDatabaseProvider implements ReportProvider { | ||||
|  | ||||
|     @Autowired | ||||
|     private UReportProperties uReportProperties; | ||||
|     @Resource | ||||
|     private UReportDataService uReportDataService; | ||||
|  | ||||
|     @Override | ||||
|     public InputStream loadReport(String name) { | ||||
|         uReportDataService.validateUReportDataExists(getCorrectName(name)); | ||||
|         UReportDataDO uReportDataDO = uReportDataService.selectOneByName(getCorrectName(name)); | ||||
|         String content = uReportDataDO.getContent(); | ||||
|         return new ByteArrayInputStream(content.getBytes()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void deleteReport(String name) { | ||||
|         uReportDataService.deleteByName(getCorrectName(name)); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<ReportFile> getReportFiles() { | ||||
|         List<UReportDataDO> list = uReportDataService.getReportDataList(); | ||||
|         if(CollUtil.isEmpty(list)) { | ||||
|             return Collections.emptyList(); | ||||
|         } | ||||
|         return CollectionUtils.convertList(list, report -> new ReportFile(report.getName(), DateUtils.of(report.getUpdateTime()))); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void saveReport(String name, String content) { | ||||
|         name = getCorrectName(name); | ||||
|         UReportDataDO uReportDataDO = uReportDataService.selectOneByName(name); | ||||
|         UReportDataSaveReqVO saveReqVO = new UReportDataSaveReqVO(); | ||||
|         if (uReportDataDO == null) { | ||||
|             saveReqVO.setName(name); | ||||
|             saveReqVO.setContent(content); | ||||
|             saveReqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); | ||||
|             uReportDataService.createUReportData(saveReqVO); | ||||
|         } else { | ||||
|             saveReqVO.setId(uReportDataDO.getId()); | ||||
|             saveReqVO.setName(name); | ||||
|             saveReqVO.setContent(content); | ||||
|             saveReqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); | ||||
|             uReportDataService.updateUReportData(saveReqVO); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getName() { | ||||
|         return uReportProperties.getName(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean disabled() { | ||||
|         return uReportProperties.isDisabled(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getPrefix() { | ||||
|         return uReportProperties.getPrefix(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 去除存储媒介,获取报表名字 | ||||
|      * @param name 前端传入的报表带存储媒介的名字 | ||||
|      * @return | ||||
|      */ | ||||
|     private String getCorrectName(String name) { | ||||
|         return StrUtil.removePrefix(name,getPrefix()); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,142 +0,0 @@ | ||||
| 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<ReportFile> getReportFiles() { | ||||
|         // TODO @赤焰:queryReportFileList 改成 getReportFileList 更合适,保持整个项目的命名风格一致性。 | ||||
|         List<UreportFileDO> list = ureportFileService.queryReportFileList(); | ||||
|         List<ReportFile> 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<UreportFileDO> 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; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,120 +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; | ||||
|  | ||||
| // 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<ReportFile> getReportFiles() { | ||||
|         File file=new File(fileStoreDir); | ||||
|         List<ReportFile> 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; | ||||
|     } | ||||
|  | ||||
| } | ||||
| */ | ||||
| @@ -1,9 +1,9 @@ | ||||
| package cn.iocoder.yudao.module.report.service.ureport; | ||||
| 
 | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| 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.controller.admin.ureport.vo.UReportDataPageReqVO; | ||||
| import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.UReportDataSaveReqVO; | ||||
| import cn.iocoder.yudao.module.report.dal.dataobject.ureport.UReportDataDO; | ||||
| 
 | ||||
| import javax.validation.Valid; | ||||
| import java.util.List; | ||||
| @@ -13,7 +13,7 @@ import java.util.List; | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| public interface UreportFileService  { | ||||
| public interface UReportDataService { | ||||
| 
 | ||||
|     /** | ||||
|      * 创建Ureport2报表 | ||||
| @@ -21,21 +21,21 @@ public interface UreportFileService  { | ||||
|      * @param createReqVO 创建信息 | ||||
|      * @return 编号 | ||||
|      */ | ||||
|     Long createUreportFile(@Valid UreportFileSaveReqVO createReqVO); | ||||
|     Long createUReportData(@Valid UReportDataSaveReqVO createReqVO); | ||||
| 
 | ||||
|     /** | ||||
|      * 更新Ureport2报表 | ||||
|      * | ||||
|      * @param updateReqVO 更新信息 | ||||
|      */ | ||||
|     void updateUreportFile(@Valid UreportFileSaveReqVO updateReqVO); | ||||
|     void updateUReportData(@Valid UReportDataSaveReqVO updateReqVO); | ||||
| 
 | ||||
|     /** | ||||
|      * 删除Ureport2报表 | ||||
|      * | ||||
|      * @param id 编号 | ||||
|      */ | ||||
|     void deleteUreportFile(Long id); | ||||
|     void deleteUReportData(Long id); | ||||
| 
 | ||||
|     /** | ||||
|      * 获得Ureport2报表 | ||||
| @@ -43,7 +43,7 @@ public interface UreportFileService  { | ||||
|      * @param id 编号 | ||||
|      * @return Ureport2报表 | ||||
|      */ | ||||
|     UreportFileDO getUreportFile(Long id); | ||||
|     UReportDataDO getUReportData(Long id); | ||||
| 
 | ||||
|     /** | ||||
|      * 获得Ureport2报表分页 | ||||
| @@ -51,36 +51,32 @@ public interface UreportFileService  { | ||||
|      * @param pageReqVO 分页查询 | ||||
|      * @return Ureport2报表分页 | ||||
|      */ | ||||
|     PageResult<UreportFileDO> getUreportFilePage(UreportFilePageReqVO pageReqVO); | ||||
| 
 | ||||
|     PageResult<UReportDataDO> getUReportDataPage(UReportDataPageReqVO pageReqVO); | ||||
| 
 | ||||
|     /** | ||||
|      *  根据报表名称检查报表是否存在 | ||||
|      * @param name 报表名称 | ||||
|      * @return | ||||
|      */ | ||||
|     Long checkExistByName(String name); | ||||
| 
 | ||||
|     /** | ||||
|      *  根据报表名称查询报表 | ||||
|      * @param name 报表名称 | ||||
|      * @return | ||||
|      */ | ||||
|      UreportFileDO queryUreportFileDoByName(String name); | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * 查询全部报表 | ||||
|      * @return | ||||
|      */ | ||||
|     List<UreportFileDO> queryReportFileList(); | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * 根据报表名称删除报表 | ||||
|      * 根据名称删除报表 | ||||
|      * @param name | ||||
|      * @return | ||||
|      */ | ||||
|      int deleteReportFileByName(String name); | ||||
|     int deleteByName(String name); | ||||
| 
 | ||||
|     /** | ||||
|      * 根据名称校验报表是否存在 | ||||
|      * @param name | ||||
|      */ | ||||
|     void validateUReportDataExists(String name); | ||||
| 
 | ||||
|     /** | ||||
|      * 根据名称查询报表 | ||||
|      * @param name | ||||
|      * @return | ||||
|      */ | ||||
|     UReportDataDO selectOneByName(String name); | ||||
| 
 | ||||
|     /** | ||||
|      * 获取全部报表 | ||||
|      * @return | ||||
|      */ | ||||
|     List<UReportDataDO> getReportDataList(); | ||||
| 
 | ||||
| } | ||||
| @@ -0,0 +1,94 @@ | ||||
| package cn.iocoder.yudao.module.report.service.ureport; | ||||
|  | ||||
| import org.springframework.stereotype.Service; | ||||
| import javax.annotation.Resource; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
|  | ||||
| import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.*; | ||||
| import cn.iocoder.yudao.module.report.dal.dataobject.ureport.UReportDataDO; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||
|  | ||||
| import cn.iocoder.yudao.module.report.dal.mysql.ureport.UReportDataMapper; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||
| import static cn.iocoder.yudao.module.report.enums.ErrorCodeConstants.*; | ||||
|  | ||||
| /** | ||||
|  * Ureport2报表 Service 实现类 | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| @Service | ||||
| @Validated | ||||
| public class UReportDataServiceImpl implements UReportDataService { | ||||
|  | ||||
|     @Resource | ||||
|     private UReportDataMapper uReportDataMapper; | ||||
|  | ||||
|     @Override | ||||
|     public Long createUReportData(UReportDataSaveReqVO createReqVO) { | ||||
|         // 插入 | ||||
|         UReportDataDO uReportData = BeanUtils.toBean(createReqVO, UReportDataDO.class); | ||||
|         uReportDataMapper.insert(uReportData); | ||||
|         // 返回 | ||||
|         return uReportData.getId(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void updateUReportData(UReportDataSaveReqVO updateReqVO) { | ||||
|         // 校验存在 | ||||
|         validateUReportDataExists(updateReqVO.getId()); | ||||
|         // 更新 | ||||
|         UReportDataDO updateObj = BeanUtils.toBean(updateReqVO, UReportDataDO.class); | ||||
|         uReportDataMapper.updateById(updateObj); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void deleteUReportData(Long id) { | ||||
|         // 校验存在 | ||||
|         validateUReportDataExists(id); | ||||
|         // 删除 | ||||
|         uReportDataMapper.deleteById(id); | ||||
|     } | ||||
|  | ||||
|     private void validateUReportDataExists(Long id) { | ||||
|         if (uReportDataMapper.selectById(id) == null) { | ||||
|             throw exception(REPORT_DATA_NOT_EXISTS); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void validateUReportDataExists(String name) { | ||||
|         if (uReportDataMapper.selectByName(name) == null) { | ||||
|             throw exception(REPORT_DATA_NOT_EXISTS); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public UReportDataDO getUReportData(Long id) { | ||||
|         return uReportDataMapper.selectById(id); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public PageResult<UReportDataDO> getUReportDataPage(UReportDataPageReqVO pageReqVO) { | ||||
|         return uReportDataMapper.selectPage(pageReqVO); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int deleteByName(String name) { | ||||
|         return uReportDataMapper.deleteByName(name); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public UReportDataDO selectOneByName(String name) { | ||||
|         return uReportDataMapper.selectOneByName(name); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<UReportDataDO> getReportDataList() { | ||||
|         return uReportDataMapper.selectList(); | ||||
|     } | ||||
| } | ||||
| @@ -1,110 +0,0 @@ | ||||
| package cn.iocoder.yudao.module.report.service.ureport; | ||||
|  | ||||
| import cn.hutool.core.collection.CollectionUtil; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||
| 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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
| import org.springframework.stereotype.Service; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
| 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_NOT_EXISTS; | ||||
|  | ||||
| /** | ||||
|  * Ureport2报表 Service 实现类 | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| @Service | ||||
| @Validated | ||||
| public class UreportFileServiceImpl implements UreportFileService { | ||||
|  | ||||
|     @Resource | ||||
|     private UreportFileMapper ureportFileMapper; | ||||
|  | ||||
|     @Override | ||||
|     public Long createUreportFile(UreportFileSaveReqVO createReqVO) { | ||||
|         // 插入 | ||||
|         UreportFileDO ureportFile = BeanUtils.toBean(createReqVO, UreportFileDO.class); | ||||
|         ureportFileMapper.insert(ureportFile); | ||||
|         // 返回 | ||||
|         return ureportFile.getId(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void updateUreportFile(UreportFileSaveReqVO updateReqVO) { | ||||
|         // 校验存在 | ||||
|         validateUreportFileExists(updateReqVO.getId()); | ||||
|         // 更新 | ||||
|         UreportFileDO updateObj = BeanUtils.toBean(updateReqVO, UreportFileDO.class); | ||||
|         ureportFileMapper.updateById(updateObj); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void deleteUreportFile(Long id) { | ||||
|         // 校验存在 | ||||
|         validateUreportFileExists(id); | ||||
|         // 删除 | ||||
|         ureportFileMapper.deleteById(id); | ||||
|     } | ||||
|  | ||||
|     private void validateUreportFileExists(Long id) { | ||||
|         if (ureportFileMapper.selectById(id) == null) { | ||||
|             throw exception(UREPORT_FILE_NOT_EXISTS); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public UreportFileDO getUreportFile(Long id) { | ||||
|         return ureportFileMapper.selectById(id); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public PageResult<UreportFileDO> getUreportFilePage(UreportFilePageReqVO pageReqVO) { | ||||
|         return ureportFileMapper.selectPage(pageReqVO); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Long checkExistByName(String name) { | ||||
|         // TODO @赤焰:Service 处理业务逻辑,不能出现 Mapper 层的东西,收敛成 mapper 的一个操作方法 | ||||
|         LambdaQueryWrapper<UreportFileDO> queryWrapper = new LambdaQueryWrapper<>(); | ||||
|         queryWrapper.eq(UreportFileDO::getFileName,name); | ||||
|         return ureportFileMapper.selectCount(queryWrapper); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public UreportFileDO queryUreportFileDoByName(String name) { | ||||
|         // TODO @赤焰:Service 处理业务逻辑,不能出现 Mapper 层的东西,收敛成 mapper 的一个操作方法 | ||||
|         LambdaQueryWrapper<UreportFileDO> queryWrapper = new LambdaQueryWrapper<>(); | ||||
|         queryWrapper.eq(UreportFileDO::getFileName,name); | ||||
|         // TODO @赤焰:这里,可以用 selectByName 即可 | ||||
|         List<UreportFileDO> list = ureportFileMapper.selectList(queryWrapper); | ||||
|         if(CollectionUtil.isNotEmpty(list)){ | ||||
|             return list.get(0); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<UreportFileDO> queryReportFileList() { | ||||
|         // TODO @赤焰:Service 处理业务逻辑,不能出现 Mapper 层的东西,收敛成 mapper 的一个操作方法 | ||||
|         LambdaQueryWrapper<UreportFileDO> queryWrapper = new LambdaQueryWrapper<>(); | ||||
|         return ureportFileMapper.selectList(queryWrapper); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int deleteReportFileByName(String name) { | ||||
|         // TODO @赤焰:Service 处理业务逻辑,不能出现 Mapper 层的东西,收敛成 mapper 的一个操作方法 | ||||
|         LambdaQueryWrapper<UreportFileDO> queryWrapper = new LambdaQueryWrapper<>(); | ||||
|         queryWrapper.eq(UreportFileDO::getFileName,name); | ||||
|         return ureportFileMapper.delete(queryWrapper); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,12 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | ||||
| <mapper namespace="cn.iocoder.yudao.module.report.dal.mysql.ureport.UReportDataMapper"> | ||||
|  | ||||
|     <!-- | ||||
|         一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。 | ||||
|         无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。 | ||||
|         代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。 | ||||
|         文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ | ||||
|      --> | ||||
|  | ||||
| </mapper> | ||||
| @@ -0,0 +1,135 @@ | ||||
| package cn.iocoder.yudao.module.report.service.ureport; | ||||
|  | ||||
| import org.junit.jupiter.api.Disabled; | ||||
| import org.junit.jupiter.api.Test; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
|  | ||||
| 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.dal.dataobject.ureport.UReportDataDO; | ||||
| import cn.iocoder.yudao.module.report.dal.mysql.ureport.UReportDataMapper; | ||||
| import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
|  | ||||
| import org.springframework.context.annotation.Import; | ||||
|  | ||||
| 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 org.junit.jupiter.api.Assertions.*; | ||||
|  | ||||
| /** | ||||
|  * {@link UReportDataServiceImpl} 的单元测试类 | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| @Import(UReportDataServiceImpl.class) | ||||
| public class UReportDataServiceImplTest extends BaseDbUnitTest { | ||||
|  | ||||
|     @Resource | ||||
|     private UReportDataServiceImpl uReportDataService; | ||||
|  | ||||
|     @Resource | ||||
|     private UReportDataMapper uReportDataMapper; | ||||
|  | ||||
|     @Test | ||||
|     public void testCreateUReportData_success() { | ||||
|         // 准备参数 | ||||
|         UReportDataSaveReqVO createReqVO = randomPojo(UReportDataSaveReqVO.class).setId(null); | ||||
|  | ||||
|         // 调用 | ||||
|         Long uReportDataId = uReportDataService.createUReportData(createReqVO); | ||||
|         // 断言 | ||||
|         assertNotNull(uReportDataId); | ||||
|         // 校验记录的属性是否正确 | ||||
|         UReportDataDO uReportData = uReportDataMapper.selectById(uReportDataId); | ||||
|         assertPojoEquals(createReqVO, uReportData, "id"); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testUpdateUReportData_success() { | ||||
|         // mock 数据 | ||||
|         UReportDataDO dbUReportData = randomPojo(UReportDataDO.class); | ||||
|         uReportDataMapper.insert(dbUReportData);// @Sql: 先插入出一条存在的数据 | ||||
|         // 准备参数 | ||||
|         UReportDataSaveReqVO updateReqVO = randomPojo(UReportDataSaveReqVO.class, o -> { | ||||
|             o.setId(dbUReportData.getId()); // 设置更新的 ID | ||||
|         }); | ||||
|  | ||||
|         // 调用 | ||||
|         uReportDataService.updateUReportData(updateReqVO); | ||||
|         // 校验是否更新正确 | ||||
|         UReportDataDO uReportData = uReportDataMapper.selectById(updateReqVO.getId()); // 获取最新的 | ||||
|         assertPojoEquals(updateReqVO, uReportData); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testUpdateUReportData_notExists() { | ||||
|         // 准备参数 | ||||
|         UReportDataSaveReqVO updateReqVO = randomPojo(UReportDataSaveReqVO.class); | ||||
|  | ||||
|         // 调用, 并断言异常 | ||||
|         assertServiceException(() -> uReportDataService.updateUReportData(updateReqVO), REPORT_DATA_NOT_EXISTS); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testDeleteUReportData_success() { | ||||
|         // mock 数据 | ||||
|         UReportDataDO dbUReportData = randomPojo(UReportDataDO.class); | ||||
|         uReportDataMapper.insert(dbUReportData);// @Sql: 先插入出一条存在的数据 | ||||
|         // 准备参数 | ||||
|         Long id = dbUReportData.getId(); | ||||
|  | ||||
|         // 调用 | ||||
|         uReportDataService.deleteUReportData(id); | ||||
|        // 校验数据不存在了 | ||||
|        assertNull(uReportDataMapper.selectById(id)); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testDeleteUReportData_notExists() { | ||||
|         // 准备参数 | ||||
|         Long id = randomLongId(); | ||||
|  | ||||
|         // 调用, 并断言异常 | ||||
|         assertServiceException(() -> uReportDataService.deleteUReportData(id), REPORT_DATA_NOT_EXISTS); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 | ||||
|     public void testGetUReportDataPage() { | ||||
|        // mock 数据 | ||||
|        UReportDataDO dbUReportData = randomPojo(UReportDataDO.class, o -> { // 等会查询到 | ||||
|            o.setName(null); | ||||
|            o.setStatus(null); | ||||
|            o.setRemark(null); | ||||
|            o.setCreateTime(null); | ||||
|        }); | ||||
|        uReportDataMapper.insert(dbUReportData); | ||||
|        // 测试 name 不匹配 | ||||
|        uReportDataMapper.insert(cloneIgnoreId(dbUReportData, o -> o.setName(null))); | ||||
|        // 测试 status 不匹配 | ||||
|        uReportDataMapper.insert(cloneIgnoreId(dbUReportData, o -> o.setStatus(null))); | ||||
|        // 测试 remark 不匹配 | ||||
|        uReportDataMapper.insert(cloneIgnoreId(dbUReportData, o -> o.setRemark(null))); | ||||
|        // 测试 createTime 不匹配 | ||||
|        uReportDataMapper.insert(cloneIgnoreId(dbUReportData, o -> o.setCreateTime(null))); | ||||
|        // 准备参数 | ||||
|        UReportDataPageReqVO reqVO = new UReportDataPageReqVO(); | ||||
|        reqVO.setName(null); | ||||
|        reqVO.setStatus(null); | ||||
|        reqVO.setRemark(null); | ||||
|        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); | ||||
|  | ||||
|        // 调用 | ||||
|        PageResult<UReportDataDO> pageResult = uReportDataService.getUReportDataPage(reqVO); | ||||
|        // 断言 | ||||
|        assertEquals(1, pageResult.getTotal()); | ||||
|        assertEquals(1, pageResult.getList().size()); | ||||
|        assertPojoEquals(dbUReportData, pageResult.getList().get(0)); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,136 +0,0 @@ | ||||
| package cn.iocoder.yudao.module.report.service.ureport; | ||||
|  | ||||
| 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.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 org.junit.jupiter.api.Disabled; | ||||
| import org.junit.jupiter.api.Test; | ||||
| import org.springframework.context.annotation.Import; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
|  | ||||
| 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.*; | ||||
|  | ||||
| // TODO 芋艿:但愿测试后面补 | ||||
| /** | ||||
|  * {@link UreportFileServiceImpl} 的单元测试类 | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| @Import(UreportFileServiceImpl.class) | ||||
| public class UreportFileServiceImplTest extends BaseDbUnitTest { | ||||
|  | ||||
|     @Resource | ||||
|     private UreportFileServiceImpl ureportFileService; | ||||
|  | ||||
|     @Resource | ||||
|     private UreportFileMapper ureportFileMapper; | ||||
|  | ||||
|     @Test | ||||
|     public void testCreateUreportFile_success() { | ||||
|         // 准备参数 | ||||
|         UreportFileSaveReqVO createReqVO = randomPojo(UreportFileSaveReqVO.class).setId(null); | ||||
|  | ||||
|         // 调用 | ||||
|         Long ureportFileId = ureportFileService.createUreportFile(createReqVO); | ||||
|         // 断言 | ||||
|         assertNotNull(ureportFileId); | ||||
|         // 校验记录的属性是否正确 | ||||
|         UreportFileDO ureportFile = ureportFileMapper.selectById(ureportFileId); | ||||
|         assertPojoEquals(createReqVO, ureportFile, "id"); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testUpdateUreportFile_success() { | ||||
|         // mock 数据 | ||||
|         UreportFileDO dbUreportFile = randomPojo(UreportFileDO.class); | ||||
|         ureportFileMapper.insert(dbUreportFile);// @Sql: 先插入出一条存在的数据 | ||||
|         // 准备参数 | ||||
|         UreportFileSaveReqVO updateReqVO = randomPojo(UreportFileSaveReqVO.class, o -> { | ||||
|             o.setId(dbUreportFile.getId()); // 设置更新的 ID | ||||
|         }); | ||||
|  | ||||
|         // 调用 | ||||
|         ureportFileService.updateUreportFile(updateReqVO); | ||||
|         // 校验是否更新正确 | ||||
|         UreportFileDO ureportFile = ureportFileMapper.selectById(updateReqVO.getId()); // 获取最新的 | ||||
|         assertPojoEquals(updateReqVO, ureportFile); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testUpdateUreportFile_notExists() { | ||||
|         // 准备参数 | ||||
|         UreportFileSaveReqVO updateReqVO = randomPojo(UreportFileSaveReqVO.class); | ||||
|  | ||||
|         // 调用, 并断言异常 | ||||
|         assertServiceException(() -> ureportFileService.updateUreportFile(updateReqVO), UREPORT_FILE_NOT_EXISTS); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testDeleteUreportFile_success() { | ||||
|         // mock 数据 | ||||
|         UreportFileDO dbUreportFile = randomPojo(UreportFileDO.class); | ||||
|         ureportFileMapper.insert(dbUreportFile);// @Sql: 先插入出一条存在的数据 | ||||
|         // 准备参数 | ||||
|         Long id = dbUreportFile.getId(); | ||||
|  | ||||
|         // 调用 | ||||
|         ureportFileService.deleteUreportFile(id); | ||||
|        // 校验数据不存在了 | ||||
|        assertNull(ureportFileMapper.selectById(id)); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     public void testDeleteUreportFile_notExists() { | ||||
|         // 准备参数 | ||||
|         Long id = randomLongId(); | ||||
|  | ||||
|         // 调用, 并断言异常 | ||||
|         assertServiceException(() -> ureportFileService.deleteUreportFile(id), UREPORT_FILE_NOT_EXISTS); | ||||
|     } | ||||
|  | ||||
|     @Test | ||||
|     @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 | ||||
|     public void testGetUreportFilePage() { | ||||
|        // mock 数据 | ||||
|        UreportFileDO dbUreportFile = randomPojo(UreportFileDO.class, o -> { // 等会查询到 | ||||
|            o.setFileName(null); | ||||
|            o.setStatus(null); | ||||
|            o.setRemark(null); | ||||
|            o.setCreateTime(null); | ||||
|        }); | ||||
|        ureportFileMapper.insert(dbUreportFile); | ||||
|        // 测试 fileName 不匹配 | ||||
|        ureportFileMapper.insert(cloneIgnoreId(dbUreportFile, o -> o.setFileName(null))); | ||||
|        // 测试 status 不匹配 | ||||
|        ureportFileMapper.insert(cloneIgnoreId(dbUreportFile, o -> o.setStatus(null))); | ||||
|        // 测试 remark 不匹配 | ||||
|        ureportFileMapper.insert(cloneIgnoreId(dbUreportFile, o -> o.setRemark(null))); | ||||
|        // 测试 createTime 不匹配 | ||||
|        ureportFileMapper.insert(cloneIgnoreId(dbUreportFile, o -> o.setCreateTime(null))); | ||||
|        // 准备参数 | ||||
|        UreportFilePageReqVO reqVO = new UreportFilePageReqVO(); | ||||
|        reqVO.setFileName(null); | ||||
|        reqVO.setStatus(null); | ||||
|        reqVO.setRemark(null); | ||||
|        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); | ||||
|  | ||||
|        // 调用 | ||||
|        PageResult<UreportFileDO> pageResult = ureportFileService.getUreportFilePage(reqVO); | ||||
|        // 断言 | ||||
|        assertEquals(1, pageResult.getTotal()); | ||||
|        assertEquals(1, pageResult.getList().size()); | ||||
|        assertPojoEquals(dbUreportFile, pageResult.getList().get(0)); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,2 +1,2 @@ | ||||
| DELETE FROM "report_go_view_project"; | ||||
| DELETE FROM "ureport_file"; | ||||
| DELETE FROM "report_ureport_data"; | ||||
|   | ||||
| @@ -12,11 +12,11 @@ CREATE TABLE IF NOT EXISTS "report_go_view_project" ( | ||||
|     "deleted" bit NOT NULL DEFAULT FALSE, | ||||
|     PRIMARY KEY ("id") | ||||
| ) COMMENT 'GoView 项目表'; | ||||
| CREATE TABLE IF NOT EXISTS "ureport_file" ( | ||||
| CREATE TABLE IF NOT EXISTS "report_ureport_data" ( | ||||
|      "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, | ||||
|       "file_name" varchar NOT NULL, | ||||
|      "name" varchar NOT NULL, | ||||
|      "status" int NOT NULL, | ||||
|       "file_content" varchar, | ||||
|      "content" varchar, | ||||
|      "remark" varchar, | ||||
|      "creator" varchar DEFAULT '', | ||||
|      "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||||
|   | ||||
| @@ -221,7 +221,7 @@ yudao: | ||||
|       - jimu_report_link | ||||
|       - jimu_report_map | ||||
|       - jimu_report_share | ||||
|       - ureport_file | ||||
|       - report_ureport_data | ||||
|       - rep_demo_dxtj | ||||
|       - rep_demo_employee | ||||
|       - rep_demo_gongsi | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 liuhongfeng
					liuhongfeng