报表基础模块:1、报表模板新增datasourceids、datasetids;2、数据源不再依赖模板,独立存在;

This commit is contained in:
gaoqr
2024-09-05 21:51:47 +08:00
parent 40b64b0600
commit 3adf2c7b22
12 changed files with 129 additions and 219 deletions
@@ -6,6 +6,7 @@ import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
@@ -31,6 +32,7 @@ public class ReportDatasetSaveReqVO implements Serializable {
private String name; private String name;
@Schema(description = "数据源id", example = "1") @Schema(description = "数据源id", example = "1")
@NotNull(message = "数据源id不能为空")
private Long datasourceId; private Long datasourceId;
@Schema(description = "动态查询SQL") @Schema(description = "动态查询SQL")
@@ -82,12 +82,11 @@ public class ReportDatasourceController {
return success(BeanUtils.toBean(datasource, ReportDatasourceRespVO.class)); return success(BeanUtils.toBean(datasource, ReportDatasourceRespVO.class));
} }
@GetMapping("/{templateId}/datasources") @GetMapping("/datasources")
@Operation(summary = "获取报表模板下的报表数据源") @Operation(summary = "获取报表数据源")
// @PreAuthorize("@ss.hasPermission('report:datasource:query')") // @PreAuthorize("@ss.hasPermission('report:datasource:query')")
@Parameter(name = "templateId", description = "模版id", required = true) public CommonResult<List<ReportDatasourceRespVO>> getDatasourcePage() {
public CommonResult<List<ReportDatasourceRespVO>> getDatasourcePage(@PathVariable(value = "templateId") Long templateId) { return success(BeanUtils.toBean(datasourceService.getDatasourceList(), ReportDatasourceRespVO.class));
return success(BeanUtils.toBean(datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(templateId).build()), ReportDatasourceRespVO.class));
} }
@GetMapping("/datasource/beans") @GetMapping("/datasource/beans")
@@ -2,6 +2,7 @@ package com.cf.imes.module.report.controller.admin.datasource.vo;
import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO;
import com.cf.imes.module.report.validation.datasource.ReportDatasourceTypeInEnum; import com.cf.imes.module.report.validation.datasource.ReportDatasourceTypeInEnum;
import com.cf.imes.module.report.validation.template.ReportTemplateTypeInEnum;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@@ -31,9 +32,6 @@ public class ReportDatasourceSaveReqVO implements Serializable {
@Schema(description = "数据源id", example = "1") @Schema(description = "数据源id", example = "1")
private Long id; private Long id;
@Schema(description = "模板id", example = "1")
private Long templateId;
@Schema(description = "数据源名称", example = "测试库") @Schema(description = "数据源名称", example = "测试库")
private String name; private String name;
@@ -41,7 +39,8 @@ public class ReportDatasourceSaveReqVO implements Serializable {
@ReportDatasourceTypeInEnum @ReportDatasourceTypeInEnum
private String type; private String type;
@JsonIgnore @Schema(description = "内置数据源类型,0是、1否", example = "1")
@ReportTemplateTypeInEnum
private Integer buildinType; private Integer buildinType;
@Schema(description = "spring型数据源id") @Schema(description = "spring型数据源id")
@@ -62,9 +61,6 @@ public class ReportDatasourceSaveReqVO implements Serializable {
@Schema(description = "备注", example = "该模板仅供生产使用") @Schema(description = "备注", example = "该模板仅供生产使用")
private String remark; private String remark;
@Schema(description = "数据集")
private List<ReportDatasetSaveReqVO> datasets = new ArrayList<>();
@Schema(description = "请求头参数") @Schema(description = "请求头参数")
private List<Map<String, String>> headers; private List<Map<String, String>> headers;
} }
@@ -1,14 +1,13 @@
package com.cf.imes.module.report.controller.admin.template.vo; package com.cf.imes.module.report.controller.admin.template.vo;
import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* @author Gqr * @author Gqr
@@ -30,9 +29,12 @@ public class ReportTemplateSaveReqVO {
@Schema(description = "报表模板") @Schema(description = "报表模板")
private String content; private String content;
@Schema(description = "数据源")
private List<ReportDatasourceSaveReqVO> datasource = new ArrayList<>();
@Schema(description = "备注", example = "该模板仅供生产使用") @Schema(description = "备注", example = "该模板仅供生产使用")
private String remark; private String remark;
@Schema(description = "数据源id列表")
private Set<Long> datasourceIds;
@Schema(description = "数据集id列表")
private Set<Long> datasetIds;
} }
@@ -39,10 +39,7 @@ public class ReportDatasourceDO extends BaseDO {
*/ */
@TableId @TableId
private Long id; private Long id;
/**
* 模板id
*/
private Long templateId;
/** /**
* 数据源名称 * 数据源名称
*/ */
@@ -3,11 +3,14 @@ package com.cf.imes.module.report.dal.dataobject.template;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; import com.cf.imes.framework.mybatis.core.dataobject.BaseDO;
import com.cf.imes.framework.mybatis.core.type.CompressStringTypeHandler; import com.cf.imes.framework.mybatis.core.type.CompressStringTypeHandler;
import com.cf.imes.framework.mybatis.core.type.JsonLongSetTypeHandler;
import com.cf.imes.framework.mybatis.core.type.LongListTypeHandler;
import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO;
import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum;
import lombok.*; import lombok.*;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* 报表模板信息DO * 报表模板信息DO
@@ -57,4 +60,16 @@ public class ReportTemplateDO extends BaseDO {
*/ */
@TableField(exist = false) @TableField(exist = false)
private List<ReportDatasourceDO> datasource; private List<ReportDatasourceDO> datasource;
/**
* 数据源id列表
*/
@TableField(typeHandler = JsonLongSetTypeHandler.class)
private Set<Long> datasourceIds;
/**
* 数据集id列表
*/
@TableField(typeHandler = JsonLongSetTypeHandler.class)
private Set<Long> datasetIds;
} }
@@ -4,16 +4,13 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.security.core.LoginUser;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO;
import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO;
import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO; import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO;
import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO;
import com.cf.imes.module.report.dal.dataobject.template.ReportTemplateDO;
import com.cf.imes.module.report.dal.mysql.dataset.ReportDatasetMapper; import com.cf.imes.module.report.dal.mysql.dataset.ReportDatasetMapper;
import com.cf.imes.module.report.dal.mysql.datasource.ReportDatasourceMapper; import com.cf.imes.module.report.dal.mysql.datasource.ReportDatasourceMapper;
import com.cf.imes.module.report.dal.mysql.template.ReportTemplateMapper;
import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@@ -23,9 +20,8 @@ import java.util.List;
import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_NOT_EXISTS; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_NOT_EXISTS;
import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR;
import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_NOT_EXISTS; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_NOT_EXISTS;
import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR;
import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EXISTS;
/** /**
* 报表数据集 Service 实现类 * 报表数据集 Service 实现类
@@ -36,9 +32,6 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EX
@Service @Service
@Validated @Validated
public class ReportDatasetServiceImpl implements ReportDatasetService { public class ReportDatasetServiceImpl implements ReportDatasetService {
@Resource
private ReportTemplateMapper reportTemplateMapper;
@Resource @Resource
private ReportDatasourceMapper reportDatasourceMapper; private ReportDatasourceMapper reportDatasourceMapper;
@@ -49,6 +42,8 @@ public class ReportDatasetServiceImpl implements ReportDatasetService {
public Long createDataset(ReportDatasetSaveReqVO createReqVO) { public Long createDataset(ReportDatasetSaveReqVO createReqVO) {
// 插入 // 插入
ReportDatasetDO dataset = BeanUtils.toBean(createReqVO, ReportDatasetDO.class); ReportDatasetDO dataset = BeanUtils.toBean(createReqVO, ReportDatasetDO.class);
// 校验内置模板操作权限
validateSystemDataset(createReqVO.getDatasourceId());
datasetMapper.insert(dataset); datasetMapper.insert(dataset);
// 返回 // 返回
return dataset.getId(); return dataset.getId();
@@ -66,6 +61,8 @@ public class ReportDatasetServiceImpl implements ReportDatasetService {
public void updateDataset(ReportDatasetSaveReqVO updateReqVO) { public void updateDataset(ReportDatasetSaveReqVO updateReqVO) {
// 校验存在 // 校验存在
validateDatasetExists(updateReqVO.getId()); validateDatasetExists(updateReqVO.getId());
// 校验内置模板操作权限
validateSystemDataset(updateReqVO.getDatasourceId());
// 更新 // 更新
ReportDatasetDO updateObj = BeanUtils.toBean(updateReqVO, ReportDatasetDO.class); ReportDatasetDO updateObj = BeanUtils.toBean(updateReqVO, ReportDatasetDO.class);
datasetMapper.updateById(updateObj); datasetMapper.updateById(updateObj);
@@ -84,7 +81,7 @@ public class ReportDatasetServiceImpl implements ReportDatasetService {
// 校验存在 // 校验存在
ReportDatasetDO reportDatasetDO = validateDatasetExists(id); ReportDatasetDO reportDatasetDO = validateDatasetExists(id);
// 校验内置模板操作权限 // 校验内置模板操作权限
validateSystemTemplate(reportDatasetDO.getDatasourceId()); validateSystemDataset(reportDatasetDO.getDatasourceId());
// 删除 // 删除
datasetMapper.deleteById(id); datasetMapper.deleteById(id);
} }
@@ -99,24 +96,18 @@ public class ReportDatasetServiceImpl implements ReportDatasetService {
} }
/** /**
* 校验只有超管可以操作内置模板 * 校验只有超管可以操作内置数据源
* *
* @param datasourceId 数据源id * @param datasourceId 数据源id
*/ */
private void validateSystemTemplate(Long datasourceId) { private void validateSystemDataset(Long datasourceId) {
ReportDatasourceDO reportDatasourceDO = reportDatasourceMapper.selectById(datasourceId); ReportDatasourceDO reportDatasourceDO = reportDatasourceMapper.selectById(datasourceId);
if (ObjectUtil.isNull(reportDatasourceDO)) { if (ObjectUtil.isNull(reportDatasourceDO)) {
throw exception(DATASOURCE_NOT_EXISTS); throw exception(DATASOURCE_NOT_EXISTS);
} }
ReportTemplateDO templateDO = reportTemplateMapper.selectById(reportDatasourceDO.getTemplateId());
if (ObjectUtil.isNull(templateDO)) {
throw exception(TEMPLATE_NOT_EXISTS);
}
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin();
// 非超管不能操作内置模板 // 非超管不能操作内置模板
if (ReportTemplateTypeEnum.SYSTEM.equals(templateDO.getType()) && !isSuperAdmin) { if (ReportTemplateTypeEnum.SYSTEM.equals(reportDatasourceDO.getBuildinType()) && Boolean.FALSE.equals(SecurityFrameworkUtils.isSuperAdmin())) {
throw exception(TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR); throw exception(DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR);
} }
} }
@@ -53,7 +53,7 @@ public interface ReportDatasourceService {
* @param reqVO 查询参数 * @param reqVO 查询参数
* @return 报表数据源分页 * @return 报表数据源分页
*/ */
List<ReportDatasourceDO> getTemplateDatasourceList(ReportDatasourceReqVO reqVO); List<ReportDatasourceDO> getDatasourceList();
/** /**
* 获取springbean数据源列表 * 获取springbean数据源列表
@@ -4,6 +4,7 @@ import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.sql.SqlInjectionUtils; import com.baomidou.mybatisplus.core.toolkit.sql.SqlInjectionUtils;
import com.bstek.common.exception.ReportDesignException; import com.bstek.common.exception.ReportDesignException;
import com.bstek.common.utils.MultipleJdbcTemplate; import com.bstek.common.utils.MultipleJdbcTemplate;
@@ -17,16 +18,15 @@ import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil;
import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.organ.core.aop.OrganIgnore;
import com.cf.imes.framework.security.core.LoginUser; import com.cf.imes.framework.security.core.LoginUser;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO;
import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO;
import com.cf.imes.module.report.controller.admin.datasource.vo.ReportBeanDatasourceRespVO; import com.cf.imes.module.report.controller.admin.datasource.vo.ReportBeanDatasourceRespVO;
import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceReqVO;
import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO; import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO;
import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO; import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO;
import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO;
import com.cf.imes.module.report.dal.dataobject.template.ReportTemplateDO;
import com.cf.imes.module.report.dal.mysql.dataset.ReportDatasetMapper; import com.cf.imes.module.report.dal.mysql.dataset.ReportDatasetMapper;
import com.cf.imes.module.report.dal.mysql.datasource.ReportDatasourceMapper; import com.cf.imes.module.report.dal.mysql.datasource.ReportDatasourceMapper;
import com.cf.imes.module.report.dal.mysql.template.ReportTemplateMapper; import com.cf.imes.module.report.dal.mysql.template.ReportTemplateMapper;
@@ -65,8 +65,6 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_BUIL
import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_NOT_EXISTS; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_NOT_EXISTS;
import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRINGBEAN_GET_FAIL; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRINGBEAN_GET_FAIL;
import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRINGBEAN_METHODS_GET_FAIL; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRINGBEAN_METHODS_GET_FAIL;
import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR;
import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EXISTS;
/** /**
* 报表数据源 Service 实现类 * 报表数据源 Service 实现类
@@ -78,9 +76,6 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_NOT_EX
@Validated @Validated
@Slf4j @Slf4j
public class ReportDatasourceServiceImpl implements ReportDatasourceService { public class ReportDatasourceServiceImpl implements ReportDatasourceService {
@Resource
private ReportTemplateMapper reportTemplateMapper;
@Resource @Resource
private ReportDatasourceMapper datasourceMapper; private ReportDatasourceMapper datasourceMapper;
@@ -99,6 +94,8 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService {
@Override @Override
public Long createDatasource(ReportDatasourceSaveReqVO createReqVO) { public Long createDatasource(ReportDatasourceSaveReqVO createReqVO) {
ReportDatasourceDO datasource = BeanUtils.toBean(createReqVO, ReportDatasourceDO.class); ReportDatasourceDO datasource = BeanUtils.toBean(createReqVO, ReportDatasourceDO.class);
// 校验内置数据源操作权限
validateSystemDatasource(createReqVO.getBuildinType());
// 插入 // 插入
datasourceMapper.insert(datasource); datasourceMapper.insert(datasource);
// 返回 // 返回
@@ -109,6 +106,8 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService {
public void updateDatasource(ReportDatasourceSaveReqVO updateReqVO) { public void updateDatasource(ReportDatasourceSaveReqVO updateReqVO) {
// 校验存在 // 校验存在
validateDatasourceExists(updateReqVO.getId()); validateDatasourceExists(updateReqVO.getId());
// 校验内置数据源操作权限
validateSystemDatasource(updateReqVO.getBuildinType());
ReportDatasourceDO updateObj = BeanUtils.toBean(updateReqVO, ReportDatasourceDO.class); ReportDatasourceDO updateObj = BeanUtils.toBean(updateReqVO, ReportDatasourceDO.class);
// 更新 // 更新
datasourceMapper.updateById(updateObj); datasourceMapper.updateById(updateObj);
@@ -119,8 +118,8 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService {
public void deleteDatasource(Long id) { public void deleteDatasource(Long id) {
// 校验存在 // 校验存在
ReportDatasourceDO reportDatasourceDO = validateDatasourceExists(id); ReportDatasourceDO reportDatasourceDO = validateDatasourceExists(id);
// 校验内置模板操作权限 // 校验内置数据源操作权限
validateSystemTemplate(reportDatasourceDO.getTemplateId()); validateSystemDatasource(reportDatasourceDO.getBuildinType().getType());
// 删除 // 删除
datasourceMapper.deleteById(id); datasourceMapper.deleteById(id);
// 删除关联数据集 // 删除关联数据集
@@ -136,17 +135,25 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService {
} }
@Override @Override
public List<ReportDatasourceDO> getTemplateDatasourceList(ReportDatasourceReqVO reqVO) { @OrganIgnore
List<ReportDatasourceDO> reportDatasourceDOS = datasourceMapper.selectList(new LambdaQueryWrapperX<ReportDatasourceDO>() public List<ReportDatasourceDO> getDatasourceList() {
.eqIfPresent(ReportDatasourceDO::getTemplateId, reqVO.getTemplateId()) LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
.likeIfPresent(ReportDatasourceDO::getName, reqVO.getName()) LambdaQueryWrapper<ReportDatasourceDO> queryWrapper = new LambdaQueryWrapperX<ReportDatasourceDO>().orderByDesc(ReportDatasourceDO::getCreateTime);
.orderByDesc(ReportDatasourceDO::getCreateTime)); if (ObjectUtil.isNotNull(loginUser) && Boolean.FALSE.equals(loginUser.getIsSupAdmin())) {
// 普通用户查看机构下的和system数据源
queryWrapper.or(wrapper -> wrapper
.eq(ReportDatasourceDO::getOrganId, loginUser.getOrganId())
.eq(ReportDatasourceDO::getType, ReportTemplateTypeEnum.CUSTOM))
.or(wrapper -> wrapper.eq(ReportDatasourceDO::getType, ReportTemplateTypeEnum.SYSTEM));
}
List<ReportDatasourceDO> reportDatasourceDOS = datasourceMapper.selectList(queryWrapper);
// 查询数据集 // 查询数据集
if (CollUtil.isNotEmpty(reportDatasourceDOS)) { if (CollUtil.isNotEmpty(reportDatasourceDOS)) {
reportDatasourceDOS.forEach(reportDatasourceDO -> { reportDatasourceDOS.forEach(reportDatasourceDO -> {
queryDatasetInSource(reportDatasourceDO); queryDatasetInSource(reportDatasourceDO);
}); });
} }
// 超管查看全部
return reportDatasourceDOS; return reportDatasourceDOS;
} }
@@ -297,34 +304,34 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService {
@Override @Override
public void saveBuildinDatasources(List<ReportDatasourceSaveReqVO> buildinDatasources) { public void saveBuildinDatasources(List<ReportDatasourceSaveReqVO> buildinDatasources) {
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); // LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin(); // boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin();
// 非超管不能操作内置模板 // // 非超管不能操作内置模板
if (!isSuperAdmin) { // if (!isSuperAdmin) {
throw exception(DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR); // throw exception(DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR);
} // }
// 全删内置数据源 // // 全删内置数据源
int deleteNum = datasourceMapper.physicsDeleteBuildinDatasource(); // int deleteNum = datasourceMapper.physicsDeleteBuildinDatasource();
log.info("[ReportDatasourceService][saveBuildinDatasources]删除内置数据源{}条", deleteNum); // log.info("[ReportDatasourceService][saveBuildinDatasources]删除内置数据源{}条", deleteNum);
buildinDatasources.forEach(ds -> { // buildinDatasources.forEach(ds -> {
// 新增数据源 // // 新增数据源
ds.setBuildinType(ReportTemplateTypeEnum.SYSTEM.getType()); // ds.setBuildinType(ReportTemplateTypeEnum.SYSTEM.getType());
ds.setId(null); // ds.setId(null);
Long datasourceId = createDatasource(ds); // Long datasourceId = createDatasource(ds);
List<ReportDatasetSaveReqVO> datasets = ds.getDatasets(); // List<ReportDatasetSaveReqVO> datasets = ds.getDatasets();
List<ReportDatasetSaveReqVO> batchInsertDataset = new ArrayList<>(); // List<ReportDatasetSaveReqVO> batchInsertDataset = new ArrayList<>();
datasets.forEach(dataset -> { // datasets.forEach(dataset -> {
// 新增数据集 // // 新增数据集
dataset.setDatasourceId(datasourceId); // dataset.setDatasourceId(datasourceId);
dataset.setId(null); // dataset.setId(null);
batchInsertDataset.add(dataset); // batchInsertDataset.add(dataset);
}); // });
//
// 批量插入数据集 // // 批量插入数据集
if (CollUtil.isNotEmpty(batchInsertDataset)) { // if (CollUtil.isNotEmpty(batchInsertDataset)) {
datasetService.batchCreateDataset(batchInsertDataset); // datasetService.batchCreateDataset(batchInsertDataset);
} // }
}); // });
} }
/** /**
@@ -355,20 +362,14 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService {
} }
/** /**
* 校验只有超管可以操作内置模板 * 校验只有超管可以操作内置数据源
* *
* @param templateId 模板id * @param buildinType 内置数据源类型
*/ */
private void validateSystemTemplate(Long templateId) { private void validateSystemDatasource(Integer buildinType) {
ReportTemplateDO templateDO = reportTemplateMapper.selectById(templateId);
if (ObjectUtil.isNull(templateDO)) {
throw exception(TEMPLATE_NOT_EXISTS);
}
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
boolean isSuperAdmin = loginUser != null && loginUser.getIsSupAdmin();
// 非超管不能操作内置模板 // 非超管不能操作内置模板
if (ReportTemplateTypeEnum.SYSTEM.equals(templateDO.getType()) && !isSuperAdmin) { if (ReportTemplateTypeEnum.SYSTEM.getType().equals(buildinType) && Boolean.FALSE.equals(SecurityFrameworkUtils.isSuperAdmin())) {
throw exception(TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR); throw exception(DATASOURCE_BUILDIN_OPERATION_PERMISSION_ERROR);
} }
} }
} }
@@ -28,17 +28,12 @@ import com.bstek.ureport.export.html.HtmlReport;
import com.bstek.ureport.model.Report; import com.bstek.ureport.model.Report;
import com.bstek.ureport.parser.ReportParser; import com.bstek.ureport.parser.ReportParser;
import com.bstek.ureport.utils.ToolUtils; import com.bstek.ureport.utils.ToolUtils;
import com.cf.imes.framework.common.util.json.JsonUtils;
import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.organ.core.aop.OrganIgnore; import com.cf.imes.framework.organ.core.aop.OrganIgnore;
import com.cf.imes.framework.security.core.LoginUser; import com.cf.imes.framework.security.core.LoginUser;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.report.api.template.dto.ReportTemplateGenerateReqDTO; import com.cf.imes.module.report.api.template.dto.ReportTemplateGenerateReqDTO;
import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO;
import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO;
import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceReqVO;
import com.cf.imes.module.report.controller.admin.datasource.vo.ReportDatasourceSaveReqVO;
import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateReqVO; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateReqVO;
import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateSaveReqVO; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateSaveReqVO;
import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO; import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO;
@@ -67,6 +62,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set;
import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR; import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR;
@@ -85,12 +81,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
@Resource @Resource
private ReportTemplateMapper templateMapper; private ReportTemplateMapper templateMapper;
@Resource
private ReportDatasourceService datasourceService;
@Resource
private ReportDatasetService datasetService;
@Resource @Resource
private ReportDatasourceMapper datasourceMapper; private ReportDatasourceMapper datasourceMapper;
@@ -120,8 +110,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
} }
templateMapper.insert(template); templateMapper.insert(template);
Long templateId = template.getId(); Long templateId = template.getId();
// 解析数据源
analyzeDatasource(createReqVO.getDatasource(), templateId);
// 返回主键 // 返回主键
return templateId; return templateId;
} }
@@ -149,83 +137,11 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
} }
// 新增模版 // 新增模版
templateMapper.insert(copyTemplateDO); templateMapper.insert(copyTemplateDO);
Long newtemplateId = copyTemplateDO.getId();
// 复制datasource、dataset
List<ReportDatasourceDO> templateDatasourceList = datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(templateId).build());
List<ReportDatasourceSaveReqVO> copyDatasourceList = new ArrayList<>();
// 遍历数据源
templateDatasourceList.forEach(ds -> {
ReportDatasourceSaveReqVO copyDatasourceSaveReqVO = JsonUtils.parseObject(JsonUtils.toJsonString(ds), ReportDatasourceSaveReqVO.class);
copyDatasourceSaveReqVO.setId(null);
copyDatasourceSaveReqVO.setTemplateId(newtemplateId);
List<ReportDatasetDO> templateDatasetList = ds.getDatasets();
// 遍历数据集
if (CollUtil.isNotEmpty(templateDatasetList)) {
List<ReportDatasetSaveReqVO> copyDatasetList = new ArrayList<>();
templateDatasetList.forEach(dt -> {
ReportDatasetSaveReqVO copyDatasetSaveReqVO = BeanUtils.toBean(dt, ReportDatasetSaveReqVO.class);
copyDatasetSaveReqVO.setId(null);
copyDatasetSaveReqVO.setDatasourceId(null);
copyDatasetList.add(copyDatasetSaveReqVO);
});
copyDatasourceSaveReqVO.setDatasets(copyDatasetList);
}
copyDatasourceList.add(copyDatasourceSaveReqVO);
});
// 更新数据源
analyzeDatasource(copyDatasourceList, newtemplateId);
// 返回主键 // 返回主键
return newtemplateId; return copyTemplateDO.getId();
}
/**
* 解析数据源集合并入库
*
* @param datasource 数据源列表
* @param templateId 模板id
*/
private void analyzeDatasource(List<ReportDatasourceSaveReqVO> datasource, Long templateId) {
if (CollUtil.isEmpty(datasource)) {
return;
}
datasource.forEach(ds -> {
// 更新/新增数据源
Long datasourceId;
if (ObjectUtil.isNotNull(ds.getId())) {
datasourceId = ds.getId();
datasourceService.updateDatasource(ds);
} else {
ds.setTemplateId(templateId);
datasourceId = datasourceService.createDatasource(ds);
}
List<ReportDatasetSaveReqVO> datasets = ds.getDatasets();
List<ReportDatasetSaveReqVO> batchInsertDataset = new ArrayList<>();
List<ReportDatasetSaveReqVO> batchupdateDataset = new ArrayList<>();
datasets.forEach(dataset -> {
// 更新/新增数据集
if (ObjectUtil.isNotNull(dataset.getId())) {
batchupdateDataset.add(dataset);
} else {
dataset.setDatasourceId(datasourceId);
batchInsertDataset.add(dataset);
}
});
// 批量插入数据集
if (CollUtil.isNotEmpty(batchInsertDataset)) {
datasetService.batchCreateDataset(batchInsertDataset);
}
// 批量更新数据集
if (CollUtil.isNotEmpty(batchupdateDataset)) {
datasetService.batchUpdateDataset(batchupdateDataset);
}
});
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void updateReportTemplate(ReportTemplateSaveReqVO updateReqVO) { public void updateReportTemplate(ReportTemplateSaveReqVO updateReqVO) {
Long templateId = updateReqVO.getId(); Long templateId = updateReqVO.getId();
// 校验存在 // 校验存在
@@ -242,13 +158,9 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
// 更新模板 // 更新模板
ReportTemplateDO updateObj = BeanUtils.toBean(updateReqVO, ReportTemplateDO.class); ReportTemplateDO updateObj = BeanUtils.toBean(updateReqVO, ReportTemplateDO.class);
templateMapper.updateById(updateObj); templateMapper.updateById(updateObj);
// 更新数据源
analyzeDatasource(updateReqVO.getDatasource(), templateId);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void deleteReportTemplate(Long id) { public void deleteReportTemplate(Long id) {
// 校验存在 // 校验存在
ReportTemplateDO reportTemplateDO = validateTemplateExists(id); ReportTemplateDO reportTemplateDO = validateTemplateExists(id);
@@ -256,15 +168,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
validateSystemTemplate(reportTemplateDO); validateSystemTemplate(reportTemplateDO);
// 删除 // 删除
templateMapper.deleteById(id); templateMapper.deleteById(id);
// 删除关联数据源
List<ReportDatasourceDO> reportDatasourceDOS = datasourceMapper.selectList(new LambdaQueryWrapperX<ReportDatasourceDO>().eq(ReportDatasourceDO::getTemplateId, id));
if (CollUtil.isNotEmpty(reportDatasourceDOS)) {
// 模板下的数据源id
List<Long> datasourceIds = reportDatasourceDOS.stream().map(ReportDatasourceDO::getId).toList();
datasourceMapper.deleteBatchIds(datasourceIds);
// 删除关联数据集
datasetMapper.delete(new LambdaQueryWrapperX<ReportDatasetDO>().in(ReportDatasetDO::getDatasourceId, datasourceIds));
}
} }
@@ -319,16 +222,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
validateTemplateExists(id); validateTemplateExists(id);
// 查询模板 // 查询模板
ReportTemplateDO template = templateMapper.selectById(id); ReportTemplateDO template = templateMapper.selectById(id);
if (ObjectUtil.isNotNull(template)) {
// 查询数据源
List<ReportDatasourceDO> datasourceList = datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(template.getId()).build());
datasourceList.forEach(ds -> {
// 查询数据集
List<ReportDatasetDO> datasetList = datasetService.getDatasetList(ReportDatasetReqVO.builder().datasourceId(ds.getId()).build());
ds.setDatasets(datasetList);
});
template.setDatasource(datasourceList);
}
return template; return template;
} }
@@ -348,7 +241,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
// 解析xml // 解析xml
ReportDefinition reportDefinition = new ReportParser().parse(is, template.getName()); ReportDefinition reportDefinition = new ReportParser().parse(is, template.getName());
if (ObjectUtil.isNotNull(template)) { if (ObjectUtil.isNotNull(template)) {
queryDatasource(template.getId(), reportDefinition); queryDatasource(template, reportDefinition);
} }
return new ReportDefinitionWrapper(reportDefinition); return new ReportDefinitionWrapper(reportDefinition);
} }
@@ -356,38 +249,55 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
/** /**
* 查询数据源信息(替代ureport xml中的数据源) * 查询数据源信息(替代ureport xml中的数据源)
* *
* @param templateId 模板id * @param templateDO 模板
* @param reportDefinition 报表定义 * @param reportDefinition 报表定义
*/ */
private void queryDatasource(Long templateId, ReportDefinition reportDefinition) { private void queryDatasource(ReportTemplateDO templateDO, ReportDefinition reportDefinition) {
Set<Long> datasourceIds = templateDO.getDatasourceIds();
Set<Long> datasetIds = templateDO.getDatasetIds();
List<ReportDatasourceDO> reportDatasourceDOS = new ArrayList<>();
if (CollUtil.isNotEmpty(datasourceIds)) {
// 查询模板下的数据源
reportDatasourceDOS = datasourceMapper.selectList(new LambdaQueryWrapperX<ReportDatasourceDO>().in(ReportDatasourceDO::getId, datasourceIds));
}
List<ReportDatasetDO> reportDatasetDOS = new ArrayList<>();
if (CollUtil.isNotEmpty(datasetIds)) {
// 查询模板下的数据集
reportDatasetDOS = datasetMapper.selectList(new LambdaQueryWrapperX<ReportDatasetDO>().in(ReportDatasetDO::getId, datasetIds));
}
// 转换ureport对象后的数据源列表
List<DatasourceDefinition> datasourceDefinitions = new ArrayList<>(); List<DatasourceDefinition> datasourceDefinitions = new ArrayList<>();
// 查询数据源
List<ReportDatasourceDO> datasourceList = datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(templateId).build());
for (ReportDatasourceDO ds : datasourceList) { // 遍历列表转换为ureport对象
// 查询数据集 for (ReportDatasourceDO ds : reportDatasourceDOS) {
List<ReportDatasetDO> datasetList = datasetService.getDatasetList(ReportDatasetReqVO.builder().datasourceId(ds.getId()).build()); // 转换ureport对象后的数据集列表
List<DatasetDefinition> datasetDefinitions = new ArrayList<>(); List<DatasetDefinition> datasetDefinitions = new ArrayList<>();
// 匹配数据源下的数据集
List<ReportDatasetDO> datasetInDatasourceList = reportDatasetDOS.stream().filter(reportDatasetDO -> ds.getId().equals(reportDatasetDO.getDatasourceId())).toList();
// 忽略转换的字段名,手动转列表 // 忽略转换的字段名,手动转列表
String ignorePropertieName = "datasets"; String ignorePropertieName = "datasets";
switch (ds.getType()) { switch (ds.getType()) {
case JDBC -> { case JDBC -> {
// 转换对应的ureport对象 // 转换对应的ureport对象
JdbcDatasourceDefinition jdbcDatasourceDefinition = BeanUtil.copyProperties(ds, JdbcDatasourceDefinition.class, ignorePropertieName); JdbcDatasourceDefinition jdbcDatasourceDefinition = BeanUtil.copyProperties(ds, JdbcDatasourceDefinition.class, ignorePropertieName);
datasetDefinitions.addAll(BeanUtils.toBean(datasetList, SqlDatasetDefinition.class)); datasetDefinitions.addAll(BeanUtils.toBean(datasetInDatasourceList, SqlDatasetDefinition.class));
jdbcDatasourceDefinition.setDatasets(datasetDefinitions); jdbcDatasourceDefinition.setDatasets(datasetDefinitions);
datasourceDefinitions.add(jdbcDatasourceDefinition); datasourceDefinitions.add(jdbcDatasourceDefinition);
} }
case SPRING -> { case SPRING -> {
// 转换对应的ureport对象 // 转换对应的ureport对象
SpringBeanDatasourceDefinition springBeanDatasourceDefinition = BeanUtil.copyProperties(ds, SpringBeanDatasourceDefinition.class, ignorePropertieName); SpringBeanDatasourceDefinition springBeanDatasourceDefinition = BeanUtil.copyProperties(ds, SpringBeanDatasourceDefinition.class, ignorePropertieName);
datasetDefinitions.addAll(BeanUtils.toBean(datasetList, BeanDatasetDefinition.class)); datasetDefinitions.addAll(BeanUtils.toBean(datasetInDatasourceList, BeanDatasetDefinition.class));
springBeanDatasourceDefinition.setDatasets(datasetDefinitions); springBeanDatasourceDefinition.setDatasets(datasetDefinitions);
datasourceDefinitions.add(springBeanDatasourceDefinition); datasourceDefinitions.add(springBeanDatasourceDefinition);
} }
case API -> { case API -> {
// 转换对应的ureport对象 // 转换对应的ureport对象
ApiDatasourceDefinition apiDatasourceDefinition = BeanUtil.copyProperties(ds, ApiDatasourceDefinition.class, ignorePropertieName); ApiDatasourceDefinition apiDatasourceDefinition = BeanUtil.copyProperties(ds, ApiDatasourceDefinition.class, ignorePropertieName);
datasetDefinitions.addAll(BeanUtils.toBean(datasetList, ApiDatasetDefinition.class)); datasetDefinitions.addAll(BeanUtils.toBean(datasetInDatasourceList, ApiDatasetDefinition.class));
apiDatasourceDefinition.setDatasets(datasetDefinitions); apiDatasourceDefinition.setDatasets(datasetDefinitions);
datasourceDefinitions.add(apiDatasourceDefinition); datasourceDefinitions.add(apiDatasourceDefinition);
} }
@@ -519,7 +429,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
// 解析xml // 解析xml
ReportDefinition reportDefinition = reportRender.getReportDefinition(xmlContent, CharsetUtil.UTF_8); ReportDefinition reportDefinition = reportRender.getReportDefinition(xmlContent, CharsetUtil.UTF_8);
// 查询数据源 // 查询数据源
queryDatasource(template.getId(), reportDefinition); queryDatasource(template, reportDefinition);
// 设置参数 // 设置参数
PreviewParameters previewParameters = new PreviewParameters(); PreviewParameters previewParameters = new PreviewParameters();
previewParameters.setQuery(reqDTO.getParams()); previewParameters.setQuery(reqDTO.getParams());
@@ -30,7 +30,6 @@ public abstract class ReportCommonServiceImplTest {
.name("单元测试模板") .name("单元测试模板")
.content(JsonUtil.zipString(TEMPLATE)) .content(JsonUtil.zipString(TEMPLATE))
.remark(RandomUtils.randomString()) .remark(RandomUtils.randomString())
.datasource(new ArrayList<>())
.build(); .build();
} }
@@ -39,14 +38,12 @@ public abstract class ReportCommonServiceImplTest {
return ReportDatasourceSaveReqVO.builder() return ReportDatasourceSaveReqVO.builder()
.id(id) .id(id)
.name("单元测试数据源") .name("单元测试数据源")
.templateId(reportId)
.type(ReportDatasourceTypeEnum.SPRING.getDesc()) .type(ReportDatasourceTypeEnum.SPRING.getDesc())
.driver("com.mysql.cj.jdbc.Driver") .driver("com.mysql.cj.jdbc.Driver")
.url("jdbc:mysql://192.168.1.205:3307/imes_base?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true") .url("jdbc:mysql://192.168.1.205:3307/imes_base?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true")
.username("root") .username("root")
.password("root") .password("root")
.remark(RandomUtils.randomString()) .remark(RandomUtils.randomString())
.datasets(new ArrayList<>())
.build(); .build();
} }
@@ -70,7 +70,7 @@ public class ReportDatasourceServiceImplTest extends ReportCommonServiceImplTest
reqVO.setTemplateId(templateId); reqVO.setTemplateId(templateId);
reqVO.setType(ReportDatasourceTypeEnum.JDBC.getCode()); reqVO.setType(ReportDatasourceTypeEnum.JDBC.getCode());
reqVO.setName(updateReqVO.getName()); reqVO.setName(updateReqVO.getName());
List<ReportDatasourceDO> templateDatasourceList = reportDatasourceService.getTemplateDatasourceList(reqVO); List<ReportDatasourceDO> templateDatasourceList = reportDatasourceService.getDatasourceList();
assertNotNull(templateDatasourceList); assertNotNull(templateDatasourceList);
assertNotEquals(0, templateDatasourceList.size()); assertNotEquals(0, templateDatasourceList.size());