@ -1,10 +1,15 @@
package com.dsideal.base.AI ;
package com.dsideal.base.AI ;
import com.dsideal.base.AI.Generator.PptGenerator ;
import com.dsideal.base.DataEase.Model.DataEaseModel ;
import com.dsideal.base.DataEase.Model.DataEaseModel ;
import com.dsideal.base.Util.LocalMysqlConnectUtil ;
import com.dsideal.base.Util.LocalMysqlConnectUtil ;
import com.dsideal.base.Util.PptAIKit ;
import com.jfinal.plugin.activerecord.Db ;
import com.jfinal.plugin.activerecord.Db ;
import com.jfinal.plugin.activerecord.Record ;
import com.jfinal.plugin.activerecord.Record ;
import com.dsideal.base.Util.CallDeepSeek ;
import com.dsideal.base.Util.CallDeepSeek ;
import java.nio.file.Files ;
import java.nio.file.Paths ;
import java.util.List ;
import java.util.List ;
import java.util.Map ;
import java.util.Map ;
import java.util.Set ;
import java.util.Set ;
@ -15,19 +20,351 @@ import java.text.SimpleDateFormat;
import java.util.Date ;
import java.util.Date ;
import cn.hutool.core.io.FileUtil ;
import cn.hutool.core.io.FileUtil ;
import java.io.File ;
import java.io.File ;
import java.util.Scanner ;
import com.dsideal.base.AI.Generator.WordGenerator ;
public class TestMax32K {
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 ) {
public static void main ( String [ ] args ) {
LocalMysqlConnectUtil . Init ( ) ;
Scanner scanner = new Scanner ( System . in ) ;
String [ ] regions = { "文山州" , "楚雄州" } ;
// 直接调用生成综合报告
try {
String report = generateComprehensiveReport ( regions ) ;
// 第一步:提交所有数据块
System . out . println ( "\n=== 最终报告 ===" ) ;
System . out . println ( "开始提交数据到大模型..." ) ;
System . out . println ( report ) ;
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 ( ) ) ;
}
}
/ * *
/ * *
* 分 割 过 大 的 单 表 数 据
* 分 割 过 大 的 单 表 数 据