zs
2025-06-04 5a149d626ae8bc3fa4bddbb53f8caf40f51f6da6
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Templete/AppService/AppServiceÄ£°å.txt
@@ -1,46 +1,46 @@
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 CMS.Plugin.$NameSpacePath$.Domain.Shared.Util;
using CMS.Plugin.$NameSpacePath$.Domain.$EntityName$;
using CmsQueryExtensions;
using CmsQueryExtensions.Entitys;
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;
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 +53,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 +90,7 @@
    }
    /// <summary>
    /// æ–°å»º$ChinaComment$
    /// æ–°å»º$ChinaComment$
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
@@ -99,31 +99,32 @@
    {
        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)
        {
            await AdjustSortAsync(insertObj.Id, insertObj.Sort);
        }
        //if (input.Sort.HasValue && insertObj.Sort != maxSort)
        //{
        //    await AdjustSortAsync(insertObj.Id, insertObj.Sort);
        //}
        return ObjectMapper.Map<$EntityName$, $EntityName$Dto>(insertObj);
    }
    /// <summary>
    /// æ›´æ–°$ChinaComment$
    /// æ›´æ–°$ChinaComment$
    /// </summary>
    /// <param name="id"></param>
    /// <param name="input"></param>
@@ -133,8 +134,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$]);
@@ -143,34 +144,37 @@
        updateObj.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
        input.MapExtraPropertiesTo(updateObj, MappingPropertyDefinitionChecks.None);
        $UpdateAttributes$
        // æ‰¹é‡èµ‹å€¼æ‰€æœ‰å¯æ˜ å°„字段(通过匿名对象)
        updateObj = ObjectMapper.Map(input, updateObj); // ç­‰æ•ˆäºŽæ‰‹åŠ¨èµ‹å€¼æ‰€æœ‰åŒ¹é…å­—æ®µ
        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,33 +274,33 @@
            }
        }
        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));
        var $EntityInstanceName$CreateDtos = new List<(int RowIndex, $EntityName$CreateDto Item)>();
        var $EntityInstanceName$UpdateDtos = new List<(int RowIndex, Guid Id, $EntityName$UpdateDto Item)>();
        var $EntityInstanceName$UpdateDtos = new List<(int RowIndex, Guid Id, $EntityName$ Item)>();
        var importItems = input.$EntityName$s;
        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);
            }
@@ -282,70 +308,65 @@
            foreach (var impItem in importItems)
            {
                if (impItem.$ValidateRepeatName$.IsNullOrWhiteSpace() && impItem.MaterialName.IsNullOrWhiteSpace())
                if (impItem.$ValidateRepeatName$.IsNullOrWhiteSpace())
                {
                    continue;
                }
                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
                    {
                        $AppService_ImportAsync$
                    };
                    $EntityInstanceName$UpdateDtos.Add((impItem.RowIndex, old$EntityName$.Id, $EntityInstanceName$UpdateDto));
                    old$EntityName$ = ObjectMapper.Map(impItem, old$EntityName$); // ç­‰æ•ˆäºŽæ‰‹åŠ¨èµ‹å€¼æ‰€æœ‰åŒ¹é…å­—æ®µ
                    $EntityInstanceName$UpdateDtos.Add((impItem.RowIndex, old$EntityName$.Id, old$EntityName$));
                }
                else
                {
                    var $EntityInstanceName$CreateDto = new $EntityName$CreateDto
                    {
                        $AppService_ImportAsync$
                    };
                    var $EntityInstanceName$CreateDto = new $EntityName$CreateDto { };
                    $EntityInstanceName$CreateDto = ObjectMapper.Map(impItem, $EntityInstanceName$CreateDto); // ç­‰æ•ˆäºŽæ‰‹åŠ¨èµ‹å€¼æ‰€æœ‰åŒ¹é…å­—æ®µ
                    $EntityInstanceName$CreateDtos.Add((impItem.RowIndex, $EntityInstanceName$CreateDto));
                }
            }
        }
        // æ–°å¢ž
        // æ–°å¢ž
        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
            {
                await UpdateAsync($EntityInstanceName$Dto.Id, $EntityInstanceName$Dto.Item);
                $EntityInstanceName$Dto.Item.LastModifierName = myCurrentUser.UserAccount;//修改人
                await _$EntityInstanceName$Repository.UpdateAsync($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,28 +379,28 @@
            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 = result.Count > 1 ? "$ChinaComment$列表" : result.Count == 1 ? result[0]?.$ValidateRepeatName$ : "$EntityName$模版";
        var fileName = "$PageMenuName$";
        return (sheets, fileName);
    }
    /// <summary>
    /// æ ¡éªŒ$ChinaComment$,当新建或更新时
    /// æ ¡éªŒ$ChinaComment$,当新建或更新时
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
@@ -389,4 +410,79 @@
        $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);
    }
     /// <summary>
    /// æ ¹æ®æ¡ä»¶èŽ·å–$ChinaComment$列表
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public virtual async Task<List<$EntityName$Dto>> FindListByFilterAsync(Get$EntityName$Input input, CancellationToken cancellationToken = default)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof($EntityName$.Sort);
        }
        #region åŠ¨æ€æž„é€ æŸ¥è¯¢æ¡ä»¶
        //动态构造查询条件
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var list = await _$EntityInstanceName$Repository.GetListByFilterAsync(whereConditions?.data);
        return new List<$EntityName$Dto>(ObjectMapper.Map<List<$EntityName$>, List<$EntityName$Dto>>(list));
    }
    /// <summary>
    /// æ ¹æ®æ¡ä»¶èŽ·å–å•ä¸ª$ChinaComment$
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public virtual async Task<$EntityName$Dto> FindSingleByFilterAsync(Get$EntityName$Input input, CancellationToken cancellationToken = default)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof($EntityName$.Sort);
        }
        #region åŠ¨æ€æž„é€ æŸ¥è¯¢æ¡ä»¶
        //动态构造查询条件
        var whereConditions = DynamicGetQueryParams(input);
        #endregion
        var dataObj = await _$EntityInstanceName$Repository.GetSingleByFilterAsync(whereConditions?.data);
        return (ObjectMapper.Map<$EntityName$, $EntityName$Dto>(dataObj));
    }
}