【优化】ureport2菜单,初始化数据,按照规范重新进行命名处理
This commit is contained in:
parent
5e9cbb9cad
commit
0d3efe4f80
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 项目不存在");
|
ErrorCode GO_VIEW_PROJECT_NOT_EXISTS = new ErrorCode(1_003_000_000, "GoView 项目不存在");
|
||||||
|
|
||||||
// ========== UREPORT 模块 1-003-001-000 ==========
|
// ========== UREPORT 模块 1-003-001-000 ==========
|
||||||
ErrorCode UREPORT_FILE_NOT_EXISTS = new ErrorCode(1_003_001_000, "打印文件不存在,请检查 UReport 报表文件");
|
ErrorCode REPORT_DATA_NOT_EXISTS = new ErrorCode(1_003_001_001, "Ureport2报表不存在");
|
||||||
ErrorCode UREPORT_FILE_EXISTS = new ErrorCode(1_003_001_001, "报表名字已存在,请修改后再保存");
|
|
||||||
|
|
||||||
|
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
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
public class UreportFilePageReqVO extends PageParam {
|
public class UReportDataPageReqVO extends PageParam {
|
||||||
|
|
||||||
@Schema(description = "文件名称", example = "赵六")
|
@Schema(description = "文件名称", example = "李四")
|
||||||
private String fileName;
|
private String name;
|
||||||
|
|
||||||
@Schema(description = "状态", example = "1")
|
@Schema(description = "状态", example = "1")
|
||||||
private Integer status;
|
private Integer status;
|
||||||
|
|
||||||
@Schema(description = "备注", example = "随便")
|
@Schema(description = "备注", example = "你猜")
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
@Schema(description = "创建时间")
|
@Schema(description = "创建时间")
|
|
@ -1,6 +1,7 @@
|
||||||
package cn.iocoder.yudao.module.report.controller.admin.ureport.vo;
|
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.annotations.DictFormat;
|
||||||
|
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
|
||||||
import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
|
import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
|
||||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||||
import com.alibaba.excel.annotation.ExcelProperty;
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
|
@ -12,22 +13,26 @@ import java.time.LocalDateTime;
|
||||||
@Schema(description = "管理后台 - Ureport2报表 Response VO")
|
@Schema(description = "管理后台 - Ureport2报表 Response VO")
|
||||||
@Data
|
@Data
|
||||||
@ExcelIgnoreUnannotated
|
@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")
|
@ExcelProperty("ID")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@Schema(description = "文件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
|
@Schema(description = "文件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
|
||||||
@ExcelProperty("文件名称")
|
@ExcelProperty("文件名称")
|
||||||
private String fileName;
|
private String name;
|
||||||
|
|
||||||
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
@ExcelProperty("状态")
|
@ExcelProperty(value = "状态", converter = DictConvert.class)
|
||||||
@DictFormat(DictTypeConstants.COMMON_STATUS)
|
@DictFormat(DictTypeConstants.COMMON_STATUS)
|
||||||
private Integer status;
|
private Integer status;
|
||||||
|
|
||||||
@Schema(description = "备注", example = "随便")
|
@Schema(description = "文件内容")
|
||||||
|
@ExcelProperty("文件内容")
|
||||||
|
private String content;
|
||||||
|
|
||||||
|
@Schema(description = "备注", example = "你猜")
|
||||||
@ExcelProperty("备注")
|
@ExcelProperty("备注")
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
|
@ -35,4 +40,4 @@ public class UreportFileRespVO {
|
||||||
@ExcelProperty("创建时间")
|
@ExcelProperty("创建时间")
|
||||||
private LocalDateTime createTime;
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,33 +1,30 @@
|
||||||
package cn.iocoder.yudao.module.report.controller.admin.ureport.vo;
|
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 io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.*;
|
||||||
|
import java.util.*;
|
||||||
import javax.validation.constraints.NotEmpty;
|
import javax.validation.constraints.*;
|
||||||
import javax.validation.constraints.NotNull;
|
import java.util.*;
|
||||||
|
|
||||||
@Schema(description = "管理后台 - Ureport2报表新增/修改 Request VO")
|
@Schema(description = "管理后台 - Ureport2报表新增/修改 Request VO")
|
||||||
@Data
|
@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;
|
private Long id;
|
||||||
|
|
||||||
@Schema(description = "文件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
|
@Schema(description = "文件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
|
||||||
@NotEmpty(message = "文件名称不能为空")
|
@NotEmpty(message = "文件名称不能为空")
|
||||||
private String fileName;
|
private String name;
|
||||||
|
|
||||||
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
@NotNull(message = "状态不能为空")
|
@NotNull(message = "状态不能为空")
|
||||||
@InEnum(CommonStatusEnum.class)
|
|
||||||
private Integer status;
|
private Integer status;
|
||||||
|
|
||||||
@Schema(description = "文件内容")
|
@Schema(description = "文件内容")
|
||||||
private String fileContent;
|
private String content;
|
||||||
|
|
||||||
@Schema(description = "备注", example = "随便")
|
@Schema(description = "备注", example = "你猜")
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
package cn.iocoder.yudao.module.report.dal.dataobject.ureport;
|
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 cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||||
import com.baomidou.mybatisplus.annotation.KeySequence;
|
import com.baomidou.mybatisplus.annotation.KeySequence;
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
@ -11,35 +12,35 @@ import lombok.*;
|
||||||
*
|
*
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
@TableName("ureport_file")
|
@TableName("report_ureport_data")
|
||||||
@KeySequence("ureport_file_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
|
@KeySequence("report_ureport_data_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@ToString(callSuper = true)
|
@ToString(callSuper = true)
|
||||||
@Builder
|
@Builder
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class UreportFileDO extends BaseDO {
|
public class UReportDataDO extends BaseDO {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ID
|
* ID
|
||||||
*/
|
*/
|
||||||
@TableId
|
@TableId
|
||||||
private Long id;
|
private Long id;
|
||||||
// TODO @赤焰:是不是用 name 就可以了。
|
|
||||||
/**
|
/**
|
||||||
* 文件名称
|
* 文件名称
|
||||||
*/
|
*/
|
||||||
private String fileName;
|
private String name;
|
||||||
/**
|
/**
|
||||||
* 状态
|
* 状态
|
||||||
|
*
|
||||||
|
* 枚举 {@link CommonStatusEnum#getStatus()}
|
||||||
*/
|
*/
|
||||||
private Integer status;
|
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;
|
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.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.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||||
import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
|
import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Report 模块的 Security 配置
|
* Report 模块的 Security 配置
|
||||||
|
@ -12,6 +19,9 @@ import org.springframework.security.config.annotation.web.configurers.Expression
|
||||||
@Configuration("reportSecurityConfiguration")
|
@Configuration("reportSecurityConfiguration")
|
||||||
public class SecurityConfiguration {
|
public class SecurityConfiguration {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private OAuth2TokenApi oauth2TokenApi;
|
||||||
|
|
||||||
@Bean("reportAuthorizeRequestsCustomizer")
|
@Bean("reportAuthorizeRequestsCustomizer")
|
||||||
public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
|
public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
|
||||||
return new 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;
|
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 com.bstek.ureport.console.UReportServlet;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
import org.springframework.boot.web.servlet.ServletRegistrationBean;
|
import org.springframework.boot.web.servlet.ServletRegistrationBean;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
@ -15,13 +17,13 @@ import javax.servlet.Servlet;
|
||||||
* @author 赤焰
|
* @author 赤焰
|
||||||
*/
|
*/
|
||||||
@Configuration
|
@Configuration
|
||||||
@ImportResource({"classpath:ureport-console-context.xml"}) // Bean 配置
|
@ImportResource({"classpath:ureport-console-context.xml"})
|
||||||
@PropertySource(value = {"classpath:ureport.properties"}) // 配置文件
|
@PropertySource(value = {"classpath:ureport.properties"})
|
||||||
public class UreportConfiguration {
|
@EnableConfigurationProperties({UReportProperties.class})
|
||||||
|
public class UReportConfiguration {
|
||||||
|
|
||||||
// TODO @赤焰:bean 是不是取个和 ureport 相关的名字好点哈?
|
|
||||||
@Bean
|
@Bean
|
||||||
public ServletRegistrationBean<Servlet> registrationBean() {
|
public ServletRegistrationBean<Servlet> uReportRegistrationBean() {
|
||||||
return new ServletRegistrationBean<>(new UReportServlet(), "/ureport/*");
|
return new ServletRegistrationBean<>(new UReportServlet(), "/ureport/*");
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,14 +9,18 @@ import javax.sql.DataSource;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.SQLException;
|
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 内置数据源
|
* UReport 内置数据源
|
||||||
|
* @author 赤焰
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
public class UreportDataSource implements BuildinDatasource {
|
public class UReportDataSource implements BuildinDatasource {
|
||||||
|
|
||||||
private static final String NAME = "UreportDataSource";
|
private static final String NAME = "UReportDataSource";
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private DataSource dataSource;
|
private DataSource dataSource;
|
||||||
|
@ -29,7 +33,6 @@ public class UreportDataSource implements BuildinDatasource {
|
||||||
return NAME;
|
return NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO @赤焰:这个方法,如果拿不到连接,是不是抛出异常比较好?
|
|
||||||
/**
|
/**
|
||||||
* @return 获取连接
|
* @return 获取连接
|
||||||
*/
|
*/
|
||||||
|
@ -38,10 +41,9 @@ public class UreportDataSource implements BuildinDatasource {
|
||||||
try {
|
try {
|
||||||
return dataSource.getConnection();
|
return dataSource.getConnection();
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
log.error("Ureport 数据源 获取连接失败!");
|
log.error("UReportDataSource获取连接失败!");
|
||||||
e.printStackTrace();
|
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;
|
package cn.iocoder.yudao.module.report.service.ureport;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
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.UReportDataPageReqVO;
|
||||||
import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.UreportFileSaveReqVO;
|
import cn.iocoder.yudao.module.report.controller.admin.ureport.vo.UReportDataSaveReqVO;
|
||||||
import cn.iocoder.yudao.module.report.dal.dataobject.ureport.UreportFileDO;
|
import cn.iocoder.yudao.module.report.dal.dataobject.ureport.UReportDataDO;
|
||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -13,7 +13,7 @@ import java.util.List;
|
||||||
*
|
*
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
public interface UreportFileService {
|
public interface UReportDataService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建Ureport2报表
|
* 创建Ureport2报表
|
||||||
|
@ -21,21 +21,21 @@ public interface UreportFileService {
|
||||||
* @param createReqVO 创建信息
|
* @param createReqVO 创建信息
|
||||||
* @return 编号
|
* @return 编号
|
||||||
*/
|
*/
|
||||||
Long createUreportFile(@Valid UreportFileSaveReqVO createReqVO);
|
Long createUReportData(@Valid UReportDataSaveReqVO createReqVO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新Ureport2报表
|
* 更新Ureport2报表
|
||||||
*
|
*
|
||||||
* @param updateReqVO 更新信息
|
* @param updateReqVO 更新信息
|
||||||
*/
|
*/
|
||||||
void updateUreportFile(@Valid UreportFileSaveReqVO updateReqVO);
|
void updateUReportData(@Valid UReportDataSaveReqVO updateReqVO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除Ureport2报表
|
* 删除Ureport2报表
|
||||||
*
|
*
|
||||||
* @param id 编号
|
* @param id 编号
|
||||||
*/
|
*/
|
||||||
void deleteUreportFile(Long id);
|
void deleteUReportData(Long id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得Ureport2报表
|
* 获得Ureport2报表
|
||||||
|
@ -43,7 +43,7 @@ public interface UreportFileService {
|
||||||
* @param id 编号
|
* @param id 编号
|
||||||
* @return Ureport2报表
|
* @return Ureport2报表
|
||||||
*/
|
*/
|
||||||
UreportFileDO getUreportFile(Long id);
|
UReportDataDO getUReportData(Long id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得Ureport2报表分页
|
* 获得Ureport2报表分页
|
||||||
|
@ -51,36 +51,32 @@ public interface UreportFileService {
|
||||||
* @param pageReqVO 分页查询
|
* @param pageReqVO 分页查询
|
||||||
* @return Ureport2报表分页
|
* @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
|
* @param name
|
||||||
* @return
|
* @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 "report_go_view_project";
|
||||||
DELETE FROM "ureport_file";
|
DELETE FROM "report_ureport_data";
|
||||||
|
|
|
@ -12,16 +12,16 @@ CREATE TABLE IF NOT EXISTS "report_go_view_project" (
|
||||||
"deleted" bit NOT NULL DEFAULT FALSE,
|
"deleted" bit NOT NULL DEFAULT FALSE,
|
||||||
PRIMARY KEY ("id")
|
PRIMARY KEY ("id")
|
||||||
) COMMENT 'GoView 项目表';
|
) 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,
|
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||||
"file_name" varchar NOT NULL,
|
"name" varchar NOT NULL,
|
||||||
"status" int NOT NULL,
|
"status" int NOT NULL,
|
||||||
"file_content" varchar,
|
"content" varchar,
|
||||||
"remark" varchar,
|
"remark" varchar,
|
||||||
"creator" varchar DEFAULT '',
|
"creator" varchar DEFAULT '',
|
||||||
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
"create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
"updater" varchar DEFAULT '',
|
"updater" varchar DEFAULT '',
|
||||||
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
"deleted" bit NOT NULL DEFAULT FALSE,
|
"deleted" bit NOT NULL DEFAULT FALSE,
|
||||||
PRIMARY KEY ("id")
|
PRIMARY KEY ("id")
|
||||||
) COMMENT 'Ureport2报表';
|
) COMMENT 'Ureport2报表';
|
||||||
|
|
|
@ -229,7 +229,7 @@ yudao:
|
||||||
- jimu_report_link
|
- jimu_report_link
|
||||||
- jimu_report_map
|
- jimu_report_map
|
||||||
- jimu_report_share
|
- jimu_report_share
|
||||||
- ureport_file
|
- report_ureport_data
|
||||||
- rep_demo_dxtj
|
- rep_demo_dxtj
|
||||||
- rep_demo_employee
|
- rep_demo_employee
|
||||||
- rep_demo_gongsi
|
- rep_demo_gongsi
|
||||||
|
|
Loading…
Reference in New Issue