using Hotline.Repository.SqlSugar.Extensions; using Hotline.Settings; using Hotline.Share.Dtos; using Hotline.Share.Dtos.File; using MapsterMapper; using Microsoft.AspNetCore.Mvc; using XF.Domain.Authentications; using XF.Domain.Exceptions; using XF.Domain.Repository; using Hotline.Caching.Interfaces; using Microsoft.AspNetCore.Authorization; namespace Hotline.Api.Controllers { public class FileController : BaseController { private readonly ISessionContext _sessionContext; private readonly IMapper _mapper; private readonly ISystemDicDataCacheManager _sysDicDataCacheManager; private readonly IRepository _fileRepository; private readonly ILogger _logger; public FileController( ISessionContext sessionContext, IMapper mapper, ISystemDicDataCacheManager sysDicDataCacheManager, IRepository fileRepository, ILogger logger) { _sessionContext = sessionContext; _mapper = mapper; _sysDicDataCacheManager = sysDicDataCacheManager; _fileRepository = fileRepository; _logger = logger; } #region 附件管理 /// /// 新增附件 /// /// /// [HttpPost] public async Task Add([FromBody] List dtos) { List files = new List(); foreach (var dto in dtos) { if (string.IsNullOrEmpty(dto.Key)) throw UserFriendlyException.SameMessage("请上传附件关联Key"); var model = _mapper.Map(dto); model.OrgName = _sessionContext.OrgName; model.OrgId = _sessionContext.OrgId; model.UserId = _sessionContext.UserId; model.UserName = _sessionContext.UserName; files.Add(model); } await _fileRepository.AddRangeAsync(files, HttpContext.RequestAborted); } /// /// 删除附件 /// /// /// [HttpDelete] public async Task Delete([FromBody] DeleteFileDto dto) { foreach (var Id in dto.Ids) { await _fileRepository.RemoveAsync(x => x.Id == Id); } } /// /// 更新附件 /// /// /// [HttpPut] public async Task Update([FromBody] UpdateFileDto dto) { //验证工单是否可以申请 var file = await _fileRepository.GetAsync(dto.Id, HttpContext.RequestAborted); if (file is null) throw UserFriendlyException.SameMessage("无效附件"); _mapper.Map(dto, file); file.OrgName = _sessionContext.OrgName; file.OrgId = _sessionContext.OrgId; file.UserId = _sessionContext.UserId; file.UserName = _sessionContext.UserName; await _fileRepository.UpdateAsync(file, HttpContext.RequestAborted); } /// /// 获取附件列表 /// /// /// [HttpGet("list")] public async Task> List([FromQuery] FileListDto dto) { var (total, items) = await _fileRepository.Queryable() .WhereIF(!string.IsNullOrEmpty(dto.Name), x => x.Name.Contains(dto.Name)) .WhereIF(!string.IsNullOrEmpty(dto.Key), x => x.Key == dto.Key) .WhereIF(!string.IsNullOrEmpty(dto.Type), x => x.Type == dto.Type) .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.OrgName.Contains(dto.OrgName)) .WhereIF(dto.Publicity > 0, x => x.Publicity == dto.Publicity) .WhereIF(!string.IsNullOrEmpty(dto.Classify), x => x.Classify == dto.Classify) .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) .OrderByDescending(x => x.CreationTime) .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted); return new PagedDto(total, items); } /// /// 获取附件实体 /// /// /// [HttpGet("{id}")] public async Task Entity(string id) { return await _fileRepository.Queryable() .FirstAsync(x => x.Id == id); } /// /// 获取附件分类 /// /// [HttpGet("classify")] public Task FileClassify() { var rsp = new { FileClassify = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.FileClassify), }; return Task.FromResult(rsp); } #endregion /// /// 下载(代理模式) /// [HttpGet("download-proxy")] public async Task DownloadProxy([FromServices] IHttpClientFactory clientFactory, string path) { using var client = clientFactory.CreateClient(); var responseMessage = await client.GetAsync(path, HttpContext.RequestAborted); responseMessage.EnsureSuccessStatusCode(); var stream = await responseMessage.Content.ReadAsStreamAsync(HttpContext.RequestAborted); return File(stream, responseMessage?.Content?.Headers?.ContentType?.MediaType); } } }