diff --git a/src/main/java/com/dsideal/base/Tools/AiGenerate.java b/src/main/java/com/dsideal/base/Tools/AiGenerate.java index 56dc0558..8f3a7f51 100644 --- a/src/main/java/com/dsideal/base/Tools/AiGenerate.java +++ b/src/main/java/com/dsideal/base/Tools/AiGenerate.java @@ -25,12 +25,10 @@ public class AiGenerate { String[] regions = {"文山州", "楚雄州"}; // 第一步:数据获取 - System.out.println("=== 开始数据收集 ==="); String dataContent = DataCollector.collectEducationData(regions); String analysisPrompt = DataCollector.createAnalysisPrompt(dataContent, regions); // 第二步:AI分析并生成Word文档 - System.out.println("=== 开始AI分析和Word文档生成 ==="); generateWordReport(analysisPrompt, regions); } catch (Exception e) { @@ -46,7 +44,6 @@ public class AiGenerate { String configFile = "application.yaml"; BaseApplication.PropKit = new YamlProp(configFile); LocalMysqlConnectUtil.Init(); - System.out.println("配置初始化完成"); } /** @@ -55,9 +52,9 @@ public class AiGenerate { private static void generateWordReport(String analysisPrompt, String[] regions) { // 生成输出文件名(不包含路径) String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); - String fileName = "教育资源对比分析报告_" + timestamp + ".docx"; - System.out.println("开始调用DeepSeek进行数据分析..."); + // 构建区域名称 + String regionName = String.join("与", regions); // 调用DeepSeek进行分析 CallDeepSeek.callDeepSeekStream(analysisPrompt, new CallDeepSeek.SSEListener() { @@ -75,18 +72,28 @@ public class AiGenerate { System.out.println("\n\n=== Word文档分析完成 ==="); try { + // 使用完整的分析结果 + String analysisResult = fullResponse.toString(); + // 生成Word文档 - String wordFilePath = WordGenerator.generateWordDocument(fullResponse.toString(), fileName, regions); - System.out.println("Word分析报告已保存到: " + wordFilePath); - - // 第三步:生成PPT - System.out.println("\n\n=== 开始生成PPT ==="); - String uid = "dsideal"; - String apiToken = PptAIKit.createApiToken(uid, null); - String pptFilePath = PptGenerator.generatePptPresentation(fullResponse.toString(), regions, apiToken); - + String wordOutputPath = "D:\\dsWork\\YunNanDsBase\\WebRoot\\upload\\" + regionName + "_教育分析报告_" + timestamp + ".docx"; + String wordFilePath = WordGenerator.generateWordDocument(analysisResult, wordOutputPath, regions); + if (wordFilePath != null) { + System.out.println("Word文档生成完成: " + wordFilePath); + } + + // 生成HTML报告 + String htmlOutputPath = "D:\\dsWork\\YunNanDsBase\\WebRoot\\upload\\" + regionName + "_教育分析报告_" + timestamp + ".html"; + String htmlFilePath = HtmlGenerator.generateHtmlReport(analysisResult, htmlOutputPath, regionName); + if (htmlFilePath != null) { + System.out.println("HTML报告生成完成: " + htmlFilePath); + } + + // 生成PPT + String token = PptAIKit.createApiToken("dsideal", 1000); + String pptFilePath = PptGenerator.generatePptPresentation(analysisResult, regions, token); if (pptFilePath != null) { - System.out.println("PPT演示文稿已保存到: " + pptFilePath); + System.out.println("PPT演示文稿生成完成: " + pptFilePath); } } catch (Exception e) { diff --git a/src/main/java/com/dsideal/base/Tools/HtmlGenerator.java b/src/main/java/com/dsideal/base/Tools/HtmlGenerator.java new file mode 100644 index 00000000..288eee4a --- /dev/null +++ b/src/main/java/com/dsideal/base/Tools/HtmlGenerator.java @@ -0,0 +1,98 @@ +package com.dsideal.base.Tools; + +import com.dsideal.base.Tools.Util.CallDeepSeek; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class HtmlGenerator { + + /** + * 生成HTML格式的总结报告 + * @param analysisResult AI分析结果 + * @param outputPath 输出文件路径 + * @param regionName 地区名称 + * @return 生成的HTML文件路径 + */ + public static String generateHtmlReport(String analysisResult, String outputPath, String regionName) { + try { + // 构建DeepSeek提示词,要求生成包含图表的HTML报告 + String prompt = buildHtmlPrompt(analysisResult, regionName); + + System.out.println("正在调用DeepSeek生成HTML报告..."); + + // 调用DeepSeek API生成HTML内容 + String htmlContent = CallDeepSeek.callDeepSeek(prompt); + + if (htmlContent == null || htmlContent.trim().isEmpty()) { + System.err.println("DeepSeek生成HTML内容失败"); + return null; + } + + // 清理HTML内容(移除可能的markdown标记) + htmlContent = cleanHtmlContent(htmlContent); + + // 保存HTML文件 + try (FileWriter writer = new FileWriter(outputPath, StandardCharsets.UTF_8)) { + writer.write(htmlContent); + } + + System.out.println("HTML报告生成成功: " + outputPath); + return outputPath; + + } catch (IOException e) { + System.err.println("保存HTML文件时出错: " + e.getMessage()); + e.printStackTrace(); + return null; + } catch (Exception e) { + System.err.println("生成HTML报告时出错: " + e.getMessage()); + e.printStackTrace(); + return null; + } + } + + /** + * 构建DeepSeek提示词 + */ + private static String buildHtmlPrompt(String analysisResult, String regionName) { + return String.format( + "请根据以下数据分析结果,生成一个完整的HTML格式报告。要求:\n\n" + + "1. 生成完整的HTML文档结构(包含、、
、等标签)\n" + + "2. 使用现代化的CSS样式,包含响应式设计\n" + + "3. 必须包含以下类型的图表(使用Chart.js库):\n" + + " - 人口分布饼图\n" + + " - 教育资源对比柱状图\n" + + " - 综合指标雷达图\n" + + " - 发展趋势线图\n" + + "4. 图表数据要根据分析内容合理推算和展示\n" + + "5. 报告标题为:《%s人口变化趋势对基础教育的影响分析报告》\n" + + "6. 包含报告摘要、详细分析、图表展示、结论建议等章节\n" + + "7. 样式要美观专业,适合作为正式报告展示\n" + + "8. 直接输出完整的HTML代码,不要用markdown包装\n\n" + + "数据分析结果:\n%s\n\n" + + "请生成完整的HTML代码:", + regionName, analysisResult + ); + } + + /** + * 清理HTML内容 + */ + private static String cleanHtmlContent(String htmlContent) { + // 移除可能的markdown代码块标记 + htmlContent = htmlContent.replaceAll("```html\\s*", ""); + htmlContent = htmlContent.replaceAll("```\\s*$", ""); + htmlContent = htmlContent.replaceAll("^```\\s*", ""); + + // 确保HTML文档完整性 + if (!htmlContent.trim().toLowerCase().startsWith("\n\n\n\n