报表基础模块:1、模板获取、预览接口完善;2、增加ureport需要的第三方包及版本规范;

This commit is contained in:
gaoqr
2024-07-19 11:09:09 +08:00
parent e7447c4a8c
commit 7dddbd95e6
10 changed files with 242 additions and 5 deletions
@@ -110,6 +110,26 @@
<scope>system</scope> <scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar</systemPath> <systemPath>${project.basedir}/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar</systemPath>
</dependency> </dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>${dom4j.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>org.antlr</groupId>
<artifactId>antlr4-runtime</artifactId>
<version>${antlr4.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>${commons-text.version}</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
<!-- 设置构建的 jar 包名 --> <!-- 设置构建的 jar 包名 -->
@@ -29,6 +29,9 @@ public class ReportDatasetRespVO {
@Schema(description = "动态查询SQL") @Schema(description = "动态查询SQL")
private String sql; private String sql;
@Schema(description = "bean数据源方法名")
private String method;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime; private LocalDateTime createTime;
@@ -1,11 +1,13 @@
package com.cf.imes.module.report.controller.admin.template; 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.pojo.CommonResult;
import com.cf.imes.framework.common.util.object.BeanUtils; 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.ReportTemplateReqVO;
import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateRespVO; 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.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 com.cf.imes.module.report.service.template.ReportTemplateService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
@@ -63,9 +65,8 @@ public class ReportTemplateController {
@Operation(summary = "获得报表模板信息") @Operation(summary = "获得报表模板信息")
@Parameter(name = "id", description = "编号", required = true, example = "1") @Parameter(name = "id", description = "编号", required = true, example = "1")
@PreAuthorize("@ss.hasPermission('report:template:query')") @PreAuthorize("@ss.hasPermission('report:template:query')")
public CommonResult<ReportTemplateRespVO> getReportTemplate(@PathVariable("id") Long id) { public CommonResult<ReportDefinitionWrapper> getReportTemplate(@PathVariable("id") Long id) {
ReportTemplateDO template = templateService.getReportTemplate(id); return success(templateService.getReportTemplateDefinition(id));
return success(BeanUtils.toBean(template, ReportTemplateRespVO.class));
} }
@GetMapping("/templates") @GetMapping("/templates")
@@ -75,4 +76,11 @@ public class ReportTemplateController {
ReportTemplateReqVO reqVO = new ReportTemplateReqVO(name, null); ReportTemplateReqVO reqVO = new ReportTemplateReqVO(name, null);
return success(BeanUtils.toBean(templateService.getReportTemplateList(reqVO), ReportTemplateRespVO.class)); return success(BeanUtils.toBean(templateService.getReportTemplateList(reqVO), ReportTemplateRespVO.class));
} }
@PostMapping("/template/preview")
@Operation(summary = "模板预览")
@PreAuthorize("@ss.hasPermission('report:template:query')")
public CommonResult<HtmlReport> preview(@Valid @RequestBody ReportTemplatePreviewPageParametersVO pageParametersVO) {
return success(templateService.preview(pageParametersVO));
}
} }
@@ -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;
}
@@ -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<String, Object> query = new HashMap<>();
/**
* 表单对应组件唯一标识
*/
@Schema(description = "表单对应组件唯一标识")
private Map<String, String> component = new HashMap<>();
/**
* 图表图片目前用于PDF导出
*/
@Schema(description = "图表图片目前用于PDF导出")
private Map<String, String> chartImages = new HashMap<>();
}
@@ -46,6 +46,11 @@ public class ReportDatasetDO extends BaseDO {
* 数据源id * 数据源id
*/ */
private Long datasourceId; private Long datasourceId;
/**
* bean数据源方法名
*/
private String method;
/** /**
* 动态查询SQL * 动态查询SQL
*/ */
@@ -1,5 +1,8 @@
package com.cf.imes.module.report.service.template; 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.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.template.ReportTemplateDO; import com.cf.imes.module.report.dal.dataobject.template.ReportTemplateDO;
@@ -37,13 +40,21 @@ public interface ReportTemplateService {
void deleteReportTemplate(Long id); void deleteReportTemplate(Long id);
/** /**
* 获报表模板信息 * 获报表模板信息
* *
* @param id 编号 * @param id 编号
* @return 报表模板信息 * @return 报表模板信息
*/ */
ReportTemplateDO getReportTemplate(Long id); ReportTemplateDO getReportTemplate(Long id);
/**
* 获取模板定义信息(xml+数据源)
*
* @param id
* @return
*/
ReportDefinitionWrapper getReportTemplateDefinition(Long id);
/** /**
* 获得报表模板信息列表 * 获得报表模板信息列表
* *
@@ -51,4 +62,12 @@ public interface ReportTemplateService {
* @return 报表模板信息列表 * @return 报表模板信息列表
*/ */
List<ReportTemplateDO> getReportTemplateList(ReportTemplateReqVO pageReqVO); List<ReportTemplateDO> getReportTemplateList(ReportTemplateReqVO pageReqVO);
/**
* 模板预览
*
* @param pageParametersVO
* @return
*/
HtmlReport preview(ReportTemplatePreviewPageParametersVO pageParametersVO);
} }
@@ -1,14 +1,36 @@
package com.cf.imes.module.report.service.template; package com.cf.imes.module.report.service.template;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.URLUtil; 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.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.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.ReportDatasourceReqVO; 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.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.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;
@@ -24,8 +46,11 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -160,6 +185,43 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
return template; 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<DatasourceDefinition> datasourceDefinitions = new ArrayList<>();
if (ObjectUtil.isNotNull(template)) {
// 查询数据源
List<ReportDatasourceDO> datasourceList = datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(template.getId()).build());
for (ReportDatasourceDO ds : datasourceList) {
// 查询数据集
List<ReportDatasetDO> datasetList = datasetService.getDatasetList(ReportDatasetReqVO.builder().datasourceId(ds.getId()).build());
List<DatasetDefinition> 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 @Override
public List<ReportTemplateDO> getReportTemplateList(ReportTemplateReqVO reqVO) { public List<ReportTemplateDO> getReportTemplateList(ReportTemplateReqVO reqVO) {
return templateMapper.selectList(new LambdaQueryWrapperX<ReportTemplateDO>() return templateMapper.selectList(new LambdaQueryWrapperX<ReportTemplateDO>()
@@ -169,4 +231,51 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
// 不返回content xml,点击具体的模板中返回xml // 不返回content xml,点击具体的模板中返回xml
.select(ReportTemplateDO::getId, ReportTemplateDO::getName, ReportTemplateDO::getCreateTime, ReportTemplateDO::getRemark)); .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<String, Object> 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<Page> 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;
}
} }
+7
View File
@@ -20,4 +20,11 @@
report 模块,主要实现数据可视化报表等功能。 report 模块,主要实现数据可视化报表等功能。
</description> </description>
<properties>
<dom4j.version>1.6.1</dom4j.version>
<commons-io.version>2.11.0</commons-io.version>
<antlr4.version>4.5.3</antlr4.version>
<commons-text.version>1.10.0</commons-text.version>
</properties>
</project> </project>