示例#1
0
 public void Update(PermissionInput entity)
 {
     this.DbHelper.Execute(this.Table, proc =>
                           proc.AsUpdate(entity, "ParentId", "Name", "Modifier", "ModifyTime")
                           .Where("Id", entity.Id)
                           );
 }
示例#2
0
        public void Delete(PermissionInput entity)
        {
            entity.IsDeleted = 1;

            this.DbHelper.Execute(this.Table, proc =>
                                  proc.AsUpdate(entity, "IsDeleted", "Modifier", "ModifyTime")
                                  .Where("Id", entity.Id)
                                  );
        }
示例#3
0
        public async Task <bool> SaveAsync(PermissionInput permissionInput, ModelStateDictionary modelState)
        {
            bool result = await _repository.SaveAsync(permissionInput, modelState);

            if (result)
            {
                await RemoveCacheAsync();
            }
            else
            {
                modelState.AddModelError("Name", "添加或编辑时保存失败");
            }
            return(result);
        }
示例#4
0
        public async Task <bool> SaveAsync(PermissionInput permissionInput, ModelStateDictionary modelState)
        {
            bool result = await _manager.SaveAsync(permissionInput, modelState);

            if (result)
            {
                CleanupCache();
            }
            else
            {
                modelState.AddModelError("Name", "添加或编辑时保存失败");
            }
            return(result);
        }
示例#5
0
        /// <summary>
        /// SaveAsync
        /// </summary>
        /// <param name="permissionInput"></param>
        /// <param name="modelState"></param>
        /// <returns></returns>
        public async Task <bool> SaveAsync(PermissionInput permissionInput, ModelStateDictionary modelState)
        {
            string sql;

            Permission permissionToSave = null;

            if (!permissionInput.PermissionId.IsNullOrEmpty())
            {
                permissionToSave = await _context.Permission.FirstOrDefaultAsync(m => m.PermissionId == permissionInput.PermissionId.Value);

                if (permissionInput.PermissionId == permissionInput.ParentId)
                {
                    modelState.AddModelError("PermissionId", "尝试将自身作为父节点");
                    return(false);
                }
            }
            //添加操作
            if (permissionToSave == null)
            {
                #region 添加操作
                //创建要保存的对象
                permissionToSave = new Permission
                {
                    //提取权限时,permissionToSave的PermissionId为null,这时不用创建新Id
                    PermissionId = permissionInput.PermissionId.IsNullOrEmpty() ? Guid.NewGuid() : permissionInput.PermissionId.Value,
                    ParentId     = permissionInput.ParentId,
                    ModuleName   = permissionInput.ModuleName,
                    Name         = permissionInput.Name,
                };
                _context.Permission.Add(permissionToSave);
                //如果添加的是新的顶级节点,直接添加到末尾,不会影响其他节点
                if (permissionInput.ParentId.IsNullOrEmpty())
                {
                    permissionToSave.DisplayOrder = await GetMaxDisplayOrderAsync() + 1;

                    permissionToSave.Level = 1;
                }
                else//如果添加的是子节点,会影响其他节点的DisplayOrder
                {
                    //父节点树的最大DisplayerOrder
                    int maxDisplayOrderInParentTree = await GetMaxDisplayOrderInParentTreeAsync(permissionInput.ParentId.Value);

                    //父节点树的最大DisplayerOrder基础上加1作为保存对象的DisplayOrder
                    permissionToSave.DisplayOrder = maxDisplayOrderInParentTree + 1;
                    //父节点的Level基础上加1作为保存对象的Level
                    permissionToSave.Level = await GetLevelAsync(permissionInput.ParentId.Value) + 1;

                    //父节点树之后的所有节点的DisplayOrder加1
                    sql = "Update Permission Set DisplayOrder=DisplayOrder+1 Where DisplayOrder > @DisplayOrder";
                    await _context.Database.ExecuteSqlCommandAsync(sql, new SqlParameter("DisplayOrder", maxDisplayOrderInParentTree));
                }
                #endregion
            }
            else//编辑操作
            {
                permissionToSave.ModuleName = permissionInput.ModuleName;
                permissionToSave.Name       = permissionInput.Name;

                //如果父节点不改变,则仅仅保存数据就行了。下面处理的是父节点改变了的情况
                //如果父节点改变(从无父节点到有父节点,从有父节点到无父节点,从一个父节点到另一个父节点)
                if (permissionInput.ParentId != permissionToSave.ParentId)
                {
                    permissionToSave.ParentId = permissionInput.ParentId;

                    //获取当前节点的下一个兄弟节点或更高层下一个父节点(不是自己的父节点)的DisplayOrder
                    int displayOrderOfNextParentOrNextBrother = await GetDisplayOrderOfNextParentOrNextBrotherAsync(permissionToSave);

                    #region 当前节点树Id集合

                    List <Guid> currTreeIds;
                    if (displayOrderOfNextParentOrNextBrother == 0)
                    {
                        //说明当前节点是最后一个节点,直接获取
                        currTreeIds = await _context.Permission.Where(m => m.DisplayOrder >= permissionToSave.DisplayOrder).Select(m => m.PermissionId).ToListAsync();
                    }
                    else
                    {
                        currTreeIds = await _context.Permission
                                      .Where(m => m.DisplayOrder >= permissionToSave.DisplayOrder && m.DisplayOrder < displayOrderOfNextParentOrNextBrother)
                                      .Select(m => m.PermissionId).ToListAsync();
                    }
                    int currentTreeItemCount = currTreeIds.Count;

                    #endregion

                    //当前节点将由子节点升为顶级节点,直接将该节点数移到最后
                    if (!permissionToSave.ParentId.HasValue)
                    {
                        #region 将由子节点升为顶级节点

                        //需要提升的层级数
                        int xLevel = permissionToSave.Level - 1;

                        //当前节点树之后已无任何节点
                        if (displayOrderOfNextParentOrNextBrother == 0)
                        {
                            //将当前节点树的所有节点的Level都进行提升
                            sql = "Update Permission Set Level = Level - @Level Where DisplayOrder>=@DisplayOrder";
                            await _context.Database.ExecuteSqlCommandAsync(sql
                                                                           , new SqlParameter("Level", xLevel)
                                                                           , new SqlParameter("DisplayOrder", permissionToSave.DisplayOrder)
                                                                           );
                        }
                        else//当前节点树之后还有节点,应该将这些节点的向前面排,并且将当前节点树的所有节点往后排
                        {
                            //当前节点树之后的节点数量
                            int nextItemCount = await _context.Permission.CountAsync(m => m.DisplayOrder >= displayOrderOfNextParentOrNextBrother);

                            sql = "Update Permission Set DisplayOrder = DisplayOrder - @CTIC Where DisplayOrder>=@DOONPONB";

                            await _context.Database.ExecuteSqlCommandAsync(sql
                                                                           , new SqlParameter("CTIC", currentTreeItemCount)
                                                                           , new SqlParameter("DOONPONB", displayOrderOfNextParentOrNextBrother)
                                                                           );

                            sql = "Update Permission Set Level = Level - @Level,DisplayOrder = DisplayOrder + @NextItemCount Where 1<>1 ";
                            foreach (var id in currTreeIds)
                            {
                                sql += " Or PermissionId = '{0}'".FormatWith(id.ToString());
                            }

                            await _context.Database.ExecuteSqlCommandAsync(sql
                                                                           , new SqlParameter("Level", xLevel)
                                                                           , new SqlParameter("NextItemCount", nextItemCount)
                                                                           );
                        }

                        #endregion
                    }
                    else//当前节点将改变父节点,包括从顶级节点移至另一节点下,或从当前父节点下移至另一节点下
                    {
                        #region 从顶级节点移至另一节点下,或从当前父节点下移至另一节点下

                        //目标父节点
                        var tarParent = await _context.Permission.AsNoTracking().FirstOrDefaultAsync(m => m.PermissionId == permissionInput.ParentId.Value);

                        int xDisplayOrder = permissionToSave.DisplayOrder - tarParent.DisplayOrder;
                        int xLevel        = permissionToSave.Level - tarParent.Level;

                        if (xDisplayOrder > 0)//从下往上移
                        {
                            #region 从下往上移
                            //特例处理,当前节点要移至的父节点就是上一个节点,只需要改变当前树Level
                            if (xDisplayOrder == 1)
                            {
                                sql = "Update Permission Set Level = Level - @Level Where 1<>1 ";
                                foreach (var id in currTreeIds)
                                {
                                    sql += " Or PermissionId = '{0}'".FormatWith(id.ToString());
                                }

                                await _context.Database.ExecuteSqlCommandAsync(sql
                                                                               , new SqlParameter("Level", xLevel - 1)
                                                                               );
                            }
                            else
                            {
                                //新的父节点和本节点之间的节点往下移动,DisplayOrder增加
                                sql = "Update Permission Set DisplayOrder=DisplayOrder+@CurTreeCount Where DisplayOrder>@TDisplayOrder And DisplayOrder<@CDisplayOrder";
                                await _context.Database.ExecuteSqlCommandAsync(sql
                                                                               , new SqlParameter("CurTreeCount", currentTreeItemCount)
                                                                               , new SqlParameter("TDisplayOrder", tarParent.DisplayOrder)
                                                                               , new SqlParameter("CDisplayOrder", permissionToSave.DisplayOrder)
                                                                               );

                                sql = "Update Permission Set DisplayOrder = DisplayOrder-@XCount,Level = Level - @Level Where 1<>1 ";
                                foreach (var id in currTreeIds)
                                {
                                    sql += " Or PermissionId = '{0}'".FormatWith(id.ToString());
                                }
                                await _context.Database.ExecuteSqlCommandAsync(sql
                                                                               , new SqlParameter("XCount", xDisplayOrder - 1)//也就是新节点和本节点之间的节点的数量
                                                                               , new SqlParameter("Level", xLevel - 1)
                                                                               );
                            }
                            #endregion
                        }
                        else//从上往下移
                        {
                            #region 从上往下移
                            // 本节点树下已经不存在任何节点了,当然无法向下移
                            if (displayOrderOfNextParentOrNextBrother == 0)
                            {
                                modelState.AddModelError("PermissionId", "节点已处于最后位置,无法下移");
                                return(false);
                            }

                            // 更新本节点树至新的父节点(包括新的父节点)之间的节点的DisplayOrder
                            sql = "Update Permission Set DisplayOrder=DisplayOrder-@CurTreeCount Where DisplayOrder>=@DOONPONB And DisplayOrder<=@TDisplayOrder";
                            await _context.Database.ExecuteSqlCommandAsync(sql
                                                                           , new SqlParameter("CurTreeCount", currentTreeItemCount)
                                                                           , new SqlParameter("DOONPONB", displayOrderOfNextParentOrNextBrother)
                                                                           , new SqlParameter("TDisplayOrder", tarParent.DisplayOrder)
                                                                           );

                            // 本节点至新的节点之间的节点数
                            int nextItemCount = tarParent.DisplayOrder - displayOrderOfNextParentOrNextBrother + 1;
                            sql = "Update Permission Set DisplayOrder = DisplayOrder+ @XCount,Level = Level - @Level Where 1<>1 ";
                            foreach (var id in currTreeIds)
                            {
                                sql += " Or PermissionId = '{0}'".FormatWith(id.ToString());
                            }
                            await _context.Database.ExecuteSqlCommandAsync(sql
                                                                           , new SqlParameter("XCount", nextItemCount)
                                                                           , new SqlParameter("Level", xLevel - 1)
                                                                           );

                            #endregion
                        }

                        #endregion
                    }
                }
            }
            await _context.SaveChangesAsync();

            return(true);
        }
示例#6
0
        public async Task <Permission> ModifyPermission([Service] DBAttendanceContext dBAttendanceContext, PermissionInput input)
        {
            try
            {
                var permission = await dBAttendanceContext.Permission.FindAsync(input.Id);

                if (permission != null)
                {
                    permission.Date   = input.Date;
                    permission.Motive = input.Motive;
                    permission.State  = input.State;
                    await dBAttendanceContext.SaveChangesAsync();

                    return(permission);
                }
                else
                {
                    throw new QueryException("No se encontró el permiso.");
                }
            }
            catch (System.Exception e)
            {
                throw new QueryException(e.Message);
            }
        }
示例#7
0
        public async Task <Permission> AddPermission([Service] DBAttendanceContext dBAttendanceContext, PermissionInput input)
        {
            try
            {
                var permission = new Permission
                {
                    Date           = input.Date,
                    Motive         = input.Motive,
                    EmployeeCardId = input.EmployeeCardId
                };
                dBAttendanceContext.Permission.Add(permission);
                await dBAttendanceContext.SaveChangesAsync();

                return(permission);
            }
            catch (System.Exception e)
            {
                throw new QueryException(e.Message);
            }
        }
示例#8
0
 public void Insert(PermissionInput entity)
 {
     this.DbHelper.Execute(this.Table, proc =>
                           proc.AsInsert(entity, "Id", "Creator", "CreateTime", "IsDeleted", "ParentId", "Name")
                           );
 }