main
HuangHai 1 month ago
parent 001c473ba4
commit 475d65743b

@ -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<Record> 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());
}
}
/**
*
*/

Loading…
Cancel
Save