diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/ReportDatasetController.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/ReportDatasetController.java index 53c9fd036..40fe84bc6 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/ReportDatasetController.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/ReportDatasetController.java @@ -3,7 +3,6 @@ package com.cf.imes.module.report.controller.admin.dataset; import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.operatelog.core.annotations.OperateLog; -import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetRespVO; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetSaveReqVO; import com.cf.imes.module.report.dal.dataobject.dataset.ReportDatasetDO; @@ -17,7 +16,6 @@ import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import jakarta.validation.Valid; -import java.util.List; import static com.cf.imes.framework.common.pojo.CommonResult.success; import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.CREATE; @@ -71,13 +69,4 @@ public class ReportDatasetController { ReportDatasetDO dataset = datasetService.getDataset(id); return success(BeanUtils.toBean(dataset, ReportDatasetRespVO.class)); } - - @GetMapping("/datasets") - @Operation(summary = "获取数据源下的报表数据集列表") - @PreAuthorize("@ss.hasPermission('report:design')") - public CommonResult> getDatasetPage(@RequestParam(value = "datasourceId") Long datasourceId, - @RequestParam(value = "name", required = false) String name) { - ReportDatasetReqVO reqVO = new ReportDatasetReqVO(name, datasourceId); - return success(BeanUtils.toBean(datasetService.getDatasetList(reqVO), ReportDatasetRespVO.class)); - } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java index 6233d60df..f92814c2e 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java @@ -23,6 +23,7 @@ import lombok.extern.slf4j.Slf4j; import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.TerminalNode; +import org.apache.ibatis.annotations.Param; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -84,8 +85,8 @@ public class ReportTemplateController { @Operation(summary = "删除报表模板") @Parameter(name = "id", description = "模板id", required = true) @PreAuthorize("@ss.hasAnyPermissions('system:report:delete','base:report:delete')") - public CommonResult deleteReportTemplate(@PathVariable("id") Long id) { - templateService.deleteReportTemplate(id); + public CommonResult deleteReportTemplate(@PathVariable("id") Long id, @Param("organId") Long organId) { + templateService.deleteReportTemplate(id, organId); return success(true); } @@ -93,8 +94,8 @@ public class ReportTemplateController { @Operation(summary = "获取报表模板信息") @Parameter(name = "id", description = "模板id", required = true, example = "1") @PreAuthorize("@ss.hasPermission('report:design')") - public CommonResult getReportTemplate(@PathVariable("id") Long id) { - return success(templateService.getReportTemplateDefinition(id)); + public CommonResult getReportTemplate(@PathVariable("id") Long id, @Param("organId") Long organId) { + return success(templateService.getReportTemplateDefinition(id, organId)); } @GetMapping("/templates") @@ -221,8 +222,8 @@ public class ReportTemplateController { @Operation(summary = "导入模版") @OperateLog(type = IMPORT) @PreAuthorize("@ss.hasAnyPermissions('system:report:import','base:report:import')") - public CommonResult importTemplate(@RequestParam("name") @NotEmpty(message = "report.template.import.name.notEmpty") String name, @RequestParam("file") MultipartFile file) { - templateService.importTemplate(name, file); + public CommonResult importTemplate(@RequestParam("name") @NotEmpty(message = "report.template.import.name.notEmpty") String name, @RequestParam("file") MultipartFile file, @RequestParam("organId") Long organId) { + templateService.importTemplate(name, organId, file); return success(true); } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplatePreviewReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplatePreviewReqVO.java index f2476827b..40d4468e5 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplatePreviewReqVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplatePreviewReqVO.java @@ -44,4 +44,6 @@ public class ReportTemplatePreviewReqVO { @Size(max = 30, message = "report.template.preview.chartImages.size") private Map chartImages; + @Schema(description = "组织ID") + private Long organId; } \ No newline at end of file diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java index f498bd00d..1816f8655 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplateSaveReqVO.java @@ -44,4 +44,7 @@ public class ReportTemplateSaveReqVO { @Schema(description = "数据集id列表") @Size(max = 30, message = "report.template.save.datasetIds.size") private Set datasetIds; + + @Schema(description = "组织id", example = "1") + private Long organId; } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/dataset/ReportDatasetMapper.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/dataset/ReportDatasetMapper.java index c499e5806..aa5d8417f 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/dataset/ReportDatasetMapper.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/dataset/ReportDatasetMapper.java @@ -9,6 +9,8 @@ import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Set; +import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.CF_ORGANID; + /** * 报表数据集 Mapper * @@ -20,14 +22,24 @@ public interface ReportDatasetMapper extends BaseMapperX { /** * 查询数据集列表 + * * @param * @return */ @OrganIgnore default List selectNormalDatasetList(Set datasetIds, Long organId) { - return selectList(new LambdaQueryWrapperX() + // 先查组织数据集 + List orgDataSet = selectList(new LambdaQueryWrapperX() .eq(ReportDatasetDO::getOrganId, organId) .in(ReportDatasetDO::getId, datasetIds) ); + + // 再查公共数据集 + List publicDataSet = selectList(new LambdaQueryWrapperX() + .eq(ReportDatasetDO::getOrganId, CF_ORGANID) + .in(ReportDatasetDO::getId, datasetIds) + ); + orgDataSet.addAll(publicDataSet); + return orgDataSet; } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/datasource/ReportDatasourceMapper.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/datasource/ReportDatasourceMapper.java index d826bff88..a3b336a51 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/datasource/ReportDatasourceMapper.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/datasource/ReportDatasourceMapper.java @@ -32,7 +32,7 @@ public interface ReportDatasourceMapper extends BaseMapperX */ @OrganIgnore default ReportDatasourceDO selectNormalDatasourceById(Long id, Long organId) { - ReportDatasourceDO result = null; + ReportDatasourceDO result; // 1. 先查 CUSTOM(当前组织) LambdaQueryWrapper customWrapper = new LambdaQueryWrapper() diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/template/ReportTemplateMapper.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/template/ReportTemplateMapper.java index 5f573d2de..d93383f71 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/template/ReportTemplateMapper.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/mysql/template/ReportTemplateMapper.java @@ -127,6 +127,6 @@ public interface ReportTemplateMapper extends BaseMapperX { * @param id * @return 改动数量 */ - @Delete("DELETE FROM report_template WHERE id = #{id}") - int physicalDeleteById(@Param("id") Long id); + @Delete("DELETE FROM report_template WHERE id = #{id} AND organ_id = #{organId}") + int physicalDeleteById(@Param("id") Long id, @Param("organId") Long organId); } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetService.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetService.java index fd474b37b..5f0cfdb3a 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetService.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetService.java @@ -50,6 +50,6 @@ public interface ReportDatasetService { * @param reqVO 分页查询 * @return 报表数据集分页 */ - List getDatasetList(ReportDatasetReqVO reqVO); + List getDatasetList(ReportDatasetReqVO reqVO, Long organId); } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java index 6acfed079..10dac62a1 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/dataset/ReportDatasetServiceImpl.java @@ -3,7 +3,6 @@ package com.cf.imes.module.report.service.dataset; import cn.hutool.core.util.ObjectUtil; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.util.object.BeanUtils; -import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO; @@ -38,9 +37,6 @@ public class ReportDatasetServiceImpl implements ReportDatasetService { @Resource private ReportDatasetMapper datasetMapper; - @Resource - private SnowFlakeGenerator snowFlakeGenerator; - @Override public Long createDataset(ReportDatasetSaveReqVO createReqVO) { // 校验内置模板操作权限 @@ -49,8 +45,6 @@ public class ReportDatasetServiceImpl implements ReportDatasetService { ReportDatasetDO dataset = BeanUtils.toBean(createReqVO, ReportDatasetDO.class); // 数据集机构id和数据源统一 dataset.setOrganId(reportDatasourceDO.getOrganId()); - // 生成id - dataset.setId((Long) snowFlakeGenerator.nextId(null)); datasetMapper.insert(dataset); // 返回 return dataset.getId(); @@ -118,8 +112,9 @@ public class ReportDatasetServiceImpl implements ReportDatasetService { } @Override - public List getDatasetList(ReportDatasetReqVO reqVO) { + public List getDatasetList(ReportDatasetReqVO reqVO, Long organId) { return datasetMapper.selectList(new LambdaQueryWrapperX() + .eq(ReportDatasetDO::getOrganId, organId) .eqIfPresent(ReportDatasetDO::getDatasourceId, reqVO.getDatasourceId()) .likeIfPresent(ReportDatasetDO::getName, reqVO.getName()) .orderByDesc(ReportDatasetDO::getCreateTime)); diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java index f35122229..a2f7d0050 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java @@ -4,7 +4,6 @@ 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; @@ -16,7 +15,6 @@ import com.bstek.ureport.definition.dataset.SqlDatasetDefinition; import com.bstek.ureport.utils.ProcedureUtils; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.util.object.BeanUtils; -import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator; 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; @@ -82,9 +80,6 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { @Resource private ReportDatasetMapper datasetMapper; - @Resource - private SnowFlakeGenerator snowFlakeGenerator; - private final ApplicationContext applicationContext; public ReportDatasourceServiceImpl(ApplicationContext applicationContext) { @@ -103,8 +98,6 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { } else { datasource.setBuildinType(ReportTemplateTypeEnum.CUSTOM); } - // 生成id - datasource.setId((Long) snowFlakeGenerator.nextId(null)); datasourceMapper.insert(datasource); // 返回 return datasource.getId(); @@ -218,7 +211,7 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { @Override public List loadBeanMethods(String beanId) { Object obj; - List result = new ArrayList(); + List result = new ArrayList<>(); try { obj = applicationContext.getBean(beanId); Class clazz = obj.getClass(); @@ -310,7 +303,7 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { @Override public List getSpringBeanResultFieldList(String clazz) { - List result = new ArrayList(); + List result = new ArrayList<>(); try { Class targetClass = Class.forName(clazz); PropertyDescriptor[] propertyDescriptors = BeanUtil.getPropertyDescriptors(targetClass); @@ -336,7 +329,7 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { private void queryDatasetInSource(ReportDatasourceDO reportDatasourceDO) { if (ObjectUtil.isNotNull(reportDatasourceDO)) { // 查询数据集 - List datasetList = datasetService.getDatasetList(ReportDatasetReqVO.builder().datasourceId(reportDatasourceDO.getId()).build()); + List datasetList = datasetService.getDatasetList(ReportDatasetReqVO.builder().datasourceId(reportDatasourceDO.getId()).build(), reportDatasourceDO.getOrganId()); reportDatasourceDO.setDatasets(datasetList); } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateService.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateService.java index 21d5f2cd1..66059c33b 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateService.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateService.java @@ -49,15 +49,7 @@ public interface ReportTemplateService { * * @param id 编号 */ - void deleteReportTemplate(Long id); - - /** - * 获取报表模板信息 - * - * @param id 编号 - * @return 报表模板信息 - */ - ReportTemplateDO getReportTemplate(Long id); + void deleteReportTemplate(Long id, Long targetOrganId); /** * 获取模板定义信息(xml+数据源) @@ -65,7 +57,7 @@ public interface ReportTemplateService { * @param id * @return */ - ReportDefinitionWrapper getReportTemplateDefinition(Long id); + ReportDefinitionWrapper getReportTemplateDefinition(Long id, Long targetOrganId); /** * 获取报表模板信息列表 @@ -137,5 +129,5 @@ public interface ReportTemplateService { * @param name * @param file */ - void importTemplate(String name, MultipartFile file); + void importTemplate(String name, Long organId, MultipartFile file); } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java index 85f36fc90..e5b897cb2 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/template/ReportTemplateServiceImpl.java @@ -38,13 +38,8 @@ import com.bstek.ureport.model.Report; import com.bstek.ureport.parser.ReportParser; import com.bstek.ureport.utils.ToolUtils; import com.cf.imes.framework.common.exception.ServiceException; -import com.cf.imes.framework.common.exception.enums.GlobalErrorCodeConstants; import com.cf.imes.framework.common.util.object.BeanUtils; -import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator; 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.context.OrganContextHolder; -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.template.vo.ReportTemplateCommonPreviewReqVO; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplatePreviewReqVO; @@ -62,8 +57,6 @@ import com.cf.imes.module.report.utils.TenantParamsUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.ObjectUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.multipart.MultipartFile; @@ -114,9 +107,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { @Resource private ReportDatasetMapper datasetMapper; - @Resource - private SnowFlakeGenerator snowFlakeGenerator; - private static final String UTF8_CHARSET = CharsetUtil.UTF_8; private static final String ATTACHMENT_PREFIX = "attachment; filename="; private static final String DATASETIDS_FIELD_NAME = "datasetIds"; @@ -136,11 +126,18 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { } @Override - @Transactional(rollbackFor = Exception.class) public ReportTemplateRespVO createReportTemplate(ReportTemplateSaveReqVO createReqVO) { boolean isSuperAdmin = SecurityFrameworkUtils.isSuperAdmin(); + boolean manageEndPoint = SecurityFrameworkUtils.isManageEndPoint(); + Long loginOrganId = SecurityFrameworkUtils.getUserOrganId(); + Long targetOrganId = createReqVO.getOrganId(); + // 超管/管理端操作的就是公共模版 + boolean isPublic = (isSuperAdmin || manageEndPoint) && ObjectUtil.isNull(targetOrganId); + + Long organId = isPublic ? loginOrganId : targetOrganId; + // 校验模板名唯一性 - getSelf().validateTemplateNameUnique(createReqVO, isSuperAdmin); + getSelf().validateTemplateNameUnique(createReqVO, organId); // url解码xml String content = createReqVO.getContent(); if (StringUtils.isNotEmpty(content)) { @@ -151,46 +148,45 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { } // 新增模板 ReportTemplateDO template = BeanUtils.toBean(createReqVO, ReportTemplateDO.class); - // 生成id - template.setId((Long) snowFlakeGenerator.nextId(null)); // 超管创建的作为内置模板 - if (isSuperAdmin) { + if (isPublic) { template.setType(ReportTemplateTypeEnum.SYSTEM); } else { template.setType(ReportTemplateTypeEnum.CUSTOM); } + template.setOrganId(organId); templateMapper.insert(template); ReportTemplateRespVO reportTemplateRespVO = BeanUtils.toBean(template, ReportTemplateRespVO.class); // 查询数据源、数据集 ReportDefinition reportDefinition = new ReportDefinition(); - queryDatasource(template, reportDefinition); + queryDatasource(template, reportDefinition, organId); reportTemplateRespVO.setDatasource(reportDefinition.getDatasources()); // 返回实体 return reportTemplateRespVO; } @Override - @Transactional(rollbackFor = Exception.class) public Long copyReportTemplate(ReportTemplateSaveReqVO createReqVO) { boolean isSuperAdmin = SecurityFrameworkUtils.isSuperAdmin(); + boolean manageEndPoint = SecurityFrameworkUtils.isManageEndPoint(); + Long loginOrganId = SecurityFrameworkUtils.getUserOrganId(); + Long targetOrganId = createReqVO.getOrganId(); + // 超管/管理端操作的就是公共模版 + boolean isPublic = (isSuperAdmin || manageEndPoint) && ObjectUtil.isNull(targetOrganId); + + Long organId = isPublic ? loginOrganId : targetOrganId; + Long templateId = createReqVO.getId(); // 校验存在 - ReportTemplateDO reportTemplateDO = validateTemplateExists(templateId); + ReportTemplateDO reportTemplateDO = validateTemplateExists(templateId, organId); // 校验模板名唯一性 - getSelf().validateTemplateNameUnique(createReqVO, isSuperAdmin); + getSelf().validateTemplateNameUnique(createReqVO, organId); ReportTemplateDO copyTemplateDO = BeanUtils.toBean(reportTemplateDO, ReportTemplateDO.class); // 重置id copyTemplateDO.setId(null); copyTemplateDO.setName(createReqVO.getName()); - // 超管创建的作为内置模板 - if (isSuperAdmin) { - copyTemplateDO.setType(ReportTemplateTypeEnum.SYSTEM); - } else { - // 重置所属机构 - copyTemplateDO.setOrganId(SecurityFrameworkUtils.getUserOrganId()); - copyTemplateDO.setType(ReportTemplateTypeEnum.CUSTOM); - } + // 重置相关基础信息 copyTemplateDO.setCreator(null); copyTemplateDO.setUpdater(null); @@ -202,9 +198,14 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 解析xml new ReportParser().parse(new ByteArrayInputStream(content.getBytes()), createReqVO.getName()); } - // 生成id - copyTemplateDO.setId((Long) snowFlakeGenerator.nextId(null)); - // 新增模版 + + // 超管创建的作为内置模板 + if (isPublic) { + copyTemplateDO.setType(ReportTemplateTypeEnum.SYSTEM); + } else { + // 重置所属机构 + copyTemplateDO.setType(ReportTemplateTypeEnum.CUSTOM); + } templateMapper.insert(copyTemplateDO); // 返回主键 return copyTemplateDO.getId(); @@ -212,13 +213,22 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { @Override public ReportTemplateRespVO updateReportTemplate(ReportTemplateSaveReqVO updateReqVO) { + boolean isSuperAdmin = SecurityFrameworkUtils.isSuperAdmin(); + boolean manageEndPoint = SecurityFrameworkUtils.isManageEndPoint(); + Long loginOrganId = SecurityFrameworkUtils.getUserOrganId(); + Long targetOrganId = updateReqVO.getOrganId(); + // 超管/管理端操作的就是公共模版 + boolean isPublic = (isSuperAdmin || manageEndPoint) && ObjectUtil.isNull(targetOrganId); + + Long organId = isPublic ? loginOrganId : targetOrganId; + Long templateId = updateReqVO.getId(); // 校验存在 - ReportTemplateDO reportTemplateDO = validateTemplateExists(templateId); + ReportTemplateDO reportTemplateDO = validateTemplateExists(templateId, organId); // 校验模板名唯一性 - getSelf().validateTemplateNameUnique(updateReqVO, SecurityFrameworkUtils.isSuperAdmin()); + getSelf().validateTemplateNameUnique(updateReqVO, organId); // 校验内置模板操作权限 - validateSystemTemplate(reportTemplateDO); + validateSystemTemplate(reportTemplateDO, isPublic); // url解码xml String content = updateReqVO.getContent(); if (StringUtils.isNotEmpty(content)) { @@ -234,30 +244,37 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { ReportTemplateRespVO reportTemplateRespVO = BeanUtils.toBean(updateObj, ReportTemplateRespVO.class); // 查询数据源、数据集 ReportDefinition reportDefinition = new ReportDefinition(); - queryDatasource(updateObj, reportDefinition); + queryDatasource(updateObj, reportDefinition, organId); reportTemplateRespVO.setDatasource(reportDefinition.getDatasources()); // 返回实体 return reportTemplateRespVO; } @Override - public void deleteReportTemplate(Long id) { + public void deleteReportTemplate(Long id, Long targetOrganId) { + boolean isSuperAdmin = SecurityFrameworkUtils.isSuperAdmin(); + boolean manageEndPoint = SecurityFrameworkUtils.isManageEndPoint(); + Long loginOrganId = SecurityFrameworkUtils.getUserOrganId(); + // 超管/管理端操作的就是公共模版 + boolean isPublic = (isSuperAdmin || manageEndPoint) && ObjectUtil.isNull(targetOrganId); + + Long organId = ObjectUtil.defaultIfNull(targetOrganId, loginOrganId); + // 校验存在 - ReportTemplateDO reportTemplateDO = validateTemplateExists(id); + ReportTemplateDO reportTemplateDO = validateTemplateExists(id, organId); // 校验内置模板操作权限 - validateSystemTemplate(reportTemplateDO); + validateSystemTemplate(reportTemplateDO, isPublic); // 删除 - templateMapper.physicalDeleteById(id); + templateMapper.physicalDeleteById(id, organId); } /** - * 校验只有超管可以操作内置模板 + * 校验只有管理端可以操作内置模板 */ - private void validateSystemTemplate(ReportTemplateDO templateDO) { - boolean isSuperAdmin = SecurityFrameworkUtils.isSuperAdmin(); - // 非超管不能操作内置模板 - if (ReportTemplateTypeEnum.SYSTEM.equals(templateDO.getType()) && !isSuperAdmin) { + private void validateSystemTemplate(ReportTemplateDO templateDO, boolean isPublic) { + // 非cf organ不能操作内置模板 + if (ReportTemplateTypeEnum.SYSTEM.equals(templateDO.getType()) && !isPublic) { throw new ServiceException(TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR); } } @@ -267,18 +284,8 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { * * @param id */ - public ReportTemplateDO validateTemplateExists(Long id) { - ReportTemplateDO reportTemplateDO; - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - if (ObjectUtil.isNull(loginUser)) { - throw new ServiceException(GlobalErrorCodeConstants.UNAUTHORIZED); - } - // 非超管查询内置模板+机构下的 - if (loginUser.getIsSupAdmin()) { - reportTemplateDO = templateMapper.selectById(id); - } else { - reportTemplateDO = templateMapper.selectNormalTemplateById(id, loginUser.getOrganId()); - } + public ReportTemplateDO validateTemplateExists(Long id, Long organId) { + ReportTemplateDO reportTemplateDO = templateMapper.selectNormalTemplateById(id, organId); if (ObjectUtil.isNull(reportTemplateDO)) { throw new ServiceException(TEMPLATE_NOT_EXISTS); } else { @@ -291,33 +298,27 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { * * @param reqVO */ - @OrganIgnore - void validateTemplateNameUnique(ReportTemplateSaveReqVO reqVO, boolean isSuperAdmin) { + void validateTemplateNameUnique(ReportTemplateSaveReqVO reqVO, Long organId) { Long templateId = reqVO.getId(); String name = reqVO.getName(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapperX().eq(ReportTemplateDO::getName, name); - wrapper.eq(ReportTemplateDO::getOrganId, OrganContextHolder.getOrganId()); + wrapper.eq(ReportTemplateDO::getOrganId, organId); if (ObjectUtil.isNotNull(templateId)) { wrapper.ne(ReportTemplateDO::getId, templateId); } - if (isSuperAdmin) { - wrapper.eq(ReportTemplateDO::getType, ReportTemplateTypeEnum.SYSTEM); - } if (templateMapper.exists(wrapper)) { throw new ServiceException(TEMPLATE_NAME_UNIQE_ERROR, name); } } @Override - public ReportTemplateDO getReportTemplate(Long id) { - // 校验模板 - return validateTemplateExists(id); - } + public ReportDefinitionWrapper getReportTemplateDefinition(Long id, Long targetOrganId) { + Long loginOrganId = SecurityFrameworkUtils.getUserOrganId(); + Long organId = ObjectUtil.defaultIfNull(targetOrganId, loginOrganId); - @Override - public ReportDefinitionWrapper getReportTemplateDefinition(Long id) { // 校验模板 - ReportTemplateDO template = validateTemplateExists(id); + ReportTemplateDO template = validateTemplateExists(id, organId); String xmlContent = template.getContent(); InputStream is; if (StringUtils.isNotEmpty(xmlContent)) { @@ -328,7 +329,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 解析xml ReportDefinition reportDefinition = new ReportParser().parse(is, template.getName()); if (ObjectUtil.isNotNull(template)) { - queryDatasource(template, reportDefinition); + queryDatasource(template, reportDefinition, organId); } ReportDefinitionWrapper reportDefinitionWrapper = new ReportDefinitionWrapper(reportDefinition); reportDefinitionWrapper.setDatasetIds(template.getDatasetIds()); @@ -342,8 +343,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { * @param templateDO 模板 * @param reportDefinition 报表定义 */ - private void queryDatasource(ReportTemplateDO templateDO, ReportDefinition reportDefinition) { - Long organId = SecurityFrameworkUtils.getUserOrganId(); + private void queryDatasource(ReportTemplateDO templateDO, ReportDefinition reportDefinition, Long organId) { Set datasourceIds = templateDO.getDatasourceIds(); Set datasetIds = templateDO.getDatasetIds(); @@ -400,34 +400,26 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { @Override public List getReportTemplateList(ReportTemplateReqVO reqVO) { - LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); - // 当前登录人机构id - Long organId = loginUser.getOrganId(); - // 超管查看不同组织模板 - if (ObjectUtil.isNotNull(loginUser) && Boolean.TRUE.equals(loginUser.getIsSupAdmin()) && ObjectUtil.isNotNull(reqVO.getOrganId())) { - organId = reqVO.getOrganId(); + boolean isSuperAdmin = SecurityFrameworkUtils.isSuperAdmin(); + boolean manageEndPoint = SecurityFrameworkUtils.isManageEndPoint(); + Long organId = SecurityFrameworkUtils.getUserOrganId(); + Long targetOrganId = reqVO.getOrganId(); + + boolean isPublic = isSuperAdmin || manageEndPoint; + + // 管理端或者超管可以查看其他组织报表 + if (isPublic && ObjectUtil.isNotNull(targetOrganId)) { + organId = targetOrganId; } return templateMapper.selectNormalTemplateList(reqVO.getName(), organId); } - /** - * 检查查询参数不为空 - * - * @param queryMap - */ - private void checkQueryNotEmpty(Map queryMap) { - if (ObjectUtil.isNotNull(queryMap)) { - for (Map.Entry entry : queryMap.entrySet()) { - String key = entry.getKey(); - if (ObjectUtils.isEmpty(entry.getValue()) && ObjectUtil.notEqual(key, DATASETIDS_FIELD_NAME) && ObjectUtil.notEqual(key, DATASOURCEIDS_FIELD_NAME)) { - throw new ServiceException(TEMPLATE_PREIVEW_QUERYPARAM_EMPTY, key); - } - } - } - } - @Override public HtmlReport preview(ReportTemplatePreviewReqVO reqVO) { + Long targetOrganId = reqVO.getOrganId(); + if (ObjectUtil.isNull(targetOrganId)) { + targetOrganId = SecurityFrameworkUtils.getUserOrganId(); + } // 自定义请求vo转ureport对象 PreviewParameters params = BeanUtils.toBean(reqVO, PreviewParameters.class); @@ -439,9 +431,9 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 检查表单配置 checkSearchForm(reportDefinition.getSearchForm(), query); // 增加多租户参数 - tenantParamsUtils.prepareTenantParam(query); + tenantParamsUtils.prepareTenantParam(query, targetOrganId); // 匹配数据源、数据集 - queryPreviewDatasource(query, reportDefinition); + queryPreviewDatasource(query, reportDefinition, targetOrganId); Report report = reportRender.render(reportDefinition, query); return htmlProducer.produce(reportDefinition, report); @@ -453,8 +445,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { * @param query 预览参数 * @param reportDefinition 报表定义 */ - private void queryPreviewDatasource(Map query, ReportDefinition reportDefinition) { - Long organId = SecurityFrameworkUtils.getUserOrganId(); + private void queryPreviewDatasource(Map query, ReportDefinition reportDefinition, Long organId) { Object datasetIdsObj = query.get(DATASETIDS_FIELD_NAME); Object datasourceIdsObj = query.get(DATASOURCEIDS_FIELD_NAME); @@ -518,8 +509,9 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { @Override public HtmlReport commonPreview(ReportTemplateCommonPreviewReqVO reqVO) { + Long currentOrganId = SecurityFrameworkUtils.getUserOrganId(); // 查询模板 - ReportTemplateDO reportTemplateDO = validateTemplateExists(reqVO.getTemplateId()); + ReportTemplateDO reportTemplateDO = validateTemplateExists(reqVO.getTemplateId(), currentOrganId); if (ObjectUtil.isNull(reportTemplateDO)) { throw new ServiceException(TEMPLATE_NOT_EXISTS); } @@ -541,9 +533,9 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 检查表单配置 checkSearchForm(reportDefinition.getSearchForm(), query); // 增加多租户参数 - tenantParamsUtils.prepareTenantParam(query); + tenantParamsUtils.prepareTenantParam(query, currentOrganId); // 匹配数据源、数据集 - queryDatasource(reportTemplateDO, reportDefinition); + queryDatasource(reportTemplateDO, reportDefinition, currentOrganId); Report report = reportRender.render(reportDefinition, query); return htmlProducer.produce(reportDefinition, report); @@ -588,6 +580,10 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { @Override public void print(ReportTemplatePreviewReqVO reqVO, HttpServletResponse response) { + Long targetOrganId = reqVO.getOrganId(); + if (ObjectUtil.isNull(targetOrganId)) { + targetOrganId = SecurityFrameworkUtils.getUserOrganId(); + } // 自定义请求vo转ureport对象 PreviewParameters params = BeanUtils.toBean(reqVO, PreviewParameters.class); @@ -598,9 +594,9 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 检查表单配置 checkSearchForm(reportDefinition.getSearchForm(), query); // 增加多租户参数 - tenantParamsUtils.prepareTenantParam(query); + tenantParamsUtils.prepareTenantParam(query, targetOrganId); // 匹配数据源、数据集 - queryPreviewDatasource(query, reportDefinition); + queryPreviewDatasource(query, reportDefinition, targetOrganId); Report report = reportRender.render(reportDefinition, query); Map chartImages = params.getChartImages(); @@ -626,8 +622,9 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { @Override public void commonPrint(ReportTemplateCommonPreviewReqVO reqVO, HttpServletResponse response) { + Long currentOrganId = SecurityFrameworkUtils.getUserOrganId(); // 查询模板 - ReportTemplateDO reportTemplateDO = validateTemplateExists(reqVO.getTemplateId()); + ReportTemplateDO reportTemplateDO = validateTemplateExists(reqVO.getTemplateId(), currentOrganId); if (ObjectUtil.isNull(reportTemplateDO)) { throw new ServiceException(TEMPLATE_NOT_EXISTS); } @@ -647,9 +644,9 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 检查表单配置 checkSearchForm(reportDefinition.getSearchForm(), query); // 增加多租户参数 - tenantParamsUtils.prepareTenantParam(query); + tenantParamsUtils.prepareTenantParam(query, currentOrganId); // 匹配数据源、数据集 - queryDatasource(reportTemplateDO, reportDefinition); + queryDatasource(reportTemplateDO, reportDefinition, currentOrganId); Report report = reportRender.render(reportDefinition, query); Map chartImages = params.getChartImages(); @@ -675,6 +672,10 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { @Override public void download(String type, ReportTemplatePreviewReqVO reqVO, HttpServletResponse response) { + Long targetOrganId = reqVO.getOrganId(); + if (ObjectUtil.isNull(targetOrganId)) { + targetOrganId = SecurityFrameworkUtils.getUserOrganId(); + } // 自定义请求vo转ureport对象 PreviewParameters params = BeanUtils.toBean(reqVO, PreviewParameters.class); @@ -684,9 +685,9 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 检查表单配置 checkSearchForm(reportDefinition.getSearchForm(), query); // 增加多租户参数 - tenantParamsUtils.prepareTenantParam(query); + tenantParamsUtils.prepareTenantParam(query, targetOrganId); // 匹配数据源、数据集 - queryPreviewDatasource(query, reportDefinition); + queryPreviewDatasource(query, reportDefinition, targetOrganId); Report report = reportRender.render(reportDefinition, query); Map chartImages = params.getChartImages(); @@ -712,8 +713,9 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { @Override public void commonDownload(String type, ReportTemplateCommonPreviewReqVO reqVO, HttpServletResponse response) { + Long currentOrganId = SecurityFrameworkUtils.getUserOrganId(); // 查询模板 - ReportTemplateDO reportTemplateDO = validateTemplateExists(reqVO.getTemplateId()); + ReportTemplateDO reportTemplateDO = validateTemplateExists(reqVO.getTemplateId(), currentOrganId); if (ObjectUtil.isNull(reportTemplateDO)) { throw new ServiceException(TEMPLATE_NOT_EXISTS); } @@ -732,9 +734,9 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 检查表单配置 checkSearchForm(reportDefinition.getSearchForm(), query); // 增加多租户参数 - tenantParamsUtils.prepareTenantParam(query); + tenantParamsUtils.prepareTenantParam(query, currentOrganId); // 匹配数据源、数据集 - queryDatasource(reportTemplateDO, reportDefinition); + queryDatasource(reportTemplateDO, reportDefinition, currentOrganId); Report report = reportRender.render(reportDefinition, query); Map chartImages = params.getChartImages(); @@ -760,7 +762,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { @Override public void exportTemplate(Long templateId, HttpServletResponse response) { - ReportTemplateDO reportTemplateDO = validateTemplateExists(templateId); + ReportTemplateDO reportTemplateDO = validateTemplateExists(templateId, SecurityFrameworkUtils.getUserOrganId()); if (ObjectUtil.isNull(reportTemplateDO)) { throw new ServiceException(TEMPLATE_NOT_EXISTS); } @@ -792,32 +794,36 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { } @Override - public void importTemplate(String name, MultipartFile file) { + public void importTemplate(String name, Long targetOrganId, MultipartFile file) { + boolean isSuperAdmin = SecurityFrameworkUtils.isSuperAdmin(); + boolean manageEndPoint = SecurityFrameworkUtils.isManageEndPoint(); + Long loginOrganId = SecurityFrameworkUtils.getUserOrganId(); + // 超管/管理端操作的就是公共模版 + boolean isPublic = (isSuperAdmin || manageEndPoint) && ObjectUtil.isNull(targetOrganId); + + Long organId = isPublic ? loginOrganId : targetOrganId; + try { // 读取文件json String templateStr = IoUtil.read(file.getInputStream(), UTF8_CHARSET); JSONObject jsonObject = JSON.parseObject(templateStr); - boolean isSuperAdmin = SecurityFrameworkUtils.isSuperAdmin(); - ReportTemplateSaveReqVO createReqVO = new ReportTemplateSaveReqVO(); createReqVO.setName(name); // 校验模板名唯一性 - getSelf().validateTemplateNameUnique(createReqVO, isSuperAdmin); + getSelf().validateTemplateNameUnique(createReqVO, organId); // 复制信息 String content = jsonObject.getString("content"); if (StringUtils.isEmpty(content)) { throw new ServiceException(TEMPLATE_IMPORT_CONTENT_EMPTY_ERROR); } - // 生成id - createReqVO.setId((Long) snowFlakeGenerator.nextId(null)); createReqVO.setContent(content); createReqVO.setDatasetIds(jsonObject.getJSONArray(DATASETIDS_FIELD_NAME).stream().map(s -> Long.parseLong(s.toString())).collect(Collectors.toSet())); createReqVO.setDatasourceIds(jsonObject.getJSONArray(DATASOURCEIDS_FIELD_NAME).stream().map(s -> Long.parseLong(s.toString())).collect(Collectors.toSet())); // 新增模板 ReportTemplateDO template = BeanUtils.toBean(createReqVO, ReportTemplateDO.class); // 超管创建的作为内置模板 - if (isSuperAdmin) { + if (isPublic) { template.setType(ReportTemplateTypeEnum.SYSTEM); } else { template.setType(ReportTemplateTypeEnum.CUSTOM); diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/utils/TenantParamsUtils.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/utils/TenantParamsUtils.java index 670e76c16..b63b789b5 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/utils/TenantParamsUtils.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/utils/TenantParamsUtils.java @@ -55,7 +55,7 @@ public class TenantParamsUtils { if (ObjectUtil.isNotNull(datasourceDO) && ObjectUtil.equal(datasourceDO.getBuildinType(), ReportTemplateTypeEnum.SYSTEM)) { List datasetDOList = datasetMapper.selectList(new LambdaQueryWrapperX().in(ReportDatasetDO::getDatasourceId, datasourceId)); if (CollUtil.isNotEmpty(datasetDOList)) { - tenantParams.setBuildinDsNames(datasetDOList.stream().map(ReportDatasetDO::getName).collect(Collectors.toList())); + tenantParams.setBuildinDsNames(datasetDOList.stream().map(ReportDatasetDO::getName).toList()); } } // 用户组织id @@ -71,20 +71,19 @@ public class TenantParamsUtils { * * @param parameters */ - public void prepareTenantParam(Map parameters) { - Long userOrganId = SecurityFrameworkUtils.getUserOrganId(); + public void prepareTenantParam(Map parameters, Long organId) { // 根据前端传递的数据集id,判断是不是内置数据源下的,是就把name传给ureport List datasetIds = (List) parameters.get("datasetIds"); if (CollUtil.isNotEmpty(datasetIds)) { // 内置数据集名称列表 List buildinDsNames = new ArrayList<>(); // 遍历获取所有上级数据源 - List reportDatasetDOS = datasetMapper.selectNormalDatasetList(datasetIds.stream().collect(Collectors.toSet()), userOrganId); + List reportDatasetDOS = datasetMapper.selectNormalDatasetList(datasetIds.stream().collect(Collectors.toSet()), organId); for (ReportDatasetDO datasetDO : reportDatasetDOS) { Long datasourceId = datasetDO.getDatasourceId(); // 查询数据源,如果是内置数据源则把数据集的name传给ureport // 机构下 + 内置数据源查询 - ReportDatasourceDO datasourceDO = datasourceMapper.selectNormalDatasourceById(datasourceId, userOrganId); + ReportDatasourceDO datasourceDO = datasourceMapper.selectNormalDatasourceById(datasourceId, organId); if (ObjectUtil.isNotNull(datasourceDO) && ObjectUtil.equal(datasourceDO.getBuildinType(), ReportTemplateTypeEnum.SYSTEM)) { buildinDsNames.add(datasetDO.getName()); } @@ -96,7 +95,7 @@ public class TenantParamsUtils { // imes多租户业务表表名列表 parameters.put("tenantTableNames", cfReportProperties.getTenantTableNames()); // 用户组织id - parameters.put("organId", userOrganId); + parameters.put("organId", organId); } }