using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsArea; using CMS.Plugin.HIAWms.Application.Contracts.Services; using CMS.Plugin.HIAWms.Domain.WmsAreas; using CMS.Plugin.HIAWms.Domain.Shared; using CMS.Plugin.HIAWms.Domain.Shared.WmsAreas; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; using Volo.Abp.ObjectExtending; using CMS.Plugin.HIAWms.Domain.WmsStores; using CmsQueryExtensions; using CmsQueryExtensions.Extension; using System.Linq.Expressions; namespace CMS.Plugin.HIAWms.Application.Implements; /// public class WmsAreaAppService : CMSPluginAppService, IWmsAreaAppService { private readonly IWmsAreaRepository _wmsareaRepository; private readonly IWmsStoreRepository _wmsstoreRepository; /// /// Initializes a new instance of the class. /// /// The task job repository. public WmsAreaAppService(IWmsAreaRepository wmsareaRepository, IWmsStoreRepository wmsstoreRepository) { _wmsareaRepository = wmsareaRepository; _wmsstoreRepository = wmsstoreRepository; } /// public virtual async Task GetAsync(Guid id) { return ObjectMapper.Map(await _wmsareaRepository.GetAsync(id)); } /// /// 分页获取仓库信息 /// /// /// public virtual async Task> GetListAsync(GetWmsAreaInput input) { Check.NotNull(input, nameof(input)); if (input.Sorting.IsNullOrWhiteSpace()) { input.Sorting = nameof(WmsArea.Sort); } #region 动态构造查询条件 //动态构造查询条件 var whereConditions = DynamicGetQueryParams(input); #endregion var count = await _wmsareaRepository.GetCountAsync(whereConditions); var list = await _wmsareaRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount); return new PagedResultDto(count, ObjectMapper.Map, List>(list)); } /// /// 动态构造查询条件 /// /// 输入参数 /// private FunReturnResultModel>> DynamicGetQueryParams(GetWmsAreaInput input) { //动态构造查询条件 var whereConditions = WhereConditionsExtensions.GetWhereConditions(input); if (!whereConditions.IsSuccess) { throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg); } //也可再次自定义构建查询条件 Expression> extendExpression = a => a.IsDeleted == false; // 使用 System.Linq.PredicateBuilder 的 And var pres = (System.Linq.Expressions.Expression>)(whereConditions.data); whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression); return whereConditions; } /// public virtual async Task CreateAsync(WmsAreaCreateDto input) { await CheckCreateOrUpdateDtoAsync(input); var exist = await _wmsareaRepository.NameExistAsync(input.AreaNo); if (exist) { throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.AreaNo]); } var maxSort = await _wmsareaRepository.GetMaxSortAsync(); var sort = input.Sort ?? maxSort; var wmsarea = ObjectMapper.Map(input); wmsarea.Sort = sort; var store = await _wmsstoreRepository.FindByNameAsync(input.StoreCode); if (store == null) { throw new UserFriendlyException("仓库信息不存"); } input.MapExtraPropertiesTo(wmsarea, MappingPropertyDefinitionChecks.None); wmsarea.StoreName = store.StoreName; await _wmsareaRepository.InsertAsync(wmsarea); if (input.Sort.HasValue && wmsarea.Sort != maxSort) { await AdjustSortAsync(wmsarea.Id, wmsarea.Sort); } return ObjectMapper.Map(wmsarea); } /// public virtual async Task UpdateAsync(Guid id, WmsAreaUpdateDto input) { await CheckCreateOrUpdateDtoAsync(input); var wmsarea = await _wmsareaRepository.GetAsync(id); var exist = await _wmsareaRepository.NameExistAsync(input.AreaNo, wmsarea.Id); if (exist) { throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.AreaNo]); } wmsarea.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp); input.MapExtraPropertiesTo(wmsarea, MappingPropertyDefinitionChecks.None); var store = await _wmsstoreRepository.FindByNameAsync(input.StoreCode); if (store == null) { throw new UserFriendlyException("仓库信息不存"); } wmsarea.AreaName = input.AreaName; wmsarea.AreaDesc = input.AreaDesc; wmsarea.AreaStatus = input.AreaStatus; wmsarea.AreaType = input.AreaType; wmsarea.StoreCode = input.StoreCode; wmsarea.StoreName = store.StoreName; await _wmsareaRepository.UpdateAsync(wmsarea); return ObjectMapper.Map(wmsarea); } /// public async Task> CloneAsync(IEnumerable ids) { var wmsareas = new List(); if (ids != null) { var sort = await _wmsareaRepository.GetMaxSortAsync(); foreach (var id in ids) { var wmsarea = await _wmsareaRepository.FindAsync(id); if (wmsarea != null) { var name = wmsarea.AreaNo + WmsAreaConsts.CloneTag; var notExist = false; while (!notExist) { var exist = await _wmsareaRepository.NameExistAsync(name); if (exist || wmsareas.Any(x => x.AreaNo == name)) { name += WmsAreaConsts.CloneTag; continue; } notExist = true; } wmsareas.Add(wmsarea); } } } return ObjectMapper.Map, List>(wmsareas); } /// public virtual Task DeleteAsync(Guid id) { return _wmsareaRepository.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 _wmsareaRepository.GetListAsync(null,nameof(WmsArea.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 _wmsareaRepository.UpdateManyAsync(list); } /// public async Task ImportAsync(WmsAreasImportModel input) { Check.NotNull(input, nameof(input)); var wmsareaCreateDtos = new List<(int RowIndex, WmsAreaCreateDto Item)>(); var wmsareaUpdateDtos = new List<(int RowIndex, Guid Id, WmsAreaUpdateDto Item)>(); var wmsareas = input.WmsAreas; if (wmsareas != null && wmsareas.Any()) { #region 导入校验 // 判断名称是否重复,并输出第几行重复 var duplicateWmsAreas = wmsareas.GroupBy(x => x.AreaNo).Where(x => x.Count() > 1).ToList(); if (duplicateWmsAreas?.Any() == true) { var duplicateWmsAreaMsgs = duplicateWmsAreas.Select(x => $"第 {string.Join(",", x.Select(x => x.RowIndex))} 行:{x.Key} 名称重复"); var errorMsg = $"导入失败!配置, {string.Join(",", duplicateWmsAreaMsgs)},终止导入"; throw new UserFriendlyException(errorMsg); } #endregion foreach (var wmsarea in wmsareas) { if (wmsarea.AreaNo.IsNullOrWhiteSpace() && wmsarea.AreaName.IsNullOrWhiteSpace()) { continue; } if (wmsarea.AreaName.IsNullOrWhiteSpace()) { var errorMsg = $"导入失败!配置,第{wmsarea.RowIndex}行:WmsArea名称不能为空"; throw new UserFriendlyException(errorMsg); } var oldWmsArea = await _wmsareaRepository.FindByNameAsync(wmsarea.AreaNo); if (oldWmsArea != null) { var wmsareaUpdateDto = new WmsAreaUpdateDto { AreaName = wmsarea.AreaName, AreaDesc = wmsarea.AreaDesc, AreaStatus = wmsarea.AreaStatus, AreaType = wmsarea.AreaType, StoreCode = wmsarea.StoreCode, StoreName = wmsarea.StoreName, Remark = wmsarea.Remark, }; wmsareaUpdateDtos.Add((wmsarea.RowIndex, oldWmsArea.Id, wmsareaUpdateDto)); } else { var wmsareaCreateDto = new WmsAreaCreateDto { AreaName = wmsarea.AreaName, AreaDesc = wmsarea.AreaDesc, AreaStatus = wmsarea.AreaStatus, AreaType = wmsarea.AreaType, StoreCode = wmsarea.StoreCode, StoreName = wmsarea.StoreName, Remark = wmsarea.Remark, }; wmsareaCreateDtos.Add((wmsarea.RowIndex, wmsareaCreateDto)); } } } // 新增 foreach (var wmsareaDto in wmsareaCreateDtos) { try { await CreateAsync(wmsareaDto.Item); } catch (Exception e) { var errorMsg = $"导入失败!配置,第{wmsareaDto.RowIndex}行:{e.Message},终止导入"; throw new UserFriendlyException(errorMsg); } } // 更新 foreach (var wmsareaDto in wmsareaUpdateDtos) { try { await UpdateAsync(wmsareaDto.Id, wmsareaDto.Item); } catch (Exception e) { var errorMsg = $"导入失败!配置,第{wmsareaDto.RowIndex}行:{e.Message},终止导入"; throw new UserFriendlyException(errorMsg); } } } /// /// 导出仓库库区信息 /// /// /// public async Task<(Dictionary Sheets, string FileName)> ExportAsync(GetWmsAreaInput input) { Check.NotNull(input, nameof(input)); if (input.Sorting.IsNullOrWhiteSpace()) { input.Sorting = nameof(WmsArea.Sort); } #region 动态构造查询条件 //动态构造查询条件 var whereConditions = DynamicGetQueryParams(input); #endregion var list = await _wmsareaRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true); var result = ObjectMapper.Map, List>(list); var sheets = new Dictionary { ["配置"] = ExportHelper.ConvertListToExportData(result), }; var fileName = "库区信息"; return (sheets, fileName); } /// /// Checks the create or update dto asynchronous. /// /// The input. protected Task CheckCreateOrUpdateDtoAsync(WmsAreaCreateOrUpdateDtoBase input) { Check.NotNull(input, nameof(input)); Check.NotNullOrWhiteSpace(input.AreaNo, "编号", WmsAreaConsts.MaxCodeLength); Check.NotNullOrWhiteSpace(input.AreaName, "名称", WmsAreaConsts.MaxNameLength); Check.Length(input.Remark, "备注", WmsAreaConsts.MaxRemarkLength); return Task.CompletedTask; } }