using APT.BaseData.Domain.Entities;
using APT.BaseData.Domain.Enums;
using APT.Infrastructure.Core;
using APT.BaseData.Domain.Entities.FM;
using APT.BaseData.Domain.IServices.FM;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using APT.Utility;
using APT.BaseData.Domain.ApiModel;
using System.IO;
using APT.BaseData.Domain.ApiModel.FM;
using NPOI.SS.Formula.Functions;
using APT.BaseData.Domain.ApiModel.Platform;
using System.Dynamic;
using APT.BaseData.Domain.Entities.PF;
namespace APT.FM.WebApi.Controllers.Api.FM
{
    /// 
    /// 角色
    /// 
    [Route("api/FM/Role")]
    public class RoleController : AuthorizeApiController
    {
        #region
        /// 
        /// 角色
        /// 
        /// 
        public RoleController(IFMRoleService roleService)
        {
            this.RoleService = roleService;
        }
        #endregion
        #region properties
        IFMRoleService RoleService { get; set; }
        #endregion
        /// 
        /// 查询
        /// 
        /// 
        /// 
        [HttpPost, Route("Entities")]
        public JsonActionResult> Entities([FromBody] KeywordFilter filter)
        {
            return WitEntities(null, filter);
        }
        /// 
        /// 查询
        /// 
        /// 
        /// 
        /// 
        [HttpPost, Route("OrderEntities")]
        public JsonActionResult> OrderEntities([FromBody] KeywordFilter filter)
        {
            return WitOrderEntities(null, filter);
        }
        /// 
        /// 查询
        /// 
        /// 
        /// 
        [HttpPost, Route("Paged")]
        public PagedActionResult Paged([FromBody] KeywordPageFilter pageFilter)
        {
            return WitPaged(null, pageFilter);
        }
        /// 
        /// 查询
        /// 
        /// 
        /// 
        [HttpPost, Route("OrderPaged")]
        public PagedActionResult OrderPaged([FromBody] KeywordPageFilter pageFilter)
        {
            return WitOrderPaged(null, pageFilter);
        }
        /// 
        /// 删除
        /// 
        /// 
        /// 
        [HttpGet, Route("Delete")]
        public JsonActionResult Delete(string id)
        {
            return WitRealDelete(id);
        }
        /// 
        /// 更新
        /// 
        /// 
        /// 
        //[HttpPost, Route("Update")]
        //public JsonActionResult Update([FromBody] T_FM_ROLE role)
        //{
        //    return SafeExecute(() =>
        //    {
        //        var dbEntity = this.GetEntity(role.ID.ToString(), new string[] { "Nav_MenuPermissions.Nav_PermissionBtns", "Nav_MenuPermissions.Nav_PermissionColumns", "Nav_Panels" });
        //        var menuPermissions = role.Nav_MenuPermissions;
        //        //var workstages = role.Nav_Workstages;
        //        var panels = role.Nav_Panels;
        //        role.Nav_MenuPermissions = null;
        //        //role.Nav_Workstages = null;
        //        bool isDeletePermission = dbEntity != null && (dbEntity.ORG_ID != role.ORG_ID || dbEntity.PLATFORM_TYPE != role.PLATFORM_TYPE);
        //        if (menuPermissions != null && menuPermissions.Any())
        //            menuPermissions.ForEach(t => t.ROLE_ID = role.ID);
        //        //if (workstages != null && workstages.Any())
        //        //	workstages.ForEach(t => t.BELONG_ROLE_ID = role.ID);
        //        if (panels != null && panels.Any())
        //            panels.ForEach(t => t.BELONG_ROLE_ID = role.ID);
        //        var deleteBtns = new List();
        //        var deleteColumns = new List();
        //        var deletePanels = new List();
        //        var saveBtns = new List();
        //        var saveColumns = new List();
        //        if (dbEntity != null && dbEntity.Nav_MenuPermissions != null && dbEntity.Nav_MenuPermissions.Any())
        //        {
        //            foreach (var item in dbEntity.Nav_MenuPermissions)
        //            {
        //                var tmp = menuPermissions == null ? null : menuPermissions.Where(i => i.ID == item.ID).FirstOrDefault();
        //                if (tmp != null)
        //                {
        //                    var tmpBtns = tmp.Nav_PermissionBtns;
        //                    var tmpColumns = tmp.Nav_PermissionColumns;
        //                    if (item.Nav_PermissionBtns != null && item.Nav_PermissionBtns.Any())
        //                    {
        //                        item.Nav_PermissionBtns.ForEach(t =>
        //                        {
        //                            if (tmpBtns == null || !tmpBtns.Any(i => i.ID == t.ID))
        //                                deleteBtns.Add(t.ID);
        //                        });
        //                    }
        //                    if (item.Nav_PermissionColumns != null && item.Nav_PermissionColumns.Any())
        //                    {
        //                        item.Nav_PermissionColumns.ForEach(t =>
        //                        {
        //                            if (tmpColumns == null || !tmpColumns.Any(i => i.ID == t.ID))
        //                                deleteColumns.Add(t.ID);
        //                        });
        //                    }
        //                }
        //            }
        //        }
        //        if (menuPermissions != null && menuPermissions.Any())
        //        {
        //            foreach (var item in menuPermissions)
        //            {
        //                var tmpBtns = item.Nav_PermissionBtns;
        //                var tmpColumns = item.Nav_PermissionColumns;
        //                item.Nav_PermissionBtns = null;
        //                item.Nav_PermissionColumns = null;
        //                if (tmpBtns != null && tmpBtns.Any())
        //                {
        //                    tmpBtns.ForEach(t => t.ROLE_MENU_PERMISSION_ID = item.ID);
        //                    saveBtns.AddRange(tmpBtns);
        //                }
        //                if (tmpColumns != null && tmpColumns.Any())
        //                {
        //                    tmpColumns.ForEach(t => t.ROLE_MENU_PERMISSION_ID = item.ID);
        //                    saveColumns.AddRange(tmpColumns);
        //                }
        //            }
        //        }
        //        if (dbEntity != null && dbEntity.Nav_Panels != null && dbEntity.Nav_Panels.Any())
        //        {
        //            dbEntity.Nav_Panels.ForEach(t =>
        //            {
        //                if (panels == null || panels.Count == 0 || !panels.Any(t1 => t1.ID == t.ID))
        //                    deletePanels.Add(t.ID);
        //            });
        //        }
        //        UnifiedCommit(() =>
        //        {
        //            this.UpdateEntityNoCommit(role);
        //            if (isDeletePermission)
        //            {
        //                this.DeleteEntityNoCommit(t => t.Nav_RoleMenuPermission.ROLE_ID == role.ID);
        //                this.DeleteEntityNoCommit(t => t.Nav_RoleMenuPermission.ROLE_ID == role.ID);
        //                this.DeleteEntityNoCommit(t => t.ROLE_ID == role.ID);
        //            }
        //            if (menuPermissions != null && menuPermissions.Any())
        //                this.BantchSaveEntityNoCommit(menuPermissions);
        //            //if (workstages != null && workstages.Any())
        //            //	this.BantchSaveEntityNoCommit(workstages);
        //            if (panels != null && panels.Any())
        //                this.BantchSaveEntityNoCommit(panels);
        //            if (saveBtns != null && saveBtns.Any())
        //                this.BantchSaveEntityNoCommit(saveBtns);
        //            if (saveColumns != null && saveColumns.Any())
        //                this.BantchSaveEntityNoCommit(saveColumns);
        //            if (deleteBtns != null && deleteBtns.Any())
        //                this.DeleteEntityNoCommit(t => deleteBtns.Contains(t.ID));
        //            if (deleteColumns != null && deleteColumns.Any())
        //                this.DeleteEntityNoCommit(t => deleteColumns.Contains(t.ID));
        //            if (deletePanels != null && deletePanels.Any())
        //                this.DeleteEntityNoCommit(t => deletePanels.Contains(t.ID));
        //        });
        //        return true;
        //    });
        //}
        [HttpPost, Route("Update")]
        public JsonActionResult Update([FromBody] T_FM_ROLE role)
        {
            return SafeExecute(() =>
            {
                var orgId = APT.Infrastructure.Api.AppContext.CurrentSession.OrgId;
                var isExistrole = this.GetEntity(role.ID.ToString());
                if (isExistrole != null && isExistrole.PLATFORM_TYPE != role.PLATFORM_TYPE)
                    throw new Exception("平台类型无法更改,若需要请重新创建平台类型角色!");
                var permissionList = this.GetEntities(x => x.ROLE_ID == role.ID, new BaseFilter(role.ORG_ID)).ToList();
                var permissionBtns = this.GetEntities(x => x.ROLE_ID == role.ID, new BaseFilter(role.ORG_ID)).ToList();
                var permissionCols = this.GetEntities(x => x.ROLE_ID == role.ID, new BaseFilter(role.ORG_ID)).ToList();
                var perms = new List();
                var savePerms = new List();
                var deletePerms = new List();
                var columns = new List();
                var deleteColumns = new List();
                var saveColumns = new List();
                var btns = new List();
                var deleteBtns = new List();
                //var menus = new List();
                var saveMenus = new List();
                var saveBtns = new List();
                List roleDepartments = new List();
                Dictionary dicRolePerm = new Dictionary();
                foreach (var item in role.DepartmentCheckedKeys)
                {
                    //数据权限
                    foreach (var departmentCheckedKey in item.departmentCheckedKeys)
                    {
                        roleDepartments.Add(new T_FM_ROLE_DEPARTMENT
                        {
                            ROLE_ID = role.ID,
                            DEPARTMENT_ID = departmentCheckedKey,
                            ORG_ID = new Guid(item.OrgId)
                        });
                    }
                }
                if (role.CheckKeys.Count > 0)
                {
                    foreach (var permisionCodetem in role.CheckKeys.OrderBy(x => x.Length))
                    {
                        switch (permisionCodetem.Split('_').Count())
                        {
                            case 1://菜单权限
                                {
                                    perms.Add(new PermInfo() { MENUID = permisionCodetem });
                                    if (permissionList != null)
                                    {
                                        if (!permissionList.Any(x => x.MENU_ID == new Guid(permisionCodetem)))
                                        {
                                            saveMenus.Add(new T_FM_ROLE_MENU_PERM() { ORG_ID = role.ORG_ID, ROLE_ID = role.ID, MENU_ID = new Guid(permisionCodetem) });
                                        }
                                    }
                                    else
                                    {
                                        saveMenus.Add(new T_FM_ROLE_MENU_PERM() { ORG_ID = role.ORG_ID, ROLE_ID = role.ID, MENU_ID = new Guid(permisionCodetem) });
                                    }
                                    break;
                                }
                            case 2://表单权限
                                {
                                    perms.Add(new PermInfo() { MENUID = permisionCodetem.Split('_')[0], ID = permisionCodetem.Split('_')[1] });
                                    var guid = Guid.NewGuid();
                                    if (!dicRolePerm.ContainsKey(permisionCodetem))
                                    {
                                        dicRolePerm.Add(permisionCodetem, guid.ToString());
                                    }
                                    if (permissionList != null)
                                    {
                                        if (!permissionList.Any(x => x.MENU_ID == new Guid(permisionCodetem.Split('_')[0])
                                        && x.PERMISSION_FORM_ID == new Guid(permisionCodetem.Split('_')[1])))
                                        {
                                            savePerms.Add(new T_FM_ROLE_MENU_PERM()
                                            {
                                                ID = guid,
                                                ORG_ID = role.ORG_ID,
                                                ROLE_ID = role.ID,
                                                PERMISSION_FORM_ID = new Guid(permisionCodetem.Split('_')[1]),
                                                MENU_ID = new Guid(permisionCodetem.Split('_')[0]),
                                                IS_PERMISSION = true
                                            });
                                        }
                                        else
                                        {
                                            dicRolePerm[permisionCodetem] = permissionList.FirstOrDefault(x => x.MENU_ID == new Guid(permisionCodetem.Split('_')[0]) && x.PERMISSION_FORM_ID == new Guid(permisionCodetem.Split('_')[1])).ID.ToString();
                                        }
                                    }
                                    else
                                    {
                                        savePerms.Add(new T_FM_ROLE_MENU_PERM()
                                        {
                                            ID = guid,
                                            ORG_ID = role.ORG_ID,
                                            ROLE_ID = role.ID,
                                            PERMISSION_FORM_ID = new Guid(permisionCodetem.Split('_')[1]),
                                            MENU_ID = new Guid(permisionCodetem.Split('_')[0]),
                                            IS_PERMISSION = true
                                        });
                                    }
                                    break;
                                }
                            case 4://列、按钮权限
                                {
                                    if (permisionCodetem.Split('_')[3] == "BTN")//按钮
                                    {
                                        btns.Add(new BtnInfo() { MENUID = permisionCodetem.Split('_')[0], PERMID = permisionCodetem.Split('_')[1], ID = permisionCodetem.Split('_')[2] });
                                        if (permissionBtns.Count > 0)
                                        {
                                            if (!permissionBtns.Any(x => x.MENU_ID == new Guid(permisionCodetem.Split('_')[0]) && x.BTN_ID == new Guid(permisionCodetem.Split('_')[2])))
                                            {
                                                saveBtns.Add(new T_FM_ROLE_MENU_PERM_BTN()
                                                {
                                                    ROLE_MENU_PERMISSION_ID = new Guid(dicRolePerm[permisionCodetem.Split('_')[0] + "_" + permisionCodetem.Split('_')[1]]),
                                                    ORG_ID = role.ORG_ID,
                                                    ROLE_ID = role.ID,
                                                    MENU_ID = new Guid(permisionCodetem.Split('_')[0]),
                                                    BTN_ID = new Guid(permisionCodetem.Split('_')[2])
                                                });
                                            }
                                        }
                                        else
                                        {
                                            saveBtns.Add(new T_FM_ROLE_MENU_PERM_BTN()
                                            {
                                                ROLE_MENU_PERMISSION_ID = new Guid(dicRolePerm[permisionCodetem.Split('_')[0] + "_" + permisionCodetem.Split('_')[1]]),
                                                ORG_ID = role.ORG_ID,
                                                ROLE_ID = role.ID,
                                                MENU_ID = new Guid(permisionCodetem.Split('_')[0]),
                                                BTN_ID = new Guid(permisionCodetem.Split('_')[2])
                                            });
                                        }
                                    }
                                    else
                                    {
                                        columns.Add(new ColInfo() { MENUID = permisionCodetem.Split('_')[0], PERMID = permisionCodetem.Split('_')[1], ID = permisionCodetem.Split('_')[2] });
                                        if (permissionCols.Count > 0)
                                        {
                                            if (!permissionCols.Any(x => x.MENU_ID == new Guid(permisionCodetem.Split('_')[0]) && x.COLUMN_ID == new Guid(permisionCodetem.Split('_')[2])))
                                            {
                                                saveColumns.Add(new T_FM_ROLE_MENU_PERM_COL()
                                                {
                                                    ROLE_MENU_PERMISSION_ID = new Guid(dicRolePerm[permisionCodetem.Split('_')[0] + "_" + permisionCodetem.Split('_')[1]]),
                                                    ORG_ID = role.ORG_ID,
                                                    ROLE_ID = role.ID,
                                                    MENU_ID = new Guid(permisionCodetem.Split('_')[0]),
                                                    COLUMN_ID = new Guid(permisionCodetem.Split('_')[2])
                                                });
                                            }
                                        }
                                        else
                                        {
                                            saveColumns.Add(
                                                new T_FM_ROLE_MENU_PERM_COL()
                                                {
                                                    ROLE_MENU_PERMISSION_ID = new Guid(dicRolePerm[permisionCodetem.Split('_')[0] + "_" + permisionCodetem.Split('_')[1]]),
                                                    ORG_ID = role.ORG_ID,
                                                    ROLE_ID = role.ID,
                                                    MENU_ID = new Guid(permisionCodetem.Split('_')[0]),
                                                    COLUMN_ID = new Guid(permisionCodetem.Split('_')[2])
                                                });
                                        }
                                    }
                                    break;
                                }
                            default:
                                break;
                        }
                    }
                    foreach (var item in permissionList)
                    {
                        if (!perms.Any(x => new Guid(x.MENUID) == item.MENU_ID && x.ID == item.PERMISSION_FORM_ID?.ToString()))
                        {
                            deletePerms.Add(item.ID);//根据主键删除
                        }
                    }
                    foreach (var col in permissionCols)
                    {
                        if (!columns.Any(x => new Guid(x.MENUID) == col.MENU_ID && new Guid(x.ID) == col.COLUMN_ID))
                        {
                            deleteColumns.Add(col.ID);//根据主键删除
                        }
                    }
                    foreach (var btn in permissionBtns)
                    {
                        if (!btns.Any(x => new Guid(x.MENUID) == btn.MENU_ID && new Guid(x.ID) == btn.BTN_ID))
                        {
                            deleteBtns.Add(btn.ID);//根据主键删除
                        }
                    }
                    UnifiedCommit(() =>
                    {
                        this.UpdateEntityNoCommit(role);
                        //this.BantchDeleteEntityNoCommit(deleteMenus);
                        this.BantchDeleteEntityNoCommit(deleteColumns);
                        this.BantchDeleteEntityNoCommit(deleteBtns);
                        this.BantchDeleteEntityNoCommit(deletePerms);
                        if (saveMenus != null && saveMenus.Any())
                            this.BantchSaveEntityNoCommit(saveMenus);
                        if (savePerms != null && savePerms.Any())
                            this.BantchAddEntityNoCommit(savePerms);
                        if (saveColumns != null && saveColumns.Any())
                            this.BantchAddEntityNoCommit(saveColumns);
                        if (saveBtns != null && saveBtns.Any())
                            this.BantchAddEntityNoCommit(saveBtns);
                        this.DeleteEntityNoCommit(x => x.ROLE_ID == role.ID);
                        if (roleDepartments.Any())
                            this.BantchAddEntityNoCommit(roleDepartments);
                        //if (roleDepartments.Any())
                        //    this.BantchAddEntityNoCommit(roleDepartments);
                    });
                }
                else
                {
                    if (permissionList.Count > 0)
                    {
                        deletePerms.AddRange(permissionList.Select(x => x.ID).ToList());
                    }
                    if (permissionBtns.Count > 0)
                    {
                        deleteBtns.AddRange(permissionBtns.Select(x => x.ID).ToList());
                    }
                    if (permissionCols.Count > 0)
                    {
                        deleteColumns.AddRange(permissionCols.Select(x => x.ID).ToList());
                    }
                    UnifiedCommit(() =>
                    {
                        this.UpdateEntityNoCommit(role);
                        //this.BantchDeleteEntityNoCommit(deleteMenus);
                        this.BantchDeleteEntityNoCommit(deleteColumns);
                        this.BantchDeleteEntityNoCommit(deleteBtns);
                        this.BantchDeleteEntityNoCommit(deletePerms);
                        this.DeleteEntityNoCommit(x => x.ROLE_ID == role.ID);
                        if (roleDepartments.Any())
                            this.BantchAddEntityNoCommit(roleDepartments);
                    });
                }
                return true;
            });
        }
        public class PermInfo
        {
            public string MENUID { get; set; }
            public string ID { get; set; }
        }
        public class ColInfo
        {
            public string MENUID { get; set; }
            public string PERMID { get; set; }
            public string ID { get; set; }
        }
        public class BtnInfo
        {
            public string MENUID { get; set; }
            public string PERMID { get; set; }
            public string ID { get; set; }
        }
        /// 
        /// 批量删除
        /// 
        /// 
        /// 
        [HttpGet, Route("BatchDelete")]
        public JsonActionResult BatchDelete(string ids)
        {
            return WitRealBatchDelete(ids);
        }
        /// 
        /// 获得单条实体数据
        /// 
        /// 
        /// 
        [HttpPost, Route("Get")]
        public JsonActionResult Get([FromBody] KeywordFilter filter)
        {
            return WitEntity(null, filter);
        }
        /// 
        /// 授权
        /// 
        /// 
        /// 
        [HttpPost, Route("Permision")]
        public JsonActionResult Permision([FromBody] T_FM_ROLE role)
        {
            return SafeExecute(() =>
            {
                var dbRole = this.GetEntity(role.ID.ToString(), new string[] { "Nav_MenuPermissions" });
                if (dbRole == null)
                    throw new Exception("角色不存在");
                var deleteList = new List();
                if (role.Nav_MenuPermissions != null && role.Nav_MenuPermissions.Any())
                {
                    foreach (var item in dbRole.Nav_MenuPermissions)
                    {
                        if (!role.Nav_MenuPermissions.Any(t => t.ID == item.ID))
                            deleteList.Add(item.ID);
                    }
                    this.BantchSaveEntity(role.Nav_MenuPermissions);
                }
                if (deleteList.Any())
                    this.DeleteEntity(t => deleteList.Contains(dbRole.ID));
                return true;
            });
        }
        /// 
        /// 授权
        /// 
        /// 
        /// 
        [HttpPost, Route("GetPermissionForms")]
        public JsonActionResult GetPermissionForms([FromBody] KeywordPageFilter pageFilter)
        {
            return SafeExecute(() =>
            {
                RolePermissionFormResultModel result = new RolePermissionFormResultModel();
                var pageList = this.GetOrderPageEntities(null, pageFilter);
                var list = pageList.Data.ToList();
                result.TotalCount = pageList.TotalCount;
                if (list == null || list.Count == 0) return result;
                string roleId = pageFilter.Keyword;//角色ID
                List permissionList = null;
                if (!string.IsNullOrEmpty(roleId))
                    permissionList = this.GetEntitiesByRedis(t => t.Nav_PermissionForm.ENABLE_STATUS == (int)FMEnableStatusEnum.启用,
                        new BaseFilter(pageFilter.OrgId), roleId, new string[] { "Nav_PermissionBtns", "Nav_PermissionColumns", "Nav_PermissionForm" }).ToList();
                //var formIds = list.Select(t => t.ID).ToList();
                List pageTableList = new List();
                List editTableList = new List();
                List treeTableList = new List();
                List charList = new List();
                List customList = new List();
                foreach (var l in list)
                {
                    switch (l.FORM_TYPE)
                    {
                        case (int)PFFormTypeEnum.列表表单:
                            {
                                var form = this.GetEntitiesByRedis(null, new BaseFilter(pageFilter.OrgId), l.ID.ToString()).ToList();
                                pageTableList.AddRange(form);
                                break;
                            }
                        case (int)PFFormTypeEnum.编辑表单:
                            {
                                var form = this.GetEntitiesByRedis(null, new BaseFilter(pageFilter.OrgId), l.ID.ToString()).ToList();
                                editTableList.AddRange(form);
                                break;
                            }
                        case (int)PFFormTypeEnum.树形编辑页:
                            {
                                var form = this.GetEntitiesByRedis(null, new BaseFilter(pageFilter.OrgId), l.ID.ToString()).ToList();
                                treeTableList.AddRange(form);
                                break;
                            }
                        case (int)PFFormTypeEnum.图表表单:
                            {
                                var form = this.GetEntitiesByRedis(null, new BaseFilter(pageFilter.OrgId), l.ID.ToString()).ToList();
                                charList.AddRange(form);
                                break;
                            }
                        case (int)PFFormTypeEnum.自定义表单:
                            {
                                var form = this.GetEntitiesByRedis(null, new BaseFilter(pageFilter.OrgId), l.ID.ToString(), "Nav_PageForm").ToList();
                                customList.AddRange(form);
                                break;
                            }
                        default:
                            {
                                //var form = this.GetEntitiesByRedis(null, new BaseFilter(pageFilter.OrgId), l.ID.ToString()).ToList();
                                //pageTableList.AddRange(form);
                                break;
                            }
                    }
                }
                var pageTableIds = pageTableList.Select(t => t.ID).ToList();
                var editTableIds = editTableList.Select(t => t.ID).ToList();
                var treeTableIds = treeTableList.Select(t => t.ID).ToList();
                List columns = new List();
                foreach (var page in pageTableIds)
                {
                    var clm = this.GetEntitiesByRedis(t => t.IS_RULE, new BaseFilter(pageFilter.OrgId), page.ToString()).ToList();
                    columns.AddRange(clm);
                }
                List btns = new List();
                foreach (var pageId in pageTableIds)
                {
                    var pageBtns = this.GetEntitiesByRedis(t => t.IS_RULE && t.ENABLE_STATUS == (int)FMEnableStatusEnum.启用,
                        new BaseFilter(pageFilter.OrgId), pageId.ToString()).ToList();
                    btns.AddRange(pageBtns);
                }
                foreach (var pageId in editTableList)
                {
                    var pageBtns = this.GetEntitiesByRedis(t => t.IS_RULE && t.ENABLE_STATUS == (int)FMEnableStatusEnum.启用,
                        new BaseFilter(pageFilter.OrgId), pageId.ID.ToString()).ToList();
                    btns.AddRange(pageBtns);
                }
                foreach (var pageId in treeTableList)
                {
                    var pageBtns = this.GetEntitiesByRedis(t => t.IS_RULE && t.ENABLE_STATUS == (int)FMEnableStatusEnum.启用,
                        new BaseFilter(pageFilter.OrgId), pageId.ID.ToString()).ToList();
                    btns.AddRange(pageBtns);
                }
                foreach (var pageId in charList)
                {
                    var pageBtns = this.GetEntitiesByRedis(t => t.IS_RULE && t.ENABLE_STATUS == (int)FMEnableStatusEnum.启用,
                        new BaseFilter(pageFilter.OrgId), pageId.ID.ToString()).ToList();
                    btns.AddRange(pageBtns);
                }
                foreach (var pageId in customList)
                {
                    var pageBtns = this.GetEntitiesByRedis(t => t.IS_RULE && t.ENABLE_STATUS == (int)FMEnableStatusEnum.启用,
                        new BaseFilter(pageFilter.OrgId), pageId.ID.ToString()).ToList();
                    btns.AddRange(pageBtns);
                }
                //var btns = this.GetEntitiesByRedis(t => (pageTableIds.Contains(t.PAGE_TABLE_ID ?? Guid.Empty) || editTableIds.Contains(t.PAGE_EDIT_ID ?? Guid.Empty)
                //|| treeTableIds.Contains(t.PAGE_EDIT_ID ?? Guid.Empty) || formIds.Contains(t.PAGE_CUSTOM_FORM_ID ?? Guid.Empty))
                //&& t.IS_RULE && t.ENABLE_STATUS == (int)FMEnableStatusEnum.启用, new BaseFilter(pageFilter.OrgId)).ToList();
                Dictionary>> columnDic = new Dictionary>>();
                Dictionary>> btnDic = new Dictionary>>();
                if (pageTableList != null && pageTableList.Any())
                {
                    var tmpPageTableList = pageTableList.OrderBy(t => t.NUM).ThenBy(t => t.PARENT_ID).ToList();
                    foreach (var item in tmpPageTableList)
                    {
                        if (item.PAGE_FORM_ID == null) continue;
                        Dictionary> tmp = null;
                        if (!columnDic.TryGetValue(item.PAGE_FORM_ID.Value, out tmp))
                        {
                            tmp = new Dictionary>();
                            columnDic.Add(item.PAGE_FORM_ID.Value, tmp);
                        }
                        var colTmp = columns.Where(t => t.PAGE_TABLE_ID == item.ID).OrderBy(t => t.NUM).ToList();
                        if (colTmp != null && colTmp.Any())
                            tmp.Add(item, colTmp);
                        Dictionary> btnTmpDic = null;
                        if (!btnDic.TryGetValue(item.PAGE_FORM_ID.Value, out btnTmpDic))
                        {
                            btnTmpDic = new Dictionary>();
                            btnDic.Add(item.PAGE_FORM_ID.Value, btnTmpDic);
                        }
                        var btnTmp = btns.Where(t => t.PAGE_TABLE_ID == item.ID).OrderBy(t => t.BTN_FUN_TYPE).ThenBy(t => t.NUM).ToList();
                        if (btnTmp != null && btnTmp.Any())
                        {
                            RolePermissionFormBtnTempModel tempModel = new RolePermissionFormBtnTempModel();
                            tempModel.Title = item.LABEL_NAME;
                            btnTmpDic.Add(tempModel, btnTmp);
                        }
                    }
                }
                if (editTableList != null && editTableList.Any())
                {
                    foreach (var item in editTableList)
                    {
                        if (item.PAGE_FORM_ID == null) continue;
                        Dictionary> btnTmpDic = null;
                        if (!btnDic.TryGetValue(item.PAGE_FORM_ID.Value, out btnTmpDic))
                        {
                            btnTmpDic = new Dictionary>();
                            btnDic.Add(item.PAGE_FORM_ID.Value, btnTmpDic);
                        }
                        var btnTmp = btns.Where(t => t.PAGE_EDIT_ID == item.ID).OrderBy(t => t.BTN_FUN_TYPE).ThenBy(t => t.NUM).ToList();
                        if (btnTmp != null && btnTmp.Any())
                        {
                            RolePermissionFormBtnTempModel tempModel = new RolePermissionFormBtnTempModel();
                            tempModel.Title = item.LABEL_NAME;
                            btnTmpDic.Add(tempModel, btnTmp);
                        }
                    }
                }
                if (treeTableList != null && treeTableList.Any())
                {
                    foreach (var item in treeTableList)
                    {
                        if (item.PAGE_FORM_ID == null) continue;
                        Dictionary> btnTmpDic = null;
                        if (!btnDic.TryGetValue(item.PAGE_FORM_ID.Value, out btnTmpDic))
                        {
                            btnTmpDic = new Dictionary>();
                            btnDic.Add(item.PAGE_FORM_ID.Value, btnTmpDic);
                        }
                        var btnTmp = btns.Where(t => t.PAGE_EDIT_ID == item.ID).OrderBy(t => t.BTN_FUN_TYPE).ThenBy(t => t.NUM).ToList();
                        if (btnTmp != null && btnTmp.Any())
                        {
                            RolePermissionFormBtnTempModel tempModel = new RolePermissionFormBtnTempModel();
                            tempModel.Title = item.LABEL_NAME;
                            btnTmpDic.Add(tempModel, btnTmp);
                        }
                    }
                }
                if (charList != null && charList.Any())
                {
                    foreach (var item in charList)
                    {
                        if (item.PAGE_FORM_ID == null) continue;
                        Dictionary> btnTmpDic = null;
                        if (!btnDic.TryGetValue(item.PAGE_FORM_ID.Value, out btnTmpDic))
                        {
                            btnTmpDic = new Dictionary>();
                            btnDic.Add(item.PAGE_FORM_ID.Value, btnTmpDic);
                        }
                        var btnTmp = btns.Where(t => t.PAGE_EDIT_ID == item.ID).OrderBy(t => t.BTN_FUN_TYPE).ThenBy(t => t.NUM).ToList();
                        if (btnTmp != null && btnTmp.Any())
                        {
                            RolePermissionFormBtnTempModel tempModel = new RolePermissionFormBtnTempModel();
                            tempModel.Title = item.LABEL;
                            btnTmpDic.Add(tempModel, btnTmp);
                        }
                    }
                }
                var tmpList = list.Where(t => t.FORM_TYPE == (int)PFFormTypeEnum.自定义表单).ToList();
                foreach (var item in tmpList)
                {
                    Dictionary> btnTmpDic = null;
                    if (!btnDic.TryGetValue(item.ID, out btnTmpDic))
                    {
                        btnTmpDic = new Dictionary>();
                        btnDic.Add(item.ID, btnTmpDic);
                    }
                    var btnTmp = btns.Where(t => t.PAGE_CUSTOM_FORM_ID == item.ID).OrderBy(t => t.BTN_FUN_TYPE).ThenBy(t => t.NUM).ToList();
                    if (btnTmp != null && btnTmp.Any())
                    {
                        RolePermissionFormBtnTempModel tempModel = new RolePermissionFormBtnTempModel();
                        tempModel.Title = item.NAME;
                        btnTmpDic.Add(tempModel, btnTmp);
                    }
                }
                List addRoleMenusList = new List();
                foreach (var item in list)
                {
                    RolePermissionFormModel formModel = new RolePermissionFormModel();
                    formModel.Title = item.NAME;
                    formModel.Code = item.CODE;
                    T_FM_ROLE_MENU_PERM menuPermission = null;
                    if (permissionList != null && permissionList.Any())
                        menuPermission = permissionList.Where(t => t.PERMISSION_FORM_ID == item.ID).FirstOrDefault();
                    if (menuPermission == null)
                    {
                        menuPermission = new T_FM_ROLE_MENU_PERM();
                        menuPermission.ORG_ID = pageFilter.OrgId;
                        menuPermission.PERMISSION_FORM_ID = item.ID;
                        menuPermission.ROLE_ID = string.IsNullOrEmpty(roleId) ? Guid.NewGuid() : new Guid(roleId);
                    }
                    formModel.Permission = menuPermission;
                    formModel.ID = item.ID;
                    formModel.IsCheck = menuPermission == null ? false : menuPermission.IS_PERMISSION;
                    result.Forms.Add(formModel);
                    if (item.FORM_TYPE == (int)PFFormTypeEnum.列表表单)
                    {
                        if (columnDic != null && columnDic.Any())
                        {
                            Dictionary> tmp = null;
                            if (columnDic.TryGetValue(item.ID, out tmp))
                            {
                                bool needAddTableLable = tmp.Count > 1;
                                foreach (var t in tmp)
                                {
                                    foreach (var c in t.Value)
                                    {
                                        RolePermissionFormColumnModel columnModel = new RolePermissionFormColumnModel();
                                        columnModel.Title = needAddTableLable ? t.Key.LABEL_NAME + "_" + c.LABEL : c.LABEL;
                                        T_FM_ROLE_MENU_PERM_COL permissionCol = null;
                                        if (menuPermission != null && menuPermission.Nav_PermissionColumns != null && menuPermission.Nav_PermissionColumns.Any())
                                        {
                                            permissionCol = menuPermission.Nav_PermissionColumns.Where(t1 => t1.COLUMN_ID == c.ID).FirstOrDefault();
                                        }
                                        columnModel.IsCheck = permissionCol != null;
                                        if (permissionCol == null)
                                        {
                                            permissionCol = new T_FM_ROLE_MENU_PERM_COL();
                                            permissionCol.ORG_ID = pageFilter.OrgId;
                                            permissionCol.COLUMN_ID = c.ID;
                                            permissionCol.ROLE_MENU_PERMISSION_ID = menuPermission.ID;
                                        }
                                        columnModel.Column = permissionCol;
                                        formModel.Nav_Columns.Add(columnModel);
                                    }
                                }
                            }
                        }
                    }
                    if (btnDic != null && btnDic.Any())
                    {
                        Dictionary> tmp = null;
                        if (btnDic.TryGetValue(item.ID, out tmp))
                        {
                            bool needAddTableLable = tmp.Count > 1;
                            foreach (var t in tmp)
                            {
                                foreach (var c in t.Value)
                                {
                                    RolePermissionFormBtnModel btnModel = new RolePermissionFormBtnModel();
                                    string title = string.Empty;
                                    if (needAddTableLable)
                                        title = t.Key.Title + "_";
                                    if (c.BTN_FUN_TYPE == (int)PFBtnFuncTypeEnum.行按钮)
                                        title = "行按钮_";
                                    else if (item.FORM_TYPE == (int)PFFormTypeEnum.列表表单)
                                        title = "按钮_";
                                    title += c.LABEL;
                                    btnModel.Title = title;
                                    T_FM_ROLE_MENU_PERM_BTN btnCol = null;
                                    if (menuPermission != null && menuPermission.Nav_PermissionBtns != null && menuPermission.Nav_PermissionBtns.Any())
                                    {
                                        btnCol = menuPermission.Nav_PermissionBtns.Where(t1 => t1.BTN_ID == c.ID).FirstOrDefault();
                                    }
                                    btnModel.IsCheck = btnCol != null;
                                    if (btnCol == null)
                                    {
                                        btnCol = new T_FM_ROLE_MENU_PERM_BTN();
                                        btnCol.ORG_ID = pageFilter.OrgId;
                                        btnCol.BTN_ID = c.ID;
                                        btnCol.ROLE_MENU_PERMISSION_ID = menuPermission.ID;
                                    }
                                    btnModel.Btn = btnCol;
                                    formModel.Nav_Btns.Add(btnModel);
                                }
                            }
                        }
                    }
                }
                return result;
            });
        }
        /// 
        /// 树形授权
        /// 
        /// 
        /// 
        [HttpPost, Route("GetTreePermissionForms")]
        public JsonActionResult GetTreePermissionForms([FromBody] KeywordPageFilter pageFilter)
        {
            return SafeExecute(() =>
            {
                var filter = new BaseFilter(pageFilter.OrgId);
                var rlt = new RolePermissionResul();
                var rule = pageFilter.FilterGroup.Rules.FirstOrDefault(x => x.Field == "PLATFORM_TYPE");
                if (Convert.ToInt32(rule.Value) == (int)PFPlatTypeEnum.后台)
                {
                    #region 获取菜单树
                    //filter.SelectField = new string[] { "PARENT_ID", "NUM", "ID", "NAME", "MENU_FORM_ID" };
                    filter.Sort = "NUM";
                    filter.Order = DbOrder.ASC;
                    filter.Level = -1;
                    filter.IsParentData = true;
                    var menuTree = this.GetTreeOrderEntities(x => x.ENABLE_STATUS == (int)FMEnableStatusEnum.启用 && x.PLATFORM_CATEGORY == 0, filter);
                    #endregion
                    var list = this.GetEntities(null, filter).ToList();//所有表单数据
                    var allFormRelations = this.GetEntities(null, filter).ToList();//所有关联表单数据
                    List pageTableList = new List();
                    List editTableList = new List();
                    List treeTableList = new List();
                    List charList = new List();
                    List customList = new List();
                    var allBtns = this.GetEntities(null, filter).ToList();
                    var allCols = this.GetEntities(t => t.IS_RULE, filter).ToList();
                    var allEditCols = this.GetEntities(t => t.IS_RULE, filter).ToList();
                    //var filter = new BaseFilter(pageFilter.OrgId);
                    // filter.SelectField = new string[] { "PAGE_FORM_ID", "LABEL_NAME", "NUM", "ID" };
                    var resPagTable = this.GetEntities(null, filter).ToList();//T_PF_PAGE_TABLE 所有数据             
                    var resPagEdit = this.GetEntities(null, filter).ToList();//T_PF_PAGE_TABLE 所有数据
                    var resPagTree = this.GetEntities(null, filter).ToList();//T_PF_PAGE_TABLE 所有数据
                                                                                             //filter.SelectField = new string[] { "PAGE_FORM_ID", "LABEL", "NUM", "ID" };
                    var resPagChart = this.GetEntities(null, filter).ToList();//T_PF_PAGE_TABLE 所有数据
                                                                                               // filter.SelectField = new string[] { "PAGE_FORM_ID", "COMPONENT_NAME", "ID" };
                    var resPagCustom = this.GetEntities(null, filter).ToList();//T_PF_PAGE_TABLE 所有数据
                    List result = new List();//最终返回树结果
                    List formInfos = new List();
                    Dictionary dicforms = new Dictionary();
                    Dictionary dicPages = new Dictionary();//表单所属菜单
                    #region 获取权限
                    string roleId = pageFilter.Keyword;//角色ID
                    List permissionList = null;
                    List permissionBtns = null;
                    List permissionCols = null;
                    // List menuPermissions = null;
                    //  List permissionMenu = null;
                    if (!string.IsNullOrEmpty(roleId))
                    {
                        //permissionList = this.GetEntitiesByRedis(t => t.Nav_PermissionForm.ENABLE_STATUS == (int)FMEnableStatusEnum.启用,
                        //    new BaseFilter(pageFilter.OrgId), roleId, new string[] { "Nav_PermissionBtns", "Nav_PermissionColumns", "Nav_PermissionForm" }).ToList();
                        permissionList = this.GetEntities(x => x.ROLE_ID == new Guid(roleId), new BaseFilter(pageFilter.OrgId)).ToList();
                        permissionBtns = this.GetEntities(x => x.ROLE_ID == new Guid(roleId), new BaseFilter(pageFilter.OrgId)).ToList();
                        permissionCols = this.GetEntities(x => x.ROLE_ID == new Guid(roleId), new BaseFilter(pageFilter.OrgId)).ToList();
                        //menuPermissions = this.GetEntities(x => x.ROLE_ID == new Guid(roleId), new BaseFilter(pageFilter.OrgId)).ToList();
                        // permissionMenu = this.GetEntities(null, filterMenu).ToList();
                    }
                    #endregion
                    foreach (var menu in menuTree)
                    {
                        //formInfos.Add(new FormInfo() { Code = menu.Node.ID.ToString(), Title = menu.Node.NAME, ParentCode = "Root" });//最外层菜单 
                        AddChildren(menu, permissionList, permissionBtns, permissionCols, list, resPagTable, resPagEdit, resPagTree, resPagChart,
                                      resPagCustom, pageFilter.OrgId.ToString(), formInfos, dicforms, allFormRelations, allBtns, allCols, allEditCols);
                    }
                    List checks = new List();
                    List checkLastKey = new List();
                    foreach (var dicform in dicforms)
                    {
                        formInfos.Add(dicform.Value);
                    }
                    result = RolePermissionTreeModel.GetRolePermissionTree(formInfos);
                    result = result[0].children;
                    foreach (var item in result)
                    {
                        SelectCheck(item, checks, checkLastKey);
                    }
                    rlt = new RolePermissionResul() { checks = checks, checkLastKey = checkLastKey, rolePermissionTreeModels = result };
                }
                else //APP菜单
                {
                    filter.Sort = "NUM";
                    filter.Order = DbOrder.ASC;
                    filter.Level = -1;
                    filter.IsParentData = true;
                    var menuTree = this.GetTreeOrderEntities(x => x.ENABLE_STATUS == (int)FMEnableStatusEnum.启用, filter);
                    var list = this.GetEntities(x => x.PLATFORM_TYPE == (int)PFPlatTypeEnum.APP, filter).ToList();//所有表单数据
                    List result = new List();//最终返回树结果
                    List formInfos = new List();
                    Dictionary dicforms = new Dictionary();
                    string roleId = pageFilter.Keyword;//角色ID
                    List permissionList = null;
                    if (!string.IsNullOrEmpty(roleId))
                    {
                        permissionList = this.GetEntities(x => x.ROLE_ID == new Guid(roleId),
                            new BaseFilter(pageFilter.OrgId)).ToList();
                    }
                    foreach (var menu in menuTree)
                    {
                        AddChildren(menu, permissionList, dicforms, list);
                    }
                    List checks = new List();
                    List checkLastKey = new List();
                    foreach (var dicform in dicforms)
                    {
                        formInfos.Add(dicform.Value);
                    }
                    result = RolePermissionTreeModel.GetRolePermissionTree(formInfos);
                    result = result[0].children;
                    foreach (var item in result)
                    {
                        SelectCheck(item, checks, checkLastKey);
                    }
                    rlt = new RolePermissionResul() { checks = checks, checkLastKey = checkLastKey, rolePermissionTreeModels = result };
                }
                return rlt;
            });
        }
        /// 
        /// 树形授权
        /// 
        /// 
        /// 
        [HttpPost, Route("GetTreeDepartment")]
        public JsonActionResult GetTreeDepartment([FromBody] KeywordPageFilter filter)
        {
            return SafeExecute(() =>
            {
                //dynamic result = new ExpandoObject();
                List result = new List();
                OrgTreeData orgTreeData = new OrgTreeData();
                var list = this.GetEntities(null, filter);
                var parents = list.Where(i => i.PARENT_ID == null).ToList();
                var treeData = new List();
                foreach (var item in parents)
                {
                    var model = new TreeDataModel { key = item.ID.ToString(), title = item.NAME };
                    model.children = GetDepartmentTreeData(list, item);
                    treeData.Add(model);
                }
                //result.departmentTreeData = treeData;
                orgTreeData.treeDataModels.AddRange(treeData);
                var currentDept = list.Where(x => x.ORG_ID == filter.OrgId).Select(x => x.ID);//wyw 直接用 list 减少数据交互  //var currentDept = this.GetEntities(x => x.ORG_ID == filter.OrgId, filter).Select(x => x.ID);
                var roles = this.GetEntities(x => x.ROLE_ID.ToString() == filter.Keyword && currentDept.Contains(x.DEPARTMENT_ID), filter);
                orgTreeData.departmentCheckedKeys.AddRange(roles.Select(x => x.DEPARTMENT_ID));
                var orgInfo = this.GetEntity(x => x.ID == filter.OrgId, filter);
                orgTreeData.OrgId = filter.OrgId.ToString();
                orgTreeData.title = orgInfo.NAME;
                result.Add(orgTreeData);
                if (filter.OrgRule.Any())
                {
                    filter.IgnoreOrgRule = false;
                    var orgFilter = new BaseFilter();
                    foreach (var item in filter.OrgRule)
                    {
                        orgFilter.OrgId = item;
                        OrgTreeData resultRule = new OrgTreeData();
                        var listOrgRules = this.GetEntities(null, orgFilter);
                        var parentOrgRules = listOrgRules.Where(i => i.PARENT_ID == null).ToList();
                        var treeDataOrgRule = new List();
                        foreach (var parentOrgRule in parentOrgRules)
                        {
                            var model = new TreeDataModel { key = parentOrgRule.ID.ToString(), title = parentOrgRule.NAME };
                            model.children = GetDepartmentTreeData(listOrgRules, parentOrgRule);
                            treeDataOrgRule.Add(model);
                        }
                        resultRule.treeDataModels.AddRange(treeDataOrgRule);
                        var orgRuleDept = this.GetEntities(null, orgFilter).Select(x => x.ID);
                        var roleOrgRules = this.GetEntities(x => x.ROLE_ID.ToString() == filter.Keyword && orgRuleDept.Contains(x.DEPARTMENT_ID), orgFilter);
                        resultRule.departmentCheckedKeys.AddRange(roleOrgRules.Select(x => x.DEPARTMENT_ID));
                        var orgDataRuleInfo = this.GetEntity(item);
                        resultRule.OrgId = item.ToString();
                        resultRule.title = orgDataRuleInfo.NAME;
                        result.Add(resultRule);
                    }
                }
                return result;
            });
        }
        public class OrgTreeData
        {
            public OrgTreeData()
            {
                this.treeDataModels = new List();
                this.departmentCheckedKeys = new List();
            }
            public List treeDataModels { get; set; }
            public List departmentCheckedKeys { get; set; }
            public string OrgId { get; set; }
            public string title { get; set; }
        }
        private List GetDepartmentTreeData(IEnumerable list, T_FM_DEPARTMENT node)
        {
            var treeData = new List();
            var nodes = list.Where(x => x.PARENT_ID == node.ID);
            foreach (var item in nodes)
            {
                var model = new TreeDataModel { key = item.ID.ToString(), title = item.NAME };
                var children = GetDepartmentTreeData(list, item);
                if (children.Any())
                    model.children = children;
                treeData.Add(model);
            }
            return treeData;
        }
        public void SelectCheck(RolePermissionTreeModel RolePermissions, List checks, List checkLastKey)
        {
            if (RolePermissions.IsCheck)
            {
                checks.Add(RolePermissions.key);
            }
            if (RolePermissions.children.Count == 0 && RolePermissions.IsCheck)
            {
                checkLastKey.Add(RolePermissions.key);
            }
            if (RolePermissions.children.Count > 0)
            {
                foreach (var item in RolePermissions.children)
                {
                    SelectCheck(item, checks, checkLastKey);
                }
            }
        }
        public void AddChildren(TreeNode treeNode, List t_FM_ROLE_MENU_PERMs,
            Dictionary dicforms, List t_PF_FORMs)
        {
            var permission = false;
            if (!dicforms.ContainsKey(treeNode.Node.ID.ToString() + "_" + treeNode.Node.PARENT_ID.ToString()))
            {
                if (t_FM_ROLE_MENU_PERMs != null && t_FM_ROLE_MENU_PERMs.Count > 0)
                    permission = t_FM_ROLE_MENU_PERMs.Any(x => x.MENU_ID == treeNode.Node.ID);
                else
                    permission = false;
                dicforms.Add(treeNode.Node.ID.ToString() + "_" + treeNode.Node.PARENT_ID.ToString(), new FormInfo()
                {
                    Code = treeNode.Node.ID.ToString(),
                    Title = treeNode.Node.NAME,
                    ParentCode = treeNode.Node.PARENT_ID.ToString(),
                    IsCheck = permission
                });
                var form = t_PF_FORMs.SingleOrDefault(x => x.ID == treeNode.Node.MENU_FORM_ID);//菜单下的表单              
                if (form != null)
                {
                    if (!dicforms.ContainsKey(treeNode.Node.ID.ToString() + "_" + form.ID.ToString()))
                    {
                        if (t_FM_ROLE_MENU_PERMs != null)
                            permission = t_FM_ROLE_MENU_PERMs.Any(x => x.PERMISSION_FORM_ID == form.ID && x.MENU_ID == treeNode.Node.ID);
                        else
                            permission = false;
                        dicforms.Add(treeNode.Node.ID + "_" + form.ID, new FormInfo()
                        {
                            Code = treeNode.Node.ID + "_" + form.ID.ToString(),
                            Title = form.NAME + "(" + form.CODE + ")",
                            ParentCode = treeNode.Node.ID.ToString(),
                            IsCheck = permission
                        });
                    }
                }
            }
            foreach (var item in treeNode.Children)
            {
                AddChildren(item, t_FM_ROLE_MENU_PERMs, dicforms, t_PF_FORMs);
            }
        }
        public void AddChildren(TreeNode treeNode, List t_FM_ROLE_MENU_PERMs, List permissionBtns, List permissionCols,
        List t_PF_FORMs, List pageTableList,
            List editTableList, List treeTableList,
            List charList, List customList, string OrgId, List formInfos, Dictionary dicforms, List allFormRelations, List allBtns,
            List allCols, List allEditCols)
        {
            var permission = false;
            if (!dicforms.ContainsKey(treeNode.Node.ID.ToString() + "_" + treeNode.Node.PARENT_ID.ToString()))
            {
                if (t_FM_ROLE_MENU_PERMs != null && t_FM_ROLE_MENU_PERMs.Count > 0)
                {
                    permission = t_FM_ROLE_MENU_PERMs.Any(x => x.MENU_ID == treeNode.Node.ID);
                }
                else
                {
                    permission = false;
                }
                dicforms.Add(treeNode.Node.ID.ToString() + "_" + treeNode.Node.PARENT_ID.ToString(), new FormInfo()
                {
                    Code = treeNode.Node.ID.ToString(),
                    Title = treeNode.Node.NAME,
                    ParentCode = treeNode.Node.PARENT_ID.ToString(),
                    IsCheck = permission
                });
                if (treeNode.Node.MENU_FORM_ID != null)
                {
                    var form = t_PF_FORMs.SingleOrDefault(x => x.ID == treeNode.Node.MENU_FORM_ID);//菜单下的表单
                    List existForm = new List();
                    if (form != null)
                    {
                        AddRelated(t_FM_ROLE_MENU_PERMs, permissionBtns, permissionCols, t_PF_FORMs, pageTableList, editTableList, treeTableList,
                            charList, customList, form, OrgId, formInfos, treeNode.Node.ID.ToString(), dicforms, existForm, allFormRelations, allBtns, allCols, allEditCols);
                    }
                }
            }
            foreach (var item in treeNode.Children)
            {
                AddChildren(item, t_FM_ROLE_MENU_PERMs, permissionBtns, permissionCols, t_PF_FORMs, pageTableList, editTableList, treeTableList, charList, customList, OrgId, formInfos, dicforms, allFormRelations, allBtns, allCols, allEditCols);
            }
            //}
            //else  //有配置表单没有下一级
            //{
            //    if (t_FM_ROLE_MENU_PERMs != null && t_FM_ROLE_MENU_PERMs.Count > 0)
            //    {
            //        permission = t_FM_ROLE_MENU_PERMs.Any(x => x.MENU_ID == treeNode.Node.ID);
            //    }
            //    else
            //    {
            //        permission = false;
            //    }
            //    if (!dicforms.ContainsKey(treeNode.Node.ID.ToString() + "_" + treeNode.Node.PARENT_ID.ToString()))
            //    {
            //        dicforms.Add(treeNode.Node.ID.ToString() + "_" + treeNode.Node.PARENT_ID.ToString(), new FormInfo()
            //        {
            //            Code = treeNode.Node.ID.ToString(),
            //            Title = treeNode.Node.NAME,
            //            ParentCode = treeNode.Node.PARENT_ID.ToString(),
            //            IsCheck = permission
            //        });
            //        //formInfos.Add(new FormInfo() { Code = treeNode.Node.ID.ToString(), Title = treeNode.Node.NAME, ParentCode = treeNode.Node.PARENT_ID.ToString() });
            //    }
            //    var form = t_PF_FORMs.SingleOrDefault(x => x.ID == treeNode.Node.MENU_FORM_ID);//菜单下的表单
            //    List existForm = new List();
            //    if (form != null)
            //    {
            //        AddRelated(t_FM_ROLE_MENU_PERMs, permissionBtns, permissionCols, t_PF_FORMs, pageTableList, editTableList, treeTableList,
            //            charList, customList, form, OrgId, formInfos, treeNode.Node.ID.ToString(), dicforms, existForm, allFormRelations, allBtns, allCols, allEditCols);
            //    }
            //}
        }
        public class PageTables
        {
            public List pageTableList { get; set; } = new List();
            public List editTableList { get; set; } = new List();
            public List treeTableList { get; set; } = new List();
            public List charList { get; set; } = new List();
            public List customList { get; set; } = new List();
        }
        /// 
        /// 递归查找关联数据
        /// relateID关联表单全部挂着这个表单下
        /// 
        public void AddRelated(List t_FM_ROLE_MENU_PERMs, List permissionBtns, List permissionCols,
         List t_PF_FORMs, List pageTableList, List editTableList, List treeTableList,
            List charList, List customList, T_PF_FORM form, string OrgId, List formInfos, string relateID,
            Dictionary dicforms, List existForm, List allFormRelations, List allBtns,
            List allCols, List allEditCols)
        {
            if (form.CODE == "FM103")
            {
                var ssss = 1;
            }
            bool permission = false;
            switch (form.FORM_TYPE)
            {
                case (int)PFFormTypeEnum.列表表单:
                case (int)PFFormTypeEnum.组合表单:
                    {
                        #region 配置相关联表单T_PF_FORM_RELATION
                        var formRelations = allFormRelations.Where(x => x.PAGE_FORM_ID == form.ID);
                        if (formRelations.Any())
                        {
                            foreach (var formRelation in formRelations)
                            {
                                var relationForm = t_PF_FORMs.Where(x => x.CODE == formRelation.CODE).FirstOrDefault();
                                if (relationForm != null && !existForm.Contains(relationForm.ID))
                                {
                                    AddRelated(t_FM_ROLE_MENU_PERMs, permissionBtns, permissionCols, t_PF_FORMs, pageTableList,
                                   editTableList, treeTableList, charList, customList, relationForm, OrgId, formInfos, relateID, dicforms, existForm, allFormRelations, allBtns, allCols, allEditCols);
                                }
                            }
                        }
                        #endregion
                        var resTable = pageTableList.Where(x => x.PAGE_FORM_ID == form.ID).ToList();//查找相关表单       
                        if (resTable.Count > 0)
                        {
                            if (!dicforms.ContainsKey(relateID + "_" + form.ID))
                            {
                                if (t_FM_ROLE_MENU_PERMs != null)
                                {
                                    permission = t_FM_ROLE_MENU_PERMs.Any(x => x.PERMISSION_FORM_ID == form.ID && x.MENU_ID == new Guid(relateID));
                                }
                                else
                                {
                                    permission = false;
                                }
                                dicforms.Add(relateID + "_" + form.ID, new FormInfo()
                                {
                                    Code = relateID + "_" + form.ID.ToString(),
                                    Title = form.NAME + "(" + form.CODE + ")",
                                    ParentCode = relateID,
                                    IsCheck = permission
                                });
                                existForm.Add(form.ID);
                                if (form.FORM_TYPE == (int)PFFormTypeEnum.列表表单)
                                {
                                    foreach (var item in resTable)
                                    {
                                        #region 表单授权列
                                        //var clm = this.GetEntitiesByRedis(t => t.IS_RULE, new BaseFilter(new Guid(OrgId)), item.ID.ToString());
                                        var clm = allCols.Where(x => x.PAGE_TABLE_ID == item.ID);
                                        foreach (var col in clm)
                                        {
                                            if (!string.IsNullOrEmpty(col.SHOW_FORM_CODE))//有配置关联表单
                                            {
                                                var colForm = t_PF_FORMs.Where(x => x.CODE == col.SHOW_FORM_CODE).FirstOrDefault();
                                                if (colForm != null && !existForm.Contains(colForm.ID))
                                                {
                                                    AddRelated(t_FM_ROLE_MENU_PERMs, permissionBtns, permissionCols, t_PF_FORMs, pageTableList,
                                                   editTableList, treeTableList, charList, customList, colForm, OrgId, formInfos, relateID, dicforms, existForm, allFormRelations, allBtns, allCols, allEditCols);
                                                }
                                            }
                                            if (permissionCols != null && permissionCols.Count > 0)
                                            {
                                                permission = permissionCols.Any(x => x.COLUMN_ID == col.ID && x.MENU_ID == new Guid(relateID));
                                            }
                                            else
                                            {
                                                permission = false;
                                            }
                                            if (!dicforms.ContainsKey(relateID + "_" + form.ID.ToString() + "_" + col.ID.ToString() + "_COL"))
                                            {
                                                dicforms.Add(relateID + "_" + form.ID.ToString() + "_" + col.ID.ToString() + "_COL", new FormInfo()
                                                {
                                                    Code = relateID + "_" + form.ID.ToString() + "_" + col.ID.ToString() + "_COL",
                                                    Title = col.LABEL,
                                                    ParentCode = relateID + "_" + form.ID.ToString(),
                                                    IsCheck = permission
                                                });
                                            }
                                            //formInfos.Add(new FormInfo() { Code = col.ID.ToString(), Title = col.LABEL, ParentCode = reformId.ID.ToString(), IsCheck = permission });//挂在对应表单下
                                        }
                                        #endregion
                                        #region 按钮授权
                                        //var btns = this.GetEntitiesByRedis(null, new BaseFilter(new Guid(OrgId)), item.ID.ToString()).ToList();
                                        // var btns = this.GetEntities(t => t.PAGE_ID == item.ID, new BaseFilter(new Guid(OrgId)));
                                        var btns = allBtns.Where(x => x.PAGE_ID == item.ID);
                                        BtnPermissions(t_FM_ROLE_MENU_PERMs, permissionBtns, permissionCols, t_PF_FORMs,
                                                        pageTableList, editTableList, treeTableList, charList, customList, form, OrgId, formInfos, relateID, dicforms, existForm, btns, allFormRelations, allBtns, allCols, allEditCols);
                                        #endregion
                                    }
                                }
                                else//组合表单
                                {
                                    foreach (var item in resTable)
                                    {
                                        var reformId = t_PF_FORMs.Where(x => x.CODE == item.CODE).FirstOrDefault();
                                        if (reformId != null)
                                        {
                                            if (t_FM_ROLE_MENU_PERMs != null)
                                            {
                                                permission = t_FM_ROLE_MENU_PERMs.Any(x => x.PERMISSION_FORM_ID == reformId.ID && x.MENU_ID == new Guid(relateID));
                                            }
                                            else
                                            {
                                                permission = false;
                                            }
                                            if (!dicforms.ContainsKey(relateID + "_" + reformId.ID.ToString()))
                                            {
                                                //dicforms.Add(relateID + "_" + reformId.ID.ToString(), new FormInfo()
                                                //{
                                                //    Code = relateID + "_" + reformId.ID.ToString(),
                                                //    Title = reformId.NAME + "(" + reformId.CODE + ")",
                                                //    ParentCode = relateID,
                                                //    IsCheck = permission
                                                //});
                                                if (form.ID != reformId.ID && !existForm.Contains(reformId.ID))
                                                {
                                                    AddRelated(t_FM_ROLE_MENU_PERMs, permissionBtns, permissionCols, t_PF_FORMs, pageTableList,
                                                        editTableList, treeTableList, charList, customList, reformId, OrgId, formInfos, relateID, dicforms, existForm, allFormRelations, allBtns, allCols, allEditCols);
                                                }
                                                //existForm.Add(reformId.ID);
                                            }
                                            //var tablePages = pageTableList.Where(x => x.PAGE_FORM_ID == reformId.ID).ToList();//组合表单
                                            //foreach (var tablepage in tablePages)
                                            //{
                                            //    #region 表单授权列
                                            //    //var column = this.GetEntitiesByRedis(t => t.IS_RULE, new BaseFilter(new Guid(OrgId)), tablepage.ID.ToString());
                                            //    var column = allCols.Where(x => x.PAGE_TABLE_ID == tablepage.ID);
                                            //    foreach (var col in column)
                                            //    {
                                            //        if (!string.IsNullOrEmpty(col.SHOW_FORM_CODE))//有配置关联表单
                                            //        {
                                            //            var colForm = t_PF_FORMs.Where(x => x.CODE == col.SHOW_FORM_CODE).FirstOrDefault();
                                            //            if (colForm != null && !existForm.Contains(colForm.ID))
                                            //            {
                                            //                AddRelated(t_FM_ROLE_MENU_PERMs, permissionBtns, permissionCols, t_PF_FORMs, pageTableList,
                                            //               editTableList, treeTableList, charList, customList, colForm, OrgId, formInfos, relateID, dicforms, existForm, allFormRelations, allBtns, allCols, allEditCols);
                                            //            }
                                            //        }
                                            //        if (permissionCols != null && permissionCols.Count > 0)
                                            //        {
                                            //            permission = permissionCols.Any(x => x.COLUMN_ID == col.ID && x.MENU_ID == new Guid(relateID));
                                            //        }
                                            //        else
                                            //        {
                                            //            permission = false;
                                            //        }
                                            //        if (!dicforms.ContainsKey(relateID + "_" + form.ID.ToString() + "_" + col.ID.ToString() + "_COL"))
                                            //        {
                                            //            dicforms.Add(relateID + "_" + form.ID.ToString() + "_" + col.ID.ToString() + "_COL", new FormInfo()
                                            //            {
                                            //                Code = relateID + "_" + form.ID.ToString() + "_" + col.ID.ToString() + "_COL",
                                            //                Title = col.LABEL,
                                            //                ParentCode = relateID + "_" + form.ID.ToString(),
                                            //                IsCheck = permission
                                            //            });
                                            //        }
                                            //    }
                                            //    #endregion
                                            //    #region 按钮授权
                                            //    //var btns = this.GetEntitiesByRedis(null, new BaseFilter(new Guid(OrgId)), item.ID.ToString()).ToList();
                                            //    // var buttons = this.GetEntities(t => t.PAGE_ID == tablepage.ID, new BaseFilter(new Guid(OrgId)));
                                            //    var buttons = allBtns.Where(x => x.PAGE_ID == tablepage.ID);
                                            //    BtnPermissions(t_FM_ROLE_MENU_PERMs, permissionBtns, permissionCols, t_PF_FORMs,
                                            //                    pageTableList, editTableList, treeTableList, charList, customList, reformId, OrgId, formInfos, relateID, dicforms, existForm, buttons, allFormRelations, allBtns, allCols, allEditCols);
                                            //    #endregion
                                            //}
                                        }
                                    }
                                }
                            }
                        }
                        break;
                    }
                case (int)PFFormTypeEnum.编辑表单:
                    {
                        #region 配置相关联表单T_PF_FORM_RELATION
                        var formRelations = allFormRelations.Where(x => x.PAGE_FORM_ID == form.ID);
                        if (formRelations.Any())
                        {
                            foreach (var formRelation in formRelations)
                            {
                                var relationForm = t_PF_FORMs.Where(x => x.CODE == formRelation.CODE).FirstOrDefault();
                                if (relationForm != null && !existForm.Contains(relationForm.ID))
                                {
                                    AddRelated(t_FM_ROLE_MENU_PERMs, permissionBtns, permissionCols, t_PF_FORMs, pageTableList,
                                   editTableList, treeTableList, charList, customList, relationForm, OrgId, formInfos, relateID, dicforms, existForm, allFormRelations, allBtns, allCols, allEditCols);
                                }
                            }
                        }
                        #endregion
                        #region editTableList
                        var resEdit = editTableList.Where(x => x.PAGE_FORM_ID == form.ID).ToList();//查找相关表单   
                        if (resEdit.Count > 0)
                        {
                            if (!dicforms.ContainsKey(relateID + "_" + form.ID))
                            {
                                if (t_FM_ROLE_MENU_PERMs != null)
                                {
                                    permission = t_FM_ROLE_MENU_PERMs.Any(x => x.PERMISSION_FORM_ID == form.ID && x.MENU_ID == new Guid(relateID));
                                }
                                else
                                {
                                    permission = false;
                                }
                                dicforms.Add(relateID + "_" + form.ID, new FormInfo()
                                {
                                    Code = relateID + "_" + form.ID.ToString(),
                                    Title = form.NAME + "(" + form.CODE + ")",
                                    ParentCode = relateID,
                                    IsCheck = permission
                                });
                                existForm.Add(form.ID);
                                foreach (var item in resEdit)
                                {
                                    #region 编辑列授权
                                    // var clm = this.GetEntitiesByRedis(t => t.IS_RULE, new BaseFilter(new Guid(OrgId)), item.ID.ToString());
                                    var clm = allEditCols.Where(x => x.PAGE_EDIT_ID == item.ID);
                                    foreach (var col in clm)
                                    {
                                        if (!string.IsNullOrEmpty(col.SHOW_FORM_CODE))//有配置关联表单
                                        {
                                            var colForm = t_PF_FORMs.Where(x => x.CODE == col.SHOW_FORM_CODE).FirstOrDefault();
                                            if (colForm != null && !existForm.Contains(colForm.ID))
                                            {
                                                AddRelated(t_FM_ROLE_MENU_PERMs, permissionBtns, permissionCols, t_PF_FORMs, pageTableList,
                                               editTableList, treeTableList, charList, customList, colForm, OrgId, formInfos, relateID, dicforms, existForm, allFormRelations, allBtns, allCols, allEditCols);
                                            }
                                        }
                                        if (permissionCols != null && permissionCols.Count > 0)
                                        {
                                            permission = permissionCols.Any(x => x.COLUMN_ID == col.ID && x.MENU_ID == new Guid(relateID));
                                        }
                                        else
                                        {
                                            permission = false;
                                        }
                                        if (!dicforms.ContainsKey(relateID + "_" + form.ID.ToString() + "_" + col.ID.ToString() + "_COL"))
                                        {
                                            dicforms.Add(relateID + "_" + form.ID.ToString() + "_" + col.ID.ToString() + "_COL", new FormInfo()
                                            {
                                                Code = relateID + "_" + form.ID.ToString() + "_" + col.ID.ToString() + "_COL",
                                                Title = col.LABEL,
                                                ParentCode = relateID + "_" + form.ID.ToString(),
                                                IsCheck = permission
                                            });
                                        }
                                        //formInfos.Add(new FormInfo() { Code = col.ID.ToString(), Title = col.LABEL, ParentCode = reformId.ID.ToString(), IsCheck = permission });//挂在对应表单下
                                    }
                                    #endregion
                                    #region 按钮授权
                                    //var btns = this.GetEntitiesByRedis