diff --git a/cf-module-report/cf-module-report-biz/pom.xml b/cf-module-report/cf-module-report-biz/pom.xml index eef2d3137..84ad88f49 100644 --- a/cf-module-report/cf-module-report-biz/pom.xml +++ b/cf-module-report/cf-module-report-biz/pom.xml @@ -110,6 +110,26 @@ system ${project.basedir}/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar + + dom4j + dom4j + ${dom4j.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.antlr + antlr4-runtime + ${antlr4.version} + + + org.apache.commons + commons-text + ${commons-text.version} + diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetRespVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetRespVO.java index dc88d8a7a..c837beb69 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetRespVO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/vo/ReportDatasetRespVO.java @@ -29,6 +29,9 @@ public class ReportDatasetRespVO { @Schema(description = "动态查询SQL") private String sql; + @Schema(description = "bean数据源方法名") + private String method; + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; 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 3c458a2ee..209a0cd3c 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 @@ -1,11 +1,13 @@ package com.cf.imes.module.report.controller.admin.template; +import com.bstek.designer.bean.ReportDefinitionWrapper; +import com.bstek.ureport.export.html.HtmlReport; import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.util.object.BeanUtils; +import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplatePreviewPageParametersVO; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateReqVO; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateRespVO; import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateSaveReqVO; -import com.cf.imes.module.report.dal.dataobject.template.ReportTemplateDO; import com.cf.imes.module.report.service.template.ReportTemplateService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -63,9 +65,8 @@ public class ReportTemplateController { @Operation(summary = "获得报表模板信息") @Parameter(name = "id", description = "编号", required = true, example = "1") @PreAuthorize("@ss.hasPermission('report:template:query')") - public CommonResult getReportTemplate(@PathVariable("id") Long id) { - ReportTemplateDO template = templateService.getReportTemplate(id); - return success(BeanUtils.toBean(template, ReportTemplateRespVO.class)); + public CommonResult getReportTemplate(@PathVariable("id") Long id) { + return success(templateService.getReportTemplateDefinition(id)); } @GetMapping("/templates") @@ -75,4 +76,11 @@ public class ReportTemplateController { ReportTemplateReqVO reqVO = new ReportTemplateReqVO(name, null); return success(BeanUtils.toBean(templateService.getReportTemplateList(reqVO), ReportTemplateRespVO.class)); } + + @PostMapping("/template/preview") + @Operation(summary = "模板预览") + @PreAuthorize("@ss.hasPermission('report:template:query')") + public CommonResult preview(@Valid @RequestBody ReportTemplatePreviewPageParametersVO pageParametersVO) { + return success(templateService.preview(pageParametersVO)); + } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplatePreviewPageParametersVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplatePreviewPageParametersVO.java new file mode 100644 index 000000000..8875547af --- /dev/null +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplatePreviewPageParametersVO.java @@ -0,0 +1,18 @@ +package com.cf.imes.module.report.controller.admin.template.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author Gqr + * @since 2024/7/19 9:22 + */ +@Data +@Schema(description = "管理后台 - 报表模板预览分页参数 Request VO") +public class ReportTemplatePreviewPageParametersVO { + @Schema(description = "页码",example = "1") + private int pageIndex; + + @Schema(description = "预览参数") + private ReportTemplatePreviewParametersVO params; +} \ 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/ReportTemplatePreviewParametersVO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplatePreviewParametersVO.java new file mode 100644 index 000000000..429024e9e --- /dev/null +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/vo/ReportTemplatePreviewParametersVO.java @@ -0,0 +1,48 @@ +package com.cf.imes.module.report.controller.admin.template.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.HashMap; +import java.util.Map; + +/** + * @author Gqr + * @since 2024/7/19 9:22 + */ +@Schema(description = "管理后台 - 报表模板预览参数 Request VO") +@Data +public class ReportTemplatePreviewParametersVO { + /** + * 报表内容 + */ + @Schema(description = "报表内容") + @NotNull(message = "预览报表内容不能为空") + private String content; + + /** + * 报表名称 + */ + @Schema(description = "报表名称") + private String reportName; + + /** + * 表单参数 + */ + @Schema(description = "表单参数") + private Map query = new HashMap<>(); + + /** + * 表单对应组件唯一标识 + */ + @Schema(description = "表单对应组件唯一标识") + private Map component = new HashMap<>(); + + /** + * 图表图片目前用于PDF导出 + */ + @Schema(description = "图表图片目前用于PDF导出") + private Map chartImages = new HashMap<>(); + +} diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/dataset/ReportDatasetDO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/dataset/ReportDatasetDO.java index d998f5446..3f1cade56 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/dataset/ReportDatasetDO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/dataset/ReportDatasetDO.java @@ -46,6 +46,11 @@ public class ReportDatasetDO extends BaseDO { * 数据源id */ private Long datasourceId; + + /** + * bean数据源方法名 + */ + private String method; /** * 动态查询SQL */ 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 232057d53..dbf45136f 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 @@ -1,5 +1,8 @@ package com.cf.imes.module.report.service.template; +import com.bstek.designer.bean.ReportDefinitionWrapper; +import com.bstek.ureport.export.html.HtmlReport; +import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplatePreviewPageParametersVO; 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.template.ReportTemplateDO; @@ -37,13 +40,21 @@ public interface ReportTemplateService { void deleteReportTemplate(Long id); /** - * 获得报表模板信息 + * 获取报表模板信息 * * @param id 编号 * @return 报表模板信息 */ ReportTemplateDO getReportTemplate(Long id); + /** + * 获取模板定义信息(xml+数据源) + * + * @param id + * @return + */ + ReportDefinitionWrapper getReportTemplateDefinition(Long id); + /** * 获得报表模板信息列表 * @@ -51,4 +62,12 @@ public interface ReportTemplateService { * @return 报表模板信息列表 */ List getReportTemplateList(ReportTemplateReqVO pageReqVO); + + /** + * 模板预览 + * + * @param pageParametersVO + * @return + */ + HtmlReport preview(ReportTemplatePreviewPageParametersVO pageParametersVO); } 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 bbe73c9fe..c696a9e4f 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 @@ -1,14 +1,36 @@ package com.cf.imes.module.report.service.template; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.URLUtil; +import com.bstek.designer.bean.PreviewPageParameters; +import com.bstek.designer.bean.PreviewParameters; +import com.bstek.designer.bean.ReportDefinitionWrapper; +import com.bstek.ureport.build.paging.Page; +import com.bstek.ureport.definition.Paper; +import com.bstek.ureport.definition.ReportDefinition; +import com.bstek.ureport.definition.dataset.BeanDatasetDefinition; +import com.bstek.ureport.definition.dataset.DatasetDefinition; +import com.bstek.ureport.definition.dataset.SqlDatasetDefinition; +import com.bstek.ureport.definition.datasource.DatasourceDefinition; +import com.bstek.ureport.definition.datasource.JdbcDatasourceDefinition; +import com.bstek.ureport.definition.datasource.SpringBeanDatasourceDefinition; +import com.bstek.ureport.export.PageBuilder; +import com.bstek.ureport.export.ReportRender; +import com.bstek.ureport.export.SinglePageData; +import com.bstek.ureport.export.html.HtmlProducer; +import com.bstek.ureport.export.html.HtmlReport; +import com.bstek.ureport.export.html.SearchFormData; +import com.bstek.ureport.model.Report; +import com.bstek.ureport.parser.ReportParser; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; 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.ReportTemplatePreviewPageParametersVO; 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; @@ -24,8 +46,11 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.io.ByteArrayInputStream; + import java.util.ArrayList; import java.util.List; +import java.util.Map; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -160,6 +185,43 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { return template; } + @Override + public ReportDefinitionWrapper getReportTemplateDefinition(Long id) { + // 查询模板 + ReportTemplateDO template = templateMapper.selectById(id); + String xmlContent = template.getContent(); + // 解析xml + ReportDefinition reportDefinition = new ReportParser().parse(new ByteArrayInputStream(xmlContent.getBytes()), template.getName()); + List datasourceDefinitions = new ArrayList<>(); + if (ObjectUtil.isNotNull(template)) { + // 查询数据源 + List datasourceList = datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(template.getId()).build()); + for (ReportDatasourceDO ds : datasourceList) { + // 查询数据集 + List datasetList = datasetService.getDatasetList(ReportDatasetReqVO.builder().datasourceId(ds.getId()).build()); + List datasetDefinitions = new ArrayList<>(); + switch (ds.getType()) { + case JDBC, BUILDIN -> { + // 转换对应的ureport对象 + JdbcDatasourceDefinition jdbcDatasourceDefinition = BeanUtils.toBean(ds, JdbcDatasourceDefinition.class); + datasetDefinitions.addAll(BeanUtils.toBean(datasetList, SqlDatasetDefinition.class)); + jdbcDatasourceDefinition.setDatasets(datasetDefinitions); + datasourceDefinitions.add(jdbcDatasourceDefinition); + } + case SPRING -> { + // 转换对应的ureport对象 + SpringBeanDatasourceDefinition springBeanDatasourceDefinition = BeanUtils.toBean(ds, SpringBeanDatasourceDefinition.class); + datasetDefinitions.addAll(BeanUtils.toBean(datasetList, BeanDatasetDefinition.class)); + springBeanDatasourceDefinition.setDatasets(datasetDefinitions); + datasourceDefinitions.add(springBeanDatasourceDefinition); + } + } + } + } + reportDefinition.setDatasources(datasourceDefinitions); + return new ReportDefinitionWrapper(reportDefinition); + } + @Override public List getReportTemplateList(ReportTemplateReqVO reqVO) { return templateMapper.selectList(new LambdaQueryWrapperX() @@ -169,4 +231,51 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 不返回content xml,点击具体的模板中返回xml .select(ReportTemplateDO::getId, ReportTemplateDO::getName, ReportTemplateDO::getCreateTime, ReportTemplateDO::getRemark)); } + + @Override + public HtmlReport preview(ReportTemplatePreviewPageParametersVO pageParametersVO) { + HtmlProducer htmlProducer = new HtmlProducer(); + ReportRender reportRender = new ReportRender(); + HtmlReport htmlReport = new HtmlReport(); + + // 转换ureport参数 + PreviewPageParameters pageParameters = BeanUtils.toBean(pageParametersVO,PreviewPageParameters.class); + PreviewParameters params = pageParameters.getParams(); + + // 解析xml + ReportDefinition reportDefinition = reportRender.getReportDefinition(URLUtil.decode(params.getContent()), CharsetUtil.UTF_8); + + Map parameters = params.getQuery(); + + Paper paper = reportDefinition.getPaper(); + Report report; + String html; + // 构建html + if (paper.isPageEnabled()) { + // todo 后续有可能做成缓存 + report = reportRender.render(reportDefinition, parameters); + int pageIndex = pageParameters.getPageIndex(); + SinglePageData pageData = PageBuilder.buildSinglePageData(pageIndex, report); + List pages = pageData.getPages(); + html = htmlProducer.produce(report.getContext(), pages, pageData.getColumnMargin(), false); + htmlReport.setTotalPage(pageData.getTotalPages()); + htmlReport.setPageIndex(pageIndex); + if (reportDefinition.getPaper().isColumnEnabled()) { + htmlReport.setColumn(reportDefinition.getPaper().getColumnCount()); + } + } else { + report = reportRender.render(reportDefinition, parameters); + html = htmlProducer.produce(report); + } + htmlReport.setChartDatas(report.getContext().getChartDataMap().values()); + htmlReport.setContent(html); + htmlReport.setStyle(reportDefinition.getStyle()); + SearchFormData searchFormData = reportDefinition.buildSearchFormData(report.getContext().getDatasetMap(),parameters); + htmlReport.setSearchFormData(searchFormData); + htmlReport.setReportAlign(report.getPaper().getHtmlReportAlign().name()); + htmlReport.setBgImage(report.getPaper().getBgImage()); + htmlReport.setFreeze(reportDefinition.getFreeze()); + htmlReport.setFloatImages(reportDefinition.getFloatImages()); + return htmlReport; + } } diff --git a/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar b/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar index 89e49ecad..7f66b483d 100644 Binary files a/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar and b/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar differ diff --git a/cf-module-report/pom.xml b/cf-module-report/pom.xml index 75c3faf31..24f2451e9 100644 --- a/cf-module-report/pom.xml +++ b/cf-module-report/pom.xml @@ -20,4 +20,11 @@ report 模块,主要实现数据可视化报表等功能。 + + + 1.6.1 + 2.11.0 + 4.5.3 + 1.10.0 +