From 6015245d78f2b53f087a8c0f570582023a750f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E8=82=A5=E7=BE=8A?= <1048382248@qq.com> Date: Wed, 24 Sep 2025 10:43:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=20=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E7=9F=A5=E8=AF=86=E7=82=B9=E7=89=87=E6=AE=B5=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AICore/GPT/DeepSeek/DeepSeek_GPT.cs | 1 + VideoAnalysisCore/Common/RedisExpand.cs | 60 +++++++++++++++---- .../Controllers/ApiController.cs | 1 + VideoAnalysisCore/Controllers/Dto/ApiDto.cs | 1 + .../Controllers/LJZK_Controller.cs | 11 ++-- 5 files changed, 56 insertions(+), 18 deletions(-) diff --git a/VideoAnalysisCore/AICore/GPT/DeepSeek/DeepSeek_GPT.cs b/VideoAnalysisCore/AICore/GPT/DeepSeek/DeepSeek_GPT.cs index d739843..f0c68ea 100644 --- a/VideoAnalysisCore/AICore/GPT/DeepSeek/DeepSeek_GPT.cs +++ b/VideoAnalysisCore/AICore/GPT/DeepSeek/DeepSeek_GPT.cs @@ -580,6 +580,7 @@ namespace VideoAnalysisCore.AICore.GPT.DeepSeek //校验结果质量 var checkRes = await VerifySpanQuality(questionRes, taskInfo, captions, sections, Course_Id); + if (checkRes != null && checkRes.Score >= 80) { //写入知识点 diff --git a/VideoAnalysisCore/Common/RedisExpand.cs b/VideoAnalysisCore/Common/RedisExpand.cs index b8a4911..acd79f8 100644 --- a/VideoAnalysisCore/Common/RedisExpand.cs +++ b/VideoAnalysisCore/Common/RedisExpand.cs @@ -196,7 +196,7 @@ namespace VideoAnalysisCore.Common //if (gptRes is null) // throw new Exception("未能读取到GPT处理结果"); //删除任务执行状态 - await Redis.HDelAsync(RedisExpandKey.IDTask,task); + await Redis.LRemAsync(RedisExpandKey.IDTask,1,task); var taskData = await DbScoped.Sugar.Queryable() .FirstAsync(s => s.Id == tId); if (taskData.Captions == "[]") @@ -275,14 +275,42 @@ namespace VideoAnalysisCore.Common ReceivingTaskAsync(); } + public static bool StopTask { get; set; } = false; + /// + /// 停止接收新任务 + /// + public static void StopTaskAsync() + { + StopTask = true; + try + { + //取消接收任务监听 + Subscribe?.Dispose(); + } + catch (Exception) + { + throw; + } + } + + /// + /// 开始接收新任务 + /// + public static void RestartTaskAsync() + { + StopTask = false; + NewTaskAsync(); + } /// /// 重新执行新任务 /// /// public static async void NewTaskAsync() { - await Redis.DelAsync(RedisExpandKey.IDTask); + // 取消 消费机的任务订阅 + if (StopTask) + return; ReceivingTaskAsync(); } @@ -298,7 +326,7 @@ namespace VideoAnalysisCore.Common } Task.Run(async () => { - var oldTask = await Redis.GetAsync(RedisExpandKey.IDTask); + var oldTask = await Redis.LPopAsync(RedisExpandKey.IDTask); if (!string.IsNullOrEmpty(oldTask)) { Console.WriteLine(DateTime.Now.ToString("HH:mm:ss") + "-------------> 接收重试任务 " + oldTask); @@ -307,17 +335,21 @@ namespace VideoAnalysisCore.Common await InsertChannel(lastEnum, oldTask); return; } - if (Subscribe?.IsUnsubscribed == false)//排除重试机制后 多次接收任务导致内存泄露 - return; - Subscribe = Redis.SubscribeList(RedisExpandKey.ChannelKey, async (taskId) => + lock (Redis) { - if (taskId is null) return; - Subscribe?.Dispose();//取消接收任务监听 - //存储当前机器的任务 - Redis.Set(RedisExpandKey.IDTask, taskId); - Console.WriteLine(DateTime.Now.ToString("HH:mm:ss") + "-------------> 接收到任务 " + taskId); - await InsertChannel(RedisChannelEnum.下载文件, taskId); - }); + if (Subscribe?.IsUnsubscribed == false)//排除重试机制后 多次接收任务导致内存泄露 + return; + Subscribe = Redis.SubscribeList(RedisExpandKey.ChannelKey, async (taskId) => + { + if (taskId is null) return; + Subscribe?.Dispose();//取消接收任务监听 + //存储当前机器的任务 + Redis.LPush(RedisExpandKey.IDTask, taskId); + Console.WriteLine(DateTime.Now.ToString("HH:mm:ss") + "-------------> 接收到任务 " + taskId); + await InsertChannel(RedisChannelEnum.下载文件, taskId); + }); + } + }); } @@ -333,6 +365,8 @@ namespace VideoAnalysisCore.Common var error = string.Empty; if (ex != null) { + + await Redis.LRemAsync(RedisExpandKey.IDTask, 1, taskID.ToString()); //执行任务时出现异常 error = ex.Message + ex.StackTrace; Console.WriteLine("====================[出现异常]===================="); diff --git a/VideoAnalysisCore/Controllers/ApiController.cs b/VideoAnalysisCore/Controllers/ApiController.cs index 2c0ea4c..625f7eb 100644 --- a/VideoAnalysisCore/Controllers/ApiController.cs +++ b/VideoAnalysisCore/Controllers/ApiController.cs @@ -193,6 +193,7 @@ namespace VideoAnalysisCore.Controllers Tag = req.Tag, TagId = req.TagId, PPTVideoCode = req.PPTVideoCode, + PPTVideoUrl = req.PPTVideoUrl, VideoType=req.VideoType }; // diff --git a/VideoAnalysisCore/Controllers/Dto/ApiDto.cs b/VideoAnalysisCore/Controllers/Dto/ApiDto.cs index 6cddf5e..fa357d9 100644 --- a/VideoAnalysisCore/Controllers/Dto/ApiDto.cs +++ b/VideoAnalysisCore/Controllers/Dto/ApiDto.cs @@ -181,6 +181,7 @@ namespace VideoAnalysisCore.Controllers.Dto /// 课程对应ppt视频 /// public string? PPTVideoCode { get; set; } + public string? PPTVideoUrl { get; set; } /// ///回调Api地址 /// diff --git a/VideoAnalysisCore/Controllers/LJZK_Controller.cs b/VideoAnalysisCore/Controllers/LJZK_Controller.cs index d04712e..b3cf309 100644 --- a/VideoAnalysisCore/Controllers/LJZK_Controller.cs +++ b/VideoAnalysisCore/Controllers/LJZK_Controller.cs @@ -167,16 +167,17 @@ namespace VideoAnalysisCore.Controllers /// ȡƵ֪ʶƬtaskId/tagIdѡһ /// /// Զid + /// Զid /// [HttpGet(Name = "TaskKnowInfo")] - public async Task TaskKnowInfo(string? tagId) + public async Task TaskKnowInfo(string? tagId , string? taskId) { + if (string.IsNullOrEmpty(tagId) && !string.IsNullOrEmpty(taskId)) + tagId = taskId; if (string.IsNullOrEmpty(tagId)) return BadRequest(); - long taskId = 0; - var taskIdOK = long.TryParse(tagId, out taskId); var task = await videoTaskDB.AsQueryable() - .Where(s => s.TagId == tagId || s.PPTVideoCode == tagId || (taskIdOK && s.Id == taskId)) + .Where(s => s.TagId == tagId || s.PPTVideoCode == tagId) .FirstAsync(); if (task is null) return BadRequest("Ч"); @@ -185,7 +186,7 @@ namespace VideoAnalysisCore.Controllers .Where(s => s.VideoTaskId == task.Id) .ToArrayAsync(); if (konwArr is null || konwArr.Length == 0) - return BadRequest("Ч"); + return BadRequest("Чֶ"); var res = new TaskKnowRes() { TagId = task.TagId,