using NCC.Common.Configuration; using NCC.Common.Enum; using NCC.Common.Extension; using NCC.Common.Helper; using NCC.Common.Util; using NCC.Dependency; using NCC.DynamicApiController; using NCC.FriendlyException; using NCC.VisualData.Entity; using NCC.VisualData.Entitys.Dto.Screen; using NCC.VisualData.Entitys.Dto.ScreenCategory; using NCC.VisualData.Entitys.Dto.ScreenConfig; using NCC.VisualData.Entitys.Enum; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using SqlSugar; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using Yitter.IdGenerator; namespace NCC.VisualData { /// /// 业务实现:大屏 /// [ApiDescriptionSettings(Tag = "BladeVisual", Name = "Visual", Order = 160)] [Route("api/blade-visual/[controller]")] public class ScreenService : IDynamicApiController, ITransient { private readonly ISqlSugarRepository _visualRepository; private readonly ISqlSugarRepository _visualConfigRepository; private readonly ISqlSugarRepository _visualCategoryRepository; /// /// 初始化一个类型的新实例 /// public ScreenService(ISqlSugarRepository visualRepository, ISqlSugarRepository visualConfigRepository, ISqlSugarRepository visualCategoryRepository) { _visualRepository = visualRepository; _visualConfigRepository = visualConfigRepository; _visualCategoryRepository = visualCategoryRepository; } #region Get /// /// 分页 /// /// [HttpGet("list")] public async Task GetList([FromQuery] ScreenListQueryInput input) { var data = await _visualRepository.Entities.Where(v => v.IsDeleted == 0) .Select(v => new { id = v.Id, backgroundUrl = v.BackgroundUrl, category = v.Category, createDept = v.CreateDept, createTime = v.CreateTime, createUser = v.CreateUser, isDeleted = v.IsDeleted, password = v.Password, status = v.Status, title = v.Title, updateTime = v.UpdateTime, updateUser = v.UpdateUser }) .MergeTable().Select().Where(v => v.category == input.category).ToPagedListAsync(input.current, input.size); return new { current = data.pagination.PageIndex, pages = data.pagination.Total / data.pagination.PageSize, records = data.list, size = data.pagination.PageSize, total = data.pagination.Total }; } /// /// 详情 /// /// [HttpGet("detail")] public async Task GetInfo([FromQuery] string id) { var entity = await _visualRepository.SingleAsync(v => v.Id == id); var configEntity = await _visualConfigRepository.SingleAsync(v => v.VisualId == id); return new { config = configEntity.Adapt(), visual = entity.Adapt() }; } /// /// 获取类型 /// /// [HttpGet("category")] public async Task GetCategoryList() { var entity = await _visualCategoryRepository.Where(v => v.IsDeleted == "0").ToListAsync(); return entity.Adapt(); } /// /// 获取图片列表 /// /// [HttpGet("{type}")] public dynamic GetImgFileList(string type) { var list = new List(); var typeEnum = EnumExtensions.GetEnumDescDictionary(typeof(ScreenImgEnum)); var imgEnum = typeEnum.Where(t => t.Value.Equals(type)).FirstOrDefault(); if (imgEnum.Value != null) { var path = Path.Combine(FileVariable.BiVisualPath, imgEnum.Value); var fileinfos = FileHelper.GetAllFiles(path); foreach (var item in fileinfos) { list.Add(new ScreenImgFileOutput() { link = string.Format(@"/api/file/VisusalImg/{0}/{1}", type, item.Name), originalName = item.Name }); } } return list; } /// /// 查看图片 /// /// [HttpGet("{type}/{fileName}")] [AllowAnonymous] public dynamic GetImgFile(string type, string fileName) { var typeEnum = EnumExtensions.GetEnumDescDictionary(typeof(ScreenImgEnum)); var imgEnum = typeEnum.Where(t => t.Value.Equals(type)).FirstOrDefault(); if (imgEnum.Value != null) { var path = Path.Combine(FileVariable.BiVisualPath, imgEnum.Value, fileName); return new FileStreamResult(new FileStream(path, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName }; } return Task.FromResult(false); } /// /// 大屏下拉框 /// /// [HttpGet("selector")] public async Task GetSelector() { var screenList = await _visualRepository.Entities.Select(v => new { id = v.Id, parentId = v.Category, fullName = v.Title, isDeleted = v.IsDeleted }).MergeTable().Select().Where(v => v.isDeleted == 0).ToListAsync(); var categortList = await _visualCategoryRepository.Entities.Select(v => new { id = v.CategoryValue, parentId = "0", fullName = v.CategoryKey, isDeleted = v.IsDeleted }).MergeTable().Select().Where(v => v.isDeleted == 0).ToListAsync(); return new { list = categortList.Union(screenList).ToList().ToTree("0") }; } #endregion #region Post /// /// 新增 /// /// [HttpPost("save")] public async Task Save([FromBody] ScreenCrInput input) { var entity = input.visual.Adapt(); var configEntity = input.config.Adapt(); try { //开启事务 _visualRepository.Ado.BeginTran(); var newEntity = await _visualRepository.Context.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(m => m.Create()).ExecuteReturnEntityAsync(); configEntity.VisualId = newEntity.Id; await _visualConfigRepository.Context.Insertable(configEntity).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(m => m.Create()).ExecuteReturnEntityAsync(); _visualRepository.Ado.CommitTran(); return new { id = newEntity.Id }; } catch (Exception) { _visualRepository.Ado.RollbackTran(); throw NCCException.Oh(ErrorCode.COM1000); } } /// /// 修改 /// /// [HttpPost("update")] public async Task Update([FromBody] ScreenUpInput input) { var entity = new VisualEntity(); if (input.visual.backgroundUrl != null) { entity = await _visualRepository.SingleAsync(v => v.Id == input.visual.id); entity.BackgroundUrl = input.visual.backgroundUrl; } else { entity = input.visual.Adapt(); } var configEntity = input.config.Adapt(); try { //开启事务 _visualRepository.Ado.BeginTran(); await _visualRepository.Context.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandAsync(); if (configEntity != null) await _visualConfigRepository.Context.Updateable(configEntity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); _visualRepository.Ado.CommitTran(); } catch (Exception) { _visualRepository.Ado.RollbackTran(); throw NCCException.Oh(ErrorCode.COM1000); } } /// /// 逻辑删除 /// /// [HttpPost("remove")] public async Task Remove(string ids) { var entity = await _visualRepository.SingleAsync(v => v.Id == ids); await _visualRepository.Context.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.Delete()).ExecuteCommandAsync(); } /// /// 复制 /// /// [HttpPost("copy")] public async Task Copy(string id) { var entity = await _visualRepository.SingleAsync(v => v.Id == id); var configEntity = await _visualConfigRepository.SingleAsync(v => v.VisualId == id); try { //开启事务 _visualRepository.Ado.BeginTran(); var newEntity = await _visualRepository.Context.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(m => m.Create()).ExecuteReturnEntityAsync(); configEntity.VisualId = newEntity.Id; await _visualConfigRepository.Context.Insertable(configEntity).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(m => m.Create()).ExecuteReturnEntityAsync(); _visualRepository.Ado.CommitTran(); return new { id = newEntity.Id }; } catch (Exception) { _visualRepository.Ado.RollbackTran(); throw NCCException.Oh(ErrorCode.COM1000); } } /// /// 上传文件 /// /// [HttpPost("put-file/{type}")] [AllowAnonymous] public async Task SaveFile(string type, IFormFile file) { var typeEnum = EnumExtensions.GetEnumDescDictionary(typeof(ScreenImgEnum)); var imgEnum = typeEnum.Where(t => t.Value.Equals(type)).FirstOrDefault(); if (imgEnum.Value != null) { var ImgType = Path.GetExtension(file.FileName).Replace(".", ""); if (!this.AllowImageType(ImgType)) throw NCCException.Oh(ErrorCode.D5013); var path = imgEnum.Value; var filePath = Path.Combine(FileVariable.BiVisualPath, path); if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath); var fileName = YitIdHelper.NextId().ToString() + "." + ImgType; using (var stream = File.Create(Path.Combine(filePath, fileName))) { await file.CopyToAsync(stream); } return new { name = "/" + Path.Combine("api", "file", "VisusalImg", path, fileName), link = "/" + Path.Combine("api", "file", "VisusalImg", path, fileName), originalName = file.FileName }; } return Task.FromResult(false); } #endregion #region PrivateMethod /// /// 允许文件类型 /// /// 文件后缀名 /// private bool AllowImageType(string fileExtension) { var allowExtension = KeyVariable.AllowImageType; var isExist = allowExtension.Find(a => a == fileExtension.ToLower()); if (!string.IsNullOrEmpty(isExist)) return true; else return false; } #endregion } }