FileController.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. using Hotline.Repository.SqlSugar.Extensions;
  2. using Hotline.Settings;
  3. using Hotline.Share.Dtos;
  4. using Hotline.Share.Dtos.File;
  5. using MapsterMapper;
  6. using Microsoft.AspNetCore.Mvc;
  7. using XF.Domain.Authentications;
  8. using XF.Domain.Exceptions;
  9. using XF.Domain.Repository;
  10. using Hotline.Caching.Interfaces;
  11. using Microsoft.AspNetCore.Authorization;
  12. using DocumentFormat.OpenXml.Presentation;
  13. using Hotline.File;
  14. using NPOI.HPSF;
  15. using Hotline.Share.Requests;
  16. using SqlSugar;
  17. using Hotline.Tools;
  18. using Hotline.Share.Dtos.Order;
  19. using Hotline.Api.Filter;
  20. namespace Hotline.Api.Controllers
  21. {
  22. public class FileController : BaseController
  23. {
  24. private readonly ISessionContext _sessionContext;
  25. private readonly IMapper _mapper;
  26. private readonly ISystemDicDataCacheManager _sysDicDataCacheManager;
  27. private readonly IRepository<File.File> _fileRepository;
  28. private readonly ILogger<FileController> _logger;
  29. private readonly IRepository<UploadAudioFiles> _uploadAudioFilesRepository;
  30. public FileController(
  31. ISessionContext sessionContext,
  32. IMapper mapper,
  33. ISystemDicDataCacheManager sysDicDataCacheManager,
  34. IRepository<File.File> fileRepository,
  35. ILogger<FileController> logger,
  36. IRepository<UploadAudioFiles> uploadAudioFilesRepository)
  37. {
  38. _sessionContext = sessionContext;
  39. _mapper = mapper;
  40. _sysDicDataCacheManager = sysDicDataCacheManager;
  41. _fileRepository = fileRepository;
  42. _logger = logger;
  43. _uploadAudioFilesRepository = uploadAudioFilesRepository;
  44. }
  45. #region 附件管理
  46. /// <summary>
  47. /// 新增附件
  48. /// </summary>
  49. /// <param name="dtos"></param>
  50. /// <returns></returns>
  51. [HttpPost]
  52. public async Task Add([FromBody] List<FileDto> dtos)
  53. {
  54. List<File.File> files = new List<File.File>();
  55. foreach (var dto in dtos)
  56. {
  57. if (string.IsNullOrEmpty(dto.Key))
  58. throw UserFriendlyException.SameMessage("请上传附件关联Key");
  59. var model = _mapper.Map<File.File>(dto);
  60. model.OrgName = _sessionContext.OrgName;
  61. model.OrgId = _sessionContext.OrgId;
  62. model.UserId = _sessionContext.UserId;
  63. model.UserName = _sessionContext.UserName;
  64. files.Add(model);
  65. }
  66. await _fileRepository.AddRangeAsync(files, HttpContext.RequestAborted);
  67. }
  68. /// <summary>
  69. /// 删除附件
  70. /// </summary>
  71. /// <param name="dto"></param>
  72. /// <returns></returns>
  73. [HttpDelete]
  74. public async Task Delete([FromBody] DeleteFileDto dto)
  75. {
  76. foreach (var Id in dto.Ids)
  77. {
  78. await _fileRepository.RemoveAsync(x => x.Id == Id);
  79. }
  80. }
  81. /// <summary>
  82. /// 更新附件
  83. /// </summary>
  84. /// <param name="dto"></param>
  85. /// <returns></returns>
  86. [HttpPut]
  87. public async Task Update([FromBody] UpdateFileDto dto)
  88. {
  89. //验证工单是否可以申请
  90. var file = await _fileRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
  91. if (file is null)
  92. throw UserFriendlyException.SameMessage("无效附件");
  93. _mapper.Map(dto, file);
  94. file.OrgName = _sessionContext.OrgName;
  95. file.OrgId = _sessionContext.OrgId;
  96. file.UserId = _sessionContext.UserId;
  97. file.UserName = _sessionContext.UserName;
  98. await _fileRepository.UpdateAsync(file, HttpContext.RequestAborted);
  99. }
  100. /// <summary>
  101. /// 获取附件列表
  102. /// </summary>
  103. /// <param name="dto"></param>
  104. /// <returns></returns>
  105. [HttpGet("list")]
  106. public async Task<PagedDto<File.File>> List([FromQuery] FileListDto dto)
  107. {
  108. var (total, items) = await _fileRepository.Queryable()
  109. .WhereIF(!string.IsNullOrEmpty(dto.Name), x => x.Name.Contains(dto.Name))
  110. .WhereIF(!string.IsNullOrEmpty(dto.Key), x => x.Key == dto.Key)
  111. .WhereIF(!string.IsNullOrEmpty(dto.Type), x => x.Type == dto.Type)
  112. .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.OrgName.Contains(dto.OrgName))
  113. .WhereIF(dto.Publicity > 0, x => x.Publicity == dto.Publicity)
  114. .WhereIF(!string.IsNullOrEmpty(dto.Classify), x => x.Classify == dto.Classify)
  115. .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
  116. .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
  117. .OrderByDescending(x => x.CreationTime)
  118. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  119. return new PagedDto<File.File>(total, items);
  120. }
  121. /// <summary>
  122. /// 获取附件实体
  123. /// </summary>
  124. /// <param name="id"></param>
  125. /// <returns></returns>
  126. [HttpGet("{id}")]
  127. public async Task<File.File> Entity(string id)
  128. {
  129. return await _fileRepository.Queryable()
  130. .FirstAsync(x => x.Id == id);
  131. }
  132. /// <summary>
  133. /// 获取附件分类
  134. /// </summary>
  135. /// <returns></returns>
  136. [HttpGet("classify")]
  137. public Task<object> FileClassify()
  138. {
  139. var rsp = new
  140. {
  141. FileClassify = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.FileClassify),
  142. };
  143. return Task.FromResult<object>(rsp);
  144. }
  145. #endregion
  146. /// <summary>
  147. /// 下载(代理模式)
  148. /// </summary>
  149. [HttpGet("download-proxy")]
  150. public async Task<IActionResult> DownloadProxy([FromServices] IHttpClientFactory clientFactory, string path)
  151. {
  152. using var client = clientFactory.CreateClient();
  153. var responseMessage = await client.GetAsync(path, HttpContext.RequestAborted);
  154. responseMessage.EnsureSuccessStatusCode();
  155. var stream = await responseMessage.Content.ReadAsStreamAsync(HttpContext.RequestAborted);
  156. return File(stream, responseMessage?.Content?.Headers?.ContentType?.MediaType);
  157. }
  158. #region 录音上传
  159. /// <summary>
  160. /// 上传录音保存
  161. /// </summary>
  162. /// <param name="dtos"></param>
  163. /// <returns></returns>
  164. [HttpPost("adduploadaudiofiles")]
  165. public async Task<object> AddUploadAudioFiles([FromBody] List<FileDto> dtos)
  166. {
  167. if (dtos == null || dtos.Count == 0)
  168. throw UserFriendlyException.SameMessage("请上传附件");
  169. var successNum = 0;
  170. var errorNum = 0;
  171. foreach (var item in dtos)
  172. {
  173. var fileName = item.FileName;
  174. string strSuffix = fileName.LastIndexOf(".") > 0 ? fileName.Substring(fileName.LastIndexOf(".") + 1) : "";
  175. string strSubFileName = fileName.LastIndexOf(".") > 0 ? fileName.Substring(0, fileName.LastIndexOf(".")) : fileName;
  176. UploadAudioFiles audioFiles = new UploadAudioFiles()
  177. {
  178. FileId = item.Additions,
  179. FileName = item.FileName,
  180. Name = strSubFileName,
  181. Type = strSuffix,
  182. Path = item.Path,
  183. AllPath = item.AllPath
  184. };
  185. var id = await _uploadAudioFilesRepository.AddAsync(audioFiles, HttpContext.RequestAborted);
  186. if (!string.IsNullOrEmpty(id))
  187. successNum++;
  188. else
  189. errorNum++;
  190. }
  191. return new
  192. {
  193. successNum = successNum,
  194. errorNum = errorNum
  195. };
  196. }
  197. /// <summary>
  198. /// 删除
  199. /// </summary>
  200. /// <param name="Ids"></param>
  201. /// <returns></returns>
  202. [HttpGet("deleteuploadaudiofiles")]
  203. public async Task DeleteUploadAudioFiles([FromQuery] List<string> Ids)
  204. {
  205. if (Ids == null || Ids.Count == 0)
  206. throw UserFriendlyException.SameMessage("请选择需要删除的数据");
  207. foreach (var item in Ids)
  208. {
  209. await _uploadAudioFilesRepository.RemoveAsync(p => p.Id == item, false, HttpContext.RequestAborted);
  210. }
  211. }
  212. /// <summary>
  213. /// 查询列表
  214. /// </summary>
  215. /// <param name="dto"></param>
  216. /// <returns></returns>
  217. [HttpGet("getaudiofileslist")]
  218. public async Task<PagedDto<UploadAudioFilesRequestDto>> GetAudioFilesList([FromQuery] PagedKeywordRequest dto)
  219. {
  220. var (total, items) = await _uploadAudioFilesRepository.Queryable()
  221. .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
  222. .WhereIF(!string.IsNullOrEmpty(dto.Keyword), p => p.Name.Contains(dto.Keyword))
  223. .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //创建时间升序
  224. .OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc) //创建时间降序
  225. .ToPagedListAsync(dto, HttpContext.RequestAborted);
  226. return new PagedDto<UploadAudioFilesRequestDto>(total, _mapper.Map<IReadOnlyList<UploadAudioFilesRequestDto>>(items));
  227. }
  228. /// <summary>
  229. /// 查询列表导出
  230. /// </summary>
  231. /// <param name="dto"></param>
  232. /// <returns></returns>
  233. [HttpPost("getaudiofileslist/export")]
  234. [LogFilterAlpha("导出日志")]
  235. public async Task<FileStreamResult> ExportGetAudioFilesList([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
  236. {
  237. var query = _uploadAudioFilesRepository.Queryable()
  238. .Where(p => p.CreationTime >= dto.QueryDto.StartTime && p.CreationTime <= dto.QueryDto.EndTime)
  239. .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.Keyword), p => p.Name.Contains(dto.QueryDto.Keyword))
  240. .OrderByIF(dto.QueryDto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //创建时间升序
  241. .OrderByIF(dto.QueryDto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc);//创建时间降序
  242. List<UploadAudioFiles> lists;
  243. if (dto.IsExportAll)
  244. {
  245. lists = await query.ToListAsync(HttpContext.RequestAborted);
  246. }
  247. else
  248. {
  249. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  250. lists = items;
  251. }
  252. var listDtos = _mapper.Map<ICollection<UploadAudioFilesRequestDto>>(lists);
  253. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<UploadAudioFilesRequestDto>(dto.ColumnInfos);
  254. var dtos = listDtos
  255. .Select(stu => _mapper.Map(stu, typeof(UploadAudioFilesRequestDto), dynamicClass))
  256. .Cast<object>()
  257. .ToList();
  258. var stream = ExcelHelper.CreateStream(dtos);
  259. return ExcelStreamResult(stream, "录音上传数据导出");
  260. }
  261. #endregion
  262. }
  263. }