From b24bfb58824a5a42321f38d4f51969511254ba17 Mon Sep 17 00:00:00 2001 From: andy Date: Fri, 17 Jul 2026 16:03:01 +0700 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=91=E7=A5=A8PDF?= =?UTF-8?q?=E5=8D=95=E9=A1=B5=E6=A8=A1=E6=9D=BF=E7=89=88=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/project/go-live-notes.md | 2 +- .../M009-manual-invoice-generation-v1.md | 4 +- ...servationInvoiceExcelTemplateRenderer.java | 137 ++++++++++++++---- .../proforma-invoice-v1.xlsx | Bin 34139 -> 48701 bytes ...ationInvoiceExcelTemplateRendererTest.java | 99 +++++++++++++ 5 files changed, 213 insertions(+), 29 deletions(-) create mode 100644 server/src/test/java/cn/nianxx/thhotel/workflows/reservation/service/impl/ReservationInvoiceExcelTemplateRendererTest.java diff --git a/docs/project/go-live-notes.md b/docs/project/go-live-notes.md index 9f485a7..4f7893f 100644 --- a/docs/project/go-live-notes.md +++ b/docs/project/go-live-notes.md @@ -225,7 +225,7 @@ SourceMessage 原文和邮件会话完整正文已迁移到登录权限体系: - PDF 上传到阿里云 OSS,返回 `pdf_url`、`object_key`、`pdf_file_name`、`pdf_size_bytes` 和 `duration_millis`。 - CP2 不落库,不提供转换历史查询;如果需要自动处理邮件附件,应先进入 M008 后续持久化任务和 worker checkpoint。 - M009 Manual Invoice 不调用上述调试接口,也不使用 `X-TH-Hotel-Document-Conversion-Key`;它通过登录 Bearer token、`RESERVATION_INVOICE_GENERATE` 权限和后端内部转换 Adapter 生成 PDF。 -- M009 Manual Invoice 当前模板资源为 `server/src/main/resources/templates/reservation-invoice/proforma-invoice-v1.xlsx`,部署包必须包含该资源。 +- M009 Manual Invoice 当前模板资源为 `server/src/main/resources/templates/reservation-invoice/proforma-invoice-v1.xlsx`,部署包必须包含该资源;模板为 A4 纵向单页版式,缺少字体或 LibreOffice 版本差异仍可能影响最终分页,测试环境上线后需用真实浏览器打开生成 PDF 复核。 - M009 Manual Invoice 会写入 `workflow_reservation_invoice_generation`,上线前需确认 Flyway 已执行到 V22。 - M009 Manual Invoice 失败记录也可能保留已上传成功的 Excel / PDF object key;排查或清理 OSS 生成物时应以生成记录为主,不只看 `SUCCEEDED` 状态。 diff --git a/docs/project/requirements/M009-manual-invoice-generation-v1.md b/docs/project/requirements/M009-manual-invoice-generation-v1.md index f02678d..c287d5d 100644 --- a/docs/project/requirements/M009-manual-invoice-generation-v1.md +++ b/docs/project/requirements/M009-manual-invoice-generation-v1.md @@ -328,9 +328,10 @@ server/src/main/resources/templates/reservation-invoice/proforma-invoice-v1.xlsx 模板字段映射原则: - 模板固定文案、Logo、银行信息、税号可以先保留在模板内。 +- 当前 `PROFORMA_INVOICE_V1` 使用 A4 纵向单页模板,打印区域固定为 `A1:H52`,后端渲染时会再次写入纸张、缩放和打印区域,避免 LibreOffice 转 PDF 时分页漂移。 - 可动态变更但不属于单张 Invoice 的配置,后续迁移到酒店发票配置。 - 用户输入字段通过后端模板填充器写入指定单元格。 -- 明细行需要支持 1 到 N 行;超过模板默认行数时,后端应复制行样式和公式。 +- 第一版明细行固定支持 1 到 10 行;超过模板默认行数时,后续 checkpoint 再做复制行样式和公式。 - 金额公式由后端统一写入或由模板公式统一生成,不复制历史案例中不一致的公式。 ## 9. 权限、安全和审计 @@ -358,6 +359,7 @@ server/src/main/resources/templates/reservation-invoice/proforma-invoice-v1.xlsx - 已完成:新增业务接口 `POST /api/reservation/invoices/manual-generations`。 - 已完成:新增生成记录表 `workflow_reservation_invoice_generation` 和业务审计。 - 已完成:根据请求 payload 填充受控 Excel 模板 `templates/reservation-invoice/proforma-invoice-v1.xlsx`。 +- 已完成:模板切换为接近酒店历史样张的 A4 单页版式,后端渲染器固定 `A1:H52` 打印区域,避免生成 PDF 被拆成多页。 - 已完成:复用平台 Excel 转 PDF Adapter 生成 PDF,并上传阿里云 OSS。 - 已完成:返回 PDF URL、对象 Key、金额摘要和生成状态。 - 已完成:失败记录保留已上传成功的 Excel / PDF object key;业务审计完成后才标记 `SUCCEEDED`。 diff --git a/server/src/main/java/cn/nianxx/thhotel/workflows/reservation/service/impl/ReservationInvoiceExcelTemplateRenderer.java b/server/src/main/java/cn/nianxx/thhotel/workflows/reservation/service/impl/ReservationInvoiceExcelTemplateRenderer.java index c6f9ec2..c39db84 100644 --- a/server/src/main/java/cn/nianxx/thhotel/workflows/reservation/service/impl/ReservationInvoiceExcelTemplateRenderer.java +++ b/server/src/main/java/cn/nianxx/thhotel/workflows/reservation/service/impl/ReservationInvoiceExcelTemplateRenderer.java @@ -6,8 +6,10 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.math.BigDecimal; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.List; import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.PrintSetup; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; @@ -24,11 +26,15 @@ public class ReservationInvoiceExcelTemplateRenderer { private static final String TEMPLATE_PATH = "templates/reservation-invoice/proforma-invoice-v1.xlsx"; private static final DateTimeFormatter DISPLAY_DATE_FORMATTER = DateTimeFormatter.ofPattern("dd/MM/yyyy"); - private static final int CHARGE_START_ROW_INDEX = 22; + private static final String SHEET_NAME = "Proforma Invoice"; + private static final int CHARGE_START_ROW_INDEX = 25; private static final int DEFAULT_CHARGE_ROW_COUNT = 10; - private static final int SUBTOTAL_ROW_INDEX = 32; - private static final int VAT_ROW_INDEX = 33; - private static final int TOTAL_ROW_INDEX = 34; + private static final int SUBTOTAL_ROW_INDEX = 35; + private static final int VAT_ROW_INDEX = 36; + private static final int TOTAL_ROW_INDEX = 37; + private static final int PRINT_LAST_ROW_INDEX = 51; + private static final int PRINT_LAST_COLUMN_INDEX = 7; + private static final short PRINT_SCALE = 55; /** * 使用受控 Excel 模板渲染 Invoice,并返回 xlsx 字节。 @@ -39,6 +45,7 @@ public class ReservationInvoiceExcelTemplateRenderer { fillHeader(sheet, request); fillChargeRows(sheet, request.invoicePayload().charges()); fillTotalFormulas(sheet); + applyPrintSettings(workbook, sheet); workbook.setForceFormulaRecalculation(true); workbook.write(outputStream); return outputStream.toByteArray(); @@ -67,21 +74,22 @@ public class ReservationInvoiceExcelTemplateRenderer { var booking = payload.booking(); var firstCharge = payload.charges().get(0); - setText(sheet, "G5", "Date : " + DISPLAY_DATE_FORMATTER.format(document.invoiceDate())); - setText(sheet, "B6", recipient.attention()); - setText(sheet, "B7", recipient.company()); - setText(sheet, "B8", recipient.address()); - setText(sheet, "B12", recipient.telephone()); - setText(sheet, "B13", recipient.email()); - setText(sheet, "B14", DISPLAY_DATE_FORMATTER.format(document.bookingDate())); - setText(sheet, "G17", "Due Date : " + DISPLAY_DATE_FORMATTER.format(document.dueDate())); - setText(sheet, "B18", booking.groupName()); - setText(sheet, "B19", DISPLAY_DATE_FORMATTER.format(booking.arrivalDate())); - setText(sheet, "B20", DISPLAY_DATE_FORMATTER.format(booking.departureDate())); - setText(sheet, "G18", "Room Rate : " + formatDecimal(firstCharge.rate()) + setText(sheet, "H5", "Date : " + DISPLAY_DATE_FORMATTER.format(document.invoiceDate())); + setText(sheet, "C6", recipient.attention()); + setText(sheet, "C7", recipient.company()); + fillAddress(sheet, recipient.address()); + setText(sheet, "C12", recipient.telephone()); + setText(sheet, "C13", recipient.email()); + setText(sheet, "C14", DISPLAY_DATE_FORMATTER.format(document.bookingDate())); + setText(sheet, "H19", "Due Date : " + DISPLAY_DATE_FORMATTER.format(document.dueDate())); + setText(sheet, "D20", booking.groupName()); + setText(sheet, "D22", DISPLAY_DATE_FORMATTER.format(booking.arrivalDate())); + setText(sheet, "D23", DISPLAY_DATE_FORMATTER.format(booking.departureDate())); + setText(sheet, "H20", "Room Rate : " + formatDecimal(firstCharge.rate()) + " /rm/n" + roomRateNoteSuffix(booking.roomRateNote())); - setText(sheet, "G19", "No.of room(s) : " + formatDecimal(totalQuantity(payload.charges()))); - setText(sheet, "G20", "No.of Night(s) : " + formatDecimal(firstCharge.nights())); + setText(sheet, "H21", "Extra bed : " + formatDecimal(booking.extraBedRate())); + setText(sheet, "H22", "No.of room (s) : " + formatDecimal(totalQuantity(payload.charges()))); + setText(sheet, "H23", "No.of Night (s) : " + formatDecimal(firstCharge.nights()) + " NIGHTS"); } /** @@ -93,11 +101,12 @@ public class ReservationInvoiceExcelTemplateRenderer { ReservationInvoiceChargeRequest charge = charges.get(index); int rowIndex = CHARGE_START_ROW_INDEX + index; Row row = row(sheet, rowIndex); - setCellText(row, 0, charge.description() + "\n" + charge.roomType()); - setCellNumber(row, 3, charge.quantity()); - setCellNumber(row, 4, charge.rate()); - setCellNumber(row, 5, charge.nights()); - setCellFormula(row, 6, "D" + (rowIndex + 1) + "*E" + (rowIndex + 1) + "*F" + (rowIndex + 1)); + setCellText(row, 1, charge.description()); + setCellText(row, 3, charge.roomType()); + setCellNumber(row, 4, charge.quantity()); + setCellNumber(row, 5, charge.rate()); + setCellNumber(row, 6, charge.nights()); + setCellFormula(row, 7, "E" + (rowIndex + 1) + "*F" + (rowIndex + 1) + "*G" + (rowIndex + 1)); } } @@ -108,9 +117,23 @@ public class ReservationInvoiceExcelTemplateRenderer { Row subtotalRow = row(sheet, SUBTOTAL_ROW_INDEX); Row vatRow = row(sheet, VAT_ROW_INDEX); Row totalRow = row(sheet, TOTAL_ROW_INDEX); - setCellFormula(subtotalRow, 6, "SUM(G23:G32)/1.07"); - setCellFormula(vatRow, 6, "SUM(G23:G32)-G33"); - setCellFormula(totalRow, 6, "SUM(G23:G32)"); + setCellFormula(subtotalRow, 7, "SUM(H26:H35)/1.07"); + setCellFormula(vatRow, 7, "SUM(H26:H35)-H36"); + setCellFormula(totalRow, 7, "SUM(H26:H35)"); + } + + /** + * 固定 PDF 输出版式,避免模板被编辑后再次变成多页或 Letter 纸张。 + */ + private void applyPrintSettings(Workbook workbook, Sheet sheet) { + int sheetIndex = workbook.getSheetIndex(sheet); + workbook.setSheetName(sheetIndex, SHEET_NAME); + workbook.setPrintArea(sheetIndex, 0, PRINT_LAST_COLUMN_INDEX, 0, PRINT_LAST_ROW_INDEX); + PrintSetup printSetup = sheet.getPrintSetup(); + printSetup.setPaperSize(PrintSetup.A4_PAPERSIZE); + printSetup.setLandscape(false); + printSetup.setScale(PRINT_SCALE); + sheet.setAutobreaks(false); } /** @@ -119,13 +142,73 @@ public class ReservationInvoiceExcelTemplateRenderer { private void clearChargeRows(Sheet sheet) { for (int index = 0; index < DEFAULT_CHARGE_ROW_COUNT; index++) { Row row = row(sheet, CHARGE_START_ROW_INDEX + index); - for (int cellIndex = 0; cellIndex <= 6; cellIndex++) { + for (int cellIndex = 1; cellIndex <= 7; cellIndex++) { Cell cell = cell(row, cellIndex); cell.setBlank(); } } } + /** + * 地址字段最多拆成三行展示,兼顾模板空间和用户手填长地址。 + */ + private void fillAddress(Sheet sheet, String address) { + List addressLines = splitAddressLines(address); + setText(sheet, "C8", addressLines.get(0)); + setText(sheet, "C9", addressLines.get(1)); + setText(sheet, "C10", addressLines.get(2)); + } + + /** + * 优先按换行拆分;无换行时按逗号做温和换行,避免单行地址在 PDF 中过长。 + */ + private List splitAddressLines(String address) { + if (address == null || address.isBlank()) { + return List.of("", "", ""); + } + String normalized = address.trim(); + String[] hardLines = normalized.split("\\R"); + if (hardLines.length > 1) { + return firstThreeLines(List.of(hardLines)); + } + List lines = new ArrayList<>(); + StringBuilder current = new StringBuilder(); + for (String part : normalized.split(",")) { + String segment = part.trim(); + if (segment.isEmpty()) { + continue; + } + String candidate = current.length() == 0 ? segment : current + ", " + segment; + if (candidate.length() > 58 && lines.size() < 2 && current.length() > 0) { + lines.add(current.toString()); + current = new StringBuilder(segment); + } else { + current = new StringBuilder(candidate); + } + } + if (current.length() > 0) { + lines.add(current.toString()); + } + return firstThreeLines(lines); + } + + private List firstThreeLines(List lines) { + List result = new ArrayList<>(3); + for (int index = 0; index < lines.size(); index++) { + String line = lines.get(index); + if (result.size() == 2) { + String remaining = String.join(", ", lines.subList(index, lines.size())); + result.add(remaining); + break; + } + result.add(line == null ? "" : line.trim()); + } + while (result.size() < 3) { + result.add(""); + } + return result; + } + private Row row(Sheet sheet, int rowIndex) { Row row = sheet.getRow(rowIndex); return row == null ? sheet.createRow(rowIndex) : row; diff --git a/server/src/main/resources/templates/reservation-invoice/proforma-invoice-v1.xlsx b/server/src/main/resources/templates/reservation-invoice/proforma-invoice-v1.xlsx index 44000f86201645bad890a676d90adc31acb38af1..44fba1437bdc9f0958184d387439bd951747b4ea 100644 GIT binary patch literal 48701 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¥B_b19+EoC1q%$AyH{885P77%0_b14TC7e8mx) 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%0A7V)fnzx-W<*uhfr=BhtR90L& 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 diff --git a/server/src/test/java/cn/nianxx/thhotel/workflows/reservation/service/impl/ReservationInvoiceExcelTemplateRendererTest.java b/server/src/test/java/cn/nianxx/thhotel/workflows/reservation/service/impl/ReservationInvoiceExcelTemplateRendererTest.java new file mode 100644 index 0000000..b8bed8f --- /dev/null +++ b/server/src/test/java/cn/nianxx/thhotel/workflows/reservation/service/impl/ReservationInvoiceExcelTemplateRendererTest.java @@ -0,0 +1,99 @@ +package cn.nianxx.thhotel.workflows.reservation.service.impl; + +import static org.assertj.core.api.Assertions.assertThat; + +import cn.nianxx.thhotel.workflows.reservation.common.request.ReservationInvoiceBookingRequest; +import cn.nianxx.thhotel.workflows.reservation.common.request.ReservationInvoiceChargeRequest; +import cn.nianxx.thhotel.workflows.reservation.common.request.ReservationInvoiceDocumentRequest; +import cn.nianxx.thhotel.workflows.reservation.common.request.ReservationInvoiceManualGenerationRequest; +import cn.nianxx.thhotel.workflows.reservation.common.request.ReservationInvoicePayloadRequest; +import cn.nianxx.thhotel.workflows.reservation.common.request.ReservationInvoiceRecipientRequest; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.math.BigDecimal; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.LocalDate; +import java.util.List; +import org.apache.poi.ss.usermodel.PrintSetup; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.junit.jupiter.api.Test; + +class ReservationInvoiceExcelTemplateRendererTest { + + private final ReservationInvoiceExcelTemplateRenderer renderer = new ReservationInvoiceExcelTemplateRenderer(); + + @Test + void shouldRenderSinglePageA4InvoiceWithExpectedCells() throws Exception { + byte[] workbookBytes = renderer.render(validRequest()); + writeSampleWhenRequested(workbookBytes); + + try (XSSFWorkbook workbook = new XSSFWorkbook(new ByteArrayInputStream(workbookBytes))) { + var sheet = workbook.getSheetAt(0); + + assertThat(workbook.getNumberOfSheets()).isEqualTo(1); + assertThat(workbook.getPrintArea(0)).isEqualTo("'Proforma Invoice'!$A$1:$H$52"); + assertThat(sheet.getPrintSetup().getPaperSize()).isEqualTo(PrintSetup.A4_PAPERSIZE); + assertThat(sheet.getPrintSetup().getScale()).isEqualTo((short) 55); + + assertThat(sheet.getRow(4).getCell(7).getStringCellValue()).isEqualTo("Date : 17/07/2026"); + assertThat(sheet.getRow(5).getCell(2).getStringCellValue()).isEqualTo("Khun Ann"); + assertThat(sheet.getRow(6).getCell(2).getStringCellValue()) + .isEqualTo("LIAN TAI TRAVEL (THAILAND) CO., LTD."); + assertThat(sheet.getRow(13).getCell(2).getStringCellValue()).isEqualTo("12/07/2026"); + assertThat(sheet.getRow(18).getCell(7).getStringCellValue()).isEqualTo("Due Date : 22/07/2026"); + assertThat(sheet.getRow(19).getCell(3).getStringCellValue()).isEqualTo("GRP-DEMO-0802"); + assertThat(sheet.getRow(21).getCell(3).getStringCellValue()).isEqualTo("02/08/2026"); + assertThat(sheet.getRow(22).getCell(3).getStringCellValue()).isEqualTo("05/08/2026"); + + assertThat(sheet.getRow(25).getCell(1).getStringCellValue()).isEqualTo("GRP-DEMO-0802"); + assertThat(sheet.getRow(25).getCell(3).getStringCellValue()).isEqualTo("Deluxe Room"); + assertThat(sheet.getRow(25).getCell(7).getCellFormula()).isEqualTo("E26*F26*G26"); + assertThat(sheet.getRow(35).getCell(7).getCellFormula()).isEqualTo("SUM(H26:H35)/1.07"); + assertThat(sheet.getRow(37).getCell(7).getCellFormula()).isEqualTo("SUM(H26:H35)"); + } + } + + private void writeSampleWhenRequested(byte[] workbookBytes) throws IOException { + if (!Boolean.getBoolean("reservation.invoice.writeSample")) { + return; + } + Path outputPath = Path.of("target/reservation-invoice-renderer/proforma-invoice-renderer-sample.xlsx"); + Files.createDirectories(outputPath.getParent()); + Files.write(outputPath, workbookBytes); + } + + private ReservationInvoiceManualGenerationRequest validRequest() { + return new ReservationInvoiceManualGenerationRequest( + "HOTEL-TEST", + "MANUAL", + null, + null, + "PROFORMA_INVOICE_V1", + new ReservationInvoicePayloadRequest( + new ReservationInvoiceDocumentRequest( + LocalDate.of(2026, 7, 17), + LocalDate.of(2026, 7, 12), + LocalDate.of(2026, 7, 22)), + new ReservationInvoiceRecipientRequest( + "LIAN_TAI", + "LIAN_TAI_KHUN_ANN", + "LIAN TAI TRAVEL (THAILAND) CO., LTD.", + "Khun Ann", + "2/86 Rajpattana Road, Rajpattana, Sapansoong, Bangkok, TH, 10240", + "061-397-2675", + "op.liantaitravel@gmail.com"), + new ReservationInvoiceBookingRequest( + "GRP-DEMO-0802", + LocalDate.of(2026, 8, 2), + LocalDate.of(2026, 8, 5), + "includingBF", + new BigDecimal("1200")), + List.of(new ReservationInvoiceChargeRequest( + "GRP-DEMO-0802", + "Deluxe Room", + new BigDecimal("2"), + new BigDecimal("3000"), + new BigDecimal("3"))))); + } +}