using System.Linq; using System.Collections.Generic; using System.Threading.Tasks; using AutoMapper; using Datory; using GxPress.Common.AppOptions; using GxPress.Common.Tools; using GxPress.Repository.Interface.Media; using GxPress.Result.Media; using Microsoft.Extensions.Options; using System.Transactions; using GxPress.Common.Exceptions; using GxPress.Common.Page; using GxPress.Request.Media; using System; namespace GxPress.Repository.Implement.Media { public class MediaRepository : IMediaRepository { private readonly Repository _repository; private readonly Repository mediaLibraryRepository; private readonly Repository mediaLableRepository; private readonly IMapper _mapper; private readonly string _connectionString; private readonly string _databaseTypestr; public MediaRepository(IOptionsMonitor dbOptionsAccessor, IMapper mapper) { _databaseTypestr = dbOptionsAccessor.CurrentValue.DatabaseType; _connectionString = dbOptionsAccessor.CurrentValue.ConnectionString; var databaseType = StringUtils.ToEnum(dbOptionsAccessor.CurrentValue.DatabaseType, DatabaseType.MySql); var database = new Database(databaseType, dbOptionsAccessor.CurrentValue.ConnectionString); _repository = new Repository(database); mediaLibraryRepository = new Repository(database); mediaLableRepository = new Repository(database); _mapper = mapper; } public IDatabase Database => _repository.Database; public string TableName => _repository.TableName; public List TableColumns => _repository.TableColumns; public async Task GetAsync(int id) { var result = new MediaResult(); //获取媒体 var media = await _repository.GetAsync(id); result = _mapper.Map(media); result.ImageUrls = StringUtils.AddDomain(result.ImageUrls); result.CategoryId = StringUtils.StringCollectionToStringList(media.CategoryId).ToList(); result.CategoryName = StringUtils.StringCollectionToStringList(media.CategoryName).ToList(); result.FullCategoryId = StringUtils.StringCollectionToStringList(media.FullCategoryId).ToList(); //获取媒体库资源 var mediaLibrarys = await mediaLibraryRepository.GetAllAsync(Q.Where(nameof(Entity.tede2.Media.MediaLibrary.MediaId), id)); result.MediaLibraryResults = mediaLibrarys.ToList().Select(n => _mapper.Map(n)).ToList(); foreach (var item in result.MediaLibraryResults) { item.FileUrl = StringUtils.AddDomain(item.FileUrl); } //获取媒体标签 var mediaLables = await mediaLableRepository.GetAllAsync(Q.Where(nameof(Entity.tede2.Media.MediaLable.MediaId), id)); result.MediaLableResults = mediaLables.Select(n => _mapper.Map(n)).ToList(); return result; } /// /// 删除媒体 /// /// /// public async Task DeleteAsync(int id) { try { using (var transactionScope = new TransactionScope()) { // //删除媒体库 // await mediaLibraryRepository.DeleteAsync(Q.Where(nameof(Entity.tede2.Media.MediaLibrary.MediaId), id)); // //删除媒体标签 // await mediaLableRepository.DeleteAsync(Q.Where(nameof(Entity.tede2.Media.MediaLable.MediaId), id)); await _repository.UpdateAsync(Q.Where(nameof(Entity.tede2.Media.Media.Id), id).Set(nameof(Entity.tede2.Media.Media.IsDelete), true)); transactionScope.Complete(); } } catch (System.Exception ex) { throw new BusinessException(ex.Message); } return true; } /// /// 添加媒体 /// /// /// public async Task InsertAsync(MediaResult result) { var model = _mapper.Map(result); model.ImageUrls = StringUtils.RemoveDomain(result.ImageUrls); try { using (var transactionScope = new TransactionScope()) { model.AutoNumber = SnowflakeHelper.MakeSnowflake(); var categoryId = ""; foreach (var item in result.CategoryId) { categoryId += item.Split(",")[item.Split(",").Length - 1] + ","; } categoryId = categoryId.Remove(categoryId.Length - 1, 1); model.CategoryId = categoryId; model.FullCategoryId = StringUtils.ObjectCollectionToString(result.CategoryId); var categoryName = ""; foreach (var item in result.CategoryName) { categoryName += item.Split(",")[item.Split(",").Length - 1] + ","; } categoryName = categoryName.Remove(categoryName.Length - 1, 1); model.CategoryName = categoryName; model.IsLibrary = result.MediaLibraryResults.Count > 0; var id = await _repository.InsertAsync(model); if (id > 0) { foreach (var item in result.MediaLibraryResults) { var mediaLibrary = _mapper.Map(item); mediaLibrary.MediaId = id; mediaLibrary.FileUrl = StringUtils.RemoveDomain(item.FileUrl); await mediaLibraryRepository.InsertAsync(mediaLibrary); } } //添加标签 foreach (var item in result.MediaLableResults) { var mediaLable = _mapper.Map(item); mediaLable.MediaId = id; await mediaLableRepository.InsertAsync(mediaLable); } if (result.Id == 0 && result.TeacherId == 0 && !string.IsNullOrEmpty(result.Author)) { //新增名师 } //提交事务 transactionScope.Complete(); } } catch (System.Exception ex) { throw new Common.Exceptions.BusinessException(ex.Message); } return true; } public async Task UpdateAsync(Entity.tede2.Media.Media note) { return await _repository.UpdateAsync(note); } public async Task UpdateAsync(SqlKata.Query query) { return await _repository.UpdateAsync(query) > 0; } /// /// 查询 /// /// /// public async Task> GetAllAsync(MediaSearchRequest request) { var result = new PagedList(); var query = Q.NewQuery(); if (!string.IsNullOrEmpty(request.KeyWord)) { query.OrWhereLike(nameof(Entity.tede2.Media.Media.Title), $"%{request.KeyWord}%"); query.OrWhereLike(nameof(Entity.tede2.Media.Media.Creator), $"%{request.KeyWord}%"); } if (request.IsDelete > 0) query.Where(nameof(Entity.tede2.Media.Media.IsDelete), request.IsDelete == 1); if (request.MediaType > 0) query.Where(nameof(Entity.tede2.Media.Media.MediaType), request.MediaType); if (request.LibraryType > 0) query.Where(nameof(Entity.tede2.Media.Media.IsLibrary), request.LibraryType == 1); if (!string.IsNullOrEmpty(request.BeginTime) && !string.IsNullOrEmpty(request.EndTime)) { if (DateTime.TryParse(request.BeginTime, out var beginTime) && DateTime.TryParse(request.EndTime, out var endTime)) { query.WhereDate(nameof(Entity.tede2.Media.Media.CreatedDate), ">=", beginTime); query.WhereDate(nameof(Entity.tede2.Media.Media.CreatedDate), "<=", endTime); } } if (request.IsChecked > 0) query.Where(nameof(Entity.tede2.Media.Media.IsChecked), request.IsChecked == 1); result.Total = await _repository.CountAsync(query); //排序 if (string.IsNullOrEmpty(request.Sort)) query.OrderByDesc(nameof(Entity.tede2.Media.Media.CreatedDate)); else if (request.Sort.Equals("SellAmount")) query.OrderByDesc(nameof(Entity.tede2.Media.Media.SellAmount)); else if (request.Sort.Equals("ReadCount")) query.OrderByDesc(nameof(Entity.tede2.Media.Media.ReadCount)); var item = await _repository.GetAllAsync(query.ForPage(request.Page, request.PerPage)); result.Items = item; return result; } public async Task UpdateAsync(MediaResult result) { //var model = _mapper.Map(result); try { using (var transactionScope = new TransactionScope()) { var model = await _repository.GetAsync(result.Id); if (result.CategoryId != null && result.CategoryId.Count > 0) { var categoryId = ""; foreach (var item in result.CategoryId) categoryId += item.Split(",")[item.Split(",").Length - 1] + ","; categoryId = categoryId.Remove(categoryId.Length - 1, 1); model.CategoryId = categoryId; model.FullCategoryId = StringUtils.ObjectCollectionToString(result.CategoryId); } if (result.CategoryName != null && result.CategoryName.Count > 0) { var categoryName = ""; foreach (var item in result.CategoryName) categoryName += item.Split(",")[item.Split(",").Length - 1] + ","; categoryName = categoryName.Remove(categoryName.Length - 1, 1); model.CategoryName = categoryName; } if (result.AdminId > 0) model.AdminId = result.AdminId; if (!string.IsNullOrEmpty(result.Creator)) model.Creator = result.Creator; if (result.MediaType > 0) model.MediaType = result.MediaType; if (!string.IsNullOrEmpty(result.Title)) model.Title = result.Title; if (!string.IsNullOrEmpty(result.ImageUrls)) model.ImageUrls = result.ImageUrls; if (!string.IsNullOrEmpty(result.Summary)) model.Summary = result.Summary; if (!string.IsNullOrEmpty(result.Author)) model.Author = result.Author; if (result.TeacherId > 0) model.TeacherId = result.TeacherId; if (!string.IsNullOrEmpty(result.Source)) model.Source = result.Source; if (!string.IsNullOrEmpty(result.Blocks)) model.Blocks = result.Blocks; if (result.IsChecked > 0) model.IsChecked = result.IsChecked == 1; if (!string.IsNullOrEmpty(result.AddDate)) model.AddDate = Convert.ToDateTime(result.AddDate); if (model.Sort > 0) model.Sort = result.Sort; if (model.ReadCount > 0) model.ReadCount = result.ReadCount; if (result.IsTop > 0) model.IsTop = result.IsTop == 1; if (result.LableId > 0) model.LableId = result.LableId; if (result.IsRecommend > 0) model.IsRecommend = result.IsRecommend == 1; if (!string.IsNullOrEmpty(result.Press)) model.Press = result.Press; if (!string.IsNullOrEmpty(result.PublishTime)) model.PublishTime = result.PublishTime; if (result.IosDiscountPrice > 0) model.IosDiscountPrice = result.IosDiscountPrice; if (result.IosPrice > 0) model.IosPrice = result.IosPrice; if (result.OtherDiscountPrice > 0) model.OtherDiscountPrice = result.OtherDiscountPrice; if (result.OtherPrice > 0) model.OtherPrice = result.OtherPrice; if (result.FreeProportion > 0) model.FreeProportion = result.FreeProportion; if (result.AttachType > 0) model.AttachType = result.AttachType; if (result.AttachId > 0) model.AttachId = result.AttachId; if (result.MediaId > 0) model.MediaId = result.MediaId; if (!string.IsNullOrEmpty(result.MediaTitle)) model.MediaTitle = result.MediaTitle; if (!string.IsNullOrEmpty(result.JournalsYear)) model.JournalsYear = result.JournalsYear; if (result.JournalsCategory > 0) model.JournalsCategory = result.JournalsCategory; await _repository.UpdateAsync(model); if (result.MediaLibraryResults != null && result.MediaLibraryResults.Count > 0) { model.IsLibrary = result.MediaLibraryResults.Count > 0; //删除媒体库 await mediaLibraryRepository.DeleteAsync(Q.Where(nameof(Entity.tede2.Media.MediaLibrary.MediaId), result.Id)); foreach (var item in result.MediaLibraryResults) { var mediaLibrary = _mapper.Map(item); mediaLibrary.MediaId = result.Id; mediaLibrary.FileUrl = StringUtils.RemoveDomain(mediaLibrary.FileUrl); await mediaLibraryRepository.InsertAsync(mediaLibrary); } } if (result.MediaLableResults != null && result.MediaLableResults.Count > 0) { //删除媒体标签 await mediaLableRepository.DeleteAsync(Q.Where(nameof(Entity.tede2.Media.MediaLable.MediaId), result.Id)); //添加标签 foreach (var item in result.MediaLableResults) { var mediaLable = _mapper.Map(item); mediaLable.MediaId = result.Id; await mediaLableRepository.InsertAsync(mediaLable); } } //提交事务 transactionScope.Complete(); } } catch (System.Exception ex) { throw new Common.Exceptions.BusinessException(ex.Message); } return true; } public async Task CountAsync(string beginTime, string endTime) { return await _repository.CountAsync(Q.WhereDate(nameof(Entity.tede2.Media.Media.CreatedDate), ">=", beginTime).WhereDate(nameof(Entity.tede2.Media.Media.CreatedDate), "<=", endTime)); } public async Task CountAsync(SqlKata.Query query) { return await _repository.CountAsync(query); } public async Task GetAsync(string autoNumber) { return await _repository.GetAsync(Q.Where(nameof(Entity.tede2.Media.Media.AutoNumber), autoNumber)); } /// /// 获取书籍 /// /// /// public async Task GetBookMediaResultAsync(int mediaId) { var result = await _repository.GetAsync(Q.Where(nameof(Entity.tede2.Media.Media.Id), mediaId).Where(nameof(Entity.tede2.Media.Media.IsChecked), true).Where(nameof(Entity.tede2.Media.Media.IsDelete), false)); return _mapper.Map(result); } /// /// 获取视频 /// /// /// public async Task GetVideoMediaResultAsync(int mediaId) { var result = await _repository.GetAsync(Q.Where(nameof(Entity.tede2.Media.Media.Id), mediaId).Where(nameof(Entity.tede2.Media.Media.IsChecked), true).Where(nameof(Entity.tede2.Media.Media.IsDelete), false)); return _mapper.Map(result); } public async Task> GetNavigationMediaResults(IEnumerable mediaLables) { //获取媒体 var query = Q.NewQuery(); query.Select(nameof(Entity.tede2.Media.Media.Id)); query.Select(nameof(Entity.tede2.Media.Media.ImageUrls)); query.Select(nameof(Entity.tede2.Media.Media.Title)); query.Select(nameof(Entity.tede2.Media.Media.Summary)); query.Select(nameof(Entity.tede2.Media.Media.TeacherId)); query.Select(nameof(Entity.tede2.Media.Media.AutoNumber)); query.Select(nameof(Entity.tede2.Media.Media.Author)); query.Select(nameof(Entity.tede2.Media.Media.MediaType)); query.WhereIn(nameof(Entity.tede2.Media.Media.LableId), mediaLables); query.Where(nameof(Entity.tede2.Media.Media.IsChecked), true); query.Where(nameof(Entity.tede2.Media.Media.IsDelete), false); query.OrderByDesc(nameof(Entity.tede2.Media.Media.IsTop)); query.OrderByDesc(nameof(Entity.tede2.Media.Media.IsRecommend)); query.ForPage(1, 10); return await _repository.GetAllAsync(query); } } }