222
schangxiang@126.com
2025-05-04 06097837de2d955665d5575dbe8e94588f00af91
222
已修改6个文件
545 ■■■■■ 文件已修改
Weben_CMS专用代码生成器/Code/Generate/AppService/AppService_Generate.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/MainForm.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Model/GenerateCodeParam.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Templete/AppService/AppService模板.txt 388 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Utility/CommonHelper.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMS专用代码生成器/Code/Utility/StructStrHelper.cs 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Generate/AppService/AppService_Generate.cs
@@ -20,6 +20,28 @@
            CommonHelper.CommonReplaceStr(param, ref str);
            string attrString = "";
            List<ColumnModel> newColumnNameList = ListHelper.RemoveAttrForExport(param.ColumnNameList);
            for (int i = 0; i < newColumnNameList.Count; ++i)
            {
                attrString += StructStrHelper.GenerateAttributeForUpdateModel(newColumnNameList[i], param);
            }
            str = str.Replace("$UpdateAttributes$", attrString);
            attrString = "";
            for (int i = 0; i < newColumnNameList.Count; ++i)
            {
                attrString += StructStrHelper.GenerateAttributeForUpdateModelByImport(newColumnNameList[i], param);
            }
            str = str.Replace("$UpdateAttributesForImport$", attrString);
            attrString = "";
            for (int i = 0; i < newColumnNameList.Count; ++i)
            {
                attrString += StructStrHelper.GenerateAttributeForCheckCreateOrUpdateDtoAsync(newColumnNameList[i], param);
            }
            str = str.Replace("$UpdateAttributesForCheckCreateOrUpdateDtoAsync$", attrString);
            return str;
        }
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/MainForm.cs
@@ -162,7 +162,8 @@
                    ChinaComment = chinaComment,
                    NameSpacePath = wcf_NameSpacePath,
                    ColumnNameList = columnList,
                    EntityName = entityName
                    EntityName = entityName,
                    EntityInstanceName= tableAlias
                };
                //处理枚举类型
                List<EnumModel> enumList = new List<EnumModel>();
@@ -229,7 +230,7 @@
                //9、生成 AppService æ–‡ä»¶
                appServiceFilePath = tbPath.Text + @"\server\src\CMS.Plugin." + tb_WCF_NameSpacePath.Text.Trim() + @".Application\Implements";
                str_generate = AppService_Generate.CreateText(param);
                tf = TextHelper.Export2File_V2(appServiceFilePath, $"I{param.EntityName}AppService.cs", tableName, str_generate, FileType.InputModel, filePrefixName, entityName, modulelogo);
                tf = TextHelper.Export2File_V2(appServiceFilePath, $"{param.EntityName}AppService.cs", tableName, str_generate, FileType.InputModel, filePrefixName, entityName, modulelogo);
                #endregion
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Model/GenerateCodeParam.cs
@@ -33,6 +33,11 @@
        public string EntityName { get; set; }
        /// <summary>
        /// å®žä½“的实例对象名
        /// </summary>
        public string EntityInstanceName { get; set; }
        /// <summary>
        /// å‘½åç©ºé—´ 
        /// </summary>
        public string NameSpacePath { get; set; }
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Templete/AppService/AppServiceÄ£°å.txt
@@ -1,19 +1,393 @@
using CMS.Plugin.$NameSpacePath$.Domain.Shared.Enums;
using CMS.Plugin.$NameSpacePath$.Application.Contracts.Dtos.$EntityInstanceName$s;
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.Shared.$EntityInstanceName$s;
using CMS.Plugin.$NameSpacePath$.Domain.$EntityInstanceName$s;
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.Contracts.Dtos.$EntityName$;
namespace CMS.Plugin.$NameSpacePath$.Application.Implements;
/// <summary>
/// $ChinaComment$创建或更新基类
/// $ChinaComment$应用服务
/// </summary>
public abstract class $EntityName$CreateOrUpdateDtoBase : ExtensibleEntityDto
public class $EntityName$AppService : CMSPluginAppService, I$EntityName$AppService
{
    $AddAttributes$
    private readonly I$EntityName$Repository $EntityInstanceName$Repository;
    /// <summary>
    /// Initializes a new instance of the <see cref="$EntityName$CreateOrUpdateDtoBase"/> class.
    /// Initializes a new instance of the <see cref="$EntityName$AppService"/> class.
    /// </summary>
    public $EntityName$CreateOrUpdateDtoBase() : base(false)
    /// <param name="$EntityName$Repository">The task job repository.</param>
    public $EntityName$AppService(I$EntityName$Repository $EntityName$Repository)
    {
        $EntityInstanceName$Repository = $EntityName$Repository;
    }
    /// <summary>
    /// èŽ·å–æŒ‡å®š$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));
    }
    /// <summary>
    /// åˆ†é¡µèŽ·å–$ChinaComment$
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public virtual async Task<PagedResultDto<$EntityName$Dto>> GetListAsync(Get$EntityName$Input input)
    {
        Check.NotNull(input, nameof(input));
        if (input.Sorting.IsNullOrWhiteSpace())
        {
            input.Sorting = nameof($EntityName$.Sort);
        }
        #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);
        return new PagedResultDto<$EntityName$Dto>(count, ObjectMapper.Map<List<$EntityName$>, List<$EntityName$Dto>>(list));
    }
    /// <summary>
    /// åŠ¨æ€æž„é€ æŸ¥è¯¢æ¡ä»¶
    /// </summary>
    /// <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);
        }
        //也可再次自定义构建查询条件
        Expression<Func<$EntityName$, bool>> extendExpression = a => a.IsDeleted == false;
        // ä½¿ç”¨ System.Linq.PredicateBuilder çš„ And
        var pres = (System.Linq.Expressions.Expression<Func<$EntityName$, bool>>)(whereConditions.data);
        whereConditions.data = System.Linq.PredicateBuilder.And(pres, extendExpression);
        return whereConditions;
    }
    /// <summary>
    /// æ–°å»º$ChinaComment$
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public virtual async Task<$EntityName$Dto> CreateAsync($EntityName$CreateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var exist = await $EntityInstanceName$Repository.NameExistAsync(input.MaterialCode);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.MaterialCode]);
        }
        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);
        if (input.Sort.HasValue && insertObj.Sort != maxSort)
        {
            await AdjustSortAsync(insertObj.Id, insertObj.Sort);
        }
        return ObjectMapper.Map<$EntityName$, $EntityName$Dto>(insertObj);
    }
    /// <summary>
    /// æ›´æ–°$ChinaComment$
    /// </summary>
    /// <param name="id"></param>
    /// <param name="input"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public virtual async Task<$EntityName$Dto> UpdateAsync(Guid id, $EntityName$UpdateDto input)
    {
        await CheckCreateOrUpdateDtoAsync(input);
        var updateObj = await $EntityInstanceName$Repository.GetAsync(id);
        var exist = await $EntityInstanceName$Repository.NameExistAsync(input.MaterialCode, updateObj.Id);
        if (exist)
        {
            throw new UserFriendlyException(L[CMSPluginDomainErrorCodes.NameAlreadyExists, input.MaterialCode]);
        }
        updateObj.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp);
        input.MapExtraPropertiesTo(updateObj, MappingPropertyDefinitionChecks.None);
        $UpdateAttributes$
        await $EntityInstanceName$Repository.UpdateAsync(updateObj);
        return ObjectMapper.Map<$EntityName$, $EntityName$Dto>(updateObj);
    }
    /// <summary>
    /// å…‹éš†$ChinaComment$
    /// </summary>
    /// <param name="ids"></param>
    /// <returns></returns>
    public async Task<List<$EntityName$Dto>> CloneAsync(IEnumerable<Guid> ids)
    {
        //var $EntityInstanceName$s = new List<$EntityName$>();
        //if (ids != null)
        //{
        //    var sort = await $EntityInstanceName$Repository.GetMaxSortAsync();
        //    foreach (var id in ids)
        //    {
        //        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);
        //                if (exist || $EntityInstanceName$s.Any(x => x.Name == name))
        //                {
        //                    name += $EntityName$Consts.CloneTag;
        //                    continue;
        //                }
        //                notExist = true;
        //            }
        //            //$EntityName$ = await $EntityInstanceName$Repository.InsertAsync($EntityName$.Clone(GuidGenerator.Create(), name, sort++));
        //            $EntityInstanceName$s.Add($EntityName$);
        //        }
        //    }
        //}
        //return ObjectMapper.Map<List<$EntityName$>, List<$EntityName$Dto>>($EntityInstanceName$s);
        return new List<$EntityName$Dto>();
    }
    /// <summary>
    /// åˆ é™¤å•个$ChinaComment$
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public virtual Task DeleteAsync(Guid id)
    {
        return $EntityInstanceName$Repository.DeleteAsync(id);
    }
    /// <summary>
    /// åˆ é™¤å¤šä¸ª$ChinaComment$
    /// </summary>
    /// <param name="ids"></param>
    /// <returns></returns>
    public async Task DeleteManyAsync(IEnumerable<Guid> ids)
    {
        foreach (var id in ids)
        {
            await DeleteAsync(id);
        }
    }
    /// <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));
        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 $EntityInstanceName$Repository.UpdateManyAsync(list);
    }
    /// <summary>
    /// å¯¼å…¥$ChinaComment$
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    /// <exception cref="UserFriendlyException"></exception>
    public async Task ImportAsync($EntityName$sImportModel input)
    {
        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$s = input.$EntityInstanceName$s;
        if ($EntityInstanceName$s != null && $EntityInstanceName$s.Any())
        {
            #region å¯¼å…¥æ ¡éªŒ
            // åˆ¤æ–­åç§°æ˜¯å¦é‡å¤ï¼Œå¹¶è¾“出第几行重复
            var duplicate$EntityName$s = $EntityInstanceName$s.GroupBy(x => x.MaterialCode).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)},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
            #endregion
            foreach (var $EntityInstanceName$ in $EntityInstanceName$s)
            {
                if ($EntityInstanceName$.MaterialCode.IsNullOrWhiteSpace() && $EntityInstanceName$.MaterialName.IsNullOrWhiteSpace())
                {
                    continue;
                }
                if ($EntityInstanceName$.MaterialCode.IsNullOrWhiteSpace())
                {
                    var errorMsg = $"导入失败!配置,第{$EntityInstanceName$.RowIndex}行:$EntityInstanceName$名称不能为空";
                    throw new UserFriendlyException(errorMsg);
                }
                var old$EntityName$ = await $EntityInstanceName$Repository.FindByNameAsync($EntityName$.MaterialCode);
                if (old$EntityName$ != null)
                {
                    var $EntityInstanceName$UpdateDto = new $EntityName$UpdateDto
                    {
                        $UpdateAttributesForImport$
                    };
                    $EntityInstanceName$UpdateDtos.Add(($EntityName$.RowIndex, old$EntityName$.Id, $EntityInstanceName$UpdateDto));
                }
                else
                {
                    var $EntityName$CreateDto = new $EntityName$CreateDto
                    {
                        $UpdateAttributesForImport$
                    };
                    $EntityInstanceName$CreateDtos.Add(($EntityName$.RowIndex, $EntityName$CreateDto));
                }
            }
        }
        // æ–°å¢ž
        foreach (var $EntityName$Dto in $EntityInstanceName$CreateDtos)
        {
            try
            {
                await CreateAsync($EntityName$Dto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{$EntityName$Dto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
        // æ›´æ–°
        foreach (var $EntityName$Dto in $EntityInstanceName$UpdateDtos)
        {
            try
            {
                await UpdateAsync($EntityName$Dto.Id, $EntityName$Dto.Item);
            }
            catch (Exception e)
            {
                var errorMsg = $"导入失败!配置,第{$EntityName$Dto.RowIndex}行:{e.Message},终止导入";
                throw new UserFriendlyException(errorMsg);
            }
        }
    }
    /// <summary>
    /// å¯¼å‡º$ChinaComment$
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public async Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(Get$EntityName$Input input)
    {
        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.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),
        };
        var fileName = result.Count > 1 ? "$EntityName$列表" : result.Count == 1 ? result[0]?.MaterialCode : "$EntityName$模版";
        return (sheets, fileName);
    }
    /// <summary>
    /// æ ¡éªŒ$ChinaComment$,当新建或更新时
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    protected Task CheckCreateOrUpdateDtoAsync($EntityName$CreateOrUpdateDtoBase input)
    {
        Check.NotNull(input, nameof(input));
        $UpdateAttributesForCheckCreateOrUpdateDtoAsync$
        return Task.CompletedTask;
    }
}
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Utility/CommonHelper.cs
@@ -43,6 +43,7 @@
            str = str.Replace("$ChinaComment$", param.ChinaComment);//中文注释
            str = str.Replace("$EntityName$", param.EntityName);//实体类名
            str = str.Replace("$Modulelogo$", param.Modulelogo);//模块简写
            str = str.Replace("$EntityInstanceName$", param.EntityInstanceName);//实例名
        }
Weben_CMSרÓôúÂëÉú³ÉÆ÷/Code/Utility/StructStrHelper.cs
@@ -278,6 +278,130 @@
        }
        /// <summary>
        /// ç”Ÿæˆå±žæ€§å­—符串ForAddModel-更新实体专用
        /// </summary>
        /// <param name="columnModel"></param>
        /// <returns></returns>
        public static string GenerateAttributeForUpdateModel(ColumnModel columnModel, GenerateCodeParam param)
        {
            try
            {
                string attr = columnModel.ColumnName;
                string attrStr = "";
                attrStr += $"        updateObj.{attr} = input.{attr};\n";
                return attrStr;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// ç”Ÿæˆå±žæ€§å­—符串ForAddModel-更新实体专用(导入时)
        /// </summary>
        /// <param name="columnModel"></param>
        /// <returns></returns>
        public static string GenerateAttributeForUpdateModelByImport(ColumnModel columnModel, GenerateCodeParam param)
        {
            try
            {
                string attr = columnModel.ColumnName;
                string attrStr = "";
                attrStr += $"        {attr} = {param.EntityInstanceName}.{attr};\n";
                return attrStr;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// ç”Ÿæˆå±žæ€§å­—符串ForAddModel-CheckCreateOrUpdateDtoAsync专用
        /// </summary>
        /// <param name="columnModel"></param>
        /// <returns></returns>
        public static string GenerateAttributeForCheckCreateOrUpdateDtoAsync(ColumnModel columnModel, GenerateCodeParam param)
        {
            try
            {
                string attr = columnModel.ColumnName;
                string attrStr = "";
                bool isHaveMaxLength = false;
                if (!string.IsNullOrEmpty(columnModel.DataLength))
                {
                    isHaveMaxLength = true;
                }
                if (columnModel.IsNullable == false)
                {//必填
                    DataTypeEnum myDataType = (DataTypeEnum)Enum.Parse(typeof(DataTypeEnum), "dt_" + columnModel.DataType);
                    switch (myDataType)
                    {
                        case DataTypeEnum.dt_datetime:
                        case DataTypeEnum.dt_datetime2:
                        case DataTypeEnum.dt_datetimeoffset:
                            if (isHaveMaxLength)
                            {
                                attrStr += $"        Check.NotNull(input.{attr}, \"{columnModel.Description}\", {columnModel.DataLength});\n";
                            }
                            else
                            {
                                attrStr += $"        Check.NotNull(input.{attr}, \"{columnModel.Description}\");\n";
                            }
                            break;
                        case DataTypeEnum.dt_bigint:
                            if (isHaveMaxLength)
                            {
                                attrStr += $"        Check.NotNull(input.{attr}, \"{columnModel.Description}\", {columnModel.DataLength});\n";
                            }
                            else
                            {
                                attrStr += $"        Check.NotNull(input.{attr}, \"{columnModel.Description}\");\n";
                            }
                            break;
                        case DataTypeEnum.dt_int:
                        case DataTypeEnum.dt_tinyint:
                            if (isHaveMaxLength)
                            {
                                attrStr += $"        Check.NotNull(input.{attr}, \"{columnModel.Description}\", {columnModel.DataLength});\n";
                            }
                            else
                            {
                                attrStr += $"        Check.NotNull(input.{attr}, \"{columnModel.Description}\");\n";
                            }
                            break;
                        default:
                            if (isHaveMaxLength)
                            {
                                attrStr += $"        Check.NotNullOrWhiteSpace(input.{attr}, \"{columnModel.Description}\", {columnModel.DataLength});\n";
                            }
                            else
                            {
                                attrStr += $"        Check.NotNullOrWhiteSpace(input.{attr}, \"{columnModel.Description}\");\n";
                            }
                            break;
                    }
                }
                return attrStr;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// ç”Ÿæˆå±žæ€§å­—符串ForAddModel-Dto实体专用
        /// </summary>
        /// <param name="columnModel"></param>