diff --git a/src/store/modules/sse.ts b/src/store/modules/sse.ts index f0a2c68..3be5804 100644 --- a/src/store/modules/sse.ts +++ b/src/store/modules/sse.ts @@ -1,6 +1,10 @@ import { defineStore } from "pinia"; import { ref, computed } from "vue"; -import { SseClient, type ProjectInitTaskVO } from "@/utils/sse/SseClient"; +import { + SseClient, + type ProjectInitTaskVO, + type RiskAssessTaskVO +} from "@/utils/sse/SseClient"; import { store } from "../utils"; import { getMyTasks as fetchTasksApi, @@ -25,6 +29,14 @@ export const useSseStore = defineStore("sse", () => { myTasks.value.some(t => t.status === "processing" || t.status === "pending") ); + // 风险评估任务状态 + const riskAssessTask = ref(null); + const riskAssessProgress = ref(0); + const riskAssessStatus = ref< + "idle" | "submitted" | "processing" | "completed" | "error" + >("idle"); + const riskAssessErrorMessage = ref(""); + // Getters const getIsConnected = computed(() => isConnected.value); const getCurrentTask = computed(() => currentTask.value); @@ -115,6 +127,56 @@ export const useSseStore = defineStore("sse", () => { isConnected.value = false; }); + // ============ 风险评估事件监听 ============ + // 监听风险评估任务提交 + sseClient.value.on("risk-assess-submitted", (data: any) => { + riskAssessStatus.value = "submitted"; + console.log("SSE Store: 风险评估任务已提交", data); + }); + + // 监听风险评估进度 + sseClient.value.on("risk-assess-progress", (data: RiskAssessTaskVO) => { + riskAssessTask.value = data; + riskAssessProgress.value = data.progress; + riskAssessStatus.value = "processing"; + console.log( + `SSE Store: 风险评估进度 ${data.progress}% - ${data.progressMessage}` + ); + }); + + // 监听风险评估完成 + sseClient.value.on("risk-assess-complete", (data: RiskAssessTaskVO) => { + riskAssessTask.value = data; + riskAssessProgress.value = 100; + riskAssessStatus.value = "completed"; + console.log("SSE Store: 风险评估完成", data.result); + + // 发送通知 + ElNotification({ + title: "风险评估完成", + message: `项目风险评估已完成,已识别 ${data.result?.identifiedRisks?.length || 0} 个风险。`, + type: "success", + duration: 5000, + position: "top-right" + }); + }); + + // 监听风险评估错误 + sseClient.value.on("risk-assess-error", (data: { error: string }) => { + riskAssessStatus.value = "error"; + riskAssessErrorMessage.value = data.error; + console.error("SSE Store: 风险评估错误", data.error); + + // 发送错误通知 + ElNotification({ + title: "风险评估失败", + message: data.error || "风险评估失败,请重试", + type: "error", + duration: 5000, + position: "top-right" + }); + }); + // 建立连接(异步,在后台运行) sseClient.value.connect().catch(err => { console.error("SSE Store: 连接失败", err); @@ -159,6 +221,16 @@ export const useSseStore = defineStore("sse", () => { errorMessage.value = ""; } + /** + * 重置风险评估任务状态 + */ + function resetRiskAssessStatus() { + riskAssessTask.value = null; + riskAssessProgress.value = 0; + riskAssessStatus.value = "idle"; + riskAssessErrorMessage.value = ""; + } + /** * 查询我的任务列表 */ @@ -182,6 +254,11 @@ export const useSseStore = defineStore("sse", () => { taskStatus, errorMessage, myTasks, + // 风险评估状态 + riskAssessTask, + riskAssessProgress, + riskAssessStatus, + riskAssessErrorMessage, // Getters getIsConnected, getCurrentTask, @@ -194,6 +271,7 @@ export const useSseStore = defineStore("sse", () => { closeSse, submitProjectInitTask, resetTaskStatus, + resetRiskAssessStatus, fetchMyTasks }; }); diff --git a/src/utils/sse/SseClient.ts b/src/utils/sse/SseClient.ts index ef056b1..c956005 100644 --- a/src/utils/sse/SseClient.ts +++ b/src/utils/sse/SseClient.ts @@ -28,6 +28,23 @@ export interface ProjectInitTaskVO { errorMessage?: string; } +/** 风险评估任务VO */ +export interface RiskAssessTaskVO { + taskId: string; + userId: string; + projectId: string; + projectName?: string; + status: string; + statusDesc: string; + progress: number; + progressMessage: string; + createTime: string; + startTime?: string; + completeTime?: string; + result?: any; + errorMessage?: string; +} + type SseEventCallback = (data: any, message?: SseMessage) => void; export class SseClient { @@ -181,22 +198,30 @@ export class SseClient { console.log("任务已提交:", message); if (message.type === "project-init") { this.emit("project-init-submitted", message.data, message); + } else if (message.type === "risk-assess") { + this.emit("risk-assess-submitted", message.data, message); } break; case "progress": if (message.type === "project-init") { this.emit("project-init-progress", message.data, message); + } else if (message.type === "risk-assess") { + this.emit("risk-assess-progress", message.data, message); } break; case "complete": if (message.type === "project-init") { this.emit("project-init-complete", message.data, message); + } else if (message.type === "risk-assess") { + this.emit("risk-assess-complete", message.data, message); } break; case "error": console.error("SSE 错误事件:", message); if (message.type === "project-init") { this.emit("project-init-error", message.data, message); + } else if (message.type === "risk-assess") { + this.emit("risk-assess-error", message.data, message); } this.emit("error", message.data, message); break; diff --git a/src/views/risk-assessment/index.vue b/src/views/risk-assessment/index.vue index 548ad8b..7595b17 100644 --- a/src/views/risk-assessment/index.vue +++ b/src/views/risk-assessment/index.vue @@ -1,6 +1,8 @@ 筛选 - + - 新建评估 + {{ isAssessing ? "评估中..." : "新建评估" }} + + +
+ + + +
+
+ AI 正在进行风险评估 + {{ riskAssessProgress }}% +
+ +

+ {{ riskAssessTask?.progressMessage || "正在分析项目数据..." }} +

+
+
+
+