diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Dicts/DTOs/DictDTO.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Dicts/DTOs/DictDTO.cs index 0fa4d81dc..0fd5b89bc 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Dicts/DTOs/DictDTO.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Dicts/DTOs/DictDTO.cs @@ -30,5 +30,5 @@ public class DictDTO : SfsBaseDataDTOBase, IHasCode, IHasName /// 字典项列表 /// [Display(Name = "字典项列表")] - public virtual ICollection Items { get; set; } = new List(); + public List Items { get; set; } = new List(); } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Dicts/Inputs/DictEditInput.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Dicts/Inputs/DictEditInput.cs index 556038abe..1f19a6306 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Dicts/Inputs/DictEditInput.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application.Contracts/Dicts/Inputs/DictEditInput.cs @@ -24,7 +24,7 @@ public class DictEditInput : SfsBaseDataCreateOrUpdateInputBase /// 字典项列表 /// [Display(Name = "字典项列表")] - public virtual ICollection Items { get; set; } = new List(); + public List Items { get; set; } = new List(); #endregion #region Create diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Dicts/DictAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Dicts/DictAppService.cs index 9cfc2c39b..828a8bba0 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Dicts/DictAppService.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Dicts/DictAppService.cs @@ -10,11 +10,18 @@ using Win_in.Sfs.Basedata.Domain.Shared; namespace Win_in.Sfs.Basedata.Application; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; - +using System.Text; +using DocumentFormat.OpenXml.Office2010.ExcelAc; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; using Win_in.Sfs.Shared; +using Win_in.Sfs.Shared.Application.Contracts; +using Win_in.Sfs.Shared.Domain; [Authorize] [Route($"{BasedataConsts.RootPath}dict")] @@ -81,4 +88,114 @@ public class DictAppService : SfsBaseDataWithCodeAppServiceBase(entity); } + + /// + /// 导入数据具体实现,可重写 + /// + protected override async Task ImportInternalAsync(SfsImportRequestInput requestInput, byte[] inputFileBytes) + { + IList modelList = null; + var modelDict = new Dictionary>(); + var entityDict = new Dictionary(); + try + { + var hasDetails = typeof(Dict).GetInterfaces().Any(o => o.IsGenericType && o.GetGenericTypeDefinition() == typeof(IMasterEntity<>)); + modelDict = ExportImportService.ImportHaveValidationResult(inputFileBytes); + foreach (var modelDictItem in modelDict) + { + // DataAnnotations 静态验证 + var validationRresults = modelDictItem.Value; + var model = modelDictItem.Key; + Validator.TryValidateObject(model, new ValidationContext(model, null, null), validationRresults); + } + modelList = modelDict.Keys.ToList(); + // 如果没有验证错误或允许部分导入 + if (!modelDict.SelectMany(o => o.Value).Any() || requestInput.IsAllowPartImport) + { + var dictCodes = modelList.Select(p => p.Code).Distinct().ToList(); + foreach (var detail in dictCodes) + { + var dictDetail = modelList.FirstOrDefault(p => p.Code == detail); + + Dict dictItem = new Dict(); + dictItem.SetId(GuidGenerator.Create()); + dictItem.Code = dictDetail.Code; + dictItem.Name = dictDetail.Name; + dictItem.Description = dictDetail.Description; + foreach (var item in modelList.Where(p=>p.Code==detail)) + { + DictItem dictItemDetail = new DictItem(); + dictItemDetail.SetId(GuidGenerator.Create()); + dictItemDetail.Code = item.Item_Code; + dictItemDetail.Name = item.Item_Name; + dictItemDetail.Value = item.Item_Value; + dictItemDetail.Description = item.Item_Description; + dictItemDetail.Enabled = true; + dictItemDetail.MasterId = dictItem.Id; + dictItem.Items.Add(dictItemDetail); + } + + await _repository.InsertAsync(dictItem).ConfigureAwait(false); + } + } + + // 创建导入报告 + var reportFile = ExportImportService.GetImportReport(inputFileBytes, modelDict); + // 创建返回值 + return new SfsImportResult + { + TotalNum = modelList.Count, + ErrorNum = modelDict.Count(o => o.Value.Any()), + FileName = reportFile.FileDownloadName, + FileContents = reportFile.FileContents + }; + } + catch (Exception ex) + { + Console.WriteLine("---------------------------------"); + Console.WriteLine($"####导入验证错误:"); + Console.WriteLine($"{ex.Message}"); + Console.WriteLine("---------------------------------"); + Logger.LogException(ex); + if (modelList != null) + { + try + { + foreach (var item in modelDict) + { + var model = item.Key; + var validationRresults = item.Value; + validationRresults.Add(new ValidationResult($"无法添加,{ex.Message}", new string[] { "异常" })); + } + + // 创建导入报告 + var reportFile = ExportImportService.GetImportReport(inputFileBytes, modelDict); + return new SfsImportResult + { + TotalNum = modelList.Count, + ErrorNum = modelDict.Count(o => o.Value.Any()), + FileName = reportFile.FileDownloadName, + FileContents = reportFile.FileContents + }; + } + catch (Exception) + { + return new SfsImportResult() + { + ExceptionMessage = ex.Message, + FileContents = Encoding.Default.GetBytes(ex.Message) + }; + } + } + else + { + return new SfsImportResult() + { + ExceptionMessage = ex.Message, + FileContents = Encoding.Default.GetBytes(ex.Message) + }; + } + } + } + } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Dicts/DictAutoMapperProfile.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Dicts/DictAutoMapperProfile.cs index b64bfb41d..4085c7f9a 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Dicts/DictAutoMapperProfile.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Dicts/DictAutoMapperProfile.cs @@ -37,13 +37,12 @@ public partial class BasedataApplicationAutoMapperProfile : Profile .Ignore(x => x.Id); CreateMap() - .IgnoreAuditedObjectProperties() - ; + .IgnoreAuditedObjectProperties(); CreateMap() - .IgnoreAuditedObjectProperties() - .Ignore(x => x.ConcurrencyStamp) - .Ignore(x => x.Id); + .IgnoreAuditedObjectProperties() + .Ignore(x => x.Id) + .Ignore(x => x.ConcurrencyStamp); } } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Dicts/Dict.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Dicts/Dict.cs index d1f1080e2..9537519b0 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Dicts/Dict.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Dicts/Dict.cs @@ -31,5 +31,5 @@ public class Dict : SfsBaseDataAggregateRootBase, IHasCode /// /// 字典项列表 /// - public virtual ICollection Items { get; set; } = new List(); + public List Items { get; set; } = new List(); }