From bf4e04738da91ca464a3afe3956b4fd1d9e9e807 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Wed, 4 Dec 2024 11:47:40 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AF=BC=E5=85=A5=E5=AF=BC=E5=87=BA=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../template/ReportTemplateController.java | 20 +++- .../dataobject/template/ReportTemplateDO.java | 9 -- .../template/ReportTemplateService.java | 21 +++- .../template/ReportTemplateServiceImpl.java | 108 ++++++++++++++---- 4 files changed, 122 insertions(+), 36 deletions(-) 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 4a7b1d32a..e7f6be641 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 @@ -26,7 +26,6 @@ import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.tree.TerminalNode; import org.apache.http.HttpStatus; -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.*; @@ -145,7 +144,7 @@ public class ReportTemplateController { @Operation(summary = "校验表达式") @Parameter(name = "content", description = "表达式", required = true) @PreAuthorize("@ss.hasPermission('report:design')") - public List scriptValidation(@Param("content") @NotEmpty(message = "表达式不能为空") String content) { + public List scriptValidation(@RequestParam("content") @NotEmpty(message = "表达式不能为空") String content) { content = StringUtils.decode(content); ANTLRInputStream antlrInputStream = new ANTLRInputStream(content); ReportParserLexer lexer = new ReportParserLexer(antlrInputStream); @@ -168,7 +167,7 @@ public class ReportTemplateController { @Operation(summary = "解析表达式中的数据集") @Parameter(name = "expr", description = "表达式", required = true) @PreAuthorize("@ss.hasPermission('report:design')") - public Map parseDatasetName(@Param("expr") @NotEmpty(message = "表达式不能为空") String expr) { + public Map parseDatasetName(@RequestParam("expr") @NotEmpty(message = "表达式不能为空") String expr) { ANTLRInputStream antlrInputStream = new ANTLRInputStream(expr); ReportParserLexer lexer = new ReportParserLexer(antlrInputStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); @@ -186,4 +185,19 @@ public class ReportTemplateController { } return result; } + + @GetMapping("/xml/{id}") + @Operation(summary = "导出模版") + @Parameter(name = "id", description = "模板id", required = true) + @PreAuthorize("@ss.hasPermission('report:design')") + public void exportTemplate(@PathVariable("id") Long templateId, HttpServletResponse response) { + templateService.exportTemplate(templateId, response); + } + + @PutMapping("/xml") + @Operation(summary = "导入模版") + @PreAuthorize("@ss.hasPermission('report:design')") + public void importTemplate(@RequestParam("name") @NotEmpty(message = "模版名称不能为空") String name, @RequestParam("file") MultipartFile file) { + templateService.importTemplate(name, file); + } } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java index c59abe40c..42f75e060 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/dal/dataobject/template/ReportTemplateDO.java @@ -4,12 +4,9 @@ import com.baomidou.mybatisplus.annotation.*; import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; import com.cf.imes.framework.mybatis.core.type.CompressStringTypeHandler; import com.cf.imes.framework.mybatis.core.type.JsonLongSetTypeHandler; -import com.cf.imes.framework.mybatis.core.type.LongListTypeHandler; -import com.cf.imes.module.report.dal.dataobject.datasource.ReportDatasourceDO; import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; import lombok.*; -import java.util.List; import java.util.Set; /** @@ -56,12 +53,6 @@ public class ReportTemplateDO extends BaseDO { @TableField(fill = FieldFill.INSERT_UPDATE) private Long organId; - /** - * 数据源 - */ - @TableField(exist = false) - private List datasource; - /** * 数据源id列表 */ 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 ca80fb02d..88fce28ea 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 @@ -7,6 +7,7 @@ import com.cf.imes.module.report.controller.admin.template.vo.ReportTemplateReqV 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 org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; @@ -75,7 +76,7 @@ public interface ReportTemplateService { /** * 模板预览 * - * @param params + * @param reqVO * @return */ HtmlReport preview(ReportTemplatePreviewReqVO reqVO); @@ -89,8 +90,24 @@ public interface ReportTemplateService { * 模版预览下载 * * @param type 文件类型 - * @param params + * @param reqVO * @param response */ void download(String type, ReportTemplatePreviewReqVO reqVO, HttpServletResponse response); + + /** + * 模板导出 + * + * @param templateId + * @param response + */ + void exportTemplate(Long templateId, HttpServletResponse response); + + /** + * 模版导入 + * + * @param name + * @param file + */ + void importTemplate(String name, 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 bb4201bb5..908010163 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 @@ -2,9 +2,14 @@ package com.cf.imes.module.report.service.template; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.URLUtil; +import cn.hutool.http.ContentType; +import cn.hutool.http.Header; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.bstek.common.exception.ReportDesignException; import com.bstek.designer.bean.PreviewParameters; @@ -47,11 +52,13 @@ import com.cf.imes.module.report.dal.mysql.datasource.ReportDatasourceMapper; import com.cf.imes.module.report.dal.mysql.template.ReportTemplateMapper; import com.cf.imes.module.report.enums.template.ReportTemplateTypeEnum; 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; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; @@ -59,13 +66,14 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.OutputStream; +import java.io.PrintWriter; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_BUILDIN_OPERATION_PERMISSION_ERROR; @@ -81,6 +89,7 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.TEMPLATE_PREIVE */ @Service @Validated +@Slf4j public class ReportTemplateServiceImpl implements ReportTemplateService { @Resource private ReportTemplateMapper templateMapper; @@ -92,6 +101,9 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { private ReportDatasetMapper datasetMapper; 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"; + private static final String DATASOURCEIDS_FIELD_NAME = "datasourceIds"; @Resource private TenantParamsUtils tenantParamsUtils; @@ -360,7 +372,7 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { if (ObjectUtil.isNotNull(queryMap)) { for (Map.Entry entry : queryMap.entrySet()) { String key = entry.getKey(); - if (ObjectUtils.isEmpty(entry.getValue()) && ObjectUtil.notEqual(key, "datasetIds") && ObjectUtil.notEqual(key, "datasourceIds")) { + if (ObjectUtils.isEmpty(entry.getValue()) && ObjectUtil.notEqual(key, DATASETIDS_FIELD_NAME) && ObjectUtil.notEqual(key, DATASOURCEIDS_FIELD_NAME)) { throw ServiceExceptionUtil.exception(TEMPLATE_PREIVEW_QUERYPARAM_EMPTY, key); } } @@ -405,12 +417,14 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { // 创建下载文件 ProducerEnum p = ProducerEnum.PDF; String downFileName = com.bstek.common.utils.StringUtils.randomFileName() + com.bstek.common.utils.StringUtils.getFileSuffix(p); - response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(downFileName, UTF8_CHARSET)); + response.setHeader(Header.CONTENT_DISPOSITION.getValue(), ATTACHMENT_PREFIX + URLEncoder.encode(downFileName, UTF8_CHARSET)); + response.setHeader("code", "20000"); ExportUtils.export(out, report, p); long end = System.currentTimeMillis(); ToolUtils.logToConsole("获取打印文件耗时:" + (end - start) + "ms"); } catch (Exception ex) { + log.error("模版预览打印异常", ex); throw new ReportException(ex); } } @@ -435,13 +449,81 @@ 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("Content-Disposition", "attachment; filename=" + URLEncoder.encode(downFileName, UTF8_CHARSET)); + response.setHeader(Header.CONTENT_DISPOSITION.getValue(), ATTACHMENT_PREFIX + URLEncoder.encode(downFileName, UTF8_CHARSET)); response.setHeader("code", "20000"); 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 exportTemplate(Long templateId, HttpServletResponse response) { + ReportTemplateDO reportTemplateDO = validateTemplateExists(templateId); + if (ObjectUtil.isNull(reportTemplateDO)) { + throw exception(TEMPLATE_NOT_EXISTS); + } + PrintWriter writer = null; + try { + // 模版关键信息 + JSONObject exportObj = new JSONObject(); + exportObj.put("content", reportTemplateDO.getContent()); + Set datasourceIds = reportTemplateDO.getDatasourceIds(); + exportObj.put(DATASOURCEIDS_FIELD_NAME, CollUtil.isNotEmpty(datasourceIds) ? datasourceIds : Set.of()); + Set datasetIds = reportTemplateDO.getDatasetIds(); + exportObj.put(DATASETIDS_FIELD_NAME, CollUtil.isNotEmpty(datasetIds) ? datasourceIds : Set.of()); + + // 设置响应的内容类型为 application/json + response.setContentType(ContentType.JSON.getValue()); + response.setCharacterEncoding(UTF8_CHARSET); + response.setHeader(Header.CONTENT_DISPOSITION.getValue(), ATTACHMENT_PREFIX + URLEncoder.encode(String.format("%s.json", reportTemplateDO.getName()), UTF8_CHARSET)); + + // 写入响应的输出流 + writer = response.getWriter(); + writer.print(exportObj.toJSONString()); + writer.flush(); + } catch (Exception ex) { + log.error("模板导出异常", ex); + throw new ReportException(ex); + } finally { + IoUtil.close(writer); + } + } + + @Override + public void importTemplate(String name, MultipartFile file) { + 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); + // 校验模板名唯一性 + validateTemplateNameUnique(createReqVO, isSuperAdmin); + // 复制信息 + createReqVO.setContent(jsonObject.getString("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) { + template.setType(ReportTemplateTypeEnum.SYSTEM); + } else { + template.setType(ReportTemplateTypeEnum.CUSTOM); + } + templateMapper.insert(template); + } catch (ServiceException sex) { + throw sex; + } catch (Exception ex) { + log.error("模板导入异常", ex); throw new ReportException(ex); } } @@ -474,22 +556,4 @@ public class ReportTemplateServiceImpl implements ReportTemplateService { parameters.put("pageIndex", params.getPageIndex()); return reportDefinition; } - - /** - * 模板生成文件类型校验 - * - * @param type - */ - private void validateProducerType(String type) { - boolean match = false; - for (ProducerEnum producerEnum : ProducerEnum.values()) { - if (Objects.equals(producerEnum.name(), type.toUpperCase())) { - match = true; - break; - } - } - if (!match) { - throw new ReportException("类型错误,请检查是否PDF/WORD/EXCEL"); - } - } } From f20986edc1d9fb5fd8a06368e87c13fc2527802a Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Wed, 4 Dec 2024 16:39:14 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E6=A8=A1=E6=9D=BFureport?= =?UTF-8?q?=E8=A7=A3=E6=9E=90xml=E6=A0=87=E7=AD=BE=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E6=97=B6=E4=BD=BF=E7=94=A8=E6=96=87=E6=9C=AC=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/ureport-core-2.3.0-SNAPSHOT.jar | Bin 929289 -> 929078 bytes 1 file changed, 0 insertions(+), 0 deletions(-) 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 a4e48968e97cae748d3079d9efafbe5335219654..3887f34f82a92dba914e1cd5e3829fc99ad596cb 100644 GIT binary patch delta 33053 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 From 49b588d621af67082b3d26f61100da2d94943810 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Wed, 4 Dec 2024 17:29:41 +0800 Subject: [PATCH 3/3] =?UTF-8?q?1=E3=80=81=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E6=9D=BF=E7=BC=96=E5=8F=B7=E7=94=9F=E6=88=90=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=A9=BA=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= =?UTF-8?q?=EF=BC=9B2=E3=80=81=E6=96=B0=E5=A2=9E=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E6=9D=BF=E7=BC=96=E5=8F=B7=E7=94=9F=E6=88=90=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E6=97=B6=E9=97=B4=E8=AE=B0=E5=BD=95=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customplateno/CustomPlateNoGenerateServiceImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/CustomPlateNoGenerateServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/CustomPlateNoGenerateServiceImpl.java index 1e7a4633c..2c9dd981e 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/CustomPlateNoGenerateServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/customplateno/CustomPlateNoGenerateServiceImpl.java @@ -24,6 +24,7 @@ import com.cf.imes.module.system.enums.customplateno.CustomPlateNoRuleCodeEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.util.StopWatch; import javax.annotation.Resource; import java.time.LocalDateTime; @@ -61,6 +62,9 @@ public class CustomPlateNoGenerateServiceImpl implements CustomPlateNoGenerateSe @Override public void generateCustomPlateNo(OrderDO orderDO, List plateDOList, boolean newOrder) { + // 执行时间记录 + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); Long orderId = orderDO.getId(); // 1、获取生产配置 CustomPlateNoGenerateConfigVO generateConfig = getGenerateConfig(orderId); @@ -102,6 +106,8 @@ public class CustomPlateNoGenerateServiceImpl implements CustomPlateNoGenerateSe if (orgCustomPlateNoSeqModifyResult.isError() || !orgCustomPlateNoSeqModifyResult.getData().booleanValue()) { throw new ServiceException(ErrorCodeConstants.CUSTOM_PLATENO_GENERATE_ORG_CUSTOM_PLATENO_SEQ_MODIFY_ERROR); } + stopWatch.stop(); + log.info("生成板编号耗时:{} seconds", stopWatch.getTotalTimeSeconds()); } /** @@ -158,7 +164,7 @@ public class CustomPlateNoGenerateServiceImpl implements CustomPlateNoGenerateSe customPlateNoRuleVOS = Optional.ofNullable(orgCustomPlateNoConfig) .map(config -> JSON.parseArray(config.getSetting(), CustomPlateNoRuleVO.class)) .orElse(List.of()); - customPlateNoGenerateConfigVO.setOrgCustomPlateNoConfigId(Optional.ofNullable(orgCustomPlateNoConfig.getId()).orElse(null)); + customPlateNoGenerateConfigVO.setOrgCustomPlateNoConfigId(Optional.ofNullable(orgCustomPlateNoConfig).map(SystemConfigRespDTO::getId).orElse(null)); } OrderDO order = orderService.getOrder(orderId);