zs
2025-05-14 6be4dc69a73560ab2e08e68d5dbfdf95ae62d5b4
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsContainerAppService.cs
@@ -1,8 +1,11 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsContainers;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsContainer;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.WmsContainers;
using CMS.Plugin.HIAWms.Domain.Shared;
using CMS.Plugin.HIAWms.Domain.Shared.WmsContainers;
using CMS.Plugin.HIAWms.Domain.WmsContainers;
using CmsQueryExtensions;
using CmsQueryExtensions.Extension;
using System.Linq.Expressions;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
@@ -31,7 +34,7 @@
    }
    /// <inheritdoc />
    public virtual async Task<PagedResultDto<WmsContainerDto>> GetListAsync(GetWmsContainersInput input)
    public virtual async Task<PagedResultDto<WmsContainerDto>> GetListAsync(GetWmsContainerInput input)
    {
        Check.NotNull(input, nameof(input));
@@ -40,11 +43,40 @@
            input.Sorting = nameof(WmsContainer.Sort);
        }
        var specification = new WmsContainerSpecification(input.Name);
        var count = await _wmscontainerRepository.GetCountAsync(input.Filter, specification);
        var list = await _wmscontainerRepository.GetListAsync(input.Sorting, input.MaxResultCount,  input.SkipCount, input.Filter, specification);
        #region 动态构造查询条件
        //动态构造查询条件
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var count = await _wmscontainerRepository.GetCountAsync(whereConditions);
        var list = await _wmscontainerRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
        return new PagedResultDto<WmsContainerDto>(count, ObjectMapper.Map<List<WmsContainer>, List<WmsContainerDto>>(list));
    }
    /// <summary>
    /// 动态构造查询条件
    /// </summary>
    /// <param name="input">输入参数</param>
    /// <returns></returns>
    private FunReturnResultModel<Expression<Func<WmsContainer, bool>>> DynamicGetQueryParams(GetWmsContainerInput input)
    {
        //动态构造查询条件
        var whereConditions = WhereConditionsExtensions.GetWhereConditions<WmsContainer, GetWmsContainerInput>(input);
        if (!whereConditions.IsSuccess)
        {
            throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg);
        }
        //也可再次自定义构建查询条件
        Expression<Func<WmsContainer, bool>> extendExpression = a => a.IsDeleted == false;
        // 使用 System.Linq.PredicateBuilder 的 And
        var pres = (System.Linq.Expressions.Expression<Func<WmsContainer, bool>>)(whereConditions.data);
        whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression);
        return whereConditions;
    }
    /// <inheritdoc />
@@ -52,17 +84,17 @@
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var exist = await _wmscontainerRepository.NameExistAsync(input.Name);
        var exist = await _wmscontainerRepository.NameExistAsync(input.ContainerNo);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.Name]);
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.ContainerNo]);
        }
        var maxSort = await _wmscontainerRepository.GetMaxSortAsync();
        var sort = input.Sort ?? maxSort;
        var wmscontainer = new WmsContainer(GuidGenerator.Create(), input.Code, input.Name, sort, input.Remark);
        var wmscontainer = ObjectMapper.Map<WmsContainerCreateDto,WmsContainer>(input);
        input.MapExtraPropertiesTo(wmscontainer, MappingPropertyDefinitionChecks.None);
        wmscontainer.Sort = sort;
        await _wmscontainerRepository.InsertAsync(wmscontainer);
        if (input.Sort.HasValue && wmscontainer.Sort != maxSort)
@@ -79,16 +111,26 @@
        await CheckCreateOrUpdateDtoAsync(input);
        var wmscontainer = await _wmscontainerRepository.GetAsync(id);
        var exist = await _wmscontainerRepository.NameExistAsync(input.Name, wmscontainer.Id);
        var exist = await _wmscontainerRepository.NameExistAsync(input.ContainerNo, wmscontainer.Id);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.Name]);
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.ContainerNo]);
        }
        wmscontainer.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
        input.MapExtraPropertiesTo(wmscontainer, MappingPropertyDefinitionChecks.None);
        wmscontainer.Update(input.Code, input.Name, input.Remark);
        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);
@@ -107,21 +149,21 @@
                var wmscontainer = await _wmscontainerRepository.FindAsync(id);
                if (wmscontainer != null)
                {
                    var name = wmscontainer.Name + WmsContainerConsts.CloneTag;
                    var containerNo = wmscontainer.ContainerNo + WmsContainerConsts.CloneTag;
                    var notExist = false;
                    while (!notExist)
                    {
                        var exist = await _wmscontainerRepository.NameExistAsync(name);
                        if (exist || wmscontainers.Any(x => x.Name == name))
                        var exist = await _wmscontainerRepository.NameExistAsync(containerNo);
                        if (exist || wmscontainers.Any(x => x.ContainerNo == containerNo))
                        {
                            name += WmsContainerConsts.CloneTag;
                            containerNo += WmsContainerConsts.CloneTag;
                            continue;
                        }
                        notExist = true;
                    }
                    wmscontainer = await _wmscontainerRepository.InsertAsync(wmscontainer.Clone(GuidGenerator.Create(), name, sort++));
                    //wmscontainer = await _wmscontainerRepository.InsertAsync(wmscontainer.Clone(GuidGenerator.Create(), containerNo, sort++));
                    wmscontainers.Add(wmscontainer);
                }
            }
@@ -148,7 +190,7 @@
    /// <inheritdoc />
    public virtual async Task AdjustSortAsync(Guid id, int sort)
    {
        var list = await _wmscontainerRepository.GetListAsync(nameof(WmsContainer.Sort));
        var list = await _wmscontainerRepository.GetListAsync(null,nameof(WmsContainer.Sort));
        if (list != null && list.Any())
        {
            var initSort = 1;
@@ -192,7 +234,7 @@
            #region 导入校验
            // 判断名称是否重复,并输出第几行重复
            var duplicateWmsContainers = wmscontainers.GroupBy(x => x.Name).Where(x => x.Count() > 1).ToList();
            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}  名称重复");
@@ -204,24 +246,32 @@
            foreach (var wmscontainer in wmscontainers)
            {
                if (wmscontainer.Code.IsNullOrWhiteSpace() && wmscontainer.Name.IsNullOrWhiteSpace())
                if (wmscontainer.ContainerNo.IsNullOrWhiteSpace() && wmscontainer.ContainerNo.IsNullOrWhiteSpace())
                {
                    continue;
                }
                if (wmscontainer.Name.IsNullOrWhiteSpace())
                if (wmscontainer.ContainerNo.IsNullOrWhiteSpace())
                {
                    var errorMsg = $"导入失败!配置,第{wmscontainer.RowIndex}行:WmsContainer名称不能为空";
                    throw new UserFriendlyException(errorMsg);
                }
                var oldWmsContainer = await _wmscontainerRepository.FindByNameAsync(wmscontainer.Name);
                var oldWmsContainer = await _wmscontainerRepository.FindByNameAsync(wmscontainer.ContainerNo);
                if (oldWmsContainer != null)
                {
                    var wmscontainerUpdateDto = new WmsContainerUpdateDto
                    {
                        Code = wmscontainer.Code,
                        Name = wmscontainer.Name,
                        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,
                    };
@@ -231,9 +281,17 @@
                {
                    var wmscontainerCreateDto = new WmsContainerCreateDto
                    {
                        Code = wmscontainer.Code,
                        Name = wmscontainer.Name,
                        Remark = wmscontainer.Remark,
                        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));
@@ -271,7 +329,12 @@
    }
    /// <inheritdoc />
    public async Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWmsContainersInput input)
    /// <summary>
    /// 导出托盘管理
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public async Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWmsContainerInput input)
    {
        Check.NotNull(input, nameof(input));
@@ -280,16 +343,22 @@
            input.Sorting = nameof(WmsContainer.Sort);
        }
        var specification = new WmsContainerSpecification(input.Name);
        var list = await _wmscontainerRepository.GetListAsync(input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter, specification, includeDetails: true);
        #region 动态构造查询条件
        //动态构造查询条件
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var list = await _wmscontainerRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true);
        var result = ObjectMapper.Map<List<WmsContainer>, List<WmsContainerDto>>(list);
        var sheets = new Dictionary<string, object>
        {
            ["配置"] = result.Select(x => x.GetExportData()).ToList(),
            ["配置"] = ExportHelper.ConvertListToExportData(result),
        };
        var fileName = result.Count > 1 ? "WmsContainer列表" : result.Count == 1 ? result.First()?.Name : "WmsContainer模版";
        var fileName = "托盘管理";
        return (sheets, fileName);
    }
@@ -300,8 +369,7 @@
    protected Task CheckCreateOrUpdateDtoAsync(WmsContainerCreateOrUpdateDtoBase input)
    {
        Check.NotNull(input, nameof(input));
        Check.NotNullOrWhiteSpace(input.Code, "编号", WmsContainerConsts.MaxCodeLength);
        Check.NotNullOrWhiteSpace(input.Name, "名称", WmsContainerConsts.MaxNameLength);
        Check.NotNullOrWhiteSpace(input.ContainerNo, "编号", WmsContainerConsts.MaxCodeLength);
        Check.Length(input.Remark, "备注", WmsContainerConsts.MaxRemarkLength);
        return Task.CompletedTask;
    }