Forráskód Böngészése

检验方案调整

xy 5 napja
szülő
commit
9988e14c2d

+ 5 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorder/vo/BoilerMajorIssuesPageRespVO.java

@@ -119,4 +119,9 @@ public class BoilerMajorIssuesPageRespVO {
 
     private String boilerType;
 
+    /**
+     * 出具报告url
+     */
+    private String issueUrl;
+
 }

+ 20 - 29
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/standardfile/StandardFileController.java

@@ -5,6 +5,7 @@ import cn.start.tz.framework.common.pojo.CommonResult;
 import cn.start.tz.module.grape.city.api.GrapeCityApi;
 import cn.start.tz.module.infra.api.file.FileApi;
 import cn.start.tz.module.pressure2.service.standardfile.StandardClassService;
+import cn.start.tz.module.pressure2.util.PdfMergeUtils;
 import cn.start.tz.module.pressure2.util.WordToPdfUtils;
 import com.alibaba.fastjson2.JSONObject;
 import com.grapecity.documents.excel.*;
@@ -23,6 +24,8 @@ import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.util.*;
 import java.io.IOException;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
 
 import cn.start.tz.framework.common.pojo.PageParam;
 import cn.start.tz.framework.common.pojo.PageResult;
@@ -137,40 +140,28 @@ public class StandardFileController {
     public void getPDFByInspection(@RequestParam(value = "file", required = true) MultipartFile file,@RequestParam(value = "manualUrl") String manualUrl,
                        HttpServletResponse response) throws Exception {
 
-        // 调用另一个服务的 PDF 转换接口
-        String targetUrl = grapecityUrl+
-                "/pdf/getPdf";
         byte[] fileBytes = file.getBytes();
-        List<byte[]> pdfBytesList = new ArrayList<>();
-        pdfBytesList.add(fileBytes);
-        // 发送 POST 请求获取 PDF 字节流
-        byte[] bytes = HttpUtil.createPost(targetUrl)
-                .body(JSONObject.toJSONString(pdfBytesList)).execute().bodyBytes();
-
-        if (StringUtils.isNotEmpty(manualUrl)){
-
-            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
 
-            if (manualUrl.endsWith(".doc") || manualUrl.endsWith(".docx")) {
-                byte[] wordBytes = fileApi.getFileByPath(manualUrl).getData();
-                byteArrayOutputStream = WordToPdfUtils.doc2pdfOutStream(wordBytes);
-            } else {
-                byte[] bytes1 = fileApi.getFileByPath(manualUrl).getData();
-                byteArrayOutputStream.write(bytes1);
+        // 主模板PDF转换与说明书PDF获取相互独立,并行处理以提升速度
+        CompletableFuture<byte[]> mainPdfFuture = CompletableFuture.supplyAsync(() -> {
+            try {
+                String targetUrl = grapecityUrl + "/pdf/getPdf";
+                List<byte[]> pdfBytesList = new ArrayList<>();
+                pdfBytesList.add(fileBytes);
+                return HttpUtil.createPost(targetUrl)
+                        .body(JSONObject.toJSONString(pdfBytesList)).execute().bodyBytes();
+            } catch (Exception e) {
+                throw new CompletionException(e);
             }
+        });
 
-            ByteArrayOutputStream mergeOutputStream = new ByteArrayOutputStream();
-            PDFMergerUtility mergerUtility = new PDFMergerUtility();
-            mergerUtility.addSource(new ByteArrayInputStream(bytes));
-            mergerUtility.addSource(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
-            // pdf 文件流合并
-            mergerUtility.setDestinationStream(mergeOutputStream);
-            mergerUtility.mergeDocuments(null);
+        // 等待模板 PDF 生成完成
+        byte[] mainPdfBytes = mainPdfFuture.get();
 
-            response.getOutputStream().write(mergeOutputStream.toByteArray());
-        }else{
-            response.getOutputStream().write(bytes);
-        }
+        // 使用公用方法合并附件并添加分割线
+        byte[] finalPdfBytes = PdfMergeUtils.buildInspectionPlanPdf(mainPdfBytes, manualUrl, fileApi);
+
+        response.getOutputStream().write(finalPdfBytes);
 
     }
 

+ 17 - 26
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorder/BoilerTaskOrderServiceImpl.java

@@ -1859,32 +1859,6 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
         commonThread.runWithOutResult(() -> {
             try {
                 byte[] bytes = pdfService.pdfByRefId(reportDO.getTemplateId(), reportDO.getId());
-                //检验方案需要拼接附件
-                if (reportDO.getReportType() == 600){
-                    if (StringUtils.isNotEmpty(reportDO.getManualUrl())){
-
-                        String manualUrl = reportDO.getManualUrl();
-                        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-
-                        if (manualUrl.endsWith(".doc") || manualUrl.endsWith(".docx")) {
-                            byte[] wordBytes = fileApi.getFileByPath(manualUrl).getData();
-                            byteArrayOutputStream = WordToPdfUtils.doc2pdfOutStream(wordBytes);
-                        } else {
-                            byte[] bytes1 = fileApi.getFileByPath(manualUrl).getData();
-                            byteArrayOutputStream.write(bytes1);
-                        }
-
-                        ByteArrayOutputStream mergeOutputStream = new ByteArrayOutputStream();
-                        PDFMergerUtility mergerUtility = new PDFMergerUtility();
-                        mergerUtility.addSource(new ByteArrayInputStream(bytes));
-                        mergerUtility.addSource(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
-                        // pdf 文件流合并
-                        mergerUtility.setDestinationStream(mergeOutputStream);
-                        mergerUtility.mergeDocuments(null);
-
-                        bytes = mergeOutputStream.toByteArray();
-                    }
-                }
                 String fileUrl = fileApi.createFile(bytes);
                 BoilerTaskOrderItemReportDO updateItemReportDO = new BoilerTaskOrderItemReportDO().setId(reportDO.getId()).setIssueUrl(fileUrl);
                 taskOrderItemReportMapper.updateById(updateItemReportDO);
@@ -2285,6 +2259,23 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
                         userDO.setReportId(item.getId());
                         taskOrderItemReportUserMapper.insert(userDO);
 
+                        commonThread.runWithOutResult(() -> {
+                            try {
+                                byte[] bytes = pdfService.pdfByRefId(reportDO.getTemplateId(), reportDO.getId());
+                                bytes = PdfMergeUtils.buildInspectionPlanPdf(bytes, reportDO.getManualUrl(), fileApi);
+
+                                String fileUrl = fileApi.createFile(bytes);
+                                BoilerTaskOrderItemReportDO updateItemReportDO = new BoilerTaskOrderItemReportDO().setId(item.getId()).setIssueUrl(fileUrl);
+                                taskOrderItemReportMapper.updateById(updateItemReportDO);
+
+                                BoilerTaskOrderReportDO updateReportDO = new BoilerTaskOrderReportDO().setId(id).setIssueUrl(fileUrl);
+                                taskOrderReportMapper.updateById(updateReportDO);
+
+                            } catch (Exception e) {
+                                log.error("----生成PDF失败:{},{}----", reportDO.getId(), e.getMessage());
+                            }
+                        });
+
                     });
 //                    itemReportDO.setReportNo(reportNo);
                 }

+ 3 - 25
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorder/PipeTaskOrderServiceImpl.java

@@ -4929,32 +4929,10 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
         commonThread.runWithOutResult(() -> {
             try {
                 byte[] bytes = pdfService.pdfByRefId(reportDO.getTemplateId(), reportDO.getId());
-                //检验方案需要拼接附件
-                if (reportDO.getReportType() == 600){
-                    if (StringUtils.isNotEmpty(reportDO.getManualUrl())){
+                // 检验方案(600)需要拼接附件
+                String manualUrl = reportDO.getReportType() == 600 ? reportDO.getManualUrl() : null;
+                bytes = PdfMergeUtils.buildInspectionPlanPdf(bytes, manualUrl, fileApi);
 
-                        String manualUrl = reportDO.getManualUrl();
-                        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-
-                        if (manualUrl.endsWith(".doc") || manualUrl.endsWith(".docx")) {
-                            byte[] wordBytes = fileApi.getFileByPath(manualUrl).getData();
-                            byteArrayOutputStream = WordToPdfUtils.doc2pdfOutStream(wordBytes);
-                        } else {
-                            byte[] bytes1 = fileApi.getFileByPath(manualUrl).getData();
-                            byteArrayOutputStream.write(bytes1);
-                        }
-
-                        ByteArrayOutputStream mergeOutputStream = new ByteArrayOutputStream();
-                        PDFMergerUtility mergerUtility = new PDFMergerUtility();
-                        mergerUtility.addSource(new ByteArrayInputStream(bytes));
-                        mergerUtility.addSource(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
-                        // pdf 文件流合并
-                        mergerUtility.setDestinationStream(mergeOutputStream);
-                        mergerUtility.mergeDocuments(null);
-
-                        bytes = mergeOutputStream.toByteArray();
-                    }
-                }
                 String fileUrl = fileApi.createFile(bytes);
                 PipeTaskOrderItemReportDO updateItemReportDO = new PipeTaskOrderItemReportDO().setId(reportDO.getId()).setIssueUrl(fileUrl);
                 taskOrderItemReportMapper.updateById(updateItemReportDO);

+ 97 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/util/PdfMergeUtils.java

@@ -0,0 +1,97 @@
+package cn.start.tz.module.pressure2.util;
+
+import cn.start.tz.module.infra.api.file.FileApi;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.apache.pdfbox.multipdf.PDFMergerUtility;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDPageContentStream;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * PDF 合并工具类:将模板 PDF 与 manualUrl 对应的附件合并,并添加页间分割线
+ */
+@Slf4j
+public class PdfMergeUtils {
+
+    /**
+     * 生成检验方案 PDF:模板 PDF + 可选附件 PDF 合并,并添加页间分割线
+     *
+     * @param templatePdfBytes 模板 PDF 字节数组
+     * @param manualUrl        附件文件路径(可为空)
+     * @param fileApi          文件服务 API
+     * @return 合并后的 PDF 字节数组
+     */
+    public static byte[] buildInspectionPlanPdf(byte[] templatePdfBytes, String manualUrl, FileApi fileApi) {
+        byte[] mergedBytes = templatePdfBytes;
+
+        // 如果有关联附件,合并到 PDF 中
+        if (StringUtils.isNotEmpty(manualUrl)) {
+            try {
+                ByteArrayOutputStream manualOutputStream = new ByteArrayOutputStream();
+
+                if (manualUrl.endsWith(".doc") || manualUrl.endsWith(".docx")) {
+                    byte[] wordBytes = fileApi.getFileByPath(manualUrl).getData();
+                    if (wordBytes != null && wordBytes.length > 0) {
+                        manualOutputStream = WordToPdfUtils.doc2pdfOutStream(wordBytes);
+                    }
+                } else {
+                    byte[] fileBytes = fileApi.getFileByPath(manualUrl).getData();
+                    if (fileBytes != null && fileBytes.length > 0) {
+                        manualOutputStream.write(fileBytes);
+                    }
+                }
+
+                if (manualOutputStream.size() > 0) {
+                    ByteArrayOutputStream mergeOutputStream = new ByteArrayOutputStream();
+                    PDFMergerUtility mergerUtility = new PDFMergerUtility();
+                    mergerUtility.addSource(new ByteArrayInputStream(templatePdfBytes));
+                    mergerUtility.addSource(new ByteArrayInputStream(manualOutputStream.toByteArray()));
+                    mergerUtility.setDestinationStream(mergeOutputStream);
+                    mergerUtility.mergeDocuments(null);
+                    mergedBytes = mergeOutputStream.toByteArray();
+                }
+            } catch (Exception e) {
+                log.error("[buildInspectionPlanPdf] 合并附件 PDF 失败: {}", e.getMessage());
+            }
+        }
+
+        // 添加页间分割线
+        try {
+            mergedBytes = addPageDividers(mergedBytes);
+        } catch (Exception e) {
+            log.error("[buildInspectionPlanPdf] 添加页间分割线失败: {}", e.getMessage());
+        }
+
+        return mergedBytes;
+    }
+
+    /**
+     * 为 PDF 每一页之间添加分割线
+     */
+    private static byte[] addPageDividers(byte[] pdfBytes) throws IOException {
+        try (PDDocument document = PDDocument.load(new ByteArrayInputStream(pdfBytes))) {
+            int totalPages = document.getNumberOfPages();
+            for (int i = 0; i < totalPages - 1; i++) {
+                PDPage page = document.getPage(i);
+                try (PDPageContentStream contentStream = new PDPageContentStream(document, page,
+                        PDPageContentStream.AppendMode.APPEND, true, true)) {
+                    float pageWidth = page.getMediaBox().getWidth();
+                    float dividerY = 15f;
+                    contentStream.setStrokingColor(0.5f, 0.5f, 0.5f);
+                    contentStream.setLineWidth(1f);
+                    contentStream.moveTo(0, dividerY);
+                    contentStream.lineTo(pageWidth, dividerY);
+                    contentStream.stroke();
+                }
+            }
+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+            document.save(outputStream);
+            return outputStream.toByteArray();
+        }
+    }
+}