From a8ac40d6fb658db8adec409601a581eb32df9880 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E8=82=A5=E7=BE=8A?= <1048382248@qq.com> Date: Thu, 5 Mar 2026 18:15:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20=E6=8B=86=E5=88=86?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=B8=8E=E5=B7=A5=E4=BD=9C=E6=B5=81=E7=9A=84?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E8=BF=9B=E5=BA=A6=20=E6=96=B0=E5=A2=9E=20PPT?= =?UTF-8?q?=E6=B8=85=E6=B4=97=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VideoAnalysis/Expand/CoravelExpand.cs | 4 + VideoAnalysis/WebUI/.env.development | 2 +- VideoAnalysis/WebUI/src/api/videoTask.ts | 34 ++- .../layout/components/lay-navbar/index.vue | 14 + .../src/layout/components/lay-tag/index.vue | 18 +- .../WebUI/src/router/modules/home.ts | 24 +- .../WebUI/src/views/welcome/index.vue | 282 +++++++++++++----- .../WebUI/src/views/welcome/monitor.vue | 96 ++++++ .../src/views/welcome/showTidySlideTask.vue | 117 ++++++++ .../WebUI/src/views/welcome/workflowConfig.ts | 61 ++++ VideoAnalysis/appsettings.json | 2 +- .../AICore/FFMPGE/FFMPGEHandle.cs | 20 +- .../AICore/GPT/ChatGPT/ChatGPTClient.cs | 4 +- .../AICore/GPT/DeepSeek/DeepSeekGPTClient.cs | 6 +- VideoAnalysisCore/AICore/GPT/GPTClient.cs | 22 +- .../AICore/GPT/GTP_Analysis_1.cs | 46 +-- .../AICore/GPT/Gemini/GeminiGPTClient.cs | 4 +- .../AICore/SherpaOnnx/SherpaVad.cs | 14 +- VideoAnalysisCore/Common/AppCommon.cs | 16 +- VideoAnalysisCore/Common/AppConfig.cs | 2 +- VideoAnalysisCore/Common/DownloadFile.cs | 53 ++-- .../Common/Expand/ServiceSystem.cs | 19 +- .../{UploadExpand.cs => TidySlideExpand.cs} | 71 +++-- VideoAnalysisCore/Common/RedisExpand.cs | 176 ++--------- .../Common/TidySlideWorkflowManager.cs | 104 +++++++ .../Common/UploadWorkflowManager.cs | 80 ----- .../Common/VideoSliceWorkflowManager.cs | 78 ++++- VideoAnalysisCore/Common/WorkflowBase.cs | 223 ++++++++++++-- .../Controllers/VideoTaskController.cs | 114 ++++++- VideoAnalysisCore/Job/DeviceHeartbeatJob.cs | 37 +++ VideoAnalysisCore/Job/TaskFileClearJob.cs | 10 +- ...elEnum.cs => RedisTidySlideChannelEnum.cs} | 4 +- VideoAnalysisCore/Model/TaskLog.cs | 7 +- .../Model/TidySlideTaskResult.cs | 38 +++ VideoAnalysisCore/Model/VideoTaskWorkflow.cs | 51 ++++ 35 files changed, 1345 insertions(+), 508 deletions(-) create mode 100644 VideoAnalysis/WebUI/src/views/welcome/monitor.vue create mode 100644 VideoAnalysis/WebUI/src/views/welcome/showTidySlideTask.vue create mode 100644 VideoAnalysis/WebUI/src/views/welcome/workflowConfig.ts rename VideoAnalysisCore/Common/Expand/{UploadExpand.cs => TidySlideExpand.cs} (64%) create mode 100644 VideoAnalysisCore/Common/TidySlideWorkflowManager.cs delete mode 100644 VideoAnalysisCore/Common/UploadWorkflowManager.cs create mode 100644 VideoAnalysisCore/Job/DeviceHeartbeatJob.cs rename VideoAnalysisCore/Model/Enum/{RedisUploadChannelEnum.cs => RedisTidySlideChannelEnum.cs} (88%) create mode 100644 VideoAnalysisCore/Model/TidySlideTaskResult.cs create mode 100644 VideoAnalysisCore/Model/VideoTaskWorkflow.cs diff --git a/VideoAnalysis/Expand/CoravelExpand.cs b/VideoAnalysis/Expand/CoravelExpand.cs index b82db7a..9b7999e 100644 --- a/VideoAnalysis/Expand/CoravelExpand.cs +++ b/VideoAnalysis/Expand/CoravelExpand.cs @@ -23,6 +23,8 @@ namespace Learn.VideoAnalysis.Expand #endif service.AddTransient(); service.AddTransient(); + // 注册心跳 Job + service.AddTransient(); } public static void UseCoravelExpand(this IApplicationBuilder provider) { @@ -30,6 +32,8 @@ namespace Learn.VideoAnalysis.Expand { //任务缓存清理 scheduler.Schedule().HourlyAt(10); + //在线心跳 30秒一次 + scheduler.Schedule().EveryThirtySeconds(); //强制清理所有缓存内容 //scheduler.Schedule().Hourly(); //scheduler.Schedule().EverySeconds(40); diff --git a/VideoAnalysis/WebUI/.env.development b/VideoAnalysis/WebUI/.env.development index 9e64136..d05d4de 100644 --- a/VideoAnalysis/WebUI/.env.development +++ b/VideoAnalysis/WebUI/.env.development @@ -8,7 +8,7 @@ VITE_PUBLIC_PATH = / VITE_ROUTER_HISTORY = "hash" # 接口地址 -VITE_API_BASEURL = "http://192.168.2.33:5238" +VITE_API_BASEURL = "http://192.168.2.33:7532" # # 接口地址 diff --git a/VideoAnalysis/WebUI/src/api/videoTask.ts b/VideoAnalysis/WebUI/src/api/videoTask.ts index 293756b..89d3cca 100644 --- a/VideoAnalysis/WebUI/src/api/videoTask.ts +++ b/VideoAnalysis/WebUI/src/api/videoTask.ts @@ -28,11 +28,22 @@ export interface ShowTaskInfoRes { videoKnows: VideoKnowRes[]; mediaUrl: string; } +export interface VideoTaskWorkflow { + id: number; + videoTaskId: number; + workflowName: string; + currentStep: string; + currentStepValue: number; + message?: string; + updateTime: string; +} + export interface RowRloadResult { progress: string; lastEnum: string; startTime: string; errorMessage: string; + workflows: VideoTaskWorkflow[]; // 新增字段 } /** 刷新任务实时数据 */ @@ -42,21 +53,35 @@ export const RowRload = (id: any) => { }); }; -/** 重试任务 */ +/** 重试任务 (VideoSliceWorkflow) */ export const ReStart = (id: any, selectEnum: number) => { return http.request("get", "/api/VideoTask/ReStart", { params: { id, selectEnum } }); }; +/** 重试任务 (TidySlideWorkflow) */ +export const ReStartTidySlide = (id: any, selectEnum: number) => { + return http.request("get", "/api/VideoTask/ReStartTidySlide", { + params: { id, selectEnum } + }); +}; -/** 展示数据 */ + +/** 展示数据 (VideoSliceWorkflow) */ export const ShowTaskInfo = (id: any) => { return http.request("get", "/api/VideoTask/ShowTaskInfo", { params: { id } }); }; +/** 展示数据 (TidySlideWorkflow) */ +export const ShowTidySlideTaskInfo = (id: any) => { + return http.request("get", "/api/VideoTask/ShowTidySlideTaskInfo", { + params: { id } + }); +}; + /** 展示数据 */ @@ -66,6 +91,11 @@ export const RunningTaskList = (data: any) => { }); }; +/** 获取在线设备列表 */ +export const GetOnlineDevices = () => { + return http.request("get", "/api/VideoTask/OnlineDevices"); +}; + /** 展示数据 */ export const ErrorTaskList = (data: any) => { diff --git a/VideoAnalysis/WebUI/src/layout/components/lay-navbar/index.vue b/VideoAnalysis/WebUI/src/layout/components/lay-navbar/index.vue index 787c5b1..4c385c5 100644 --- a/VideoAnalysis/WebUI/src/layout/components/lay-navbar/index.vue +++ b/VideoAnalysis/WebUI/src/layout/components/lay-navbar/index.vue @@ -6,6 +6,7 @@ import LayNavMix from "../lay-sidebar/NavMix.vue"; import LaySidebarFullScreen from "../lay-sidebar/components/SidebarFullScreen.vue"; import LaySidebarBreadCrumb from "../lay-sidebar/components/SidebarBreadCrumb.vue"; import LaySidebarTopCollapse from "../lay-sidebar/components/SidebarTopCollapse.vue"; +import LinkIcon from "~icons/ri/links-fill"; // 引入链接图标 import LogoutCircleRLine from "~icons/ri/logout-circle-r-line"; import Setting from "~icons/ri/settings-3-line"; @@ -21,6 +22,11 @@ const { avatarsStyle, toggleSideBar, } = useNav(); + +function openSwagger() { + const swaggerUrl = `${window.location.protocol}//${window.location.hostname}:7532/swagger/index.html`; + window.open(swaggerUrl, "_blank"); +}