引入 蓝鲸智库类

优化 其他数据库引入配置
This commit is contained in:
小肥羊 2025-03-04 15:41:05 +08:00
parent 1b239201a2
commit 977faaef75
24 changed files with 955 additions and 169 deletions

View File

@ -98,34 +98,6 @@ namespace Learn.VideoAnalysis.Controllers
return Ok(resStr); return Ok(resStr);
} }
[NonAction]
private static List<TimeBase> MergeTimeBases(IEnumerable<TimeBase> timeBases)
{
if (timeBases == null || timeBases.Count() == 0)
{
return new List<TimeBase>();
}
var mergedList = new List<TimeBase>();
// 初始化合并段
var current = timeBases.First();
current.Content = string.Empty;
foreach (var next in timeBases)
{
// 如果类型相同,则扩展时间段
if (current.TimeBaseType == next.TimeBaseType)
current.End = Math.Max(current.End, next.End);
else
{
// 类型不同,将当前时间段加入结果列表,并开始新时间段
mergedList.Add(current);
current = next;
current.Content = string.Empty;
}
}
// 添加最后的时间段
mergedList.Add(current);
return mergedList;
}
/// <summary> /// <summary>
/// 重新开始执行GPT分析<para>taskId/tagId二选一</para> /// 重新开始执行GPT分析<para>taskId/tagId二选一</para>
@ -154,79 +126,6 @@ namespace Learn.VideoAnalysis.Controllers
return Ok(); return Ok();
} }
/// <summary>
/// 获取视频知识点片段<para>taskId/tagId二选一</para>
/// </summary>
/// <param name="taskId"></param>
/// <param name="tagId">自定义id</param>
/// <returns></returns>
[HttpGet(Name = "TaskKnowInfo")]
public async Task<IActionResult> TaskKnowInfo(long taskId, string? tagId)
{
if (taskId == 0 && string.IsNullOrEmpty(tagId))
return BadRequest();
var task = await videoTaskDB.AsQueryable()
.WhereIF(taskId != 0, s => s.Id == taskId)
.WhereIF(!string.IsNullOrEmpty(tagId), s => s.TagId == tagId)
.FirstAsync();
if(task is null)
return BadRequest("无效任务");
var konwArr = await videoKonwDB.AsQueryable()
.Where(s=>s.VideoTaskId == task.Id)
.ToArrayAsync();
if (konwArr is null || konwArr.Length ==0)
return BadRequest("无效任务");
return Ok(new TaskKnowRes()
{
TagId = task.TagId,
Status = task.LastEnum,
VideoTaskId = task.Id,
KnowBlockArr = konwArr
.GroupBy(s=>s.StartTime)
.Select(s=>new TaskKnowBlock()
{
Id = s.First().Id,
Content = s.First().Content,
StartTime = s.First().StartTime,
EndTime = s.First().EndTime,
Theme =s.First().Theme,
Know=s.Select(x=>new TaskKnowInfo()
{
Id=x.Id,
KnowPoint=x.KnowPoint,
KnowPointId = x.KnowPointId
}).ToArray()
}).ToArray()
});
}
/// <summary>
/// 获取视频信息<para>taskId/tagId二选一</para>
/// </summary>
/// <param name="taskId"></param>
/// <param name="tagId">自定义id</param>
/// <returns></returns>
[HttpGet(Name = "TaskInfo")]
public async Task<IActionResult> TaskInfo(long taskId,string? tagId)
{
if(taskId == 0 && string.IsNullOrEmpty(tagId))
return BadRequest();
var task = await videoTaskDB.AsQueryable()
.WhereIF(taskId!=0, s => s.Id == taskId)
.WhereIF(!string.IsNullOrEmpty(tagId), s => s.TagId == tagId)
.FirstAsync();
if (task is null)
return BadRequest();
var taskData = task.ChatAnalysis.Adapt<TaskInfoRes>();
if (taskData is null)
return BadRequest();
taskData.Status = task.LastEnum;
if (task.LastEnum != RedisChannelEnum.EndTask)
return BadRequest(taskData);
if (taskData != null && taskData.TimeBase != null)
taskData.TimeBase = MergeTimeBases(taskData.TimeBase);
return Ok(taskData);
}
/// <summary> /// <summary>
/// 插入队列 /// 插入队列
@ -241,6 +140,7 @@ namespace Learn.VideoAnalysis.Controllers
, msg); , msg);
return Ok(); return Ok();
} }
/// <summary> /// <summary>
/// 视频处理 /// 视频处理
/// </summary> /// </summary>
@ -274,5 +174,140 @@ namespace Learn.VideoAnalysis.Controllers
RedisExpand.Redis.LPush(RedisExpandKey.ChannelKey, task.Id); RedisExpand.Redis.LPush(RedisExpandKey.ChannelKey, task.Id);
return Ok(task.Id); return Ok(task.Id);
} }
/// <summary>
/// 蓝鲸智库_添加文件节点监控
/// </summary>
/// <param name="req">请求体</param>
/// <returns></returns>
[HttpPost(Name = "ZY_NodeMonitoring")]
public async Task<IActionResult> ZY_NodeMonitoring(NodeMonitoringReq req)
{
//if (!ModelState.IsValid) return BadRequest(ModelState);
//入库
//task.Id = await videoTaskDB.InsertReturnBigIdentityAsync(task);
//var hashEntries = task.GetType()
// .GetProperties(BindingFlags.Public | BindingFlags.Instance)
// .ToDictionary(s => s.Name, s => s.GetValue(task));
//RedisExpand.Redis.HMSet(RedisExpandKey.Task(task.Id), hashEntries);
//RedisExpand.Redis.LPush(RedisExpandKey.ChannelKey, task.Id);
return Ok();
}
///// <summary>
///// 获取视频知识点片段<para>taskId/tagId二选一</para>
///// </summary>
///// <param name="taskId"></param>
///// <param name="tagId">自定义id</param>
///// <returns></returns>
//[HttpGet(Name = "TaskKnowInfo")]
//public async Task<IActionResult> TaskKnowInfo(long taskId, string? tagId)
//{
// if (taskId == 0 && string.IsNullOrEmpty(tagId))
// return BadRequest();
// var task = await videoTaskDB.AsQueryable()
// .WhereIF(taskId != 0, s => s.Id == taskId)
// .WhereIF(!string.IsNullOrEmpty(tagId), s => s.TagId == tagId)
// .FirstAsync();
// if (task is null)
// return BadRequest("无效任务");
// var konwArr = await videoKonwDB.AsQueryable()
// .Where(s => s.VideoTaskId == task.Id)
// .ToArrayAsync();
// if (konwArr is null || konwArr.Length == 0)
// return BadRequest("无效任务");
// return Ok(new TaskKnowRes()
// {
// TagId = task.TagId,
// Status = task.LastEnum,
// VideoTaskId = task.Id,
// KnowBlockArr = konwArr
// .GroupBy(s => s.StartTime)
// .Select(s => new TaskKnowBlock()
// {
// Id = s.First().Id,
// Content = s.First().Content,
// StartTime = s.First().StartTime,
// EndTime = s.First().EndTime,
// Theme = s.First().Theme,
// Know = s.Select(x => new TaskKnowInfo()
// {
// Id = x.Id,
// KnowPoint = x.KnowPoint,
// KnowPointId = x.KnowPointId
// }).ToArray()
// }).ToArray()
// });
//}
///// <summary>
///// 获取视频信息<para>taskId/tagId二选一</para>
///// </summary>
///// <param name="taskId"></param>
///// <param name="tagId">自定义id</param>
///// <returns></returns>
//[HttpGet(Name = "TaskInfo")]
//public async Task<IActionResult> TaskInfo(long taskId, string? tagId)
//{
// if (taskId == 0 && string.IsNullOrEmpty(tagId))
// return BadRequest();
// var task = await videoTaskDB.AsQueryable()
// .WhereIF(taskId != 0, s => s.Id == taskId)
// .WhereIF(!string.IsNullOrEmpty(tagId), s => s.TagId == tagId)
// .FirstAsync();
// if (task is null)
// return BadRequest();
// var taskData = task.ChatAnalysis.Adapt<TaskInfoRes>();
// if (taskData is null)
// return BadRequest();
// taskData.Status = task.LastEnum;
// if (task.LastEnum != RedisChannelEnum.EndTask)
// return BadRequest(taskData);
// if (taskData != null && taskData.TimeBase != null)
// taskData.TimeBase = MergeTimeBases(taskData.TimeBase);
// return Ok(taskData);
//}
//[NonAction]
//private static List<TimeBase> MergeTimeBases(IEnumerable<TimeBase> timeBases)
//{
// if (timeBases == null || timeBases.Count() == 0)
// {
// return new List<TimeBase>();
// }
// var mergedList = new List<TimeBase>();
// // 初始化合并段
// var current = timeBases.First();
// current.Content = string.Empty;
// foreach (var next in timeBases)
// {
// // 如果类型相同,则扩展时间段
// if (current.TimeBaseType == next.TimeBaseType)
// current.End = Math.Max(current.End, next.End);
// else
// {
// // 类型不同,将当前时间段加入结果列表,并开始新时间段
// mergedList.Add(current);
// current = next;
// current.Content = string.Empty;
// }
// }
// // 添加最后的时间段
// mergedList.Add(current);
// return mergedList;
//}
} }
} }

View File

@ -7,6 +7,26 @@ using VideoAnalysisCore.Enum;
namespace Learn.VideoAnalysis.Controllers.Dto namespace Learn.VideoAnalysis.Controllers.Dto
{ {
/// <summary>
/// 视频处理 请求
/// </summary>
public class NodeMonitoringReq
{
/// <summary>
/// 媒体路径
/// </summary>
[Required(ErrorMessage = "文件节点ID是必填项")]
public string NodeId { get; set; } = string.Empty;
/// <summary>
/// 任务类型
/// </summary>
public TaskTypeEnum? Type { get; set; }
/// <summary>
/// 自定义值 任务完成后附带通知
/// </summary>
public string Tag { get; set; } = string.Empty;
}
/// <summary> /// <summary>
/// 视频处理 请求 /// 视频处理 请求
/// </summary> /// </summary>

View File

@ -59,7 +59,9 @@ namespace Learn.VideoAnalysis
builder.Services.InitSqlSugar(); builder.Services.InitSqlSugar();
RedisExpand.Init(); RedisExpand.Init();
Speaker.Init(); Speaker.Init();
CoravelExpand.Init(builder.Services);
//SenseVoice.Init(); //SenseVoice.Init();
//异常过滤器
builder.Services.AddControllersWithViews(options => builder.Services.AddControllersWithViews(options =>
{ {
options.Filters.Add(typeof(ExceptionFilter)); options.Filters.Add(typeof(ExceptionFilter));
@ -106,32 +108,26 @@ namespace Learn.VideoAnalysis
app.UseSwaggerUI(); app.UseSwaggerUI();
app.UseExceptionHandler("/Error"); app.UseExceptionHandler("/Error");
} }
//else //添加wwwroot 静态目录
//{
// app.UseExceptionHandler("/Login");
//}
app.UseStaticFiles(); app.UseStaticFiles();
//添加 自定义 静态目录
app.UseStaticFiles(new StaticFileOptions app.UseStaticFiles(new StaticFileOptions
{ {
FileProvider = new PhysicalFileProvider(AppCommon.TaskCachedFile), FileProvider = new PhysicalFileProvider(AppCommon.TaskCachedFile),
RequestPath = "/video", RequestPath = "/video",
//OnPrepareResponse = ctx => //»º´æ
//{
// ctx.Context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.CacheControl] = "public,max - age = 31536000";
//}
}); });
app.UseAntiforgery(); app.UseAntiforgery();
app.MapRazorComponents<App>() app.MapRazorComponents<Learn.VideoAnalysis.Components.App>()
.AddInteractiveServerRenderMode(); .AddInteractiveServerRenderMode();
//.AddInteractiveWebAssemblyRenderMode() //.AddInteractiveWebAssemblyRenderMode()
//.AddAdditionalAssemblies(typeof(VideoAnalysisRazor._Imports).Assembly); //.AddAdditionalAssemblies(typeof(VideoAnalysisRazor._Imports).Assembly);
app.MapControllers(); app.MapControllers();
//自定义 应用
SqlSugarExpand.InitDB(); SqlSugarExpand.InitDB();
CoravelExpand.Run(app.Services);
app.Run(); app.Run();

View File

@ -45,9 +45,17 @@
"SqlType": "MySql", "SqlType": "MySql",
"UpdateTable": false "UpdateTable": false
}, },
"KnowsDB": { "OtherDBArr": [
"ConnectionString": "Server=47.109.35.116;Database=ResourceBank;UID=live;Password=Woshiren^&*();MultipleActiveResultSets=true;Encrypt=True;TrustServerCertificate=True;", {
"SqlType": "SqlServer" "ConfigId": 1001, //ResourceBank
} "ConnectionString": "Server=47.109.35.116;Database=ResourceBank;UID=live;Password=Woshiren^&*();MultipleActiveResultSets=true;Encrypt=True;TrustServerCertificate=True;",
"SqlType": "SqlServer"
},
{
"ConfigId": 1002, //App.public.live
"ConnectionString": "Server=47.109.35.116;Database=App.public.live;UID=live;Password=Woshiren^&*();MultipleActiveResultSets=true;Encrypt=True;TrustServerCertificate=True;",
"SqlType": "SqlServer"
}
]
} }
} }

View File

@ -10,6 +10,7 @@ using VideoAnalysisCore.AICore.GPT.Dto;
using VideoAnalysisCore.AICore.GPT; using VideoAnalysisCore.AICore.GPT;
using System.Threading.Tasks; using System.Threading.Tasks;
using VideoAnalysisCore.AICore.SherpaOnnx; using VideoAnalysisCore.AICore.SherpaOnnx;
using VideoAnalysisCore.Model.;
namespace VideoAnalysisCore.AICore.GPT.ChatGPT namespace VideoAnalysisCore.AICore.GPT.ChatGPT
{ {

View File

@ -10,6 +10,7 @@ using VideoAnalysisCore.AICore.GPT.Dto;
using System.Threading.Tasks; using System.Threading.Tasks;
using VideoAnalysisCore.AICore.GPT.ChatGPT; using VideoAnalysisCore.AICore.GPT.ChatGPT;
using VideoAnalysisCore.AICore.SherpaOnnx; using VideoAnalysisCore.AICore.SherpaOnnx;
using VideoAnalysisCore.Model.;
namespace VideoAnalysisCore.AICore.GPT.DeepSeek namespace VideoAnalysisCore.AICore.GPT.DeepSeek
{ {
@ -58,7 +59,7 @@ namespace VideoAnalysisCore.AICore.GPT.DeepSeek
string title = taskInfo.MediaName; string title = taskInfo.MediaName;
var fileNameResFormat = "{授课章节: string|null}"; var fileNameResFormat = "{授课章节: string|null}";
var fileNamePostMessages = title + var fileNamePostMessages = title +
" 这是一堂课的标题,请你基于标题帮我分析出这堂课所讲授的内容与最恰当的授课章节(尽可能的关联最贴切的章节并且就保留一个)." + " 这是一堂课的标题,请你基于标题帮我分析出这堂课所讲授的内容与最恰当的授课章节(关联最贴切的章节,保留一个章节!)." +
$"章节范围限定在[{string.Join(',', xkwKnows)}]范围." + $"章节范围限定在[{string.Join(',', xkwKnows)}]范围." +
$"输出格式 json字符串 对象格式{fileNameResFormat}"; $"输出格式 json字符串 对象格式{fileNameResFormat}";
var fileNameInfoRes = await ChatAsync<FileNameInfo>(task, fileNamePostMessages, null);//, "deepseek-chat"); var fileNameInfoRes = await ChatAsync<FileNameInfo>(task, fileNamePostMessages, null);//, "deepseek-chat");
@ -90,7 +91,8 @@ namespace VideoAnalysisCore.AICore.GPT.DeepSeek
$"从提取出的<知识块>内容称来匹配我提供的知识点,来作为片段的知识点(请确保匹配的知识点是用户提供的,否则片段知识点值为空字符串)。" + $"从提取出的<知识块>内容称来匹配我提供的知识点,来作为片段的知识点(请确保匹配的知识点是用户提供的,否则片段知识点值为空字符串)。" +
$"提供的方法点名称({knows})。 格式 (方法点Id|方法点名称) 如果一个<知识块>出现多个知识点那么知识点Id与知识点名称都用逗号','分割。" + $"提供的方法点名称({knows})。 格式 (方法点Id|方法点名称) 如果一个<知识块>出现多个知识点那么知识点Id与知识点名称都用逗号','分割。" +
$"这是输入的视频字幕并且是包含时间戳的视频字幕的固定格式文本。" + $"这是输入的视频字幕并且是包含时间戳的视频字幕的固定格式文本。" +
$"字幕格式(说话人:开始秒:结束秒:内容|下一段字幕).以下是包含时间的视频字幕文本。字幕列表 {captions.Captions}。" + //$"字幕格式(说话人:开始秒:结束秒:内容|下一段字幕).以下是包含时间的视频字幕文本。字幕列表 {captions.Captions}。" +
$"字幕格式(开始秒:结束秒:内容|下一段字幕).以下是包含时间的视频字幕文本。字幕列表 {captions.Captions}。" +
$"最后请检查某些<知识块>之间的过渡是否自然,如果<知识块>时长超过500秒则考虑拆封为两个更加贴切的<知识块>.或者<知识块>时长小于30秒则考虑合并<知识块>到相邻的<知识块>)。" + $"最后请检查某些<知识块>之间的过渡是否自然,如果<知识块>时长超过500秒则考虑拆封为两个更加贴切的<知识块>.或者<知识块>时长小于30秒则考虑合并<知识块>到相邻的<知识块>)。" +
$"输出格式({resFormat})"; $"输出格式({resFormat})";
@ -111,8 +113,10 @@ namespace VideoAnalysisCore.AICore.GPT.DeepSeek
} }
var thems = string.Join(',', questionRes.Select(s => s.StartTime + "->" + s.Theme)); var thems = string.Join(',', questionRes.Select(s => s.StartTime + "->" + s.Theme));
var checkResFormat = """{"Score":打分(number),"Evaluation":评价(string)}"""; var checkResFormat = """{"Score":打分(number),"Evaluation":评价(string),"Data":优化后的分段(array)}""";
var checkMessage = "我为视频的讲解内容做了一些分段,你能帮我检查下这些分段的时间分配合理吗?请给出你的打分(0-100,70分及格)以及评价" + var checkResFormat1 = """[{"Start":开始秒(number),"Theme":优化后的分段主题(string)}]""";
var checkMessage = "我为视频的讲解内容做了一些分段,你能帮我检查下这些分段的时间分配是否合理,标题内容符合实际吗?" +
$"请给出你的打分(0-100,70分及格)以及打分原因,并且给出优化后的分段 分段格式(${checkResFormat1})" +
$"这是我的分段 {thems}." + $"这是我的分段 {thems}." +
$"后续的内容是包含时间戳的视频字幕的固定格式文本。" + $"后续的内容是包含时间戳的视频字幕的固定格式文本。" +
$"字幕格式(说话人:开始秒:结束秒:内容|下一段字幕).以下是包含时间的视频字幕文本。字幕列表 {captions.Captions}。" + $"字幕格式(说话人:开始秒:结束秒:内容|下一段字幕).以下是包含时间的视频字幕文本。字幕列表 {captions.Captions}。" +
@ -130,7 +134,7 @@ namespace VideoAnalysisCore.AICore.GPT.DeepSeek
} }
} }
//todo 未包含的知识点片段 如何处理
var insertData = questionRes var insertData = questionRes
.Where(s => !string.IsNullOrEmpty(s.KnowPoint)) .Where(s => !string.IsNullOrEmpty(s.KnowPoint))
.SelectMany( .SelectMany(

View File

@ -138,6 +138,7 @@ namespace VideoAnalysisCore.AICore.GPT.Dto
/// 评分 /// 评分
/// </summary> /// </summary>
public string Evaluation { get; set; } public string Evaluation { get; set; }
public VideoKnowRes[] Data { get; set; }
} }
/// <summary> /// <summary>

View File

@ -46,16 +46,11 @@ namespace VideoAnalysisCore.Common
.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false))); .Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false)));
DbMatserType = assembliesType DbMatserType = assembliesType
.Where(u => u.GetInterfaces().Contains(typeof(IDB))); .Where(u => u.GetInterfaces().Contains(typeof(IDB)));
KnowsType = assembliesType
.Where(u =>u.GetInterfaces().Contains(typeof(IKnowsDB)));
} }
catch catch
{ {
throw; throw;
} }
//.Where(u => !u.IsDefined(typeof(SplitTableAttribute), false))
//.Where(u => !typeof(Model.DataCenterYH.IDataCenterYHModel).IsAssignableFrom(u))
//.Where(u => !u.IsSubclassOf(typeof(YQ_BaseEntity)));
} }
/// <summary> /// <summary>
@ -225,11 +220,11 @@ namespace VideoAnalysisCore.Common
var stringBuilder = new StringBuilder(); var stringBuilder = new StringBuilder();
foreach (var item in results) foreach (var item in results)
{ {
stringBuilder.Append(item.Value.First()); //stringBuilder.Append(item.Value.First());
//stringBuilder.Append(":");
stringBuilder.Append((int)item.Key.Start);
stringBuilder.Append(":"); stringBuilder.Append(":");
stringBuilder.Append(item.Key.Start); stringBuilder.Append((int)item.Key.End);
stringBuilder.Append(":");
stringBuilder.Append(item.Key.End);
stringBuilder.Append(":"); stringBuilder.Append(":");
stringBuilder.Append(item.Key.Text); stringBuilder.Append(item.Key.Text);
stringBuilder.Append("|"); stringBuilder.Append("|");
@ -370,6 +365,10 @@ namespace VideoAnalysisCore.Common
/// 启动时更新表结构 /// 启动时更新表结构
/// </summary> /// </summary>
public bool UpdateTable { get; set; } public bool UpdateTable { get; set; }
/// <summary>
/// 配置ID
/// </summary>
public long ConfigId { get; set; }
} }
/// <summary> /// <summary>
@ -401,14 +400,14 @@ namespace VideoAnalysisCore.Common
/// ChatGpt /// ChatGpt
/// </summary> /// </summary>
public ChatGptConfig ChatGpt { get; set; } = new ChatGptConfig(); public ChatGptConfig ChatGpt { get; set; } = new ChatGptConfig();
/// <summary> /// <summary>
/// 数据库配置 /// 数据库配置
/// </summary> /// </summary>
public DBConfig DB { get; set; } = new DBConfig(); public DBConfig DB { get; set; } = new DBConfig();
/// <summary>
/// 知识点数据库 public DBConfig[] OtherDBArr { get; set; } = Array.Empty<DBConfig>();
/// </summary>
public DBConfig KnowsDB { get; set; } = new DBConfig();
} }
} }

View File

@ -0,0 +1,31 @@
using Coravel;
using Coravel.Scheduling.Schedule;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VideoAnalysisCore.Job;
namespace VideoAnalysisCore.Common
{
public static class CoravelExpand
{
public static int MyProperty { get; set; }
public static void Init(IServiceCollection service)
{
service.AddScheduler();
service.AddTransient<UnprocessedVideoJob>();
}
public static void Run(IServiceProvider provider)
{
provider.UseScheduler(scheduler =>
{
//每5分钟执行一次 未处理视频扫描
scheduler.Schedule<UnprocessedVideoJob>().EveryFiveMinutes();
});
}
}
}

View File

@ -139,12 +139,12 @@ namespace VideoAnalysisCore.Common
download.DownloadProgressChanged += (object? sender, Downloader.DownloadProgressChangedEventArgs e) => download.DownloadProgressChanged += (object? sender, Downloader.DownloadProgressChangedEventArgs e) =>
{ {
pI++; pI++;
if(pI%20==0) if (pI % 20 == 0)
RedisExpand.SetTaskProgress(task, e.ProgressPercentage); RedisExpand.SetTaskProgress(task, e.ProgressPercentage);
}; };
download.DownloadFileCompleted +=async (object? sender, AsyncCompletedEventArgs e) => download.DownloadFileCompleted += async (object? sender, AsyncCompletedEventArgs e) =>
{ {
if (download.Status == DownloadStatus.Failed && e.Error!=null) if (download.Status == DownloadStatus.Failed && e.Error != null)
{ {
await RedisExpand.SetTaskErrorMessage(long.Parse(task), e.Error) await RedisExpand.SetTaskErrorMessage(long.Parse(task), e.Error)
.ConfigureAwait(false);//不切回上下文 .ConfigureAwait(false);//不切回上下文

View File

@ -168,6 +168,13 @@ namespace VideoAnalysisCore.Common
var taskData = await DbScoped.SugarScope.Queryable<VideoTask>() var taskData = await DbScoped.SugarScope.Queryable<VideoTask>()
.FirstAsync(s => s.Id == tId); .FirstAsync(s => s.Id == tId);
if (taskData.Captions == "[]")
taskData.Captions = (await Redis.HMGetAsync(RedisExpandKey.Task(task), "Captions")).First();
if (taskData.Speaker == "[]")
taskData.Speaker = (await Redis.HMGetAsync(RedisExpandKey.Task(task), "Speaker")).First();
taskData.ChatAnalysis =JsonSerializer.Serialize(gptRes); taskData.ChatAnalysis =JsonSerializer.Serialize(gptRes);
taskData.ChatAnalysisScore = gptRes?.Assessment?.Merit?.Sum(s => s.Score) ?? 0; taskData.ChatAnalysisScore = gptRes?.Assessment?.Merit?.Sum(s => s.Score) ?? 0;
taskData.ErrorMessage = string.Empty; taskData.ErrorMessage = string.Empty;
@ -176,6 +183,8 @@ namespace VideoAnalysisCore.Common
.UpdateColumns(it => new .UpdateColumns(it => new
{ {
it.ChatAnalysis, it.ChatAnalysis,
it.Captions,
it.Speaker,
it.ChatAnalysisScore, it.ChatAnalysisScore,
it.ErrorMessage, it.ErrorMessage,
it.TotalTokens, it.TotalTokens,

View File

@ -3,6 +3,7 @@ using SqlSugar.IOC;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VideoAnalysisCore.Interface; using VideoAnalysisCore.Interface;
@ -12,13 +13,25 @@ namespace VideoAnalysisCore.Common
{ {
public class Repository<T> : SimpleClient<T> where T : class, new() public class Repository<T> : SimpleClient<T> where T : class, new()
{ {
readonly Dictionary<Type, object?> CID= new Dictionary<Type, object?>();
public Repository() public Repository()
{ {
if(typeof(T).GetInterfaces().Contains(typeof(IKnowsDB))) SwitchConnection();
base.Context = DbScoped.SugarScope.GetConnection(1001); }
else public void SwitchConnection()
base.Context = DbScoped.SugarScope; {
var t = typeof(T);
if (CID.ContainsKey(t))
{
base.Context = DbScoped.SugarScope.GetConnectionScope(CID[t]);
return;
}
var c = t.GetCustomAttribute<TenantAttribute>();
if (!CID.ContainsKey(typeof(T)))
CID.Add(typeof(T), c?.configId);
base.Context = c != null
? DbScoped.SugarScope.GetConnectionScope(c.configId)
: DbScoped.SugarScope;
} }
} }
} }

View File

@ -27,15 +27,15 @@ namespace VideoAnalysisCore.Common
ConnectionString = AppCommon.Config.DB.ConnectionString, ConnectionString = AppCommon.Config.DB.ConnectionString,
DbType =AppCommon.Config.DB.SqlType, DbType =AppCommon.Config.DB.SqlType,
IsAutoCloseConnection = true//自动释放 IsAutoCloseConnection = true//自动释放
},
new IocConfig()
{
ConfigId =1001,
ConnectionString = AppCommon.Config.KnowsDB.ConnectionString,
DbType =AppCommon.Config.KnowsDB.SqlType,
IsAutoCloseConnection = true//自动释放
}, },
}; };
dbList.AddRange(AppCommon.Config.OtherDBArr.Select(s => new IocConfig()
{
ConfigId=s.ConfigId,
ConnectionString=s.ConnectionString,
DbType=s.SqlType,
IsAutoCloseConnection = true
}));
services.AddSingleton(typeof(Repository<>)); services.AddSingleton(typeof(Repository<>));
//注入SqlSugar 主库 //注入SqlSugar 主库

View File

@ -10,12 +10,16 @@ namespace VideoAnalysisCore.Enum
public enum TaskTypeEnum public enum TaskTypeEnum
{ {
/// <summary> /// <summary>
/// 蓝鲸智库视频分析 /// 蓝鲸智库_视频分段
/// </summary> /// </summary>
_视频分析, _视频分段 = 0,
/// <summary>
/// 蓝鲸智库_中职视频分段
/// </summary>
_中职视频分段 = 100,
/// <summary> /// <summary>
/// 教研会议_视频分析 /// 教研会议_视频分析
/// </summary> /// </summary>
_视频分析 _视频分析 = 200,
} }
} }

View File

@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VideoAnalysisCore.Interface
{
/// <summary>
/// 表属于KnowsDB
/// </summary>
interface IKnowsDB
{
}
}

View File

@ -0,0 +1,28 @@
using Coravel.Invocable;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VideoAnalysisCore.Common;
using VideoAnalysisCore.Model;
namespace VideoAnalysisCore.Job
{
/// <summary>
/// 查找未处理的视频
/// </summary>
public class UnprocessedVideoJob : IInvocable
{
private readonly Repository<VideoTask> videoTaskDB;
public UnprocessedVideoJob(Repository<VideoTask> videoTaskDB)
{
this.videoTaskDB = videoTaskDB;
}
public async Task Invoke()
{
}
}
}

View File

@ -0,0 +1,182 @@
using System;
using System.Linq;
using System.Text;
using SqlSugar;
using VideoAnalysisCore.Interface;
namespace App.Model
{
///<summary>
///文件附件
///</summary>
[SugarTable("Attachments")]
[Tenant("1002")]
public partial class Attachments
{
public Attachments()
{
this.SchoolId = Convert.ToInt64("0");
this.Sort = Convert.ToInt32("0");
this.CreateTime = DateTime.Now;
this.DeleteState = false;
}
/// <summary>
/// Desc:
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
public long Id { get; set; }
/// <summary>
/// Desc:关联对象类型(枚举)
/// Default:
/// Nullable:False
/// </summary>
public int ObjType { get; set; }
/// <summary>
/// Desc:文件名称
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(Length = 500)]
public string Name { get; set; }
/// <summary>
/// Desc:自定义名称
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(IsNullable = true, Length = 200)]
public string CustomName { get; set; }
/// <summary>
/// Desc:文件类型
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(Length = 100)]
public string Type { get; set; }
/// <summary>
/// Desc:链接
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(Length = 255)]
public string Url { get; set; }
/// <summary>
/// Desc:扩展名
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(Length = 20)]
public string Extension { get; set; }
/// <summary>
/// Desc:文件大小(KB)
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(Length = 11, DecimalDigits = 2)]
public decimal Size { get; set; }
/// <summary>
/// Desc:学校
/// Default:0
/// Nullable:True
/// </summary>
[SugarColumn(IsNullable = true)]
public long? SchoolId { get; set; }
/// <summary>
/// Desc:时长
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(IsNullable = true, Length = 10, DecimalDigits = 2)]
public decimal? Duration { get; set; }
/// <summary>
/// Desc:排序
/// Default:0
/// Nullable:True
/// </summary>
[SugarColumn(IsNullable = true)]
public int? Sort { get; set; }
/// <summary>
/// Desc:视频码
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(IsNullable = true)]
public string VideoCode { get; set; }
/// <summary>
/// Desc:年级
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(IsNullable = true)]
public string GradeName { get; set; }
/// <summary>
/// Desc:科目
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(IsNullable = true)]
public string SubjectName { get; set; }
/// <summary>
/// Desc:班级
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(IsNullable = true)]
public string ClassName { get; set; }
/// <summary>
/// Desc:创建时间
/// Default:DateTime.Now
/// Nullable:False
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// Desc:
/// Default:0
/// Nullable:False
/// </summary>
public bool DeleteState { get; set; }
/// <summary>
/// 转换后的图片数量
/// </summary>
[SugarColumn(IsNullable = true)]
public int ConvertPageCount { get; set; }
/// <summary>
/// 文件所属类型
/// </summary>
[SugarColumn(IsNullable = true, DefaultValue = "0")]
public int DataType { get; set; }
[SugarColumn(IsIgnore = true)]
public string DataTypeName { get; set; }
[SugarColumn(ColumnDescription = "新增用户id", IsNullable = true)]
public long AdminId { get; set; }
[SugarColumn(ColumnDescription = "新增用户角色id", IsNullable = true)]
public long AdminRoleId { get; set; }
}
}

View File

@ -0,0 +1,128 @@
using System;
using System.Linq;
using System.Text;
using SqlSugar;
using VideoAnalysisCore.Interface;
namespace App.Model
{
///<summary>
/// 文件内容表
///</summary>
[SugarTable("FileContent")]
[Tenant("1002")]
public partial class FileContent
{
public FileContent(){
this.Sort =Convert.ToInt32("0");
this.CreateTime =DateTime.Now;
this.DeleteState =false;
}
[SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
public long Id {get;set;}
/// <summary>
/// Desc:内容名称
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "内容名称", ColumnDataType = "nvarchar(500)", IsNullable = false)]
public string FileName {get;set;}
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(ColumnDescription = "学校id", IsNullable = true)]
public long? SchoolId {get;set;}
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(ColumnDescription = "学校名称", ColumnDataType = "nvarchar(100)", IsNullable = true)]
public string SchoolName {get;set;}
/// <summary>
/// Desc:年级
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(ColumnDescription = "年级", ColumnDataType = "nvarchar(30)", IsNullable = true)]
public string GradeName {get;set;}
/// <summary>
/// Desc:科目
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(ColumnDescription = "科目", IsNullable = true)]
public int? SubjectId {get;set;}
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(ColumnDescription = "科目名称", ColumnDataType = "nvarchar(50)", IsNullable = true)]
public string SubjectName {get;set;}
/// <summary>
/// Desc:文件系统目录id
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "件系统目录id", IsNullable = false)]
public long FileDirectoryId {get;set;}
/// <summary>
/// Desc:
/// Default:0
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "排序", IsNullable = false, DefaultValue = "0")]
public int Sort {get;set;}
public DateTime CreateTime {get;set;}
public bool DeleteState {get;set;}
/// <summary>
/// Desc:文件包Id
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "文件包id", IsNullable = false)]
public long BagId {get;set;}
/// <summary>
/// Desc:作者
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(ColumnDescription = "作者", ColumnDataType = "nvarchar(200)", IsNullable = true)]
public string Author {get;set;}
/// <summary>
/// 是否可以下载
/// </summary>
public bool DownState { get; set; }
/// <summary>
/// 管理员id
/// </summary>
[SugarColumn(ColumnDescription = "管理员id", IsNullable = true)]
public long? AdminId { get; set; }
/// <summary>
/// 管理员角色id
/// </summary>
[SugarColumn(ColumnDescription = "管理员角色id", IsNullable = true)]
public long? AdminRoleId { get; set; }
}
}

View File

@ -0,0 +1,66 @@
using System;
using System.Linq;
using System.Text;
using SqlSugar;
using VideoAnalysisCore.Interface;
namespace App.Model
{
///<summary>
///
///</summary>
[SugarTable("FileContentMaterial")]
[Tenant("1002")]
public partial class FileContentMaterial
{
public FileContentMaterial(){
this.CreateTime =DateTime.Now;
this.DeleteState =false;
}
/// <summary>
/// Desc:文件系统内容
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
public long Id {get;set;}
/// <summary>
/// Desc:文件系统内容
/// Default:
/// Nullable:False
/// </summary>
public long FileContentId {get;set;}
/// <summary>
/// Desc:素材id
/// Default:
/// Nullable:False
/// </summary>
public long MaterialId {get;set;}
/// <summary>
/// Desc:
/// Default:DateTime.Now
/// Nullable:False
/// </summary>
public DateTime CreateTime {get;set;}
/// <summary>
/// Desc:
/// Default:0
/// Nullable:False
/// </summary>
public bool DeleteState {get;set;}
public int Sort { get; set; }
/// <summary>
/// 是否可以下载
/// </summary>
public bool DownState { get; set; } = false;
}
}

View File

@ -0,0 +1,161 @@
using System;
using System.Linq;
using System.Text;
using SqlSugar;
using VideoAnalysisCore.Interface;
namespace App.Model
{
///<summary>
/// 文件目录表
///</summary>
[SugarTable("FileDirectory")]
[Tenant("1002")]
public partial class FileDirectory
{
public FileDirectory(){
this.State =Convert.ToInt32("1");
this.IsCheckedSelect =true;
this.IsLastNode =false;
this.ParentId =Convert.ToInt64("0");
this.CreateTime =DateTime.Now;
this.DeleteState =false;
this.AliasName =Convert.ToString("");
this.IsPublic =false;
this.Types =Convert.ToInt32("-1");
this.Code =Convert.ToString("");
}
[SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
public long Id {get;set;}
/// <summary>
/// Desc:名称
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "名称", ColumnDataType = "nvarchar(50)", IsNullable = false)]
public string Name {get;set;}
/// <summary>
/// Desc:排序
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "排序", IsNullable = false)]
public int Sort {get;set;}
/// <summary>
/// Desc:结构状态 1=显示
/// Default:1
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "结构状态 1=显示", IsNullable = false,DefaultValue ="1")]
public int State {get;set;}
/// <summary>
/// Desc:是否自动授权
/// Default:1
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "是否自动授权", IsNullable = false, DefaultValue = "1")]
public bool IsCheckedSelect {get;set;}
/// <summary>
/// Desc:是否最后一级节点
/// Default:0
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "是否最后一级节点", IsNullable = false, DefaultValue = "0")]
public bool IsLastNode {get;set;}
/// <summary>
/// Desc:上级id
/// Default:0
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "上级id", IsNullable = false, DefaultValue = "0")]
public long ParentId {get;set;}
public DateTime CreateTime {get;set;}
public bool DeleteState {get;set;}
/// <summary>
/// Desc:别名
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "别名", ColumnDataType = "nvarchar(50)", IsNullable = false)]
public string AliasName {get;set;}
/// <summary>
/// Desc:是否公开
/// Default:0
/// Nullable:True
/// </summary>
[SugarColumn(ColumnDescription = "是否公开", IsNullable = true, DefaultValue = "0")]
public bool? IsPublic {get;set;}
/// <summary>
/// Desc:其他=-1目录=0,课程=1,章=2,节=3
/// Default:-1
/// Nullable:True
/// </summary>
[SugarColumn(ColumnDescription = "其他=-1目录=0,课程=1,章=2,节=3", IsNullable = true, DefaultValue = "-1")]
public int? Types {get;set;}
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(ColumnDescription = "更新时间", IsNullable = true)]
public DateTime? UpdateTime {get;set;}
/// <summary>
/// Desc:课程id来源courseinfo
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(ColumnDescription = "课程id来源courseinfo", IsNullable = true)]
public long? CourseId {get;set;}
/// <summary>
/// Desc:教材版本id来源 textboox_versions
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(ColumnDescription = "教材版本id来源 textboox_versions", IsNullable = true)]
public long? VersionsId {get;set;}
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(ColumnDescription = "", ColumnDataType = "nvarchar(50)", IsNullable = true)]
public string Code {get;set;}
/// <summary>
/// Desc:根节点id
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(ColumnDescription = "根节点id", IsNullable = true)]
public long? RootId {get;set;}
/// <summary>
/// 管理员id
/// </summary>
[SugarColumn(ColumnDescription = "管理员id", IsNullable = true)]
public long? AdminId { get; set; }
/// <summary>
/// 管理员角色id
/// </summary>
[SugarColumn(ColumnDescription = "管理员角色id", IsNullable = true)]
public long? AdminRoleId { get; set; }
}
}

View File

@ -6,10 +6,14 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using VideoAnalysisCore.Interface; using VideoAnalysisCore.Interface;
namespace VideoAnalysisCore.Model namespace VideoAnalysisCore.Model.
{ {
/// <summary>
/// 蓝鲸智库 知识点表
/// </summary>
[SugarTable("knowledgeinfo")] [SugarTable("knowledgeinfo")]
public class KnowledgeInfo : IKnowsDB [Tenant("1001")]
public class KnowledgeInfo
{ {
[SugarColumn(IsPrimaryKey = true, ColumnDescription = "Id 主键", ColumnName = "id")] [SugarColumn(IsPrimaryKey = true, ColumnDescription = "Id 主键", ColumnName = "id")]
public long Id { get; set; } public long Id { get; set; }

View File

@ -0,0 +1,110 @@
using System;
using System.Linq;
using System.Text;
using SqlSugar;
using VideoAnalysisCore.Interface;
namespace App.Model
{
///<summary>
///素材表
///</summary>
[SugarTable("Material")]
[Tenant("1002")]
public partial class Material
{
public Material()
{
this.TagId = Convert.ToInt64("0");
this.CreateTime = DateTime.Now;
this.DeleteState = false;
this.DownState = false;
}
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public long Id { get; set; }
/// <summary>
/// Desc:素材编号
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "素材编号", ColumnDataType = "nvarchar(50)", IsNullable = false)]
public string MaterialNo { get; set; }
/// <summary>
/// Desc:素材类型1视频2 文件3音频4图片
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "素材类型1视频2 文件3音频4图片", IsNullable = false)]
public int MaterialType { get; set; }
/// <summary>
/// Desc:标签Id
/// Default:0
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "素标签Id", IsNullable = false,DefaultValue ="0")]
public long TagId { get; set; }
/// <summary>
/// Desc:素材名称
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "素材名称", ColumnDataType = "nvarchar(500)", IsNullable = false)]
public string MaterialName { get; set; }
/// <summary>
/// Desc:附件id
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "附件id",IsNullable = false)]
public long AttachmentsId { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
[SugarColumn(ColumnDescription = "内容", ColumnDataType = "nvarchar(max)", IsNullable = true)]
public string Desc { get; set; }
public DateTime CreateTime { get; set; }
public bool DeleteState { get; set; }
/// <summary>
/// 新增用户id
/// </summary>
[SugarColumn(ColumnDescription = "新增用户id")]
public long CreateUserId { get; set; }
/// <summary>
/// Desc:新增用户名称
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(ColumnDescription = "新增用户名称",ColumnDataType = "nvarchar(50)")]
public string CreateUserName { get; set; }
[SugarColumn(ColumnDescription = "学校id",IsNullable =true)]
public long SchoolId { get; set; }
[SugarColumn(ColumnDescription = "学校名称", ColumnDataType = "nvarchar(50)", IsNullable = true)]
public string SchoolName { get; set; }
/// <summary>
/// 是否可以下载
/// </summary>
[SugarColumn(ColumnDescription = "是否可以下载", DefaultValue ="0")]
public bool DownState { get; set; }
/// <summary>
/// 新增用户角色id
/// </summary>
[SugarColumn(ColumnDescription = "新增用户角色id",IsNullable =true)]
public long AdminRoleId { get; set; }
}
}

View File

@ -57,6 +57,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Coravel" Version="6.0.2" />
<PackageReference Include="FreeRedis" Version="1.3.2" /> <PackageReference Include="FreeRedis" Version="1.3.2" />
<PackageReference Include="Downloader" Version="3.2.1" /> <PackageReference Include="Downloader" Version="3.2.1" />
<PackageReference Include="Mapster" Version="7.4.1-pre01" /> <PackageReference Include="Mapster" Version="7.4.1-pre01" />