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
}
}