using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsContainer; using CMS.Plugin.HIAWms.Application.Contracts.Services; using CMS.Plugin.HIAWms.Domain.Shared; using CMS.Plugin.HIAWms.Domain.Shared.WmsContainers; using CMS.Plugin.HIAWms.Domain.WmsContainers; using CmsQueryExtensions; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; using Volo.Abp.ObjectExtending; namespace CMS.Plugin.HIAWms.Application.Implements; /// public class WmsContainerAppService : CMSPluginAppService, IWmsContainerAppService { private readonly IWmsContainerRepository _wmscontainerRepository; /// /// Initializes a new instance of the class. /// /// The task job repository. public WmsContainerAppService(IWmsContainerRepository wmscontainerRepository) { _wmscontainerRepository = wmscontainerRepository; } /// public virtual async Task GetAsync(Guid id) { return ObjectMapper.Map(await _wmscontainerRepository.GetAsync(id)); } /// public virtual async Task> GetListAsync(GetWmsContainerInput input) { Check.NotNull(input, nameof(input)); if (input.Sorting.IsNullOrWhiteSpace()) { input.Sorting = nameof(WmsContainer.Sort); } var specification = new WmsContainerSpecification(input.Name); var container = ObjectMapper.Map < GetWmsContainerInput, WmsContainer>(input); var count = await _wmscontainerRepository.GetCountAsync(container,input.Filter, specification); var list = await _wmscontainerRepository.GetListAsync(container,input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter, specification); return new PagedResultDto(count, ObjectMapper.Map, List>(list)); } /// public virtual async Task CreateAsync(WmsContainerCreateDto input) { await CheckCreateOrUpdateDtoAsync(input); var exist = await _wmscontainerRepository.NameExistAsync(input.ContainerNo); if (exist) { throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.ContainerNo]); } var maxSort = await _wmscontainerRepository.GetMaxSortAsync(); var sort = input.Sort ?? maxSort; var wmscontainer = ObjectMapper.Map(input); input.MapExtraPropertiesTo(wmscontainer, MappingPropertyDefinitionChecks.None); wmscontainer.Sort = sort; await _wmscontainerRepository.InsertAsync(wmscontainer); if (input.Sort.HasValue && wmscontainer.Sort != maxSort) { await AdjustSortAsync(wmscontainer.Id, wmscontainer.Sort); } return ObjectMapper.Map(wmscontainer); } /// public virtual async Task UpdateAsync(Guid id, WmsContainerUpdateDto input) { await CheckCreateOrUpdateDtoAsync(input); var wmscontainer = await _wmscontainerRepository.GetAsync(id); var exist = await _wmscontainerRepository.NameExistAsync(input.ContainerNo, wmscontainer.Id); if (exist) { throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.ContainerNo]); } wmscontainer.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp); input.MapExtraPropertiesTo(wmscontainer, MappingPropertyDefinitionChecks.None); wmscontainer.ContainerStatus = input.ContainerStatus; wmscontainer.ContainerType = input.ContainerType; wmscontainer.SpecLength = input.SpecLength; wmscontainer.SpecWidth = input.SpecWidth; wmscontainer.SpecHeight = input.SpecHeight; wmscontainer.LimitLength = input.LimitLength; wmscontainer.LimitWidth = input.LimitWidth; wmscontainer.LimitHeight = input.LimitHeight; wmscontainer.MaxWeight = input.MaxWeight; wmscontainer.MaterialNumber = input.MaterialNumber; wmscontainer.ExceptionNumber = input.ExceptionNumber; await _wmscontainerRepository.UpdateAsync(wmscontainer); return ObjectMapper.Map(wmscontainer); } /// public async Task> CloneAsync(IEnumerable ids) { var wmscontainers = new List(); if (ids != null) { var sort = await _wmscontainerRepository.GetMaxSortAsync(); foreach (var id in ids) { var wmscontainer = await _wmscontainerRepository.FindAsync(id); if (wmscontainer != null) { var containerNo = wmscontainer.ContainerNo + WmsContainerConsts.CloneTag; var notExist = false; while (!notExist) { var exist = await _wmscontainerRepository.NameExistAsync(containerNo); if (exist || wmscontainers.Any(x => x.ContainerNo == containerNo)) { containerNo += WmsContainerConsts.CloneTag; continue; } notExist = true; } //wmscontainer = await _wmscontainerRepository.InsertAsync(wmscontainer.Clone(GuidGenerator.Create(), containerNo, sort++)); wmscontainers.Add(wmscontainer); } } } return ObjectMapper.Map, List>(wmscontainers); } /// public virtual Task DeleteAsync(Guid id) { return _wmscontainerRepository.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 _wmscontainerRepository.GetListAsync(null,nameof(WmsContainer.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 _wmscontainerRepository.UpdateManyAsync(list); } /// public async Task ImportAsync(WmsContainersImportModel input) { Check.NotNull(input, nameof(input)); var wmscontainerCreateDtos = new List<(int RowIndex, WmsContainerCreateDto Item)>(); var wmscontainerUpdateDtos = new List<(int RowIndex, Guid Id, WmsContainerUpdateDto Item)>(); var wmscontainers = input.WmsContainers; if (wmscontainers != null && wmscontainers.Any()) { #region 导入校验 // 判断名称是否重复,并输出第几行重复 var duplicateWmsContainers = wmscontainers.GroupBy(x => x.ContainerNo).Where(x => x.Count() > 1).ToList(); if (duplicateWmsContainers?.Any() == true) { var duplicateWmsContainerMsgs = duplicateWmsContainers.Select(x => $"第 {string.Join(",", x.Select(x => x.RowIndex))} 行:{x.Key} 名称重复"); var errorMsg = $"导入失败!配置, {string.Join(",", duplicateWmsContainerMsgs)},终止导入"; throw new UserFriendlyException(errorMsg); } #endregion foreach (var wmscontainer in wmscontainers) { if (wmscontainer.ContainerNo.IsNullOrWhiteSpace() && wmscontainer.ContainerNo.IsNullOrWhiteSpace()) { continue; } if (wmscontainer.ContainerNo.IsNullOrWhiteSpace()) { var errorMsg = $"导入失败!配置,第{wmscontainer.RowIndex}行:WmsContainer名称不能为空"; throw new UserFriendlyException(errorMsg); } var oldWmsContainer = await _wmscontainerRepository.FindByNameAsync(wmscontainer.ContainerNo); if (oldWmsContainer != null) { var wmscontainerUpdateDto = new WmsContainerUpdateDto { ContainerNo = wmscontainer.ContainerNo, ContainerType = wmscontainer.ContainerType, ContainerStatus = wmscontainer.ContainerStatus, SpecLength = wmscontainer.SpecLength, SpecWidth = wmscontainer.SpecWidth, SpecHeight = wmscontainer.SpecHeight, LimitLength = wmscontainer.LimitLength, LimitWidth = wmscontainer.LimitWidth, LimitHeight = wmscontainer.LimitHeight, MaxWeight = wmscontainer.MaxWeight, Remark = wmscontainer.Remark, }; wmscontainerUpdateDtos.Add((wmscontainer.RowIndex, oldWmsContainer.Id, wmscontainerUpdateDto)); } else { var wmscontainerCreateDto = new WmsContainerCreateDto { ContainerNo = wmscontainer.ContainerNo, ContainerType = wmscontainer.ContainerType, ContainerStatus = wmscontainer.ContainerStatus, SpecLength = wmscontainer.SpecLength, SpecWidth = wmscontainer.SpecWidth, SpecHeight = wmscontainer.SpecHeight, LimitLength = wmscontainer.LimitLength, LimitWidth = wmscontainer.LimitWidth, LimitHeight = wmscontainer.LimitHeight, MaxWeight = wmscontainer.MaxWeight, Remark = wmscontainer.Remark }; wmscontainerCreateDtos.Add((wmscontainer.RowIndex, wmscontainerCreateDto)); } } } // 新增 foreach (var wmscontainerDto in wmscontainerCreateDtos) { try { await CreateAsync(wmscontainerDto.Item); } catch (Exception e) { var errorMsg = $"导入失败!配置,第{wmscontainerDto.RowIndex}行:{e.Message},终止导入"; throw new UserFriendlyException(errorMsg); } } // 更新 foreach (var wmscontainerDto in wmscontainerUpdateDtos) { try { await UpdateAsync(wmscontainerDto.Id, wmscontainerDto.Item); } catch (Exception e) { var errorMsg = $"导入失败!配置,第{wmscontainerDto.RowIndex}行:{e.Message},终止导入"; throw new UserFriendlyException(errorMsg); } } } /// public async Task<(Dictionary Sheets, string FileName)> ExportAsync(GetWmsContainerInput input) { Check.NotNull(input, nameof(input)); if (input.Sorting.IsNullOrWhiteSpace()) { input.Sorting = nameof(WmsContainer.Sort); } var specification = new WmsContainerSpecification(input.Name); var container = ObjectMapper.Map(input); var list = await _wmscontainerRepository.GetListAsync(container,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 ? "WmsContainer列表" : result.Count == 1 ? result.First()?.ContainerNo : "WmsContainer模版"; return (sheets, fileName); } /// /// Checks the create or update dto asynchronous. /// /// The input. protected Task CheckCreateOrUpdateDtoAsync(WmsContainerCreateOrUpdateDtoBase input) { Check.NotNull(input, nameof(input)); Check.NotNullOrWhiteSpace(input.ContainerNo, "编号", WmsContainerConsts.MaxCodeLength); Check.Length(input.Remark, "备注", WmsContainerConsts.MaxRemarkLength); return Task.CompletedTask; } }