using AutoMapper; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using VOL.Business.IRepositories; using VOL.Business.IRepositories.Stadium; using VOL.Business.IServices; using VOL.Business.Repositories; using VOL.Core.CacheManager; using VOL.Core.Enums; using VOL.Core.Extensions; using VOL.Core.Extensions.AutofacManager; using VOL.Core.ManageUser; using VOL.Core.Utilities; using VOL.Entity.DomainModels; using VOL.Entity.DomainModels.YD; using VOL.Model; using VOL.Model.Ai; using VOL.System.Repositories; using static Dapper.SqlMapper; namespace VOL.Business.Services { /// /// 课程服务 /// public class CurricularService : ICurricularService, IDependency { #region 初始化 private readonly IMapper _mapper; private readonly ICacheService _cacheService; private readonly ICurricularRepository _curricularRepository; [ActivatorUtilitiesConstructor] public CurricularService(IMapper mapper, ICacheService cacheService, ICurricularRepository curricularRepository) { _mapper = mapper; _cacheService = cacheService; _curricularRepository = curricularRepository; } #endregion /// /// 查询课程分类 /// /// /// public async Task> GetCourseCategories(CourseCategoryVo dto) { // 实现查询逻辑 var res = new PageDataDto(); // 示例查询逻辑 var query = from c in _curricularRepository.DbContext.Set() select new CourseCategoryDto() { Id = c.Id, CategoryName = c.TaxonomyName }; if (!string.IsNullOrWhiteSpace(dto.CategoryName)) { query = query.Where(x => x.CategoryName.Contains(dto.CategoryName)); } res.Total = await query.CountAsync(); var list = await query .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .OrderBy(x => x.Id) .ToListAsync(); res.Datas = list; return res; } /// /// 新增课程分类 /// /// /// public async Task AddCourseCategory(CourseCategoryDto dto) { // 实现新增逻辑 var entity = new Y_CurricularTaxonomy { TaxonomyName = dto.CategoryName }; _curricularRepository.Add(entity); await _curricularRepository.SaveChangesAsync(); } /// /// 更新课程分类 /// /// /// public async Task UpdateCourseCategory(CourseCategoryDto dto) { // 实现更新逻辑 var entity = await _curricularRepository.FindAsyncFirst(c => c.Id == dto.Id); if (entity != null) { entity.TaxonomyName = dto.CategoryName; // 其他属性更新 _curricularRepository.Update(entity); await _curricularRepository.SaveChangesAsync(); } } /// /// 删除课程分类 /// /// /// public async Task DeleteCourseCategory(int categoryId) { // 实现删除逻辑 var entity = await _curricularRepository.FindAsyncFirst(c => c.Id == categoryId); if (entity != null) { _curricularRepository.Delete(entity); await _curricularRepository.SaveChangesAsync(); } } /// /// 课程列表 /// /// /// public async Task> GetCurricularList(CurricularListVo dto) { var res = new PageDataDto(); var query = from c in _curricularRepository.DbContext.Set() join t in _curricularRepository.DbContext.Set() on c.TaxonomyId equals t.Id into taxonomyGroup from t in taxonomyGroup.DefaultIfEmpty() select new CurricularListDto() { Id = c.Id, TaxonomyId = c.TaxonomyId, TaxonomyName = t != null ? t.TaxonomyName : string.Empty, CurricularName = c.CurricularName, CoverImage = c.CoverImage, Url = c.Url, Hits = c.Hits, CreateDate = c.CreateDate }; if (dto.TaxonomyId.HasValue) { query = query.Where(x => x.TaxonomyId == dto.TaxonomyId.Value); } if (!string.IsNullOrWhiteSpace(dto.CurricularName)) { query = query.Where(x => x.CurricularName.Contains(dto.CurricularName)); } if (dto.StartTime.HasValue) { query = query.Where(x => x.CreateDate >= dto.StartTime.Value); } if (dto.EndTime.HasValue) { query = query.Where(x => x.CreateDate <= dto.EndTime.Value); } res.Total = await query.CountAsync(); var list = await query .OrderByDescending(x => x.CreateDate) .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .ToListAsync(); res.Datas = list; return res; } /// /// 新增课程 /// /// /// public async Task AddCurricular(CurricularAddDto dto) { var entity = new Y_Curricular { TaxonomyId = dto.TaxonomyId, CurricularName = dto.CurricularName, CoverImage = dto.CoverImage, Url = dto.Url, Hits = 0, CreateDate = DateTime.Now }; _curricularRepository.Add(entity); await _curricularRepository.SaveChangesAsync(); } /// /// 获取课程详情 /// /// /// public async Task GetCourseDetails(int courseId) { var course = await _curricularRepository.DbContext.Set() .FirstOrDefaultAsync(c => c.Id == courseId); if (course == null) { throw new Exception("课程不存在"); } var taxonomies = await _curricularRepository.FindAsync(c => true); return new CurricularAddDto { Id = course.Id, CurricularName = course.CurricularName, CoverImage = course.CoverImage, Url = course.Url, TaxonomyId = course.TaxonomyId, TaxonomyName = taxonomies.FirstOrDefault(c => c.Id == course.TaxonomyId).TaxonomyName, CreateDate = course.CreateDate.GetValueOrDefault() }; } /// /// 更新课程 /// /// /// /// public async Task UpdateCourse(CurricularAddDto dto) { var course = await _curricularRepository.FindAsyncFirst(c => c.Id == dto.Id); if (course == null) { throw new Exception("课程不存在"); } ALiYunOss.DeleteFilesByPrefix(course.CoverImage); ALiYunOss.DeleteFilesByPrefix(course.Url); course.CurricularName = dto.CurricularName; course.CoverImage = dto.CoverImage; course.Url = dto.Url; course.TaxonomyId = dto.TaxonomyId; course.ModifyDate = DateTime.Now; _curricularRepository.Update(course); await _curricularRepository.SaveChangesAsync(); } /// /// 删除课程 /// /// /// /// public async Task DeleteCourse(int courseId) { var course = await _curricularRepository.FindAsyncFirst(c => c.Id == courseId); if (course == null) { throw new Exception("课程不存在"); } ALiYunOss.DeleteFilesByPrefix(course.CoverImage); ALiYunOss.DeleteFilesByPrefix(course.Url); _curricularRepository.Delete(course); await _curricularRepository.SaveChangesAsync(); } /// /// 热门课程列表查询 /// /// 查询参数 /// 热门课程列表 public async Task> GetPopularCurricularList(PopularCurricularVo dto) { var res = new PageDataDto(); // 验证展示数量至少为2 if (dto.DisplayMode == "自动" && dto.DisplayCount.HasValue && dto.DisplayCount.Value < 2) { throw new Exception("最少展示2节课程"); } // 手动模式:从热门课程表中查询 if (dto.DisplayMode == "手动" || string.IsNullOrEmpty(dto.DisplayMode)) { var query = from p in _curricularRepository.DbContext.Set() join c in _curricularRepository.DbContext.Set() on p.CurricularId equals c.Id join t in _curricularRepository.DbContext.Set() on c.TaxonomyId equals t.Id into taxonomyGroup from t in taxonomyGroup.DefaultIfEmpty() select new PopularCurricularDto { Id = p.Id, CurricularId = p.CurricularId, CurricularTaxonomyName = t != null ? t.TaxonomyName : string.Empty, CurricularName = c.CurricularName, CoverImage = c.CoverImage, Hits = c.Hits, CreateDate = c.CreateDate, Remarks = p.Remarks }; res.Total = await query.CountAsync(); var list = await query .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .OrderByDescending(x => x.Id) .ToListAsync(); res.Datas = list; } // 自动模式:根据规则从课程表中查询 else if (dto.DisplayMode == "自动") { var query = from c in _curricularRepository.DbContext.Set() join t in _curricularRepository.DbContext.Set() on c.TaxonomyId equals t.Id into taxonomyGroup from t in taxonomyGroup.DefaultIfEmpty() select new PopularCurricularDto { Id = c.Id, // 自动模式下,Id为0 CurricularId = c.Id, CurricularTaxonomyName = t != null ? t.TaxonomyName : string.Empty, CurricularName = c.CurricularName, CoverImage = c.CoverImage, Hits = c.Hits, CreateDate = c.CreateDate, Remarks = "" }; // 根据展示规则排序 if (dto.DisplayRule == "最新上传") { query = query.OrderByDescending(x => x.CreateDate); } else if (dto.DisplayRule == "流量最大") { query = query.OrderByDescending(x => x.Hits); } else { query = query.OrderByDescending(x => x.CreateDate); } // 如果设置了展示数量,则按照展示数量返回 if (dto.DisplayCount.HasValue) { res.Total = Math.Min(await query.CountAsync(), dto.DisplayCount.Value); var list = await query.Take(dto.DisplayCount.Value).ToListAsync(); res.Datas = list; } else { res.Total = await query.CountAsync(); var list = await query .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .ToListAsync(); res.Datas = list; } } return res; } /// /// 添加热门课程 /// /// 课程ID列表 /// public async Task AddPopularCurricular(AddPopularCurricularDto dto) { if (dto.CurricularIds == null || !dto.CurricularIds.Any()) { throw new Exception("课程ID不能为空"); } // 验证课程是否存在 var curriculars = await _curricularRepository.DbContext.Set() .Where(c => dto.CurricularIds.Contains(c.Id)) .ToListAsync(); if (curriculars.Count != dto.CurricularIds.Count) { throw new Exception("部分课程不存在"); } // 验证课程是否已经是热门课程 var existingPopulars = await _curricularRepository.DbContext.Set() .Where(p => dto.CurricularIds.Contains(p.CurricularId)) .Select(p => p.CurricularId) .ToListAsync(); // 过滤掉已经存在的课程ID var newCurricularIds = dto.CurricularIds.Except(existingPopulars).ToList(); if (!newCurricularIds.Any()) { throw new Exception("所选课程已经是热门课程"); } // 批量添加热门课程 var entities = newCurricularIds.Select(id => new Y_PopularCurricular { CurricularId = id, CreateDate = DateTime.Now, Creator = UserContext.Current.UserId }).ToList(); _curricularRepository.AddRange(entities); await _curricularRepository.SaveChangesAsync(); } /// /// 删除热门课程 /// /// 热门课程ID /// public async Task DeletePopularCurricular(int id) { var entity = await _curricularRepository.FindAsyncFirst(c => c.Id == id); if (entity == null) { throw new Exception("热门课程不存在"); } _curricularRepository.Delete(entity); await _curricularRepository.SaveChangesAsync(); } /// /// 上传视频 /// public async Task UploadVideo(IFormFile file) { var timeStampString = DateTime.Now.ToUnixTimeStamp(); var prefix = $"Upload/Curricular/"; // 删除文件 //ALiYunOss.DeleteFilesByPrefix(prefix); // 上传文件 var url = ALiYunOss.Upload(file, prefix, timeStampString); return url; } /// /// 上传封面图像 /// /// /// public string UploadImage(IFormFile file) { var timeStampString = DateTime.Now.ToUnixTimeStamp(); var prefix = $"Upload/Curricular/"; var url = ALiYunOss.Upload(file, prefix, timeStampString); return url; } } }