From 7ebbf13749dafb5c5dbd67353476cb20224e340b Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Sat, 14 Jun 2025 07:17:14 +0800 Subject: [PATCH] 'commit' --- .../base/AI/Controller/AiController.java | 69 +++++++++++++++++ .../base/AI/Generator/HtmlGenerator.java | 77 ++++++++----------- 2 files changed, 99 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/dsideal/base/AI/Controller/AiController.java b/src/main/java/com/dsideal/base/AI/Controller/AiController.java index 79efd670..e29d7638 100644 --- a/src/main/java/com/dsideal/base/AI/Controller/AiController.java +++ b/src/main/java/com/dsideal/base/AI/Controller/AiController.java @@ -1,6 +1,7 @@ package com.dsideal.base.AI.Controller; import com.dsideal.base.AI.Generator.WordGenerator; +import com.dsideal.base.AI.Generator.HtmlGenerator; import com.dsideal.base.AI.Model.YunNanModel; import com.dsideal.base.Util.CallDeepSeek; import com.dsideal.base.Util.CommonUtil; @@ -75,4 +76,72 @@ public class AiController extends Controller { sseEmitter.waiting(100); renderNull(); } + + /** + * 对比市州,生成对比报告【HTML】 + * + * @param shiZhouA 市州A + * @param shiZhouB 市州B + * http://10.10.21.20:9200/dsBase/ai/compareShiZhouHtml?shiZhouA=文山州&shiZhouB=楚雄州 + */ + @Before({GET.class}) + public void compareShiZhouHtml(String shiZhouA, String shiZhouB) throws Exception { + // 数据获取 + String content = ym.collectEducationData(new String[]{shiZhouA, shiZhouB}); + //创建sse + final SseEmitter sseEmitter = new SseEmitter(getResponse()); + // 发送开始分析的消息 + sseEmitter.sendMessage("data: 开始数据分析...\n\n"); + + // 构建HTML提示词,直接生成HTML报告 + String regionName = shiZhouA + "与" + shiZhouB; + String htmlPrompt = HtmlGenerator.buildHtmlPrompt(content, regionName); + + // 调用DeepSeek API生成HTML报告 + CallDeepSeek.callDeepSeekStream(htmlPrompt, new CallDeepSeek.SSEListener() { + @Override + public void onData(String data) { + // 实时推送HTML生成进度 + sseEmitter.sendMessage("data: " + data + "\n\n"); + } + + @Override + public void onComplete(String fullResponse) { + try { + // HTML生成完成,保存文件 + sseEmitter.sendMessage("data: HTML报告生成完成,正在保存文件...\n\n"); + String fileName = "/upload/" + shiZhouA + "与" + shiZhouB + "_教育分析报告_" + + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + ".html"; + String filePath = PathKit.getWebRootPath() + fileName; + + // 清理并保存HTML内容 + HtmlGenerator htmlGenerator = new HtmlGenerator(); + htmlGenerator.saveHtmlContent(fullResponse, filePath); + + String baseUrl = CommonUtil.getBaseUrl(getRequest()); + sseEmitter.sendMessage("data: HTML报告生成完成!文件Http 相对路径:" + baseUrl + "/dsBase" + fileName + "\n\n"); + sseEmitter.sendMessage("data: [DONE]\n\n"); + + // 完成SSE连接 + sseEmitter.complete(); + } catch (Exception e) { + sseEmitter.sendMessage("data: 保存HTML文件时发生错误:" + e.getMessage() + "\n\n"); + sseEmitter.sendMessage("data: [DONE]\n\n"); + sseEmitter.complete(); + } + } + + @Override + public void onError(String error) { + // 发送错误信息给前端 + sseEmitter.sendMessage("data: 调用DeepSeek API异常:" + error + "\n\n"); + sseEmitter.sendMessage("data: [DONE]\n\n"); + sseEmitter.complete(); + } + }); + + //锁住等待子线程推送完成 + sseEmitter.waiting(100); + renderNull(); + } } diff --git a/src/main/java/com/dsideal/base/AI/Generator/HtmlGenerator.java b/src/main/java/com/dsideal/base/AI/Generator/HtmlGenerator.java index 538c5ca1..4d61364d 100644 --- a/src/main/java/com/dsideal/base/AI/Generator/HtmlGenerator.java +++ b/src/main/java/com/dsideal/base/AI/Generator/HtmlGenerator.java @@ -1,74 +1,57 @@ package com.dsideal.base.AI.Generator; -import com.dsideal.base.Util.CallDeepSeek; import java.io.FileWriter; import java.io.IOException; import java.nio.charset.StandardCharsets; public class HtmlGenerator { + + /** + * 构建HTML提示词 + */ + public static String buildHtmlPrompt(String dataContent, 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, dataContent + ); + } /** - * 生成HTML格式的总结报告 - * @param analysisResult AI分析结果 + * 保存HTML内容到文件 + * @param htmlContent HTML内容 * @param outputPath 输出文件路径 - * @param regionName 地区名称 - * @return 生成的HTML文件路径 */ - public void generateHtmlReport(String analysisResult, String outputPath, String regionName) { + public void saveHtmlContent(String htmlContent, String outputPath) { 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内容失败"); - } - - // 清理HTML内容(移除可能的markdown标记) + // 清理HTML内容 htmlContent = cleanHtmlContent(htmlContent); // 保存HTML文件 try (FileWriter writer = new FileWriter(outputPath, StandardCharsets.UTF_8)) { writer.write(htmlContent); } - System.out.println("HTML报告生成成功: " + outputPath); + System.out.println("HTML文件保存成功: " + outputPath); } catch (IOException e) { System.err.println("保存HTML文件时出错: " + e.getMessage()); e.printStackTrace(); - } catch (Exception e) { - System.err.println("生成HTML报告时出错: " + e.getMessage()); - e.printStackTrace(); + throw new RuntimeException("保存HTML文件失败", e); } } - /** - * 构建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内容 */