/// <summary>
        /// 添加或修改用户组
        /// </summary>
        /// <param name="Id"></param>
        /// <param name="GroupName">新名字</param>
        /// <param name="ParentId">父级组</param>
        /// <param name="appid">appid</param>
        /// <returns></returns>
        public ActionResult Save(int Id = 0, string GroupName = "", int?ParentId = null, string appid = "")
        {
            ParentId = ParentId == 0 ? null : ParentId;
            UserGroup group = UserGroupBll.GetById(Id);

            if (group != null)
            {
                //修改
                if (UserGroupBll.Any(a => a.GroupName.Equals(GroupName) && !a.GroupName.Equals(group.GroupName)))
                {
                    return(ResultData(null, false, $"{GroupName} 用户组已经存在!"));
                }
                group.GroupName = GroupName;
                group.ParentId  = ParentId;
                bool b = UserGroupBll.UpdateEntitySaved(@group);
                return(ResultData(null, b, b ? "修改成功" : "修改失败!"));
            }
            //添加
            if (UserGroupBll.Any(a => a.GroupName.Equals(GroupName)))
            {
                return(ResultData(null, false, $"{GroupName} 用户组已经存在!"));
            }
            group = new UserGroup {
                GroupName = GroupName, ParentId = ParentId
            };
            if (!string.IsNullOrEmpty(appid) && ClientAppBll.Any(a => a.AppId.Equals(appid)))
            {
                var app = ClientAppBll.GetFirstEntity(a => a.AppId.Equals(appid));
                app.UserGroup.Add(group);
                bool b = ClientAppBll.UpdateEntitySaved(app);
                return(ResultData(null, b, b ? "用户组添加成功!" : "用户组添加失败!"));
            }
            group = UserGroupBll.AddEntitySaved(group);
            return(@group != null?ResultData(@group, true, "用户组添加成功!") : ResultData(null, false, "用户组添加失败!"));
        }
        /// <summary>
        /// 从应用移除用户
        /// </summary>
        /// <param name="id"></param>
        /// <param name="aids"></param>
        /// <returns></returns>
        public ActionResult RemoveApps(int id, string aids)
        {
            string[]  ids    = aids.Split(',');
            UserGroup @group = UserGroupBll.GetById(id);

            if (@group is null)
            {
                return(ResultData(null, false, "未找到用户组!"));
            }

            List <ClientApp> users = ClientAppBll.LoadEntities(u => ids.Contains(u.Id.ToString())).ToList();

            users.ForEach(u => { @group.ClientApp.Remove(u); });
            bool b = UserGroupBll.UpdateEntitySaved(@group);

            return(ResultData(null, b, b ? "移除客户端子系统成功!" : "移除客户端子系统失败!"));
        }
        /// <summary>
        /// 从应用移除用户
        /// </summary>
        /// <param name="id"></param>
        /// <param name="uids"></param>
        /// <returns></returns>
        public ActionResult RemoveUsers(int id, string uids)
        {
            string[]  ids    = uids.Split(',');
            UserGroup @group = UserGroupBll.GetById(id);

            if (@group is null)
            {
                return(ResultData(null, false, "未找到用户组!"));
            }

            List <UserInfo> users = UserInfoBll.LoadEntities(u => ids.Contains(u.Id.ToString())).ToList();

            users.ForEach(u => { @group.UserInfo.Remove(u); });
            bool b = UserGroupBll.UpdateEntitySaved(@group);

            return(ResultData(null, b, b ? "移除用户成功!" : "移除用户失败!"));
        }
        /// <summary>
        /// 改变父级组
        /// </summary>
        /// <param name="id"></param>
        /// <param name="pid"></param>
        /// <returns></returns>
        public ActionResult ChangeParent(int id, int?pid)
        {
            UserGroup @group = UserGroupBll.GetById(id);

            if (pid.HasValue)
            {
                UserGroup parent = UserGroupBll.GetById(pid);
                if (parent is null)
                {
                    pid = null;
                }
            }

            group.ParentId = pid;
            bool b = UserGroupBll.UpdateEntitySaved(@group);

            return(ResultData(null, b, b ? "父级指派成功!" : "父级指派失败!"));
        }
        /// <summary>
        /// 获取用户组详情
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public ActionResult Details(int id)
        {
            UserGroup @group = UserGroupBll.GetById(id);

            if (@group != null)
            {
                (IQueryable <ClientApp>, IQueryable <UserInfo>, List <UserGroup>, List <UserGroupRole>, List <Permission>, List <Control>, List <Menu>)details = UserGroupBll.Details(@group);
                return(ResultData(new
                {
                    result = group.Mapper <UserGroupOutputDto>(),
                    apps = details.Item1.ToList().Mapper <List <ClientAppInputDto> >(),
                    groups = details.Item3.Mapper <List <UserGroupInputDto> >(),
                    roles_allow = details.Item4.Where(g => g.HasRole).Select(g => g.Role).Mapper <List <RoleInputDto> >(),
                    roles_forbid = details.Item4.Where(g => !g.HasRole).Select(g => g.Role).Mapper <List <RoleInputDto> >(),
                    permissions = details.Item5.Mapper <List <PermissionInputDto> >(),
                    controls = details.Item6.Mapper <List <ControlOutputDto> >(),
                    menus = details.Item7.Mapper <List <MenuOutputDto> >()
                }));
            }
            return(ResultData(null, false, "用户组不存在"));
        }
        /// <summary>
        /// 添加角色
        /// </summary>
        /// <param name="id">用户组id</param>
        /// <param name="rids">角色id</param>
        /// <returns></returns>
        public ActionResult AddRoles(int id, string rids)
        {
            string[] ids    = rids.Split(',');
            var      @group = UserGroupBll.GetById(id);

            if (group is null)
            {
                return(ResultData(null, false, "用户组不存在"));
            }

            List <Role> roles = RoleBll.LoadEntities(r => ids.Contains(r.Id.ToString())).ToList();

            roles.ForEach(r =>
            {
                UserGroupRole groupRole = new UserGroupRole()
                {
                    UserGroupId = @group.Id, HasRole = true, RoleId = r.Id, Role = r, UserGroup = @group
                };
                UserGroupRoleBll.AddEntity(groupRole);
            });
            UserGroupRoleBll.BulkSaveChanges();
            return(ResultData(null, true, "角色配置完成!"));
        }
        /// <summary>
        /// 获取用户组详情
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public ActionResult Get(int id)
        {
            UserGroupOutputDto group = UserGroupBll.GetById(id).Mapper <UserGroupOutputDto>();

            return(ResultData(group));
        }