You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

148 lines
6.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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();
}
}