285 lines
12 KiB
C#
285 lines
12 KiB
C#
|
||
using VideoAnalysisCore.Common;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using System.Reflection;
|
||
using MapsterMapper;
|
||
using Mapster;
|
||
using VideoAnalysisCore.AICore.SherpaOnnx;
|
||
using UserCenter.Model.Enum;
|
||
using VideoAnalysisCore.AICore.GPT.ChatGPT;
|
||
using VideoAnalysisCore.AICore.GPT;
|
||
using System.Text.Json;
|
||
using Microsoft.AspNetCore.Authorization;
|
||
using VideoAnalysisCore.Model.Enum;
|
||
using FFmpeg.NET.Services;
|
||
using static FFmpeg.NET.MetaData;
|
||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||
using Yitter.IdGenerator;
|
||
using VideoAnalysisCore.AICore.GPT.Dto;
|
||
using VideoAnalysisCore.Model;
|
||
using VideoAnalysisCore.Controllers.Dto;
|
||
using VideoAnalysisCore.Model.Dto;
|
||
using VideoAnalysisCore.Model.À¶¾¨ÖÇ¿â;
|
||
|
||
namespace VideoAnalysisCore.Controllers
|
||
{
|
||
/// <summary>
|
||
/// À¶¾¨×Ö¿â½Ó¿Ú
|
||
/// </summary>
|
||
[ApiController]
|
||
[Route("LJZK/[action]")]
|
||
public class LJZK_Controller : ControllerBase
|
||
{
|
||
private readonly IMapper mp;
|
||
private readonly Repository<NodeSubscription> nodesubscriptionDB;
|
||
private readonly Repository<VideoTask> videoTaskDB;
|
||
private readonly Repository<CourseInfo> courseInfoDB;
|
||
private readonly Repository<VideoKonwPoint> videoKonwPointDB;
|
||
private readonly Repository<VideoTaskStage> videoTaskStageDB;
|
||
private readonly Repository<NodePackageInfo> nodePackageInfoDB;
|
||
private readonly Repository<VideoQuestion> videoQuestionDB;
|
||
private readonly Repository<VideoQuestionKonw> videoQuestionKonwDB;
|
||
private readonly RedisManager redisManager;
|
||
|
||
public LJZK_Controller(IMapper mp, Repository<NodeSubscription> nodesubscriptionDB,
|
||
Repository<VideoTask> videoTaskDB = null, Repository<VideoKonwPoint> videoKonwPointDB = null
|
||
, Repository<NodePackageInfo> nodePackageInfoDB = null, Repository<VideoQuestion> videoQuestionDB = null, Repository<VideoQuestionKonw> videoQuestionKonwDB = null, Repository<CourseInfo> courseInfoDB = null, RedisManager redisManager = null, Repository<VideoTaskStage> videoTaskStageDB = null)
|
||
{
|
||
this.mp = mp;
|
||
this.nodesubscriptionDB = nodesubscriptionDB;
|
||
this.videoTaskDB = videoTaskDB;
|
||
this.videoKonwPointDB = videoKonwPointDB;
|
||
this.nodePackageInfoDB = nodePackageInfoDB;
|
||
this.videoQuestionDB = videoQuestionDB;
|
||
this.videoQuestionKonwDB = videoQuestionKonwDB;
|
||
this.courseInfoDB = courseInfoDB;
|
||
this.redisManager = redisManager;
|
||
this.videoTaskStageDB = videoTaskStageDB;
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// À¶¾¨ÖÇ¿â_Îļþ°ü¶©ÔÄ
|
||
/// </summary>
|
||
/// <param name="reqArr">ÇëÇóÌå</param>
|
||
/// <returns></returns>
|
||
[HttpPost(Name = "NodePackage")]
|
||
public async Task<IActionResult> NodePackage(NodePackageReq[] reqArr)
|
||
{
|
||
Console.WriteLine($"{DateTime.Now} Îļþ°ü¶©ÔÄÇëÇó req=" + reqArr.ToJson());
|
||
if (reqArr is null || reqArr.Count() == 0)
|
||
return BadRequest("ÎÞЧÊÓÆµÁбíÊý¾Ý");
|
||
var videos = new List<VideoTask>(reqArr.Count());
|
||
var nodePackages = new List<NodePackageInfo>(reqArr.Count());
|
||
var videoIdArr = videoTaskDB.AsQueryable().Select(v => v.TagId).Distinct().ToArray();
|
||
var courseArr = await courseInfoDB.AsQueryable().ToArrayAsync();
|
||
//ϵͳ¿É½ÓÊÕÈÎÎñµÄѧ¿Æ
|
||
var subjectArr = new List<SubjectEnum?>
|
||
{
|
||
SubjectEnum.Êýѧ
|
||
};
|
||
var courseTypeArr = new List<AttachmentsInfoType?>
|
||
{
|
||
AttachmentsInfoType.ÎÞ,
|
||
AttachmentsInfoType.пÎ,
|
||
AttachmentsInfoType.¸´Ï°
|
||
};
|
||
foreach (var sGroup in reqArr.GroupBy(s => s.ContentId))
|
||
{
|
||
var s = sGroup.FirstOrDefault(s => s.VideoType == VideoType.ÉãÏñÍ·);
|
||
if (s is null)
|
||
return BadRequest("ÎÞÓÐЧµÄÀÏʦÊÚ¿ÎÊÓÆµ");
|
||
//УÑéѧ¿ÆÓÐЧ
|
||
if (!subjectArr.Contains(s.SubjectId)) continue;
|
||
//ÎÞЧµÄ¿Î³ÌÀàÐÍ
|
||
if (!courseTypeArr.Contains(s.CourseType)) continue;
|
||
|
||
|
||
var stageId = s.StageId.GetHashCode();
|
||
var subjectId = s.SubjectId.GetHashCode();
|
||
var course = courseArr.FirstOrDefault(x => stageId == x.Stage_Id && subjectId == x.Subject_Id);
|
||
if (course == null) continue;
|
||
var sPPT = sGroup.FirstOrDefault(s => s.VideoType == VideoType.PPT¿Î¼þ);
|
||
var np = new NodePackageInfo()
|
||
{
|
||
VideoCode = s.VideoCode,
|
||
MaterialId = s.MaterialId,
|
||
AttachmentId = s.AttachmentId,
|
||
Stage = s.StageId,
|
||
CourseId = course.Id,
|
||
SubjectType = s.SubjectId,
|
||
VideoUrl = s.VideoUrl,
|
||
CourseType = s.CourseType,
|
||
CallBackUrl = s.CallBackUrl,
|
||
CloudSchoolId =s.UserCenterCloudSchoolId,
|
||
Area = s.Area,
|
||
HostIP = s.HostIP,
|
||
StageId = s.StageId,
|
||
GradeId = s.GradeId,
|
||
GradeSemester = s.GradeSemester,
|
||
TextBookVersionId = s.TextBookVersionId,
|
||
};
|
||
nodePackages.Add(np);
|
||
if (videoIdArr.Contains(s.VideoCode)) continue;
|
||
var pptCode = sPPT != null ? sPPT.VideoCode : string.Empty;
|
||
var pptUrl = sPPT != null ? sPPT.VideoUrl : string.Empty;
|
||
videos.Add(new VideoTask()
|
||
{
|
||
Id = YitIdHelper.NextId(),
|
||
ComeFrom = GetClientIpAddress(),
|
||
ApiToken = "",
|
||
EducationStage = s.StageId,
|
||
CourseId = course.Id,
|
||
Subject = s.SubjectId,
|
||
TagId = s.VideoCode,
|
||
MediaUrl = s.VideoUrl,
|
||
PPTVideoCode = pptCode,
|
||
PPTVideoUrl = pptUrl,
|
||
VideoType = s.CourseType,
|
||
CloudSchoolId = s.UserCenterCloudSchoolId,
|
||
TextBookVersionId = s.TextBookVersionId,
|
||
GradeSemester =s .GradeSemester,
|
||
CourseLevel =s.CourseLevel,
|
||
GradeId = s.GradeId,
|
||
});
|
||
}
|
||
await nodePackageInfoDB.InsertRangeAsync(nodePackages);
|
||
await videoTaskDB.InsertRangeAsync(videos);
|
||
if (videos is null || videos.Count == 0)
|
||
return Ok();
|
||
var ids = videos.Select(s => s.Id).ToArray();
|
||
redisManager.JoinQueue(ids);
|
||
return Ok();
|
||
}
|
||
|
||
private string GetClientIpAddress()
|
||
{
|
||
// ¼ì²é X-Forwarded-For ÇëÇóÍ·
|
||
if (HttpContext.Request.Headers.ContainsKey("X-Forwarded-For")
|
||
&& !string.IsNullOrEmpty(HttpContext.Request.Headers["X-Forwarded-For"]))
|
||
return HttpContext.Request.Headers["X-Forwarded-For"].ToString();
|
||
if (HttpContext.Connection.RemoteIpAddress != null)
|
||
return HttpContext.Connection.RemoteIpAddress.ToString();
|
||
throw new Exception("δÄÜ»ñÈ¡µ½¿Í»§¶ËipµØÖ·");
|
||
}
|
||
/// <summary>
|
||
/// »ñÈ¡ÈÎÎñÀàÐÍ
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpGet(Name = "TaskTypList")]
|
||
public IActionResult TaskType()
|
||
{
|
||
Type type = typeof(TaskTypeEnum);
|
||
return Ok(Enum.GetValues(type).Cast<object>()
|
||
.Select(s => new { Text = s.ToString(), Value = (int)s }));
|
||
}
|
||
|
||
/// <summary>
|
||
/// »ñȡѧ¿ÆÀàÐÍ
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpGet(Name = "SubjectList")]
|
||
public IActionResult Subject()
|
||
{
|
||
Type type = typeof(SubjectEnum);
|
||
return Ok(Enum.GetValues(type).Cast<object>()
|
||
.Select(s => new { Text = s.ToString(), Value = (int)s }));
|
||
}
|
||
|
||
/// <summary>
|
||
/// »ñÈ¡ÊÓÆµÖªÊ¶µãƬ¶Î<para>taskId/tagId¶þѡһ</para>
|
||
/// </summary>
|
||
/// <param name="tagId">×Ô¶¨Òåid</param>
|
||
/// <param name="taskId">×Ô¶¨Òåid</param>
|
||
/// <returns></returns>
|
||
[HttpGet(Name = "TaskKnowInfo")]
|
||
public async Task<IActionResult> TaskKnowInfo(string? tagId , string? taskId)
|
||
{
|
||
if (string.IsNullOrEmpty(tagId) && !string.IsNullOrEmpty(taskId))
|
||
tagId = taskId;
|
||
if (string.IsNullOrEmpty(tagId))
|
||
return BadRequest();
|
||
var task = await videoTaskDB.AsQueryable()
|
||
.Where(s => s.TagId == tagId || s.PPTVideoCode == tagId)
|
||
.FirstAsync();
|
||
if (task is null)
|
||
return BadRequest("ÎÞЧÈÎÎñ");
|
||
|
||
var konwArr = await videoKonwPointDB.AsQueryable()
|
||
.Where(s => s.VideoTaskId == task.Id)
|
||
.ToArrayAsync();
|
||
if (konwArr is null || konwArr.Length == 0)
|
||
return BadRequest("ÎÞÓÐЧÈÎÎñ·Ö¶Î");
|
||
|
||
|
||
var stageArr = await videoTaskStageDB.AsQueryable()
|
||
.Where(s => s.VideoTaskId == task.Id)
|
||
.ToArrayAsync();
|
||
var videoKnowDic = konwArr
|
||
.GroupBy(s => s.StageId)
|
||
.ToDictionary(s => s.Key);
|
||
var videoKnows = stageArr
|
||
.Select(s => new VideoKnowRes()
|
||
{
|
||
Content = s.Content,
|
||
StartTime = s.StartTime,
|
||
EndTime = s.EndTime,
|
||
Theme = s.Theme,
|
||
StageId = s.Id,
|
||
KnowPoint = videoKnowDic.ContainsKey(s.Id)
|
||
? string.Join(',', videoKnowDic[s.Id].Select(x => x.KnowPoint))
|
||
: string.Empty
|
||
}).ToArray();
|
||
|
||
var res = new TaskKnowRes()
|
||
{
|
||
TagId = task.TagId,
|
||
Status = task.LastEnum,
|
||
VideoTaskId = task.Id,
|
||
KnowBlockArr = stageArr
|
||
.Select(s => new TaskKnowBlock()
|
||
{
|
||
Id = s.Id,
|
||
Content = s.Content,
|
||
StartTime = s.StartTime,
|
||
StageId = s.Id,
|
||
EndTime = s.EndTime,
|
||
Theme = s.Theme,
|
||
Know = videoKnowDic.ContainsKey(s.Id)
|
||
? videoKnowDic[s.Id]?.Select(x => new TaskKnowInfo()
|
||
{
|
||
Id = x.Id,
|
||
KnowPoint = x.KnowPoint,
|
||
KnowPointId = x.KnowPointId,
|
||
KnowWeight = x.KnowPointWeight??0f,
|
||
})?.ToArray()
|
||
: null
|
||
}).ToArray()
|
||
};
|
||
if (task.VideoType == AttachmentsInfoType.¸´Ï°)
|
||
{
|
||
var questionArr = await videoQuestionDB
|
||
.AsQueryable().Where(s => s.VideoTaskId == task.Id)
|
||
.Select<VideoQuestionShowDto>()
|
||
.ToArrayAsync();
|
||
|
||
var konwDic = (await videoQuestionKonwDB
|
||
.AsQueryable().Where(s => s.VideoTaskId == task.Id)
|
||
.ToArrayAsync()).GroupBy(s => s.VideoQuestionId)
|
||
.ToDictionary(s => s.Key);
|
||
foreach (var item in questionArr.Where(s => konwDic.ContainsKey(s.Id)))
|
||
item.KonwArr = konwDic[item.Id].ToArray();
|
||
foreach (var item in res.KnowBlockArr)
|
||
item.QuestionArr = questionArr
|
||
.Where(s => s.StageId == item.StageId).ToArray();
|
||
}
|
||
return Ok(res);
|
||
}
|
||
|
||
|
||
|
||
|
||
}
|
||
}
|