using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterials; using CMS.Plugin.HIAWms.Application.Contracts.Services; using CMS.Plugin.HIAWms.Domain.Shared; using CMS.Plugin.HIAWms.Domain.Shared.Util; using CMS.Plugin.HIAWms.Domain.Shared.WmsMaterials; using CMS.Plugin.HIAWms.Domain.WmsMaterials; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectMapping; namespace CMS.Plugin.HIAWms.Application.Implements; /// public class WmsMaterialAppService : CMSPluginAppService, IWmsMaterialAppService { private readonly IWmsMaterialRepository _wmsmaterialRepository; /// /// Initializes a new instance of the class. /// /// The task job repository. public WmsMaterialAppService(IWmsMaterialRepository wmsmaterialRepository) { _wmsmaterialRepository = wmsmaterialRepository; } /// public virtual async Task GetAsync(Guid id) { return ObjectMapper.Map(await _wmsmaterialRepository.GetAsync(id)); } /// public virtual async Task> GetListAsync(GetWmsMaterialsInput input) { Check.NotNull(input, nameof(input)); if (input.Sorting.IsNullOrWhiteSpace()) { input.Sorting = nameof(WmsMaterial.Sort); } var specification = new WmsMaterialSpecification(input.Name); var material = ObjectMapper.Map(input); var count = await _wmsmaterialRepository.GetCountAsync(material,input.Filter, specification); var list = await _wmsmaterialRepository.GetListAsync(material,input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter, specification); return new PagedResultDto(count, ObjectMapper.Map, List>(list)); } /// public virtual async Task CreateAsync(WmsMaterialCreateDto input) { await CheckCreateOrUpdateDtoAsync(input); var exist = await _wmsmaterialRepository.NameExistAsync(input.MaterialCode); if (exist) { throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.MaterialCode]); } var maxSort = await _wmsmaterialRepository.GetMaxSortAsync(); var sort = input.Sort ?? maxSort; var wmsmaterial = ObjectMapper.Map(input); wmsmaterial.Sort = sort; input.MapExtraPropertiesTo(wmsmaterial, MappingPropertyDefinitionChecks.None); await _wmsmaterialRepository.InsertAsync(wmsmaterial); if (input.Sort.HasValue && wmsmaterial.Sort != maxSort) { await AdjustSortAsync(wmsmaterial.Id, wmsmaterial.Sort); } return ObjectMapper.Map(wmsmaterial); } /// public virtual async Task UpdateAsync(Guid id, WmsMaterialUpdateDto input) { await CheckCreateOrUpdateDtoAsync(input); var wmsmaterial = await _wmsmaterialRepository.GetAsync(id); var exist = await _wmsmaterialRepository.NameExistAsync(input.MaterialCode, wmsmaterial.Id); if (exist) { throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.MaterialCode]); } wmsmaterial.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp); input.MapExtraPropertiesTo(wmsmaterial, MappingPropertyDefinitionChecks.None); wmsmaterial.MaterialName = input.MaterialName; wmsmaterial.PurchaseType = input.PurchaseType; wmsmaterial.MaterialType = input.MaterialType; wmsmaterial.PrimaryUnit = input.PrimaryUnit; wmsmaterial.Standard = input.Standard; wmsmaterial.OuterDiameter = input.OuterDiameter; wmsmaterial.WallThickness = input.WallThickness; wmsmaterial.MaterialQuality = input.MaterialQuality; wmsmaterial.Length = input.Length; wmsmaterial.IsMainBranch = input.IsMainBranch; wmsmaterial.Factory = input.Factory; wmsmaterial.MaterialModel = input.MaterialModel; wmsmaterial.Certification = input.Certification; await _wmsmaterialRepository.UpdateAsync(wmsmaterial); return ObjectMapper.Map(wmsmaterial); } /// public async Task> CloneAsync(IEnumerable ids) { //var wmsmaterials = new List(); //if (ids != null) //{ // var sort = await _wmsmaterialRepository.GetMaxSortAsync(); // foreach (var id in ids) // { // var wmsmaterial = await _wmsmaterialRepository.FindAsync(id); // if (wmsmaterial != null) // { // var name = wmsmaterial.Name + WmsMaterialConsts.CloneTag; // var notExist = false; // while (!notExist) // { // var exist = await _wmsmaterialRepository.NameExistAsync(name); // if (exist || wmsmaterials.Any(x => x.Name == name)) // { // name += WmsMaterialConsts.CloneTag; // continue; // } // notExist = true; // } // //wmsmaterial = await _wmsmaterialRepository.InsertAsync(wmsmaterial.Clone(GuidGenerator.Create(), name, sort++)); // wmsmaterials.Add(wmsmaterial); // } // } //} //return ObjectMapper.Map, List>(wmsmaterials); return new List(); } /// public virtual Task DeleteAsync(Guid id) { return _wmsmaterialRepository.DeleteAsync(id); } /// public async Task DeleteManyAsync(IEnumerable ids) { foreach (var id in ids) { await DeleteAsync(id); } } /// public virtual async Task AdjustSortAsync(Guid id, int sort) { var list = await _wmsmaterialRepository.GetListAsync(null, nameof(WmsMaterial.Sort)); if (list != null && list.Any()) { var initSort = 1; list.ForEach(x => x.AdjustSort(initSort++)); var entity = list.FirstOrDefault(x => x.Id == id); if (entity != null) { if (sort == 1) { list.Where(x => x.Id != id).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1)); } else if (entity.Sort > sort) { list.Where(x => x.Id != id && x.Sort >= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1)); list.Where(x => x.Id != id && x.Sort < sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1)); } else if (entity.Sort < sort) { list.Where(x => x.Id != id && x.Sort > sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort + 1)); list.Where(x => x.Id != id && x.Sort <= sort).ToList()?.ForEach(x => x.AdjustSort(x.Sort - 1)); } entity.AdjustSort(sort); } } await _wmsmaterialRepository.UpdateManyAsync(list); } /// public async Task ImportAsync(WmsMaterialsImportModel input) { Check.NotNull(input, nameof(input)); var wmsmaterialCreateDtos = new List<(int RowIndex, WmsMaterialCreateDto Item)>(); var wmsmaterialUpdateDtos = new List<(int RowIndex, Guid Id, WmsMaterialUpdateDto Item)>(); var wmsmaterials = input.WmsMaterials; if (wmsmaterials != null && wmsmaterials.Any()) { #region 导入校验 // 判断名称是否重复,并输出第几行重复 var duplicateWmsMaterials = wmsmaterials.GroupBy(x => x.MaterialCode).Where(x => x.Count() > 1).ToList(); if (duplicateWmsMaterials?.Any() == true) { var duplicateWmsMaterialMsgs = duplicateWmsMaterials.Select(x => $"第 {string.Join(",", x.Select(x => x.RowIndex))} 行:{x.Key} 名称重复"); var errorMsg = $"导入失败!配置, {string.Join(",", duplicateWmsMaterialMsgs)},终止导入"; throw new UserFriendlyException(errorMsg); } #endregion foreach (var wmsmaterial in wmsmaterials) { if (wmsmaterial.MaterialCode.IsNullOrWhiteSpace() && wmsmaterial.MaterialName.IsNullOrWhiteSpace()) { continue; } if (wmsmaterial.MaterialCode.IsNullOrWhiteSpace()) { var errorMsg = $"导入失败!配置,第{wmsmaterial.RowIndex}行:WmsMaterial名称不能为空"; throw new UserFriendlyException(errorMsg); } var oldWmsMaterial = await _wmsmaterialRepository.FindByNameAsync(wmsmaterial.MaterialCode); if (oldWmsMaterial != null) { var wmsmaterialUpdateDto = new WmsMaterialUpdateDto { MaterialCode = wmsmaterial.MaterialCode, MaterialName = wmsmaterial.MaterialName, PurchaseType = wmsmaterial.PurchaseType, MaterialType = wmsmaterial.MaterialType, PrimaryUnit = wmsmaterial.PrimaryUnit, Standard = wmsmaterial.Standard, OuterDiameter = wmsmaterial.OuterDiameter, WallThickness = wmsmaterial.WallThickness, MaterialQuality = wmsmaterial.MaterialQuality, Length = wmsmaterial.Length, IsMainBranch = wmsmaterial.IsMainBranch, Factory = wmsmaterial.Factory, Certification = wmsmaterial.Certification, Remark = wmsmaterial.Remark, }; wmsmaterialUpdateDtos.Add((wmsmaterial.RowIndex, oldWmsMaterial.Id, wmsmaterialUpdateDto)); } else { var wmsmaterialCreateDto = new WmsMaterialCreateDto { MaterialCode = wmsmaterial.MaterialCode, MaterialName = wmsmaterial.MaterialName, PurchaseType = wmsmaterial.PurchaseType, MaterialType = wmsmaterial.MaterialType, PrimaryUnit = wmsmaterial.PrimaryUnit, Standard = wmsmaterial.Standard, OuterDiameter = wmsmaterial.OuterDiameter, WallThickness = wmsmaterial.WallThickness, MaterialQuality = wmsmaterial.MaterialQuality, Length = wmsmaterial.Length, IsMainBranch = wmsmaterial.IsMainBranch, Factory = wmsmaterial.Factory, Certification = wmsmaterial.Certification, Remark = wmsmaterial.Remark, }; wmsmaterialCreateDtos.Add((wmsmaterial.RowIndex, wmsmaterialCreateDto)); } } } // 新增 foreach (var wmsmaterialDto in wmsmaterialCreateDtos) { try { await CreateAsync(wmsmaterialDto.Item); } catch (Exception e) { var errorMsg = $"导入失败!配置,第{wmsmaterialDto.RowIndex}行:{e.Message},终止导入"; throw new UserFriendlyException(errorMsg); } } // 更新 foreach (var wmsmaterialDto in wmsmaterialUpdateDtos) { try { await UpdateAsync(wmsmaterialDto.Id, wmsmaterialDto.Item); } catch (Exception e) { var errorMsg = $"导入失败!配置,第{wmsmaterialDto.RowIndex}行:{e.Message},终止导入"; throw new UserFriendlyException(errorMsg); } } } /// public async Task<(Dictionary Sheets, string FileName)> ExportAsync(GetWmsMaterialsInput input) { Check.NotNull(input, nameof(input)); if (input.Sorting.IsNullOrWhiteSpace()) { input.Sorting = nameof(WmsMaterial.Sort); } var specification = new WmsMaterialSpecification(input.Name); var material = ObjectMapper.Map(input); var list = await _wmsmaterialRepository.GetListAsync(material,input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter, specification, includeDetails: true); var result = ObjectMapper.Map, List>(list); var sheets = new Dictionary { ["配置"] = ExportHelper.ConvertListToExportData(result), }; var fileName = result.Count > 1 ? "WmsMaterial列表" : result.Count == 1 ? result[0]?.MaterialCode : "WmsMaterial模版"; return (sheets, fileName); } /// /// Checks the create or update dto asynchronous. /// /// The input. protected Task CheckCreateOrUpdateDtoAsync(WmsMaterialCreateOrUpdateDtoBase input) { Check.NotNull(input, nameof(input)); Check.NotNullOrWhiteSpace(input.MaterialCode, "编号", WmsMaterialConsts.MaxCodeLength); Check.NotNullOrWhiteSpace(input.MaterialName, "名称", WmsMaterialConsts.MaxNameLength); Check.Length(input.Remark, "备注", WmsMaterialConsts.MaxRemarkLength); return Task.CompletedTask; } }