using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading.Tasks; using System.Web.Mvc; using Abp.Application.Services.Dto; using Abp.Authorization; using Abp.Domain.Repositories; using Abp.Timing; using IwbZero.AppServiceBase; using IwbZero.IdentityFramework; using IwbZero.Setting; using Newtonsoft.Json; using ShwasherSys.Authorization.Permissions; using ShwasherSys.BaseSysInfo; using ShwasherSys.BaseSysInfo.SysAttachFiles; using ShwasherSys.BaseSysInfo.SysAttachFiles.Dto; using ShwasherSys.Common; using ShwasherSys.EntityFramework; using ShwasherSys.ProductInfo.Dto; using ShwasherSys.ProductInfo.Dto.FileUpload; namespace ShwasherSys.ProductInfo { [AbpAuthorize] public class SemiProductsAppService : ShwasherAsyncCrudAppService, ISemiProductsAppService { public IRepository AttachRepository { get; } public ISqlExecuter SqlExecuter { get; } protected IRepository ProductRepository { get; set; } public SemiProductsAppService(IRepository repository, IIwbSettingManager settingManager, IRepository attachRepository, ISqlExecuter sqlExecuter, IRepository productRepository) : base(repository,"Id") { AttachRepository = attachRepository; SqlExecuter = sqlExecuter; SettingManager = settingManager; ProductRepository = productRepository; } protected override bool KeyIsAuto { get; set; } = false; protected override string GetPermissionName { get; set; } = PermissionNames.PagesProductInfoSemiProducts; protected override string GetAllPermissionName { get; set; } = PermissionNames.PagesProductInfoSemiProducts; protected override string CreatePermissionName { get; set; } = PermissionNames.PagesProductInfoSemiProductsCreate; protected override string UpdatePermissionName { get; set; } = PermissionNames.PagesProductInfoSemiProductsUpdate; protected override string DeletePermissionName { get; set; } = PermissionNames.PagesProductInfoSemiProductsDelete; public override async Task Create(SemiProductCreateDto input) { CheckCreatePermission(); var entity = ProductRepository.FirstOrDefault(i => i.Id == input.Id); if (entity == null) { string sEntity = JsonConvert.SerializeObject(input); var products = JsonConvert.DeserializeObject(sEntity); products.IsLock = "N"; products.ProductName = input.SemiProductName; products.TimeLastMod = Clock.Now; products.UserIDLastMod = AbpSession.UserName; products.TimeCreated = Clock.Now; ProductRepository.Insert(products); } var resultEntity = await CreateEntity(input); if (!string.IsNullOrEmpty(input.FileInfo)) { SysAttachFileCreateDto fileCreateDto = new SysAttachFileCreateDto() { AttachNo = Guid.NewGuid().ToString("N"), TableName = "SemiProducts", ColumnName = "SemiProductNo", SourceKey = input.Id, FileInfo = input.FileInfo, FileExt = input.FileExt, FileName = input.FileName }; await CreateAttach(fileCreateDto); } return resultEntity; } public override async Task Update(SemiProductUpdateDto input) { CheckCreatePermission(); var entity = ProductRepository.FirstOrDefault(i => i.Id == input.Id); if (entity != null) { entity.ProductName = input.SemiProductName; entity.TimeLastMod = Clock.Now; entity.UserIDLastMod = AbpSession.UserName; ProductRepository.Update(entity); } else { var product = new Product(); product.Id = input.Id; product.IsStandard = input.IsStandard; product.MaterialNo = input.MaterialNo; product.Material = input.Material; product.Model = input.Model; product.ModelNo = input.ModelNo; product.Rigidity = input.Rigidity; product.RigidityNo = input.RigidityNo; product.SurfaceColor = input.SurfaceColor; product.SurfaceColorNo = input.SurfaceColorNo; product.SpecialDesc = input.SpecialDesc; product.SpecialNo = input.SpecialNo; product.PartNo = input.PartNo; product.ProductDesc = input.ProductDesc; product.IsLock = "N"; product.ProductName = input.SemiProductName; product.TimeLastMod = Clock.Now; product.UserIDLastMod = AbpSession.UserName; product.TimeCreated = Clock.Now; ProductRepository.Insert(product); } var resultEntity = await UpdateEntity(input); if (!string.IsNullOrEmpty(input.FileInfo)) { SysAttachFileCreateDto fileCreateDto = new SysAttachFileCreateDto() { AttachNo = Guid.NewGuid().ToString("N"), TableName = "SemiProducts", ColumnName = "SemiProductNo", SourceKey = input.Id, FileInfo = input.FileInfo, FileExt = input.FileExt, FileName = input.FileName }; await AttachRepository.DeleteAsync(i => i.TableName == "SemiProducts" && i.ColumnName == "SemiProductNo" && i.SourceKey == input.Id); await CreateAttach(fileCreateDto); } return resultEntity; } private async Task CreateAttach(SysAttachFileCreateDto input) { if (await IsValidFileType(input.FileExt)) { string filePath = $"{SettingManager.GetSettingValue(SettingNames.DownloadPath)}/{input.TableName}/{input.ColumnName}"; var lcRetVal = SysAttachFileAppService.Base64ToFile(input.FileInfo, $"{input.FileName}-{DateTime.Now:yyMMddHHmmss}{new Random().Next(1000, 9999)}", input.FileExt, filePath); if (lcRetVal.StartsWith("error@")) { CheckErrors( IwbIdentityResult.Failed(lcRetVal.Split(new[] { '@' }, StringSplitOptions.RemoveEmptyEntries)[1])); return; } input.FilePath = lcRetVal; var entity = ObjectMapper.Map(input); entity = await AttachRepository.InsertAsync(entity); return; } CheckErrors(IwbIdentityResult.Failed("文件类型不合法,请上传合法文件。")); } private async Task IsValidFileType(string fileName, bool isName = false) { string ext = isName ? GetFileExt(fileName) : fileName; string lcExts = await SettingManager.GetSettingValueAsync(SettingNames.UploadFileExt); string[] loList = lcExts.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (var lcExt in loList) { if (ext.ToLower() == lcExt.ToLower()) return true; } this.LogError("上传的文件非法:" + fileName); return false; } private string GetFileExt(string fileName) { string fileExt = fileName.Substring(fileName.LastIndexOf(".", StringComparison.Ordinal) + 1, fileName.Length - fileName.LastIndexOf(".", StringComparison.Ordinal) - 1); return fileExt.ToLower(); } [AbpAuthorize(PermissionNames.PagesProductInfoSemiProductsImportExcel)] public bool ImportExcel(FileUploadInfoDto input) { if (!string.IsNullOrEmpty(input.FileInfo)) { string filePath = $"{SettingManager.GetSettingValue(SettingNames.DownloadPath)}/tmpUpload"; var lcRetVal = SysAttachFileAppService.Base64ToFile(input.FileInfo, $"{input.FileName}-{DateTime.Now:yyMMddHHmmss}{new Random().Next(1000, 9999)}", input.FileExt, filePath); StringBuilder errStringBuilder = new StringBuilder(); List resultEntityList = ExcelHelper.ExcelToEntityList(new Dictionary() { { "Id", "半成品编码" }, { "PartNo", "零件号" }, { "Model", "规格" }, { "Material", "材质" }, { "Rigidity", "硬度" }, { "SurfaceColor", "表色" }, { "IsStandard", "是否标件" },{ "SemiProductName", "半成品名称"} }, $"{AppDomain.CurrentDomain.BaseDirectory}{lcRetVal}", out errStringBuilder); int indexCount = 1; StringBuilder sbSql = new StringBuilder(); sbSql.Append("delete from SemiProducts;"); foreach (var semiProductse in resultEntityList) { semiProductse.IsLock = "N"; semiProductse.TimeLastMod = Clock.Now; semiProductse.TimeCreated = Clock.Now; semiProductse.UserIDLastMod = AbpSession.UserName; if (semiProductse.IsStandard == "是"|| semiProductse.IsStandard == "否") { semiProductse.IsStandard = semiProductse.IsStandard == "是" ? "Y" : "N"; } semiProductse.SemiProductName = semiProductse.SemiProductName; semiProductse.Sequence = indexCount; semiProductse.Model = semiProductse.Model == "-" ? "" : semiProductse.Model; semiProductse.Material = semiProductse.Material == "-" ? "" : semiProductse.Material; semiProductse.Rigidity = semiProductse.Rigidity == "-" ? "" : semiProductse.Rigidity; semiProductse.SurfaceColor = semiProductse.SurfaceColor == "-" ? "" : semiProductse.SurfaceColor; semiProductse.PartNo = semiProductse.PartNo == "-" ? "" : semiProductse.PartNo; sbSql.Append(semiProductse.InsertSql()+"\r\n"); indexCount++; } if (SqlExecuter.Execute(sbSql.ToString()) > 0) { return true; } this.LogError(errStringBuilder.ToString()); } else { CheckErrors(new IwbIdentityResult("请先上传文件!")); } return false; } [AbpAllowAnonymous] public async Task ExportExcel() { var query = Repository.GetAll(); var entities = await AsyncQueryableExecuter.ToListAsync(query); string downloadUrl = await SettingManager.GetSettingValueAsync("SYSTEMDOWNLOADPATH"); string lcFilePath = System.Web.HttpRuntime.AppDomainAppPath + "\\" + downloadUrl; var exportEntity = new Dictionary() { {"Id", "半成品编码"}, {"Model", "规格"}, {"Material", "材质"}, {"SurfaceColor", "表色"}, {"Rigidity", "硬度"}, {"IsStandard", "是否标件"}, {"PartNo", "零件号"}, {"SemiProductName", "半成品名称"}, }; string lcResultFileName = ExcelHelper.EntityListToExcel2003(exportEntity, entities, "sheet", lcFilePath); return Path.Combine(downloadUrl, lcResultFileName); } } }