From 04b68647b3b8d54cf19705d31e78bf484bf15318 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Wed, 1 Oct 2025 08:49:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20bug-779=20=E7=94=9F=E4=BA=A7=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=85=A5=E5=BA=93=E9=9C=80=E8=A6=81=E5=8F=AF=E5=A4=9A?= =?UTF-8?q?=E4=B8=AA=E7=94=9F=E4=BA=A7=E8=AE=A2=E5=8D=95=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/InProduceOrderController.java | 29 ++++++++---- .../nflg/wms/admin/util/PdfGeneratorUtil.java | 44 ++++++++++++++++--- 2 files changed, 57 insertions(+), 16 deletions(-) diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java index acce04c4..9a9cc8ef 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/InProduceOrderController.java @@ -31,6 +31,7 @@ import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.ClassPathResource; @@ -304,23 +305,34 @@ public class InProduceOrderController extends BaseController { } /** - * 导出报工单PDF + * 导出报工单PDF(单个) * @param id 订单id */ @GetMapping("exportOrderPdf") public void exportDeliverOrder(HttpServletResponse response, @Valid @RequestParam @NotNull Long id) throws Exception { + PdfGeneratorUtil.generatePdf("生产入库单", exportHtml(id), response); + } + + /** + * 导出报工单PDF(批量) + * @param ids 订单id列表 + */ + @PostMapping("exportOrderPdf1") + public void exportDeliverOrder1(HttpServletResponse response, @Valid @RequestBody @NotEmpty List ids) throws Exception { + List htmls = new ArrayList<>(); + for (Long id : ids) { + htmls.add(exportHtml(id)); + } + PdfGeneratorUtil.generatePdf("生产入库单", htmls, response); + } + + private String exportHtml(Long id) { WmsInProduceOrder order = produceOrderService.getById(id); VUtil.trueThrowBusinessError(Objects.isNull(order)).throwMessage("订单不存在"); List list = produceOrderItemService.getVOByOrderId(id); if (order.getList()) { list.removeIf(item -> Objects.equals(item.getParentId(), 0L)); } -// WmsInProduceOrder order = new WmsInProduceOrder() -// .setNo(NoUtil.getInProduceNo()); -// List list = new ArrayList<>(); -// for (int i = 0, count = RandomUtil.randomInt(1, 100); i < count; i++) { -// list.add(new InProduceOrderItemVO().setMaterialNo(RandomUtil.randomNumbers(10)).setMaterialDesc("非金属联件和紧固件等 M6 DIN 982 不锈钢304")); -// } InProduceOrderItemVO first = list.get(0); Map base = new HashMap<>(); base.put("date", DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd")); @@ -331,8 +343,7 @@ public class InProduceOrderController extends BaseController { variables.put("info", order); variables.put("base", base); variables.put("pages", PdfPageDTO.create(list, 17, new InProduceOrderItemVO())); - String html = ThymeleafUtil.generator("/template/", "生产入库单", ".html", variables); - PdfGeneratorUtil.generatePdf("生产入库单" + order.getNo(), html, response); + return ThymeleafUtil.generator("/template/", "生产入库单", ".html", variables); } /** diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/util/PdfGeneratorUtil.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/util/PdfGeneratorUtil.java index 42e1d24b..38f3f68b 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/util/PdfGeneratorUtil.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/util/PdfGeneratorUtil.java @@ -1,5 +1,9 @@ package com.nflg.wms.admin.util; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfReader; +import com.itextpdf.kernel.pdf.PdfWriter; +import com.itextpdf.kernel.utils.PdfMerger; import com.lowagie.text.pdf.BaseFont; import com.nflg.wms.common.util.VUtil; import jakarta.servlet.http.HttpServletResponse; @@ -9,19 +13,14 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.xhtmlrenderer.pdf.ITextRenderer; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; +import java.io.*; import java.net.URL; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; +import java.util.*; public class PdfGeneratorUtil { @@ -58,6 +57,37 @@ public class PdfGeneratorUtil { renderer.createPDF(output); } + public static void generatePdf(String name, List htmls, HttpServletResponse response) throws Exception { + response.setContentType(MediaType.APPLICATION_PDF_VALUE); + String encode = URLEncoder.encode(name + ".pdf", StandardCharsets.UTF_8); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "inline;filename*=UTF-8''" + encode); + URL baseUrl = new ClassPathResource("template/").getURL(); + List pdfParts = new ArrayList<>(); + for (String html : htmls) { + ITextRenderer renderer = new ITextRenderer(); + loadFonts(renderer); + renderer.setDocumentFromString(html, baseUrl.toString()); + renderer.layout(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + renderer.createPDF(baos); + pdfParts.add(baos.toByteArray()); + baos.close(); + renderer.finishPDF(); + } + mergePdfs(pdfParts, response.getOutputStream()); + } + + private static void mergePdfs(List pdfBytesList, OutputStream outputStream) throws IOException { + PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outputStream)); + PdfMerger merger = new PdfMerger(pdfDoc); + for (byte[] bytes : pdfBytesList) { + PdfDocument srcDoc = new PdfDocument(new PdfReader(new ByteArrayInputStream(bytes))); + merger.merge(srcDoc, 1, srcDoc.getNumberOfPages()); + srcDoc.close(); + } + pdfDoc.close(); + } + private static void loadFonts(ITextRenderer renderer) throws IOException { Path fontsDir = Paths.get(PathUtils.getPath(), "fonts"); VUtil.trueThrowBusinessError(!Files.exists(fontsDir) || !Files.isDirectory(fontsDir))