报表基础模块:新增通用预览打印、下载接口

This commit is contained in:
gaoqr
2025-02-14 12:07:42 +08:00
parent 6a32460910
commit 39cb17a1a2
3 changed files with 157 additions and 15 deletions
@@ -128,6 +128,13 @@ public class ReportTemplateController {
templateService.print(reqVO, response); templateService.print(reqVO, response);
} }
@PostMapping("/template/print/common")
@Operation(summary = "模板预览打印")
@PreAuthorize("@ss.hasPermission('report:preview')")
public void commonPrint(@RequestBody ReportTemplateCommonPreviewReqVO reqVO, HttpServletResponse response) {
templateService.commonPrint(reqVO, response);
}
@PostMapping("/template/download/{type}") @PostMapping("/template/download/{type}")
@Operation(summary = "模板预览下载") @Operation(summary = "模板预览下载")
@PreAuthorize("@ss.hasPermission('report:preview')") @PreAuthorize("@ss.hasPermission('report:preview')")
@@ -135,6 +142,13 @@ public class ReportTemplateController {
templateService.download(type, reqVO, response); templateService.download(type, reqVO, response);
} }
@PostMapping("/template/download/{type}/common")
@Operation(summary = "模板预览下载")
@PreAuthorize("@ss.hasPermission('report:preview')")
public void commonPrint(@PathVariable @ReportTemplateProducerTypeInEnum @NotBlank(message = "模板下载类型不能为空") String type, @RequestBody ReportTemplatePreviewReqVO reqVO, HttpServletResponse response) {
templateService.download(type, reqVO, response);
}
@PostMapping("/template/excel/import") @PostMapping("/template/excel/import")
@Operation(summary = "导入excel模板") @Operation(summary = "导入excel模板")
@PreAuthorize("@ss.hasPermission('report:design')") @PreAuthorize("@ss.hasPermission('report:design')")
@@ -98,6 +98,12 @@ public interface ReportTemplateService {
*/ */
void print(ReportTemplatePreviewReqVO reqVO, HttpServletResponse response); void print(ReportTemplatePreviewReqVO reqVO, HttpServletResponse response);
/**
* 模版通用预览打印
* 通过模板id+query参数获取打印内容
*/
void commonPrint(ReportTemplateCommonPreviewReqVO reqVO, HttpServletResponse response);
/** /**
* 模版预览下载 * 模版预览下载
* *
@@ -107,6 +113,16 @@ public interface ReportTemplateService {
*/ */
void download(String type, ReportTemplatePreviewReqVO reqVO, HttpServletResponse response); void download(String type, ReportTemplatePreviewReqVO reqVO, HttpServletResponse response);
/**
* 模版通用预览下载
* 通过模板id+query参数获取文件
*
* @param type 文件类型
* @param reqVO
* @param response
*/
void commonDownload(String type, ReportTemplateCommonPreviewReqVO reqVO, HttpServletResponse response);
/** /**
* 模板导出 * 模板导出
* *
@@ -28,6 +28,7 @@ import com.bstek.ureport.definition.datasource.SpringBeanDatasourceDefinition;
import com.bstek.ureport.definition.searchform.Component; import com.bstek.ureport.definition.searchform.Component;
import com.bstek.ureport.definition.searchform.InputComponent; import com.bstek.ureport.definition.searchform.InputComponent;
import com.bstek.ureport.definition.searchform.SearchForm; import com.bstek.ureport.definition.searchform.SearchForm;
import com.bstek.ureport.definition.searchform.TextInputComponent;
import com.bstek.ureport.exception.ReportComputeException; import com.bstek.ureport.exception.ReportComputeException;
import com.bstek.ureport.exception.ReportException; import com.bstek.ureport.exception.ReportException;
import com.bstek.ureport.export.ExportUtils; import com.bstek.ureport.export.ExportUtils;
@@ -119,6 +120,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
private static final String ATTACHMENT_PREFIX = "attachment; filename="; private static final String ATTACHMENT_PREFIX = "attachment; filename=";
private static final String DATASETIDS_FIELD_NAME = "datasetIds"; private static final String DATASETIDS_FIELD_NAME = "datasetIds";
private static final String DATASOURCEIDS_FIELD_NAME = "datasourceIds"; private static final String DATASOURCEIDS_FIELD_NAME = "datasourceIds";
private static final String DOWNLOAD_SUCCESS_HEADER_CODE = "20000";
@Resource @Resource
private TenantParamsUtils tenantParamsUtils; private TenantParamsUtils tenantParamsUtils;
@@ -423,8 +425,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
@Override @Override
public HtmlReport preview(ReportTemplatePreviewReqVO reqVO) { public HtmlReport preview(ReportTemplatePreviewReqVO reqVO) {
// 检查查询参数中的空值
checkQueryNotEmpty(reqVO.getQuery());
// 自定义请求vo转ureport对象 // 自定义请求vo转ureport对象
PreviewParameters params = BeanUtils.toBean(reqVO, PreviewParameters.class); PreviewParameters params = BeanUtils.toBean(reqVO, PreviewParameters.class);
@@ -432,10 +432,12 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
ReportRender reportRender = new ReportRender(); ReportRender reportRender = new ReportRender();
ReportDefinition reportDefinition = getReportDefinition(reportRender, params, true); ReportDefinition reportDefinition = getReportDefinition(reportRender, params, true);
Map<String, Object> query = params.getQuery();
// 检查表单配置
checkSearchForm(reportDefinition.getSearchForm(), query);
// 增加多租户参数 // 增加多租户参数
Map<String, Object> parameters = params.getQuery(); tenantParamsUtils.prepareTenantParam(query);
tenantParamsUtils.prepareTenantParam(parameters); Report report = reportRender.render(reportDefinition, query);
Report report = reportRender.render(reportDefinition, parameters);
return htmlProducer.produce(reportDefinition, report); return htmlProducer.produce(reportDefinition, report);
} }
@@ -460,13 +462,13 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
ReportRender reportRender = new ReportRender(); ReportRender reportRender = new ReportRender();
ReportDefinition reportDefinition = getReportDefinition(reportRender, params, false); ReportDefinition reportDefinition = getReportDefinition(reportRender, params, false);
Map<String, Object> parameters = params.getQuery(); Map<String, Object> query = params.getQuery();
// 检查表单配置 // 检查表单配置
checkSearchForm(reportDefinition.getSearchForm(), parameters); checkSearchForm(reportDefinition.getSearchForm(), query);
// 增加多租户参数 // 增加多租户参数
tenantParamsUtils.prepareTenantParam(parameters); tenantParamsUtils.prepareTenantParam(query);
Report report = reportRender.render(reportDefinition, parameters); Report report = reportRender.render(reportDefinition, query);
return htmlProducer.produce(reportDefinition, report); return htmlProducer.produce(reportDefinition, report);
} }
@@ -480,10 +482,25 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
if (ObjectUtil.isNotNull(searchForm)) { if (ObjectUtil.isNotNull(searchForm)) {
List<Component> components = Optional.ofNullable(searchForm.getComponents()).orElse(new ArrayList<>()); List<Component> components = Optional.ofNullable(searchForm.getComponents()).orElse(new ArrayList<>());
for (Component component : components) { for (Component component : components) {
checkComponent(component, parameters);
}
}
}
/**
* 检查表单中的组件明细
*
* @param component
* @param parameters
*/
private void checkComponent(Component component, Map<String, Object> parameters) {
InputComponent inputComponent = (InputComponent) component; InputComponent inputComponent = (InputComponent) component;
if (ObjectUtil.isNotNull(inputComponent)) { if (ObjectUtil.isNotNull(inputComponent)) {
String bindParameter = inputComponent.getBindParameter(); String bindParameter = inputComponent.getBindParameter();
if (StringUtils.isNotEmpty(bindParameter) && !parameters.containsKey(bindParameter)) { if (StringUtils.isNotEmpty(bindParameter)) {
if (inputComponent instanceof TextInputComponent) {
Object bindValue = parameters.get(bindParameter);
if (parameters.containsKey(bindParameter) && ObjectUtil.isNotNull(bindValue) && StringUtils.isEmpty(String.valueOf(bindValue))) {
throw ServiceExceptionUtil.exception(TEMPLATE_PREIVEW_QUERYPARAM_EMPTY, bindParameter); throw ServiceExceptionUtil.exception(TEMPLATE_PREIVEW_QUERYPARAM_EMPTY, bindParameter);
} }
} }
@@ -501,6 +518,8 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
ReportRender reportRender = new ReportRender(); ReportRender reportRender = new ReportRender();
ReportDefinition reportDefinition = getReportDefinition(reportRender, params, true); ReportDefinition reportDefinition = getReportDefinition(reportRender, params, true);
Map<String, Object> query = params.getQuery(); Map<String, Object> query = params.getQuery();
// 检查表单配置
checkSearchForm(reportDefinition.getSearchForm(), query);
// 增加多租户参数 // 增加多租户参数
tenantParamsUtils.prepareTenantParam(query); tenantParamsUtils.prepareTenantParam(query);
Report report = reportRender.render(reportDefinition, query); Report report = reportRender.render(reportDefinition, query);
@@ -515,7 +534,53 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
String downFileName = com.bstek.common.utils.StringUtils.randomFileName() + com.bstek.common.utils.StringUtils.getFileSuffix(p); String downFileName = com.bstek.common.utils.StringUtils.randomFileName() + com.bstek.common.utils.StringUtils.getFileSuffix(p);
response.setHeader(Header.CONTENT_DISPOSITION.getValue(), ATTACHMENT_PREFIX + URLEncoder.encode(downFileName, UTF8_CHARSET)); response.setHeader(Header.CONTENT_DISPOSITION.getValue(), ATTACHMENT_PREFIX + URLEncoder.encode(downFileName, UTF8_CHARSET));
response.setHeader("code", "20000"); response.setHeader("code", DOWNLOAD_SUCCESS_HEADER_CODE);
ExportUtils.export(out, report, p);
long end = System.currentTimeMillis();
ToolUtils.logToConsole("获取打印文件耗时:" + (end - start) + "ms");
} catch (Exception ex) {
log.error("模版预览打印异常", ex);
throw new ReportException(ex);
}
}
@Override
public void commonPrint(ReportTemplateCommonPreviewReqVO reqVO, HttpServletResponse response) {
// 查询模板
ReportTemplateDO reportTemplateDO = templateMapper.selectById(reqVO.getTemplateId());
if (ObjectUtil.isNull(reportTemplateDO)) {
throw exception(TEMPLATE_NOT_EXISTS);
}
// 检查模板内容
String content = reportTemplateDO.getContent();
if (StringUtils.isEmpty(content)) {
throw exception(TEMPLATE_PREVIEW_TEMPLATE_CONTENT_EMPTY_ERROR);
}
// 自定义请求vo转ureport对象
PreviewParameters params = BeanUtils.toBean(reqVO, PreviewParameters.class);
params.setContent(content);
long start = System.currentTimeMillis();
ReportRender reportRender = new ReportRender();
ReportDefinition reportDefinition = getReportDefinition(reportRender, params, false);
Map<String, Object> query = params.getQuery();
// 检查表单配置
checkSearchForm(reportDefinition.getSearchForm(), query);
// 增加多租户参数
tenantParamsUtils.prepareTenantParam(query);
Report report = reportRender.render(reportDefinition, query);
Map<String, String> chartImages = params.getChartImages();
report.setChartImages(chartImages);
try {
OutputStream out = response.getOutputStream();
response.setCharacterEncoding(UTF8_CHARSET);
response.setContentType("application/pdf; charset=UTF-8");
// 创建下载文件
ProducerEnum p = ProducerEnum.PDF;
String downFileName = com.bstek.common.utils.StringUtils.randomFileName() + com.bstek.common.utils.StringUtils.getFileSuffix(p);
response.setHeader(Header.CONTENT_DISPOSITION.getValue(), ATTACHMENT_PREFIX + URLEncoder.encode(downFileName, UTF8_CHARSET));
response.setHeader("code", DOWNLOAD_SUCCESS_HEADER_CODE);
ExportUtils.export(out, report, p); ExportUtils.export(out, report, p);
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
ToolUtils.logToConsole("获取打印文件耗时:" + (end - start) + "ms"); ToolUtils.logToConsole("获取打印文件耗时:" + (end - start) + "ms");
@@ -533,6 +598,8 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
ReportRender reportRender = new ReportRender(); ReportRender reportRender = new ReportRender();
ReportDefinition reportDefinition = getReportDefinition(reportRender, params, true); ReportDefinition reportDefinition = getReportDefinition(reportRender, params, true);
Map<String, Object> query = params.getQuery(); Map<String, Object> query = params.getQuery();
// 检查表单配置
checkSearchForm(reportDefinition.getSearchForm(), query);
// 增加多租户参数 // 增加多租户参数
tenantParamsUtils.prepareTenantParam(query); tenantParamsUtils.prepareTenantParam(query);
Report report = reportRender.render(reportDefinition, query); Report report = reportRender.render(reportDefinition, query);
@@ -546,7 +613,52 @@ public class ReportTemplateServiceImpl implements ReportTemplateService {
ProducerEnum p = ProducerEnum.valueOf(type.toUpperCase()); ProducerEnum p = ProducerEnum.valueOf(type.toUpperCase());
String downFileName = com.bstek.common.utils.StringUtils.randomFileName() + com.bstek.common.utils.StringUtils.getFileSuffix(p); String downFileName = com.bstek.common.utils.StringUtils.randomFileName() + com.bstek.common.utils.StringUtils.getFileSuffix(p);
response.setHeader(Header.CONTENT_DISPOSITION.getValue(), ATTACHMENT_PREFIX + URLEncoder.encode(downFileName, UTF8_CHARSET)); response.setHeader(Header.CONTENT_DISPOSITION.getValue(), ATTACHMENT_PREFIX + URLEncoder.encode(downFileName, UTF8_CHARSET));
response.setHeader("code", "20000"); response.setHeader("code", DOWNLOAD_SUCCESS_HEADER_CODE);
long start = System.currentTimeMillis();
ExportUtils.export(out, report, p);
long end = System.currentTimeMillis();
ToolUtils.logToConsole("下载 " + type + " 报表耗时:" + (end - start) + "ms");
} catch (Exception ex) {
log.error("模版预览下载文件异常", ex);
throw new ReportException(ex);
}
}
@Override
public void commonDownload(String type, ReportTemplateCommonPreviewReqVO reqVO, HttpServletResponse response) {
// 查询模板
ReportTemplateDO reportTemplateDO = templateMapper.selectById(reqVO.getTemplateId());
if (ObjectUtil.isNull(reportTemplateDO)) {
throw exception(TEMPLATE_NOT_EXISTS);
}
// 检查模板内容
String content = reportTemplateDO.getContent();
if (StringUtils.isEmpty(content)) {
throw exception(TEMPLATE_PREVIEW_TEMPLATE_CONTENT_EMPTY_ERROR);
}
// 自定义请求vo转ureport对象
PreviewParameters params = BeanUtils.toBean(reqVO, PreviewParameters.class);
params.setContent(content);
ReportRender reportRender = new ReportRender();
ReportDefinition reportDefinition = getReportDefinition(reportRender, params, true);
Map<String, Object> query = params.getQuery();
// 检查表单配置
checkSearchForm(reportDefinition.getSearchForm(), query);
// 增加多租户参数
tenantParamsUtils.prepareTenantParam(query);
Report report = reportRender.render(reportDefinition, query);
Map<String, String> chartImages = params.getChartImages();
report.setChartImages(chartImages);
try {
OutputStream out = response.getOutputStream();
response.setCharacterEncoding(UTF8_CHARSET);
response.setContentType("application/octet-stream; charset=UTF-8");
// 创建下载文件
ProducerEnum p = ProducerEnum.valueOf(type.toUpperCase());
String downFileName = com.bstek.common.utils.StringUtils.randomFileName() + com.bstek.common.utils.StringUtils.getFileSuffix(p);
response.setHeader(Header.CONTENT_DISPOSITION.getValue(), ATTACHMENT_PREFIX + URLEncoder.encode(downFileName, UTF8_CHARSET));
response.setHeader("code", DOWNLOAD_SUCCESS_HEADER_CODE);
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
ExportUtils.export(out, report, p); ExportUtils.export(out, report, p);
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();