Ver Fonte

refactor(report): 优化报告生成服务的数据处理方式

- 将ByteArrayOutputStream改为byte[]数组以简化数据流处理
- 更新接口定义和服务实现中的方法返回类型
- 移除不必要的PDF合并操作,直接返回PDF字节数据
- 修改任务订单账单服务中的检查类型显示逻辑
- 增强PDF转图片功能的参数验证和错误处理机制
- 添加AppAuthContextHolder用于获取用户ID替代SecurityFrameworkUtils
xuzhancheng há 4 dias atrás
pai
commit
7eac84ab32

+ 5 - 5
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/app/taskorderitemreport/BoilerAppReportTemplateController.java

@@ -51,13 +51,13 @@ public class BoilerAppReportTemplateController {
         PipeTaskOrderInputPrintReqVO reqVO = new PipeTaskOrderInputPrintReqVO();
         reqVO.setTemplateId(reportPreviewVO.getTemplateId());
         reqVO.setId(reportPreviewVO.getId());
-        ByteArrayOutputStream byteArrayOutputStream = pipeTaskOrderInputService.printPipeTaskOrderInput(reqVO);
+        byte[] bytes = pipeTaskOrderInputService.printPipeTaskOrderInput(reqVO);
         if (Integer.valueOf(100).equals(reportPreviewVO.getFileType())) {
             response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
         } else {
             response.setContentType("application/pdf");
         }
-        response.getOutputStream().write(byteArrayOutputStream.toByteArray());
+        response.getOutputStream().write(bytes);
     }
 
     @PostMapping("/inspection-opinion/reportPreview")
@@ -70,10 +70,10 @@ public class BoilerAppReportTemplateController {
         BoilerTaskOrderItemReportDO byId = boilerTaskOrderItemReportService.getById(reportPreviewVO.getId());
         reqVO.setTemplateId(byId.getTemplateId());
         reqVO.setId(reportPreviewVO.getId());
-        ByteArrayOutputStream byteArrayOutputStream = pipeTaskOrderInputService.printPipeTaskOrderInput(reqVO);
+        byte[] bytes = pipeTaskOrderInputService.printPipeTaskOrderInput(reqVO);
         // 文件类型为 100 时转换为图片(用于小程序预览)
         if (Integer.valueOf(100).equals(reportPreviewVO.getFileType())) {
-            byteArrayOutputStream = taskSignService.pdfToImage(byteArrayOutputStream.toByteArray());
+            bytes = taskSignService.pdfToImage(bytes).toByteArray();
         }
         if (Integer.valueOf(100).equals(reportPreviewVO.getFileType())) {
             response.setContentType("image/png");
@@ -81,7 +81,7 @@ public class BoilerAppReportTemplateController {
             response.setContentType("application/pdf");
             response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode("检验意见.pdf", StandardCharsets.UTF_8));
         }
-        response.getOutputStream().write(byteArrayOutputStream.toByteArray());
+        response.getOutputStream().write(bytes);
     }
 
     @PostMapping("/service-from/printFrom")

+ 5 - 5
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/app/taskorderitemreport/PipeAppReportTemplateController.java

@@ -48,13 +48,13 @@ public class PipeAppReportTemplateController {
         PipeTaskOrderInputPrintReqVO reqVO = new PipeTaskOrderInputPrintReqVO();
         reqVO.setTemplateId(reportPreviewVO.getTemplateId());
         reqVO.setId(reportPreviewVO.getId());
-        ByteArrayOutputStream byteArrayOutputStream = pipeTaskOrderInputService.printPipeTaskOrderInput(reqVO);
+        byte[] bytes = pipeTaskOrderInputService.printPipeTaskOrderInput(reqVO);
         if (Integer.valueOf(100).equals(reportPreviewVO.getFileType())) {
             response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
         } else {
             response.setContentType("application/pdf");
         }
-        response.getOutputStream().write(byteArrayOutputStream.toByteArray());
+        response.getOutputStream().write(bytes);
     }
 
     @PostMapping("/inspection-opinion/reportPreview")
@@ -66,10 +66,10 @@ public class PipeAppReportTemplateController {
         PipeTaskOrderItemReportDO byId = pipeTaskOrderItemReportService.getById(reportPreviewVO.getId());
         reqVO.setTemplateId(byId.getTemplateId());
         reqVO.setId(reportPreviewVO.getId());
-        ByteArrayOutputStream byteArrayOutputStream = pipeTaskOrderInputService.printPipeTaskOrderInput(reqVO);
+        byte[] bytes = pipeTaskOrderInputService.printPipeTaskOrderInput(reqVO);
         // 文件类型为 100 时转换为图片(用于小程序预览)
         if (Integer.valueOf(100).equals(reportPreviewVO.getFileType())) {
-            byteArrayOutputStream = taskSignService.pdfToImage(byteArrayOutputStream.toByteArray());
+            bytes = taskSignService.pdfToImage(bytes).toByteArray();
         }
         if (Integer.valueOf(100).equals(reportPreviewVO.getFileType())) {
             response.setContentType("image/png");
@@ -77,7 +77,7 @@ public class PipeAppReportTemplateController {
             response.setContentType("application/pdf");
             response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode("检验意见.pdf", StandardCharsets.UTF_8));
         }
-        response.getOutputStream().write(byteArrayOutputStream.toByteArray());
+        response.getOutputStream().write(bytes);
     }
 
 

+ 4 - 3
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorderitemreport/BoilerAppTaskOrderItemReportServiceImpl.java

@@ -15,6 +15,7 @@ import cn.start.tz.module.pressure2.controller.admin.boilertaskorderitemreport.v
 import cn.start.tz.module.pressure2.controller.app.taskorderitemreport.vo.InspectionOpinionUploadReqVo;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreport.BoilerTaskOrderItemReportDO;
 import cn.start.tz.module.pressure2.dal.mysql.boilertaskorderitemreport.BoilerTaskOrderItemReportMapper;
+import cn.start.tz.module.pressure2.framework.appauth.core.context.AppAuthContextHolder;
 import cn.start.tz.module.pressure2.service.boilertaskorder.BoilerTaskOrderService;
 import jakarta.annotation.Resource;
 import jodd.util.StringUtil;
@@ -58,11 +59,11 @@ public class BoilerAppTaskOrderItemReportServiceImpl implements BoilerAppTaskOrd
     public PageResult<BoilerOrderItemPageRespVO> appInspectionOpinionPage(BoilerTaskOrderPageReqVO pageReqVO) {
         // 不传单位code时根据当前登录人memberId查询
 //        if (StringUtils.isEmpty(pageReqVO.getUnitCode())) {
-//            LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
-//            if (ObjectUtil.isEmpty(loginUser) || StringUtils.isEmpty(loginUser.getId())) {
+//            String userId = AppAuthContextHolder.getUserId();
+//            if (ObjectUtil.isEmpty(userId) || StringUtils.isEmpty(userId)) {
 //                return new PageResult<>();
 //            }
-//            pageReqVO.setMemberId(loginUser.getId());
+//            pageReqVO.setMemberId(userId);
 //        }
         pageReqVO.setRecipientPhone(null);
         return boilerTaskOrderService.inspectionOpinionPage(pageReqVO);

+ 2 - 1
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorderinput/PipeTaskOrderInputService.java

@@ -69,7 +69,8 @@ public interface PipeTaskOrderInputService extends IService<PipeTaskOrderInputDO
      *
      * @param printReqVO 打印信息
      */
-    ByteArrayOutputStream printPipeTaskOrderInput(PipeTaskOrderInputPrintReqVO printReqVO) throws Exception;
+
+    byte[] printPipeTaskOrderInput(PipeTaskOrderInputPrintReqVO printReqVO) throws Exception;
 
     /**
      * 下载管道检测项目,打包成压缩包

+ 4 - 9
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorderinput/PipeTaskOrderInputServiceImpl.java

@@ -117,17 +117,12 @@ public class PipeTaskOrderInputServiceImpl extends ServiceImpl<PipeTaskOrderInpu
     }
 
     @Override
-    public ByteArrayOutputStream printPipeTaskOrderInput(PipeTaskOrderInputPrintReqVO printReqVO) throws Exception {
-        ByteArrayOutputStream mergeOutputStream = new ByteArrayOutputStream();
-        PDFMergerUtility mergerUtility = new PDFMergerUtility();
+    public byte[] printPipeTaskOrderInput(PipeTaskOrderInputPrintReqVO printReqVO) throws Exception {
+//        ByteArrayOutputStream mergeOutputStream = new ByteArrayOutputStream();
+//        PDFMergerUtility mergerUtility = new PDFMergerUtility();
         String templateId = printReqVO.getTemplateId();
         String instanceId = dynamicTbInsService.getDynamicRefId(printReqVO.getId()).getId();
-        byte[] pdf = pdfService.pdf(templateId, instanceId);
-        mergerUtility.addSource(new ByteArrayInputStream(pdf));
-
-        mergerUtility.setDestinationStream(mergeOutputStream);
-        mergerUtility.mergeDocuments(null);
-        return mergeOutputStream;
+        return pdfService.pdf(templateId, instanceId);
     }
 
     @Override

+ 2 - 2
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/taskorderbill/TaskOrderBillServiceImpl.java

@@ -368,7 +368,7 @@ public class TaskOrderBillServiceImpl implements TaskOrderBillService {
         paymentVo.setOrderNo(vo.getOrderNo());
         paymentVo.setUnitName(vo.getUnitName());
         paymentVo.setCheckType(vo.getCheckType());
-        paymentVo.setCheckTypeStr("锅炉-" + getBoilerCheckTypeDesc(vo.getCheckType()));
+        paymentVo.setCheckTypeStr(getBoilerCheckTypeDesc(vo.getCheckType()));
         paymentVo.setCheckDate(vo.getCheckDate());
         setAddressInfo(paymentVo, vo.getEquipDistrictName(), vo.getEquipStreetName());
         paymentVo.setEquipDistrict(vo.getEquipDistrict());
@@ -397,7 +397,7 @@ public class TaskOrderBillServiceImpl implements TaskOrderBillService {
         paymentVo.setOrderNo(vo.getOrderNo());
         paymentVo.setUnitName(vo.getUnitName());
         paymentVo.setCheckType(vo.getCheckType());
-        paymentVo.setCheckTypeStr("管道-" + getPipeCheckTypeDesc(vo.getCheckType()));
+        paymentVo.setCheckTypeStr(getPipeCheckTypeDesc(vo.getCheckType()));
         paymentVo.setCheckDate(vo.getCheckDate());
         Area area1 = AreaUtils.getArea(vo.getEquipDistrict());
         Area area2 = AreaUtils.getArea(vo.getEquipStreet());

+ 18 - 2
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/tasksign/TaskSignServiceImpl.java

@@ -57,6 +57,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
@@ -401,7 +402,7 @@ public class TaskSignServiceImpl implements TaskSignService {
     }
 
     /**
-     * 将PDF转为PNG图片流(用于小程序预览)
+     * 将PDF转为PNG图片流(用于小程序预览)
      *
      * @param pdfBytes PDF文件字节数组
      * @return PNG图片的字节输出流
@@ -409,13 +410,28 @@ public class TaskSignServiceImpl implements TaskSignService {
      */
     @Override
     public ByteArrayOutputStream pdfToImage(byte[] pdfBytes) throws Exception {
+        // 参数校验
+        if (pdfBytes == null || pdfBytes.length == 0) {
+            throw new ServiceException(400, "PDF数据不能为空");
+        }
+    
+        // 验证PDF文件格式(至少需要包含 %PDF 标识)
+        if (pdfBytes.length < 5 || !(pdfBytes[0] == '%' && pdfBytes[1] == 'P' && pdfBytes[2] == 'D' && pdfBytes[3] == 'F')) {
+            log.error("无效的PDF文件格式,文件大小: {} bytes, 前10字节: {}", pdfBytes.length, 
+                    java.util.Arrays.toString(java.util.Arrays.copyOfRange(pdfBytes, 0, Math.min(10, pdfBytes.length))));
+            throw new ServiceException(400, "文件格式不正确,不是有效的PDF文件");
+        }
+    
         try (PDDocument document = PDDocument.load(new ByteArrayInputStream(pdfBytes))) {
             PDFRenderer pdfRenderer = new PDFRenderer(document);
             BufferedImage image = pdfRenderer.renderImageWithDPI(0, 150);
             ByteArrayOutputStream bos = new ByteArrayOutputStream();
             ImageIO.write(image, "png", bos);
-
+    
             return bos;
+        } catch (IOException e) {
+            log.error("PDF转图片失败,文件大小: {} bytes, 错误信息: {}", pdfBytes.length, e.getMessage(), e);
+            throw new ServiceException(500, "PDF文件解析失败,可能文件已损坏或格式不正确");
         }
     }