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