优化生成并下载审计报告接口
This commit is contained in:
@@ -1,13 +1,17 @@
|
|||||||
package com.gxwebsoft.ai.controller;
|
package com.gxwebsoft.ai.controller;
|
||||||
|
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.apache.poi.openxml4j.util.ZipSecureFile;
|
import org.apache.poi.openxml4j.util.ZipSecureFile;
|
||||||
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
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.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
@@ -89,6 +93,8 @@ public class AuditReportController extends BaseController {
|
|||||||
|
|
||||||
KnowledgeBaseRequest knowledgeBaseRequest = new KnowledgeBaseRequest();
|
KnowledgeBaseRequest knowledgeBaseRequest = new KnowledgeBaseRequest();
|
||||||
knowledgeBaseRequest.setKbId(req.getKbId());
|
knowledgeBaseRequest.setKbId(req.getKbId());
|
||||||
|
//召回切片数上限
|
||||||
|
knowledgeBaseRequest.setTopK(10);
|
||||||
knowledgeBaseRequest.setFormCommit((req.getFormCommit() >= 10) ? req.getFormCommit() / 10 : req.getFormCommit());
|
knowledgeBaseRequest.setFormCommit((req.getFormCommit() >= 10) ? req.getFormCommit() / 10 : req.getFormCommit());
|
||||||
String knowledge = knowledgeBaseService.queryKnowledgeBase(knowledgeBaseRequest).toString();
|
String knowledge = knowledgeBaseService.queryKnowledgeBase(knowledgeBaseRequest).toString();
|
||||||
|
|
||||||
@@ -105,65 +111,90 @@ public class AuditReportController extends BaseController {
|
|||||||
@Operation(summary = "生成并下载审计报告")
|
@Operation(summary = "生成并下载审计报告")
|
||||||
@PostMapping("/download")
|
@PostMapping("/download")
|
||||||
public void downloadAuditReport(@RequestBody AuditReportRequest req, HttpServletResponse response) {
|
public void downloadAuditReport(@RequestBody AuditReportRequest req, HttpServletResponse response) {
|
||||||
// 保存原始的安全阈值
|
|
||||||
double originalMinInflateRatio = ZipSecureFile.getMinInflateRatio();
|
double originalMinInflateRatio = ZipSecureFile.getMinInflateRatio();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 降低Zip bomb检测的阈值,解决模板文件的安全检测问题
|
|
||||||
ZipSecureFile.setMinInflateRatio(0.001);
|
ZipSecureFile.setMinInflateRatio(0.001);
|
||||||
|
|
||||||
// 准备模板数据
|
// 准备模板数据
|
||||||
Map<String, Object> map = new HashMap<>();
|
Map<String, Object> map = new HashMap<>();
|
||||||
map.put(AuditReportEnum.TITLE.getCode().toString(), req.getFrom00());
|
map.put(AuditReportEnum.TITLE.getCode().toString(), req.getFrom00());
|
||||||
map.put(AuditReportEnum.BASIS.getCode().toString(), convertNewlines(req.getFrom10()));
|
map.put(AuditReportEnum.BASIS.getCode().toString(), req.getFrom10());
|
||||||
map.put(AuditReportEnum.OBJECTIVE.getCode().toString(), convertNewlines(req.getFrom20()));
|
map.put(AuditReportEnum.OBJECTIVE.getCode().toString(), req.getFrom20());
|
||||||
map.put(AuditReportEnum.SCOPE.getCode().toString(), convertNewlines(req.getFrom30()));
|
map.put(AuditReportEnum.SCOPE.getCode().toString(), req.getFrom30());
|
||||||
map.put(AuditReportEnum.UNIT_OVERVIEW.getCode().toString(), convertNewlines(req.getFrom41()));
|
map.put(AuditReportEnum.UNIT_OVERVIEW.getCode().toString(), req.getFrom41());
|
||||||
map.put(AuditReportEnum.ORG_PERSONNEL.getCode().toString(), convertNewlines(req.getFrom42()));
|
map.put(AuditReportEnum.ORG_PERSONNEL.getCode().toString(), req.getFrom42());
|
||||||
map.put(AuditReportEnum.FINANCIAL_ACCOUNTING.getCode().toString(), convertNewlines(req.getFrom43()));
|
map.put(AuditReportEnum.FINANCIAL_ACCOUNTING.getCode().toString(), req.getFrom43());
|
||||||
// 处理列表数据
|
|
||||||
map.put(AuditReportEnum.ANNUAL_BUSINESS.getCode().toString(), req.getFrom44());
|
map.put(AuditReportEnum.ANNUAL_BUSINESS.getCode().toString(), req.getFrom44());
|
||||||
map.put(AuditReportEnum.INTERNAL_CONTROL.getCode().toString(), convertNewlines(req.getFrom45()));
|
map.put(AuditReportEnum.INTERNAL_CONTROL.getCode().toString(), req.getFrom45());
|
||||||
map.put(AuditReportEnum.ECONOMIC_POLICIES.getCode().toString(), convertNewlines(req.getFrom51()));
|
map.put(AuditReportEnum.ECONOMIC_POLICIES.getCode().toString(), req.getFrom51());
|
||||||
map.put(AuditReportEnum.DEV_STRATEGY.getCode().toString(), convertNewlines(req.getFrom52()));
|
map.put(AuditReportEnum.DEV_STRATEGY.getCode().toString(), req.getFrom52());
|
||||||
map.put(AuditReportEnum.MAJOR_ECONOMIC.getCode().toString(), convertNewlines(req.getFrom53()));
|
map.put(AuditReportEnum.MAJOR_ECONOMIC.getCode().toString(), req.getFrom53());
|
||||||
map.put(AuditReportEnum.CORP_GOVERNANCE.getCode().toString(), convertNewlines(req.getFrom54()));
|
map.put(AuditReportEnum.CORP_GOVERNANCE.getCode().toString(), req.getFrom54());
|
||||||
map.put(AuditReportEnum.FINANCIAL_LEGAL.getCode().toString(), convertNewlines(req.getFrom55()));
|
map.put(AuditReportEnum.FINANCIAL_LEGAL.getCode().toString(), req.getFrom55());
|
||||||
map.put(AuditReportEnum.INTEGRITY_COMPLIANCE.getCode().toString(), convertNewlines(req.getFrom56()));
|
map.put(AuditReportEnum.INTEGRITY_COMPLIANCE.getCode().toString(), req.getFrom56());
|
||||||
map.put(AuditReportEnum.PREV_AUDIT_ISSUES.getCode().toString(), convertNewlines(req.getFrom57()));
|
map.put(AuditReportEnum.PREV_AUDIT_ISSUES.getCode().toString(), req.getFrom57());
|
||||||
map.put(AuditReportEnum.OTHER_MATTERS.getCode().toString(), convertNewlines(req.getFrom58()));
|
map.put(AuditReportEnum.OTHER_MATTERS.getCode().toString(), req.getFrom58());
|
||||||
map.put(AuditReportEnum.RISK_IDENTIFY.getCode().toString(), convertNewlines(req.getFrom61()));
|
map.put(AuditReportEnum.RISK_IDENTIFY.getCode().toString(), req.getFrom61());
|
||||||
map.put(AuditReportEnum.RISK_RESPONSE.getCode().toString(), convertNewlines(req.getFrom62()));
|
map.put(AuditReportEnum.RISK_RESPONSE.getCode().toString(), req.getFrom62());
|
||||||
map.put(AuditReportEnum.TECHNIQUES.getCode().toString(), convertNewlines(req.getFrom70()));
|
map.put(AuditReportEnum.TECHNIQUES.getCode().toString(), req.getFrom70());
|
||||||
map.put(AuditReportEnum.SCHEDULE.getCode().toString(), convertNewlines(req.getFrom80()));
|
map.put(AuditReportEnum.SCHEDULE.getCode().toString(), req.getFrom80());
|
||||||
map.put(AuditReportEnum.ORGANIZATION.getCode().toString(), convertNewlines(req.getFrom90()));
|
map.put(AuditReportEnum.ORGANIZATION.getCode().toString(), req.getFrom90());
|
||||||
|
|
||||||
// 使用Easypoi的Word模板功能
|
// 使用 Easypoi 的 Word 模板功能
|
||||||
XWPFDocument document = WordExportUtil.exportWord07(templateConfig.getWordTemplatePath(), map);
|
XWPFDocument document = WordExportUtil.exportWord07(templateConfig.getWordTemplatePath(), map);
|
||||||
|
|
||||||
// 设置响应头
|
// 处理换行,确保 \n 转为硬回车(新段落)
|
||||||
|
processParagraphs(document);
|
||||||
|
|
||||||
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
|
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
|
||||||
response.setHeader("Content-Disposition", "attachment; filename=audit_report.docx");
|
response.setHeader("Content-Disposition", "attachment; filename=audit_report.docx");
|
||||||
|
|
||||||
// 输出到响应流
|
try (OutputStream out = response.getOutputStream()) {
|
||||||
OutputStream out = response.getOutputStream();
|
document.write(out);
|
||||||
document.write(out);
|
out.flush();
|
||||||
out.flush();
|
}
|
||||||
out.close();
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException("生成审计报告失败", e);
|
throw new RuntimeException("生成审计报告失败", e);
|
||||||
} finally {
|
} finally {
|
||||||
// 恢复原始的安全阈值
|
|
||||||
ZipSecureFile.setMinInflateRatio(originalMinInflateRatio);
|
ZipSecureFile.setMinInflateRatio(originalMinInflateRatio);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String convertNewlines(String text) {
|
private void processParagraphs(XWPFDocument document) {
|
||||||
if (text == null) {
|
List<XWPFParagraph> originalParas = new ArrayList<>(document.getParagraphs());
|
||||||
return "";
|
|
||||||
|
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");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user