From bf033b3b89b7ffb54d37bacf5108b29755dcd860 Mon Sep 17 00:00:00 2001 From: yuance <182865460@qq.com> Date: Fri, 26 Sep 2025 10:53:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=94=9F=E6=88=90=E5=B9=B6?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=AE=A1=E8=AE=A1=E6=8A=A5=E5=91=8A=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/controller/AuditReportController.java | 117 +++++++++++------- 1 file changed, 74 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/gxwebsoft/ai/controller/AuditReportController.java b/src/main/java/com/gxwebsoft/ai/controller/AuditReportController.java index 30f7b63..b2fb502 100644 --- a/src/main/java/com/gxwebsoft/ai/controller/AuditReportController.java +++ b/src/main/java/com/gxwebsoft/ai/controller/AuditReportController.java @@ -1,13 +1,17 @@ package com.gxwebsoft.ai.controller; import java.io.OutputStream; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletResponse; import org.apache.poi.openxml4j.util.ZipSecureFile; import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.apache.poi.xwpf.usermodel.XWPFRun; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -89,6 +93,8 @@ public class AuditReportController extends BaseController { KnowledgeBaseRequest knowledgeBaseRequest = new KnowledgeBaseRequest(); knowledgeBaseRequest.setKbId(req.getKbId()); + //召回切片数上限 + knowledgeBaseRequest.setTopK(10); knowledgeBaseRequest.setFormCommit((req.getFormCommit() >= 10) ? req.getFormCommit() / 10 : req.getFormCommit()); String knowledge = knowledgeBaseService.queryKnowledgeBase(knowledgeBaseRequest).toString(); @@ -105,65 +111,90 @@ public class AuditReportController extends BaseController { @Operation(summary = "生成并下载审计报告") @PostMapping("/download") public void downloadAuditReport(@RequestBody AuditReportRequest req, HttpServletResponse response) { - // 保存原始的安全阈值 double originalMinInflateRatio = ZipSecureFile.getMinInflateRatio(); - + try { - // 降低Zip bomb检测的阈值,解决模板文件的安全检测问题 ZipSecureFile.setMinInflateRatio(0.001); - + // 准备模板数据 Map map = new HashMap<>(); map.put(AuditReportEnum.TITLE.getCode().toString(), req.getFrom00()); - map.put(AuditReportEnum.BASIS.getCode().toString(), convertNewlines(req.getFrom10())); - map.put(AuditReportEnum.OBJECTIVE.getCode().toString(), convertNewlines(req.getFrom20())); - map.put(AuditReportEnum.SCOPE.getCode().toString(), convertNewlines(req.getFrom30())); - map.put(AuditReportEnum.UNIT_OVERVIEW.getCode().toString(), convertNewlines(req.getFrom41())); - map.put(AuditReportEnum.ORG_PERSONNEL.getCode().toString(), convertNewlines(req.getFrom42())); - map.put(AuditReportEnum.FINANCIAL_ACCOUNTING.getCode().toString(), convertNewlines(req.getFrom43())); - // 处理列表数据 + map.put(AuditReportEnum.BASIS.getCode().toString(), req.getFrom10()); + map.put(AuditReportEnum.OBJECTIVE.getCode().toString(), req.getFrom20()); + map.put(AuditReportEnum.SCOPE.getCode().toString(), req.getFrom30()); + map.put(AuditReportEnum.UNIT_OVERVIEW.getCode().toString(), req.getFrom41()); + map.put(AuditReportEnum.ORG_PERSONNEL.getCode().toString(), req.getFrom42()); + map.put(AuditReportEnum.FINANCIAL_ACCOUNTING.getCode().toString(), req.getFrom43()); map.put(AuditReportEnum.ANNUAL_BUSINESS.getCode().toString(), req.getFrom44()); - map.put(AuditReportEnum.INTERNAL_CONTROL.getCode().toString(), convertNewlines(req.getFrom45())); - map.put(AuditReportEnum.ECONOMIC_POLICIES.getCode().toString(), convertNewlines(req.getFrom51())); - map.put(AuditReportEnum.DEV_STRATEGY.getCode().toString(), convertNewlines(req.getFrom52())); - map.put(AuditReportEnum.MAJOR_ECONOMIC.getCode().toString(), convertNewlines(req.getFrom53())); - map.put(AuditReportEnum.CORP_GOVERNANCE.getCode().toString(), convertNewlines(req.getFrom54())); - map.put(AuditReportEnum.FINANCIAL_LEGAL.getCode().toString(), convertNewlines(req.getFrom55())); - map.put(AuditReportEnum.INTEGRITY_COMPLIANCE.getCode().toString(), convertNewlines(req.getFrom56())); - map.put(AuditReportEnum.PREV_AUDIT_ISSUES.getCode().toString(), convertNewlines(req.getFrom57())); - map.put(AuditReportEnum.OTHER_MATTERS.getCode().toString(), convertNewlines(req.getFrom58())); - map.put(AuditReportEnum.RISK_IDENTIFY.getCode().toString(), convertNewlines(req.getFrom61())); - map.put(AuditReportEnum.RISK_RESPONSE.getCode().toString(), convertNewlines(req.getFrom62())); - map.put(AuditReportEnum.TECHNIQUES.getCode().toString(), convertNewlines(req.getFrom70())); - map.put(AuditReportEnum.SCHEDULE.getCode().toString(), convertNewlines(req.getFrom80())); - map.put(AuditReportEnum.ORGANIZATION.getCode().toString(), convertNewlines(req.getFrom90())); - - // 使用Easypoi的Word模板功能 + map.put(AuditReportEnum.INTERNAL_CONTROL.getCode().toString(), req.getFrom45()); + map.put(AuditReportEnum.ECONOMIC_POLICIES.getCode().toString(), req.getFrom51()); + map.put(AuditReportEnum.DEV_STRATEGY.getCode().toString(), req.getFrom52()); + map.put(AuditReportEnum.MAJOR_ECONOMIC.getCode().toString(), req.getFrom53()); + map.put(AuditReportEnum.CORP_GOVERNANCE.getCode().toString(), req.getFrom54()); + map.put(AuditReportEnum.FINANCIAL_LEGAL.getCode().toString(), req.getFrom55()); + map.put(AuditReportEnum.INTEGRITY_COMPLIANCE.getCode().toString(), req.getFrom56()); + map.put(AuditReportEnum.PREV_AUDIT_ISSUES.getCode().toString(), req.getFrom57()); + map.put(AuditReportEnum.OTHER_MATTERS.getCode().toString(), req.getFrom58()); + map.put(AuditReportEnum.RISK_IDENTIFY.getCode().toString(), req.getFrom61()); + map.put(AuditReportEnum.RISK_RESPONSE.getCode().toString(), req.getFrom62()); + map.put(AuditReportEnum.TECHNIQUES.getCode().toString(), req.getFrom70()); + map.put(AuditReportEnum.SCHEDULE.getCode().toString(), req.getFrom80()); + map.put(AuditReportEnum.ORGANIZATION.getCode().toString(), req.getFrom90()); + + // 使用 Easypoi 的 Word 模板功能 XWPFDocument document = WordExportUtil.exportWord07(templateConfig.getWordTemplatePath(), map); - - // 设置响应头 + + // 处理换行,确保 \n 转为硬回车(新段落) + processParagraphs(document); + response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); response.setHeader("Content-Disposition", "attachment; filename=audit_report.docx"); - - // 输出到响应流 - OutputStream out = response.getOutputStream(); - document.write(out); - out.flush(); - out.close(); - + + try (OutputStream out = response.getOutputStream()) { + document.write(out); + out.flush(); + } + } catch (Exception e) { throw new RuntimeException("生成审计报告失败", e); } finally { - // 恢复原始的安全阈值 ZipSecureFile.setMinInflateRatio(originalMinInflateRatio); } } - - private String convertNewlines(String text) { - if (text == null) { - return ""; + + private void processParagraphs(XWPFDocument document) { + List originalParas = new ArrayList<>(document.getParagraphs()); + + for (XWPFParagraph para : originalParas) { + String text = para.getText(); + if (text == null || !text.contains("\n")) { + continue; + } + + String[] parts = text.replace("\r\n", "\n").replace("\r", "\n").split("\n"); + + // 在原段落位置之前插入新段落 + int pos = document.getPosOfParagraph(para); + + // 修正:按正序插入(从前往后) + for (int i = 0; i < parts.length; i++) { + // 创建新段落 + XWPFParagraph newPara = document.insertNewParagraph(para.getCTP().newCursor()); + + // 复制样式 + newPara.getCTP().setPPr(para.getCTP().getPPr()); + + XWPFRun newRun = newPara.createRun(); + newRun.setText(parts[i].trim()); + + if (!para.getRuns().isEmpty()) { + newRun.getCTR().setRPr(para.getRuns().get(0).getCTR().getRPr()); + } + } + + // 删除原段落 + document.removeBodyElement(pos + parts.length); } - text = text.replace("\n\n", "\n"); - return text.replace("\n", "\r\n"); } + }