/// <summary>
        /// 构造一个树形对象
        /// </summary>
        /// <param name="id"></param>
        /// <param name="name"></param>
        /// <param name="code"></param>
        /// <param name="type"></param>
        /// <param name="isParent"></param>
        /// <param name="pId"></param>
        /// <param name="iconSkin"></param>
        /// <param name="ShowCheckbox"></param>
        /// <param name="CanCheck"></param>
        /// <returns></returns>
        private AppTreeNode CreateAppTreeNode(string id, string name, string code, string type, bool isParent, string pId, string iconSkin, bool ShowCheckbox, bool CanCheck, string Nodepath = "")
        {
            AppTreeNode node = new AppTreeNode()
            {
                id       = id,
                name     = name,
                Code     = code,
                NodeType = type,
                isParent = isParent,
                pId      = pId,
                iconSkin = iconSkin,
                nocheck  = ShowCheckbox && !CanCheck,
                NodePath = Nodepath
            };

            return(node);
        }
        /// <summary>
        /// 根据父编码,展示业务数据表单的字段
        /// </summary>
        /// <param name="ParentCode"></param>
        /// <param name="Codes"></param>
        /// <returns></returns>
        private List <AppTreeNode> GetAppSchemaTrees(string ParentCode, List <string> Codes)
        {
            List <AppTreeNode> childNodes = new List <AppTreeNode>();

            if (ParentCode == "root")//如果是根目录则展示根目录菜单
            {
                for (int i = 0; i < Codes.Count; i++)
                {
                    List <AppTreeNode> list    = new List <AppTreeNode>();
                    FunctionNode       funNode = this.Engine.FunctionAclManager.GetFunctionNodeByCode(Codes[i].ToString());
                    if (funNode != null)
                    {
                        AppTreeNode appTree = CreateAppTreeNode(funNode.Code, funNode.DisplayName, funNode.Code, TreeNodeType.AppPackge.ToString(), true, ParentCode, "fa fa-folder-open-o", true, false);
                        childNodes.Add(appTree);
                    }
                    else
                    {
                        BizObjectSchema sch = this.Engine.BizObjectManager.GetPublishedSchema(Codes[i].Substring(0, Codes[i].IndexOf("___")));
                        if (sch != null)
                        {
                            foreach (var pro in sch.Properties)
                            {
                                if (pro.LogicType == OThinker.H3.Data.DataLogicType.BizObjectArray)
                                {
                                    if (Codes[i].IndexOf(pro.Name) != -1)
                                    {
                                        AppTreeNode appTree = CreateAppTreeNode(pro.Name, pro.DisplayName, pro.Name, TreeNodeType.AppPackge.ToString(), true, ParentCode, "fa fa-folder-open-o", true, false);
                                        childNodes.Add(appTree);
                                    }
                                }
                            }
                        }
                        else
                        {
                        }
                    }
                }
            }
            else //否则根据父ID 加载子菜单
            {
                string          SchemaCode = ParentCode;
                BizObjectSchema sch        = this.Engine.BizObjectManager.GetPublishedSchema(SchemaCode);
                if (sch != null)
                {
                    PropertySchema[] properties = sch.Properties;
                    childNodes = GetTreeChildNodes(properties, ParentCode, true);
                }
                else
                {
                    BizObjectSchema schs = this.Engine.BizObjectManager.GetPublishedSchema(Codes[0]);
                    if (schs != null)
                    {
                        foreach (var code in schs.Properties)
                        {
                            if (code.LogicType == OThinker.H3.Data.DataLogicType.BizObjectArray)
                            {
                                if (code.Name == SchemaCode)
                                {
                                    childNodes = GetTreeChildNodes(code.ChildSchema.Properties, ParentCode, true);
                                }
                            }
                        }
                    }
                }
            }
            return(childNodes);
        }
        /// <summary>
        /// 树形菜单加载入口
        /// </summary>
        /// <returns></returns>
        public JsonResult DoAction()
        {
            List <AppTreeNode> childNodes       = new List <AppTreeNode>();
            string             Paramters        = Request["ActionName"];//操作的方法
            string             LoadTableAndView = Request["command"];
            string             ParentCode       = Request["id"] == null ? "root" : Request["id"];
            string             relationCode     = Request["Code"];
            string             NodeType         = Request["NodeType"];
            string             CurSchemeCode    = Request["SchemeCode"];

            string Codes = Request["Codes"];                                                       //表单对象编码,多个以分号隔开

            if (Paramters == "GetSheetDisplayNames" || LoadTableAndView == "GetSheetDisplayNames") //报表数据源计算函数规则设计器
            {
                #region 报表数据源计算函数规则设计器,数据源树形展示;
                List <string> li   = new List <string>();
                var           code = Codes.Split(';');
                if (code.Length == 1)
                {
                    li.Add(Codes.ToString());
                }
                else
                {
                    for (int i = 0; i < code.Length; i++)
                    {
                        li.Add(code[i].ToString());
                    }
                }

                childNodes = GetAppSchemaTrees(ParentCode, li);
                return(Json(childNodes, JsonRequestBehavior.AllowGet));

                #endregion
            }
            else
            {
                #region 初始化数据源展示菜单


                ShowSubsheetFiled = Request["ShowSubsheetFiled"] == "true" ? true : false;
                string CanCheckTypes = Request["CanCheckTypes"];//记录的是数据链接池的编码
                ShowCheckbox = Request["ShowCheckbox"] == "true" ? true : false;
                if (!string.IsNullOrEmpty(CanCheckTypes))
                {
                    CanCheckTypes = CanCheckTypes.TrimEnd(',');
                }
                if (string.IsNullOrEmpty(CanCheckTypes))
                {
                    CanCheckTypes = "Engine";//默认设置为H3引擎编码
                }

                //该方法是读取数据库中,数据表和视图的方法
                if (LoadTableAndView == "LoadTableAndView")
                {
                    #region 该方法是读取数据库中,数据表和视图的方法
                    //该方法是读取业务表单的站点
                    if (ParentCode == "root")
                    {
                        AppTreeNode appTreeTable = CreateAppTreeNode("DbTable", "数据表", "DbTable", TreeNodeType.AppPackge.ToString(), true, ParentCode, "fa fa-folder-open-o", true, false);
                        childNodes.Add(appTreeTable);
                        AppTreeNode appTreeView = CreateAppTreeNode("DbView", "视图", "DbView", TreeNodeType.AppPackge.ToString(), true, ParentCode, "fa fa-folder-open-o", true, false);
                        childNodes.Add(appTreeView);
                    }
                    else
                    {
                        //如果是数据表
                        if (ParentCode == "DbTable")
                        {
                            string[] tableNames = this.Engine.SettingManager.GetBizDbTableNames(CanCheckTypes);
                            foreach (var table in tableNames)
                            {
                                AppTreeNode appTreeTable = CreateAppTreeNode(table, table, table, TreeNodeType.AppMenu.ToString(), true, ParentCode, "fa fa-folder-open-o", true, false);
                                childNodes.Add(appTreeTable);
                            }
                        }
                        else if (ParentCode == "DbView") //如果是视图
                        {
                            string[] viewNames = this.Engine.SettingManager.GetBizDbViewNames(CanCheckTypes);
                            foreach (var view in viewNames)
                            {
                                AppTreeNode appTreeTable = CreateAppTreeNode(view, view, view, TreeNodeType.AppMenu.ToString(), true, ParentCode, "fa fa-folder-open-o", true, false);
                                childNodes.Add(appTreeTable);
                            }
                        }
                        else //否则是查询表的具体字段的
                        {
                            if (NodeType == "Field")
                            {
                            }
                            else
                            {
                                string newSql = "select * from " + ParentCode;
                                List <OThinker.Reporting.ReportWidgetColumn> columns = this.Engine.ReportQuery.GetSqlColumns(this.Engine, newSql, CanCheckTypes);
                                foreach (var col in columns)
                                {
                                    AppTreeNode appTreeTable = CreateAppTreeNode(col.ColumnName, col.ColumnName, col.ColumnName, TreeNodeType.Field.ToString(), true, ParentCode, "", true, false);
                                    childNodes.Add(appTreeTable);
                                }
                            }
                        }
                    }

                    return(Json(childNodes, JsonRequestBehavior.AllowGet));

                    #endregion
                }
                else
                {
                    #region 加载业务表单
                    //该方法是读取业务表单的站点
                    if (ParentCode == "root")
                    {
                        string NodePath = string.Empty;
                        if (!string.IsNullOrEmpty(CurSchemeCode))
                        {
                            FunctionNode  CheckedNode = this.Engine.FunctionAclManager.GetFunctionNodeByCode(CurSchemeCode);
                            List <string> parentCodes = new List <string>();
                            while (CheckedNode.ParentCode != "ProcessModel")
                            {
                                parentCodes.Add(CheckedNode.ParentCode);
                                CheckedNode = this.Engine.FunctionAclManager.GetFunctionNodeByCode(CheckedNode.ParentCode);
                            }
                            if (CheckedNode.ParentCode == "ProcessModel")
                            {
                                parentCodes.Add(CheckedNode.Code);
                            }
                            NodePath = string.Join(",", parentCodes);
                        }

                        //加载所有流程模型
                        List <AppTreeNode>  list    = new List <AppTreeNode>();
                        List <FunctionNode> funNode = this.Engine.FunctionAclManager.GetChildNodesByParentCode("ProcessModel");

                        //按照后台流程模型节点展示的顺序排序数据
                        funNode = funNode.OrderBy(s => s.DisplayName).OrderBy(s => s.SortKey).ToList();
                        AppTreeNode masterNode = null;
                        foreach (FunctionNode fn in funNode)
                        {
                            if (fn.ParentCode == "ProcessModel")
                            {
                                //判断是否该节点是否有子项
                                bool IsParentNode = false;
                                if (this.Engine.FunctionAclManager.GetChildNodesByParentCode(fn.Code).Count() > 0)
                                {
                                    IsParentNode = true;
                                }

                                AppTreeNode appTree = CreateAppTreeNode(fn.Code, fn.DisplayName, fn.Code, TreeNodeType.AppPackge.ToString(), IsParentNode, ParentCode, "fa fa-folder-open-o", true, false, NodePath);
                                //判断是否是主数据节点
                                if (fn.NodeType == OThinker.H3.Acl.FunctionNodeType.BizFolder)
                                {
                                    masterNode = appTree;
                                    continue;
                                }
                                childNodes.Add(appTree);
                            }
                        }
                        //主数据节点置顶
                        childNodes.Insert(0, masterNode);
                    }
                    else
                    {
                        //BizWorkflowPackage
                        List <FunctionNode> funNode = this.Engine.FunctionAclManager.GetChildNodesByParentCode(ParentCode);
                        List <FunctionNode> funnode = new List <FunctionNode>();
                        if (funNode != null)
                        {
                            funNode = funNode.OrderBy(i => i.DisplayName).ToList();
                            funNode = funNode.OrderBy(i => i.SortKey).ToList();
                        }
                        BizObjectSchema bizobjectSchema = null;
                        foreach (FunctionNode fun in funNode)
                        {
                            if (ParentCode == fun.ParentCode)
                            {
                                BizObjectSchema[] das = this.Engine.BizObjectManager.GetPublishedSchemas();

                                //说明是流程包
                                if (fun.NodeType == OThinker.H3.Acl.FunctionNodeType.BizWorkflowPackage)
                                {
                                    bizobjectSchema = this.Engine.BizObjectManager.GetPublishedSchema(fun.Code);
                                    if (bizobjectSchema != null)
                                    {
                                        //判断是否该节点是否有子项
                                        bool IsParentNode = false;
                                        foreach (var item in bizobjectSchema.Properties)
                                        {
                                            if (item.LogicType == OThinker.H3.Data.DataLogicType.BizObjectArray)
                                            {
                                                IsParentNode = true;
                                                break;
                                            }
                                        }
                                        AppTreeNode appTree = CreateAppTreeNode(fun.Code, fun.DisplayName, fun.Code, TreeNodeType.AppMenu.ToString(), IsParentNode, ParentCode, "", false, false);
                                        childNodes.Add(appTree);
                                    }
                                }
                                else if (fun.NodeType == OThinker.H3.Acl.FunctionNodeType.BizObject)
                                {
                                    BizObjectSchema bizobjectSchemas = this.Engine.BizObjectManager.GetPublishedSchema(fun.Code);
                                    if (bizobjectSchemas != null)
                                    {
                                        //判断是否该节点是否有子项
                                        bool IsParentNode = false;
                                        foreach (var item in bizobjectSchemas.Properties)
                                        {
                                            if (item.LogicType == OThinker.H3.Data.DataLogicType.BizObjectArray)
                                            {
                                                IsParentNode = true;
                                                break;
                                            }
                                        }
                                        AppTreeNode appTree = CreateAppTreeNode(fun.Code, fun.DisplayName, fun.Code, TreeNodeType.AppMenu.ToString(), IsParentNode, ParentCode, "", false, false);
                                        childNodes.Add(appTree);
                                    }
                                }
                                else
                                {
                                    //还是文件夹
                                    AppTreeNode appTree = CreateAppTreeNode(fun.Code, fun.DisplayName, fun.Code, TreeNodeType.AppGroup.ToString(), true, ParentCode, "fa fa-folder-open-o", true, false);
                                    childNodes.Add(appTree);
                                }
                            }
                        }

                        // 加载业务对象子元素
                        if (funNode.Count == 0)
                        {
                            string          SchemaCode = ParentCode;
                            BizObjectSchema sch        = this.Engine.BizObjectManager.GetPublishedSchema(SchemaCode);
                            if (sch != null)
                            {
                                PropertySchema[] properties = sch.Properties;
                                childNodes = GetTreeChildNodes(properties, ParentCode, false);
                            }
                        }
                    }



                    return(Json(childNodes, JsonRequestBehavior.AllowGet));

                    #endregion
                }
                #endregion
            }
        }