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