From 259bf1d7010433bbce0a017d156b17b86bda15f0 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Sat, 14 Jun 2025 06:58:38 +0800 Subject: [PATCH] 'commit' --- ...·ž_æ•™è‚²åˆ†æžæŠ¥å‘Š_20250614_064949.docx | Bin 0 -> 4266 bytes ...·ž_æ•™è‚²åˆ†æžæŠ¥å‘Š_20250614_065731.docx | Bin 0 -> 4206 bytes pom.xml | 17 + .../base/AI/Generator/WordGenerator.java | 319 +++++++++++++++--- .../dsideal/base/AI/Model/YunNanModel.java | 26 +- .../com/dsideal/base/Util/CallDeepSeek.java | 1 + 6 files changed, 309 insertions(+), 54 deletions(-) create mode 100644 WebRoot/upload/文山州与楚雄州_æ•™è‚²åˆ†æžæŠ¥å‘Š_20250614_064949.docx create mode 100644 WebRoot/upload/文山州与楚雄州_æ•™è‚²åˆ†æžæŠ¥å‘Š_20250614_065731.docx diff --git a/WebRoot/upload/文山州与楚雄州_æ•™è‚²åˆ†æžæŠ¥å‘Š_20250614_064949.docx b/WebRoot/upload/文山州与楚雄州_æ•™è‚²åˆ†æžæŠ¥å‘Š_20250614_064949.docx new file mode 100644 index 0000000000000000000000000000000000000000..23a9f91db5c96315d30d7178f900d874b07671a5 GIT binary patch literal 4266 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 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index b1f0931b..cd08476d 100644 --- a/pom.xml +++ b/pom.xml @@ -321,6 +321,23 @@ poi-scratchpad 5.2.5 + + + + org.commonmark + commonmark + 0.21.0 + + + org.commonmark + commonmark-ext-gfm-tables + 0.21.0 + + + org.commonmark + commonmark-ext-heading-anchor + 0.21.0 + diff --git a/src/main/java/com/dsideal/base/AI/Generator/WordGenerator.java b/src/main/java/com/dsideal/base/AI/Generator/WordGenerator.java index e98fbadc..fed6fd68 100644 --- a/src/main/java/com/dsideal/base/AI/Generator/WordGenerator.java +++ b/src/main/java/com/dsideal/base/AI/Generator/WordGenerator.java @@ -4,11 +4,20 @@ import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import org.apache.poi.xwpf.usermodel.ParagraphAlignment; +import org.apache.poi.xwpf.usermodel.XWPFTable; +import org.apache.poi.xwpf.usermodel.XWPFTableRow; +import org.apache.poi.xwpf.usermodel.XWPFTableCell; +import org.commonmark.node.*; +import org.commonmark.parser.Parser; +import org.commonmark.ext.gfm.tables.TablesExtension; +import org.commonmark.ext.heading.anchor.HeadingAnchorExtension; import java.io.File; import java.io.FileOutputStream; import java.text.SimpleDateFormat; +import java.util.Arrays; import java.util.Date; +import java.util.List; /** * Word文档生æˆå™¨ - 负责生æˆåˆ†æžæŠ¥å‘Šçš„Word文档 @@ -105,52 +114,280 @@ public class WordGenerator { } /** - * 添加分æžå†…容 + * 添加分æžå†…容 - 使用CommonMarkè§£æžMarkdown */ private static void addAnalysisContent(XWPFDocument document, String analysisResult) { - String[] lines = analysisResult.split("\n"); - XWPFParagraph currentParagraph = null; - XWPFRun currentRun = null; - - for (String line : lines) { - if (line.trim().isEmpty()) { - // ç©ºè¡Œï¼Œåˆ›å»ºæ–°æ®µè½ - document.createParagraph(); - currentParagraph = null; - currentRun = null; - } else { - // æ£€æŸ¥æ˜¯å¦æ˜¯æ ‡é¢˜è¡Œ - boolean isTitle = isTitle(line); - - if (currentParagraph == null) { - currentParagraph = document.createParagraph(); - currentRun = currentParagraph.createRun(); - currentRun.setFontFamily("宋体"); - currentRun.setFontSize(12); + // 创建CommonMarkè§£æžå™¨ï¼Œæ”¯æŒè¡¨æ ¼å’Œæ ‡é¢˜é”šç‚¹æ‰©å±• + List extensions = Arrays.asList( + TablesExtension.create(), + HeadingAnchorExtension.create() + ); + Parser parser = Parser.builder().extensions(extensions).build(); + + // è§£æžMarkdown文档 + Node markdownDoc = parser.parse(analysisResult); + + // éåŽ†å¹¶å¤„ç†æ‰€æœ‰èŠ‚ç‚¹ + processMarkdownNode(document, markdownDoc); + } + + /** + * 处ç†Markdown节点并转æ¢ä¸ºWordæ ¼å¼ + */ + private static void processMarkdownNode(XWPFDocument document, Node node) { + Node child = node.getFirstChild(); + while (child != null) { + if (child instanceof Heading) { + processHeading(document, (Heading) child); + } else if (child instanceof Paragraph) { + processParagraph(document, (Paragraph) child); + } else if (child instanceof BulletList) { + processBulletList(document, (BulletList) child); + } else if (child instanceof OrderedList) { + processOrderedList(document, (OrderedList) child); + } else if (child instanceof org.commonmark.ext.gfm.tables.TableBlock) { + processTable(document, (org.commonmark.ext.gfm.tables.TableBlock) child); + } else if (child instanceof BlockQuote) { + processBlockQuote(document, (BlockQuote) child); + } else if (child instanceof FencedCodeBlock || child instanceof IndentedCodeBlock) { + processCodeBlock(document, child); + } + child = child.getNext(); + } + } + + /** + * å¤„ç†æ ‡é¢˜ + */ + private static void processHeading(XWPFDocument document, Heading heading) { + XWPFParagraph paragraph = document.createParagraph(); + XWPFRun run = paragraph.createRun(); + + String text = getTextContent(heading); + run.setText(text); + run.setBold(true); + run.setFontFamily("宋体"); + + // æ ¹æ®æ ‡é¢˜çº§åˆ«è®¾ç½®å­—ä½“å¤§å° + switch (heading.getLevel()) { + case 1: + run.setFontSize(18); + paragraph.setAlignment(ParagraphAlignment.CENTER); + break; + case 2: + run.setFontSize(16); + break; + case 3: + run.setFontSize(14); + break; + case 4: + run.setFontSize(13); + break; + default: + run.setFontSize(12); + break; + } + } + + /** + * å¤„ç†æ®µè½ + */ + private static void processParagraph(XWPFDocument document, Paragraph para) { + XWPFParagraph paragraph = document.createParagraph(); + processInlineNodes(paragraph, para.getFirstChild()); + } + + /** + * å¤„ç†æ— åºåˆ—表 + */ + private static void processBulletList(XWPFDocument document, BulletList bulletList) { + Node listItem = bulletList.getFirstChild(); + while (listItem != null) { + if (listItem instanceof ListItem) { + XWPFParagraph paragraph = document.createParagraph(); + XWPFRun run = paragraph.createRun(); + run.setText("• " + getTextContent(listItem)); + run.setFontSize(12); + run.setFontFamily("宋体"); + } + listItem = listItem.getNext(); + } + } + + /** + * å¤„ç†æœ‰åºåˆ—表 + */ + private static void processOrderedList(XWPFDocument document, OrderedList orderedList) { + Node listItem = orderedList.getFirstChild(); + int counter = orderedList.getStartNumber(); + while (listItem != null) { + if (listItem instanceof ListItem) { + XWPFParagraph paragraph = document.createParagraph(); + XWPFRun run = paragraph.createRun(); + run.setText(counter + ". " + getTextContent(listItem)); + run.setFontSize(12); + run.setFontFamily("宋体"); + counter++; + } + listItem = listItem.getNext(); + } + } + + /** + * 处ç†è¡¨æ ¼ + */ + private static void processTable(XWPFDocument document, org.commonmark.ext.gfm.tables.TableBlock table) { + // 计算表格列数 + int cols = 0; + Node firstRow = table.getFirstChild(); + if (firstRow instanceof org.commonmark.ext.gfm.tables.TableHead) { + Node headerRow = firstRow.getFirstChild(); + if (headerRow instanceof org.commonmark.ext.gfm.tables.TableRow) { + Node cell = headerRow.getFirstChild(); + while (cell != null) { + cols++; + cell = cell.getNext(); } - - if (isTitle) { - // å¦‚æžœå½“å‰æ®µè½å·²æœ‰å†…å®¹ï¼Œåˆ›å»ºæ–°æ®µè½ - String currentText = currentRun.getText(0); - if (currentText != null && !currentText.isEmpty()) { - currentParagraph = document.createParagraph(); - currentRun = currentParagraph.createRun(); - currentRun.setFontFamily("宋体"); - } - currentRun.setText(line); - currentRun.setBold(true); - currentRun.setFontSize(14); - currentParagraph = null; // å¼ºåˆ¶ä¸‹ä¸€è¡Œåˆ›å»ºæ–°æ®µè½ - currentRun = null; - } else { - // 普通内容 - String currentText = currentRun.getText(0); - if (currentText != null && !currentText.isEmpty()) { - currentRun.addBreak(); + } + } + + if (cols > 0) { + XWPFTable wordTable = document.createTable(); + + Node tableChild = table.getFirstChild(); + boolean isFirstRow = true; + while (tableChild != null) { + if (tableChild instanceof org.commonmark.ext.gfm.tables.TableHead || + tableChild instanceof org.commonmark.ext.gfm.tables.TableBody) { + + Node rowNode = tableChild.getFirstChild(); + while (rowNode != null) { + if (rowNode instanceof org.commonmark.ext.gfm.tables.TableRow) { + XWPFTableRow row; + if (isFirstRow) { + row = wordTable.getRow(0); + isFirstRow = false; + } else { + row = wordTable.createRow(); + } + + Node cellNode = rowNode.getFirstChild(); + int cellIndex = 0; + while (cellNode != null && cellIndex < cols) { + if (cellNode instanceof org.commonmark.ext.gfm.tables.TableCell) { + XWPFTableCell cell = row.getCell(cellIndex); + if (cell == null) { + cell = row.addNewTableCell(); + } + cell.setText(getTextContent(cellNode)); + cellIndex++; + } + cellNode = cellNode.getNext(); + } + } + rowNode = rowNode.getNext(); } - currentRun.setText(line); - currentRun.setFontSize(12); } + tableChild = tableChild.getNext(); + } + } + } + + /** + * 处ç†å¼•ç”¨å— + */ + private static void processBlockQuote(XWPFDocument document, BlockQuote blockQuote) { + XWPFParagraph paragraph = document.createParagraph(); + XWPFRun run = paragraph.createRun(); + run.setText("" + getTextContent(blockQuote)); + run.setFontSize(12); + run.setFontFamily("宋体"); + run.setItalic(true); + } + + /** + * 处ç†ä»£ç å— + */ + private static void processCodeBlock(XWPFDocument document, Node codeBlock) { + XWPFParagraph paragraph = document.createParagraph(); + XWPFRun run = paragraph.createRun(); + + String code; + if (codeBlock instanceof FencedCodeBlock) { + code = ((FencedCodeBlock) codeBlock).getLiteral(); + } else { + code = ((IndentedCodeBlock) codeBlock).getLiteral(); + } + + run.setText(code); + run.setFontSize(10); + run.setFontFamily("Courier New"); + // 设置背景色(如果支æŒï¼‰ + } + + /** + * 处ç†å†…è”èŠ‚ç‚¹ï¼ˆç²—ä½“ã€æ–œä½“ã€é“¾æŽ¥ç­‰ï¼‰ + */ + private static void processInlineNodes(XWPFParagraph paragraph, Node node) { + while (node != null) { + if (node instanceof Text) { + XWPFRun run = paragraph.createRun(); + run.setText(((Text) node).getLiteral()); + run.setFontSize(12); + run.setFontFamily("宋体"); + } else if (node instanceof StrongEmphasis) { + XWPFRun run = paragraph.createRun(); + run.setText(getTextContent(node)); + run.setBold(true); + run.setFontSize(12); + run.setFontFamily("宋体"); + } else if (node instanceof Emphasis) { + XWPFRun run = paragraph.createRun(); + run.setText(getTextContent(node)); + run.setItalic(true); + run.setFontSize(12); + run.setFontFamily("宋体"); + } else if (node instanceof Code) { + XWPFRun run = paragraph.createRun(); + run.setText(((Code) node).getLiteral()); + run.setFontSize(10); + run.setFontFamily("Courier New"); + } else if (node instanceof Link) { + XWPFRun run = paragraph.createRun(); + run.setText(getTextContent(node) + " (" + ((Link) node).getDestination() + ")"); + run.setFontSize(12); + run.setFontFamily("宋体"); + run.setColor("0000FF"); + } else { + // 递归处ç†å­èŠ‚ç‚¹ + processInlineNodes(paragraph, node.getFirstChild()); + } + node = node.getNext(); + } + } + + /** + * 获å–节点的文本内容 + */ + private static String getTextContent(Node node) { + StringBuilder text = new StringBuilder(); + extractText(node, text); + return text.toString().trim(); + } + + /** + * 递归æå–文本内容 + */ + private static void extractText(Node node, StringBuilder text) { + if (node instanceof Text) { + text.append(((Text) node).getLiteral()); + } else if (node instanceof Code) { + text.append(((Code) node).getLiteral()); + } else { + Node child = node.getFirstChild(); + while (child != null) { + extractText(child, text); + child = child.getNext(); } } } diff --git a/src/main/java/com/dsideal/base/AI/Model/YunNanModel.java b/src/main/java/com/dsideal/base/AI/Model/YunNanModel.java index a4ecbb61..0062ac89 100644 --- a/src/main/java/com/dsideal/base/AI/Model/YunNanModel.java +++ b/src/main/java/com/dsideal/base/AI/Model/YunNanModel.java @@ -65,20 +65,20 @@ public class YunNanModel { public String createAnalysisPrompt(String dataContent, String[] regions) { String regionNames = String.join("å’Œ", regions); return "你是一ä½ä¸“业的教育数æ®åˆ†æžä¸“家,请基于以下数æ®å¯¹" + regionNames + "的教育资æºé…置情况进行深入对比分æžã€‚\n\n" + - "é‡è¦è¦æ±‚:请生æˆç»“æž„åŒ–çš„çº¯æ–‡æœ¬æ ¼å¼æŠ¥å‘Šï¼Œä½¿ç”¨æ¸…æ™°çš„æ®µè½ç»“构,ä¸è¦ä½¿ç”¨markdown语法。\n\n" + + "é‡è¦è¦æ±‚:请生æˆç»“构化的Markdownæ ¼å¼æŠ¥å‘Šï¼Œä½¿ç”¨æ ‡å‡†çš„Markdown语法,包括标题ã€åˆ—表ã€ç²—体等格å¼ã€‚\n\n" + "请按照以下结构进行分æžå¹¶ç”Ÿæˆä¸“ä¸šçš„åˆ†æžæŠ¥å‘Šï¼š\n\n" + - "1. 执行摘è¦\n" + - " ç®€è¦æ¦‚述两州教育资æºé…置的整体情况和主è¦å‘现\n\n" + - "2. æ•°æ®æ¦‚览\n" + - " 两州基本教育数æ®å¯¹æ¯”和关键指标汇总\n\n" + - "3. 详细对比分æž\n" + - " 教育资æºé…置水平对比ã€å‘展趋势分æžã€ä¼˜åŠ¿ä¸Žä¸è¶³åˆ†æž\n\n" + - "4. 问题识别\n" + - " 存在的主è¦é—®é¢˜å’Œèµ„æºé…ç½®ä¸å‡è¡¡æƒ…况\n\n" + - "5. 建议与对策\n" + - " 针对性改进建议和资æºä¼˜åŒ–é…置方案\n\n" + - "6. 结论\n" + - " 总体评价和未æ¥å‘展方å‘\n\n" + + "## 1. 执行摘è¦\n" + + "ç®€è¦æ¦‚述两州教育资æºé…置的整体情况和主è¦å‘现\n\n" + + "## 2. æ•°æ®æ¦‚览\n" + + "两州基本教育数æ®å¯¹æ¯”和关键指标汇总\n\n" + + "## 3. 详细对比分æž\n" + + "教育资æºé…置水平对比ã€å‘展趋势分æžã€ä¼˜åŠ¿ä¸Žä¸è¶³åˆ†æž\n\n" + + "## 4. 问题识别\n" + + "存在的主è¦é—®é¢˜å’Œèµ„æºé…ç½®ä¸å‡è¡¡æƒ…况\n\n" + + "## 5. 建议与对策\n" + + "针对性改进建议和资æºä¼˜åŒ–é…置方案\n\n" + + "## 6. 结论\n" + + "总体评价和未æ¥å‘展方å‘\n\n" + "请确ä¿åˆ†æžå®¢è§‚ã€ä¸“业,数æ®å¼•ç”¨å‡†ç¡®ï¼Œå»ºè®®å…·æœ‰å¯æ“作性。\n\n" + "=== åŽŸå§‹æ•°æ® ===\n" + dataContent; } diff --git a/src/main/java/com/dsideal/base/Util/CallDeepSeek.java b/src/main/java/com/dsideal/base/Util/CallDeepSeek.java index bde0f252..889d50b2 100644 --- a/src/main/java/com/dsideal/base/Util/CallDeepSeek.java +++ b/src/main/java/com/dsideal/base/Util/CallDeepSeek.java @@ -148,6 +148,7 @@ public class CallDeepSeek { if (saveToFile && outputPath != null) { FileUtil.writeString(responseContent, new File(outputPath), "UTF-8"); listener.onComplete("内容已æˆåŠŸä¿å­˜åˆ°" + outputPath); + System.out.println("内容已æˆåŠŸä¿å­˜åˆ°" + outputPath); } else { listener.onComplete(responseContent); }