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

独审、操作指导书、使用pdf

徐展城 3 hete
szülő
commit
3147b2c04c
16 módosított fájl, 378 hozzáadás és 177 törlés
  1. 1 1
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorder/BoilerTaskOrderController.java
  2. 9 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorderitem/vo/BoilerTaskOrderItemRespVO.java
  3. 1 1
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/pipetaskorder/PipeTaskOrderController.java
  4. 10 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/pipetaskorder/vo/PipeOrderItemReportVO.java
  5. 61 15
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/reporttemplate/ReportTemplateController.java
  6. 1 1
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/boilertaskorder/AppApiBoilerTaskOrderController.java
  7. 1 1
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/pipetaskorder/AppApiPipeTaskOrderController.java
  8. 1 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/framework/cron/SyncTaskBoilerEquipmentJob.java
  9. 1 1
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorder/BoilerTaskOrderService.java
  10. 150 37
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorder/BoilerTaskOrderServiceImpl.java
  11. 1 1
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorderissuereport/BoilerTaskOrderIssueReportServiceImpl.java
  12. 5 92
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorderitemreport/BoilerTaskOrderItemReportServiceImpl.java
  13. 1 1
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorder/PipeTaskOrderService.java
  14. 124 23
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorder/PipeTaskOrderServiceImpl.java
  15. 1 1
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorderissuereport/PipeTaskOrderIssueReportServiceImpl.java
  16. 10 2
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorderitemreport/PipeTaskOrderItemReportServiceImpl.java

+ 1 - 1
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorder/BoilerTaskOrderController.java

@@ -523,7 +523,7 @@ public class BoilerTaskOrderController {
     public void generateReportPdf(@RequestParam(value = "orderItemId") String orderItemId,
                                   HttpServletResponse response) throws Exception {
 
-        byte[] pdfByte = boilerTaskOrderService.getRecordOutputStreamMerge(orderItemId);
+        byte[] pdfByte = boilerTaskOrderService.getReportOutputStreamMerge(orderItemId);
         if (pdfByte != null) {
             response.getOutputStream().write(pdfByte);
         }else{

+ 9 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorderitem/vo/BoilerTaskOrderItemRespVO.java

@@ -150,4 +150,13 @@ public class BoilerTaskOrderItemRespVO {
     @Schema
     private Integer checkType;
 
+    /**
+     * 出具报告url
+     */
+    private String issueUrl;
+
+    /**
+     * 记录pdfUrl
+     */
+    private String enterPdfUrl;
 }

+ 1 - 1
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/pipetaskorder/PipeTaskOrderController.java

@@ -509,7 +509,7 @@ public class PipeTaskOrderController {
     public void generateReportPdf(@RequestParam(value = "orderId") String orderId,
                        HttpServletResponse response) throws Exception {
 
-        byte[] pdfByte = pipeTaskOrderService.getRecordOutputStreamMerge(orderId);
+        byte[] pdfByte = pipeTaskOrderService.getReportOutputStreamMerge(orderId);
         if (pdfByte != null) {
             response.getOutputStream().write(pdfByte);
         }else{

+ 10 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/pipetaskorder/vo/PipeOrderItemReportVO.java

@@ -183,4 +183,14 @@ public class PipeOrderItemReportVO {
      * 批准时间
      */
     private LocalDateTime ratifyTime;
+
+    /**
+     * 出具报告url
+     */
+    private String issueUrl;
+
+    /**
+     * 记录pdfUrl
+     */
+    private String enterPdfUrl;
 }

+ 61 - 15
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/reporttemplate/ReportTemplateController.java

@@ -2,8 +2,14 @@ package cn.start.tz.module.pressure2.controller.admin.reporttemplate;
 
 import cn.start.tz.framework.common.pojo.CommonResult;
 import cn.start.tz.framework.common.pojo.PageResult;
+import cn.start.tz.module.pressure2.controller.admin.pipetaskorderinput.vo.PipeTaskOrderInputPrintReqVO;
 import cn.start.tz.module.pressure2.controller.admin.reporttemplate.vo.*;
+import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreport.BoilerTaskOrderItemReportDO;
 import cn.start.tz.module.pressure2.dal.dataobject.dynamictb.DynamicTbDO;
+import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitemreport.PipeTaskOrderItemReportDO;
+import cn.start.tz.module.pressure2.service.boilertaskorderitemreport.BoilerTaskOrderItemReportService;
+import cn.start.tz.module.pressure2.service.pipetaskorderinput.PipeTaskOrderInputService;
+import cn.start.tz.module.pressure2.service.pipetaskorderitemreport.PipeTaskOrderItemReportService;
 import cn.start.tz.module.pressure2.service.reporttemplate.ReportTemplateService;
 import cn.start.tz.module.system.api.template.TemplateInitDataApi;
 import io.swagger.v3.oas.annotations.Operation;
@@ -36,6 +42,15 @@ public class ReportTemplateController {
     @Resource
     private TemplateInitDataApi templateInitDataApi;
 
+    @Resource
+    private PipeTaskOrderInputService pipeTaskOrderInputService;
+
+    @Resource
+    private BoilerTaskOrderItemReportService boilerTaskOrderItemReportService;
+
+    @Resource
+    private PipeTaskOrderItemReportService pipeTaskOrderItemReportService;
+
     @PostMapping("/create")
     @Operation(summary = "创建承压报告模版")
     //@PreAuthorize("@ss.hasPermission('pressure:report-template:create')")
@@ -135,21 +150,52 @@ public class ReportTemplateController {
 //    }
 //
 //
-//    @PostMapping("/reportPreview")
-//    @Operation(summary = "承压报告xlsx预览测试接口 type 默认100 100报告记录 200报告结论 300 报告模板 400 金额计算&关联关系, fileType 默认100 xlsx ,200 pdf")
-//    public void reportPreviewPost(HttpServletResponse response, @RequestBody ReportPreviewVO reportPreviewVO) throws Exception {
-//        try (ByteArrayOutputStream outputStream = reportTemplateService.getRecordOutputStreamMerge(reportPreviewVO)) {
-//            ServletOutputStream responseOutputStream = response.getOutputStream();
-//            outputStream.writeTo(responseOutputStream);
-//        } catch (Exception e) {
-//            log.error("reportPreview error",e);
-//            // 5. 错误处理
-//            response.reset();
-//            response.setContentType("application/json");
-//            response.setCharacterEncoding("UTF-8");
-//            response.getWriter().write("{\"error\":\"文件生成失败: " + e.getMessage() + "\"}");
-//        }
-//    }
+    @PostMapping("/reportPreview")
+    @Operation(summary = "承压报告预览 (type 默认100记录/300报告模板, fileType 默认100 xlsx/200 pdf)")
+    public void reportPreviewPost(HttpServletResponse response, @RequestBody ReportPreviewVO reportPreviewVO) throws Exception {
+        try {
+            String reportId = reportPreviewVO.getReportId();
+            Integer type = reportPreviewVO.getType();
+
+            // 查找报告获取 templateId
+            String templateId = null;
+            BoilerTaskOrderItemReportDO boilerReport = boilerTaskOrderItemReportService.getById(reportId);
+            if (boilerReport != null) {
+                templateId = (type != null && type == 300) ? boilerReport.getReportTemplateId() : boilerReport.getTemplateId();
+            } else {
+                PipeTaskOrderItemReportDO pipeReport = pipeTaskOrderItemReportService.getById(reportId);
+                if (pipeReport != null) {
+                    templateId = (type != null && type == 300) ? pipeReport.getReportTemplateId() : pipeReport.getTemplateId();
+                }
+            }
+
+            if (templateId == null) {
+                response.setContentType("application/json");
+                response.setCharacterEncoding("UTF-8");
+                response.getWriter().write("{\"error\":\"未找到报告或模版\"}");
+                return;
+            }
+
+            PipeTaskOrderInputPrintReqVO reqVO = new PipeTaskOrderInputPrintReqVO();
+            reqVO.setTemplateId(templateId);
+            reqVO.setId(reportId);
+            byte[] bytes = pipeTaskOrderInputService.printPipeTaskOrderInput(reqVO);
+
+            Integer fileType = reportPreviewVO.getFileType();
+            if (Integer.valueOf(100).equals(fileType)) {
+                response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+            } else {
+                response.setContentType("application/pdf");
+            }
+            response.getOutputStream().write(bytes);
+        } catch (Exception e) {
+            log.error("reportPreview error", e);
+            response.reset();
+            response.setContentType("application/json");
+            response.setCharacterEncoding("UTF-8");
+            response.getWriter().write("{\"error\":\"文件生成失败: " + e.getMessage() + "\"}");
+        }
+    }
 
 //    @PutMapping("/updateBindingPathNameJson")
 //    @Operation(summary = "更新绑定数据json字符串带注释")

+ 1 - 1
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/boilertaskorder/AppApiBoilerTaskOrderController.java

@@ -527,7 +527,7 @@ public class AppApiBoilerTaskOrderController {
     public void generateReportPdf(@RequestParam(value = "orderItemId") String orderItemId,
                                   HttpServletResponse response) throws Exception {
 
-        byte[] pdfByte = boilerTaskOrderService.getRecordOutputStreamMerge(orderItemId);
+        byte[] pdfByte = boilerTaskOrderService.getReportOutputStreamMerge(orderItemId);
         if (pdfByte != null) {
             response.getOutputStream().write(pdfByte);
         }else{

+ 1 - 1
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/pipetaskorder/AppApiPipeTaskOrderController.java

@@ -497,7 +497,7 @@ public class AppApiPipeTaskOrderController {
     public void generateReportPdf(@RequestParam(value = "orderId") String orderId,
                        HttpServletResponse response) throws Exception {
 
-        byte[] pdfByte = pipeTaskOrderService.getRecordOutputStreamMerge(orderId);
+        byte[] pdfByte = pipeTaskOrderService.getReportOutputStreamMerge(orderId);
         if (pdfByte != null) {
             response.getOutputStream().write(pdfByte);
         }else{

+ 1 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/framework/cron/SyncTaskBoilerEquipmentJob.java

@@ -761,6 +761,7 @@ public class SyncTaskBoilerEquipmentJob {
                     EquipBoilerDO equipBoiler = equipBoilerService.getOne(new LambdaQueryWrapper<EquipBoilerDO>().eq(EquipBoilerDO::getEquipCode, taskOrderItem.getRegisterNo()));
                     if (equipBoiler != null) {
                         itemDO.setEquipId(equipBoiler.getId()); // 设置设备ID
+                        itemDO.setBoilerType(equipBoiler.getType());
 
                         log.info("找到设备信息,REGISTERNO: {}, EQUIP_ID: {}", taskOrderItem.getRegisterNo(), equipBoiler.getId());
                     } else {

+ 1 - 1
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorder/BoilerTaskOrderService.java

@@ -193,7 +193,7 @@ public interface BoilerTaskOrderService extends IService<BoilerTaskOrderDO>  {
 
     void orderConfirmFinish(OrderConfirmFinishVO orderItemRatifyVO);
 
-    byte[] getRecordOutputStreamMerge(String orderId);
+    byte[] getReportOutputStreamMerge(String orderId);
 
     Boolean syncReportData(BoilerTaskOrderSyncReportVO reqVO);
 

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

@@ -41,6 +41,7 @@ import cn.start.tz.module.pressure2.dal.dataobject.opinionnotificationfollowreco
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorder.PipeTaskOrderDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitem.PipeTaskOrderItemDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitemreport.PipeTaskOrderItemReportDO;
+import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitemreportuser.PipeTaskOrderItemReportUserDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderuser.PipeTaskOrderUserDO;
 import cn.start.tz.module.pressure2.dal.dataobject.taskordernontaxrecord.TaskOrderNonTaxRecordDO;
 import cn.start.tz.module.pressure2.dal.dataobject.taskordernontaxrecorditem.TaskOrderNonTaxRecordItemDO;
@@ -858,7 +859,7 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
         if (!checkDOList.isEmpty()){
 
             String projectCode = getProjectCodeByTaskOrderId(taskOrderDO.getId());
-            String reportNo = generateOrderItemSubReportNo(taskOrderDO.getDeptId(),taskOrderDO.getCheckDate(),projectCode);
+            final String[] reportNo = {generateOrderItemSubReportNo(taskOrderDO.getDeptId(), taskOrderDO.getCheckDate(), projectCode)};
 
             checkDOList.forEach(item -> {
                 //生成检验项目
@@ -883,7 +884,7 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
                         addReport1.setFeeCalculateJson(item.getFeeCalculateJson());
                         addReport1.setOrderId(taskOrderDO.getId());
                         addReport1.setTaskStatus(500);
-                        addReport1.setReportNo(reportNo);
+                        addReport1.setReportNo(reportNo[0]);
                         //addReport1.setSort(index.getAndSet(index.get() + 1));
                         addReport1.setReportType(dynamicTbDO.getTbType());
                         if ("MAIN".equals(recordReportDO.getProjectType())) {
@@ -892,6 +893,26 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
                             addReport1.setReportType(200);
                         } else if ("STANDALONE".equals(recordReportDO.getProjectType())) {
                             addReport1.setReportType(300);
+
+                            // 独审报告自动带出操作指导书
+                            BoilerTaskOrderItemReportDO addInstructionReport = new BoilerTaskOrderItemReportDO();
+                            addInstructionReport.setTemplateId(recordReportDO.getOperationInstruction());
+                            addInstructionReport.setOrderId(taskOrderDO.getId());
+                            addInstructionReport.setOrderItemId(id);
+                            addInstructionReport.setTaskStatus(TaskOrderStatusEnum.ENTER.getStatus());
+                            addInstructionReport.setFeeType(item.getType());
+                            addInstructionReport.setProjectId(recordReportDO.getId());
+                            addInstructionReport.setFee(item.getFee());
+                            DynamicTbDO dynamicTbDO1 = dynamicTbMapper.selectById(recordReportDO.getOperationInstruction());
+                            addInstructionReport.setReportName(dynamicTbDO1.getTbName());
+                            addInstructionReport.setReportType(700);
+
+
+                            BoilerTaskOrderItemReportDO mainReport = taskOrderItemReportMapper.selectOne(new LambdaQueryWrapperX<BoilerTaskOrderItemReportDO>().
+                                    eq(BoilerTaskOrderItemReportDO::getOrderId, taskOrderDO.getId()), false);
+                            addInstructionReport.setReportNo(reportNo[0]);
+                            insertList.add(addInstructionReport);
+
                         }
                         addReport1.setReportUrl(id);
                         //使用配置的项目名称
@@ -914,7 +935,7 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
                             addReport1.setFeeCalculateJson(item.getFeeCalculateJson());
                             addReport1.setOrderId(taskOrderDO.getId());
                             addReport1.setTaskStatus(520);
-                            addReport1.setReportNo(reportNo);
+                            addReport1.setReportNo(reportNo[0]);
                             //addReport1.setSort(index.getAndSet(index.get() + 1));
                             addReport1.setReportType(dynamicTbDO.getTbType());
                             if ("MAIN".equals(recordReportDO.getProjectType())) {
@@ -923,6 +944,30 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
                                 addReport1.setReportType(200);
                             } else if ("STANDALONE".equals(recordReportDO.getProjectType())) {
                                 addReport1.setReportType(300);
+
+                                // 独审报告自动带出操作指导书
+                                BoilerTaskOrderItemReportDO addInstructionReport = new BoilerTaskOrderItemReportDO();
+                                addInstructionReport.setTemplateId(recordReportDO.getOperationInstruction());
+                                addInstructionReport.setOrderId(taskOrderDO.getId());
+                                addInstructionReport.setOrderItemId(id);
+                                addInstructionReport.setTaskStatus(TaskOrderStatusEnum.ENTER.getStatus());
+                                addInstructionReport.setFeeType(item.getType());
+                                addInstructionReport.setProjectId(recordReportDO.getId());
+                                addInstructionReport.setFee(item.getFee());
+                                DynamicTbDO dynamicTbDO1 = dynamicTbMapper.selectById(recordReportDO.getOperationInstruction());
+                                addInstructionReport.setReportName(dynamicTbDO1.getTbName());
+                                addInstructionReport.setReportType(700);
+
+
+                                BoilerTaskOrderItemReportDO mainReport = taskOrderItemReportMapper.selectOne(new LambdaQueryWrapperX<BoilerTaskOrderItemReportDO>().
+                                        eq(BoilerTaskOrderItemReportDO::getOrderId, taskOrderDO.getId()), false);
+                                if (mainReport != null) {
+                                    reportNo[0] = mainReport.getReportNo();
+                                }
+
+                                addInstructionReport.setReportNo(reportNo[0]);
+                                insertList.add(addInstructionReport);
+
                             }
                             addReport1.setReportUrl(id);
                             //使用配置的项目名称
@@ -2464,6 +2509,63 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
                         addReport.setReportType(200);
                     }else if ("STANDALONE".equals(connectDO.getProjectType())){
                         addReport.setReportType(300);
+
+                        // 独审报告自动带出操作指导书
+                        BoilerTaskOrderItemReportDO addInstructionReport = new BoilerTaskOrderItemReportDO();
+                        addInstructionReport.setTemplateId(connectDO.getOperationInstruction());
+                        addInstructionReport.setOrderId(orderItemDOS.get(0).getOrderId());
+                        addInstructionReport.setOrderItemId(vo.getOrderItemId());
+                        addInstructionReport.setTaskStatus(TaskOrderStatusEnum.ENTER.getStatus());
+                        addInstructionReport.setSort(count + 1);
+                        addInstructionReport.setFeeType(vo.getType());
+
+                        addInstructionReport.setProjectId(connectDO.getId());
+                        if (vo.getFee() == null || vo.getFee().compareTo(BigDecimal.ZERO) == 0) {
+                            addInstructionReport.setFee(ConversionUtil.convert(connectDO.getFee()));
+                        } else {
+                            addInstructionReport.setFee(vo.getFee());
+                        }
+                        DynamicTbDO dynamicTbDO = dynamicTbMapper.selectById(connectDO.getOperationInstruction());
+                        addInstructionReport.setReportName(dynamicTbDO.getTbName());
+                        addInstructionReport.setReportType(700);
+
+
+
+                        String reportNo = "";
+                        BoilerTaskOrderItemReportDO mainReport = taskOrderItemReportMapper.selectOne(new LambdaQueryWrapperX<BoilerTaskOrderItemReportDO>().
+                                eq(BoilerTaskOrderItemReportDO::getOrderId, orderItemDOS.get(0).getOrderId()), false);
+                        if (mainReport != null) {
+                            reportNo = mainReport.getReportNo();
+                        }
+
+                        addInstructionReport.setReportNo(reportNo);
+
+                        // 新增报告
+                        taskOrderItemReportMapper.insert(addInstructionReport);
+                        //生成 报表数据
+                        BoilerTaskOrderSyncReportVO syncReportVO = new BoilerTaskOrderSyncReportVO();
+                        syncReportVO.setRefId(addInstructionReport.getId());
+                        syncReportVO.setReportType("record");
+                        BoilerTaskOrderDO taskOrderDO = boilerTaskOrderMapper.selectById(orderItemDOS.get(0).getOrderId());
+                        com.alibaba.fastjson2.JSONObject params = new com.alibaba.fastjson2.JSONObject();
+                        params.put("checkUserId", orderItemEnterVO.getCheckId());
+                        syncReportVO.setParams(params);
+                        syncReportData(syncReportVO);
+                        addReport.setInstructionId(addInstructionReport.getId());
+
+                        if (taskOrderDO != null){
+                            BoilerTaskOrderItemReportUserDO taskOrderItemReportUserDO = new BoilerTaskOrderItemReportUserDO();
+                            taskOrderItemReportUserDO.setReportId(addInstructionReport.getId());
+
+                            taskOrderItemReportUserDO.setType(orderItemEnterVO.getType());
+                            taskOrderItemReportUserDO.setUserId(orderItemEnterVO.getCheckId());
+                            taskOrderItemReportUserDO.setGroupTeamId(orderItemEnterVO.getGroupTeamId());
+
+                            if (StringUtils.isBlank(orderItemEnterVO.getCheckId())) {
+                                taskOrderItemReportUserDO.setUserId(taskOrderDO.getManagerId());
+                            }
+                            taskOrderItemReportUserMapper.insert(taskOrderItemReportUserDO);
+                        }
                     }
                 }
                 if (Integer.valueOf(400).equals(reportTemplateDO.getTbType())) {
@@ -4161,9 +4263,9 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
         // 记录模板
         DynamicTbInsDO dynamicTbInsDO = dynamicTbInsService.getDynamicRefId(id);
 //        byte[] pdf1 = pdfService.pdf(dynamicTbInsDO.getTbId(), dynamicTbInsDO.getId());
-        byte[] pdf1 = getRecordOutputStreamMerge2(taskOrderItemReportDO.getOrderItemId());
+        byte[] pdf1 = getRecordOutputStreamMerge(taskOrderItemReportDO.getOrderItemId());
         // 报告
-        byte[] pdf2 = getRecordOutputStreamMerge(taskOrderItemReportDO.getOrderItemId());
+        byte[] pdf2 = getReportOutputStreamMerge(taskOrderItemReportDO.getOrderItemId());
         ExternalOAUploadAttachmentRes externalOAUploadAttachmentRes1 = externalOAService.externalOAUploadAttachment(new ByteArrayInputStream(pdf1), "检验记录_" + boilerTaskOrderDO.getOrderNo() + ".pdf");
         ExternalOAUploadAttachmentRes externalOAUploadAttachmentRes2 = externalOAService.externalOAUploadAttachment(new ByteArrayInputStream(pdf2), "检验报告_" + boilerTaskOrderDO.getOrderNo() + ".pdf");
         List<ExternalOAUploadAttachmentRes.Attachment> atts1 = externalOAUploadAttachmentRes1.getAtts();
@@ -5821,7 +5923,7 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
     private PdfService pdfService;
 
     @Override
-    public byte[] getRecordOutputStreamMerge(String orderItemId) {
+    public byte[] getReportOutputStreamMerge(String orderItemId) {
 
 //        List<BoilerTaskOrderItemReportDO> taskOrderReportDOS = taskOrderItemReportMapper.selectList(new LambdaQueryWrapperX<BoilerTaskOrderItemReportDO>().
 //                eq(BoilerTaskOrderItemReportDO::getOrderItemId, orderItemId).
@@ -5853,34 +5955,31 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
         try {
             ByteArrayOutputStream mergeOutputStream = new ByteArrayOutputStream();
             PDFMergerUtility mergerUtility = new PDFMergerUtility();
-            
-            // 使用普通stream替代parallelStream,避免并行处理导致内存溢出
-            for (BoilerTaskOrderItemReportDO taskOrderReportDO : taskOrderReportDOS) {
+
+            taskOrderReportDOS.parallelStream().forEachOrdered(taskOrderReportDO -> {
                 try {
-                    //存在结论报告则放在最前面
-                    if (StringUtil.isNotEmpty(taskOrderReportDO.getResultTemplateId())){
-                        DynamicTbInsDO insResultDO = dynamicTbInsService.getDynamicRefId("result_" + taskOrderReportDO.getId());
-                        if (insResultDO != null) {
-                            byte[] pdf = pdfService.pdf(taskOrderReportDO.getResultTemplateId(), insResultDO.getId());
+                    // 报告模板
+                    if (taskOrderReportDO.getIssueUrl() == null){
+                        DynamicTbInsDO insDO = dynamicTbInsService.getDynamicRefId("report_" + taskOrderReportDO.getId());
+                        if (insDO != null) {
+                            byte[] pdf = pdfService.pdf(taskOrderReportDO.getReportTemplateId(), insDO.getId());
+                            CompletableFuture.runAsync(() -> {
+                                BoilerTaskOrderItemReportDO boilerTaskOrderItemReportDO = boilerTaskOrderItemReportService.getById(taskOrderReportDO.getId());
+                                String file = fileApi.createFile(pdf);
+                                boilerTaskOrderItemReportDO.setIssueUrl(file);
+                                boilerTaskOrderItemReportService.updateById(boilerTaskOrderItemReportDO);
+                            });
                             mergerUtility.addSource(new ByteArrayInputStream(pdf));
-                            // 及时释放PDF字节数组引用
-                            pdf = null;
                         }
-                    }
-
-                    // 报告模板
-                    DynamicTbInsDO insDO = dynamicTbInsService.getDynamicRefId("report_" + taskOrderReportDO.getId());
-                    if (insDO != null) {
-                        byte[] pdf = pdfService.pdf(taskOrderReportDO.getReportTemplateId(), insDO.getId());
-                        mergerUtility.addSource(new ByteArrayInputStream(pdf));
-                        // 及时释放PDF字节数组引用
-                        pdf = null;
+                    }else {
+                        byte[] bytes = fileApi.getFileByPath(taskOrderReportDO.getIssueUrl()).getCheckedData();
+                        mergerUtility.addSource(new ByteArrayInputStream(bytes));
                     }
                 } catch (Exception e) {
                     log.error("处理报告ID: {} 时发生错误", taskOrderReportDO.getId(), e);
                     throw new RuntimeException(e);
                 }
-            }
+            });
             
             // pdf 文件流合并
             mergerUtility.setDestinationStream(mergeOutputStream);
@@ -5924,7 +6023,7 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
      * 记录合并
      * @return
      */
-    public byte[] getRecordOutputStreamMerge2(String orderItemId) {
+    public byte[] getRecordOutputStreamMerge(String orderItemId) {
 
 //        List<BoilerTaskOrderItemReportDO> taskOrderReportDOS = taskOrderItemReportMapper.selectList(new LambdaQueryWrapperX<BoilerTaskOrderItemReportDO>().
 //                eq(BoilerTaskOrderItemReportDO::getOrderItemId, orderItemId).
@@ -5941,23 +6040,37 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
         try {
             ByteArrayOutputStream mergeOutputStream = new ByteArrayOutputStream();
             PDFMergerUtility mergerUtility = new PDFMergerUtility();
-            
+
             // 使用普通循环替代parallelStream,避免并行处理导致内存溢出
-            for (BoilerTaskOrderItemReportDO taskOrderReportDO : taskOrderReportDOS) {
+            taskOrderReportDOS.parallelStream().forEachOrdered(taskOrderReportDO -> {
                 try {
-                    // 报告模板
-                    DynamicTbInsDO insDO = dynamicTbInsService.getDynamicRefId(taskOrderReportDO.getId());
-                    if (insDO != null) {
-                        byte[] pdf = pdfService.pdf(taskOrderReportDO.getTemplateId(), insDO.getId());
-                        mergerUtility.addSource(new ByteArrayInputStream(pdf));
-                        // 及时释放PDF字节数组引用
-                        pdf = null;
+                    if (taskOrderReportDO.getEnterPdfUrl() == null) {
+                        // 报告模板
+                        DynamicTbInsDO insDO = dynamicTbInsService.getDynamicRefId(taskOrderReportDO.getId());
+                        if (insDO != null) {
+                            byte[] pdf = pdfService.pdf(taskOrderReportDO.getTemplateId(), insDO.getId());
+                            byte[] finalPdf = pdf;
+                            CompletableFuture.runAsync(() -> {
+                                BoilerTaskOrderItemReportDO boilerTaskOrderItemReportDO = boilerTaskOrderItemReportService.getById(taskOrderReportDO.getId());
+                                String file = fileApi.createFile(finalPdf);
+                                boilerTaskOrderItemReportDO.setEnterPdfUrl(file);
+                                boilerTaskOrderItemReportService.updateById(boilerTaskOrderItemReportDO);
+                            });
+                            mergerUtility.addSource(new ByteArrayInputStream(pdf));
+                            // 及时释放PDF字节数组引用
+                            pdf = null;
+                        }
+                    } else {
+                            byte[] bytes = fileApi.getFileByPath(taskOrderReportDO.getEnterPdfUrl()).getCheckedData();
+                            mergerUtility.addSource(new ByteArrayInputStream(bytes));
+                            // 及时释放PDF字节数组引用
+                            bytes = null;
                     }
                 } catch (Exception e) {
                     log.error("处理报告ID: {} 时发生错误", taskOrderReportDO.getId(), e);
                     throw new RuntimeException(e);
                 }
-            }
+            });
             
             // pdf 文件流合并
             mergerUtility.setDestinationStream(mergeOutputStream);

+ 1 - 1
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorderissuereport/BoilerTaskOrderIssueReportServiceImpl.java

@@ -2806,7 +2806,7 @@ public class BoilerTaskOrderIssueReportServiceImpl extends ServiceImpl<BoilerTas
         if (StringUtils.isNotEmpty(taskOrderItemDO.getIssueUrl())) {
             fileUrl = taskOrderItemDO.getIssueUrl();
         } else {
-            byte[] pdfByte = taskOrderService.getRecordOutputStreamMerge(taskOrderItemDO.getId());
+            byte[] pdfByte = taskOrderService.getReportOutputStreamMerge(taskOrderItemDO.getId());
             if (pdfByte != null){
                 fileUrl = fileApi.createFile(pdfByte);
             }

+ 5 - 92
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorderitemreport/BoilerTaskOrderItemReportServiceImpl.java

@@ -140,104 +140,17 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
     @Override
     public void reportOperationInstruction(BoilerTaskOrderItemReportSaveReqVO taskOrderItemReportSaveReqVO) {
 
-        if (StringUtils.isEmpty(taskOrderItemReportSaveReqVO.getInstructionPrepareJson()) || StringUtils.isEmpty(taskOrderItemReportSaveReqVO.getInstructionId())) {
-            throw exception(new ErrorCode(1001, "操作指导书JSON数据不能为空/操作指导书不能为空"));
+        if (StringUtils.isEmpty(taskOrderItemReportSaveReqVO.getId()) || StringUtils.isEmpty(taskOrderItemReportSaveReqVO.getInstructionId())) {
+            throw exception(new ErrorCode(1001, "报告ID或操作指导书ID不能为空"));
         }
 
         BoilerTaskOrderItemReportDO taskOrderItemReportDO = boilerTaskOrderItemReportMapper.selectById(taskOrderItemReportSaveReqVO.getId());
         if (ObjectUtil.isEmpty(taskOrderItemReportDO) || !Integer.valueOf(300).equals(taskOrderItemReportDO.getReportType())) {
-            throw exception(new ErrorCode(1001, "报告不存在/报告不支持添加操作指导书"));
+            throw exception(new ErrorCode(1001, "报告不存在或报告类型不支持关联操作指导书"));
         }
 
-        // 获取报告模版信息
-        ReportTemplateDO reportTemplateDO = reportTemplateMapper.selectById(taskOrderItemReportDO.getTemplateId());
-        if (ObjectUtil.isEmpty(reportTemplateDO)) {
-            throw exception(new ErrorCode(1001, "报告模版不存在"));
-        }
-
-        if (StringUtils.isEmpty(reportTemplateDO.getInstructionTempId())) {
-            throw exception(new ErrorCode(1001, "当前报告模版尚未配置操作指导书"));
-        }
-
-        // 获取操作指导书报告信息
-        BoilerTaskOrderItemReportDO taskOrderItemReportDO1 = boilerTaskOrderItemReportMapper.selectById(taskOrderItemReportSaveReqVO.getInstructionId());
-        if (ObjectUtil.isEmpty(taskOrderItemReportDO1) || StringUtils.isEmpty(taskOrderItemReportDO1.getTemplateId())) {
-            throw exception(new ErrorCode(1001, "操作指导书报告不存在/操作指导书报告模版ID不存在"));
-        }
-
-        List<String> instructionTempIds = List.of(reportTemplateDO.getInstructionTempId().split(","));
-        if (!instructionTempIds.contains(taskOrderItemReportDO1.getTemplateId())) {
-            throw exception(new ErrorCode(1001, "报告与操作指导书不匹配"));
-        }
-
-        String instructionPrepareJson = taskOrderItemReportSaveReqVO.getInstructionPrepareJson();
-        String finalPrepareJson = instructionPrepareJson;
-
-        if (StringUtils.isEmpty(taskOrderItemReportDO.getPrepareJson())) {
-            try {
-                ObjectMapper objectMapper = new ObjectMapper();
-                JsonNode jsonNode = objectMapper.readTree(instructionPrepareJson);
-
-                String reportNo = jsonNode.has("reportNo") ? jsonNode.get("reportNo").asText() : "";
-
-                ObjectNode modifiedJson = (ObjectNode) jsonNode;
-                modifiedJson.remove("reportNo");
-                modifiedJson.put("instructionNo", reportNo);
-
-                finalPrepareJson = objectMapper.writeValueAsString(modifiedJson);
-
-            } catch (Exception e) {
-                throw exception(new ErrorCode(1001, "操作指导书JSON数据格式错误"));
-            }
-        } else {
-            //只比较相同的字段进行更新
-            try {
-                ObjectMapper objectMapper = new ObjectMapper();
-
-                // 解析现有的prepareJson
-                JsonNode existingJson = objectMapper.readTree(taskOrderItemReportDO.getPrepareJson());
-                // 解析新的instructionPrepareJson
-                JsonNode newJson = objectMapper.readTree(instructionPrepareJson);
-
-                // 创建新的JSON对象,基于现有的prepareJson
-                ObjectNode resultJson = objectMapper.createObjectNode();
-
-                // 复制现有JSON的所有字段
-                existingJson.fields().forEachRemaining(entry -> {
-                    resultJson.set(entry.getKey(), entry.getValue());
-                });
-
-                // 提取新JSON中的reportNo值,更新到instructionNo字段
-                if (newJson.has("reportNo")) {
-                    String reportNo = newJson.get("reportNo").asText();
-                    resultJson.put("instructionNo", reportNo);
-                }
-
-                // 比较并更新相同字段(除了reportNo字段)
-                newJson.fields().forEachRemaining(entry -> {
-                    String fieldName = entry.getKey();
-                    JsonNode newValue = entry.getValue();
-
-                    // 如果现有JSON中也存在这个字段,且不是reportNo字段,则更新它
-                    if (existingJson.has(fieldName) && !"reportNo".equals(fieldName)) {
-                        resultJson.set(fieldName, newValue);
-                    }
-                });
-
-                finalPrepareJson = objectMapper.writeValueAsString(resultJson);
-
-            } catch (Exception e) {
-                throw exception(new ErrorCode(1001, "JSON数据格式错误或处理失败"));
-            }
-        }
-
-        // 更新数据库
-        LambdaUpdateWrapper<BoilerTaskOrderItemReportDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
-        lambdaUpdateWrapper.eq(BoilerTaskOrderItemReportDO::getId, taskOrderItemReportDO.getId());
-        lambdaUpdateWrapper.set(BoilerTaskOrderItemReportDO::getInstructionId, taskOrderItemReportSaveReqVO.getInstructionId());
-        lambdaUpdateWrapper.set(BoilerTaskOrderItemReportDO::getPrepareJson, finalPrepareJson);
-        boilerTaskOrderItemReportMapper.update(null, lambdaUpdateWrapper);
-
+        taskOrderItemReportDO.setInstructionId(taskOrderItemReportSaveReqVO.getInstructionId());
+        boilerTaskOrderItemReportMapper.updateById(taskOrderItemReportDO);
     }
 
     @Override

+ 1 - 1
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorder/PipeTaskOrderService.java

@@ -177,7 +177,7 @@ public interface PipeTaskOrderService extends IService<PipeTaskOrderDO>  {
 
     void orderConfirmFinish(OrderConfirmFinishVO orderItemRatifyVO);
 
-    byte[] getRecordOutputStreamMerge(String orderId);
+    byte[] getReportOutputStreamMerge(String orderId);
 
     PageResult<AdminUserRespDTO> getRecheckUserPage(PipeRecheckUserPageReqVO pageReqVO);
 

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

@@ -862,6 +862,22 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
                                     addReport1.setReportType(200);
                                 } else if ("STANDALONE".equals(recordReportDO.getProjectType())) {
                                     addReport1.setReportType(300);
+                                    // 独审报告自动带出操作指导书
+                                    PipeTaskOrderItemReportDO addInstructionReport = new PipeTaskOrderItemReportDO();
+                                    addInstructionReport.setTemplateId(recordReportDO.getOperationInstruction());
+                                    addInstructionReport.setOrderId(taskOrderDO.getId());
+                                    addInstructionReport.setTaskStatus(TaskOrderStatusEnum.ENTER.getStatus());
+                                    addInstructionReport.setFeeType(item.getType());
+                                    addInstructionReport.setProjectId(recordReportDO.getId());
+                                    addInstructionReport.setFee(item.getFee());
+                                    DynamicTbDO dynamicTbDO1 = dynamicTbMapper.selectById(recordReportDO.getOperationInstruction());
+                                    addInstructionReport.setReportName(dynamicTbDO1.getTbName());
+                                    addInstructionReport.setReportType(700);
+
+                                    addInstructionReport.setReportNo(reportNo);
+
+                                    // 新增报告
+                                    insertList.add(addInstructionReport);
                                 }
 
                                 //使用配置的项目名称
@@ -1556,8 +1572,68 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
                             addReport.setReportType(100);
                         }else if ("SUB".equals(connectDO.getProjectType())){
                             addReport.setReportType(200);
-                        }else if ("STANDALONE".equals(connectDO.getProjectType())){
+                        } else if ("STANDALONE".equals(connectDO.getProjectType())) {
                             addReport.setReportType(300);
+
+                            // 独审报告自动带出操作指导书
+                            PipeTaskOrderItemReportDO addInstructionReport = new PipeTaskOrderItemReportDO();
+                            addInstructionReport.setTemplateId(connectDO.getOperationInstruction());
+                            addInstructionReport.setOrderId(orderId);
+                            addInstructionReport.setTaskStatus(TaskOrderStatusEnum.ENTER.getStatus());
+                            addInstructionReport.setSort(count + 1 + i);
+                            addInstructionReport.setFeeType(vo.getType());
+
+                            addInstructionReport.setProjectId(connectDO.getId());
+                            if (vo.getFee() == null || vo.getFee().compareTo(BigDecimal.ZERO) == 0) {
+                                addInstructionReport.setFee(ConversionUtil.convert(connectDO.getFee()));
+                            } else {
+                                addInstructionReport.setFee(vo.getFee());
+                            }
+                            DynamicTbDO dynamicTbDO = dynamicTbMapper.selectById(connectDO.getOperationInstruction());
+                            addInstructionReport.setReportName(dynamicTbDO.getTbName());
+                            addInstructionReport.setReportType(700);
+
+
+
+                            String reportNo = "";
+                            PipeTaskOrderItemReportDO mainReport = taskOrderItemReportMapper.selectOne(new LambdaQueryWrapperX<PipeTaskOrderItemReportDO>().
+                                    eq(PipeTaskOrderItemReportDO::getOrderId, orderId), false);
+                            if (mainReport != null) {
+                                reportNo = mainReport.getReportNo();
+                            }
+
+                            addInstructionReport.setReportNo(reportNo);
+
+                            // 新增报告
+                            taskOrderItemReportMapper.insert(addInstructionReport);
+                            //生成 报表数据
+                            BoilerTaskOrderSyncReportVO syncReportVO = new BoilerTaskOrderSyncReportVO();
+                            syncReportVO.setRefId(addInstructionReport.getId());
+                            syncReportVO.setReportType("record");
+                            PipeTaskOrderDO taskOrderDO = pipeTaskOrderMapper.selectById(orderId);
+                            com.alibaba.fastjson2.JSONObject params = new com.alibaba.fastjson2.JSONObject();
+                            if (taskOrderDO != null && StringUtils.isBlank(orderItemEnterVO.getCheckId())) {
+                                params.put("checkUserId",taskOrderDO.getManagerId());
+                            }else{
+                                params.put("checkUserId",orderItemEnterVO.getCheckId());
+                            }
+                            syncReportVO.setParams(params);
+                            syncReportData(syncReportVO);
+                            addReport.setInstructionId(addInstructionReport.getId());
+
+                            if (taskOrderDO != null){
+                                PipeTaskOrderItemReportUserDO taskOrderItemReportUserDO = new PipeTaskOrderItemReportUserDO();
+                                taskOrderItemReportUserDO.setReportId(addInstructionReport.getId());
+
+                                taskOrderItemReportUserDO.setType(orderItemEnterVO.getType());
+                                taskOrderItemReportUserDO.setUserId(orderItemEnterVO.getCheckId());
+                                taskOrderItemReportUserDO.setGroupTeamId(orderItemEnterVO.getGroupTeamId());
+
+                                if (StringUtils.isBlank(orderItemEnterVO.getCheckId())) {
+                                    taskOrderItemReportUserDO.setUserId(taskOrderDO.getManagerId());
+                                }
+                                pipeTaskOrderItemReportUserMapper.insert(taskOrderItemReportUserDO);
+                            }
                         }
                     }
                     if (Integer.valueOf(400).equals(reportTemplateDO.getTbType())) {
@@ -3323,9 +3399,9 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
         // 记录模板
         DynamicTbInsDO dynamicTbInsDO1 = dynamicTbInsService.getDynamicRefId(taskOrderItemReportDO.getId());
 //        byte[] pdf1 =  pdfService.pdf(dynamicTbInsDO1.getTbId(), dynamicTbInsDO1.getId());
-        byte[] pdf1 =getRecordOutputStreamMerge2(pipeTaskOrderDO.getId());
+        byte[] pdf1 =getRecordOutputStreamMerge(pipeTaskOrderDO.getId());
         // 报告模板
-        byte[] pdf2 =getRecordOutputStreamMerge(pipeTaskOrderDO.getId());
+        byte[] pdf2 =getReportOutputStreamMerge(pipeTaskOrderDO.getId());
 //        byte[] pdf2 = externalOAService.pdf(dynamicTbInsDO1.getTbId(), dynamicTbInsDO1.getId());
         ExternalOAUploadAttachmentRes externalOAUploadAttachmentRes1 = externalOAService.externalOAUploadAttachment(new ByteArrayInputStream(pdf1), "检验记录_" + pipeTaskOrderDO.getOrderNo() + ".pdf");
         ExternalOAUploadAttachmentRes externalOAUploadAttachmentRes2 = externalOAService.externalOAUploadAttachment(new ByteArrayInputStream(pdf2), "检验报告_" + pipeTaskOrderDO.getOrderNo() + ".pdf");
@@ -5075,7 +5151,7 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
     @Resource
     private PdfService pdfService;
     @Override
-    public byte[] getRecordOutputStreamMerge(String orderId) {
+    public byte[] getReportOutputStreamMerge(String orderId) {
 
 //        List<PipeTaskOrderItemReportDO> taskOrderReportDOS = taskOrderItemReportMapper.selectList(new LambdaQueryWrapperX<PipeTaskOrderItemReportDO>().
 //                eq(PipeTaskOrderItemReportDO::getOrderId, orderId).
@@ -5109,8 +5185,7 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
             ByteArrayOutputStream mergeOutputStream = new ByteArrayOutputStream();
             PDFMergerUtility mergerUtility = new PDFMergerUtility();
 
-            // 使用普通循环替代parallelStream,避免并行处理导致内存溢出
-            for (PipeTaskOrderItemReportDO taskOrderReportDO : taskOrderReportDOS) {
+            taskOrderReportDOS.parallelStream().forEachOrdered(taskOrderReportDO -> {
                 try {
 
                     //存在结论报告则放在最前面
@@ -5125,18 +5200,32 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
                     }
 
                     // 报告模板
-                    DynamicTbInsDO insDO = dynamicTbInsService.getDynamicRefId("report_" + taskOrderReportDO.getId());
-                    if (insDO != null) {
-                        byte[] pdf = pdfService.pdf(taskOrderReportDO.getReportTemplateId(), insDO.getId());
-                        mergerUtility.addSource(new ByteArrayInputStream(pdf));
+                    if (taskOrderReportDO.getIssueUrl() == null) {
+                        DynamicTbInsDO insDO = dynamicTbInsService.getDynamicRefId("report_" + taskOrderReportDO.getId());
+                        if (insDO != null) {
+                            byte[] pdf = pdfService.pdf(taskOrderReportDO.getReportTemplateId(), insDO.getId());
+                            byte[] finalPdf = pdf;
+                            CompletableFuture.runAsync(() -> {
+                                PipeTaskOrderItemReportDO pipeTaskOrderItemReportDO = taskOrderItemReportMapper.selectById(taskOrderReportDO.getId());
+                                String file = fileApi.createFile(finalPdf);
+                                pipeTaskOrderItemReportDO.setIssueUrl(file);
+                                taskOrderItemReportMapper.updateById(pipeTaskOrderItemReportDO);
+                            });
+                            mergerUtility.addSource(new ByteArrayInputStream(pdf));
+                            // 及时释放PDF字节数组引用
+                            pdf = null;
+                        }
+                    } else {
+                        byte[] bytes = fileApi.getFileByPath(taskOrderReportDO.getIssueUrl()).getCheckedData();
+                        mergerUtility.addSource(new ByteArrayInputStream(bytes));
                         // 及时释放PDF字节数组引用
-                        pdf = null;
+                        bytes = null;
                     }
                 } catch (Exception e) {
                     log.error("处理报告ID: {} 时发生错误", taskOrderReportDO.getId(), e);
                     throw new RuntimeException(e);
                 }
-            }
+            });
             
             // pdf 文件流合并
             mergerUtility.setDestinationStream(mergeOutputStream);
@@ -5185,7 +5274,7 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
      * 合并记录pdf
      * @return
      */
-    public byte[] getRecordOutputStreamMerge2(String orderId) {
+    public byte[] getRecordOutputStreamMerge(String orderId) {
 
 //        List<PipeTaskOrderItemReportDO> taskOrderReportDOS = taskOrderItemReportMapper.selectList(new LambdaQueryWrapperX<PipeTaskOrderItemReportDO>().
 //                eq(PipeTaskOrderItemReportDO::getOrderId, orderId).
@@ -5204,23 +5293,35 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
             ByteArrayOutputStream mergeOutputStream = new ByteArrayOutputStream();
             PDFMergerUtility mergerUtility = new PDFMergerUtility();
 
-            // 使用普通循环替代parallelStream,避免并行处理导致内存溢出
-            for (PipeTaskOrderItemReportDO taskOrderReportDO : taskOrderReportDOS) {
+            taskOrderReportDOS.parallelStream().forEachOrdered(taskOrderReportDO -> {
                 try {
-
-                    // 报告模板
-                    DynamicTbInsDO insDO = dynamicTbInsService.getDynamicRefId(taskOrderReportDO.getId());
-                    if (insDO != null) {
-                        byte[] pdf = pdfService.pdf(taskOrderReportDO.getTemplateId(), insDO.getId());
-                        mergerUtility.addSource(new ByteArrayInputStream(pdf));
+                    if (taskOrderReportDO.getEnterPdfUrl() == null) {
+                        // 报告模板
+                        DynamicTbInsDO insDO = dynamicTbInsService.getDynamicRefId(taskOrderReportDO.getId());
+                        if (insDO != null) {
+                            byte[] pdf = pdfService.pdf(taskOrderReportDO.getTemplateId(), insDO.getId());
+                            byte[] finalPdf = pdf;
+                            CompletableFuture.runAsync(() -> {
+                                PipeTaskOrderItemReportDO pipeTaskOrderItemReportDO = taskOrderItemReportMapper.selectById(taskOrderReportDO.getId());
+                                String file = fileApi.createFile(finalPdf);
+                                pipeTaskOrderItemReportDO.setEnterPdfUrl(file);
+                                taskOrderItemReportMapper.updateById(pipeTaskOrderItemReportDO);
+                            });
+                            mergerUtility.addSource(new ByteArrayInputStream(pdf));
+                            // 及时释放PDF字节数组引用
+                            pdf = null;
+                        }
+                    } else {
+                        byte[] bytes = fileApi.getFileByPath(taskOrderReportDO.getEnterPdfUrl()).getCheckedData();
+                        mergerUtility.addSource(new ByteArrayInputStream(bytes));
                         // 及时释放PDF字节数组引用
-                        pdf = null;
+                        bytes = null;
                     }
                 } catch (Exception e) {
                     log.error("处理报告ID: {} 时发生错误", taskOrderReportDO.getId(), e);
                     throw new RuntimeException(e);
                 }
-            }
+            });
             
             // pdf 文件流合并
             mergerUtility.setDestinationStream(mergeOutputStream);

+ 1 - 1
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorderissuereport/PipeTaskOrderIssueReportServiceImpl.java

@@ -2792,7 +2792,7 @@ public class PipeTaskOrderIssueReportServiceImpl extends ServiceImpl<PipeTaskOrd
         if (StringUtils.isNotEmpty(taskOrderDO.getIssueUrl())) {
             fileUrl = taskOrderDO.getIssueUrl();
         } else {
-            byte[] pdfByte = taskOrderService.getRecordOutputStreamMerge(taskOrderDO.getId());
+            byte[] pdfByte = taskOrderService.getReportOutputStreamMerge(taskOrderDO.getId());
             if (pdfByte != null){
                 fileUrl = fileApi.createFile(pdfByte);
             }

+ 10 - 2
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorderitemreport/PipeTaskOrderItemReportServiceImpl.java

@@ -74,7 +74,7 @@ import cn.start.tz.framework.common.pojo.PageResult;
 import cn.start.tz.framework.common.util.object.BeanUtils;
 
 import cn.start.tz.module.pressure2.dal.mysql.pipetaskorderitemreport.PipeTaskOrderItemReportMapper;
-
+import org.apache.commons.lang3.StringUtils;
 import static cn.start.tz.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.start.tz.framework.common.exception.util.ServiceExceptionUtil.exception0;
 import static cn.start.tz.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@@ -148,7 +148,15 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
 
     @Override
     public void reportOperationInstruction(PipeTaskOrderItemReportSaveReqVO taskOrderItemReportSaveReqVO) {
-
+        if (StringUtils.isEmpty(taskOrderItemReportSaveReqVO.getId()) || StringUtils.isEmpty(taskOrderItemReportSaveReqVO.getInstructionId())) {
+            throw exception(new ErrorCode(1001, "报告ID或操作指导书ID不能为空"));
+        }
+        PipeTaskOrderItemReportDO report = pipeTaskOrderItemReportMapper.selectById(taskOrderItemReportSaveReqVO.getId());
+        if (report == null || !Integer.valueOf(300).equals(report.getReportType())) {
+            throw exception(new ErrorCode(1001, "报告不存在或报告类型不支持关联操作指导书"));
+        }
+        report.setInstructionId(taskOrderItemReportSaveReqVO.getInstructionId());
+        pipeTaskOrderItemReportMapper.updateById(report);
     }
 
     @Override