using Myshipping.Core; using Furion.DependencyInjection; using Furion.DynamicApiController; using Mapster; using Microsoft.AspNetCore.Mvc; using SqlSugar; using System.Linq; using System.Threading.Tasks; using Myshipping.Application.Entity; using Microsoft.Extensions.Logging; using Microsoft.AspNetCore.Http; using Furion; using Myshipping.Application.ConfigOption; using System.IO; using Yitter.IdGenerator; using Furion.FriendlyException; using Furion.RemoteRequest.Extensions; using System.Text; using System.Web; using Myshipping.Application.Enum; using System.Collections.Generic; using Myshipping.Application.Service.BookingPrintTemplate.Dto; using Myshipping.Core.Entity; using Myshipping.Application.Service.BookingTemplate.Dto; using Microsoft.AspNetCore.Authorization; namespace Myshipping.Application { /// <summary> /// 订舱打印模板服务 /// </summary> [ApiDescriptionSettings("Application", Name = "BookingPrintTemplate", Order = 1)] public class BookingPrintTemplateService : IBookingPrintTemplateService, IDynamicApiController, ITransient { private readonly SqlSugarRepository<BookingPrintTemplate> _rep; private readonly SqlSugarRepository<BookingPrinttemplateRight> _repRight; private readonly SqlSugarRepository<SysUser> _repUser; private readonly ILogger<BookingPrintTemplate> _logger; private readonly SqlSugarRepository<BookingExcelTemplate> _excelrep; private readonly IHttpContextAccessor _httpContextAccessor; public BookingPrintTemplateService(SqlSugarRepository<BookingPrintTemplate> rep, SqlSugarRepository<BookingPrinttemplateRight> repRight, SqlSugarRepository<SysUser> repUser, SqlSugarRepository<BookingExcelTemplate> excelrep, ILogger<BookingPrintTemplate> logger, IHttpContextAccessor httpContextAccessor) { _rep = rep; _repRight = repRight; _repUser = repUser; _logger = logger; _excelrep = excelrep; _httpContextAccessor = httpContextAccessor; } /// <summary> /// 分页查询订舱打印模板 /// </summary> /// <param name="input"></param> /// <returns></returns> [HttpGet("/BookingPrintTemplate/page")] public async Task<dynamic> Page([FromQuery] QueryBookingPrintTemplateInput input) { var entities = await _rep.AsQueryable().Filter(null, true) .WhereIF(!string.IsNullOrWhiteSpace(input.TypeName), u => u.TypeName.Contains(input.TypeName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.FileName), u => u.FileName.Contains(input.FileName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.TenantName), u => u.TenantName.Contains(input.TenantName.Trim())) .WhereIF(input.IsMain.HasValue, u => u.IsMain == input.IsMain) .WhereIF(input.IsSub.HasValue, u => u.IsSub == input.IsSub) .WhereIF(!string.IsNullOrWhiteSpace(input.DisplayName), u => u.DisplayName.Contains(input.DisplayName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.CateCode), u => u.CateCode.Contains(input.CateCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.CateName), u => u.CateName.Contains(input.CateName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Type), u => u.Type == input.Type) .ToPagedListAsync(input.PageNo, input.PageSize); return entities.XnPagedResult(); } /// <summary> /// 赋权列表 /// </summary> /// <param name="KeyWord"></param> /// <returns></returns> [HttpGet("/BookingPrintTemplate/GetPrintTemplateList")] public async Task<dynamic> GetPrintTemplateList(string KeyWord) { return await _rep.AsQueryable().Where(x => x.TenantId == UserManager.TENANT_ID).WhereIF(!string.IsNullOrWhiteSpace(KeyWord), x => x.FileName.StartsWith(KeyWord)) .ToListAsync(); } /// <summary> /// 增加订舱打印模板(准备作废,使用Save代替) /// </summary> /// <param name="file">模板文件</param> /// <param name="input"></param> /// <returns></returns> [HttpPost("/BookingPrintTemplate/add")] public async Task Add(IFormFile file, [FromForm] AddBookingPrintTemplateInput input) { //未上传打印模板文件 if (file == null || file.Length == 0) { throw Oops.Bah(BookingErrorCode.BOOK113); } var opt = App.GetOptions<PrintTemplateOptions>(); var originalFilename = file.FileName; // 文件原始名称 var fileSuffix = Path.GetExtension(file.FileName).ToLower(); // 文件后缀 if (!opt.fileType.Contains(fileSuffix)) { throw Oops.Bah(BookingErrorCode.BOOK114); } var cc = _rep.AsQueryable().Filter(null, true).Count(c => c.TenantId == input.TenantId && c.TypeCode == input.TypeCode); if (cc > 0) { throw Oops.Bah($"{input.TenantName} 已存在 {input.TypeName} 类型的打印模板"); } var dirAbs = string.Empty; if (string.IsNullOrEmpty(opt.basePath)) { dirAbs = Path.Combine(App.WebHostEnvironment.WebRootPath, opt.relativePath); } else { dirAbs = Path.Combine(opt.basePath, opt.relativePath); } if (!Directory.Exists(dirAbs)) Directory.CreateDirectory(dirAbs); // 先存库获取Id var id = YitIdHelper.NextId(); var fileSaveName = $"{id}{fileSuffix}".ToLower(); var fileRelaPath = Path.Combine(opt.relativePath, fileSaveName).ToLower(); var fileAbsPath = Path.Combine(dirAbs, fileSaveName).ToLower(); var newFile = new BookingPrintTemplate { Id = id, FileName = originalFilename, FilePath = fileRelaPath, TypeCode = input.TypeCode, TypeName = input.TypeName, TenantId = input.TenantId, TenantName = input.TenantName, IsMain = input.IsMain.HasValue && input.IsMain.Value ? true : false, IsSub = input.IsSub.HasValue && input.IsSub.Value ? true : false, }; await _rep.InsertAsync(newFile); using (var stream = File.Create(fileAbsPath)) { await file.CopyToAsync(stream); } } /// <summary> /// 更新订舱打印模板(准备作废,使用Save代替) /// </summary> /// <param name="input"></param> /// <returns></returns> [HttpPost("/BookingPrintTemplate/edit")] public async Task Update(IFormFile file, [FromForm] UpdateBookingPrintTemplateInput input) { var cc = _rep.AsQueryable().Filter(null, true).Count(c => c.TenantId == input.TenantId && c.TypeCode == input.TypeCode && c.Id != input.Id); if (cc > 0) { throw Oops.Bah($"{input.TenantName} 已存在 {input.TypeName} 类型的打印模板"); } var entity = _rep.AsQueryable().Filter(null, true).First(x => x.Id == input.Id); if (entity == null) { throw Oops.Bah(BookingErrorCode.BOOK112); } entity = input.Adapt(entity); if (file != null) { var opt = App.GetOptions<PrintTemplateOptions>(); var originalFilename = file.FileName; // 文件原始名称 var fileSuffix = Path.GetExtension(file.FileName).ToLower(); // 文件后缀 if (!opt.fileType.Contains(fileSuffix)) { throw Oops.Bah(BookingErrorCode.BOOK114); } var dirAbs = string.Empty; if (string.IsNullOrEmpty(opt.basePath)) { dirAbs = Path.Combine(App.WebHostEnvironment.WebRootPath, opt.relativePath); } else { dirAbs = Path.Combine(opt.basePath, opt.relativePath); } if (!Directory.Exists(dirAbs)) Directory.CreateDirectory(dirAbs); // 先存库获取Id var fileSaveName = $"{entity.Id}{fileSuffix}".ToLower(); var fileRelaPath = Path.Combine(opt.relativePath, fileSaveName).ToLower(); var fileAbsPath = Path.Combine(dirAbs, fileSaveName).ToLower(); entity.FileName = originalFilename; entity.FilePath = fileRelaPath; using (var stream = File.Create(fileAbsPath)) { await file.CopyToAsync(stream); } } await _rep.UpdateAsync(entity); } /// <summary> /// 保存订舱打印模板(新增或修改) /// </summary> /// <param name="file"></param> /// <param name="input"></param> /// <returns></returns> [HttpPost("/BookingPrintTemplate/save")] public async Task<long> Save(IFormFile file, [FromForm] SaveBookingPrintTemplateInput input) { var opt = App.GetOptions<PrintTemplateOptions>(); if (file != null && file.Length > 0) { var fileSuffix = Path.GetExtension(file.FileName).ToLower(); // 文件后缀 if (!opt.fileType.Contains(fileSuffix)) { throw Oops.Bah(BookingErrorCode.BOOK114); } } BookingPrintTemplate entity = null; if (input.Id > 0) { entity = _rep.AsQueryable().Filter(null, true).First(x => x.Id == input.Id); input.Adapt(entity); await _rep.UpdateAsync(entity); } else { //新增时必须上传文件 if (file == null || file.Length == 0) { throw Oops.Bah(BookingErrorCode.BOOK113); } entity = input.Adapt<BookingPrintTemplate>(); await _rep.InsertAsync(entity); } if (file != null && file.Length > 0) { var originalFilename = file.FileName; // 文件原始名称 var dirAbs = string.Empty; if (string.IsNullOrEmpty(opt.basePath)) { dirAbs = Path.Combine(App.WebHostEnvironment.WebRootPath, opt.relativePath); } else { dirAbs = Path.Combine(opt.basePath, opt.relativePath); } if (!Directory.Exists(dirAbs)) Directory.CreateDirectory(dirAbs); // 先存库获取Id var id = YitIdHelper.NextId(); var fileSuffix = Path.GetExtension(file.FileName).ToLower(); var fileSaveName = $"{id}{fileSuffix}".ToLower(); var fileRelaPath = Path.Combine(opt.relativePath, fileSaveName).ToLower(); var fileAbsPath = Path.Combine(dirAbs, fileSaveName).ToLower(); using (var stream = File.Create(fileAbsPath)) { await file.CopyToAsync(stream); } entity.FileName = originalFilename; entity.FilePath = fileRelaPath; await _rep.UpdateAsync(entity); } return entity.Id; } /// <summary> /// 删除订舱打印模板 /// </summary> /// <param name="input"></param> /// <returns></returns> [HttpPost("/BookingPrintTemplate/delete")] public async Task Delete(GetBookingPrintTemplateInput input) { _rep.Context.QueryFilter.Clear(); var entity = await _rep.FirstOrDefaultAsync(u => u.Id == input.Id); await _rep.DeleteAsync(entity); } /// <summary> /// 获取订舱打印模板 /// </summary> /// <param name="input"></param> /// <returns></returns> [HttpGet("/BookingPrintTemplate/detail")] public async Task<BookingPrintTemplate> Get([FromQuery] GetBookingPrintTemplateInput input) { return await _rep.FirstOrDefaultAsync(u => u.Id == input.Id); } ///// <summary> ///// 获取订舱打印模板列表 ///// </summary> ///// <param name="input"></param> ///// <returns></returns> //[HttpGet("/BookingPrintTemplate/list")] //public async Task<dynamic> List([FromQuery] QueryBookingPrintTemplateInput input) //{ // return await _rep.ToListAsync(); //} /// <summary> /// 下载模板文件 /// </summary> /// <param name="id"></param> /// <returns></returns> [HttpGet("/BookingPrintTemplate/download"), AllowAnonymous] public async Task<IActionResult> Download(long id) { var printFile = await _rep.AsQueryable().Filter(null, true).FirstAsync(u => u.Id == id); if (printFile == null) { throw Oops.Bah(BookingErrorCode.BOOK115); } var opt = App.GetOptions<PrintTemplateOptions>(); var dirAbs = opt.basePath; if (string.IsNullOrEmpty(dirAbs)) { dirAbs = App.WebHostEnvironment.WebRootPath; } var fileFullPath = Path.Combine(dirAbs, printFile.FilePath); if (!File.Exists(fileFullPath)) { throw Oops.Bah(BookingErrorCode.BOOK115); } var result = new FileStreamResult(new FileStream(fileFullPath, FileMode.Open), "application/octet-stream") { FileDownloadName = printFile.FileName }; return result; } /// <summary> /// 新增打印模板权限 /// </summary> /// <param name="input"></param> /// <returns></returns> [SqlSugarUnitOfWork] [HttpPost("/BookingPrintTemplate/AddPrinttemplateRight")] public async Task AddPrinttemplateRight(BookingPrinttemplateRightDto input) { if (input == null) { throw Oops.Bah("未上传正确数据"); } //新版支持批量 if (input.UserIdList == null) { input.UserIdList = new List<long>(); } //兼容老版单个设置 if (input.SysUserId > 0 && !input.UserIdList.Contains(input.SysUserId)) { input.UserIdList.Add(input.SysUserId); } foreach (var item in input.PrintTemplateId) { foreach (var uid in input.UserIdList) { var ent = _repRight.FirstOrDefault(x => x.SysUserId == uid && x.PrintTemplateId == item); if (ent == null) { BookingPrinttemplateRight right = new BookingPrinttemplateRight(); right.SysUserId = uid; right.PrintTemplateId = item; await _repRight.InsertAsync(right); } } } } /// <summary> /// 获取打印模板权限 /// </summary> /// <returns></returns> [HttpGet("/BookingPrintTemplate/GetPrinttemplateRightList")] public async Task<dynamic> GetPrinttemplateRightList(long userId, string cateCode, string type, string displayName) { var userlist = await _repUser.AsQueryable().Filter(null, true).ToListAsync(); var list = await _repRight.AsQueryable().InnerJoin<BookingPrintTemplate>((d, t) => d.PrintTemplateId == t.Id && t.TenantId == UserManager.TENANT_ID). WhereIF(userId != 0, d => d.SysUserId == userId). WhereIF(!string.IsNullOrWhiteSpace(displayName), (d, t) => t.DisplayName.Contains(displayName)). WhereIF(!string.IsNullOrWhiteSpace(cateCode), (d, t) => t.CateCode == cateCode). WhereIF(!string.IsNullOrWhiteSpace(type), (d, t) => t.Type == type). Select((d, t) => new BookingPrinttemplateDto { Id = d.Id, PrintTemplateId = t.Id, SysUserId = d.SysUserId, TypeCode = t.TypeCode, TypeName = t.TypeName, FilePath = t.FilePath, FileName = t.FileName, TenantName = t.TenantName, DisplayName = t.DisplayName, CateCode = t.CateCode, CateName = t.CateName, Type = t.Type, UserName = "", }).ToListAsync(); foreach (var item in list) { var username = userlist.Where(x => x.Id == item.SysUserId).Select(x => x.Name).FirstOrDefault(); item.UserName = username; } return list; } /// <summary> /// 删除打印模板权限 /// </summary> /// <param name="Ids"></param> /// <returns></returns> [HttpGet("/BookingPrintTemplate/DeletePrinttemplateRight")] public async Task DeletePrinttemplateRight([FromQuery] List<long> Ids) { await _repRight.DeleteAsync(x => Ids.Contains(x.Id)); } /// <summary> /// 新增编辑excel模板 /// </summary> /// <param name="dto"></param> /// <returns></returns> [HttpPost("/BookingTemplate/AddOrUpdateExcelTemplate")] public async Task AddOrUpdateExcelTemplate(BookingExcelTemplateDto dto) { await _excelrep.DeleteAsync(x => x.PId == dto.Pid); var list = new List<BookingExcelTemplate>(); foreach (var item in dto.children) { var entity = item.Adapt<BookingExcelTemplate>(); entity.PId = dto.Pid; entity.Id = 0; list.Add(entity); } await _excelrep.InsertAsync(list); } /// <summary> /// 获取excel模板详情 /// </summary> /// <param name="Id">模板ID</param> /// <returns></returns> [HttpGet("/BookingTemplate/BookingExcelTemplateList")] public async Task<dynamic> BookingExcelTemplateList(long Id) { return await _excelrep.AsQueryable().Where(x => x.PId == Id).OrderBy(x => x.Id).ToListAsync(); } } }