|
|
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;
|
|
|
import com.jfinal.aop.Before;
|
|
|
import com.jfinal.core.Controller;
|
|
|
import com.jfinal.ext.interceptor.GET;
|
|
|
import com.jfinal.kit.PathKit;
|
|
|
import com.jfinal.kit.SseEmitter;
|
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.Date;
|
|
|
|
|
|
public class AiController extends Controller {
|
|
|
YunNanModel ym = new YunNanModel();
|
|
|
|
|
|
/**
|
|
|
* 对比市州,生成对比报告【Word】
|
|
|
*
|
|
|
* @param shiZhouA 市州A
|
|
|
* @param shiZhouB 市州B
|
|
|
* http://10.10.21.20:9200/dsBase/ai/compareShiZhouWord?shiZhouA=文山州&shiZhouB=楚雄州
|
|
|
*/
|
|
|
@Before({GET.class})
|
|
|
public void compareShiZhouWord(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");
|
|
|
|
|
|
// 调用DeepSeek API进行流式分析
|
|
|
CallDeepSeek.callDeepSeekStream(content, new CallDeepSeek.SSEListener() {
|
|
|
@Override
|
|
|
public void onData(String data) {
|
|
|
sseEmitter.sendMessage("data: " + data + "\n\n"); // 将DeepSeek返回的数据实时推送给前端
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void onComplete(String fullResponse) {
|
|
|
try {
|
|
|
// AI分析完成,开始生成Word文档
|
|
|
sseEmitter.sendMessage("data: AI深度分析完成,正在生成报告文档...\n\n");
|
|
|
String fileName = "/upload/" + shiZhouA + "与" + shiZhouB + "_教育分析报告_" +
|
|
|
new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + ".docx";
|
|
|
String filePath = PathKit.getWebRootPath() + fileName;
|
|
|
WordGenerator.generateWordDocument(fullResponse, filePath, new String[]{shiZhouA, shiZhouB});
|
|
|
|
|
|
String baseUrl = CommonUtil.getBaseUrl(getRequest());
|
|
|
sseEmitter.sendMessage("data: 报告生成完成!文件Http 相对路径:" + baseUrl + "/dsBase" + fileName + "\n\n");
|
|
|
sseEmitter.sendMessage("data: [DONE]\n\n");
|
|
|
|
|
|
// 完成SSE连接
|
|
|
sseEmitter.complete();
|
|
|
} catch (Exception e) {
|
|
|
sseEmitter.sendMessage("data: 生成报告时发生错误:" + 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();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 对比市州,生成对比报告【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();
|
|
|
}
|
|
|
}
|