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 38b74102a..d93a59fb3 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 @@ -128,6 +128,13 @@ public class ReportTemplateController { 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}") @Operation(summary = "模板预览下载") @PreAuthorize("@ss.hasPermission('report:preview')") @@ -135,6 +142,13 @@ public class ReportTemplateController { 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") @Operation(summary = "导入excel模板") @PreAuthorize("@ss.hasPermission('report:design')") 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 6630644ef..2fe7aaf81 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 @@ -98,6 +98,12 @@ public interface ReportTemplateService { */ 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); + /** + * 模版通用预览下载 + * 通过模板id+query参数获取文件 + * + * @param type 文件类型 + * @param reqVO + * @param response + */ + void commonDownload(String type, ReportTemplateCommonPreviewReqVO reqVO, HttpServletResponse response); + /** * 模板导出 * 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 97ec52a41..1f97b55f8 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 @@ -28,6 +28,7 @@ import com.bstek.ureport.definition.datasource.SpringBeanDatasourceDefinition; import com.bstek.ureport.definition.searchform.Component; import com.bstek.ureport.definition.searchform.InputComponent; 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.ReportException; 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 DATASETIDS_FIELD_NAME = "datasetIds"; private static final String DATASOURCEIDS_FIELD_NAME = "datasourceIds"; + private static final String DOWNLOAD_SUCCESS_HEADER_CODE = "20000"; @Resource private TenantParamsUtils tenantParamsUtils; @@ -423,8 +425,6 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { @Override public HtmlReport preview(ReportTemplatePreviewReqVO reqVO) { - // 检查查询参数中的空值 - checkQueryNotEmpty(reqVO.getQuery()); // 自定义请求vo转ureport对象 PreviewParameters params = BeanUtils.toBean(reqVO, PreviewParameters.class); @@ -432,10 +432,12 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { ReportRender reportRender = new ReportRender(); ReportDefinition reportDefinition = getReportDefinition(reportRender, params, true); + Map query = params.getQuery(); + // 检查表单配置 + checkSearchForm(reportDefinition.getSearchForm(), query); // 增加多租户参数 - Map parameters = params.getQuery(); - tenantParamsUtils.prepareTenantParam(parameters); - Report report = reportRender.render(reportDefinition, parameters); + tenantParamsUtils.prepareTenantParam(query); + Report report = reportRender.render(reportDefinition, query); return htmlProducer.produce(reportDefinition, report); } @@ -460,13 +462,13 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { ReportRender reportRender = new ReportRender(); ReportDefinition reportDefinition = getReportDefinition(reportRender, params, false); - Map parameters = params.getQuery(); + Map query = params.getQuery(); // 检查表单配置 - checkSearchForm(reportDefinition.getSearchForm(), parameters); + checkSearchForm(reportDefinition.getSearchForm(), query); // 增加多租户参数 - tenantParamsUtils.prepareTenantParam(parameters); - Report report = reportRender.render(reportDefinition, parameters); + tenantParamsUtils.prepareTenantParam(query); + Report report = reportRender.render(reportDefinition, query); return htmlProducer.produce(reportDefinition, report); } @@ -480,10 +482,25 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { if (ObjectUtil.isNotNull(searchForm)) { List components = Optional.ofNullable(searchForm.getComponents()).orElse(new ArrayList<>()); for (Component component : components) { - InputComponent inputComponent = (InputComponent) component; - if (ObjectUtil.isNotNull(inputComponent)) { - String bindParameter = inputComponent.getBindParameter(); - if (StringUtils.isNotEmpty(bindParameter) && !parameters.containsKey(bindParameter)) { + checkComponent(component, parameters); + } + } + } + + /** + * 检查表单中的组件明细 + * + * @param component + * @param parameters + */ + private void checkComponent(Component component, Map parameters) { + InputComponent inputComponent = (InputComponent) component; + if (ObjectUtil.isNotNull(inputComponent)) { + String bindParameter = inputComponent.getBindParameter(); + 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); } } @@ -501,6 +518,8 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { ReportRender reportRender = new ReportRender(); ReportDefinition reportDefinition = getReportDefinition(reportRender, params, true); Map query = params.getQuery(); + // 检查表单配置 + checkSearchForm(reportDefinition.getSearchForm(), query); // 增加多租户参数 tenantParamsUtils.prepareTenantParam(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); 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 query = params.getQuery(); + // 检查表单配置 + checkSearchForm(reportDefinition.getSearchForm(), query); + // 增加多租户参数 + tenantParamsUtils.prepareTenantParam(query); + Report report = reportRender.render(reportDefinition, query); + Map 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); long end = System.currentTimeMillis(); ToolUtils.logToConsole("获取打印文件耗时:" + (end - start) + "ms"); @@ -533,6 +598,8 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { ReportRender reportRender = new ReportRender(); ReportDefinition reportDefinition = getReportDefinition(reportRender, params, true); Map query = params.getQuery(); + // 检查表单配置 + checkSearchForm(reportDefinition.getSearchForm(), query); // 增加多租户参数 tenantParamsUtils.prepareTenantParam(query); Report report = reportRender.render(reportDefinition, query); @@ -546,7 +613,52 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { 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", "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 query = params.getQuery(); + // 检查表单配置 + checkSearchForm(reportDefinition.getSearchForm(), query); + // 增加多租户参数 + tenantParamsUtils.prepareTenantParam(query); + Report report = reportRender.render(reportDefinition, query); + Map 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(); ExportUtils.export(out, report, p); long end = System.currentTimeMillis();