3
schangxiang@126.com
2025-05-13 448177c5f07c2a63071fe3ebb5bb79894b0606ed
3
已修改19个文件
2160 ■■■■■ 文件已修改
Weben_CMS专用代码生成器/Code/MainForm.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Model/GenerateCodeParam.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Templete/AppService/AppService模板.txt 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Templete/AppService/IAppService模板.txt 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Templete/Controller模板.txt 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Templete/Domain/IRepository模板.txt 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Templete/Entity/CreateDto模板.txt 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Templete/Entity/UpdateDto模板.txt 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Templete/EntityFrameworkCore/EfCoreRepository模板.txt 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Utility/CommonHelper.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/常用.txt 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterial/WmsMaterialCreateDto.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterial/WmsMaterialUpdateDto.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsMaterialAppService.cs 114 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsMaterialAppService.cs 759 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterial/IWmsMaterialRepository.cs 109 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Repositories/EfCoreWmsMaterialRepository.cs 352 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms/Controller/WmsMaterialController.cs 327 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms/Resources/Templates/WmsMaterial导出模板.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/MainForm.cs
@@ -241,7 +241,8 @@
                    EntityInstanceName = tableAlias,
                    LikeQueryAttrs = _tb_LikeQueryAttrs,
                    LikeQueryAttrsName = _tb_LikeQueryAttrsName,
                    ValidateRepeatName = this.tb_ValidateRepeatName.Text
                    ValidateRepeatName = this.tb_ValidateRepeatName.Text,
                    TableName = tableName
                };
                //处理枚举类型
                List<EnumModel> enumList = new List<EnumModel>();
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Model/GenerateCodeParam.cs
@@ -53,6 +53,12 @@
        /// </summary>
        public List<ColumnModel> ColumnNameList { get; set; } = new List<ColumnModel>();
        /// <summary>
        /// è¡¨å
        /// </summary>
        public string TableName { get; set; }
        /// <summary>
        /// å®žä½“名称
        /// </summary>
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Templete/AppService/AppServiceÄ£°å.txt
@@ -1,4 +1,4 @@
using CMS.Plugin.$NameSpacePath$.Application.Contracts.Dtos.$EntityName$;
using CMS.Plugin.$NameSpacePath$.Application.Contracts.Dtos.$EntityName$;
using CMS.Plugin.$NameSpacePath$.Application.Contracts.Services;
using CMS.Plugin.$NameSpacePath$.Domain.Shared;
using CmsQueryExtensions;
@@ -10,37 +10,38 @@
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
using Volo.Abp.ObjectMapping;
using CmsQueryExtensions.Entitys;
namespace CMS.Plugin.$NameSpacePath$.Application.Implements;
/// <summary>
/// $ChinaComment$应用服务
/// $ChinaComment$应用服务
/// </summary>
public class $EntityName$AppService : CMSPluginAppService, I$EntityName$AppService
{
    private readonly I$EntityName$Repository $EntityInstanceName$Repository;
    private readonly I$EntityName$Repository _$EntityInstanceName$Repository;
    /// <summary>
    /// Initializes a new instance of the <see cref="$EntityName$AppService"/> class.
    /// </summary>
    /// <param name="$EntityName$Repository">The task job repository.</param>
    public $EntityName$AppService(I$EntityName$Repository _$EntityName$Repository)
    public $EntityName$AppService(I$EntityName$Repository $EntityInstanceName$Repository)
    {
        $EntityInstanceName$Repository = _$EntityName$Repository;
        _$EntityInstanceName$Repository = $EntityInstanceName$Repository;
    }
    /// <summary>
    /// èŽ·å–æŒ‡å®š$ChinaComment$
    /// èŽ·å–æŒ‡å®š$ChinaComment$
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public virtual async Task<$EntityName$Dto> GetAsync(Guid id)
    {
        return ObjectMapper.Map<$EntityName$, $EntityName$Dto>(await $EntityInstanceName$Repository.GetAsync(id));
        return ObjectMapper.Map<$EntityName$, $EntityName$Dto>(await _$EntityInstanceName$Repository.GetAsync(id));
    }
    /// <summary>
    /// åˆ†é¡µèŽ·å–$ChinaComment$
    /// åˆ†é¡µèŽ·å–$ChinaComment$
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
@@ -53,36 +54,36 @@
            input.Sorting = nameof($EntityName$.Sort);
        }
        #region åŠ¨æ€æž„é€ æŸ¥è¯¢æ¡ä»¶
        #region åŠ¨æ€æž„é€ æŸ¥è¯¢æ¡ä»¶
        //动态构造查询条件
        //动态构造查询条件
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var count = await $EntityInstanceName$Repository.GetCountAsync(whereConditions);
        var list = await $EntityInstanceName$Repository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
        var count = await _$EntityInstanceName$Repository.GetCountAsync(whereConditions);
        var list = await _$EntityInstanceName$Repository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
        return new PagedResultDto<$EntityName$Dto>(count, ObjectMapper.Map<List<$EntityName$>, List<$EntityName$Dto>>(list));
    }
    /// <summary> 
    /// åŠ¨æ€æž„é€ æŸ¥è¯¢æ¡ä»¶
    /// åŠ¨æ€æž„é€ æŸ¥è¯¢æ¡ä»¶
    /// </summary> 
    /// <param name="input">输入参数</param>
    /// <param name="input">输入参数</param>
    /// <returns></returns> 
    private FunReturnResultModel<Expression<Func<$EntityName$, bool>>> DynamicGetQueryParams(Get$EntityName$Input input)
    {
        //动态构造查询条件
        //动态构造查询条件
        var whereConditions = WhereConditionsExtensions.GetWhereConditions<$EntityName$, Get$EntityName$Input>(input);
        if (!whereConditions.IsSuccess)
        {
            throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg);
            throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg);
        }
        //也可再次自定义构建查询条件
        //也可再次自定义构建查询条件
        Expression<Func<$EntityName$, bool>> extendExpression = a => a.IsDeleted == false;
        // ä½¿ç”¨ System.Linq.PredicateBuilder çš„ And
        // ä½¿ç”¨ System.Linq.PredicateBuilder çš„ And
        var pres = (System.Linq.Expressions.Expression<Func<$EntityName$, bool>>)(whereConditions.data);
        whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression);
@@ -90,7 +91,7 @@
    }
    /// <summary>
    /// æ–°å»º$ChinaComment$
    /// æ–°å»º$ChinaComment$
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
@@ -99,20 +100,21 @@
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var exist = await $EntityInstanceName$Repository.NameExistAsync(input.$ValidateRepeatName$);
        var exist = await _$EntityInstanceName$Repository.NameExistAsync(input.$ValidateRepeatName$);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.$ValidateRepeatName$]);
        }
        var maxSort = await $EntityInstanceName$Repository.GetMaxSortAsync();
        var maxSort = await _$EntityInstanceName$Repository.GetMaxSortAsync();
        var sort = input.Sort ?? maxSort;
        var insertObj = ObjectMapper.Map<$EntityName$CreateDto, $EntityName$>(input);
        insertObj.Sort = sort;
        input.MapExtraPropertiesTo(insertObj, MappingPropertyDefinitionChecks.None);
        await $EntityInstanceName$Repository.InsertAsync(insertObj);
        insertObj.CreatorName = input.CreatorName;//创建人
        await _$EntityInstanceName$Repository.InsertAsync(insertObj);
        //if (input.Sort.HasValue && insertObj.Sort != maxSort)
        //{
@@ -123,7 +125,7 @@
    }
    /// <summary>
    /// æ›´æ–°$ChinaComment$
    /// æ›´æ–°$ChinaComment$
    /// </summary>
    /// <param name="id"></param>
    /// <param name="input"></param>
@@ -133,8 +135,8 @@
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var updateObj = await $EntityInstanceName$Repository.GetAsync(id);
        var exist = await $EntityInstanceName$Repository.NameExistAsync(input.$ValidateRepeatName$, updateObj.Id);
        var updateObj = await _$EntityInstanceName$Repository.GetAsync(id);
        var exist = await _$EntityInstanceName$Repository.NameExistAsync(input.$ValidateRepeatName$, updateObj.Id);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.$ValidateRepeatName$]);
@@ -145,32 +147,34 @@
        $UpdateAttributes$
        await $EntityInstanceName$Repository.UpdateAsync(updateObj);
        updateObj.LastModifierName = input.LastModifierName;//修改人
        await _$EntityInstanceName$Repository.UpdateAsync(updateObj);
        return ObjectMapper.Map<$EntityName$, $EntityName$Dto>(updateObj);
    }
    /// <summary>
    /// å…‹éš†$ChinaComment$
    /// å…‹éš†$ChinaComment$
    /// </summary>
    /// <param name="ids"></param>
    /// <returns></returns>
    public async Task<List<$EntityName$Dto>> CloneAsync(IEnumerable<Guid> ids)
    public async Task<List<$EntityName$Dto>> CloneAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser)
    {
        //var $EntityInstanceName$s = new List<$EntityName$>();
        //if (ids != null)
        //{
        //    var sort = await $EntityInstanceName$Repository.GetMaxSortAsync();
        //    var sort = await _$EntityInstanceName$Repository.GetMaxSortAsync();
        //    foreach (var id in ids)
        //    {
        //        var $EntityName$ = await $EntityInstanceName$Repository.FindAsync(id);
        //        var $EntityName$ = await _$EntityInstanceName$Repository.FindAsync(id);
        //        if ($EntityName$ != null)
        //        {
        //            var name = $EntityName$.Name + $EntityName$Consts.CloneTag;
        //            var notExist = false;
        //            while (!notExist)
        //            {
        //                var exist = await $EntityInstanceName$Repository.NameExistAsync(name);
        //                var exist = await _$EntityInstanceName$Repository.NameExistAsync(name);
        //                if (exist || $EntityInstanceName$s.Any(x => x.Name == name))
        //                {
        //                    name += $EntityName$Consts.CloneTag;
@@ -180,7 +184,7 @@
        //                notExist = true;
        //            }
        //            //$EntityName$ = await $EntityInstanceName$Repository.InsertAsync($EntityName$.Clone(GuidGenerator.Create(), name, sort++));
        //            //$EntityName$ = await _$EntityInstanceName$Repository.InsertAsync($EntityName$.Clone(GuidGenerator.Create(), name, sort++));
        //            $EntityInstanceName$s.Add($EntityName$);
        //        }
        //    }
@@ -191,21 +195,21 @@
    }
    /// <summary>
    /// åˆ é™¤å•个$ChinaComment$
    /// åˆ é™¤å•个$ChinaComment$
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public virtual Task DeleteAsync(Guid id)
    {
        return $EntityInstanceName$Repository.DeleteAsync(id);
        return _$EntityInstanceName$Repository.DeleteAsync(id);
    }
    /// <summary>
    /// åˆ é™¤å¤šä¸ª$ChinaComment$
    /// åˆ é™¤å¤šä¸ª$ChinaComment$
    /// </summary>
    /// <param name="ids"></param>
    /// <returns></returns>
    public async Task DeleteManyAsync(IEnumerable<Guid> ids)
    public async Task DeleteManyAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser)
    {
        foreach (var id in ids)
        {
@@ -213,15 +217,37 @@
        }
    }
     /// <summary>
    /// ç‰©ç†åˆ é™¤$ChinaComment$
    /// </summary>
    /// <param name="id">主键ID</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public virtual async Task DeletePermanentlyAsync(Guid id, MyCurrentUser myCurrentUser, CancellationToken cancellationToken = default)
    {
        _$EntityInstanceName$Repository.DeletePermanentlyAsync(id);
    }
    /// <summary>
    /// è°ƒæ•´æŽ’序$ChinaComment$
    /// æ‰¹é‡ç‰©ç†åˆ é™¤$ChinaComment$(直接删除,不软删除)
    /// </summary>
    /// <param name="ids">要删除的主键ID列表</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public virtual async Task BatchDeletePermanentlyAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser, CancellationToken cancellationToken = default)
    {
        _$EntityInstanceName$Repository.BatchDeletePermanentlyAsync(ids);
    }
    /// <summary>
    /// è°ƒæ•´æŽ’序$ChinaComment$
    /// </summary>
    /// <param name="id"></param>
    /// <param name="sort"></param>
    /// <returns></returns>
    public virtual async Task AdjustSortAsync(Guid id, int sort)
    {
        var list = await $EntityInstanceName$Repository.GetListAsync(null, nameof($EntityName$.Sort));
        var list = await _$EntityInstanceName$Repository.GetListAsync(null, nameof($EntityName$.Sort));
        if (list != null && list.Any())
        {
            var initSort = 1;
@@ -248,16 +274,16 @@
            }
        }
        await $EntityInstanceName$Repository.UpdateManyAsync(list);
        await _$EntityInstanceName$Repository.UpdateManyAsync(list);
    }
    /// <summary>
    /// å¯¼å…¥$ChinaComment$
    /// å¯¼å…¥$ChinaComment$
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public async Task ImportAsync($EntityName$sImportModel input)
    public async Task ImportAsync($EntityName$sImportModel input, MyCurrentUser myCurrentUser)
    {
        Check.NotNull(input, nameof(input));
@@ -267,14 +293,14 @@
        if (importItems != null && importItems.Any())
        {
            #region å¯¼å…¥æ ¡éªŒ
            #region å¯¼å…¥æ ¡éªŒ
            // åˆ¤æ–­åç§°æ˜¯å¦é‡å¤ï¼Œå¹¶è¾“出第几行重复
            // åˆ¤æ–­åç§°æ˜¯å¦é‡å¤ï¼Œå¹¶è¾“出第几行重复
            var duplicate$EntityName$s = importItems.GroupBy(x => x.$ValidateRepeatName$).Where(x => x.Count() > 1).ToList();
            if (duplicate$EntityName$s?.Any() == true)
            {
                var duplicate$EntityName$Msgs = duplicate$EntityName$s.Select(x => $"第 {string.Join(",", x.Select(x => x.RowIndex))} è¡Œï¼š{x.Key}  åç§°é‡å¤");
                var errorMsg = $"导入失败!配置, {string.Join(",", duplicate$EntityName$Msgs)},终止导入";
                var duplicate$EntityName$Msgs = duplicate$EntityName$s.Select(x => $"第 {string.Join(",", x.Select(x => x.RowIndex))} è¡Œï¼š{x.Key}  åç§°é‡å¤");
                var errorMsg = $"导入失败!配置, {string.Join(",", duplicate$EntityName$Msgs)},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
@@ -289,11 +315,11 @@
                if (impItem.$ValidateRepeatName$.IsNullOrWhiteSpace())
                {
                    var errorMsg = $"导入失败!配置,第{impItem.RowIndex}行:$EntityName$名称不能为空";
                    var errorMsg = $"导入失败!配置,第{impItem.RowIndex}行:$EntityName$名称不能为空";
                    throw new UserFriendlyException(errorMsg);
                }
                var old$EntityName$ = await $EntityInstanceName$Repository.FindByNameAsync(impItem.$ValidateRepeatName$);
                var old$EntityName$ = await _$EntityInstanceName$Repository.FindByNameAsync(impItem.$ValidateRepeatName$);
                if (old$EntityName$ != null)
                {
                    var $EntityInstanceName$UpdateDto = new $EntityName$UpdateDto
@@ -315,37 +341,39 @@
            }
        }
        // æ–°å¢ž
        // æ–°å¢ž
        foreach (var $EntityInstanceName$Dto in $EntityInstanceName$CreateDtos)
        {
            try
            {
                $EntityInstanceName$Dto.Item.CreatorName = myCurrentUser.UserAccount;//创建人
                await CreateAsync($EntityInstanceName$Dto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{$EntityInstanceName$Dto.RowIndex}行:{e.Message},终止导入";
                var errorMsg = $"导入失败!配置,第{$EntityInstanceName$Dto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
        // æ›´æ–°
        // æ›´æ–°
        foreach (var $EntityInstanceName$Dto in $EntityInstanceName$UpdateDtos)
        {
            try
            {
                $EntityInstanceName$Dto.Item.LastModifierName = myCurrentUser.UserAccount;//修改人
                await UpdateAsync($EntityInstanceName$Dto.Id, $EntityInstanceName$Dto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{$EntityInstanceName$Dto.RowIndex}行:{e.Message},终止导入";
                var errorMsg = $"导入失败!配置,第{$EntityInstanceName$Dto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
    }
    /// <summary>
    /// å¯¼å‡º$ChinaComment$
    /// å¯¼å‡º$ChinaComment$
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
@@ -358,20 +386,20 @@
            input.Sorting = nameof($EntityName$.Sort);
        }
        #region åŠ¨æ€æž„é€ æŸ¥è¯¢æ¡ä»¶
        #region åŠ¨æ€æž„é€ æŸ¥è¯¢æ¡ä»¶
        //动态构造查询条件
        //动态构造查询条件
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var list = await $EntityInstanceName$Repository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true);
        var list = await _$EntityInstanceName$Repository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true);
        var result = ObjectMapper.Map<List<$EntityName$>, List<$EntityName$Dto>>(list);
        var sheets = new Dictionary<string, object>
        {
            ["配置"] = ExportHelper.ConvertListToExportData(result),
            ["配置"] = ExportHelper.ConvertListToExportData(result),
        };
        var fileName = "$PageMenuName$";
@@ -379,7 +407,7 @@
    }
    /// <summary>
    /// æ ¡éªŒ$ChinaComment$,当新建或更新时
    /// æ ¡éªŒ$ChinaComment$,当新建或更新时
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
@@ -389,4 +417,28 @@
        $UpdateAttributesForCheckCreateOrUpdateDtoAsync$
        return Task.CompletedTask;
    }
     /// <summary>
    /// æ ¹æ®æ¡ä»¶èŽ·å–$ChinaComment$列表
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public async Task<List<$EntityName$>> GetListByFilterAsync(Expression<Func<$EntityName$, bool>> whereConditions, CancellationToken cancellationToken = default)
    {
        return await _$EntityInstanceName$Repository.GetListByFilterAsync(whereConditions);
    }
    /// <summary>
    ///  æ ¹æ®æ¡ä»¶èŽ·å–å•ä¸ª$ChinaComment$
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="isMultipleThrowException">是否查询出多条就报错</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public async Task<$EntityName$> GetSingleByFilterAsync(Expression<Func<$EntityName$, bool>> whereConditions, bool is​MultipleThrowException = false, CancellationToken cancellationToken = default)
    {
        return await _$EntityInstanceName$Repository.GetSingleByFilterAsync(whereConditions, is​MultipleThrowException);
    }
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Templete/AppService/IAppServiceÄ£°å.txt
@@ -1,29 +1,49 @@
using CMS.Plugin.$NameSpacePath$.Application.Contracts.Dtos.$EntityName$;
using CMS.Plugin.$NameSpacePath$.Application.Contracts.Dtos.$EntityName$;
using Volo.Abp.Application.Services;
using CmsQueryExtensions.Entitys;
using System.Linq.Expressions;
using CMS.Plugin.$NameSpacePath$.Domain.$EntityName$;
namespace CMS.Plugin.$NameSpacePath$.Application.Contracts.Services;
/// <summary>
/// $ChinaComment$应用服务接口
/// $ChinaComment$应用服务接口
/// </summary>
public interface I$EntityName$AppService : ICrudAppService<$EntityName$Dto, Guid, Get$EntityName$Input, $EntityName$CreateDto, $EntityName$UpdateDto>
{
    /// <summary>
    /// å…‹éš†$ChinaComment$
    /// å…‹éš†$ChinaComment$
    /// </summary>
    /// <param name="ids"></param>
    /// <returns></returns>
    Task<List<$EntityName$Dto>> CloneAsync(IEnumerable<Guid> ids);
    Task<List<$EntityName$Dto>> CloneAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser);
    /// <summary>
    /// åˆ é™¤$ChinaComment$
    /// åˆ é™¤$ChinaComment$
    /// </summary>
    /// <param name="ids"></param>
    /// <returns></returns>
    Task DeleteManyAsync(IEnumerable<Guid> ids);
    Task DeleteManyAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser);
    /// <summary>
    /// è°ƒæ•´æŽ’序$ChinaComment$
    /// ç‰©ç†åˆ é™¤$ChinaComment$
    /// </summary>
    /// <param name="id">主键ID</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task DeletePermanentlyAsync(Guid id, MyCurrentUser myCurrentUser, CancellationToken cancellationToken = default);
    /// <summary>
    /// æ‰¹é‡ç‰©ç†åˆ é™¤$ChinaComment$(直接删除,不软删除)
    /// </summary>
    /// <param name="ids">要删除的主键ID列表</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task BatchDeletePermanentlyAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser, CancellationToken cancellationToken = default);
    /// <summary>
    /// è°ƒæ•´æŽ’序$ChinaComment$
    /// </summary>
    /// <param name="id"></param>
    /// <param name="sort"></param>
@@ -31,16 +51,35 @@
    Task AdjustSortAsync(Guid id, int sort);
    /// <summary>
    /// å¯¼å…¥$ChinaComment$
    /// å¯¼å…¥$ChinaComment$
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task ImportAsync($EntityName$sImportModel input);
    Task ImportAsync($EntityName$sImportModel input, MyCurrentUser myCurrentUser);
    /// <summary>
    /// å¯¼å‡º$ChinaComment$
    /// å¯¼å‡º$ChinaComment$
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(Get$EntityName$Input input);
    /// <summary>
    /// æ ¹æ®æ¡ä»¶èŽ·å–$ChinaComment$列表
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<List<$EntityName$>> GetListByFilterAsync(Expression<Func<$EntityName$, bool>> whereConditions, CancellationToken cancellationToken = default);
    /// <summary>
    ///  æ ¹æ®æ¡ä»¶èŽ·å–å•ä¸ª$ChinaComment$
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="isMultipleThrowException">是否查询出多条就报错</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    Task<$EntityName$> GetSingleByFilterAsync(Expression<Func<$EntityName$, bool>> whereConditions, bool is​MultipleThrowException = false, CancellationToken cancellationToken = default);
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Templete/ControllerÄ£°å.txt
@@ -1,5 +1,6 @@
using Ao.Lang;
using CMS.Extensions.Abp.AspNetCore.Mvc.Filters;
using CMS.Framework.AspNetCore.Users;
using CMS.Plugin.$NameSpacePath$.Application.Contracts.Dtos.$EntityName$;
using CMS.Plugin.$NameSpacePath$.Application.Contracts.Services;
using Microsoft.AspNetCore.Authorization;
@@ -9,6 +10,7 @@
using System.Reflection;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using CmsQueryExtensions.Entitys;
namespace CMS.Plugin.$NameSpacePath$.Controller
{
@@ -24,20 +26,22 @@
    public class $EntityName$Controller : ControllerBase
    {
        private readonly I$EntityName$AppService _$EntityInstanceName$AppService;
        private readonly ICurrentUser _currentUser;
        /// <summary>
        /// Initializes a new instance of the <see cref="$EntityName$Controller"/> class.
        /// </summary>
        /// <param name="$EntityInstanceName$AppService">The $EntityInstanceName$ application service.</param>
        public $EntityName$Controller(I$EntityName$AppService $EntityInstanceName$AppService)
        public $EntityName$Controller(I$EntityName$AppService $EntityInstanceName$AppService, ICurrentUser currentUser)
        {
            _$EntityInstanceName$AppService = $EntityInstanceName$AppService;
            _currentUser = currentUser;
        }
        /// <summary>
        /// èŽ·å–$ChinaComment$
        /// </summary>
        /// <param name="id">标识符.</param>
        /// <param name="id">主键ID</param>
        /// <returns></returns>
        [HttpGet]
        [Route("{id}")]
@@ -49,7 +53,7 @@
        /// <summary>
        /// åˆ†é¡µèŽ·å–$ChinaComment$的列表.
        /// </summary>
        /// <param name="input">输入.</param>
        /// <param name="input">查询参数</param>
        /// <returns></returns>
        [HttpGet]
        [Route("Page")]
@@ -61,71 +65,90 @@
        /// <summary>
        /// åˆ›å»º$ChinaComment$
        /// </summary>
        /// <param name="input">输入.</param>
        /// <param name="input">创建参数</param>
        /// <returns></returns>
        //[Authorize]
        [HttpPost]
        public virtual Task<$EntityName$Dto> CreateAsync($EntityName$CreateDto input)
        {
            input.CreatorName = _currentUser.UserAccount;//创建人
            return _$EntityInstanceName$AppService.CreateAsync(input);
        }
        /// <summary>
        /// æ›´æ–°$ChinaComment$
        /// </summary>
        /// <param name="id">标识符.</param>
        /// <param name="input">输入.</param>
        /// <param name="id">主键ID</param>
        /// <param name="input">更新参数</param>
        /// <returns></returns>
        //[Authorize]
        [HttpPut]
        [Route("{id}")]
        public virtual Task<$EntityName$Dto> UpdateAsync(Guid id, $EntityName$UpdateDto input)
        {
            input.LastModifierName = _currentUser.UserAccount;//修改人
            return _$EntityInstanceName$AppService.UpdateAsync(id, input);
        }
        /// <summary>
        /// å…‹éš†$ChinaComment$
        /// </summary>
        /// <param name="ids">Id集合.</param>
        /// <param name="ids">Id集合</param>
        /// <returns></returns>
        //[Authorize]
        [HttpPost]
        [Route("Clone")]
        public virtual Task<List<$EntityName$Dto>> CloneAsync([FromBody] IEnumerable<Guid> ids)
        {
            return _$EntityInstanceName$AppService.CloneAsync(ids);
            MyCurrentUser myCurrentUser = new MyCurrentUser()
            {
                UserAccount = _currentUser.UserAccount,
                UserId = _currentUser.UserId
            };
            return _$EntityInstanceName$AppService.CloneAsync(ids, myCurrentUser);
        }
        /// <summary>
        /// åˆ é™¤$ChinaComment$
        /// </summary>
        /// <param name="id">标识符.</param>
        /// <param name="id">主键ID</param>
        /// <returns></returns>
        //[Authorize]
        [HttpDelete]
        [Route("{id}")]
        public virtual Task DeleteAsync(Guid id)
        {
            return _$EntityInstanceName$AppService.DeleteAsync(id);
            MyCurrentUser myCurrentUser = new MyCurrentUser()
            {
                UserAccount = _currentUser.UserAccount,
                UserId = _currentUser.UserId
            };
            //return _wmsMaterialAppService.DeleteAsync(id,myCurrentUser);//逻辑删除
            return _wmsMaterialAppService.DeletePermanentlyAsync(id, myCurrentUser);//物理删除
        }
        /// <summary>
        /// æ‰¹é‡åˆ é™¤$ChinaComment$
        /// </summary>
        /// <param name="ids">The ids.</param>
        /// <param name="ids">主键ID集合</param>
        /// <returns></returns>
        //[Authorize]
        [HttpDelete]
        public virtual Task DeleteAsync([FromBody] IEnumerable<Guid> ids)
        {
            return _$EntityInstanceName$AppService.DeleteManyAsync(ids);
            MyCurrentUser myCurrentUser = new MyCurrentUser()
            {
                UserAccount = _currentUser.UserAccount,
                UserId = _currentUser.UserId
            };
            // return _wmsMaterialAppService.DeleteManyAsync(ids,myCurrentUser);//逻辑删除
            return _wmsMaterialAppService.BatchDeletePermanentlyAsync(ids, myCurrentUser);//物理删除
        }
        /// <summary>
        /// è°ƒæ•´æŽ’序$ChinaComment$
        /// </summary>
        /// <param name="id">标识符.</param>
        /// <param name="id">主键ID</param>
        /// <returns></returns>
        [HttpPut]
        [Route("{id}/AdjustSort/{sort}")]
@@ -155,10 +178,15 @@
                throw new UserFriendlyException("请检查导入的表格");
            }
            MyCurrentUser myCurrentUser = new MyCurrentUser()
            {
                UserAccount = _currentUser.UserAccount,
                UserId = _currentUser.UserId
            };
            await _$EntityInstanceName$AppService.ImportAsync(new $EntityName$sImportModel
            {
                $EntityName$s = $EntityInstanceName$Rows,
            });
           },myCurrentUser);
            return Ok();
        }
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Templete/Domain/IRepositoryÄ£°å.txt
@@ -1,16 +1,16 @@
using CmsQueryExtensions.Extension;
using CmsQueryExtensions.Extension;
using System.Linq.Expressions;
using Volo.Abp.Domain.Repositories;
namespace CMS.Plugin.$NameSpacePath$.Domain.$EntityName$;
/// <summary>
/// $ChinaComment$仓储
/// $ChinaComment$仓储
/// </summary>
public interface I$EntityName$Repository : IBasicRepository<$EntityName$, Guid>
{
    /// <summary>
    /// æŒ‰ç…§åç§°æŸ¥æ‰¾$ChinaComment$
    /// æŒ‰ç…§åç§°æŸ¥æ‰¾$ChinaComment$
    /// </summary>
    /// <param name="name"></param>
    /// <param name="cancellationToken"></param>
@@ -18,7 +18,7 @@
    Task<$EntityName$> FindByNameAsync(string name, CancellationToken cancellationToken = default);
    /// <summary>
    /// éªŒè¯åç§°æ˜¯å¦å­˜åœ¨$ChinaComment$
    /// éªŒè¯åç§°æ˜¯å¦å­˜åœ¨$ChinaComment$
    /// </summary>
    /// <param name="name"></param>
    /// <param name="id"></param>
@@ -26,13 +26,13 @@
    Task<bool> NameExistAsync(string name, Guid? id = null);
    /// <summary>
    /// èŽ·å–æœ€å¤§æŽ’åº$ChinaComment$
    /// èŽ·å–æœ€å¤§æŽ’åº$ChinaComment$
    /// </summary>
    /// <returns></returns>
    Task<int> GetMaxSortAsync();
    /// <summary>
    /// èŽ·å–åˆ†é¡µåˆ—è¡¨$ChinaComment$
    /// èŽ·å–åˆ†é¡µåˆ—è¡¨$ChinaComment$
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="sorting"></param>
@@ -44,10 +44,45 @@
    Task<List<$EntityName$>> GetListAsync(FunReturnResultModel<Expression<Func<$EntityName$, bool>>> whereConditions, string sorting = null, int maxResultCount = int.MaxValue, int skipCount = 0, bool includeDetails = false, CancellationToken cancellationToken = default);
    /// <summary>
    /// èŽ·å–æ€»æ•°$ChinaComment$
    /// èŽ·å–æ€»æ•°$ChinaComment$
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<long> GetCountAsync(FunReturnResultModel<Expression<Func<$EntityName$, bool>>> whereConditions, CancellationToken cancellationToken = default);
    /// <summary>
    /// ç‰©ç†åˆ é™¤$ChinaComment$
    /// </summary>
    /// <param name="id">主键ID</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task DeletePermanentlyAsync(Guid id, CancellationToken cancellationToken = default);
    /// <summary>
    /// æ‰¹é‡ç‰©ç†åˆ é™¤$ChinaComment$(直接删除,不软删除)
    /// </summary>
    /// <param name="ids">要删除的主键ID列表</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task BatchDeletePermanentlyAsync(IEnumerable<Guid> ids, CancellationToken cancellationToken = default);
    /// <summary>
    /// æ ¹æ®æ¡ä»¶èŽ·å–$ChinaComment$列表
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<List<$EntityName$>> GetListByFilterAsync(Expression<Func<$EntityName$, bool>> whereConditions, CancellationToken cancellationToken = default);
    /// <summary>
    ///  æ ¹æ®æ¡ä»¶èŽ·å–å•ä¸ª$ChinaComment$
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="isMultipleThrowException">是否查询出多条就报错</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    Task<$EntityName$> GetSingleByFilterAsync(Expression<Func<$EntityName$, bool>> whereConditions, bool is​MultipleThrowException = false, CancellationToken cancellationToken = default);
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Templete/Entity/CreateDtoÄ£°å.txt
@@ -14,4 +14,9 @@
    /// æ˜¯å¦ç¦ç”¨
    /// </summary>
    public bool? IsDisabled { get; set; } = false;
    /// <summary>
    /// åˆ›å»ºäºº
    /// </summary>
    public string CreatorName { get; set; }
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Templete/Entity/UpdateDtoÄ£°å.txt
@@ -10,4 +10,9 @@
    /// å¹¶å‘戳
    /// </summary>
    public string ConcurrencyStamp { get; set; }
    /// <summary>
    /// ä¿®æ”¹äºº
    /// </summary>
    public string LastModifierName { get; set; }
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Templete/EntityFrameworkCore/EfCoreRepositoryÄ£°å.txt
@@ -1,9 +1,10 @@
using CMS.Plugin.$NameSpacePath$.Domain.$EntityName$;
using CMS.Plugin.$NameSpacePath$.Domain.$EntityName$;
using CMS.Plugin.$NameSpacePath$.EntityFrameworkCore.Extensions;
using CmsQueryExtensions.Extension;
using Microsoft.EntityFrameworkCore;
using System.Linq.Dynamic.Core;
using System.Linq.Expressions;
using Volo.Abp;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
@@ -11,7 +12,7 @@
namespace CMS.Plugin.$NameSpacePath$.EntityFrameworkCore.Repositories;
/// <summary>
/// $ChinaComment$仓储实现
/// $ChinaComment$仓储实现
/// </summary>
public class EfCore$EntityName$Repository : EfCoreRepository<ICMSPluginDbContext, $EntityName$, Guid>, I$EntityName$Repository
{
@@ -25,7 +26,7 @@
    }
    /// <summary>
    /// æŒ‰ç…§åç§°æŸ¥æ‰¾$ChinaComment$
    /// æŒ‰ç…§åç§°æŸ¥æ‰¾$ChinaComment$
    /// </summary>
    /// <param name="name"></param>
    /// <param name="cancellationToken"></param>
@@ -40,9 +41,9 @@
    }
    /// <summary>
    /// éªŒè¯åç§°æ˜¯å¦å­˜åœ¨$ChinaComment$
    /// éªŒè¯åç§°æ˜¯å¦å­˜åœ¨$ChinaComment$
    /// </summary>
    /// <param name="name">校验值</param>
    /// <param name="name">校验值</param>
    /// <param name="id"></param>
    /// <returns></returns>
    public async Task<bool> NameExistAsync(string name, Guid? id = null)
@@ -51,7 +52,7 @@
    }
    /// <summary>
    /// èŽ·å–æœ€å¤§æŽ’åº$ChinaComment$
    /// èŽ·å–æœ€å¤§æŽ’åº$ChinaComment$
    /// </summary>
    /// <returns></returns>
    public async Task<int> GetMaxSortAsync()
@@ -69,7 +70,7 @@
    }
    /// <summary>
    /// èŽ·å–åˆ†é¡µåˆ—è¡¨$ChinaComment$
    /// èŽ·å–åˆ†é¡µåˆ—è¡¨$ChinaComment$
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="sorting"></param>
@@ -90,7 +91,7 @@
    }
    /// <summary>
    /// èŽ·å–æ€»æ•°$ChinaComment$
    /// èŽ·å–æ€»æ•°$ChinaComment$
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
@@ -110,4 +111,105 @@
        return (await GetQueryableAsync())
            .Where(x => !x.IsDeleted).IncludeDetails();
    }
    /// <summary>
    /// ç‰©ç†åˆ é™¤$ChinaComment$
    /// </summary>
    /// <param name="id">主键ID</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public virtual async Task DeletePermanentlyAsync(Guid id, CancellationToken cancellationToken = default)
    {
        var entity = await (await GetDbSetAsync())
            .FirstOrDefaultAsync(x => x.Id == id && !x.IsDeleted, GetCancellationToken(cancellationToken));
        if (entity == null)
        {
            throw new Volo.Abp.Domain.Entities.EntityNotFoundException(typeof($EntityName$), id);
        }
        // 2. èŽ·å– DbContext å¹¶æ‰§è¡Œåˆ é™¤
        var dbContext = await GetDbContextAsync();
        // ç›´æŽ¥æ‰§è¡Œ SQL åˆ é™¤
        var sql = $"DELETE FROM $TableName$ WHERE Id ='{entity.Id.ToString()}'";
        await dbContext.Database.ExecuteSqlRawAsync(sql, cancellationToken);
    }
    /// <summary>
    /// æ‰¹é‡ç‰©ç†åˆ é™¤$ChinaComment$(直接删除,不软删除)
    /// </summary>
    /// <param name="ids">要删除的主键ID列表</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public virtual async Task BatchDeletePermanentlyAsync(IEnumerable<Guid> ids, CancellationToken cancellationToken = default)
    {
        // 1. æŸ¥è¯¢ç¬¦åˆæ¡ä»¶çš„实体(未软删除的记录)
        var entities = await (await GetDbSetAsync())
            .Where(x => ids.Contains(x.Id) && !x.IsDeleted)
            .ToListAsync(GetCancellationToken(cancellationToken));
        if (!entities.Any())
        {
            // å¦‚果没有需要删除的记录,直接返回(避免不必要的数据库操作)
            return;
        }
        // 2. èŽ·å– DbContext å¹¶æ‰§è¡Œæ‰¹é‡åˆ é™¤
        var dbContext = await GetDbContextAsync();
        var idsToDelete = entities.Select(e => e.Id).ToList();
        // ç›´æŽ¥æ‰§è¡Œ SQL åˆ é™¤
        var sql = $"DELETE FROM $TableName$ WHERE Id IN ({string.Join(",", idsToDelete.Select(id => $"'{id}'"))})";
        await dbContext.Database.ExecuteSqlRawAsync(sql, cancellationToken);
    }
    /// <summary>
    /// æ ¹æ®æ¡ä»¶èŽ·å–$ChinaComment$列表
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public async Task<List<$EntityName$>> GetListByFilterAsync(Expression<Func<$EntityName$, bool>> whereConditions, CancellationToken cancellationToken = default)
    {
        return await (await GetDbSetAsync())
            .WhereIf(whereConditions != null, whereConditions)
            .Where(x => !x.IsDeleted)
            .OrderByDescending(x => x.$OrderBy$)
            .ToListAsync(GetCancellationToken(cancellationToken));
    }
    /// <summary>
    ///  æ ¹æ®æ¡ä»¶èŽ·å–å•ä¸ª$ChinaComment$
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="isMultipleThrowException">是否查询出多条就报错</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public async Task<$EntityName$> GetSingleByFilterAsync(Expression<Func<$EntityName$, bool>> whereConditions, bool is​MultipleThrowException = false, CancellationToken cancellationToken = default)
    {
        if (is​MultipleThrowException)
        {
            var entitys = await (await GetDbSetAsync())
          .WhereIf(whereConditions != null, whereConditions)
          .Where(x => !x.IsDeleted)
          .OrderByDescending(x => x.$OrderBy$)
          .ToListAsync(GetCancellationToken(cancellationToken));
            if (entitys?.Count > 1)
            {
                throw new UserFriendlyException("查询到多条记录");
            }
            return entitys?.FirstOrDefault();
        }
        else
        {
            return await (await GetDbSetAsync())
          .WhereIf(whereConditions != null, whereConditions)
          .Where(x => !x.IsDeleted)
          .OrderByDescending(x => x.$OrderBy$)
          .FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
        }
    }
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Utility/CommonHelper.cs
@@ -72,6 +72,7 @@
            str = str.Replace("$EntityName$", param.EntityName);//实体类名
            str = str.Replace("$Modulelogo$", param.Modulelogo);//模块简写
            str = str.Replace("$EntityInstanceName$", param.EntityInstanceName);//实例名
            str = str.Replace("$TableName$", param.TableName);//表名
            //如果为空,系统默认所有字符串的展示列查询
            var str_LikeQueryAttrs = param.LikeQueryAttrs;
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/³£ÓÃ.txt
@@ -10,4 +10,9 @@
$EntityInstanceName$
$PageMenuInstanceName$
$PageMenuInstanceName$
$TableName$
$OrderBy$
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterial/WmsMaterialCreateDto.cs
@@ -13,10 +13,10 @@
    /// <summary> 
    /// æ˜¯å¦ç¦ç”¨ 
    /// </summary> 
    public bool? IsDisabled { get; set; } = false;
    /// <summary>
    /// åˆ›å»ºäºº
    /// </summary>
    public string CreatorName { get; set; }
    public bool? IsDisabled { get; set; } = false;
    /// <summary>
    /// åˆ›å»ºäºº
    /// </summary>
    public string CreatorName { get; set; }
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms.Application.Contracts/Dtos/WmsMaterial/WmsMaterialUpdateDto.cs
@@ -9,10 +9,10 @@
   /// <summary> 
    /// å¹¶å‘戳 
    /// </summary> 
    public string ConcurrencyStamp { get; set; }
    /// <summary>
    /// ä¿®æ”¹äºº
    /// </summary>
    public string LastModifierName { get; set; }
    public string ConcurrencyStamp { get; set; }
    /// <summary>
    /// ä¿®æ”¹äºº
    /// </summary>
    public string LastModifierName { get; set; }
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsMaterialAppService.cs
@@ -1,87 +1,85 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterial;
using Volo.Abp.Application.Services;
using CmsQueryExtensions.Entitys;
using System.Linq.Expressions;
using CMS.Plugin.HIAWms.Domain.WmsMaterial;
namespace CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterial;
using Volo.Abp.Application.Services;
using CmsQueryExtensions.Entitys;
using System.Linq.Expressions;
using CMS.Plugin.HIAWms.Domain.WmsMaterial;
namespace CMS.Plugin.HIAWms.Application.Contracts.Services;
/// <summary> 
/// ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨åº”用服务接口 
/// </summary> 
public interface IWmsMaterialAppService : ICrudAppService<WmsMaterialDto, Guid, GetWmsMaterialInput, WmsMaterialCreateDto, WmsMaterialUpdateDto>
{
public interface IWmsMaterialAppService : ICrudAppService<WmsMaterialDto, Guid, GetWmsMaterialInput, WmsMaterialCreateDto, WmsMaterialUpdateDto>
{
    /// <summary> 
    /// å…‹éš†ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="ids"></param> 
    /// <returns></returns> 
    Task<List<WmsMaterialDto>> CloneAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser);
    Task<List<WmsMaterialDto>> CloneAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser);
    /// <summary> 
    /// åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="ids"></param> 
    /// <returns></returns> 
    Task DeleteManyAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser);
    /// <summary>
    /// ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="id">物料ID</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task DeletePermanentlyAsync(Guid id, MyCurrentUser myCurrentUser, CancellationToken cancellationToken = default);
    /// <summary>
    /// æ‰¹é‡ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ï¼ˆç›´æŽ¥åˆ é™¤ï¼Œä¸è½¯åˆ é™¤ï¼‰
    /// </summary>
    /// <param name="ids">要删除的物料ID列表</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task BatchDeletePermanentlyAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser, CancellationToken cancellationToken = default);
    Task DeleteManyAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser);
    /// <summary>
    /// ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="id">主键ID</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task DeletePermanentlyAsync(Guid id, MyCurrentUser myCurrentUser, CancellationToken cancellationToken = default);
    /// <summary>
    /// æ‰¹é‡ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ï¼ˆç›´æŽ¥åˆ é™¤ï¼Œä¸è½¯åˆ é™¤ï¼‰
    /// </summary>
    /// <param name="ids">要删除的主键ID列表</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task BatchDeletePermanentlyAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser, CancellationToken cancellationToken = default);
    /// <summary> 
    /// è°ƒæ•´æŽ’序物料基础信息表 
    /// </summary> 
    /// <param name="id"></param> 
    /// <param name="sort"></param> 
    /// <returns></returns> 
    Task AdjustSortAsync(Guid id, int sort);
    Task AdjustSortAsync(Guid id, int sort);
    /// <summary> 
    /// å¯¼å…¥ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    Task ImportAsync(WmsMaterialsImportModel input, MyCurrentUser myCurrentUser);
    Task ImportAsync(WmsMaterialsImportModel input, MyCurrentUser myCurrentUser);
    /// <summary> 
    /// å¯¼å‡ºç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWmsMaterialInput input);
    /// <summary>
    /// æ ¹æ®æ¡ä»¶èŽ·å–ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨åˆ—è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<List<WmsMaterial>> GetListByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, CancellationToken cancellationToken = default);
    /// <summary>
    ///  æ ¹æ®æ¡ä»¶èŽ·å–å•ä¸ªç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="isMultipleThrowException">是否查询出多条就报错</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    Task<WmsMaterial> GetSingleByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, bool is​MultipleThrowException = false, CancellationToken cancellationToken = default);
}
    Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWmsMaterialInput input);
    /// <summary>
    /// æ ¹æ®æ¡ä»¶èŽ·å–ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨åˆ—è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<List<WmsMaterial>> GetListByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, CancellationToken cancellationToken = default);
    /// <summary>
    ///  æ ¹æ®æ¡ä»¶èŽ·å–å•ä¸ªç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="isMultipleThrowException">是否查询出多条就报错</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    Task<WmsMaterial> GetSingleByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, bool is​MultipleThrowException = false, CancellationToken cancellationToken = default);
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsMaterialAppService.cs
@@ -1,132 +1,129 @@
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterial;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared;
using CmsQueryExtensions;
using CMS.Plugin.HIAWms.Domain.WmsMaterial;
using CmsQueryExtensions.Extension;
using System.Linq.Expressions;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
using Volo.Abp.ObjectMapping;
using CmsQueryExtensions.Entitys;
namespace CMS.Plugin.HIAWms.Application.Implements;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterial;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using CMS.Plugin.HIAWms.Domain.Shared;
using CmsQueryExtensions;
using CMS.Plugin.HIAWms.Domain.WmsMaterial;
using CmsQueryExtensions.Extension;
using System.Linq.Expressions;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
using Volo.Abp.ObjectMapping;
using CmsQueryExtensions.Entitys;
namespace CMS.Plugin.HIAWms.Application.Implements;
/// <summary> 
/// ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨åº”用服务 
/// </summary> 
public class WmsMaterialAppService : CMSPluginAppService, IWmsMaterialAppService
{
    private readonly IWmsMaterialRepository wmsMaterialRepository;
public class WmsMaterialAppService : CMSPluginAppService, IWmsMaterialAppService
{
    private readonly IWmsMaterialRepository _wmsMaterialRepository;
    /// <summary> 
    /// Initializes a new instance of the <see cref="WmsMaterialAppService"/> class. 
    /// </summary> 
    /// <param name="WmsMaterialRepository">The task job repository.</param> 
    public WmsMaterialAppService(IWmsMaterialRepository _WmsMaterialRepository)
    {
        wmsMaterialRepository = _WmsMaterialRepository;
    }
    public WmsMaterialAppService(IWmsMaterialRepository wmsMaterialRepository)
    {
        _wmsMaterialRepository = wmsMaterialRepository;
    }
    /// <summary> 
    /// èŽ·å–æŒ‡å®šç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="id"></param> 
    /// <returns></returns> 
    public virtual async Task<WmsMaterialDto> GetAsync(Guid id)
    {
        return ObjectMapper.Map<WmsMaterial, WmsMaterialDto>(await wmsMaterialRepository.GetAsync(id));
    }
    public virtual async Task<WmsMaterialDto> GetAsync(Guid id)
    {
        return ObjectMapper.Map<WmsMaterial, WmsMaterialDto>(await _wmsMaterialRepository.GetAsync(id));
    }
    /// <summary> 
    /// åˆ†é¡µèŽ·å–ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    public virtual async Task<PagedResultDto<WmsMaterialDto>> GetListAsync(GetWmsMaterialInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsMaterial.Sort);
        }
    public virtual async Task<PagedResultDto<WmsMaterialDto>> GetListAsync(GetWmsMaterialInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsMaterial.Sort);
        }
        #region åŠ¨æ€æž„é€ æŸ¥è¯¢æ¡ä»¶  
        //动态构造查询条件  
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var count = await wmsMaterialRepository.GetCountAsync(whereConditions);
        var list = await wmsMaterialRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
        return new PagedResultDto<WmsMaterialDto>(count, ObjectMapper.Map<List<WmsMaterial>, List<WmsMaterialDto>>(list));
    }
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var count = await _wmsMaterialRepository.GetCountAsync(whereConditions);
        var list = await _wmsMaterialRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount);
        return new PagedResultDto<WmsMaterialDto>(count, ObjectMapper.Map<List<WmsMaterial>, List<WmsMaterialDto>>(list));
    }
    /// <summary>  
    /// åŠ¨æ€æž„é€ æŸ¥è¯¢æ¡ä»¶  
    /// </summary>  
    /// <param name="input">输入参数</param>  
    /// <returns></returns>  
    private FunReturnResultModel<Expression<Func<WmsMaterial, bool>>> DynamicGetQueryParams(GetWmsMaterialInput input)
    {
    private FunReturnResultModel<Expression<Func<WmsMaterial, bool>>> DynamicGetQueryParams(GetWmsMaterialInput input)
    {
        //动态构造查询条件  
        var whereConditions = WhereConditionsExtensions.GetWhereConditions<WmsMaterial, GetWmsMaterialInput>(input);
        if (!whereConditions.IsSuccess)
        {
            throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg);
        }
        var whereConditions = WhereConditionsExtensions.GetWhereConditions<WmsMaterial, GetWmsMaterialInput>(input);
        if (!whereConditions.IsSuccess)
        {
            throw new Exception("动态构造查询条件失败:" + whereConditions.ErrMsg);
        }
        //也可再次自定义构建查询条件  
        Expression<Func<WmsMaterial, bool>> extendExpression = a => a.IsDeleted == false;
        Expression<Func<WmsMaterial, bool>> extendExpression = a => a.IsDeleted == false;
        // ä½¿ç”¨ System.Linq.PredicateBuilder çš„ And 
        var pres = (System.Linq.Expressions.Expression<Func<WmsMaterial, bool>>)(whereConditions.data);
        whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression);
        return whereConditions;
    }
        var pres = (System.Linq.Expressions.Expression<Func<WmsMaterial, bool>>)(whereConditions.data);
        whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression);
        return whereConditions;
    }
    /// <summary> 
    /// æ–°å»ºç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    /// <exception cref="UserFriendlyException"></exception> 
    public virtual async Task<WmsMaterialDto> 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 insertObj = ObjectMapper.Map<WmsMaterialCreateDto, WmsMaterial>(input);
        insertObj.Sort = sort;
        input.MapExtraPropertiesTo(insertObj, MappingPropertyDefinitionChecks.None);
        insertObj.CreatorName = input.CreatorName;//创建人
        await wmsMaterialRepository.InsertAsync(insertObj);
    public virtual async Task<WmsMaterialDto> 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 insertObj = ObjectMapper.Map<WmsMaterialCreateDto, WmsMaterial>(input);
        insertObj.Sort = sort;
        input.MapExtraPropertiesTo(insertObj, MappingPropertyDefinitionChecks.None);
        insertObj.CreatorName = input.CreatorName;//创建人
        await _wmsMaterialRepository.InsertAsync(insertObj);
        //if (input.Sort.HasValue && insertObj.Sort != maxSort) 
        //{ 
        //    await AdjustSortAsync(insertObj.Id, insertObj.Sort); 
        //} 
        return ObjectMapper.Map<WmsMaterial, WmsMaterialDto>(insertObj);
    }
        return ObjectMapper.Map<WmsMaterial, WmsMaterialDto>(insertObj);
    }
    /// <summary> 
    /// æ›´æ–°ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
@@ -134,21 +131,21 @@
    /// <param name="input"></param> 
    /// <returns></returns> 
    /// <exception cref="UserFriendlyException"></exception> 
    public virtual async Task<WmsMaterialDto> UpdateAsync(Guid id, WmsMaterialUpdateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var updateObj = await wmsMaterialRepository.GetAsync(id);
        var exist = await wmsMaterialRepository.NameExistAsync(input.MaterialCode, updateObj.Id);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.MaterialCode]);
        }
        updateObj.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
        input.MapExtraPropertiesTo(updateObj, MappingPropertyDefinitionChecks.None);
        updateObj.MaterialCode = input.MaterialCode;
    public virtual async Task<WmsMaterialDto> UpdateAsync(Guid id, WmsMaterialUpdateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var updateObj = await _wmsMaterialRepository.GetAsync(id);
        var exist = await _wmsMaterialRepository.NameExistAsync(input.MaterialCode, updateObj.Id);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.MaterialCode]);
        }
        updateObj.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
        input.MapExtraPropertiesTo(updateObj, MappingPropertyDefinitionChecks.None);
                updateObj.MaterialCode = input.MaterialCode;
        updateObj.IsValid = input.IsValid;
        updateObj.IsSelfMade = input.IsSelfMade;
        updateObj.Num = input.Num;
@@ -170,320 +167,320 @@
        updateObj.RedundantField2 = input.RedundantField2;
        updateObj.RedundantField3 = input.RedundantField3;
        updateObj.Remark = input.Remark;
        updateObj.LastModifierName = input.LastModifierName;//修改人
        await wmsMaterialRepository.UpdateAsync(updateObj);
        return ObjectMapper.Map<WmsMaterial, WmsMaterialDto>(updateObj);
    }
        updateObj.LastModifierName = input.LastModifierName;//修改人
        await _wmsMaterialRepository.UpdateAsync(updateObj);
        return ObjectMapper.Map<WmsMaterial, WmsMaterialDto>(updateObj);
    }
    /// <summary> 
    /// å…‹éš†ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="ids"></param> 
    /// <returns></returns> 
    public async Task<List<WmsMaterialDto>> CloneAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser)
    {
    public async Task<List<WmsMaterialDto>> CloneAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser)
    {
        //var wmsMaterials = new List<WmsMaterial>(); 
        //if (ids != null) 
        //{ 
        //    var sort = await wmsMaterialRepository.GetMaxSortAsync();
        //    var sort = await _wmsMaterialRepository.GetMaxSortAsync();
        //    foreach (var id in ids) 
        //    { 
        //        var WmsMaterial = await wmsMaterialRepository.FindAsync(id);
        //        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);
        //                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++));
        //            //WmsMaterial = await _wmsMaterialRepository.InsertAsync(WmsMaterial.Clone(GuidGenerator.Create(), name, sort++));
        //            wmsMaterials.Add(WmsMaterial); 
        //        } 
        //    } 
        //} 
        //return ObjectMapper.Map<List<WmsMaterial>, List<WmsMaterialDto>>(wmsMaterials); 
        return new List<WmsMaterialDto>();
    }
        return new List<WmsMaterialDto>();
    }
    /// <summary> 
    /// åˆ é™¤å•个物料基础信息表 
    /// </summary> 
    /// <param name="id"></param> 
    /// <returns></returns> 
    public virtual Task DeleteAsync(Guid id)
    {
        return wmsMaterialRepository.DeleteAsync(id);
    }
    public virtual Task DeleteAsync(Guid id)
    {
        return _wmsMaterialRepository.DeleteAsync(id);
    }
    /// <summary> 
    /// åˆ é™¤å¤šä¸ªç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="ids"></param> 
    /// <returns></returns> 
    public async Task DeleteManyAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser)
    {
        foreach (var id in ids)
        {
            await DeleteAsync(id);
        }
    }
    /// <summary>
    /// ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="id">物料ID</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public virtual async Task DeletePermanentlyAsync(Guid id, MyCurrentUser myCurrentUser, CancellationToken cancellationToken = default)
    {
        wmsMaterialRepository.DeletePermanentlyAsync(id);
    }
    /// <summary>
    /// æ‰¹é‡ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ï¼ˆç›´æŽ¥åˆ é™¤ï¼Œä¸è½¯åˆ é™¤ï¼‰
    /// </summary>
    /// <param name="ids">要删除的物料ID列表</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public virtual async Task BatchDeletePermanentlyAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser, CancellationToken cancellationToken = default)
    {
        wmsMaterialRepository.BatchDeletePermanentlyAsync(ids);
    }
    public async Task DeleteManyAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser)
    {
        foreach (var id in ids)
        {
            await DeleteAsync(id);
        }
    }
     /// <summary>
    /// ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="id">主键ID</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public virtual async Task DeletePermanentlyAsync(Guid id, MyCurrentUser myCurrentUser, CancellationToken cancellationToken = default)
    {
        _wmsMaterialRepository.DeletePermanentlyAsync(id);
    }
    /// <summary>
    /// æ‰¹é‡ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ï¼ˆç›´æŽ¥åˆ é™¤ï¼Œä¸è½¯åˆ é™¤ï¼‰
    /// </summary>
    /// <param name="ids">要删除的主键ID列表</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public virtual async Task BatchDeletePermanentlyAsync(IEnumerable<Guid> ids, MyCurrentUser myCurrentUser, CancellationToken cancellationToken = default)
    {
        _wmsMaterialRepository.BatchDeletePermanentlyAsync(ids);
    }
    /// <summary> 
    /// è°ƒæ•´æŽ’序物料基础信息表 
    /// </summary> 
    /// <param name="id"></param> 
    /// <param name="sort"></param> 
    /// <returns></returns> 
    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 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);
    }
    /// <summary> 
    /// å¯¼å…¥ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    /// <exception cref="UserFriendlyException"></exception> 
    public async Task ImportAsync(WmsMaterialsImportModel input, MyCurrentUser myCurrentUser)
    {
        Check.NotNull(input, nameof(input));
        var wmsMaterialCreateDtos = new List<(int RowIndex, WmsMaterialCreateDto Item)>();
        var wmsMaterialUpdateDtos = new List<(int RowIndex, Guid Id, WmsMaterialUpdateDto Item)>();
        var importItems = input.WmsMaterials;
        if (importItems != null && importItems.Any())
        {
    public async Task ImportAsync(WmsMaterialsImportModel input, MyCurrentUser myCurrentUser)
    {
        Check.NotNull(input, nameof(input));
        var wmsMaterialCreateDtos = new List<(int RowIndex, WmsMaterialCreateDto Item)>();
        var wmsMaterialUpdateDtos = new List<(int RowIndex, Guid Id, WmsMaterialUpdateDto Item)>();
        var importItems = input.WmsMaterials;
        if (importItems != null && importItems.Any())
        {
            #region å¯¼å…¥æ ¡éªŒ 
            // åˆ¤æ–­åç§°æ˜¯å¦é‡å¤ï¼Œå¹¶è¾“出第几行重复 
            var duplicateWmsMaterials = importItems.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 impItem in importItems)
            {
                if (impItem.MaterialCode.IsNullOrWhiteSpace())
                {
                    continue;
                }
                if (impItem.MaterialCode.IsNullOrWhiteSpace())
                {
                    var errorMsg = $"导入失败!配置,第{impItem.RowIndex}行:WmsMaterial名称不能为空";
                    throw new UserFriendlyException(errorMsg);
                }
                var oldWmsMaterial = await wmsMaterialRepository.FindByNameAsync(impItem.MaterialCode);
                if (oldWmsMaterial != null)
                {
                    var wmsMaterialUpdateDto = new WmsMaterialUpdateDto
                    {
            var duplicateWmsMaterials = importItems.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 impItem in importItems)
            {
                if (impItem.MaterialCode.IsNullOrWhiteSpace())
                {
                    continue;
                }
                if (impItem.MaterialCode.IsNullOrWhiteSpace())
                {
                    var errorMsg = $"导入失败!配置,第{impItem.RowIndex}行:WmsMaterial名称不能为空";
                    throw new UserFriendlyException(errorMsg);
                }
                var oldWmsMaterial = await _wmsMaterialRepository.FindByNameAsync(impItem.MaterialCode);
                if (oldWmsMaterial != null)
                {
                    var wmsMaterialUpdateDto = new WmsMaterialUpdateDto
                    {
                        MaterialCode = impItem.MaterialCode,
                        IsValid = impItem.IsValid,
                        IsSelfMade = impItem.IsSelfMade,
                        Num = impItem.Num,
                        SelfNum = impItem.SelfNum,
                        MaterialName = impItem.MaterialName,
                        NullLength = impItem.NullLength,
                        PurchaseType = impItem.PurchaseType,
                        MaterialType = impItem.MaterialType,
                        PrimaryUnit = impItem.PrimaryUnit,
                        Standard = impItem.Standard,
                        OuterDiameter = impItem.OuterDiameter,
                        WallThickness = impItem.WallThickness,
                        MaterialQuality = impItem.MaterialQuality,
                        Length = impItem.Length,
                        IsMainBranch = impItem.IsMainBranch,
                        Factory = impItem.Factory,
                        Certification = impItem.Certification,
                        RedundantField1 = impItem.RedundantField1,
                        RedundantField2 = impItem.RedundantField2,
                        RedundantField3 = impItem.RedundantField3,
                        Remark = impItem.Remark,
                    };
                    wmsMaterialUpdateDtos.Add((impItem.RowIndex, oldWmsMaterial.Id, wmsMaterialUpdateDto));
                }
                else
                {
                    var wmsMaterialCreateDto = new WmsMaterialCreateDto
                    {
IsValid = impItem.IsValid,
IsSelfMade = impItem.IsSelfMade,
Num = impItem.Num,
SelfNum = impItem.SelfNum,
MaterialName = impItem.MaterialName,
NullLength = impItem.NullLength,
PurchaseType = impItem.PurchaseType,
MaterialType = impItem.MaterialType,
PrimaryUnit = impItem.PrimaryUnit,
Standard = impItem.Standard,
OuterDiameter = impItem.OuterDiameter,
WallThickness = impItem.WallThickness,
MaterialQuality = impItem.MaterialQuality,
Length = impItem.Length,
IsMainBranch = impItem.IsMainBranch,
Factory = impItem.Factory,
Certification = impItem.Certification,
RedundantField1 = impItem.RedundantField1,
RedundantField2 = impItem.RedundantField2,
RedundantField3 = impItem.RedundantField3,
Remark = impItem.Remark,
                    };
                    wmsMaterialUpdateDtos.Add((impItem.RowIndex, oldWmsMaterial.Id, wmsMaterialUpdateDto));
                }
                else
                {
                    var wmsMaterialCreateDto = new WmsMaterialCreateDto
                    {
                        MaterialCode = impItem.MaterialCode,
                        IsValid = impItem.IsValid,
                        IsSelfMade = impItem.IsSelfMade,
                        Num = impItem.Num,
                        SelfNum = impItem.SelfNum,
                        MaterialName = impItem.MaterialName,
                        NullLength = impItem.NullLength,
                        PurchaseType = impItem.PurchaseType,
                        MaterialType = impItem.MaterialType,
                        PrimaryUnit = impItem.PrimaryUnit,
                        Standard = impItem.Standard,
                        OuterDiameter = impItem.OuterDiameter,
                        WallThickness = impItem.WallThickness,
                        MaterialQuality = impItem.MaterialQuality,
                        Length = impItem.Length,
                        IsMainBranch = impItem.IsMainBranch,
                        Factory = impItem.Factory,
                        Certification = impItem.Certification,
                        RedundantField1 = impItem.RedundantField1,
                        RedundantField2 = impItem.RedundantField2,
                        RedundantField3 = impItem.RedundantField3,
                        Remark = impItem.Remark,
                    };
                    wmsMaterialCreateDtos.Add((impItem.RowIndex, wmsMaterialCreateDto));
                }
            }
        }
IsValid = impItem.IsValid,
IsSelfMade = impItem.IsSelfMade,
Num = impItem.Num,
SelfNum = impItem.SelfNum,
MaterialName = impItem.MaterialName,
NullLength = impItem.NullLength,
PurchaseType = impItem.PurchaseType,
MaterialType = impItem.MaterialType,
PrimaryUnit = impItem.PrimaryUnit,
Standard = impItem.Standard,
OuterDiameter = impItem.OuterDiameter,
WallThickness = impItem.WallThickness,
MaterialQuality = impItem.MaterialQuality,
Length = impItem.Length,
IsMainBranch = impItem.IsMainBranch,
Factory = impItem.Factory,
Certification = impItem.Certification,
RedundantField1 = impItem.RedundantField1,
RedundantField2 = impItem.RedundantField2,
RedundantField3 = impItem.RedundantField3,
Remark = impItem.Remark,
                    };
                    wmsMaterialCreateDtos.Add((impItem.RowIndex, wmsMaterialCreateDto));
                }
            }
        }
        // æ–°å¢ž 
        foreach (var wmsMaterialDto in wmsMaterialCreateDtos)
        {
            try
            {
                wmsMaterialDto.Item.CreatorName = myCurrentUser.UserAccount;//创建人
                await CreateAsync(wmsMaterialDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsMaterialDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
        foreach (var wmsMaterialDto in wmsMaterialCreateDtos)
        {
            try
            {
                wmsMaterialDto.Item.CreatorName = myCurrentUser.UserAccount;//创建人
                await CreateAsync(wmsMaterialDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsMaterialDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
        // æ›´æ–° 
        foreach (var wmsMaterialDto in wmsMaterialUpdateDtos)
        {
            try
            {
                wmsMaterialDto.Item.LastModifierName = myCurrentUser.UserAccount;//修改人
                await UpdateAsync(wmsMaterialDto.Id, wmsMaterialDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsMaterialDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
    }
        foreach (var wmsMaterialDto in wmsMaterialUpdateDtos)
        {
            try
            {
                wmsMaterialDto.Item.LastModifierName = myCurrentUser.UserAccount;//修改人
                await UpdateAsync(wmsMaterialDto.Id, wmsMaterialDto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{wmsMaterialDto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
    }
    /// <summary> 
    /// å¯¼å‡ºç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    public async Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWmsMaterialInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsMaterial.Sort);
        }
    public async Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWmsMaterialInput input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof(WmsMaterial.Sort);
        }
        #region åŠ¨æ€æž„é€ æŸ¥è¯¢æ¡ä»¶  
        //动态构造查询条件  
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var list = await wmsMaterialRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true);
        var result = ObjectMapper.Map<List<WmsMaterial>, List<WmsMaterialDto>>(list);
        var sheets = new Dictionary<string, object>
        {
            ["配置"] = ExportHelper.ConvertListToExportData(result),
        };
        var fileName = "物料信息";
        return (sheets, fileName);
    }
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var list = await _wmsMaterialRepository.GetListAsync(whereConditions, input.Sorting, input.MaxResultCount, input.SkipCount, includeDetails: true);
        var result = ObjectMapper.Map<List<WmsMaterial>, List<WmsMaterialDto>>(list);
        var sheets = new Dictionary<string, object>
        {
            ["配置"] = ExportHelper.ConvertListToExportData(result),
        };
        var fileName = "物料信息";
        return (sheets, fileName);
    }
    /// <summary> 
    /// æ ¡éªŒç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ï¼Œå½“新建或更新时 
    /// </summary> 
    /// <param name="input"></param> 
    /// <returns></returns> 
    protected Task CheckCreateOrUpdateDtoAsync(WmsMaterialCreateOrUpdateDtoBase input)
    {
        Check.NotNull(input, nameof(input));
        Check.NotNullOrWhiteSpace(input.MaterialCode, "物料编码(唯一标识)", 64);
    protected Task CheckCreateOrUpdateDtoAsync(WmsMaterialCreateOrUpdateDtoBase input)
    {
        Check.NotNull(input, nameof(input));
                Check.NotNullOrWhiteSpace(input.MaterialCode, "物料编码(唯一标识)", 64);
        Check.NotNull(input.IsValid, "是否有效物料");
        Check.NotNull(input.Num, "数量");
        Check.NotNullOrWhiteSpace(input.MaterialName, "物料名称", 128);
@@ -493,31 +490,31 @@
        Check.NotNull(input.WallThickness, "壁厚(单位:mm)");
        Check.NotNull(input.Length, "长度(单位:m)");
        Check.NotNull(input.IsMainBranch, "是否为主支管");
        return Task.CompletedTask;
    }
    /// <summary>
    /// æ ¹æ®æ¡ä»¶èŽ·å–ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨åˆ—è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public async Task<List<WmsMaterial>> GetListByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, CancellationToken cancellationToken = default)
    {
        return await wmsMaterialRepository.GetListByFilterAsync(whereConditions);
    }
    /// <summary>
    ///  æ ¹æ®æ¡ä»¶èŽ·å–å•ä¸ªç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="isMultipleThrowException">是否查询出多条就报错</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public async Task<WmsMaterial> GetSingleByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, bool is​MultipleThrowException = false, CancellationToken cancellationToken = default)
    {
        return await wmsMaterialRepository.GetSingleByFilterAsync(whereConditions, is​MultipleThrowException);
    }
}
        return Task.CompletedTask;
    }
     /// <summary>
    /// æ ¹æ®æ¡ä»¶èŽ·å–ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨åˆ—è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public async Task<List<WmsMaterial>> GetListByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, CancellationToken cancellationToken = default)
    {
        return await _wmsMaterialRepository.GetListByFilterAsync(whereConditions);
    }
    /// <summary>
    ///  æ ¹æ®æ¡ä»¶èŽ·å–å•ä¸ªç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="isMultipleThrowException">是否查询出多条就报错</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public async Task<WmsMaterial> GetSingleByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, bool is​MultipleThrowException = false, CancellationToken cancellationToken = default)
    {
        return await _wmsMaterialRepository.GetSingleByFilterAsync(whereConditions, is​MultipleThrowException);
    }
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterial/IWmsMaterialRepository.cs
@@ -1,37 +1,36 @@
using CmsQueryExtensions.Extension;
using System.Linq.Expressions;
using Volo.Abp;
using Volo.Abp.Domain.Repositories;
namespace CMS.Plugin.HIAWms.Domain.WmsMaterial;
using CmsQueryExtensions.Extension;
using System.Linq.Expressions;
using Volo.Abp.Domain.Repositories;
namespace CMS.Plugin.HIAWms.Domain.WmsMaterial;
/// <summary> 
/// ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ä»“储 
/// </summary> 
public interface IWmsMaterialRepository : IBasicRepository<WmsMaterial, Guid>
{
public interface IWmsMaterialRepository : IBasicRepository<WmsMaterial, Guid>
{
    /// <summary> 
    /// æŒ‰ç…§åç§°æŸ¥æ‰¾ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="name"></param> 
    /// <param name="cancellationToken"></param> 
    /// <returns></returns> 
    Task<WmsMaterial> FindByNameAsync(string name, CancellationToken cancellationToken = default);
    Task<WmsMaterial> FindByNameAsync(string name, CancellationToken cancellationToken = default);
    /// <summary> 
    /// éªŒè¯åç§°æ˜¯å¦å­˜åœ¨ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="name"></param> 
    /// <param name="id"></param> 
    /// <returns></returns> 
    Task<bool> NameExistAsync(string name, Guid? id = null);
    Task<bool> NameExistAsync(string name, Guid? id = null);
    /// <summary> 
    /// èŽ·å–æœ€å¤§æŽ’åºç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <returns></returns> 
    Task<int> GetMaxSortAsync();
    Task<int> GetMaxSortAsync();
    /// <summary> 
    /// èŽ·å–åˆ†é¡µåˆ—è¡¨ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
@@ -42,50 +41,48 @@
    /// <param name="includeDetails"></param> 
    /// <param name="cancellationToken"></param> 
    /// <returns></returns> 
    Task<List<WmsMaterial>> GetListAsync(FunReturnResultModel<Expression<Func<WmsMaterial, bool>>> whereConditions, string sorting = null, int maxResultCount = int.MaxValue, int skipCount = 0, bool includeDetails = false, CancellationToken cancellationToken = default);
    Task<List<WmsMaterial>> GetListAsync(FunReturnResultModel<Expression<Func<WmsMaterial, bool>>> whereConditions, string sorting = null, int maxResultCount = int.MaxValue, int skipCount = 0, bool includeDetails = false, CancellationToken cancellationToken = default);
    /// <summary> 
    /// èŽ·å–æ€»æ•°ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="whereConditions"></param> 
    /// <param name="cancellationToken"></param> 
    /// <returns></returns> 
    Task<long> GetCountAsync(FunReturnResultModel<Expression<Func<WmsMaterial, bool>>> whereConditions, CancellationToken cancellationToken = default);
    /// <summary>
    /// ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="id">物料ID</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task DeletePermanentlyAsync(Guid id, CancellationToken cancellationToken = default);
    /// <summary>
    /// æ‰¹é‡ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ï¼ˆç›´æŽ¥åˆ é™¤ï¼Œä¸è½¯åˆ é™¤ï¼‰
    /// </summary>
    /// <param name="ids">要删除的物料ID列表</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task BatchDeletePermanentlyAsync(IEnumerable<Guid> ids, CancellationToken cancellationToken = default);
    /// <summary>
    /// æ ¹æ®æ¡ä»¶èŽ·å–ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨åˆ—è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<List<WmsMaterial>> GetListByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, CancellationToken cancellationToken = default);
    /// <summary>
    ///  æ ¹æ®æ¡ä»¶èŽ·å–å•ä¸ªç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="isMultipleThrowException">是否查询出多条就报错</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    Task<WmsMaterial> GetSingleByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, bool is​MultipleThrowException = false, CancellationToken cancellationToken = default);
}
    Task<long> GetCountAsync(FunReturnResultModel<Expression<Func<WmsMaterial, bool>>> whereConditions, CancellationToken cancellationToken = default);
    /// <summary>
    /// ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="id">主键ID</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task DeletePermanentlyAsync(Guid id, CancellationToken cancellationToken = default);
    /// <summary>
    /// æ‰¹é‡ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ï¼ˆç›´æŽ¥åˆ é™¤ï¼Œä¸è½¯åˆ é™¤ï¼‰
    /// </summary>
    /// <param name="ids">要删除的主键ID列表</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task BatchDeletePermanentlyAsync(IEnumerable<Guid> ids, CancellationToken cancellationToken = default);
    /// <summary>
    /// æ ¹æ®æ¡ä»¶èŽ·å–ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨åˆ—è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<List<WmsMaterial>> GetListByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, CancellationToken cancellationToken = default);
    /// <summary>
    ///  æ ¹æ®æ¡ä»¶èŽ·å–å•ä¸ªç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="isMultipleThrowException">是否查询出多条就报错</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    Task<WmsMaterial> GetSingleByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, bool is​MultipleThrowException = false, CancellationToken cancellationToken = default);
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Repositories/EfCoreWmsMaterialRepository.cs
@@ -1,75 +1,74 @@
using CMS.Plugin.HIAWms.Domain.WmsMaterial;
using CMS.Plugin.HIAWms.EntityFrameworkCore.Extensions;
using CmsQueryExtensions.Extension;
using Microsoft.EntityFrameworkCore;
using RestSharp;
using System.Linq.Dynamic.Core;
using System.Linq.Expressions;
using Volo.Abp;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace CMS.Plugin.HIAWms.EntityFrameworkCore.Repositories;
using CMS.Plugin.HIAWms.Domain.WmsMaterial;
using CMS.Plugin.HIAWms.EntityFrameworkCore.Extensions;
using CmsQueryExtensions.Extension;
using Microsoft.EntityFrameworkCore;
using System.Linq.Dynamic.Core;
using System.Linq.Expressions;
using Volo.Abp;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace CMS.Plugin.HIAWms.EntityFrameworkCore.Repositories;
/// <summary> 
/// ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ä»“储实现 
/// </summary> 
public class EfCoreWmsMaterialRepository : EfCoreRepository<ICMSPluginDbContext, WmsMaterial, Guid>, IWmsMaterialRepository
{
public class EfCoreWmsMaterialRepository : EfCoreRepository<ICMSPluginDbContext, WmsMaterial, Guid>, IWmsMaterialRepository
{
    /// <summary> 
    /// Initializes a new instance of the <see cref="EfCoreWmsMaterialRepository"/> class. 
    /// </summary> 
    /// <param name="dbContextProvider">The database context provider.</param> 
    public EfCoreWmsMaterialRepository(IDbContextProvider<ICMSPluginDbContext> dbContextProvider)
        : base(dbContextProvider)
    {
    }
    public EfCoreWmsMaterialRepository(IDbContextProvider<ICMSPluginDbContext> dbContextProvider)
        : base(dbContextProvider)
    {
    }
    /// <summary> 
    /// æŒ‰ç…§åç§°æŸ¥æ‰¾ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="name"></param> 
    /// <param name="cancellationToken"></param> 
    /// <returns></returns> 
    public virtual async Task<WmsMaterial> FindByNameAsync(string name, CancellationToken cancellationToken = default)
    {
        return await (await GetDbSetAsync())
            .IncludeDetails()
            .Where(x => !x.IsDeleted)
            .OrderByDescending(x => x.CreationTime)
            .FirstOrDefaultAsync(t => t.MaterialCode == name, GetCancellationToken(cancellationToken));
    }
    public virtual async Task<WmsMaterial> FindByNameAsync(string name, CancellationToken cancellationToken = default)
    {
        return await (await GetDbSetAsync())
            .IncludeDetails()
            .Where(x => !x.IsDeleted)
            .OrderByDescending(x=>x.CreationTime)
            .FirstOrDefaultAsync(t => t.MaterialCode == name, GetCancellationToken(cancellationToken));
    }
    /// <summary> 
    /// éªŒè¯åç§°æ˜¯å¦å­˜åœ¨ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="name">校验值</param> 
    /// <param name="id"></param> 
    /// <returns></returns> 
    public async Task<bool> NameExistAsync(string name, Guid? id = null)
    {
        return await (await GetDbSetAsync()).WhereIf(id.HasValue, p => p.Id != id).Where(x => !x.IsDeleted).AnyAsync(x => x.MaterialCode == name);
    }
    public async Task<bool> NameExistAsync(string name, Guid? id = null)
    {
        return await (await GetDbSetAsync()).WhereIf(id.HasValue, p => p.Id != id).Where(x => !x.IsDeleted).AnyAsync(x => x.MaterialCode == name);
    }
    /// <summary> 
    /// èŽ·å–æœ€å¤§æŽ’åºç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <returns></returns> 
    public async Task<int> GetMaxSortAsync()
    {
        var hasAny = await (await GetQueryableAsync())
            .Where(x => !x.IsDeleted).AnyAsync();
        if (!hasAny)
        {
            return 1;
        }
        var sort = await (await GetQueryableAsync())
            .Where(x => !x.IsDeleted).MaxAsync(x => x.Sort);
        return sort + 1;
    }
    public async Task<int> GetMaxSortAsync()
    {
        var hasAny = await (await GetQueryableAsync())
            .Where(x => !x.IsDeleted).AnyAsync();
        if (!hasAny)
        {
            return 1;
        }
        var sort = await (await GetQueryableAsync())
            .Where(x => !x.IsDeleted).MaxAsync(x => x.Sort);
        return sort + 1;
    }
    /// <summary> 
    /// èŽ·å–åˆ†é¡µåˆ—è¡¨ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
@@ -80,138 +79,137 @@
    /// <param name="includeDetails"></param> 
    /// <param name="cancellationToken"></param> 
    /// <returns></returns> 
    public async Task<List<WmsMaterial>> GetListAsync(FunReturnResultModel<Expression<Func<WmsMaterial, bool>>> whereConditions, string sorting = null, int maxResultCount = int.MaxValue, int skipCount = 0, bool includeDetails = false, CancellationToken cancellationToken = default)
    {
        return await (await GetDbSetAsync())
            .IncludeDetails(includeDetails)
            .WhereIf(whereConditions != null, whereConditions.data)
            .Where(x => !x.IsDeleted)
            .OrderByDescending(x => x.CreationTime)
            .PageBy(skipCount, maxResultCount)
            .ToListAsync(GetCancellationToken(cancellationToken));
    }
    public async Task<List<WmsMaterial>> GetListAsync(FunReturnResultModel<Expression<Func<WmsMaterial, bool>>> whereConditions, string sorting = null, int maxResultCount = int.MaxValue, int skipCount = 0, bool includeDetails = false, CancellationToken cancellationToken = default)
    {
        return await (await GetDbSetAsync())
            .IncludeDetails(includeDetails)
            .WhereIf(whereConditions != null, whereConditions.data)
            .Where(x => !x.IsDeleted)
            .OrderByDescending(x=>x.CreationTime)
            .PageBy(skipCount, maxResultCount)
            .ToListAsync(GetCancellationToken(cancellationToken));
    }
    /// <summary> 
    /// èŽ·å–æ€»æ•°ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
    /// </summary> 
    /// <param name="whereConditions"></param> 
    /// <param name="cancellationToken"></param> 
    /// <returns></returns> 
    public async Task<long> GetCountAsync(FunReturnResultModel<Expression<Func<WmsMaterial, bool>>> whereConditions, CancellationToken cancellationToken = default)
    {
        return await (await GetQueryableAsync())
            .WhereIf(whereConditions != null, whereConditions.data)
            .Where(x => !x.IsDeleted)
            .CountAsync(cancellationToken: GetCancellationToken(cancellationToken));
    }
    public async Task<long> GetCountAsync(FunReturnResultModel<Expression<Func<WmsMaterial, bool>>> whereConditions, CancellationToken cancellationToken = default)
    {
        return await (await GetQueryableAsync())
            .WhereIf(whereConditions != null, whereConditions.data)
            .Where(x => !x.IsDeleted)
            .CountAsync(cancellationToken: GetCancellationToken(cancellationToken));
    }
    /// <inheritdoc /> 
    public override async Task<IQueryable<WmsMaterial>> WithDetailsAsync()
    {
        return (await GetQueryableAsync())
            .Where(x => !x.IsDeleted).IncludeDetails();
    }
    /// <summary>
    /// ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="id">物料ID</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public virtual async Task DeletePermanentlyAsync(Guid id, CancellationToken cancellationToken = default)
    {
        var entity = await (await GetDbSetAsync())
            .FirstOrDefaultAsync(x => x.Id == id && !x.IsDeleted, GetCancellationToken(cancellationToken));
        if (entity == null)
        {
            throw new Volo.Abp.Domain.Entities.EntityNotFoundException(typeof(WmsMaterial), id);
        }
        // 2. èŽ·å– DbContext å¹¶æ‰§è¡Œåˆ é™¤
        var dbContext = await GetDbContextAsync();
        // ç›´æŽ¥æ‰§è¡Œ SQL åˆ é™¤
        var sql = $"DELETE FROM scms_wmsmaterials WHERE Id ='{entity.Id.ToString()}'";
        await dbContext.Database.ExecuteSqlRawAsync(sql, cancellationToken);
    }
    /// <summary>
    /// æ‰¹é‡ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ï¼ˆç›´æŽ¥åˆ é™¤ï¼Œä¸è½¯åˆ é™¤ï¼‰
    /// </summary>
    /// <param name="ids">要删除的物料ID列表</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public virtual async Task BatchDeletePermanentlyAsync(IEnumerable<Guid> ids, CancellationToken cancellationToken = default)
    {
        // 1. æŸ¥è¯¢ç¬¦åˆæ¡ä»¶çš„实体(未软删除的记录)
        var entities = await (await GetDbSetAsync())
            .Where(x => ids.Contains(x.Id) && !x.IsDeleted)
            .ToListAsync(GetCancellationToken(cancellationToken));
        if (!entities.Any())
        {
            // å¦‚果没有需要删除的记录,直接返回(避免不必要的数据库操作)
            return;
        }
        // 2. èŽ·å– DbContext å¹¶æ‰§è¡Œæ‰¹é‡åˆ é™¤
        var dbContext = await GetDbContextAsync();
        var idsToDelete = entities.Select(e => e.Id).ToList();
        // ç›´æŽ¥æ‰§è¡Œ SQL åˆ é™¤
        var sql = $"DELETE FROM scms_wmsmaterials WHERE Id IN ({string.Join(",", idsToDelete.Select(id => $"'{id}'"))})";
        await dbContext.Database.ExecuteSqlRawAsync(sql, cancellationToken);
    }
    /// <summary>
    /// æ ¹æ®æ¡ä»¶èŽ·å–ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨åˆ—è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public async Task<List<WmsMaterial>> GetListByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, CancellationToken cancellationToken = default)
    {
        return await (await GetDbSetAsync())
            .WhereIf(whereConditions != null, whereConditions)
            .Where(x => !x.IsDeleted)
            .OrderByDescending(x => x.CreationTime)
            .ToListAsync(GetCancellationToken(cancellationToken));
    }
    /// <summary>
    ///  æ ¹æ®æ¡ä»¶èŽ·å–å•ä¸ªç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="isMultipleThrowException">是否查询出多条就报错</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public async Task<WmsMaterial> GetSingleByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, bool is​MultipleThrowException = false, CancellationToken cancellationToken = default)
    {
        if (is​MultipleThrowException)
        {
            var entitys = await (await GetDbSetAsync())
          .WhereIf(whereConditions != null, whereConditions)
          .Where(x => !x.IsDeleted)
          .OrderByDescending(x => x.CreationTime)
          .ToListAsync(GetCancellationToken(cancellationToken));
            if (entitys?.Count > 1)
            {
                throw new UserFriendlyException("查询到多条记录");
            }
            return entitys?.FirstOrDefault();
        }
        else
        {
            return await (await GetDbSetAsync())
          .WhereIf(whereConditions != null, whereConditions)
          .Where(x => !x.IsDeleted)
          .OrderByDescending(x => x.CreationTime)
          .FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
        }
    }
}
    public override async Task<IQueryable<WmsMaterial>> WithDetailsAsync()
    {
        return (await GetQueryableAsync())
            .Where(x => !x.IsDeleted).IncludeDetails();
    }
    /// <summary>
    /// ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="id">主键ID</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public virtual async Task DeletePermanentlyAsync(Guid id, CancellationToken cancellationToken = default)
    {
        var entity = await (await GetDbSetAsync())
            .FirstOrDefaultAsync(x => x.Id == id && !x.IsDeleted, GetCancellationToken(cancellationToken));
        if (entity == null)
        {
            throw new Volo.Abp.Domain.Entities.EntityNotFoundException(typeof(WmsMaterial), id);
        }
        // 2. èŽ·å– DbContext å¹¶æ‰§è¡Œåˆ é™¤
        var dbContext = await GetDbContextAsync();
        // ç›´æŽ¥æ‰§è¡Œ SQL åˆ é™¤
        var sql = $"DELETE FROM scms_wmsmaterials WHERE Id ='{entity.Id.ToString()}'";
        await dbContext.Database.ExecuteSqlRawAsync(sql, cancellationToken);
    }
    /// <summary>
    /// æ‰¹é‡ç‰©ç†åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ï¼ˆç›´æŽ¥åˆ é™¤ï¼Œä¸è½¯åˆ é™¤ï¼‰
    /// </summary>
    /// <param name="ids">要删除的主键ID列表</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public virtual async Task BatchDeletePermanentlyAsync(IEnumerable<Guid> ids, CancellationToken cancellationToken = default)
    {
        // 1. æŸ¥è¯¢ç¬¦åˆæ¡ä»¶çš„实体(未软删除的记录)
        var entities = await (await GetDbSetAsync())
            .Where(x => ids.Contains(x.Id) && !x.IsDeleted)
            .ToListAsync(GetCancellationToken(cancellationToken));
        if (!entities.Any())
        {
            // å¦‚果没有需要删除的记录,直接返回(避免不必要的数据库操作)
            return;
        }
        // 2. èŽ·å– DbContext å¹¶æ‰§è¡Œæ‰¹é‡åˆ é™¤
        var dbContext = await GetDbContextAsync();
        var idsToDelete = entities.Select(e => e.Id).ToList();
        // ç›´æŽ¥æ‰§è¡Œ SQL åˆ é™¤
        var sql = $"DELETE FROM scms_wmsmaterials WHERE Id IN ({string.Join(",", idsToDelete.Select(id => $"'{id}'"))})";
        await dbContext.Database.ExecuteSqlRawAsync(sql, cancellationToken);
    }
    /// <summary>
    /// æ ¹æ®æ¡ä»¶èŽ·å–ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨åˆ—è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public async Task<List<WmsMaterial>> GetListByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, CancellationToken cancellationToken = default)
    {
        return await (await GetDbSetAsync())
            .WhereIf(whereConditions != null, whereConditions)
            .Where(x => !x.IsDeleted)
            .OrderByDescending(x => x.CreationTime)
            .ToListAsync(GetCancellationToken(cancellationToken));
    }
    /// <summary>
    ///  æ ¹æ®æ¡ä»¶èŽ·å–å•ä¸ªç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨
    /// </summary>
    /// <param name="whereConditions"></param>
    /// <param name="isMultipleThrowException">是否查询出多条就报错</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public async Task<WmsMaterial> GetSingleByFilterAsync(Expression<Func<WmsMaterial, bool>> whereConditions, bool is​MultipleThrowException = false, CancellationToken cancellationToken = default)
    {
        if (is​MultipleThrowException)
        {
            var entitys = await (await GetDbSetAsync())
          .WhereIf(whereConditions != null, whereConditions)
          .Where(x => !x.IsDeleted)
          .OrderByDescending(x => x.CreationTime)
          .ToListAsync(GetCancellationToken(cancellationToken));
            if (entitys?.Count > 1)
            {
                throw new UserFriendlyException("查询到多条记录");
            }
            return entitys?.FirstOrDefault();
        }
        else
        {
            return await (await GetDbSetAsync())
          .WhereIf(whereConditions != null, whereConditions)
          .Where(x => !x.IsDeleted)
          .OrderByDescending(x => x.CreationTime)
          .FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
        }
    }
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms/Controller/WmsMaterialController.cs
@@ -1,215 +1,216 @@
using Ao.Lang;
using CMS.Extensions.Abp.AspNetCore.Mvc.Filters;
using CMS.Framework.AspNetCore.Users;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterial;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using MiniExcelLibs;
using System.Reflection;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using CmsQueryExtensions.Entitys;
namespace CMS.Plugin.HIAWms.Controller
{
using Ao.Lang;
using CMS.Extensions.Abp.AspNetCore.Mvc.Filters;
using CMS.Framework.AspNetCore.Users;
using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterial;
using CMS.Plugin.HIAWms.Application.Contracts.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using MiniExcelLibs;
using System.Reflection;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using CmsQueryExtensions.Entitys;
namespace CMS.Plugin.HIAWms.Controller
{
    /// <summary> 
    /// ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨æœåŠ¡ 
    /// </summary> 
    [ApiController]
    [TypeFilter(typeof(CMSLanguageFilter))]
    [TypeFilter(typeof(CMSUowActionFilter))]
    [TypeFilter(typeof(CMSAuditActionFilter))]
    [TypeFilter(typeof(CMSExceptionFilter))]
    [Route("api/v{version:apiVersion}/HIAWms/[controller]")]
    public class WmsMaterialController : ControllerBase
    {
        private readonly IWmsMaterialAppService _wmsMaterialAppService;
        private readonly ICurrentUser _currentUser;
    [ApiController]
    [TypeFilter(typeof(CMSLanguageFilter))]
    [TypeFilter(typeof(CMSUowActionFilter))]
    [TypeFilter(typeof(CMSAuditActionFilter))]
    [TypeFilter(typeof(CMSExceptionFilter))]
    [Route("api/v{version:apiVersion}/HIAWms/[controller]")]
    public class WmsMaterialController : ControllerBase
    {
        private readonly IWmsMaterialAppService _wmsMaterialAppService;
        private readonly ICurrentUser _currentUser;
        /// <summary> 
        /// Initializes a new instance of the <see cref="WmsMaterialController"/> class. 
        /// </summary> 
        /// <param name="wmsMaterialAppService">The wmsMaterial application service.</param> 
        public WmsMaterialController(IWmsMaterialAppService wmsMaterialAppService, ICurrentUser currentUser)
        {
            _wmsMaterialAppService = wmsMaterialAppService;
            _currentUser = currentUser;
        }
        public WmsMaterialController(IWmsMaterialAppService wmsMaterialAppService, ICurrentUser currentUser)
        {
            _wmsMaterialAppService = wmsMaterialAppService;
            _currentUser = currentUser;
        }
        /// <summary> 
        /// èŽ·å–ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
        /// </summary> 
        /// <param name="id">标识符.</param>
        /// <param name="id">主键ID</param>
        /// <returns></returns> 
        [HttpGet]
        [Route("{id}")]
        public virtual Task<WmsMaterialDto> GetAsync(Guid id)
        {
            return _wmsMaterialAppService.GetAsync(id);
        }
        [HttpGet]
        [Route("{id}")]
        public virtual Task<WmsMaterialDto> GetAsync(Guid id)
        {
            return _wmsMaterialAppService.GetAsync(id);
        }
        /// <summary> 
        /// åˆ†é¡µèŽ·å–ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨çš„åˆ—è¡¨. 
        /// </summary> 
        /// <param name="input">输入.</param>
        /// <param name="input">查询参数</param>
        /// <returns></returns> 
        [HttpGet]
        [Route("Page")]
        public virtual Task<PagedResultDto<WmsMaterialDto>> GetListAsync([FromQuery] GetWmsMaterialInput input)
        {
            return _wmsMaterialAppService.GetListAsync(input);
        }
        [HttpGet]
        [Route("Page")]
        public virtual Task<PagedResultDto<WmsMaterialDto>> GetListAsync([FromQuery] GetWmsMaterialInput input)
        {
            return _wmsMaterialAppService.GetListAsync(input);
        }
        /// <summary> 
        /// åˆ›å»ºç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
        /// </summary> 
        /// <param name="input">输入.</param>
        /// <param name="input">创建参数</param>
        /// <returns></returns> 
        //[Authorize] 
        [HttpPost]
        public virtual Task<WmsMaterialDto> CreateAsync(WmsMaterialCreateDto input)
        {
            input.CreatorName = _currentUser.UserAccount;//创建人
            return _wmsMaterialAppService.CreateAsync(input);
        }
        [HttpPost]
        public virtual Task<WmsMaterialDto> CreateAsync(WmsMaterialCreateDto input)
        {
            input.CreatorName = _currentUser.UserAccount;//创建人
            return _wmsMaterialAppService.CreateAsync(input);
        }
        /// <summary> 
        /// æ›´æ–°ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
        /// </summary> 
        /// <param name="id">标识符.</param>
        /// <param name="input">输入.</param>
        /// <param name="id">主键ID</param>
        /// <param name="input">更新参数</param>
        /// <returns></returns> 
        //[Authorize] 
        [HttpPut]
        [Route("{id}")]
        public virtual Task<WmsMaterialDto> UpdateAsync(Guid id, WmsMaterialUpdateDto input)
        {
            input.LastModifierName = _currentUser.UserAccount;//修改人
            return _wmsMaterialAppService.UpdateAsync(id, input);
        }
        [HttpPut]
        [Route("{id}")]
        public virtual Task<WmsMaterialDto> UpdateAsync(Guid id, WmsMaterialUpdateDto input)
        {
            input.LastModifierName = _currentUser.UserAccount;//修改人
            return _wmsMaterialAppService.UpdateAsync(id, input);
        }
        /// <summary> 
        /// å…‹éš†ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
        /// </summary> 
        /// <param name="ids">Id集合.</param>
        /// <param name="ids">Id集合</param>
        /// <returns></returns> 
        //[Authorize] 
        [HttpPost]
        [Route("Clone")]
        public virtual Task<List<WmsMaterialDto>> CloneAsync([FromBody] IEnumerable<Guid> ids)
        {
            MyCurrentUser myCurrentUser = new MyCurrentUser()
            {
                UserAccount = _currentUser.UserAccount,
                UserId = _currentUser.UserId
            };
            return _wmsMaterialAppService.CloneAsync(ids, myCurrentUser);
        }
        [HttpPost]
        [Route("Clone")]
        public virtual Task<List<WmsMaterialDto>> CloneAsync([FromBody] IEnumerable<Guid> ids)
        {
            MyCurrentUser myCurrentUser = new MyCurrentUser()
            {
                UserAccount = _currentUser.UserAccount,
                UserId = _currentUser.UserId
            };
            return _wmsMaterialAppService.CloneAsync(ids, myCurrentUser);
        }
        /// <summary> 
        /// åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
        /// </summary> 
        /// <param name="id">标识符.</param>
        /// <param name="id">主键ID</param>
        /// <returns></returns> 
        //[Authorize] 
        [HttpDelete]
        [Route("{id}")]
        public virtual Task DeleteAsync(Guid id)
        {
            MyCurrentUser myCurrentUser = new MyCurrentUser()
            {
                UserAccount = _currentUser.UserAccount,
                UserId = _currentUser.UserId
            };
            //return _wmsMaterialAppService.DeleteAsync(id,myCurrentUser);//逻辑删除
            return _wmsMaterialAppService.DeletePermanentlyAsync(id, myCurrentUser);//物理删除
        }
        [HttpDelete]
        [Route("{id}")]
        public virtual Task DeleteAsync(Guid id)
        {
            MyCurrentUser myCurrentUser = new MyCurrentUser()
            {
                UserAccount = _currentUser.UserAccount,
                UserId = _currentUser.UserId
            };
            //return _wmsMaterialAppService.DeleteAsync(id,myCurrentUser);//逻辑删除
            return _wmsMaterialAppService.DeletePermanentlyAsync(id, myCurrentUser);//物理删除
        }
        /// <summary> 
        /// æ‰¹é‡åˆ é™¤ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
        /// </summary> 
        /// <param name="ids">The ids.</param>
        /// <param name="ids">主键ID集合</param>
        /// <returns></returns> 
        //[Authorize] 
        [HttpDelete]
        public virtual Task DeleteAsync([FromBody] IEnumerable<Guid> ids)
        {
            MyCurrentUser myCurrentUser = new MyCurrentUser()
            {
                UserAccount = _currentUser.UserAccount,
                UserId = _currentUser.UserId
            };
            // return _wmsMaterialAppService.DeleteManyAsync(ids,myCurrentUser);//逻辑删除
            return _wmsMaterialAppService.BatchDeletePermanentlyAsync(ids, myCurrentUser);//物理删除
        }
        [HttpDelete]
        public virtual Task DeleteAsync([FromBody] IEnumerable<Guid> ids)
        {
            MyCurrentUser myCurrentUser = new MyCurrentUser()
            {
                UserAccount = _currentUser.UserAccount,
                UserId = _currentUser.UserId
            };
            // return _wmsMaterialAppService.DeleteManyAsync(ids,myCurrentUser);//逻辑删除
            return _wmsMaterialAppService.BatchDeletePermanentlyAsync(ids, myCurrentUser);//物理删除
        }
        /// <summary> 
        /// è°ƒæ•´æŽ’序物料基础信息表 
        /// </summary> 
        /// <param name="id">标识符.</param>
        /// <param name="id">主键ID</param>
        /// <returns></returns> 
        [HttpPut]
        [Route("{id}/AdjustSort/{sort}")]
        public virtual Task AdjustSortAsync(Guid id, int sort)
        {
            return _wmsMaterialAppService.AdjustSortAsync(id, sort);
        }
        [HttpPut]
        [Route("{id}/AdjustSort/{sort}")]
        public virtual Task AdjustSortAsync(Guid id, int sort)
        {
            return _wmsMaterialAppService.AdjustSortAsync(id, sort);
        }
        /// <summary> 
        /// å¯¼å…¥ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
        /// </summary> 
        /// <returns></returns> 
        [Authorize]
        [HttpPost]
        [Route("Import")]
        public virtual async Task<IActionResult> ImportAsync(IFormFile file)
        {
            using var stream = new MemoryStream();
            await file.CopyToAsync(stream);
            stream.Seek(0L, SeekOrigin.Begin);
            var sheetNames = stream.GetSheetNames();
            var wmsMaterialRows = sheetNames.Contains("配置") ? MiniExcel.Query<WmsMaterialsImportModel.WmsMaterialImportModel>(stream, sheetName: "配置").ToList() : new();
            if (!wmsMaterialRows.Any())
            {
                throw new UserFriendlyException("请检查导入的表格");
            }
            MyCurrentUser myCurrentUser = new MyCurrentUser()
            {
                UserAccount = _currentUser.UserAccount,
                UserId = _currentUser.UserId
            };
            await _wmsMaterialAppService.ImportAsync(new WmsMaterialsImportModel
            {
                WmsMaterials = wmsMaterialRows,
            }, myCurrentUser);
            return Ok();
        }
        [Authorize]
        [HttpPost]
        [Route("Import")]
        public virtual async Task<IActionResult> ImportAsync(IFormFile file)
        {
            using var stream = new MemoryStream();
            await file.CopyToAsync(stream);
            stream.Seek(0L, SeekOrigin.Begin);
            var sheetNames = stream.GetSheetNames();
            var wmsMaterialRows = sheetNames.Contains("配置") ? MiniExcel.Query<WmsMaterialsImportModel.WmsMaterialImportModel>(stream, sheetName: "配置").ToList() : new();
            if (!wmsMaterialRows.Any())
            {
                throw new UserFriendlyException("请检查导入的表格");
            }
            MyCurrentUser myCurrentUser = new MyCurrentUser()
            {
                UserAccount = _currentUser.UserAccount,
                UserId = _currentUser.UserId
            };
            await _wmsMaterialAppService.ImportAsync(new WmsMaterialsImportModel
            {
                WmsMaterials = wmsMaterialRows,
           },myCurrentUser);
            return Ok();
        }
        /// <summary> 
        /// å¯¼å‡ºç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨ 
        /// </summary> 
        /// <returns></returns> 
        [HttpGet]
        [Route("Export")]
        public virtual async Task<IActionResult> ExportAsync([FromQuery] GetWmsMaterialInput input)
        {
            input.MaxResultCount = int.MaxValue;
            var exportData = await _wmsMaterialAppService.ExportAsync(input);
            var templatePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Resources/Templates/WmsMaterial导出模板.xlsx");
            if (!System.IO.File.Exists(templatePath))
            {
                templatePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? string.Empty, $"Resources/Templates/WmsMaterial导出模板.xlsx");
            }
            var memoryStream = new MemoryStream();
            await memoryStream.SaveAsByTemplateAsync(templatePath, exportData.Sheets);
            memoryStream.Seek(0L, SeekOrigin.Begin);
            return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { FileDownloadName = $"{exportData.FileName}_{DateTime.Now:yyyyMMddhhmmss}.xlsx" };
        }
    }
}
        [HttpGet]
        [Route("Export")]
        public virtual async Task<IActionResult> ExportAsync([FromQuery] GetWmsMaterialInput input)
        {
            input.MaxResultCount = int.MaxValue;
            var exportData = await _wmsMaterialAppService.ExportAsync(input);
            var templatePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Resources/Templates/WmsMaterial导出模板.xlsx");
            if (!System.IO.File.Exists(templatePath))
            {
                templatePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? string.Empty, $"Resources/Templates/WmsMaterial导出模板.xlsx");
            }
            var memoryStream = new MemoryStream();
            await memoryStream.SaveAsByTemplateAsync(templatePath, exportData.Sheets);
            memoryStream.Seek(0L, SeekOrigin.Begin);
            return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { FileDownloadName = $"{exportData.FileName}_{DateTime.Now:yyyyMMddhhmmss}.xlsx" };
        }
    }
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Weben_CMS_TemplateDemo/server/src/CMS.Plugin.HIAWms/Resources/Templates/WmsMaterialµ¼³öÄ£°å.xlsx
Binary files differ