文件内容 LevelHandler.cs 13 KB 13086 字符
//using ExampleApeart.Application.Contracts;
//using ExampleApeart.EntityFrameworkCore;
//using ExampleApeart.usermodels;
//using Mapster;
//using Microsoft.EntityFrameworkCore;
//using PasteApeart.Application.Contracts;

//namespace ExampleApeart.Handler
//{
//    /// <summary>
//    /// 多层级 非递归多层级新增和更新
//    /// </summary>
//    public class LevelHandler
//    {
//        /// <summary>
//        /// 这是一个新增案例
//        ///</summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        public static async Task<RoleInfoDto> RoleAdd(IExampleApeartDbContext _dbContext, RoleInfoAddDto input)
//        {
//            if (input.Sort == 0)
//            {
//                var _max = await _dbContext.RoleInfo.Where(x => x.FatherId == input.FatherId)
//                    .OrderByDescending(x => x.Sort)
//                    .Select(x => x.Sort)
//                    .FirstOrDefaultAsync();
//                input.Sort = _max + 10;
//            }

//            if (input.RoleType == 0)
//            {
//                if (String.IsNullOrEmpty(input.Model) || String.IsNullOrEmpty(input.Role))
//                {
//                    throw new PasteCodeException("新增权限的时候,模块和权限必填,请重新填写!");
//                }
//                var find = await _dbContext.RoleInfo.Where(x => x.RoleType == 0 && x.Model == input.Model && x.Role == input.Role).Select(x => x.Id).FirstOrDefaultAsync();
//                if (find > 0)
//                {
//                    throw new PasteCodeException("已经有这个菜单项了,请勿重复添加!");
//                }
//            }
//            if (input.RoleType == EnumRoleType.Menu)
//            {
//                if (!string.IsNullOrEmpty(input.Path))
//                {
//                    if (input.FatherId == 0)
//                    {
//                        throw new PasteCodeException("非一级菜单,父级必选,请重新选择!");
//                    }
//                    var find = await _dbContext.RoleInfo.Where(x => x.RoleType == EnumRoleType.Menu && x.Path == input.Path).Select(x => x.Id).FirstOrDefaultAsync();
//                    if (find > 0)
//                    {
//                        throw new PasteCodeException("已经有这个菜单项了,请勿重复添加!");
//                    }
//                }
//            }

//            //这里最好用事务包裹下
//            //var info = ObjectMapper.Map<RoleInfoAddDto, RoleInfo>(input);
//            var info = input.Adapt<RoleInfo>();
//            info.IsEnable = true;//添加自定义
//            _dbContext.Add(info);
//            await _dbContext.SaveChangesAsync();
//            await AfterAdd(_dbContext, nameof(RoleInfo), info);
//            await _dbContext.SaveChangesAsync();

//            //var backinfo = ObjectMapper.Map<RoleInfo, RoleInfoDto>(info);
//            var backinfo = info.Adapt<RoleInfoDto>();
//            return backinfo;
//        }

//        /// <summary>
//        /// 这是一个更新案例
//        ///</summary>
//        /// <param name="input"></param>
//        /// <returns></returns>
//        public static async Task<RoleInfoDto> RoleUpdate(IExampleApeartDbContext _dbContext, RoleInfoUpdateDto input)
//        {
//            if (input.Sort == 0)
//            {
//                var _max = await _dbContext.RoleInfo.Where(x => x.FatherId == input.FatherId)
//                    .OrderByDescending(x => x.Sort)
//                    .Select(x => x.Sort)
//                    .FirstOrDefaultAsync();
//                input.Sort = _max + 10;
//            }

//            if (input.RoleType == 0)
//            {
//                if (String.IsNullOrEmpty(input.Model) || String.IsNullOrEmpty(input.Role))
//                {
//                    throw new PasteCodeException("新增权限的时候,模块和权限必填,请重新填写!");
//                }
//                var find = await _dbContext.RoleInfo.Where(x => x.RoleType == 0 && x.Model == input.Model && x.Role == input.Role && x.Id != input.Id).Select(x => x.Id).FirstOrDefaultAsync();
//                if (find > 0)
//                {
//                    throw new PasteCodeException("已经有这个菜单项了,请勿重复添加!");
//                }
//            }
//            if (input.RoleType == EnumRoleType.Menu)
//            {
//                if (!string.IsNullOrEmpty(input.Path))
//                {
//                    if (input.FatherId == 0)
//                    {
//                        throw new PasteCodeException("非一级菜单,父级必选,请重新选择!");
//                    }
//                    var find = await _dbContext.RoleInfo.Where(x => x.RoleType == EnumRoleType.Menu && x.Path == input.Path && x.Id != input.Id).Select(x => x.Id).FirstOrDefaultAsync();
//                    if (find > 0)
//                    {
//                        throw new PasteCodeException("已经有这个菜单项了,请勿重复添加!");
//                    }
//                }
//            }

//            var info = await _dbContext.RoleInfo.Where(x => x.Id == input.Id).FirstOrDefaultAsync();
//            if (info == null || info == default)
//            {
//                throw new PasteCodeException("需要查询的信息不存在");
//            }
//            //ObjectMapper.Map<RoleInfoUpdateDto, RoleInfo>(input, info);
//            input.Adapt(info);
//            await AfterUpdate(_dbContext, nameof(RoleInfo), info);
//            //var backinfo = ObjectMapper.Map<RoleInfo, RoleInfoDto>(info);?
//            var backinfo = info.Adapt<RoleInfoDto>();
//            await _dbContext.SaveChangesAsync();
//            return backinfo;
//        }

//        /// <summary>
//        /// 新增后 注意外部要保存下
//        /// </summary>
//        /// <param name="_dbContext"></param>
//        /// <param name="TableName">应该是PropertyName</param>
//        /// <param name="info"></param>
//        public static async Task AfterAdd(IExampleApeartDbContext _dbContext, string TableName, ILevelEntity info)
//        {
//            info.SortStr = info.Sort.ToString().PadLeft(_persize, '0') + "0".PadLeft((_maxlevel - 1) * _persize, '0');
//            if (info.FatherId <= 0)
//            {
//                info.FatherStr = $"{info.Id},";
//                info.RootId = info.Id;
//                return;
//            }

//            var dbType = _dbContext.GetType();
//            var dbProperty = dbType.GetProperty(TableName);
//            if (dbProperty != null)
//            {
//                var dbSet = dbProperty.GetValue(_dbContext) as IQueryable<ILevelEntity>;
//                if (dbSet != null)
//                {

//                    var father = await dbSet.Where(x => x.Id == info.FatherId).AsNoTracking().FirstOrDefaultAsync();
//                    if (father != null && father != default)
//                    {
//                        info.FatherStr = $"{father.FatherStr}{info.Id},";
//                        info.Level = (father.Level + 1);
//                        info.FatherId = father.Id;
//                        info.RootId = father.RootId != 0 ? father.RootId : father.Id;
//                        BuildSortStr(info, father);
//                    }
//                    else
//                    {
//                        info.FatherId = 0;
//                    }

//                }
//            }
//        }

//        /// <summary>
//        /// 更新后 注意外部要保存下
//        /// </summary>
//        /// <param name="_dbContext"></param>
//        /// <param name="TableName">应该是PropertyName</param>
//        /// <param name="info"></param>
//        /// <returns></returns>
//        public static async Task AfterUpdate(IExampleApeartDbContext _dbContext, string TableName, ILevelEntity info)
//        {
//            IQueryable<ILevelEntity> dbSet = null;
//            var dbType = _dbContext.GetType();
//            var dbProperty = dbType.GetProperty(TableName);
//            if (dbProperty != null)
//            {
//                dbSet = dbProperty.GetValue(_dbContext) as IQueryable<ILevelEntity>;
//            }
//            if (dbSet == null)
//            {
//                return;
//            }
//            var old_father_str = info.FatherStr;
//            var _chat_level = info.Level;

//            if (info.FatherId != 0)
//            {
//                var father = await dbSet.Where(x => x.Id == info.FatherId).AsNoTracking().FirstOrDefaultAsync();
//                if (father != null && father != default)
//                {
//                    info.Level = father.Level + 1;
//                    info.FatherStr = $"{father.FatherStr}{info.Id},";
//                    info.RootId = father.RootId;
//                    BuildSortStr(info, father);
//                }
//                else
//                {
//                    info.FatherId = 0;
//                    info.FatherStr = $"{info.Id},";
//                    info.Level = 0;
//                    info.RootId = info.Id;
//                    BuildSortStr(info, null);
//                }
//            }
//            else
//            {
//                info.FatherId = 0;
//                info.FatherStr = $"{info.Id},";
//                info.Level = 0;
//                info.RootId = info.Id;
//                BuildSortStr(info, null);
//            }
//            _chat_level = _chat_level - (info.Level);
//            if (!String.IsNullOrEmpty(old_father_str))
//            {
//                var suns = await dbSet.Where(x => x.Id != info.Id && x.FatherStr.StartsWith(old_father_str)).ToListAsync();
//                if (suns != null && suns.Count > 0)
//                {
//                    foreach (var item in suns)
//                    {
//                        item.FatherStr = item.FatherStr.Replace(old_father_str, info.FatherStr);
//                        item.Level = item.Level + _chat_level;
//                        item.RootId = info.RootId;
//                        BuildFootSortStr(item, info);
//                    }
//                }
//            }
//        }

//        /// <summary>
//        /// 自动排序 基于同层级排序到后面,只有当当前是0的时候生效
//        /// </summary>
//        /// <param name="_dbContext"></param>
//        /// <param name="TableName">应该是PropertyName</param>
//        /// <param name="input"></param>
//        /// <param name="step"></param>
//        /// <returns></returns>
//        public static async Task AutoSort(IExampleApeartDbContext _dbContext, string TableName, ILevelEntity input, int step = 10)
//        {
//            if (input.Sort == 0)
//            {
//                var dbType = _dbContext.GetType();
//                var dbProperty = dbType.GetProperty(TableName);
//                if (dbProperty != null)
//                {
//                    var dbSet = dbProperty.GetValue(_dbContext) as IQueryable<ILevelEntity>;
//                    if (dbSet != null)
//                    {

//                        var _max = await dbSet.Where(x => x.FatherId == input.FatherId)
//                            .OrderByDescending(x => x.Sort)
//                            .Select(x => x.Sort)
//                            .FirstOrDefaultAsync();
//                        input.Sort = _max + 10;
//                    }
//                }
//            }
//        }

//        /// <summary>
//        /// 每层最大支持的排序位数 5表示00000
//        /// </summary>
//        private const int _persize = 5;
//        /// <summary>
//        /// 最大层级个数,从0开始 比如4就是 0 1 2 3
//        /// </summary>
//        private const int _maxlevel = 4;

//        /// <summary>
//        /// 基于父级和当前自己的排序信息,构建对应的排序字符串
//        /// </summary>
//        /// <param name="_info"></param>
//        /// <param name="_father"></param>
//        private static void BuildSortStr(ILevelEntity _info, ILevelEntity _father)
//        {
//            if (_info.Level < _maxlevel)
//            {
//                if (_father == null)
//                {
//                    _info.SortStr = _info.Sort.ToString().PadLeft(_persize, '0') + "0".PadLeft(_persize * (_maxlevel - 1), '0');
//                }
//                else
//                {
//                    if (!string.IsNullOrEmpty(_father.SortStr))
//                    {
//                        _info.SortStr = _father.SortStr.Substring(0, (_father.Level + 1) * _persize) + _info.Sort.ToString().PadLeft(_persize, '0');
//                        //补充尾巴
//                        if (_info.Level < (_maxlevel - 1))
//                        {
//                            _info.SortStr += "0".PadLeft(_persize * (_maxlevel - 1 - _info.Level), '0');
//                        }
//                    }
//                }
//            }
//        }

//        /// <summary>
//        /// 上级或者祖籍变更的替换,自己之后的不变,中间层级也不变 
//        /// </summary>
//        /// <param name="_info"></param>
//        /// <param name="_father">是自己的上级或者祖级</param>
//        private static void BuildFootSortStr(ILevelEntity _info, ILevelEntity _father)
//        {
//            var _old_sort_str = _info.SortStr;
//            _info.SortStr = _father.SortStr.Substring(0, (_father.Level + 1) * _persize);
//            _info.SortStr += _old_sort_str.Substring((_father.Level + 1) * _persize);
//        }

//    }
//}
​ ​