using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialInfos; using CMS.Plugin.HIAWms.Application.Contracts.Services; using CMS.Plugin.HIAWms.Domain.WmsMaterialInfos; using CMS.Plugin.HIAWms.Domain.Shared; using CMS.Plugin.HIAWms.Domain.Shared.WmsMaterialInfos; 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 WmsMaterialInfoAppService : CMSPluginAppService, IWmsMaterialInfoAppService { private readonly IWmsMaterialInfoRepository _wmsmaterialinfoRepository; /// /// Initializes a new instance of the class. /// /// The task job repository. public WmsMaterialInfoAppService(IWmsMaterialInfoRepository wmsmaterialinfoRepository) { _wmsmaterialinfoRepository = wmsmaterialinfoRepository; } /// public virtual async Task GetAsync(Guid id) { return ObjectMapper.Map(await _wmsmaterialinfoRepository.GetAsync(id)); } /// public virtual async Task> GetListAsync(GetWmsMaterialInfosInput input) { Check.NotNull(input, nameof(input)); if (input.Sorting.IsNullOrWhiteSpace()) { input.Sorting = nameof(WmsMaterialInfo.Sort); } var specification = new WmsMaterialInfoSpecification(input.Name); var materialInfo = ObjectMapper.Map(input); var count = await _wmsmaterialinfoRepository.GetCountAsync(materialInfo,input.Filter, specification); var list = await _wmsmaterialinfoRepository.GetListAsync(materialInfo,input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter, specification); return new PagedResultDto(count, ObjectMapper.Map, List>(list)); } /// public virtual async Task CreateAsync(WmsMaterialInfoCreateDto input) { await CheckCreateOrUpdateDtoAsync(input); var exist = await _wmsmaterialinfoRepository.NameExistAsync(input.MaterialNo); if (exist) { throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.MaterialNo]); } var maxSort = await _wmsmaterialinfoRepository.GetMaxSortAsync(); var sort = input.Sort ?? maxSort; var wmsmaterialinfo = ObjectMapper.Map(input); input.MapExtraPropertiesTo(wmsmaterialinfo, MappingPropertyDefinitionChecks.None); wmsmaterialinfo.Sort = sort; await _wmsmaterialinfoRepository.InsertAsync(wmsmaterialinfo); if (input.Sort.HasValue && wmsmaterialinfo.Sort != maxSort) { await AdjustSortAsync(wmsmaterialinfo.Id, wmsmaterialinfo.Sort); } return ObjectMapper.Map(wmsmaterialinfo); } /// public virtual async Task UpdateAsync(Guid id, WmsMaterialInfoUpdateDto input) { await CheckCreateOrUpdateDtoAsync(input); var wmsMaterialInfo = await _wmsmaterialinfoRepository.GetAsync(id); var exist = await _wmsmaterialinfoRepository.NameExistAsync(input.MaterialNo, wmsMaterialInfo.Id); if (exist) { throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.MaterialNo]); } wmsMaterialInfo.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp); input.MapExtraPropertiesTo(wmsMaterialInfo, MappingPropertyDefinitionChecks.None); wmsMaterialInfo.MaterialNo = input.MaterialNo; wmsMaterialInfo.MaterialName = input.MaterialName; wmsMaterialInfo.MaterialModel = input.MaterialModel; wmsMaterialInfo.MaterialId = input.MaterialId; wmsMaterialInfo.StockNumber = input.StockNumber; wmsMaterialInfo.MaterialBatch = input.MaterialBatch; wmsMaterialInfo.SupplierCode = input.SupplierCode; wmsMaterialInfo.CheckStatus = input.CheckStatus; wmsMaterialInfo.RedundantField1 = input.RedundantField1; wmsMaterialInfo.RedundantField2 = input.RedundantField2; wmsMaterialInfo.RedundantField3 = input.RedundantField3; wmsMaterialInfo.Remark = input.Remark; await _wmsmaterialinfoRepository.UpdateAsync(wmsMaterialInfo); return ObjectMapper.Map(wmsMaterialInfo); } /// public async Task> CloneAsync(IEnumerable ids) { var wmsmaterialinfos = new List(); if (ids != null) { var sort = await _wmsmaterialinfoRepository.GetMaxSortAsync(); foreach (var id in ids) { var wmsmaterialinfo = await _wmsmaterialinfoRepository.FindAsync(id); if (wmsmaterialinfo != null) { var name = wmsmaterialinfo.MaterialName + WmsMaterialInfoConsts.CloneTag; var notExist = false; while (!notExist) { var exist = await _wmsmaterialinfoRepository.NameExistAsync(name); if (exist || wmsmaterialinfos.Any(x => x.MaterialName == name)) { name += WmsMaterialInfoConsts.CloneTag; continue; } notExist = true; } //wmsmaterialinfo = await _wmsmaterialinfoRepository.InsertAsync(wmsmaterialinfo.Clone(GuidGenerator.Create(), name, sort++)); wmsmaterialinfos.Add(wmsmaterialinfo); } } } return ObjectMapper.Map, List>(wmsmaterialinfos); } /// public virtual Task DeleteAsync(Guid id) { return _wmsmaterialinfoRepository.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 _wmsmaterialinfoRepository.GetListAsync(null,nameof(WmsMaterialInfo.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 _wmsmaterialinfoRepository.UpdateManyAsync(list); } /// public async Task ImportAsync(WmsMaterialInfosImportModel input) { Check.NotNull(input, nameof(input)); var wmsmaterialinfoCreateDtos = new List<(int RowIndex, WmsMaterialInfoCreateDto Item)>(); var wmsmaterialinfoUpdateDtos = new List<(int RowIndex, Guid Id, WmsMaterialInfoUpdateDto Item)>(); var wmsmaterialinfos = input.WmsMaterialInfos; if (wmsmaterialinfos != null && wmsmaterialinfos.Any()) { #region 导入校验 // 判断名称是否重复,并输出第几行重复 var duplicateWmsMaterialInfos = wmsmaterialinfos.GroupBy(x => x.MaterialNo).Where(x => x.Count() > 1).ToList(); if (duplicateWmsMaterialInfos?.Any() == true) { var duplicateWmsMaterialInfoMsgs = duplicateWmsMaterialInfos.Select(x => $"第 {string.Join(",", x.Select(x => x.RowIndex))} 行:{x.Key} 名称重复"); var errorMsg = $"导入失败!配置, {string.Join(",", duplicateWmsMaterialInfoMsgs)},终止导入"; throw new UserFriendlyException(errorMsg); } #endregion foreach (var wmsmaterialinfo in wmsmaterialinfos) { if (wmsmaterialinfo.MaterialNo.IsNullOrWhiteSpace() && wmsmaterialinfo.MaterialNo.IsNullOrWhiteSpace()) { continue; } if (wmsmaterialinfo.MaterialNo.IsNullOrWhiteSpace()) { var errorMsg = $"导入失败!配置,第{wmsmaterialinfo.RowIndex}行:WmsMaterialInfo名称不能为空"; throw new UserFriendlyException(errorMsg); } var oldWmsMaterialInfo = await _wmsmaterialinfoRepository.FindByNameAsync(wmsmaterialinfo.MaterialNo); if (oldWmsMaterialInfo != null) { var wmsmaterialinfoUpdateDto = new WmsMaterialInfoUpdateDto { MaterialNo = wmsmaterialinfo.MaterialNo, MaterialName = wmsmaterialinfo.MaterialName, MaterialId = wmsmaterialinfo.MaterialId, // 物料特性 MaterialModel = wmsmaterialinfo.MaterialModel, MaterialBatch = wmsmaterialinfo.MaterialBatch, StockNumber = wmsmaterialinfo.StockNumber, // 供应商信息 SupplierCode = wmsmaterialinfo.SupplierCode, // 状态信息 CheckStatus = wmsmaterialinfo.CheckStatus, // 系统字段 Remark = wmsmaterialinfo.Remark, }; wmsmaterialinfoUpdateDtos.Add((wmsmaterialinfo.RowIndex, oldWmsMaterialInfo.Id, wmsmaterialinfoUpdateDto)); } else { var wmsmaterialinfoCreateDto = new WmsMaterialInfoCreateDto { MaterialNo = wmsmaterialinfo.MaterialNo, MaterialName = wmsmaterialinfo.MaterialName, MaterialId = wmsmaterialinfo.MaterialId, // 物料特性 MaterialModel = wmsmaterialinfo.MaterialModel, MaterialBatch = wmsmaterialinfo.MaterialBatch, StockNumber = wmsmaterialinfo.StockNumber, // 供应商信息 SupplierCode = wmsmaterialinfo.SupplierCode, // 状态信息 CheckStatus = wmsmaterialinfo.CheckStatus, // 系统字段 Remark = wmsmaterialinfo.Remark, }; wmsmaterialinfoCreateDtos.Add((wmsmaterialinfo.RowIndex, wmsmaterialinfoCreateDto)); } } } // 新增 foreach (var wmsmaterialinfoDto in wmsmaterialinfoCreateDtos) { try { await CreateAsync(wmsmaterialinfoDto.Item); } catch (Exception e) { var errorMsg = $"导入失败!配置,第{wmsmaterialinfoDto.RowIndex}行:{e.Message},终止导入"; throw new UserFriendlyException(errorMsg); } } // 更新 foreach (var wmsmaterialinfoDto in wmsmaterialinfoUpdateDtos) { try { await UpdateAsync(wmsmaterialinfoDto.Id, wmsmaterialinfoDto.Item); } catch (Exception e) { var errorMsg = $"导入失败!配置,第{wmsmaterialinfoDto.RowIndex}行:{e.Message},终止导入"; throw new UserFriendlyException(errorMsg); } } } /// public async Task<(Dictionary Sheets, string FileName)> ExportAsync(GetWmsMaterialInfosInput input) { Check.NotNull(input, nameof(input)); if (input.Sorting.IsNullOrWhiteSpace()) { input.Sorting = nameof(WmsMaterialInfo.Sort); } var specification = new WmsMaterialInfoSpecification(input.Name); var materialInfo = ObjectMapper.Map(input); var list = await _wmsmaterialinfoRepository.GetListAsync(materialInfo,input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter, specification, includeDetails: true); var result = ObjectMapper.Map, List>(list); var sheets = new Dictionary { ["配置"] = result.Select(x => x.GetExportData()).ToList(), }; var fileName = result.Count > 1 ? "WmsMaterialInfo列表" : result.Count == 1 ? result.First()?.MaterialNo : "WmsMaterialInfo模版"; return (sheets, fileName); } /// /// Checks the create or update dto asynchronous. /// /// The input. protected Task CheckCreateOrUpdateDtoAsync(WmsMaterialInfoCreateOrUpdateDtoBase input) { Check.NotNull(input, nameof(input)); Check.NotNullOrWhiteSpace(input.MaterialNo, "编号", WmsMaterialInfoConsts.MaxMaterialIdLength); Check.NotNullOrWhiteSpace(input.MaterialName, "名称", WmsMaterialInfoConsts.MaxMaterialIdLength); Check.Length(input.Remark, "备注", WmsMaterialInfoConsts.MaxRemarkLength); return Task.CompletedTask; } }