From 475d65743b6521a544bfb402bd77d29aa34934db Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Mon, 16 Jun 2025 08:59:02 +0800 Subject: [PATCH] 'commit' --- .../java/com/dsideal/base/AI/TestMax32K.java | 355 +++++++++++++++++- 1 file changed, 346 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/dsideal/base/AI/TestMax32K.java b/src/main/java/com/dsideal/base/AI/TestMax32K.java index 6cc85faf..7fc737cc 100644 --- a/src/main/java/com/dsideal/base/AI/TestMax32K.java +++ b/src/main/java/com/dsideal/base/AI/TestMax32K.java @@ -1,10 +1,15 @@ package com.dsideal.base.AI; +import com.dsideal.base.AI.Generator.PptGenerator; import com.dsideal.base.DataEase.Model.DataEaseModel; import com.dsideal.base.Util.LocalMysqlConnectUtil; +import com.dsideal.base.Util.PptAIKit; import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.activerecord.Record; import com.dsideal.base.Util.CallDeepSeek; + +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.Set; @@ -15,20 +20,352 @@ import java.text.SimpleDateFormat; import java.util.Date; import cn.hutool.core.io.FileUtil; import java.io.File; +import java.util.Scanner; +import com.dsideal.base.AI.Generator.WordGenerator; public class TestMax32K { - private static final int MAX_CHUNK_SIZE = 30000; // 30K字符限制 - + private static final int MAX_CHUNK_SIZE = 8000; // 8000字符限制 + private static boolean dataSubmitted = false; // 标记数据是否已提交 + public static void main(String[] args) { - LocalMysqlConnectUtil.Init(); - String[] regions = {"文山州", "楚雄州"}; - // 直接调用生成综合报告 - String report = generateComprehensiveReport(regions); - System.out.println("\n=== 最终报告 ==="); - System.out.println(report); + Scanner scanner = new Scanner(System.in); + + try { + // 第一步:提交所有数据块 + System.out.println("开始提交数据到大模型..."); + submitAllDataChunks(); + dataSubmitted = true; + System.out.println("\n数据提交完成!"); + + // 第二步:询问用户想生成哪种格式 + while (true) { + System.out.println("\n=== 报告生成选项 ==="); + System.out.println("现在可以基于上传的数据生成以下格式的报告:"); + System.out.println("1. WORD文档 (.docx)"); + System.out.println("2. HTML网页 (.html)"); + System.out.println("3. PPT演示文稿 (.pptx)"); + System.out.println("4. 生成全部格式"); + System.out.println("5. 退出程序"); + System.out.print("\n请选择您想生成的报告格式 (1-5): "); + + String choice = scanner.nextLine().trim(); + + switch (choice) { + case "1": + generateWordReport(); + break; + case "2": + generateHtmlReport(); + break; + case "3": + generatePptReport(); + break; + case "4": + System.out.println("\n开始生成全部格式的报告..."); + generateWordReport(); + generateHtmlReport(); + generatePptReport(); + System.out.println("\n所有格式的报告已生成完成!"); + break; + case "5": + System.out.println("程序退出。"); + return; + default: + System.out.println("无效选择,请输入 1-5 之间的数字。"); + continue; + } + + System.out.print("\n是否继续生成其他格式?(y/n): "); + String continueChoice = scanner.nextLine().trim().toLowerCase(); + if (!continueChoice.equals("y") && !continueChoice.equals("yes")) { + System.out.println("程序结束。感谢使用!"); + break; + } + } + + } catch (Exception e) { + System.err.println("程序执行出错: " + e.getMessage()); + e.printStackTrace(); + } finally { + scanner.close(); + } + } + + /** + * 提交所有数据块到大模型 + */ + private static void submitAllDataChunks() throws Exception { + if (dataSubmitted) { + System.out.println("数据已经提交过了,无需重复提交。"); + return; + } + + // 添加获取参数的代码 + String[] regions = { "楚雄州","文山州"}; // 或者根据需要设置具体的地区 + String sql = "select table_name as TABLE_NAME from core_dataset_table where dataset_group_id in (select id from core_dataset_group where pid='1036317909951057920')"; + List tableList = Db.use(DataEaseModel.DB_NAME).find(sql); + + // 修改这一行,传递正确的参数 + String[] dataChunks = getDataChunks(regions, tableList); + System.out.println("总共需要提交 " + dataChunks.length + " 个数据块"); + + CountDownLatch latch = new CountDownLatch(dataChunks.length); + + for (int i = 0; i < dataChunks.length; i++) { + final int chunkIndex = i; + final boolean isLastChunk = (i == dataChunks.length - 1); + + String prompt; + if (isLastChunk) { + prompt = "这是最后一个数据块(第" + (chunkIndex + 1) + "/" + dataChunks.length + "个)。\n" + + "请确认已接收所有数据块,现在数据提交完成。请回复'数据接收完成'以确认。\n\n" + + "数据内容:\n" + dataChunks[chunkIndex]; + } else { + prompt = "这是第" + (chunkIndex + 1) + "/" + dataChunks.length + "个数据块,后续还有更多数据。\n" + + "请接收此数据块,无需分析,等待所有数据提交完成。\n\n" + + "数据内容:\n" + dataChunks[chunkIndex]; + } + + CallDeepSeek.callDeepSeekStream(prompt, new CallDeepSeek.SSEListener() { + @Override + public void onData(String data) { + if (isLastChunk) { + System.out.println("\n大模型确认: " + data); + } + } + + @Override + public void onComplete(String fullResponse) { + System.out.println("数据块 " + (chunkIndex + 1) + "/" + dataChunks.length + " 提交完成"); + latch.countDown(); + } + + @Override + public void onError(String error) { + System.err.println("数据块 " + (chunkIndex + 1) + " 提交失败: " + error); + latch.countDown(); + } + }); + + // 避免请求过于频繁 + Thread.sleep(1000); + } + + latch.await(); + } + + /** + * 生成Word报告 + */ + private static void generateWordReport() { + if (!dataSubmitted) { + System.out.println("请先提交数据!"); + return; + } + + System.out.println("\n开始生成Word报告..."); + + try { + String prompt = "基于之前提交的所有数据,请生成一份详细的Word格式分析报告。\n" + + "要求:\n" + + "1. 使用Markdown格式输出\n" + + "2. 包含完整的数据分析和洞察\n" + + "3. 结构清晰,包含标题、摘要、详细分析、结论等部分\n" + + "4. 适合转换为Word文档格式"; + + StringBuilder wordContent = new StringBuilder(); + CountDownLatch latch = new CountDownLatch(1); + + CallDeepSeek.callDeepSeekStream(prompt, new CallDeepSeek.SSEListener() { + @Override + public void onData(String data) { + wordContent.append(data); + System.out.print("."); // 显示进度 + } + + @Override + public void onComplete(String fullResponse) { + System.out.println("\nWord报告生成完成!"); + + // 保存Word文件 + try { + String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + String fileName = "analysis_report_" + timestamp + ".docx"; + + // 使用WordGenerator生成Word文档 + String[] regions = {"云南省"}; // 或者根据实际情况设置地区 + WordGenerator.generateWordDocument(wordContent.toString(), fileName, regions); + + System.out.println("Word报告已保存至: WebRoot/upload/" + fileName); + } catch (Exception e) { + System.err.println("保存Word文档失败: " + e.getMessage()); + } + + latch.countDown(); + } + + @Override + public void onError(String error) { + System.err.println("\n生成Word报告失败: " + error); + latch.countDown(); + } + }); + + latch.await(); + + } catch (Exception e) { + System.err.println("生成Word报告时出错: " + e.getMessage()); + } + } + + /** + * 生成HTML报告 + */ + private static void generateHtmlReport() { + if (!dataSubmitted) { + System.out.println("请先提交数据!"); + return; + } + + System.out.println("\n开始生成HTML报告..."); + + try { + String prompt = "基于之前提交的所有数据,请生成一份详细的HTML格式分析报告。\n" + + "要求:\n" + + "1. 生成完整的HTML页面代码\n" + + "2. 包含CSS样式,确保页面美观\n" + + "3. 必须包含以下9种图表的完整代码:\n" + + " - 人口变化趋势图(折线图)\n" + + " - 教育规模分布图(柱状图)\n" + + " - 城乡人口对比图(饼图)\n" + + " - 学龄人口预测图(面积图)\n" + + " - 教育资源配置图(雷达图)\n" + + " - 区域教育发展对比图(条形图)\n" + + " - 教育投入产出分析图(散点图)\n" + + " - 师资力量分布图(热力图)\n" + + " - 综合发展指数图(仪表盘图)\n" + + "4. 使用ECharts库实现图表\n" + + "5. 页面结构清晰,包含标题、摘要、图表展示、数据分析、结论等部分\n" + + "6. 确保所有图表都有真实的数据和完整的配置"; + + StringBuilder htmlContent = new StringBuilder(); + CountDownLatch latch = new CountDownLatch(1); + + CallDeepSeek.callDeepSeekStream(prompt, new CallDeepSeek.SSEListener() { + @Override + public void onData(String data) { + htmlContent.append(data); + System.out.print("."); // 显示进度 + } + + @Override + public void onComplete(String fullResponse) { + System.out.println("\nHTML报告生成完成!"); + + // 保存HTML文件 + try { + String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + String fileName = "analysis_report_" + timestamp + ".html"; + String filePath = "WebRoot/upload/" + fileName; + + Files.write(Paths.get(filePath), htmlContent.toString().getBytes("UTF-8")); + + System.out.println("HTML报告已保存至: " + filePath); + } catch (Exception e) { + System.err.println("保存HTML文件失败: " + e.getMessage()); + } + + latch.countDown(); + } + + @Override + public void onError(String error) { + System.err.println("\n生成HTML报告失败: " + error); + latch.countDown(); + } + }); + + latch.await(); + + } catch (Exception e) { + System.err.println("生成HTML报告时出错: " + e.getMessage()); + } + } + + /** + * 生成PPT报告 + */ + private static void generatePptReport() { + if (!dataSubmitted) { + System.out.println("请先提交数据!"); + return; + } + + System.out.println("\n开始生成PPT报告..."); + + try { + String prompt = "基于之前提交的所有数据,请生成一份PPT演示文稿的详细内容大纲。\n" + + "要求:\n" + + "1. 提供完整的PPT结构和每页内容\n" + + "2. 包含标题页、目录、数据分析、图表说明、结论建议等\n" + + "3. 每页PPT都要有明确的标题和要点\n" + + "4. 适合制作成专业的演示文稿\n" + + "5. 内容要简洁明了,重点突出"; + + StringBuilder pptContent = new StringBuilder(); + CountDownLatch latch = new CountDownLatch(1); + + CallDeepSeek.callDeepSeekStream(prompt, new CallDeepSeek.SSEListener() { + @Override + public void onData(String data) { + pptContent.append(data); + System.out.print("."); // 显示进度 + } + + @Override + public void onComplete(String fullResponse) { + System.out.println("\nPPT内容生成完成!"); + + // 调用PptGenerator生成PPT + try { + String timestamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + String fileName = "analysis_report_" + timestamp + ".pptx"; + + // 使用PptGenerator生成PPT + String token = PptAIKit.createApiToken("dsideal", 1000); + String pptInfo = PptGenerator.generatePptFromMarkdown(pptContent.toString(), token); + + // 保存PPT信息到文本文件 + String infoFilePath = "WebRoot/upload/ppt_info_" + timestamp + ".txt"; + if (pptInfo != null) { + Files.write(Paths.get(infoFilePath), pptInfo.getBytes("UTF-8")); + System.out.println("PPT生成信息已保存至: " + infoFilePath); + } else { + Files.write(Paths.get(infoFilePath), "PPT生成失败".getBytes("UTF-8")); + System.out.println("PPT生成失败,错误信息已保存至: " + infoFilePath); + } + + } catch (Exception e) { + System.err.println("生成PPT失败: " + e.getMessage()); + } + + latch.countDown(); + } + + @Override + public void onError(String error) { + System.err.println("\n生成PPT报告失败: " + error); + latch.countDown(); + } + }); + + latch.await(); + + } catch (Exception e) { + System.err.println("生成PPT报告时出错: " + e.getMessage()); + } } - /** * 分割过大的单表数据 */